From 6e78ad97299867e6dd2681f98e19d2e7362562b8 Mon Sep 17 00:00:00 2001 From: Cory McWilliams Date: Tue, 23 Sep 2025 14:40:53 -0400 Subject: [PATCH] ssb: Fix multiple issues with blob wants determination. --- src/ssb.db.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/ssb.db.c b/src/ssb.db.c index 88c0a257..11d840d4 100644 --- a/src/ssb.db.c +++ b/src/ssb.db.c @@ -436,8 +436,11 @@ void tf_ssb_db_init(tf_ssb_t* ssb) _tf_ssb_db_exec(db, "CREATE TRIGGER IF NOT EXISTS messages_ai_blob_wants_cache AFTER INSERT ON messages_refs BEGIN " "INSERT INTO blob_wants_cache (source, id, timestamp) " - "SELECT messages.id, new.ref, messages.timestamp FROM messages WHERE messages.id = new.message AND " - "LENGTH(new.ref) = 52 AND new.ref LIKE '&%.sha256' " + "SELECT messages.id, new.ref, messages.timestamp FROM messages " + "JOIN blobs ON new.ref = blobs.id " + "WHERE messages.id = new.message AND " + "LENGTH(new.ref) = 52 AND new.ref LIKE '&%.sha256' AND " + "blobs.content IS NULL " "ON CONFLICT (source, id) DO NOTHING; END"); _tf_ssb_db_exec(db, "DROP TRIGGER IF EXISTS blobs_refs_ai_blob_wants_cache"); _tf_ssb_db_exec(db, @@ -445,6 +448,8 @@ void tf_ssb_db_init(tf_ssb_t* ssb) "INSERT INTO blob_wants_cache (source, id, timestamp) " "SELECT messages.id, new.ref, messages.timestamp FROM messages " "JOIN blob_wants_cache bwc ON bwc.source = messages.id AND bwc.id = new.blob " + "JOIN blobs ON bwc.id = blobs.id " + "WHERE blobs.content IS NULL " "ON CONFLICT (source, id) DO NOTHING; END"); _tf_ssb_db_exec(db, "CREATE TRIGGER IF NOT EXISTS messages_ad_blob_wants_cache AFTER DELETE ON messages BEGIN " @@ -574,16 +579,15 @@ static int64_t _tf_ssb_db_store_message_raw(sqlite3* db, const char* id, const c return last_row_id; } -static char* _tf_ssb_db_get_message_blob_wants(tf_ssb_t* ssb, int64_t rowid) +static char* _tf_ssb_db_get_message_blob_wants(sqlite3* db, int64_t rowid) { - sqlite3* db = tf_ssb_acquire_db_reader(ssb); sqlite3_stmt* statement; char* result = NULL; size_t size = 0; if (sqlite3_prepare_v2(db, "SELECT DISTINCT json.value FROM messages, json_tree(messages.content) AS json LEFT OUTER JOIN blobs ON json.value = blobs.id WHERE messages.rowid = ?1 AND " - "json.value LIKE '&%.sha256' AND length(json.value) = ?2 AND blobs.content IS NULL", + "length(json.value) = ?2 AND json.value LIKE '&%.sha256' AND blobs.content IS NULL", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_int64(statement, 1, rowid) == SQLITE_OK && sqlite3_bind_int(statement, 2, k_blob_id_len - 1) == SQLITE_OK) @@ -615,7 +619,6 @@ static char* _tf_ssb_db_get_message_blob_wants(tf_ssb_t* ssb, int64_t rowid) result = tf_realloc(result, size + 1); result[size] = '\0'; - tf_ssb_release_db_reader(ssb, db); return result; } @@ -653,7 +656,7 @@ static void _tf_ssb_db_store_message_work(tf_ssb_t* ssb, void* user_data) if (last_row_id != -1) { store->out_stored = true; - store->out_blob_wants = _tf_ssb_db_get_message_blob_wants(ssb, last_row_id); + store->out_blob_wants = _tf_ssb_db_get_message_blob_wants(db, last_row_id); } store = store->next; }