summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2020-05-13 16:09:27 +0300
committerGeorge Hazan <ghazan@miranda.im>2020-05-13 16:09:27 +0300
commit2b30685427500c9eedac4c0c4862b32af144a90c (patch)
treea34df3dd8446a4ec9cb466ddd0632b2fcbcde448 /plugins
parente27e90cf6167d5d23a4458ae99479df6135a16b2 (diff)
kinda first working version of database event cursors
Diffstat (limited to 'plugins')
-rw-r--r--plugins/Dbx_mdbx/src/dbevents.cpp105
-rw-r--r--plugins/Dbx_mdbx/src/dbintf.h21
-rwxr-xr-xplugins/Dbx_sqlite/src/dbevents.cpp12
-rwxr-xr-xplugins/Dbx_sqlite/src/dbintf.h6
-rw-r--r--plugins/NewStory/src/history.cpp86
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