From 6d8085a6bc3847734cfdfd497055bc0f9ec8f9c5 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Tue, 10 Mar 2015 19:03:29 +0000 Subject: fix for the events' sorting order git-svn-id: http://svn.miranda-ng.org/main/trunk@12377 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/Dbx_mdb/src/commonheaders.h | 1 + plugins/Dbx_mdb/src/dbevents.cpp | 54 +++++++++++++++++++++++++------------ plugins/Dbx_mdb/src/dbintf.h | 2 +- plugins/Dbx_mdb/src/lmdb/mdb.c | 2 +- 4 files changed, 40 insertions(+), 19 deletions(-) diff --git a/plugins/Dbx_mdb/src/commonheaders.h b/plugins/Dbx_mdb/src/commonheaders.h index e68a261e56..50959d158f 100644 --- a/plugins/Dbx_mdb/src/commonheaders.h +++ b/plugins/Dbx_mdb/src/commonheaders.h @@ -42,6 +42,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include +#include extern "C" { diff --git a/plugins/Dbx_mdb/src/dbevents.cpp b/plugins/Dbx_mdb/src/dbevents.cpp index ea9b27b390..cb6cc7ab3d 100644 --- a/plugins/Dbx_mdb/src/dbevents.cpp +++ b/plugins/Dbx_mdb/src/dbevents.cpp @@ -88,7 +88,7 @@ STDMETHODIMP_(MEVENT) CDbxMdb::AddEvent(MCONTACT contactID, DBEVENTINFO *dbei) memcpy(pDest + sizeof(DBEvent), pBlob, dbe.cbBlob); // add a sorting key - DBEventSortingKey key2 = { contactID, dbe.timestamp, dwEventId }; + DBEventSortingKey key2 = { dwEventId, dbe.timestamp, contactID }; key.mv_size = sizeof(key2); key.mv_data = &key2; data.mv_size = 1; data.mv_data = ""; MDB_CHECK(mdb_put(txn, m_dbEventsSort, &key, &data, 0), 0); @@ -137,7 +137,7 @@ STDMETHODIMP_(BOOL) CDbxMdb::DeleteEvent(MCONTACT contactID, MEVENT hDbEvent) DBEvent *dbe = (DBEvent*)data.mv_data; DWORD dwSavedContact = dbe->contactID; - DBEventSortingKey key2 = { contactID, dbe->timestamp, hDbEvent }; + DBEventSortingKey key2 = { hDbEvent, dbe->timestamp, contactID }; mdb_del(txn, m_dbEvents, &key, &data); // remove a sorting key @@ -265,7 +265,7 @@ STDMETHODIMP_(BOOL) CDbxMdb::MarkEventRead(MCONTACT contactID, MEVENT hDbEvent) if (dbe->markedRead()) return dbe->flags; - DBEventSortingKey key2 = { contactID, dbe->timestamp, hDbEvent }; + DBEventSortingKey key2 = { hDbEvent, dbe->timestamp, contactID }; dbe->flags |= DBEF_READ; mdb_put(txn, m_dbEvents, &key, &data, 0); @@ -297,7 +297,7 @@ STDMETHODIMP_(MCONTACT) CDbxMdb::GetEventContact(MEVENT hDbEvent) STDMETHODIMP_(MEVENT) CDbxMdb::FindFirstEvent(MCONTACT contactID) { - DBEventSortingKey keyVal = { contactID, 0, 0 }; + DBEventSortingKey keyVal = { 0, 0, contactID }; MDB_val key = { sizeof(keyVal), &keyVal }, data; mir_cslock lck(m_csDbAccess); @@ -305,11 +305,14 @@ STDMETHODIMP_(MEVENT) CDbxMdb::FindFirstEvent(MCONTACT contactID) cursor_ptr cursor(txn, m_dbEventsSort); mdb_cursor_get(cursor, &key, &data, MDB_SET_KEY); - if (mdb_cursor_get(cursor, &key, &data, MDB_NEXT) != MDB_SUCCESS) + if (mdb_cursor_get(cursor, &key, &data, MDB_NEXT) != MDB_SUCCESS) { + // Netlib_Logf(NULL, "FindFirstEvent(%d): error", contactID); return 0; + } DBEventSortingKey *pKey = (DBEventSortingKey*)key.mv_data; - return (pKey->dwContactId == contactID) ? pKey->dwEventId : 0; + // Netlib_Logf(NULL, "FindFirstEvent(%d): %d %d %d", contactID, pKey->dwContactId, pKey->ts, pKey->dwEventId); + return (pKey->dwContactId == contactID) ? pKey->dwEventId : 0; } STDMETHODIMP_(MEVENT) CDbxMdb::FindFirstUnreadEvent(MCONTACT contactID) @@ -320,18 +323,21 @@ STDMETHODIMP_(MEVENT) CDbxMdb::FindFirstUnreadEvent(MCONTACT contactID) STDMETHODIMP_(MEVENT) CDbxMdb::FindLastEvent(MCONTACT contactID) { - DBEventSortingKey keyVal = { contactID, -1, -1 }; + DBEventSortingKey keyVal = { 0xFFFFFFFF, 0xFFFFFFFF, contactID }; MDB_val key = { sizeof(keyVal), &keyVal }, data; mir_cslock lck(m_csDbAccess); txn_ptr txn(m_pMdbEnv, true); - + cursor_ptr cursor(txn, m_dbEventsSort); mdb_cursor_get(cursor, &key, &data, MDB_SET_KEY); - if (mdb_cursor_get(cursor, &key, &data, MDB_PREV) != MDB_SUCCESS) + if (mdb_cursor_get(cursor, &key, &data, MDB_PREV) != MDB_SUCCESS) { + // Netlib_Logf(NULL, "FindLastEvent(%d): error", contactID); return 0; + } DBEventSortingKey *pKey = (DBEventSortingKey*)key.mv_data; + // Netlib_Logf(NULL, "FindLastEvent(%d): %d %d %d", contactID, pKey->dwContactId, pKey->ts, pKey->dwEventId); return (pKey->dwContactId == contactID) ? pKey->dwEventId : 0; } @@ -342,20 +348,27 @@ STDMETHODIMP_(MEVENT) CDbxMdb::FindNextEvent(MCONTACT contactID, MEVENT hDbEvent mir_cslock lck(m_csDbAccess); txn_ptr txn(m_pMdbEnv, true); - if (mdb_get(txn, m_dbEvents, &key, &data) != MDB_SUCCESS) + if (mdb_get(txn, m_dbEvents, &key, &data) != MDB_SUCCESS) { + // Netlib_Logf(NULL, "FindNextEvent(%d, %d): no event", contactID, hDbEvent); return 0; + } DBEvent *dbe = (DBEvent*)data.mv_data; - DBEventSortingKey keyVal = { contactID, dbe->timestamp, hDbEvent }; + DBEventSortingKey keyVal = { hDbEvent, dbe->timestamp, contactID }; 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_SET_KEY) != MDB_SUCCESS) { + // Netlib_Logf(NULL, "FindNextEvent(%d, %d): set error", contactID, hDbEvent); return 0; - if (mdb_cursor_get(cursor, &key, &data, MDB_NEXT) != MDB_SUCCESS) + } + if (mdb_cursor_get(cursor, &key, &data, MDB_NEXT) != MDB_SUCCESS) { + // Netlib_Logf(NULL, "FindNextEvent(%d, %d): next error", contactID, hDbEvent); return 0; + } DBEventSortingKey *pKey = (DBEventSortingKey*)key.mv_data; + // Netlib_Logf(NULL, "FindNextEvent(%d, %d): %d %d %d", contactID, hDbEvent, pKey->dwContactId, pKey->ts, pKey->dwEventId); return (pKey->dwContactId == contactID) ? pKey->dwEventId : 0; } @@ -366,20 +379,27 @@ STDMETHODIMP_(MEVENT) CDbxMdb::FindPrevEvent(MCONTACT contactID, MEVENT hDbEvent mir_cslock lck(m_csDbAccess); txn_ptr txn(m_pMdbEnv, true); - if (mdb_get(txn, m_dbEvents, &key, &data) != MDB_SUCCESS) + if (mdb_get(txn, m_dbEvents, &key, &data) != MDB_SUCCESS) { + // Netlib_Logf(NULL, "FindPrevEvent(%d, %d): no event", contactID, hDbEvent); return 0; + } DBEvent *dbe = (DBEvent*)data.mv_data; - DBEventSortingKey keyVal = { contactID, dbe->timestamp, hDbEvent }; + DBEventSortingKey keyVal = { hDbEvent, dbe->timestamp, contactID }; 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_SET_KEY) != MDB_SUCCESS) { + // Netlib_Logf(NULL, "FindPrevEvent(%d, %d): set error", contactID, hDbEvent); return 0; - if (mdb_cursor_get(cursor, &key, &data, MDB_PREV) != MDB_SUCCESS) + } + if (mdb_cursor_get(cursor, &key, &data, MDB_PREV) != MDB_SUCCESS) { + // Netlib_Logf(NULL, "FindPrevEvent(%d, %d): prev error", contactID, hDbEvent); return 0; + } DBEventSortingKey *pKey = (DBEventSortingKey*)key.mv_data; + // Netlib_Logf(NULL, "FindPrevEvent(%d, %d): %d %d %d", contactID, hDbEvent, pKey->dwContactId, pKey->ts, pKey->dwEventId); return (pKey->dwContactId == contactID) ? pKey->dwEventId : 0; } diff --git a/plugins/Dbx_mdb/src/dbintf.h b/plugins/Dbx_mdb/src/dbintf.h index 5590b44c09..f36e64383b 100644 --- a/plugins/Dbx_mdb/src/dbintf.h +++ b/plugins/Dbx_mdb/src/dbintf.h @@ -107,7 +107,7 @@ struct DBEvent struct DBEventSortingKey { - DWORD dwContactId, ts, dwEventId; + DWORD dwEventId, ts, dwContactId; }; struct DBCachedContact : public DBCachedContactBase diff --git a/plugins/Dbx_mdb/src/lmdb/mdb.c b/plugins/Dbx_mdb/src/lmdb/mdb.c index 2ab6bda0c5..65ac5b7d74 100644 --- a/plugins/Dbx_mdb/src/lmdb/mdb.c +++ b/plugins/Dbx_mdb/src/lmdb/mdb.c @@ -4962,7 +4962,7 @@ mdb_node_search(MDB_cursor *mc, MDB_val *key, int *exactp) if (cmp == mdb_cmp_cint && IS_BRANCH(mp)) { if (NODEPTR(mp, 1)->mn_ksize == sizeof(size_t)) cmp = mdb_cmp_long; - else + else if(NODEPTR(mp, 1)->mn_ksize == sizeof(int)) cmp = mdb_cmp_int; } -- cgit v1.2.3