diff options
author | George Hazan <ghazan@miranda.im> | 2021-01-08 21:39:50 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2021-01-08 21:39:56 +0300 |
commit | 2bf9d8e3bc1e51e28a94f8e5bbdd685fa0a71279 (patch) | |
tree | 63d0e6fa1f93730695aba995df513ed3044f5fef /src/mir_app | |
parent | 266bbc5666045ad1db2d070a1cf964279a82a43f (diff) |
Import to use faster cursors
Diffstat (limited to 'src/mir_app')
-rw-r--r-- | src/mir_app/src/MDatabaseCommon.cpp | 56 |
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); } |