From aeb5c84e9c3a013f0ae12b4a7b2297f6f45dca4c Mon Sep 17 00:00:00 2001 From: George Hazan Date: Thu, 10 Apr 2025 14:03:38 +0300 Subject: Dbx_Sqlite: fix for database checker & unread events --- plugins/Dbx_sqlite/src/dbcheck.cpp | 18 ++++++++++++++++++ plugins/Dbx_sqlite/src/dbevents.cpp | 11 +++++++++-- plugins/Dbx_sqlite/src/dbintf.h | 1 + 3 files changed, 28 insertions(+), 2 deletions(-) (limited to 'plugins/Dbx_sqlite/src') 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 2e75c8e2ea..814e6428c6 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++; @@ -134,6 +135,9 @@ 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) " @@ -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) @@ -293,7 +300,7 @@ BOOL CDbxSQLite::EditEvent(MEVENT hDbEvent, const DBEVENTINFO *dbei) 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); diff --git a/plugins/Dbx_sqlite/src/dbintf.h b/plugins/Dbx_sqlite/src/dbintf.h index ab45361bdf..e14b5dbce3 100644 --- a/plugins/Dbx_sqlite/src/dbintf.h +++ b/plugins/Dbx_sqlite/src/dbintf.h @@ -182,4 +182,5 @@ protected: int CheckPhase2(void); int CheckPhase3(void); int CheckPhase4(void); + int CheckPhase5(void); }; -- cgit v1.2.3