From c5d7d8ab002cf73fd309a4eb65e4fc8d5dafa9db Mon Sep 17 00:00:00 2001 From: George Hazan Date: Tue, 12 May 2020 14:19:05 +0300 Subject: event cursors for mdbx driver --- include/m_database.h | 16 ++---- libs/win32/mir_app.lib | Bin 206224 -> 206130 bytes libs/win32/mir_core.lib | Bin 466724 -> 466564 bytes libs/win64/mir_app.lib | Bin 201832 -> 201736 bytes libs/win64/mir_core.lib | Bin 471634 -> 471474 bytes plugins/Dbx_mdbx/src/dbevents.cpp | 107 +++++++++++++++++++++++++++++++----- plugins/Dbx_mdbx/src/dbintf.h | 22 +++++++- plugins/Dbx_sqlite/src/dbevents.cpp | 8 +-- plugins/Dbx_sqlite/src/dbintf.h | 2 +- src/mir_app/src/mir_app.def | 4 +- src/mir_app/src/mir_app64.def | 4 +- src/mir_core/src/db.cpp | 2 +- src/mir_core/src/mir_core.def | 16 +++--- src/mir_core/src/mir_core64.def | 16 +++--- 14 files changed, 146 insertions(+), 51 deletions(-) diff --git a/include/m_database.h b/include/m_database.h index 259e3a5699..972a1d2ece 100644 --- a/include/m_database.h +++ b/include/m_database.h @@ -702,7 +702,7 @@ public: ///////////////////////////////////////////////////////////////////////////////////////// // Event cursors -class MIR_CORE_EXPORT EventCursorBase : public MZeroedObject +class MIR_CORE_EXPORT EventCursor : public MZeroedObject { friend class EventIterator; @@ -710,11 +710,11 @@ protected: DBEVENTINFO &dbei; MCONTACT hContact; - virtual ~EventCursorBase(); + virtual ~EventCursor(); virtual MEVENT FetchNext() = 0; public: - EventCursorBase(MCONTACT _1, DBEVENTINFO &_2) : + EventCursor(MCONTACT _1, DBEVENTINFO &_2) : hContact(_1), dbei(_2) { } @@ -728,17 +728,13 @@ public: } }; -#if !defined(CUSTOM_EVENT_CURSOR) -typedef class EventCursorBase EventCursor; -#endif - class EventIterator { - EventCursorBase *cursor; - MEVENT hCurr; + EventCursor *cursor; + MEVENT hCurr = 0; public: - EventIterator(EventCursorBase *_1) : + EventIterator(EventCursor *_1) : cursor(_1) {} diff --git a/libs/win32/mir_app.lib b/libs/win32/mir_app.lib index 69034db1ff..5eba2a03e5 100644 Binary files a/libs/win32/mir_app.lib and b/libs/win32/mir_app.lib differ diff --git a/libs/win32/mir_core.lib b/libs/win32/mir_core.lib index 87139eb570..d23d29a2a1 100644 Binary files a/libs/win32/mir_core.lib and b/libs/win32/mir_core.lib differ diff --git a/libs/win64/mir_app.lib b/libs/win64/mir_app.lib index b065fdad35..c50cd2a11c 100644 Binary files a/libs/win64/mir_app.lib and b/libs/win64/mir_app.lib differ diff --git a/libs/win64/mir_core.lib b/libs/win64/mir_core.lib index 431a9e1c01..3231e379b1 100644 Binary files a/libs/win64/mir_core.lib and b/libs/win64/mir_core.lib differ diff --git a/plugins/Dbx_mdbx/src/dbevents.cpp b/plugins/Dbx_mdbx/src/dbevents.cpp index e3d4dfe015..e435e4b975 100644 --- a/plugins/Dbx_mdbx/src/dbevents.cpp +++ b/plugins/Dbx_mdbx/src/dbevents.cpp @@ -32,7 +32,7 @@ LONG CDbxMDBX::GetEventCount(MCONTACT contactID) return (cc == nullptr) ? 0 : cc->dbc.dwEventCount; } -/////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// MEVENT CDbxMDBX::AddEvent(MCONTACT contactID, const DBEVENTINFO *dbei) { @@ -46,7 +46,7 @@ MEVENT CDbxMDBX::AddEvent(MCONTACT contactID, const DBEVENTINFO *dbei) return dwEventId; } -/////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// BOOL CDbxMDBX::DeleteEvent(MEVENT hDbEvent) { @@ -125,7 +125,7 @@ BOOL CDbxMDBX::DeleteEvent(MEVENT hDbEvent) return 0; } -/////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// BOOL CDbxMDBX::EditEvent(MCONTACT contactID, MEVENT hDbEvent, const DBEVENTINFO *dbei) { @@ -251,7 +251,7 @@ bool CDbxMDBX::EditEvent(MCONTACT contactID, MEVENT hDbEvent, const DBEVENTINFO return true; } -/////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// LONG CDbxMDBX::GetBlobSize(MEVENT hDbEvent) { @@ -263,7 +263,7 @@ LONG CDbxMDBX::GetBlobSize(MEVENT hDbEvent) return ((const DBEvent*)data.iov_base)->cbBlob; } -/////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// BOOL CDbxMDBX::GetEvent(MEVENT hDbEvent, DBEVENTINFO *dbei) { @@ -309,7 +309,7 @@ BOOL CDbxMDBX::GetEvent(MEVENT hDbEvent, DBEVENTINFO *dbei) return 0; } -/////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// void CDbxMDBX::FindNextUnread(const txn_ptr &txn, DBCachedContact *cc, DBEventSortingKey &key2) { @@ -356,7 +356,7 @@ bool CDbxMDBX::CheckEvent(DBCachedContact *cc, const DBEvent *cdbe, DBCachedCont return cc->contactID == cdbe->dwContactID; } -/////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// BOOL CDbxMDBX::MarkEventRead(MCONTACT contactID, MEVENT hDbEvent) { @@ -415,7 +415,7 @@ BOOL CDbxMDBX::MarkEventRead(MCONTACT contactID, MEVENT hDbEvent) return wRetVal; } -///////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////// MEVENT CDbxMDBX::GetEventById(LPCSTR szModule, LPCSTR szId) { @@ -458,7 +458,7 @@ BOOL CDbxMDBX::SetEventId(LPCSTR szModule, MEVENT hDbEvent, LPCSTR szId) return 0; } -/////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// MCONTACT CDbxMDBX::GetEventContact(MEVENT hDbEvent) { @@ -474,7 +474,7 @@ MCONTACT CDbxMDBX::GetEventContact(MEVENT hDbEvent) return ((const DBEvent*)data.iov_base)->dwContactID; } -/////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// MEVENT CDbxMDBX::FindFirstEvent(MCONTACT contactID) { @@ -500,7 +500,7 @@ MEVENT CDbxMDBX::FindFirstEvent(MCONTACT contactID) return cc->t_evLast = (pKey->hContact == contactID) ? pKey->hEvent : 0; } -/////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// MEVENT CDbxMDBX::FindFirstUnreadEvent(MCONTACT contactID) { @@ -508,7 +508,7 @@ MEVENT CDbxMDBX::FindFirstUnreadEvent(MCONTACT contactID) return (cc == nullptr) ? 0 : cc->dbc.evFirstUnread; } -/////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// MEVENT CDbxMDBX::FindLastEvent(MCONTACT contactID) { @@ -540,7 +540,7 @@ MEVENT CDbxMDBX::FindLastEvent(MCONTACT contactID) return cc->t_evLast = (pKey->hContact == contactID) ? pKey->hEvent : 0; } -/////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// MEVENT CDbxMDBX::FindNextEvent(MCONTACT contactID, MEVENT hDbEvent) { @@ -579,7 +579,7 @@ MEVENT CDbxMDBX::FindNextEvent(MCONTACT contactID, MEVENT hDbEvent) return cc->t_evLast = (pKey->hContact == contactID) ? pKey->hEvent : 0; } -/////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// MEVENT CDbxMDBX::FindPrevEvent(MCONTACT contactID, MEVENT hDbEvent) { @@ -619,3 +619,82 @@ MEVENT CDbxMDBX::FindPrevEvent(MCONTACT contactID, MEVENT hDbEvent) cc->t_tsLast = pKey->ts; return cc->t_evLast = (pKey->hContact == contactID) ? pKey->hEvent : 0; } + +///////////////////////////////////////////////////////////////////////////////////////// +// Event cursors + +CMdbxEventCursor::CMdbxEventCursor(CDbxMDBX *pDb, MCONTACT hContact, DBEVENTINFO &dbei, bool bForward) : + EventCursor(hContact, dbei), + m_bForward(bForward) +{ + mdbx_txn_begin(pDb->m_env, nullptr, MDBX_RDONLY, &m_txn_ro); + mdbx_cursor_open(m_txn_ro, pDb->m_dbEventsSort, &m_cursor); + + m_key.hContact = hContact; + if (bForward) { + m_key.hEvent = 0; + m_key.ts = 0; + } + else { + m_key.hEvent = 0xFFFFFFFF; + m_key.ts = 0xFFFFFFFFFFFFFFFF; + } +} + +CMdbxEventCursor::~CMdbxEventCursor() +{ + if (m_cursor) + mdbx_cursor_close(m_cursor); +} + +MEVENT CMdbxEventCursor::FetchNext() +{ + MDBX_val key = { &m_key, sizeof(m_key) }, data; + if (mdbx_cursor_get(*this, &key, &data, m_bForward ? MDBX_NEXT : MDBX_PREV) != MDBX_SUCCESS) + return 0; + + const DBEventSortingKey *pKey = (const DBEventSortingKey *)key.iov_base; + return (pKey->hContact == hContact) ? pKey->hEvent : 0; +} + +DB::EventCursor* CDbxMDBX::EventCursor(MCONTACT hContact, DBEVENTINFO &dbei) +{ + DBCachedContact *cc; + if (hContact != 0) { + cc = m_cache->GetCachedContact(hContact); + if (cc == nullptr) + return nullptr; + } + else cc = &m_ccDummy; + + auto *pCursor = new CMdbxEventCursor(this, hContact, dbei, true); + + MDBX_val key = { &pCursor->m_key, sizeof(pCursor->m_key) }, data; + if (mdbx_cursor_get(*pCursor, &key, &data, MDBX_SET_RANGE) != MDBX_SUCCESS) { + delete pCursor; + return nullptr; + } + + return pCursor; +} + +DB::EventCursor* CDbxMDBX::EventCursorRev(MCONTACT hContact, DBEVENTINFO &dbei) +{ + DBCachedContact *cc; + if (hContact != 0) { + cc = m_cache->GetCachedContact(hContact); + if (cc == nullptr) + return nullptr; + } + else cc = &m_ccDummy; + + auto *pCursor = new CMdbxEventCursor(this, hContact, dbei, false); + + MDBX_val key = { &pCursor->m_key, sizeof(pCursor->m_key) }, data; + if (mdbx_cursor_get(*pCursor, &key, &data, MDBX_SET_RANGE) != MDBX_SUCCESS) { + delete pCursor; + return nullptr; + } + + return pCursor; +} diff --git a/plugins/Dbx_mdbx/src/dbintf.h b/plugins/Dbx_mdbx/src/dbintf.h index b74b6bbc12..05687bbfd2 100644 --- a/plugins/Dbx_mdbx/src/dbintf.h +++ b/plugins/Dbx_mdbx/src/dbintf.h @@ -136,9 +136,26 @@ struct EventItem MEVENT eventId; }; +class CMdbxEventCursor : public DB::EventCursor +{ + CMDBX_txn_ro m_txn_ro; + MDBX_cursor* m_cursor = nullptr; + bool m_bForward; + +public: + CMdbxEventCursor(class CDbxMDBX *pOdb, MCONTACT hContact, DBEVENTINFO &dbei, bool bForward); + ~CMdbxEventCursor() override; + + MEVENT FetchNext() override; + + DBEventSortingKey m_key; + + __forceinline operator MDBX_cursor*() const { return m_cursor; } +}; + class CDbxMDBX : public MDatabaseCommon, public MZeroedObject { - friend class MDBXEventCursor; + friend class CMdbxEventCursor; struct Impl { CDbxMDBX &pro; @@ -298,6 +315,9 @@ public: STDMETHODIMP_(MEVENT) GetEventById(LPCSTR szModule, LPCSTR szId) override; STDMETHODIMP_(BOOL) SetEventId(LPCSTR szModule, MEVENT, LPCSTR szId) override; + STDMETHODIMP_(DB::EventCursor *) EventCursor(MCONTACT hContact, DBEVENTINFO &dbei) override; + STDMETHODIMP_(DB::EventCursor *) EventCursorRev(MCONTACT hContact, DBEVENTINFO &dbei) override; + public: MICryptoEngine *m_crypto; }; diff --git a/plugins/Dbx_sqlite/src/dbevents.cpp b/plugins/Dbx_sqlite/src/dbevents.cpp index bef40881e8..cec73e5a50 100755 --- a/plugins/Dbx_sqlite/src/dbevents.cpp +++ b/plugins/Dbx_sqlite/src/dbevents.cpp @@ -718,18 +718,18 @@ BOOL CDbxSQLite::MetaSplitHistory(DBCachedContact *ccMeta, DBCachedContact*) return TRUE; } -STDMETHODIMP_(DB::EventCursor*) CDbxSQLite::EventCursor(MCONTACT hContact, DBEVENTINFO& dbei) +STDMETHODIMP_(DB::EventCursor*) CDbxSQLite::EventCursor(MCONTACT hContact, DBEVENTINFO &dbei) { return new CDbxSQLiteEventCursor(hContact, dbei, m_db); } -STDMETHODIMP_(DB::EventCursor*) CDbxSQLite::EventCursorRev(MCONTACT hContact, DBEVENTINFO& dbei) +STDMETHODIMP_(DB::EventCursor*) CDbxSQLite::EventCursorRev(MCONTACT hContact, DBEVENTINFO &dbei) { return new CDbxSQLiteEventCursor(hContact, dbei, m_db, true); } CDbxSQLiteEventCursor::CDbxSQLiteEventCursor(MCONTACT _1, DBEVENTINFO& _2, sqlite3* _db, bool reverse) - : EventCursorBase(_1, _2), m_db(_db) + : EventCursor(_1, _2), m_db(_db) { if (reverse) sqlite3_prepare_v2(m_db, reverse_order_query, -1, &cursor, nullptr); @@ -743,6 +743,7 @@ CDbxSQLiteEventCursor::~CDbxSQLiteEventCursor() if (cursor) sqlite3_reset(cursor); } + MEVENT CDbxSQLiteEventCursor::FetchNext() { if (!cursor) @@ -758,4 +759,3 @@ MEVENT CDbxSQLiteEventCursor::FetchNext() } return sqlite3_column_int64(cursor, 0); } - diff --git a/plugins/Dbx_sqlite/src/dbintf.h b/plugins/Dbx_sqlite/src/dbintf.h index 99cf1fba3f..1f0d44f54d 100755 --- a/plugins/Dbx_sqlite/src/dbintf.h +++ b/plugins/Dbx_sqlite/src/dbintf.h @@ -22,7 +22,7 @@ struct DBCachedContact : public DBCachedContactBase void MarkRead(MEVENT hDbEvent); }; -struct CDbxSQLiteEventCursor : public DB::EventCursorBase +struct CDbxSQLiteEventCursor : public DB::EventCursor { CDbxSQLiteEventCursor(MCONTACT _1, DBEVENTINFO& _2, sqlite3* m_db, bool reverse = false); ~CDbxSQLiteEventCursor() override; diff --git a/src/mir_app/src/mir_app.def b/src/mir_app/src/mir_app.def index be7e00c7d1..340d145332 100644 --- a/src/mir_app/src/mir_app.def +++ b/src/mir_app/src/mir_app.def @@ -732,6 +732,6 @@ ProtoBroadcastAsync @814 NONAME ?UseGroups@Clist@@3V?$CMOption@_N@@A @819 NONAME ?OfflineModes@Clist@@3V?$CMOption@K@@A @820 NONAME ?getChat@CSrmmBaseDialog@@QBEPAUSESSION_INFO@@XZ @821 NONAME -?EventCursor@MDatabaseCommon@@UAGPAVEventCursorBase@DB@@IAAUDBEVENTINFO@@@Z @822 NONAME -?EventCursorRev@MDatabaseCommon@@UAGPAVEventCursorBase@DB@@IAAUDBEVENTINFO@@@Z @823 NONAME +?EventCursor@MDatabaseCommon@@UAGPAV0DB@@IAAUDBEVENTINFO@@@Z @822 NONAME +?EventCursorRev@MDatabaseCommon@@UAGPAVEventCursor@DB@@IAAUDBEVENTINFO@@@Z @823 NONAME Chat_CreateMenu @824 NONAME diff --git a/src/mir_app/src/mir_app64.def b/src/mir_app/src/mir_app64.def index 765d46b37b..2d9ac3a4b4 100644 --- a/src/mir_app/src/mir_app64.def +++ b/src/mir_app/src/mir_app64.def @@ -732,6 +732,6 @@ ProtoBroadcastAsync @814 NONAME ?UseGroups@Clist@@3V?$CMOption@_N@@A @819 NONAME ?OfflineModes@Clist@@3V?$CMOption@K@@A @820 NONAME ?getChat@CSrmmBaseDialog@@QEBAPEAUSESSION_INFO@@XZ @821 NONAME -?EventCursor@MDatabaseCommon@@UEAAPEAVEventCursorBase@DB@@IAEAUDBEVENTINFO@@@Z @822 NONAME -?EventCursorRev@MDatabaseCommon@@UEAAPEAVEventCursorBase@DB@@IAEAUDBEVENTINFO@@@Z @823 NONAME +?EventCursor@MDatabaseCommon@@UEAAPEAV0DB@@IAEAUDBEVENTINFO@@@Z @822 NONAME +?EventCursorRev@MDatabaseCommon@@UEAAPEAVEventCursor@DB@@IAEAUDBEVENTINFO@@@Z @823 NONAME Chat_CreateMenu @824 NONAME diff --git a/src/mir_core/src/db.cpp b/src/mir_core/src/db.cpp index 39c0835281..05d775d598 100644 --- a/src/mir_core/src/db.cpp +++ b/src/mir_core/src/db.cpp @@ -439,7 +439,7 @@ MIR_CORE_DLL(MEVENT) db_event_setId(const char *szModule, MEVENT hDbEvent, const ///////////////////////////////////////////////////////////////////////////////////////// // event cursors -DB::EventCursorBase::~EventCursorBase() +DB::EventCursor::~EventCursor() { } diff --git a/src/mir_core/src/mir_core.def b/src/mir_core/src/mir_core.def index 7b5c2f8b23..49da70f1b6 100644 --- a/src/mir_core/src/mir_core.def +++ b/src/mir_core/src/mir_core.def @@ -1457,12 +1457,12 @@ XmlGetChildText @1645 ?InsertNewDeclaration@XMLElement@tinyxml2@@QAEPAVXMLDeclaration@2@PBD@Z @1679 NONAME ?InsertNewText@XMLElement@tinyxml2@@QAEPAVXMLText@2@PBD@Z @1680 NONAME ?InsertNewUnknown@XMLElement@tinyxml2@@QAEPAVXMLUnknown@2@PBD@Z @1681 NONAME -??1EventCursorBase@DB@@MAE@XZ @1684 NONAME -??0EventCursorBase@DB@@QAE@ABV01@@Z @1685 NONAME -??0EventCursorBase@DB@@QAE@IAAUDBEVENTINFO@@@Z @1686 NONAME -??_7EventCursorBase@DB@@6B@ @1687 NONAME -?Events@DB@@YGPAVEventCursorBase@1@IAAUDBEVENTINFO@@@Z @1688 NONAME -?EventsRev@DB@@YGPAVEventCursorBase@1@IAAUDBEVENTINFO@@@Z @1689 NONAME -?begin@EventCursorBase@DB@@QAEIXZ @1690 NONAME -?end@EventCursorBase@DB@@QAEIXZ @1691 NONAME +??1EventCursor@DB@@MAE@XZ @1684 NONAME +??0EventCursor@DB@@QAE@ABV01@@Z @1685 NONAME +??0EventCursor@DB@@QAE@IAAUDBEVENTINFO@@@Z @1686 NONAME +??_7EventCursor@DB@@6B@ @1687 NONAME +?Events@DB@@YGPAVEventCursor@1@IAAUDBEVENTINFO@@@Z @1688 NONAME +?EventsRev@DB@@YGPAVEventCursor@1@IAAUDBEVENTINFO@@@Z @1689 NONAME +?begin@EventCursor@DB@@QAEIXZ @1690 NONAME +?end@EventCursor@DB@@QAEIXZ @1691 NONAME TimeZone_GetSystemTime @1692 diff --git a/src/mir_core/src/mir_core64.def b/src/mir_core/src/mir_core64.def index c66e248673..e9e0959b67 100644 --- a/src/mir_core/src/mir_core64.def +++ b/src/mir_core/src/mir_core64.def @@ -1457,12 +1457,12 @@ XmlGetChildText @1645 ?InsertNewDeclaration@XMLElement@tinyxml2@@QEAAPEAVXMLDeclaration@2@PEBD@Z @1679 NONAME ?InsertNewText@XMLElement@tinyxml2@@QEAAPEAVXMLText@2@PEBD@Z @1680 NONAME ?InsertNewUnknown@XMLElement@tinyxml2@@QEAAPEAVXMLUnknown@2@PEBD@Z @1681 NONAME -??1EventCursorBase@DB@@MEAA@XZ @1684 NONAME -??0EventCursorBase@DB@@QEAA@AEBV01@@Z @1685 NONAME -??0EventCursorBase@DB@@QEAA@IAEAUDBEVENTINFO@@@Z @1686 NONAME -??_7EventCursorBase@DB@@6B@ @1687 NONAME -?Events@DB@@YAPEAVEventCursorBase@1@IAEAUDBEVENTINFO@@@Z @1688 NONAME -?EventsRev@DB@@YAPEAVEventCursorBase@1@IAEAUDBEVENTINFO@@@Z @1689 NONAME -?begin@EventCursorBase@DB@@QEAAIXZ @1690 NONAME -?end@EventCursorBase@DB@@QEAAIXZ @1691 NONAME +??1EventCursor@DB@@MEAA@XZ @1684 NONAME +??0EventCursor@DB@@QEAA@AEBV01@@Z @1685 NONAME +??0EventCursor@DB@@QEAA@IAEAUDBEVENTINFO@@@Z @1686 NONAME +??_7EventCursor@DB@@6B@ @1687 NONAME +?Events@DB@@YAPEAVEventCursor@1@IAEAUDBEVENTINFO@@@Z @1688 NONAME +?EventsRev@DB@@YAPEAVEventCursor@1@IAEAUDBEVENTINFO@@@Z @1689 NONAME +?begin@EventCursor@DB@@QEAAIXZ @1690 NONAME +?end@EventCursor@DB@@QEAAIXZ @1691 NONAME TimeZone_GetSystemTime @1692 -- cgit v1.2.3