summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/m_database.h16
-rw-r--r--libs/win32/mir_app.libbin206224 -> 206130 bytes
-rw-r--r--libs/win32/mir_core.libbin466724 -> 466564 bytes
-rw-r--r--libs/win64/mir_app.libbin201832 -> 201736 bytes
-rw-r--r--libs/win64/mir_core.libbin471634 -> 471474 bytes
-rw-r--r--plugins/Dbx_mdbx/src/dbevents.cpp107
-rw-r--r--plugins/Dbx_mdbx/src/dbintf.h22
-rwxr-xr-xplugins/Dbx_sqlite/src/dbevents.cpp8
-rwxr-xr-xplugins/Dbx_sqlite/src/dbintf.h2
-rw-r--r--src/mir_app/src/mir_app.def4
-rw-r--r--src/mir_app/src/mir_app64.def4
-rw-r--r--src/mir_core/src/db.cpp2
-rw-r--r--src/mir_core/src/mir_core.def16
-rw-r--r--src/mir_core/src/mir_core64.def16
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
--- a/libs/win32/mir_app.lib
+++ b/libs/win32/mir_app.lib
Binary files differ
diff --git a/libs/win32/mir_core.lib b/libs/win32/mir_core.lib
index 87139eb570..d23d29a2a1 100644
--- a/libs/win32/mir_core.lib
+++ b/libs/win32/mir_core.lib
Binary files differ
diff --git a/libs/win64/mir_app.lib b/libs/win64/mir_app.lib
index b065fdad35..c50cd2a11c 100644
--- a/libs/win64/mir_app.lib
+++ b/libs/win64/mir_app.lib
Binary files differ
diff --git a/libs/win64/mir_core.lib b/libs/win64/mir_core.lib
index 431a9e1c01..3231e379b1 100644
--- a/libs/win64/mir_core.lib
+++ b/libs/win64/mir_core.lib
Binary files 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