summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2023-01-05 15:24:07 +0300
committerGeorge Hazan <ghazan@miranda.im>2023-01-05 15:24:07 +0300
commitee8c388aef77da6d8a7ea900cfba8661faefb30b (patch)
tree34c11efd99230c499efb4ee5b98b1a89c2186714
parenta9617074481ebc9a35eb241d64997256931c1045 (diff)
new database functions for Telegram
-rw-r--r--include/m_database.h11
-rw-r--r--include/m_db_int.h2
-rw-r--r--libs/win32/mir_app.libbin231450 -> 231796 bytes
-rw-r--r--libs/win32/mir_core.libbin490112 -> 490342 bytes
-rw-r--r--libs/win64/mir_app.libbin227734 -> 228090 bytes
-rw-r--r--libs/win64/mir_core.libbin495312 -> 495524 bytes
-rw-r--r--plugins/Dbx_sqlite/src/dbevents.cpp17
-rw-r--r--plugins/Dbx_sqlite/src/dbintf.h4
-rw-r--r--plugins/Scriver/src/msgs.cpp1
-rw-r--r--src/mir_app/src/MDatabaseReadonly.cpp5
-rw-r--r--src/mir_app/src/mir_app.def1
-rw-r--r--src/mir_app/src/mir_app64.def1
-rw-r--r--src/mir_core/src/db.cpp7
-rw-r--r--src/mir_core/src/mir_core.def1
-rw-r--r--src/mir_core/src/mir_core64.def1
15 files changed, 42 insertions, 9 deletions
diff --git a/include/m_database.h b/include/m_database.h
index d0bc296bd9..fda99b4b2f 100644
--- a/include/m_database.h
+++ b/include/m_database.h
@@ -308,12 +308,6 @@ EXTERN_C MIR_CORE_DLL(MEVENT) db_event_first(MCONTACT hContact);
// Retrieves a handle to the first unread event in the chain for hContact
// Returns the handle, or NULL if hContact is invalid or all its events have been read
-//
-// Events in a chain are sorted chronologically automatically, but this does not
-// necessarily mean that all events after the first unread are unread too. They
-// should be checked individually with db_event_next() and db_event_get()
-// This service is designed for startup, reloading all the events that remained
-// unread from last time
EXTERN_C MIR_CORE_DLL(MEVENT) db_event_firstUnread(MCONTACT hContact);
@@ -374,6 +368,11 @@ EXTERN_C MIR_CORE_DLL(MEVENT) db_event_prev(MCONTACT hContact, MEVENT hDbEvent);
EXTERN_C MIR_CORE_DLL(MEVENT) db_event_getById(const char *szModule, const char *szId);
+// Updates the server ID associated with an event
+// Returns 0 on success or a failure otherwise
+
+EXTERN_C MIR_CORE_DLL(int) db_event_updateId(MEVENT hDbEvent, const char *szId);
+
/////////////////////////////////////////////////////////////////////////////////////////
// Database settings
diff --git a/include/m_db_int.h b/include/m_db_int.h
index 74a1cfc955..2516208764 100644
--- a/include/m_db_int.h
+++ b/include/m_db_int.h
@@ -161,6 +161,7 @@ interface MIR_APP_EXPORT MIDatabase
STDMETHOD_(DATABASELINK*, GetDriver)(void) PURE;
STDMETHOD_(MEVENT, GetEventById)(LPCSTR szModule, LPCSTR szId) PURE;
+ STDMETHOD_(int, UpdateEventId)(MEVENT hDbEvent, const char *szId) PURE;
STDMETHOD_(DB::EventCursor*, EventCursor)(MCONTACT hContact, MEVENT hDbEvent) PURE;
STDMETHOD_(DB::EventCursor*, EventCursorRev)(MCONTACT hContact, MEVENT hDbEvent) PURE;
@@ -302,6 +303,7 @@ public:
////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(MEVENT) GetEventById(LPCSTR szModule, LPCSTR szId) override;
+ STDMETHODIMP_(int) UpdateEventId(MEVENT hDbEvent, const char *szId) override;
};
/////////////////////////////////////////////////////////////////////////////////////////
diff --git a/libs/win32/mir_app.lib b/libs/win32/mir_app.lib
index 2cf2e63174..e31522a34f 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 1b0ef9e871..3e367a7735 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 8d2866d05f..7956729fc1 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 1d6e1d9f2f..df12506f0d 100644
--- a/libs/win64/mir_core.lib
+++ b/libs/win64/mir_core.lib
Binary files differ
diff --git a/plugins/Dbx_sqlite/src/dbevents.cpp b/plugins/Dbx_sqlite/src/dbevents.cpp
index 433cae1852..fa3691a47e 100644
--- a/plugins/Dbx_sqlite/src/dbevents.cpp
+++ b/plugins/Dbx_sqlite/src/dbevents.cpp
@@ -410,7 +410,6 @@ MEVENT CDbxSQLite::FindFirstUnreadEvent(MCONTACT hContact)
sqlite3_stmt *stmt = InitQuery("SELECT id FROM events WHERE contact_id = ? AND is_read = 0 ORDER BY timestamp LIMIT 1;", qEvFindUnread);
sqlite3_bind_int64(stmt, 1, hContact);
- sqlite3_bind_int(stmt, 2, DBEF_READ | DBEF_SENT);
int rc = sqlite3_step(stmt);
logError(rc, __FILE__, __LINE__);
if (rc != SQLITE_ROW) {
@@ -601,6 +600,22 @@ MEVENT CDbxSQLite::GetEventById(LPCSTR szModule, LPCSTR szId)
return hDbEvent;
}
+int CDbxSQLite::UpdateEventId(MEVENT hDbEvent, LPCSTR szId)
+{
+ if (hDbEvent == 0 || mir_strlen(szId) == 0)
+ return 1;
+
+ mir_cslock lock(m_csDbAccess);
+ sqlite3_stmt *stmt = InitQuery("UPDATE events SET server_id = ? WHERE id = ?;", qEvUpdateId);
+ sqlite3_bind_text(stmt, 1, szId, (int)mir_strlen(szId), nullptr);
+ sqlite3_bind_int64(stmt, 2, hDbEvent);
+ int rc = sqlite3_step(stmt);
+ logError(rc, __FILE__, __LINE__);
+ int rows = sqlite3_changes(m_db);
+ sqlite3_reset(stmt);
+ return (rows == 0) ? 2 : 0;
+}
+
/////////////////////////////////////////////////////////////////////////////////////////
// Event cursors
diff --git a/plugins/Dbx_sqlite/src/dbintf.h b/plugins/Dbx_sqlite/src/dbintf.h
index fbeb18b493..e4c274fb3a 100644
--- a/plugins/Dbx_sqlite/src/dbintf.h
+++ b/plugins/Dbx_sqlite/src/dbintf.h
@@ -88,7 +88,8 @@ class CDbxSQLite : public MDatabaseCommon, public MIDatabaseChecker, public MZer
void InitEvents();
void UninitEvents();
CQuery qEvCount, qEvAdd, qEvDel, qEvEdit, qEvBlobSize, qEvGet, qEvGetFlags, qEvSetFlags, qEvGetContact;
- CQuery qEvFindFirst, qEvFindNext, qEvFindLast, qEvFindPrev, qEvFindUnread, qEvGetById, qEvAddSrt, qEvDelSrt, qEvMetaSplit, qEvMetaMerge;
+ CQuery qEvFindFirst, qEvFindNext, qEvFindLast, qEvFindPrev, qEvFindUnread, qEvAddSrt, qEvDelSrt, qEvMetaSplit, qEvMetaMerge;
+ CQuery qEvGetById, qEvUpdateId;
int DeleteEventMain(MEVENT);
int DeleteEventSrt(MEVENT);
@@ -132,6 +133,7 @@ public:
STDMETHODIMP_(MEVENT) FindPrevEvent(MCONTACT contactID, MEVENT hDbEvent) override;
STDMETHODIMP_(MEVENT) GetEventById(LPCSTR szModule, LPCSTR szId) override;
+ STDMETHODIMP_(int) UpdateEventId(MEVENT hDbEvent, LPCSTR szId) override;
STDMETHODIMP_(BOOL) EnumModuleNames(DBMODULEENUMPROC pFunc, void *pParam) override;
diff --git a/plugins/Scriver/src/msgs.cpp b/plugins/Scriver/src/msgs.cpp
index 1bba4511be..ffb08f4e3c 100644
--- a/plugins/Scriver/src/msgs.cpp
+++ b/plugins/Scriver/src/msgs.cpp
@@ -248,7 +248,6 @@ static void RestoreUnreadMessageAlerts(void)
for (auto &hContact : Contacts()) {
for (MEVENT hDbEvent = db_event_firstUnread(hContact); hDbEvent; hDbEvent = db_event_next(hContact, hDbEvent)) {
DBEVENTINFO dbei = {};
- dbei.cbBlob = 0;
if (db_event_get(hDbEvent, &dbei))
continue;
if (dbei.markedRead() || !DbEventIsMessageOrCustom(&dbei) || !Proto_GetBaseAccountName(hContact))
diff --git a/src/mir_app/src/MDatabaseReadonly.cpp b/src/mir_app/src/MDatabaseReadonly.cpp
index f022d5e5fb..c386c4d6f4 100644
--- a/src/mir_app/src/MDatabaseReadonly.cpp
+++ b/src/mir_app/src/MDatabaseReadonly.cpp
@@ -178,3 +178,8 @@ MEVENT MDatabaseReadonly::GetEventById(LPCSTR, LPCSTR)
{
return 0;
}
+
+int MDatabaseReadonly::UpdateEventId(MEVENT, LPCSTR)
+{
+ return 1;
+}
diff --git a/src/mir_app/src/mir_app.def b/src/mir_app/src/mir_app.def
index 37f37cec9d..726bcbc22b 100644
--- a/src/mir_app/src/mir_app.def
+++ b/src/mir_app/src/mir_app.def
@@ -809,3 +809,4 @@ Srmm_CreateHotkey @886 NONAME
?bTopicOnClist@Chat@@3V?$CMOption@_N@@A @910 NONAME
?getBlob@PROTO_INTERFACE@@QAE?AVMBinBuffer@@IPBD@Z @911 NONAME
?getBlob@PROTO_INTERFACE@@QAE?AVMBinBuffer@@PBD@Z @912 NONAME
+?UpdateEventId@MDatabaseReadonly@@UAGHIPBD@Z @913 NONAME
diff --git a/src/mir_app/src/mir_app64.def b/src/mir_app/src/mir_app64.def
index 9f94234c59..5271b8f291 100644
--- a/src/mir_app/src/mir_app64.def
+++ b/src/mir_app/src/mir_app64.def
@@ -809,3 +809,4 @@ Srmm_CreateHotkey @886 NONAME
?bTopicOnClist@Chat@@3V?$CMOption@_N@@A @910 NONAME
?getBlob@PROTO_INTERFACE@@QEAA?AVMBinBuffer@@IPEBD@Z @911 NONAME
?getBlob@PROTO_INTERFACE@@QEAA?AVMBinBuffer@@PEBD@Z @912 NONAME
+?UpdateEventId@MDatabaseReadonly@@UEAAHIPEBD@Z @913 NONAME
diff --git a/src/mir_core/src/db.cpp b/src/mir_core/src/db.cpp
index 362d359f17..5414dac6cb 100644
--- a/src/mir_core/src/db.cpp
+++ b/src/mir_core/src/db.cpp
@@ -458,6 +458,8 @@ MIR_CORE_DLL(MEVENT) db_event_replace(MCONTACT hContact, const DBEVENTINFO *dbei
ret = db_event_getById(dbei->szModule, dbei->szId);
if (!ret)
ret = db_event_add(hContact, dbei);
+ else
+ db_event_edit(hContact, ret, dbei);
return ret;
}
@@ -466,6 +468,11 @@ MIR_CORE_DLL(MEVENT) db_event_getById(const char *szModule, const char *szId)
return (g_pCurrDb == nullptr) ? 0 : g_pCurrDb->GetEventById(szModule, szId);
}
+MIR_CORE_DLL(int) db_event_updateId(MEVENT hDbEvent, const char *szId)
+{
+ return (g_pCurrDb == nullptr) ? 0 : g_pCurrDb->UpdateEventId(hDbEvent, szId);
+}
+
/////////////////////////////////////////////////////////////////////////////////////////
// event cursors
diff --git a/src/mir_core/src/mir_core.def b/src/mir_core/src/mir_core.def
index 09e1804cc4..a2b489708e 100644
--- a/src/mir_core/src/mir_core.def
+++ b/src/mir_core/src/mir_core.def
@@ -1548,3 +1548,4 @@ _Utils_CorrectFontSize@4 @1762 NONAME
?append@MBinBuffer@@QAEXABV1@@Z @1769 NONAME
?appendBefore@MBinBuffer@@QAEXABV1@@Z @1770 NONAME
db_event_replace @1771
+db_event_updateId @1772
diff --git a/src/mir_core/src/mir_core64.def b/src/mir_core/src/mir_core64.def
index 9862559f69..07b98136f8 100644
--- a/src/mir_core/src/mir_core64.def
+++ b/src/mir_core/src/mir_core64.def
@@ -1548,3 +1548,4 @@ Utils_CorrectFontSize @1762 NONAME
?append@MBinBuffer@@QEAAXAEBV1@@Z @1769 NONAME
?appendBefore@MBinBuffer@@QEAAXAEBV1@@Z @1770 NONAME
db_event_replace @1771
+db_event_updateId @1772