diff options
-rw-r--r-- | plugins/Dbx_mdb/src/dbcontacts.cpp | 38 | ||||
-rw-r--r-- | plugins/Dbx_mdb/src/dbevents.cpp | 235 | ||||
-rw-r--r-- | plugins/Dbx_mdb/src/dbintf.cpp | 20 | ||||
-rw-r--r-- | plugins/Dbx_mdb/src/dbintf.h | 41 | ||||
-rw-r--r-- | plugins/Dbx_mdb/src/dbsettings.cpp | 8 |
5 files changed, 267 insertions, 75 deletions
diff --git a/plugins/Dbx_mdb/src/dbcontacts.cpp b/plugins/Dbx_mdb/src/dbcontacts.cpp index 48c8b7e7cb..cf13a782b9 100644 --- a/plugins/Dbx_mdb/src/dbcontacts.cpp +++ b/plugins/Dbx_mdb/src/dbcontacts.cpp @@ -171,38 +171,44 @@ BOOL CDbxMdb::MetaSplitHistory(DBCachedContact *ccMeta, DBCachedContact *ccSub) void CDbxMdb::FillContacts()
{
- m_contactCount = 0;
+ LIST<DBCachedContact> arContacts(10);
txn_ptr trnlck(m_pMdbEnv);
mdb_open(trnlck, "contacts", MDB_INTEGERKEY, &m_dbContacts);
+ {
+ cursor_ptr cursor(trnlck, m_dbContacts);
- cursor_ptr cursor(trnlck, m_dbContacts);
+ MDB_val key, data;
+ while (mdb_cursor_get(cursor, &key, &data, MDB_NEXT) == 0) {
+ DBContact *dbc = (DBContact*)data.mv_data;
+ if (dbc->signature != DBCONTACT_SIGNATURE)
+ DatabaseCorruption(NULL);
- MDB_val key, data;
- while (mdb_cursor_get(cursor, &key, &data, MDB_NEXT) == 0) {
- DBContact *dbc = (DBContact*)data.mv_data;
- if (dbc->signature != DBCONTACT_SIGNATURE)
- DatabaseCorruption(NULL);
+ DBCachedContact *cc = m_cache->AddContactToCache(*(DWORD*)key.mv_data);
+ cc->dwDriverData = dbc->eventCount;
+ arContacts.insert(cc);
+ }
+ }
- DWORD dwContactId = *(DWORD*)key.mv_data;
- DBCachedContact *cc = m_cache->AddContactToCache(dwContactId);
- cc->dwDriverData = 0;
+ m_contactCount = 0;
+ for (int i = 0; i < arContacts.getCount(); i++) {
+ DBCachedContact *cc = arContacts[i];
CheckProto(cc, "");
-
- m_dwMaxContactId = dwContactId + 1;
+
+ m_dwMaxContactId = cc->contactID+1;
m_contactCount++;
DBVARIANT dbv; dbv.type = DBVT_DWORD;
- cc->nSubs = (0 != GetContactSetting(dwContactId, META_PROTO, "NumContacts", &dbv)) ? -1 : dbv.dVal;
+ cc->nSubs = (0 != GetContactSetting(cc->contactID, META_PROTO, "NumContacts", &dbv)) ? -1 : dbv.dVal;
if (cc->nSubs != -1) {
cc->pSubs = (MCONTACT*)mir_alloc(cc->nSubs*sizeof(MCONTACT));
for (int i = 0; i < cc->nSubs; i++) {
char setting[100];
mir_snprintf(setting, SIZEOF(setting), "Handle%d", i);
- cc->pSubs[i] = (0 != GetContactSetting(dwContactId, META_PROTO, setting, &dbv)) ? NULL : dbv.dVal;
+ cc->pSubs[i] = (0 != GetContactSetting(cc->contactID, META_PROTO, setting, &dbv)) ? NULL : dbv.dVal;
}
}
- cc->nDefault = (0 != GetContactSetting(dwContactId, META_PROTO, "Default", &dbv)) ? -1 : dbv.dVal;
- cc->parentID = (0 != GetContactSetting(dwContactId, META_PROTO, "ParentMeta", &dbv)) ? NULL : dbv.dVal;
+ cc->nDefault = (0 != GetContactSetting(cc->contactID, META_PROTO, "Default", &dbv)) ? -1 : dbv.dVal;
+ cc->parentID = (0 != GetContactSetting(cc->contactID, META_PROTO, "ParentMeta", &dbv)) ? NULL : dbv.dVal;
}
}
diff --git a/plugins/Dbx_mdb/src/dbevents.cpp b/plugins/Dbx_mdb/src/dbevents.cpp index ae5344ae4e..5db1d6714b 100644 --- a/plugins/Dbx_mdb/src/dbevents.cpp +++ b/plugins/Dbx_mdb/src/dbevents.cpp @@ -23,10 +23,19 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "commonheaders.h"
+struct DBEventSortingKey
+{
+ DWORD dwContactId, ts, dwEventId;
+};
+
STDMETHODIMP_(LONG) CDbxMdb::GetEventCount(MCONTACT contactID)
{
mir_cslock lck(m_csDbAccess);
- return -1;
+ if (contactID == NULL)
+ return m_header.eventCount;
+
+ DBCachedContact *cc = m_cache->GetCachedContact(contactID);
+ return (cc == NULL) ? 0 : cc->dwDriverData;
}
STDMETHODIMP_(MEVENT) CDbxMdb::AddEvent(MCONTACT contactID, DBEVENTINFO *dbei)
@@ -37,6 +46,7 @@ STDMETHODIMP_(MEVENT) CDbxMdb::AddEvent(MCONTACT contactID, DBEVENTINFO *dbei) DBEvent dbe;
dbe.signature = DBEVENT_SIGNATURE;
dbe.contactID = contactID; // store native or subcontact's id
+ dbe.ofsModuleName = GetModuleNameOfs(dbei->szModule);
dbe.timestamp = dbei->timestamp;
dbe.flags = dbei->flags;
dbe.wEventType = dbei->eventType;
@@ -44,11 +54,10 @@ STDMETHODIMP_(MEVENT) CDbxMdb::AddEvent(MCONTACT contactID, DBEVENTINFO *dbei) BYTE *pBlob = dbei->pBlob;
MCONTACT contactNotifyID = contactID;
- DBCachedContact *ccSub = NULL;
+ DBCachedContact *cc = NULL, *ccSub = NULL;
if (contactID != 0) {
- DBCachedContact *cc = m_cache->GetCachedContact(contactID);
- if (cc == NULL)
- return NULL;
+ if ((cc = m_cache->GetCachedContact(contactID)) == NULL)
+ return 0;
if (cc->IsSub()) {
ccSub = cc;
@@ -76,32 +85,92 @@ STDMETHODIMP_(MEVENT) CDbxMdb::AddEvent(MCONTACT contactID, DBEVENTINFO *dbei) }
mir_cslockfull lck(m_csDbAccess);
+ DWORD dwEventId = (contactID == NULL) ? ++m_header.eventCount : ++m_dwMaxEventId;
+
+ txn_ptr txn(m_pMdbEnv);
+
+ for (;; Remap()) {
+ MDB_val key = { sizeof(int), &dwEventId }, data = { sizeof(DBEvent) + dbe.cbBlob, NULL };
+ if (mdb_put(txn, m_dbEvents, &key, &data, MDB_RESERVE) != MDB_SUCCESS)
+ return 0;
+
+ BYTE *pDest = (BYTE*)data.mv_data;
+ memcpy(pDest, &dbe, sizeof(DBEvent));
+ memcpy(pDest + sizeof(DBEvent), pBlob, dbe.cbBlob);
+
+ // add a sorting key
+ DBEventSortingKey key2 = { contactID, dbe.timestamp, dwEventId };
+ key.mv_size = sizeof(key2); key.mv_data = &key2;
+ data.mv_size = 1; data.mv_data = "";
+ if (mdb_put(txn, m_dbEventsSort, &key, &data, 0) != MDB_SUCCESS)
+ return 0;
+
+ if (contactID != NULL) {
+ DBContact dbc = { DBCONTACT_SIGNATURE, ++cc->dwDriverData };
+ MDB_val keyc = { sizeof(int), &contactID }, datac = { sizeof(DBContact), &dbc };
+ mdb_put(txn, m_dbContacts, &keyc, &datac, 0);
+
+ // insert an event into a sub's history too
+ if (ccSub != NULL) {
+ key2.dwContactId = ccSub->contactID;
+ mdb_put(txn, m_dbEventsSort, &key, &data, 0);
+
+ dbc.eventCount = ++ccSub->dwDriverData;
+ keyc.mv_data = &ccSub->contactID;
+ mdb_put(txn, m_dbContacts, &keyc, &datac, 0);
+ }
+ }
+ else {
+ DWORD keyVal = 1;
+ MDB_val key = { sizeof(DWORD), &keyVal };
+ data.mv_data = &m_header; data.mv_size = sizeof(m_header);
+ mdb_put(txn, m_dbGlobal, &key, &data, 0);
+ }
+
+ if (txn.commit())
+ break;
+ }
lck.unlock();
// Notify only in safe mode or on really new events
- NotifyEventHooks(hEventAddedEvent, contactNotifyID, (LPARAM)-1);
+ NotifyEventHooks(hEventAddedEvent, contactNotifyID, dwEventId);
- return (MEVENT)0;
+ return dwEventId;
}
STDMETHODIMP_(BOOL) CDbxMdb::DeleteEvent(MCONTACT contactID, MEVENT hDbEvent)
{
- DBCachedContact *cc;
- if (contactID) {
- if ((cc = m_cache->GetCachedContact(contactID)) == NULL)
- return 2;
- if (cc->IsSub())
- if ((cc = m_cache->GetCachedContact(cc->parentID)) == NULL)
- return 3;
- }
- else cc = NULL;
-
mir_cslockfull lck(m_csDbAccess);
+ txn_ptr txn(m_pMdbEnv);
+
+ for (;; Remap()) {
+ MDB_val key = { sizeof(MEVENT), &hDbEvent }, data;
+ if (mdb_get(txn, m_dbEvents, &key, &data) != MDB_SUCCESS)
+ return 1;
+
+ DBEvent *dbe = (DBEvent*)data.mv_data;
+ DWORD dwSavedContact = dbe->contactID;
+ DBEventSortingKey key2 = { contactID, dbe->timestamp, hDbEvent };
+ mdb_del(txn, m_dbEvents, &key, &data);
+
+ // remove a sorting key
+ key.mv_size = sizeof(key2); key.mv_data = &key2;
+ mdb_del(txn, m_dbEventsSort, &key, &data);
+
+ // remove a sub's history entry too
+ if (contactID != dwSavedContact) {
+ key2.dwContactId = dwSavedContact;
+ mdb_del(txn, m_dbEventsSort, &key, &data);
+ }
+
+ if (txn.commit())
+ break;
+ }
lck.unlock();
// call notifier while outside mutex
- NotifyEventHooks(hEventDeletedEvent, contactID, (LPARAM)hDbEvent);
+ NotifyEventHooks(hEventDeletedEvent, contactID, hDbEvent);
// get back in
lck.lock();
@@ -111,7 +180,14 @@ STDMETHODIMP_(BOOL) CDbxMdb::DeleteEvent(MCONTACT contactID, MEVENT hDbEvent) STDMETHODIMP_(LONG) CDbxMdb::GetBlobSize(MEVENT hDbEvent)
{
mir_cslock lck(m_csDbAccess);
- return -1;
+ txn_ptr txn(m_pMdbEnv, true);
+
+ MDB_val key = { sizeof(MEVENT), &hDbEvent }, data;
+ if (mdb_get(txn, m_dbEvents, &key, &data) != MDB_SUCCESS)
+ return 0;
+
+ DBEvent *dbe = (DBEvent*)data.mv_data;
+ return (dbe->signature == DBEVENT_SIGNATURE) ? dbe->cbBlob : 0;
}
STDMETHODIMP_(BOOL) CDbxMdb::GetEvent(MEVENT hDbEvent, DBEVENTINFO *dbei)
@@ -123,6 +199,38 @@ STDMETHODIMP_(BOOL) CDbxMdb::GetEvent(MEVENT hDbEvent, DBEVENTINFO *dbei) }
mir_cslock lck(m_csDbAccess);
+ txn_ptr txn(m_pMdbEnv, true);
+
+ MDB_val key = { sizeof(MEVENT), &hDbEvent }, data;
+ if (mdb_get(txn, m_dbEvents, &key, &data) != MDB_SUCCESS)
+ return 1;
+
+ DBEvent *dbe = (DBEvent*)data.mv_data;
+ if (dbe->signature != DBEVENT_SIGNATURE)
+ return 1;
+
+ dbei->szModule = GetModuleNameByOfs(dbe->ofsModuleName);
+ dbei->timestamp = dbe->timestamp;
+ dbei->flags = dbe->flags;
+ dbei->eventType = dbe->wEventType;
+ int bytesToCopy = (dbei->cbBlob < dbe->cbBlob) ? dbei->cbBlob : dbe->cbBlob;
+ dbei->cbBlob = dbe->cbBlob;
+ if (bytesToCopy && dbei->pBlob) {
+ BYTE *pSrc = (BYTE*)data.mv_data + sizeof(DBEvent);
+ if (dbe->flags & DBEF_ENCRYPTED) {
+ dbei->flags &= ~DBEF_ENCRYPTED;
+ size_t len;
+ BYTE* pBlob = (BYTE*)m_crypto->decodeBuffer(pSrc, dbe->cbBlob, &len);
+ if (pBlob == NULL)
+ return 1;
+
+ memcpy(dbei->pBlob, pBlob, bytesToCopy);
+ if (bytesToCopy > (int)len)
+ memset(dbei->pBlob + len, 0, bytesToCopy - len);
+ mir_free(pBlob);
+ }
+ else memcpy(dbei->pBlob, pSrc, bytesToCopy);
+ }
return 0;
}
@@ -139,22 +247,55 @@ STDMETHODIMP_(BOOL) CDbxMdb::MarkEventRead(MCONTACT contactID, MEVENT hDbEvent) else cc = NULL;
mir_cslockfull lck(m_csDbAccess);
+ txn_ptr txn(m_pMdbEnv);
+
+ MDB_val key = { sizeof(MEVENT), &hDbEvent }, data;
+ if (mdb_get(txn, m_dbEvents, &key, &data) != MDB_SUCCESS)
+ return 0;
+
+ DBEvent *dbe = (DBEvent*)data.mv_data;
+ if (dbe->signature != DBEVENT_SIGNATURE)
+ return -1;
+
+ if (dbe->markedRead())
+ return dbe->flags;
+
+ dbe->flags |= DBEF_READ;
+ mdb_put(txn, m_dbEvents, &key, &data, 0);
+ txn.commit();
lck.unlock();
NotifyEventHooks(hEventMarkedRead, contactID, (LPARAM)hDbEvent);
- return -11;
+ return dbe->flags;
}
STDMETHODIMP_(MCONTACT) CDbxMdb::GetEventContact(MEVENT hDbEvent)
{
mir_cslock lck(m_csDbAccess);
- return INVALID_CONTACT_ID;
+ txn_ptr txn(m_pMdbEnv, true);
+
+ MDB_val key = { sizeof(MEVENT), &hDbEvent }, data;
+ if (mdb_get(txn, m_dbEvents, &key, &data) != MDB_SUCCESS)
+ return 0;
+
+ DBEvent *dbe = (DBEvent*)data.mv_data;
+ return (dbe->signature == DBEVENT_SIGNATURE) ? dbe->contactID: INVALID_CONTACT_ID;
}
STDMETHODIMP_(MEVENT) CDbxMdb::FindFirstEvent(MCONTACT contactID)
{
+ DBEventSortingKey keyVal = { contactID, 0, 0 };
+ MDB_val key = { sizeof(keyVal), &keyVal }, data;
+
mir_cslock lck(m_csDbAccess);
- return NULL;
+ txn_ptr txn(m_pMdbEnv, true);
+
+ cursor_ptr cursor(txn, m_dbEventsSort);
+ if (mdb_cursor_get(cursor, &key, &data, MDB_NEXT) != MDB_SUCCESS)
+ return 0;
+
+ DBEventSortingKey *pKey = (DBEventSortingKey*)key.mv_data;
+ return (pKey->dwContactId == contactID) ? pKey->dwEventId : 0;
}
STDMETHODIMP_(MEVENT) CDbxMdb::FindFirstUnreadEvent(MCONTACT contactID)
@@ -165,24 +306,64 @@ STDMETHODIMP_(MEVENT) CDbxMdb::FindFirstUnreadEvent(MCONTACT contactID) STDMETHODIMP_(MEVENT) CDbxMdb::FindLastEvent(MCONTACT contactID)
{
+ DBEventSortingKey keyVal = { contactID, 0, 0 };
+ MDB_val key = { sizeof(keyVal), &keyVal }, data;
+
mir_cslock lck(m_csDbAccess);
- return NULL;
+ txn_ptr txn(m_pMdbEnv, true);
+
+ cursor_ptr cursor(txn, m_dbEventsSort);
+ if (mdb_cursor_get(cursor, &key, &data, MDB_PREV) != MDB_SUCCESS)
+ return 0;
+
+ DBEventSortingKey *pKey = (DBEventSortingKey*)key.mv_data;
+ return (pKey->dwContactId == contactID) ? pKey->dwEventId : 0;
}
STDMETHODIMP_(MEVENT) CDbxMdb::FindNextEvent(MCONTACT contactID, MEVENT hDbEvent)
{
- DBCachedContact *cc = (contactID) ? m_cache->GetCachedContact(contactID) : NULL;
+ MDB_val key = { sizeof(MEVENT), &hDbEvent }, data;
mir_cslock lck(m_csDbAccess);
- return NULL;
+ txn_ptr txn(m_pMdbEnv, true);
+
+ if (mdb_get(txn, m_dbEvents, &key, &data) != MDB_SUCCESS)
+ return 0;
+
+ DBEvent *dbe = (DBEvent*)data.mv_data;
+ DBEventSortingKey keyVal = { contactID, dbe->timestamp, hDbEvent+1 };
+ key.mv_size = sizeof(keyVal); key.mv_data = &keyVal;
+
+ cursor_ptr cursor(txn, m_dbEventsSort);
+ if (mdb_cursor_get(cursor, &key, &data, MDB_SET_KEY) != MDB_SUCCESS)
+ if (mdb_cursor_get(cursor, &key, &data, MDB_NEXT) != MDB_SUCCESS)
+ return 0;
+
+ DBEventSortingKey *pKey = (DBEventSortingKey*)key.mv_data;
+ return (pKey->dwContactId == contactID) ? pKey->dwEventId : 0;
}
STDMETHODIMP_(MEVENT) CDbxMdb::FindPrevEvent(MCONTACT contactID, MEVENT hDbEvent)
{
- DBCachedContact *cc = (contactID) ? m_cache->GetCachedContact(contactID) : NULL;
+ MDB_val key = { sizeof(MEVENT), &hDbEvent }, data;
mir_cslock lck(m_csDbAccess);
- return NULL;
+ txn_ptr txn(m_pMdbEnv, true);
+
+ if (mdb_get(txn, m_dbEvents, &key, &data) != MDB_SUCCESS)
+ return 0;
+
+ DBEvent *dbe = (DBEvent*)data.mv_data;
+ DBEventSortingKey keyVal = { contactID, dbe->timestamp, hDbEvent - 1 };
+ key.mv_size = sizeof(keyVal); key.mv_data = &keyVal;
+
+ cursor_ptr cursor(txn, m_dbEventsSort);
+ if (mdb_cursor_get(cursor, &key, &data, MDB_SET_KEY) != MDB_SUCCESS)
+ if (mdb_cursor_get(cursor, &key, &data, MDB_PREV) != MDB_SUCCESS)
+ return 0;
+
+ DBEventSortingKey *pKey = (DBEventSortingKey*)key.mv_data;
+ return (pKey->dwContactId == contactID) ? pKey->dwEventId : 0;
}
/////////////////////////////////////////////////////////////////////////////////////////
diff --git a/plugins/Dbx_mdb/src/dbintf.cpp b/plugins/Dbx_mdb/src/dbintf.cpp index f519d3dd4b..01bbfe4fed 100644 --- a/plugins/Dbx_mdb/src/dbintf.cpp +++ b/plugins/Dbx_mdb/src/dbintf.cpp @@ -90,11 +90,29 @@ int CDbxMdb::Load(bool bSkipInit) if (!bSkipInit) {
txn_ptr trnlck(m_pMdbEnv);
+ mdb_open(trnlck, "global", MDB_CREATE | MDB_INTEGERKEY, &m_dbGlobal);
mdb_open(trnlck, "contacts", MDB_CREATE | MDB_INTEGERKEY, &m_dbContacts);
mdb_open(trnlck, "modules", MDB_CREATE | MDB_INTEGERKEY, &m_dbModules);
mdb_open(trnlck, "events", MDB_CREATE | MDB_INTEGERKEY, &m_dbEvents);
- mdb_open(trnlck, "eventsrt", MDB_CREATE, &m_dbEvents);
+ mdb_open(trnlck, "eventsrt", MDB_CREATE | MDB_INTEGERKEY, &m_dbEventsSort);
mdb_open(trnlck, "settings", MDB_CREATE, &m_dbSettings);
+
+ DWORD keyVal = 1;
+ MDB_val key = { sizeof(DWORD), &keyVal }, data;
+ if (mdb_get(trnlck, m_dbGlobal, &key, &data) == MDB_SUCCESS) {
+ DBHeader *hdr = (DBHeader*)data.mv_data;
+ if (hdr->signature != DBHEADER_SIGNATURE)
+ DatabaseCorruption(NULL);
+
+ memcpy(&m_header, data.mv_data, sizeof(m_header));
+ }
+ else {
+ m_header.signature = DBHEADER_SIGNATURE;
+ m_header.dwVersion = 1;
+ m_header.eventCount = 0;
+ data.mv_data = &m_header; data.mv_size = sizeof(m_header);
+ mdb_put(trnlck, m_dbGlobal, &key, &data, 0);
+ }
trnlck.commit();
if (InitModuleNames()) return EGROKPRF_CANTREAD;
diff --git a/plugins/Dbx_mdb/src/dbintf.h b/plugins/Dbx_mdb/src/dbintf.h index 26f7c29629..cf9600eadf 100644 --- a/plugins/Dbx_mdb/src/dbintf.h +++ b/plugins/Dbx_mdb/src/dbintf.h @@ -47,31 +47,11 @@ DBHeader #define DBMODE_SHARED 0x0001
#define DBMODE_READONLY 0x0002
-#define DB_OLD_VERSION 0x00000700u
-#define DB_094_VERSION 0x00000701u
-#define DB_095_VERSION 0x00000800u
-#define DB_095_1_VERSION 0x00000801u
-
-#define DB_SETTINGS_RESIZE_GRANULARITY 128
-
-#define WSOFS_END 0xFFFFFFFF
-#define WS_ERROR 0xFFFFFFFF
-
#define DBVT_ENCRYPTED 250
#define DBVT_UNENCRYPTED 251
#define MARKED_READ (DBEF_READ | DBEF_SENT)
-#define NeedBytes(n) if (bytesRemaining<(n)) pBlob = (PBYTE)DBRead(ofsBlobPtr,&bytesRemaining)
-#define MoveAlong(n) {int x = n; pBlob += (x); ofsBlobPtr += (x); bytesRemaining -= (x);}
-
-DWORD __forceinline GetSettingValueLength(PBYTE pSetting)
-{
- if (pSetting[0] & DBVTF_VARIABLELENGTH)
- return 2 + *(PWORD)(pSetting + 1);
- return pSetting[0];
-}
-
struct ModuleName
{
char *name;
@@ -80,21 +60,22 @@ struct ModuleName #include <pshpack1.h>
-struct DBSettingKey
+#define DBHEADER_SIGNATURE 0x40DECADEu
+struct DBHeader
{
- DWORD dwContactID;
- DWORD dwOfsModule;
- char szSettingName[100];
+ DWORD signature;
+ DWORD dwVersion; // database format version
+ DWORD eventCount; // number of events in the chain for this contact
};
-#define DBCONTACT_SIGNATURE 0x43DECADEu
+#define DBCONTACT_SIGNATURE 0x43DECADEu
struct DBContact
{
DWORD signature;
DWORD eventCount; // number of events in the chain for this contact
};
-#define DBMODULENAME_SIGNATURE 0x4DDECADEu
+#define DBMODULENAME_SIGNATURE 0x4DDECADEu
struct DBModuleName
{
DWORD signature;
@@ -111,8 +92,7 @@ struct DBEvent DWORD timestamp; // seconds since 00:00:00 01/01/1970
DWORD flags; // see m_database.h, db/event/add
WORD wEventType; // module-defined event type
- DWORD cbBlob; // number of bytes in the blob
- BYTE blob[1]; // the blob. module-defined formatting
+ WORD cbBlob; // number of bytes in the blob
bool __forceinline markedRead() const
{
@@ -219,6 +199,8 @@ public: protected:
MDB_env *m_pMdbEnv;
DWORD m_dwFileSize;
+ MDB_dbi m_dbGlobal;
+ DBHeader m_header;
HANDLE hSettingChangeEvent, hContactDeletedEvent, hContactAddedEvent, hEventMarkedRead;
@@ -244,7 +226,8 @@ protected: ////////////////////////////////////////////////////////////////////////////
// events
- MDB_dbi m_dbEvents;
+ MDB_dbi m_dbEvents, m_dbEventsSort;
+ DWORD m_dwMaxEventId;
////////////////////////////////////////////////////////////////////////////
// modules
diff --git a/plugins/Dbx_mdb/src/dbsettings.cpp b/plugins/Dbx_mdb/src/dbsettings.cpp index f8b307936f..2955466c50 100644 --- a/plugins/Dbx_mdb/src/dbsettings.cpp +++ b/plugins/Dbx_mdb/src/dbsettings.cpp @@ -23,8 +23,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "commonheaders.h"
-DWORD GetModuleNameOfs(const char *szName);
-DBCachedContact* AddToCachedContactList(MCONTACT contactID, int index);
+struct DBSettingKey
+{
+ DWORD dwContactID;
+ DWORD dwOfsModule;
+ char szSettingName[100];
+};
#define VLT(n) ((n == DBVT_UTF8 || n == DBVT_ENCRYPTED)?DBVT_ASCIIZ:n)
|