Reset only dependent group history state when adopting editable format

This commit is contained in:
evgeny committed 2026-10-26 22:46:08 +01:00
1 parent 0a75a53ed9
commit 82ef6f282f
1 file changed
+23 -7
+23 -7
View File
@@ -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;