diff options
author | George Hazan <ghazan@miranda.im> | 2020-05-13 16:09:27 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2020-05-13 16:09:27 +0300 |
commit | 2b30685427500c9eedac4c0c4862b32af144a90c (patch) | |
tree | a34df3dd8446a4ec9cb466ddd0632b2fcbcde448 /plugins | |
parent | e27e90cf6167d5d23a4458ae99479df6135a16b2 (diff) |
kinda first working version of database event cursors
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/Dbx_mdbx/src/dbevents.cpp | 105 | ||||
-rw-r--r-- | plugins/Dbx_mdbx/src/dbintf.h | 21 | ||||
-rwxr-xr-x | plugins/Dbx_sqlite/src/dbevents.cpp | 12 | ||||
-rwxr-xr-x | plugins/Dbx_sqlite/src/dbintf.h | 6 | ||||
-rw-r--r-- | plugins/NewStory/src/history.cpp | 86 |
5 files changed, 112 insertions, 118 deletions
diff --git a/plugins/Dbx_mdbx/src/dbevents.cpp b/plugins/Dbx_mdbx/src/dbevents.cpp index e435e4b975..f065989221 100644 --- a/plugins/Dbx_mdbx/src/dbevents.cpp +++ b/plugins/Dbx_mdbx/src/dbevents.cpp @@ -623,41 +623,66 @@ MEVENT CDbxMDBX::FindPrevEvent(MCONTACT contactID, MEVENT hDbEvent) /////////////////////////////////////////////////////////////////////////////////////////
// Event cursors
-CMdbxEventCursor::CMdbxEventCursor(CDbxMDBX *pDb, MCONTACT hContact, DBEVENTINFO &dbei, bool bForward) :
- EventCursor(hContact, dbei),
- m_bForward(bForward)
+class CMdbxEventCursor : public DB::EventCursor
{
- 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;
+ friend class CDbxMDBX;
+ CDbxMDBX *m_pOwner;
+
+ bool m_bForward, m_bFirst = true;
+ DBCachedContact *m_cc;
+ DBEventSortingKey m_key;
+
+public:
+ CMdbxEventCursor(class CDbxMDBX *pDb, DBCachedContact *cc, bool bForward) :
+ EventCursor(cc->contactID),
+ m_pOwner(pDb),
+ m_bForward(bForward),
+ m_cc(cc)
+ {
+ 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 FetchNext() override
+ {
+ MDBX_cursor_op op;
+ if (m_bFirst) {
+ op = MDBX_SET_RANGE;
+ m_bFirst = false;
+ }
+ else {
+ op = (m_bForward) ? MDBX_NEXT : MDBX_PREV;
+ if (m_key.hEvent != m_cc->t_evLast)
+ return 0;
+ }
-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;
+ txn_ptr_ro txn(m_pOwner->m_txn_ro);
- const DBEventSortingKey *pKey = (const DBEventSortingKey *)key.iov_base;
- return (pKey->hContact == hContact) ? pKey->hEvent : 0;
-}
+ MDBX_val key = { &m_key, sizeof(m_key) }, data;
+ if (mdbx_cursor_get(m_pOwner->m_curEventsSort, &key, &data, op) != MDBX_SUCCESS)
+ return 0;
+
+ const DBEventSortingKey *pKey = (const DBEventSortingKey *)key.iov_base;
+ if (pKey->hContact != hContact) {
+ m_cc->t_tsLast = 0;
+ return m_cc->t_evLast = 0;
+ }
+
+ m_key = *pKey;
+ m_cc->t_evLast = pKey->hEvent;
+ m_cc->t_tsLast = pKey->ts;
+ return pKey->hEvent;
+ }
+};
-DB::EventCursor* CDbxMDBX::EventCursor(MCONTACT hContact, DBEVENTINFO &dbei)
+DB::EventCursor* CDbxMDBX::EventCursor(MCONTACT hContact, MEVENT)
{
DBCachedContact *cc;
if (hContact != 0) {
@@ -667,18 +692,10 @@ DB::EventCursor* CDbxMDBX::EventCursor(MCONTACT hContact, DBEVENTINFO &dbei) }
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;
+ return new CMdbxEventCursor(this, cc, true);
}
-DB::EventCursor* CDbxMDBX::EventCursorRev(MCONTACT hContact, DBEVENTINFO &dbei)
+DB::EventCursor* CDbxMDBX::EventCursorRev(MCONTACT hContact, MEVENT)
{
DBCachedContact *cc;
if (hContact != 0) {
@@ -688,13 +705,5 @@ DB::EventCursor* CDbxMDBX::EventCursorRev(MCONTACT hContact, DBEVENTINFO &dbei) }
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;
+ return new CMdbxEventCursor(this, cc, false);
}
diff --git a/plugins/Dbx_mdbx/src/dbintf.h b/plugins/Dbx_mdbx/src/dbintf.h index 05687bbfd2..06602c8632 100644 --- a/plugins/Dbx_mdbx/src/dbintf.h +++ b/plugins/Dbx_mdbx/src/dbintf.h @@ -136,23 +136,6 @@ 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 CMdbxEventCursor;
@@ -315,8 +298,8 @@ 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;
+ STDMETHODIMP_(DB::EventCursor *) EventCursor(MCONTACT hContact, MEVENT hDbEvent) override;
+ STDMETHODIMP_(DB::EventCursor *) EventCursorRev(MCONTACT hContact, MEVENT hDbEvent) override;
public:
MICryptoEngine *m_crypto;
diff --git a/plugins/Dbx_sqlite/src/dbevents.cpp b/plugins/Dbx_sqlite/src/dbevents.cpp index cec73e5a50..25755334a4 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, MEVENT hDbEvent) { - return new CDbxSQLiteEventCursor(hContact, dbei, m_db); + return new CDbxSQLiteEventCursor(hContact, m_db); } -STDMETHODIMP_(DB::EventCursor*) CDbxSQLite::EventCursorRev(MCONTACT hContact, DBEVENTINFO &dbei) +STDMETHODIMP_(DB::EventCursor*) CDbxSQLite::EventCursorRev(MCONTACT hContact, MEVENT hDbEvent) { - return new CDbxSQLiteEventCursor(hContact, dbei, m_db, true); + return new CDbxSQLiteEventCursor(hContact, m_db, true); } -CDbxSQLiteEventCursor::CDbxSQLiteEventCursor(MCONTACT _1, DBEVENTINFO& _2, sqlite3* _db, bool reverse) - : EventCursor(_1, _2), m_db(_db) +CDbxSQLiteEventCursor::CDbxSQLiteEventCursor(MCONTACT _1, sqlite3* _db, bool reverse) + : EventCursor(_1), m_db(_db) { if (reverse) sqlite3_prepare_v2(m_db, reverse_order_query, -1, &cursor, nullptr); diff --git a/plugins/Dbx_sqlite/src/dbintf.h b/plugins/Dbx_sqlite/src/dbintf.h index 1f0d44f54d..a1810f3f38 100755 --- a/plugins/Dbx_sqlite/src/dbintf.h +++ b/plugins/Dbx_sqlite/src/dbintf.h @@ -24,7 +24,7 @@ struct DBCachedContact : public DBCachedContactBase struct CDbxSQLiteEventCursor : public DB::EventCursor { - CDbxSQLiteEventCursor(MCONTACT _1, DBEVENTINFO& _2, sqlite3* m_db, bool reverse = false); + CDbxSQLiteEventCursor(MCONTACT _1, sqlite3* m_db, bool reverse = false); ~CDbxSQLiteEventCursor() override; MEVENT FetchNext() override; private: @@ -102,6 +102,6 @@ public: STDMETHODIMP_(BOOL) Compact() override; STDMETHODIMP_(BOOL) Backup(LPCWSTR) override; - STDMETHODIMP_(DB::EventCursor*) EventCursor(MCONTACT hContact, DBEVENTINFO& dbei) override; - STDMETHODIMP_(DB::EventCursor*) EventCursorRev(MCONTACT hContact, DBEVENTINFO& dbei) override; + STDMETHODIMP_(DB::EventCursor*) EventCursor(MCONTACT hContact, MEVENT hDbEvent) override; + STDMETHODIMP_(DB::EventCursor*) EventCursorRev(MCONTACT hContact, MEVENT hDbEvent) override; }; diff --git a/plugins/NewStory/src/history.cpp b/plugins/NewStory/src/history.cpp index cee9ad0dd4..16653b3683 100644 --- a/plugins/NewStory/src/history.cpp +++ b/plugins/NewStory/src/history.cpp @@ -711,58 +711,60 @@ public: SetFilePointer(hFile, -3, nullptr, FILE_CURRENT); // export events - MEVENT hDbEvent = db_event_first(m_hContact); bool bAppendOnly = false; - while (hDbEvent != NULL) { - DBEVENTINFO dbei = {}; - int nSize = db_event_getBlobSize(hDbEvent); - if (nSize > 0) { - dbei.cbBlob = nSize; - dbei.pBlob = (PBYTE)mir_alloc(dbei.cbBlob + 2); - dbei.pBlob[dbei.cbBlob] = 0; - dbei.pBlob[dbei.cbBlob + 1] = 0; - // Double null terminate, this should prevent most errors - // where the blob received has an invalid format - } - - if (!db_event_get(hDbEvent, &dbei)) { - if (bAppendOnly) { - SetFilePointer(hFile, -3, nullptr, FILE_END); - WriteFile(hFile, ",", 1, &dwBytesWritten, nullptr); + if (auto *pCursor = DB::Events(m_hContact)) { + while (MEVENT hDbEvent = pCursor->FetchNext()) { + DBEVENTINFO dbei = {}; + int nSize = db_event_getBlobSize(hDbEvent); + if (nSize > 0) { + dbei.cbBlob = nSize; + dbei.pBlob = (PBYTE)mir_alloc(dbei.cbBlob + 2); + dbei.pBlob[dbei.cbBlob] = 0; + dbei.pBlob[dbei.cbBlob + 1] = 0; + // Double null terminate, this should prevent most errors + // where the blob received has an invalid format } - JSONNode pRoot2; - pRoot2.push_back(JSONNode("type", dbei.eventType)); - if (mir_strcmp(dbei.szModule, proto)) - pRoot2.push_back(JSONNode("module", dbei.szModule)); + if (!db_event_get(hDbEvent, &dbei)) { + if (bAppendOnly) { + SetFilePointer(hFile, -3, nullptr, FILE_END); + WriteFile(hFile, ",", 1, &dwBytesWritten, nullptr); + } - pRoot2.push_back(JSONNode("timestamp", dbei.timestamp)); + JSONNode pRoot2; + pRoot2.push_back(JSONNode("type", dbei.eventType)); - wchar_t szTemp[500]; - TimeZone_PrintTimeStamp(UTC_TIME_HANDLE, dbei.timestamp, L"I", szTemp, _countof(szTemp), 0); - pRoot2.push_back(JSONNode("isotime", T2Utf(szTemp).get())); + if (mir_strcmp(dbei.szModule, proto)) + pRoot2.push_back(JSONNode("module", dbei.szModule)); - std::string flags; - if (dbei.flags & DBEF_SENT) - flags += "m"; - if (dbei.flags & DBEF_READ) - flags += "r"; - pRoot2.push_back(JSONNode("flags", flags)); + pRoot2.push_back(JSONNode("timestamp", dbei.timestamp)); - ptrW msg(DbEvent_GetTextW(&dbei, CP_ACP)); - if (msg) - pRoot2.push_back(JSONNode("body", T2Utf(msg).get())); + wchar_t szTemp[500]; + TimeZone_PrintTimeStamp(UTC_TIME_HANDLE, dbei.timestamp, L"I", szTemp, _countof(szTemp), 0); + pRoot2.push_back(JSONNode("isotime", T2Utf(szTemp).get())); - output = pRoot2.write_formatted(); - output += "\n]}"; + std::string flags; + if (dbei.flags & DBEF_SENT) + flags += "m"; + if (dbei.flags & DBEF_READ) + flags += "r"; + pRoot2.push_back(JSONNode("flags", flags)); - WriteFile(hFile, output.c_str(), (int)output.size(), &dwBytesWritten, nullptr); - if (dbei.pBlob) - mir_free(dbei.pBlob); - } + ptrW msg(DbEvent_GetTextW(&dbei, CP_ACP)); + if (msg) + pRoot2.push_back(JSONNode("body", T2Utf(msg).get())); - bAppendOnly = true; - hDbEvent = db_event_next(m_hContact, hDbEvent); + output = pRoot2.write_formatted(); + output += "\n]}"; + + WriteFile(hFile, output.c_str(), (int)output.size(), &dwBytesWritten, nullptr); + if (dbei.pBlob) + mir_free(dbei.pBlob); + } + + bAppendOnly = true; + } + delete pCursor; } // Close the file |