ssb: Fix multiple issues with blob wants determination.
This commit is contained in:
17
src/ssb.db.c
17
src/ssb.db.c
@@ -436,8 +436,11 @@ void tf_ssb_db_init(tf_ssb_t* ssb)
|
|||||||
_tf_ssb_db_exec(db,
|
_tf_ssb_db_exec(db,
|
||||||
"CREATE TRIGGER IF NOT EXISTS messages_ai_blob_wants_cache AFTER INSERT ON messages_refs BEGIN "
|
"CREATE TRIGGER IF NOT EXISTS messages_ai_blob_wants_cache AFTER INSERT ON messages_refs BEGIN "
|
||||||
"INSERT INTO blob_wants_cache (source, id, timestamp) "
|
"INSERT INTO blob_wants_cache (source, id, timestamp) "
|
||||||
"SELECT messages.id, new.ref, messages.timestamp FROM messages WHERE messages.id = new.message AND "
|
"SELECT messages.id, new.ref, messages.timestamp FROM messages "
|
||||||
"LENGTH(new.ref) = 52 AND new.ref LIKE '&%.sha256' "
|
"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");
|
"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, "DROP TRIGGER IF EXISTS blobs_refs_ai_blob_wants_cache");
|
||||||
_tf_ssb_db_exec(db,
|
_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) "
|
"INSERT INTO blob_wants_cache (source, id, timestamp) "
|
||||||
"SELECT messages.id, new.ref, messages.timestamp FROM messages "
|
"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 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");
|
"ON CONFLICT (source, id) DO NOTHING; END");
|
||||||
_tf_ssb_db_exec(db,
|
_tf_ssb_db_exec(db,
|
||||||
"CREATE TRIGGER IF NOT EXISTS messages_ad_blob_wants_cache AFTER DELETE ON messages BEGIN "
|
"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;
|
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;
|
sqlite3_stmt* statement;
|
||||||
char* result = NULL;
|
char* result = NULL;
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
|
|
||||||
if (sqlite3_prepare_v2(db,
|
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 "
|
"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)
|
-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)
|
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 = tf_realloc(result, size + 1);
|
||||||
result[size] = '\0';
|
result[size] = '\0';
|
||||||
|
|
||||||
tf_ssb_release_db_reader(ssb, db);
|
|
||||||
return result;
|
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)
|
if (last_row_id != -1)
|
||||||
{
|
{
|
||||||
store->out_stored = true;
|
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;
|
store = store->next;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user