diff options
Diffstat (limited to 'plugins/Dbx_sqlite')
-rw-r--r-- | plugins/Dbx_sqlite/src/dbcheck.cpp | 18 | ||||
-rw-r--r-- | plugins/Dbx_sqlite/src/dbevents.cpp | 74 | ||||
-rw-r--r-- | plugins/Dbx_sqlite/src/dbintf.cpp | 7 | ||||
-rw-r--r-- | plugins/Dbx_sqlite/src/dbintf.h | 4 | ||||
-rw-r--r-- | plugins/Dbx_sqlite/src/version.h | 2 |
5 files changed, 91 insertions, 14 deletions
diff --git a/plugins/Dbx_sqlite/src/dbcheck.cpp b/plugins/Dbx_sqlite/src/dbcheck.cpp index 661b87f1ff..d6cad456c4 100644 --- a/plugins/Dbx_sqlite/src/dbcheck.cpp +++ b/plugins/Dbx_sqlite/src/dbcheck.cpp @@ -93,6 +93,23 @@ int CDbxSQLite::CheckPhase4() return 0;
}
+/////////////////////////////////////////////////////////////////////////////////////////
+// update unsynced flags & is_read field
+
+int CDbxSQLite::CheckPhase5()
+{
+ sqlite3_stmt *pQuery;
+ int rc = sqlite3_prepare_v2(m_db, "UPDATE events SET flags = flags | 4 WHERE is_read = 1", -1, &pQuery, nullptr);
+ logError(rc, __FILE__, __LINE__);
+ if (rc)
+ return rc;
+
+ rc = sqlite3_step(pQuery);
+ logError(rc, __FILE__, __LINE__);
+ sqlite3_finalize(pQuery);
+ return 0;
+}
+
///////////////////////////////////////////////////////////////////////////////
// MIDatabaseChecker
@@ -103,6 +120,7 @@ int CDbxSQLite::CheckDb(int phase) case 1: return CheckPhase2();
case 2: return CheckPhase3();
case 3: return CheckPhase4();
+ case 4: return CheckPhase5();
}
DBFlush(true);
diff --git a/plugins/Dbx_sqlite/src/dbevents.cpp b/plugins/Dbx_sqlite/src/dbevents.cpp index a376f9e8ca..e3f027afa3 100644 --- a/plugins/Dbx_sqlite/src/dbevents.cpp +++ b/plugins/Dbx_sqlite/src/dbevents.cpp @@ -71,7 +71,8 @@ int CDbxSQLite::AddEventSrt(MEVENT hDbEvent, MCONTACT hContact, int64_t ts) sqlite3_bind_int64(stmt, 2, hContact);
sqlite3_bind_int64(stmt, 3, ts);
rc = sqlite3_step(stmt);
- logError(rc, __FILE__, __LINE__);
+ if (rc != SQLITE_CONSTRAINT)
+ logError(rc, __FILE__, __LINE__);
sqlite3_reset(stmt);
ts++;
@@ -85,7 +86,7 @@ MEVENT CDbxSQLite::AddEvent(MCONTACT hContact, const DBEVENTINFO *dbei) if (dbei == nullptr)
return 0;
- if (dbei->timestamp == 0)
+ if (dbei->iTimestamp == 0)
return 0;
MCONTACT hNotifyContact = hContact;
@@ -100,7 +101,7 @@ MEVENT CDbxSQLite::AddEvent(MCONTACT hContact, const DBEVENTINFO *dbei) return 0;
// set default sub to the event's source
- if (!(dbei->flags & DBEF_SENT))
+ if (!dbei->bSent)
db_mc_setDefault(cc->contactID, hContact, false);
if (db_mc_isEnabled())
hNotifyContact = cc->contactID; // and add an event to a metahistory
@@ -134,19 +135,22 @@ MEVENT CDbxSQLite::AddEvent(MCONTACT hContact, const DBEVENTINFO *dbei) }
}
+ if (tmp.bSent)
+ tmp.bRead = true;
+
mir_cslockfull lock(m_csDbAccess);
sqlite3_stmt *stmt = InitQuery(
"INSERT INTO events(contact_id, module, timestamp, type, flags, data, server_id, user_id, is_read, reply_id) "
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);", qEvAdd);
sqlite3_bind_int64(stmt, 1, hContact);
sqlite3_bind_text(stmt, 2, tmp.szModule, (int)mir_strlen(tmp.szModule), nullptr);
- sqlite3_bind_int64(stmt, 3, tmp.timestamp);
+ sqlite3_bind_int64(stmt, 3, tmp.iTimestamp);
sqlite3_bind_int(stmt, 4, tmp.eventType);
sqlite3_bind_int64(stmt, 5, tmp.flags);
sqlite3_bind_blob(stmt, 6, tmp.pBlob, tmp.cbBlob, nullptr);
sqlite3_bind_text(stmt, 7, tmp.szId, (int)mir_strlen(tmp.szId), nullptr);
sqlite3_bind_text(stmt, 8, tmp.szUserId, (int)mir_strlen(tmp.szUserId), nullptr);
- sqlite3_bind_int(stmt, 9, tmp.markedRead());
+ sqlite3_bind_int(stmt, 9, tmp.bRead);
sqlite3_bind_text(stmt, 10, tmp.szReplyId, (int)mir_strlen(tmp.szReplyId), nullptr);
int rc = sqlite3_step(stmt);
logError(rc, __FILE__, __LINE__);
@@ -154,7 +158,7 @@ MEVENT CDbxSQLite::AddEvent(MCONTACT hContact, const DBEVENTINFO *dbei) MEVENT hDbEvent = sqlite3_last_insert_rowid(m_db);
- int64_t tsSort = (int64_t)tmp.timestamp * 1000;
+ int64_t tsSort = tmp.bMsec ? tmp.iTimestamp : tmp.iTimestamp * 1000;
AddEventSrt(hDbEvent, cc->contactID, tsSort);
cc->m_count++;
@@ -261,7 +265,7 @@ BOOL CDbxSQLite::EditEvent(MEVENT hDbEvent, const DBEVENTINFO *dbei) if (dbei == nullptr)
return 1;
- if (dbei->timestamp == 0)
+ if (dbei->iTimestamp == 0)
return 1;
DBEVENTINFO tmp = *dbei;
@@ -279,6 +283,9 @@ BOOL CDbxSQLite::EditEvent(MEVENT hDbEvent, const DBEVENTINFO *dbei) else tmp.flags |= DBEF_ENCRYPTED;
}
+ if (tmp.bSent)
+ tmp.bRead = true;
+
mir_cslockfull lock(m_csDbAccess);
sqlite3_stmt *stmt;
if (tmp.pBlob)
@@ -288,12 +295,12 @@ BOOL CDbxSQLite::EditEvent(MEVENT hDbEvent, const DBEVENTINFO *dbei) int i = 1;
sqlite3_bind_text(stmt, i++, tmp.szModule, (int)mir_strlen(tmp.szModule), nullptr);
- sqlite3_bind_int64(stmt, i++, tmp.timestamp);
+ sqlite3_bind_int64(stmt, i++, tmp.iTimestamp);
sqlite3_bind_int(stmt, i++, tmp.eventType);
sqlite3_bind_int64(stmt, i++, tmp.flags);
if (tmp.pBlob)
sqlite3_bind_blob(stmt, i++, tmp.pBlob, tmp.cbBlob, nullptr);
- sqlite3_bind_int(stmt, i++, tmp.markedRead());
+ sqlite3_bind_int(stmt, i++, tmp.bRead);
sqlite3_bind_text(stmt, i++, tmp.szId, (int)mir_strlen(tmp.szId), nullptr);
sqlite3_bind_text(stmt, i++, tmp.szUserId, (int)mir_strlen(tmp.szUserId), nullptr);
sqlite3_bind_text(stmt, i++, tmp.szReplyId, (int)mir_strlen(tmp.szReplyId), nullptr);
@@ -323,6 +330,51 @@ BOOL CDbxSQLite::EditEvent(MEVENT hDbEvent, const DBEVENTINFO *dbei) /////////////////////////////////////////////////////////////////////////////////////////
+int CDbxSQLite::SetEventJson(MEVENT hDbEvent, const char *pBlob)
+{
+ size_t cbBlob = mir_strlen(pBlob);
+ int flags = DBEF_JSON;
+
+ mir_ptr<char> pCryptBlob;
+ if (m_bEncrypted) {
+ if (pBlob) {
+ size_t len;
+ char *pResult = (char *)m_crypto->encodeBuffer(pBlob, cbBlob, &len);
+ if (pResult != nullptr) {
+ pBlob = pCryptBlob = pResult;
+ cbBlob = len;
+ flags |= DBEF_ENCRYPTED;
+ }
+ }
+ else flags |= DBEF_ENCRYPTED;
+ }
+
+ {
+ mir_cslock lock(m_csDbAccess);
+ sqlite3_stmt *stmt = InitQuery("UPDATE events SET data=?, flags=flags | ? WHERE id = ?;", qEvSetJson2);
+ sqlite3_bind_text(stmt, 1, pBlob, (int)cbBlob, nullptr);
+ sqlite3_bind_int64(stmt, 2, flags);
+ sqlite3_bind_int64(stmt, 3, hDbEvent);
+ int rc = sqlite3_step(stmt);
+ logError(rc, __FILE__, __LINE__);
+ sqlite3_reset(stmt);
+ }
+
+ DBFlush();
+
+ if (m_safetyMode) {
+ MCONTACT hContact = GetEventContact(hDbEvent);
+ if (auto *cc = m_cache->GetCachedContact(hContact))
+ if (cc->IsSub())
+ hContact = cc->parentID;
+
+ NotifyEventHooks(g_hevEventSetJson, hContact, hDbEvent);
+ }
+ return 0;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
static void str2json(CMStringA &str)
{
str.Replace("\\", "\\\\");
@@ -330,7 +382,7 @@ static void str2json(CMStringA &str) int CDbxSQLite::SetEventJson(MEVENT hDbEvent, const char *szSetting, DBVARIANT *dbv)
{
- if (hDbEvent == 0)
+ if (!hDbEvent || !dbv)
return 1;
CMStringA tmp(FORMAT, "$.%s", szSetting);
@@ -436,7 +488,7 @@ BOOL CDbxSQLite::GetEvent(MEVENT hDbEvent, DBEVENTINFO *dbei) if (dbei->szModule == nullptr)
return 1;
- dbei->timestamp = sqlite3_column_int64(stmt, 1);
+ dbei->iTimestamp = sqlite3_column_int64(stmt, 1);
dbei->eventType = sqlite3_column_int(stmt, 2);
dbei->flags = sqlite3_column_int64(stmt, 3);
dbei->hContact = sqlite3_column_int(stmt, 9);
diff --git a/plugins/Dbx_sqlite/src/dbintf.cpp b/plugins/Dbx_sqlite/src/dbintf.cpp index 048fab793c..6d557f3dce 100644 --- a/plugins/Dbx_sqlite/src/dbintf.cpp +++ b/plugins/Dbx_sqlite/src/dbintf.cpp @@ -29,7 +29,7 @@ CDbxSQLite::~CDbxSQLite() /////////////////////////////////////////////////////////////////////////////////////////
-#define CURRVER 8
+#define CURRVER 9
int CDbxSQLite::Create()
{
@@ -211,6 +211,11 @@ void CDbxSQLite::CheckConversion() logError(rc, __FILE__, __LINE__);
}
+ if (dbv.bVal < 9) {
+ int rc = sqlite3_exec(m_db, "DELETE FROM events WHERE length(data) > 1000000 AND type=1002;", 0, 0, 0);
+ logError(rc, __FILE__, __LINE__);
+ }
+
dbv.bVal = CURRVER;
WriteContactSetting(0, "Compatibility", "Sqlite", &dbv);
diff --git a/plugins/Dbx_sqlite/src/dbintf.h b/plugins/Dbx_sqlite/src/dbintf.h index ab45361bdf..15644ab959 100644 --- a/plugins/Dbx_sqlite/src/dbintf.h +++ b/plugins/Dbx_sqlite/src/dbintf.h @@ -82,7 +82,7 @@ class CDbxSQLite : public MDatabaseCommon, public MIDatabaseChecker, public MZer void UninitEvents();
CQuery qEvAdd, qEvDel, qEvEdit1, qEvEdit2, qEvBlobSize, qEvGet, qEvGetFlags, qEvSetFlags, qEvGetContact, qEvGetContact2;
CQuery qEvFindFirst, qEvFindNext, qEvFindLast, qEvFindPrev, qEvFindUnread, qEvAddSrt, qEvDelSrt, qEvDelSrt2, qEvMetaSplit, qEvMetaMerge;
- CQuery qEvGetById, qEvUpdateId, qEvSetJson;
+ CQuery qEvGetById, qEvUpdateId, qEvSetJson, qEvSetJson2;
int AddEventSrt(MEVENT, MCONTACT, int64_t ts);
int DeleteEventMain(MEVENT);
int DeleteEventSrt(MCONTACT, int64_t ts);
@@ -119,6 +119,7 @@ public: STDMETHODIMP_(BOOL) DeleteEvent(MEVENT hDbEvent) override;
STDMETHODIMP_(BOOL) EditEvent(MEVENT hDbEvent, const DBEVENTINFO *dbe) override;
STDMETHODIMP_(int) SetEventJson(MEVENT hDbEvent, const char *szSetting, DBVARIANT *dbv) override;
+ STDMETHODIMP_(int) SetEventJson(MEVENT hDbEvent, const char *pBlob) override;
STDMETHODIMP_(int) GetBlobSize(MEVENT hDbEvent) override;
STDMETHODIMP_(BOOL) GetEvent(MEVENT hDbEvent, DBEVENTINFO *dbe) override;
STDMETHODIMP_(BOOL) MarkEventRead(MCONTACT contactID, MEVENT hDbEvent) override;
@@ -182,4 +183,5 @@ protected: int CheckPhase2(void);
int CheckPhase3(void);
int CheckPhase4(void);
+ int CheckPhase5(void);
};
diff --git a/plugins/Dbx_sqlite/src/version.h b/plugins/Dbx_sqlite/src/version.h index 77a3172b6f..14f8fc4da3 100644 --- a/plugins/Dbx_sqlite/src/version.h +++ b/plugins/Dbx_sqlite/src/version.h @@ -10,4 +10,4 @@ #define __DESCRIPTION "Provides Miranda database support: global settings, contacts, history, settings per contact."
#define __AUTHOR "Miranda-NG project"
#define __AUTHORWEB "https://miranda-ng.org/p/Dbx_sqlite"
-#define __COPYRIGHT "© 2018-24 Miranda NG team"
+#define __COPYRIGHT "© 2018-25 Miranda NG team"
|