From 82ef6f282f68a2581bae049cb5dfb39cef69717a Mon Sep 17 00:00:00 2001 From: evgeny Date: Mon, 26 Oct 2026 22:46:08 +0100 Subject: [PATCH] Reset only dependent group history state when adopting editable format --- src/chat/db_sync.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/chat/db_sync.c b/src/chat/db_sync.c index 26466a3d..10e1441d 100644 --- a/src/chat/db_sync.c +++ b/src/chat/db_sync.c @@ -319,16 +319,32 @@ static int si_table_init(struct DB_SYNC_INSTANCE* si) { snprintf(sql, sizeof(sql), "DELETE FROM \"feedback_%s\"", si->ns); if (sqlite3_exec(db, sql, NULL, NULL, NULL) != SQLITE_OK) goto rollback; } - if (sqlite3_prepare_v2(db, "DELETE FROM merkle_tree_hash WHERE namespace IN (?1,?2)", -1, &st, NULL) != SQLITE_OK) - goto rollback; char messages[25], feedback[25]; snprintf(messages, sizeof(messages), "%u:%s", MT_DATA_MESSAGES, si->ns); snprintf(feedback, sizeof(feedback), "%u:%s", MT_DATA_FEEDBACK, si->ns); - rc = sqlite3_bind_text(st, 1, messages, -1, SQLITE_STATIC); - if (rc == SQLITE_OK) rc = sqlite3_bind_text(st, 2, feedback, -1, SQLITE_STATIC); - if (rc == SQLITE_OK) rc = sqlite3_step(st); - final_rc = sqlite3_finalize(st); st = NULL; - if (rc != SQLITE_DONE || final_rc != SQLITE_OK || sqlite3_exec(db, "COMMIT", NULL, NULL, NULL) != SQLITE_OK) goto rollback; + const char* dependencies[] = {"merkle_tree_hash", "attachment_keys", "attachment_key_requests", "attachment_key_outbox", "channels", "ui_state"}; + const char* cleanup[] = { + "DELETE FROM merkle_tree_hash WHERE namespace IN (?1,?2)", + "DELETE FROM attachment_keys WHERE channel=?1", "DELETE FROM attachment_key_requests WHERE channel=?1", + "DELETE FROM attachment_key_outbox WHERE channel=?1", + "UPDATE channels SET last_msg_at=0,last_read_msg_id=0,last_pos_msg_id=0 WHERE channel_id=?1", + "DELETE FROM ui_state WHERE key IN ('ch_'||?1||'_last_read','ch_'||?1||'_last_pos')" + }; + for (unsigned i = 0; i < sizeof(dependencies) / sizeof(dependencies[0]); i++) { + if (sqlite3_prepare_v2(db, "SELECT 1 FROM sqlite_master WHERE type='table' AND name=?", -1, &st, NULL) != SQLITE_OK) goto rollback; + rc = sqlite3_bind_text(st, 1, dependencies[i], -1, SQLITE_STATIC); + if (rc == SQLITE_OK) rc = sqlite3_step(st); + final_rc = sqlite3_finalize(st); st = NULL; + if ((rc != SQLITE_ROW && rc != SQLITE_DONE) || final_rc != SQLITE_OK) goto rollback; + if (rc == SQLITE_DONE) continue; + if (sqlite3_prepare_v2(db, cleanup[i], -1, &st, NULL) != SQLITE_OK) goto rollback; + rc = sqlite3_bind_text(st, 1, i ? si->ns : messages, -1, SQLITE_STATIC); + if (rc == SQLITE_OK && !i) rc = sqlite3_bind_text(st, 2, feedback, -1, SQLITE_STATIC); + if (rc == SQLITE_OK) rc = sqlite3_step(st); + final_rc = sqlite3_finalize(st); st = NULL; + if (rc != SQLITE_DONE || final_rc != SQLITE_OK) goto rollback; + } + if (sqlite3_exec(db, "COMMIT", NULL, NULL, NULL) != SQLITE_OK) goto rollback; DEBUG_INFO(DEBUG_CATEGORY_CHAT_SYNC, "history format v2: reset old group history and feedback tbl=%s group=%s", SI_TBL(si), si->ns); return 0;