summaryrefslogtreecommitdiff
path: root/src/mir_app
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2021-01-08 21:39:50 +0300
committerGeorge Hazan <ghazan@miranda.im>2021-01-08 21:39:56 +0300
commit2bf9d8e3bc1e51e28a94f8e5bbdd685fa0a71279 (patch)
tree63d0e6fa1f93730695aba995df513ed3044f5fef /src/mir_app
parent266bbc5666045ad1db2d070a1cf964279a82a43f (diff)
Import to use faster cursors
Diffstat (limited to 'src/mir_app')
-rw-r--r--src/mir_app/src/MDatabaseCommon.cpp56
1 files changed, 52 insertions, 4 deletions
diff --git a/src/mir_app/src/MDatabaseCommon.cpp b/src/mir_app/src/MDatabaseCommon.cpp
index 787c6609bd..23537f1dc0 100644
--- a/src/mir_app/src/MDatabaseCommon.cpp
+++ b/src/mir_app/src/MDatabaseCommon.cpp
@@ -583,12 +583,60 @@ STDMETHODIMP_(MIDatabaseChecker *) MDatabaseCommon::GetChecker()
/////////////////////////////////////////////////////////////////////////////////////////
// Event cursors
-STDMETHODIMP_(DB::EventCursor *) MDatabaseCommon::EventCursor(MCONTACT, MEVENT)
+class CCompatiblityCursor : public DB::EventCursor
{
- return nullptr;
+ MDatabaseCommon *db;
+ MEVENT curr;
+
+public:
+ CCompatiblityCursor(MDatabaseCommon *pDb, MCONTACT hContact, MEVENT hEvent) :
+ DB::EventCursor(hContact),
+ db(pDb)
+ {
+ curr = (hEvent == 0) ? db->FindFirstEvent(hContact) : db->FindNextEvent(hContact, hEvent);
+ }
+
+ MEVENT FetchNext() override
+ {
+ if (curr == 0)
+ return 0;
+
+ MEVENT ret = curr; curr = db->FindNextEvent(hContact, curr);
+ return ret;
+ }
+};
+
+STDMETHODIMP_(DB::EventCursor*) MDatabaseCommon::EventCursor(MCONTACT hContact, MEVENT hEvent)
+{
+ return new CCompatiblityCursor(this, hContact, hEvent);
}
-STDMETHODIMP_(DB::EventCursor *) MDatabaseCommon::EventCursorRev(MCONTACT, MEVENT)
+/////////////////////////////////////////////////////////////////////////////////////////
+
+class CCompatiblityCursorRev : public DB::EventCursor
{
- return nullptr;
+ MDatabaseCommon *db;
+ MEVENT curr;
+
+public:
+ CCompatiblityCursorRev(MDatabaseCommon *pDb, MCONTACT hContact, MEVENT hEvent) :
+ DB::EventCursor(hContact),
+ db(pDb)
+ {
+ curr = (hEvent == 0) ? db->FindLastEvent(hContact) : db->FindPrevEvent(hContact, hEvent);
+ }
+
+ MEVENT FetchNext() override
+ {
+ if (curr == 0)
+ return 0;
+
+ MEVENT ret = curr; curr = db->FindPrevEvent(hContact, curr);
+ return ret;
+ }
+};
+
+STDMETHODIMP_(DB::EventCursor*) MDatabaseCommon::EventCursorRev(MCONTACT hContact, MEVENT hEvent)
+{
+ return new CCompatiblityCursorRev(this, hContact, hEvent);
}