diff options
Diffstat (limited to 'plugins/Dbx_kyoto')
-rw-r--r-- | plugins/Dbx_kyoto/src/dbevents.cpp | 73 | ||||
-rw-r--r-- | plugins/Dbx_kyoto/src/dbintf.cpp | 4 | ||||
-rw-r--r-- | plugins/Dbx_kyoto/src/dbintf.h | 2 |
3 files changed, 47 insertions, 32 deletions
diff --git a/plugins/Dbx_kyoto/src/dbevents.cpp b/plugins/Dbx_kyoto/src/dbevents.cpp index e1b3cf3206..13a652e15e 100644 --- a/plugins/Dbx_kyoto/src/dbevents.cpp +++ b/plugins/Dbx_kyoto/src/dbevents.cpp @@ -195,18 +195,20 @@ STDMETHODIMP_(BOOL) CDbxKyoto::GetEvent(MEVENT hDbEvent, DBEVENTINFO *dbei) void CDbxKyoto::FindNextUnread(DBCachedContact *cc, DBEventSortingKey &key2)
{
key2.dwEventId++;
-
- cursor_ptr cursor(m_dbEventsSort);
- cursor->jump((LPCSTR)&key2, sizeof(key2));
- while(cursor->step()) {
- size_t size;
- const char *pRec;
- delete[] cursor->get(&size, &pRec, &size);
- DBEvent *dbe = (DBEvent*)pRec;
- if (!dbe->markedRead()) {
- cc->dbc.dwFirstUnread = key2.dwEventId;
- cc->dbc.tsFirstUnread = key2.ts;
- return;
+ {
+ mir_cslock lck(m_csDbAccess);
+
+ m_evCursor->jump((LPCSTR)&key2, sizeof(key2));
+ while (m_evCursor->step()) {
+ size_t size;
+ const char *pRec;
+ delete[] m_evCursor->get(&size, &pRec, &size);
+ DBEvent *dbe = (DBEvent*)pRec;
+ if (!dbe->markedRead()) {
+ cc->dbc.dwFirstUnread = key2.dwEventId;
+ cc->dbc.tsFirstUnread = key2.ts;
+ return;
+ }
}
}
@@ -259,12 +261,13 @@ STDMETHODIMP_(MCONTACT) CDbxKyoto::GetEventContact(MEVENT hDbEvent) STDMETHODIMP_(MEVENT) CDbxKyoto::FindFirstEvent(MCONTACT contactID)
{
- DBEventSortingKey keyVal = { contactID, 0, 0 };
- cursor_ptr cursor(m_dbEventsSort);
- cursor->jump((LPCSTR)&keyVal, sizeof(keyVal));
-
size_t size;
- DBEventSortingKey *pKey = (DBEventSortingKey*)cursor->get_key(&size);
+ DBEventSortingKey keyVal = { contactID, 0, 0 }, *pKey;
+ {
+ mir_cslock lck(m_csDbAccess);
+ m_evCursor->jump((LPCSTR)&keyVal, sizeof(keyVal));
+ pKey = (DBEventSortingKey*)m_evCursor->get_key(&size);
+ }
if (pKey == NULL)
return m_evLast = 0;
@@ -282,12 +285,14 @@ STDMETHODIMP_(MEVENT) CDbxKyoto::FindFirstUnreadEvent(MCONTACT contactID) STDMETHODIMP_(MEVENT) CDbxKyoto::FindLastEvent(MCONTACT contactID)
{
- DBEventSortingKey keyVal = { contactID, 0xFFFFFFFF, 0xFFFFFFFF };
- cursor_ptr cursor(m_dbEventsSort);
- cursor->jump_back((LPCSTR)&keyVal, sizeof(keyVal));
-
size_t size;
- DBEventSortingKey *pKey = (DBEventSortingKey*)cursor->get_key(&size);
+ DBEventSortingKey keyVal = { contactID, 0xFFFFFFFF, 0xFFFFFFFF }, *pKey;
+ {
+ mir_cslock lck(m_csDbAccess);
+ m_evCursor->jump_back((LPCSTR)&keyVal, sizeof(keyVal));
+ pKey = (DBEventSortingKey*)m_evCursor->get_key(&size);
+ }
+
if (pKey == NULL)
return m_evLast = 0;
@@ -311,12 +316,14 @@ STDMETHODIMP_(MEVENT) CDbxKyoto::FindNextEvent(MCONTACT contactID, MEVENT hDbEve }
else ts = m_tsLast;
- DBEventSortingKey keyVal = { contactID, ts, hDbEvent+1 };
- cursor_ptr cursor(m_dbEventsSort);
- cursor->jump((LPCSTR)&keyVal, sizeof(keyVal));
-
size_t size;
- DBEventSortingKey *pKey = (DBEventSortingKey*)cursor->get_key(&size);
+ DBEventSortingKey keyVal = { contactID, ts, hDbEvent + 1 }, *pKey;
+ {
+ mir_cslock lck(m_csDbAccess);
+ m_evCursor->jump((LPCSTR)&keyVal, sizeof(keyVal));
+ pKey = (DBEventSortingKey*)m_evCursor->get_key(&size);
+ }
+
if (pKey == NULL)
return m_evLast = 0;
@@ -340,12 +347,14 @@ STDMETHODIMP_(MEVENT) CDbxKyoto::FindPrevEvent(MCONTACT contactID, MEVENT hDbEve }
else ts = m_tsLast;
- DBEventSortingKey keyVal = { contactID, ts, hDbEvent-1 };
- cursor_ptr cursor(m_dbEventsSort);
- cursor->jump_back((LPCSTR)&keyVal, sizeof(keyVal));
-
size_t size;
- DBEventSortingKey *pKey = (DBEventSortingKey*)cursor->get_key(&size);
+ DBEventSortingKey keyVal = { contactID, ts, hDbEvent - 1 }, *pKey;
+ {
+ mir_cslock lck(m_csDbAccess);
+ cursor->jump_back((LPCSTR)&keyVal, sizeof(keyVal));
+ pKey = (DBEventSortingKey*)m_evCursor->get_key(&size);
+ }
+
if (pKey == NULL)
return m_evLast = 0;
diff --git a/plugins/Dbx_kyoto/src/dbintf.cpp b/plugins/Dbx_kyoto/src/dbintf.cpp index bd43f0fa7d..6a4af0a824 100644 --- a/plugins/Dbx_kyoto/src/dbintf.cpp +++ b/plugins/Dbx_kyoto/src/dbintf.cpp @@ -97,6 +97,8 @@ CDbxKyoto::CDbxKyoto(const TCHAR *tszFileName, int iMode) : CDbxKyoto::~CDbxKyoto()
{
+ delete m_evCursor;
+
m_dbContacts.close();
m_dbModules.close();
m_dbEvents.close();
@@ -172,6 +174,8 @@ int CDbxKyoto::Load(bool bSkipInit) m_dbContacts.set((LPCSTR)&keyVal, sizeof(keyVal), (LPCSTR)&dbc, sizeof(dbc));
}
+ m_evCursor = m_dbEventsSort.cursor();
+
if (InitModuleNames()) return EGROKPRF_CANTREAD;
if (InitCrypt()) return EGROKPRF_CANTREAD;
diff --git a/plugins/Dbx_kyoto/src/dbintf.h b/plugins/Dbx_kyoto/src/dbintf.h index 9e75bd2804..c46a99e903 100644 --- a/plugins/Dbx_kyoto/src/dbintf.h +++ b/plugins/Dbx_kyoto/src/dbintf.h @@ -246,6 +246,8 @@ protected: CTable m_dbEvents, m_dbEventsSort;
DWORD m_dwMaxEventId, m_tsLast;
MEVENT m_evLast;
+
+ TreeDB::Cursor *m_evCursor;
void FindNextUnread(DBCachedContact *cc, DBEventSortingKey &key2);
|