From 92926fa8df124c022905195518066ebba109c0d4 Mon Sep 17 00:00:00 2001 From: Cory McWilliams Date: Wed, 21 May 2025 22:05:33 -0400 Subject: [PATCH] ssb: Chasing intermittent SQLITE_ERROR with multiple processes accessing the database. Switching to sqlite3_prepare_v2 for better errors, but maybe this is also the solution? --- src/database.js.c | 16 +++---- src/main.c | 2 +- src/ssb.c | 12 ++++- src/ssb.connections.c | 10 ++--- src/ssb.db.c | 102 +++++++++++++++++++++--------------------- src/ssb.export.c | 2 +- src/ssb.import.c | 6 +-- src/ssb.js.c | 6 +-- src/ssb.rpc.c | 10 ++--- 9 files changed, 87 insertions(+), 79 deletions(-) diff --git a/src/database.js.c b/src/database.js.c index 1c67bb5a..0db84471 100644 --- a/src/database.js.c +++ b/src/database.js.c @@ -107,7 +107,7 @@ static void _database_get_work(tf_ssb_t* ssb, void* user_data) database_get_t* work = user_data; sqlite3_stmt* statement; sqlite3* db = tf_ssb_acquire_db_reader(ssb); - if (sqlite3_prepare(db, "SELECT value FROM properties WHERE id = ? AND key = ?", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT value FROM properties WHERE id = ? AND key = ?", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, work->id, -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 2, work->key, work->key_length, NULL) == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW) @@ -185,7 +185,7 @@ static void _database_set_work(tf_ssb_t* ssb, void* user_data) database_set_t* work = user_data; sqlite3* db = tf_ssb_acquire_db_writer(ssb); sqlite3_stmt* statement; - if (sqlite3_prepare(db, "INSERT OR REPLACE INTO properties (id, key, value) VALUES (?1, ?2, ?3)", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "INSERT OR REPLACE INTO properties (id, key, value) VALUES (?1, ?2, ?3)", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, work->id, -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 2, work->key, work->key_length, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 3, work->value, work->value_length, NULL) == SQLITE_OK && sqlite3_step(statement) == SQLITE_DONE) @@ -265,7 +265,7 @@ static void _database_exchange_work(tf_ssb_t* ssb, void* user_data) sqlite3_stmt* statement; if (!work->expected) { - if (sqlite3_prepare(db, "INSERT INTO properties (id, key, value) VALUES (?1, ?2, ?3) ON CONFLICT DO NOTHING", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "INSERT INTO properties (id, key, value) VALUES (?1, ?2, ?3) ON CONFLICT DO NOTHING", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, work->id, -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 2, work->key, work->key_length, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 3, work->value, work->value_length, NULL) == SQLITE_OK && sqlite3_step(statement) == SQLITE_DONE) @@ -275,7 +275,7 @@ static void _database_exchange_work(tf_ssb_t* ssb, void* user_data) sqlite3_finalize(statement); } } - else if (sqlite3_prepare(db, "UPDATE properties SET value = ?1 WHERE id = ?2 AND key = ?3 AND value = ?4", -1, &statement, NULL) == SQLITE_OK) + else if (sqlite3_prepare_v2(db, "UPDATE properties SET value = ?1 WHERE id = ?2 AND key = ?3 AND value = ?4", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, work->value, work->value_length, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 2, work->id, -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 3, work->key, work->key_length, NULL) == SQLITE_OK && @@ -339,7 +339,7 @@ static void _database_remove_work(tf_ssb_t* ssb, void* user_data) database_remove_t* work = user_data; sqlite3_stmt* statement; sqlite3* db = tf_ssb_acquire_db_writer(ssb); - if (sqlite3_prepare(db, "DELETE FROM properties WHERE id = ?1 AND key = ?2", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "DELETE FROM properties WHERE id = ?1 AND key = ?2", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, work->id, -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 2, work->key, work->key_length, NULL) == SQLITE_OK && sqlite3_step(statement) == SQLITE_OK) @@ -401,7 +401,7 @@ static void _database_get_all_work(tf_ssb_t* ssb, void* user_data) database_get_all_t* work = user_data; sqlite3_stmt* statement; sqlite3* db = tf_ssb_acquire_db_reader(ssb); - if (sqlite3_prepare(db, "SELECT key FROM properties WHERE id = ?", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT key FROM properties WHERE id = ?", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, work->id, -1, NULL) == SQLITE_OK) { @@ -487,7 +487,7 @@ static void _database_get_like_work(tf_ssb_t* ssb, void* user_data) database_get_like_t* work = user_data; sqlite3_stmt* statement; sqlite3* db = tf_ssb_acquire_db_reader(ssb); - if (sqlite3_prepare(db, "SELECT key, value FROM properties WHERE id = ? AND KEY LIKE ?", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT key, value FROM properties WHERE id = ? AND KEY LIKE ?", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, work->id, -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 2, work->pattern, -1, NULL) == SQLITE_OK) { @@ -566,7 +566,7 @@ static void _databases_list_work(tf_ssb_t* ssb, void* user_data) databases_list_t* work = user_data; sqlite3* db = tf_ssb_acquire_db_reader(ssb); sqlite3_stmt* statement; - if (sqlite3_prepare(db, "SELECT DISTINCT id FROM properties WHERE id LIKE ?", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT DISTINCT id FROM properties WHERE id LIKE ?", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, work->pattern, -1, NULL) == SQLITE_OK) { diff --git a/src/main.c b/src/main.c index ad08a0cc..e0dc10e2 100644 --- a/src/main.c +++ b/src/main.c @@ -1255,7 +1255,7 @@ static int _tf_command_verify(const char* file, int argc, char* argv[]) { sqlite3* db = tf_ssb_acquire_db_reader(ssb); sqlite3_stmt* statement = NULL; - if (sqlite3_prepare(db, "SELECT DISTINCT author FROM messages ORDER BY author", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT DISTINCT author FROM messages ORDER BY author", -1, &statement, NULL) == SQLITE_OK) { verified = true; while (sqlite3_step(statement) == SQLITE_ROW) diff --git a/src/ssb.c b/src/ssb.c index aa05a5a1..2e41a9a7 100644 --- a/src/ssb.c +++ b/src/ssb.c @@ -2834,7 +2834,11 @@ void tf_ssb_destroy(tf_ssb_t* ssb) } if (ssb->db_writer) { - sqlite3_close(ssb->db_writer); + int r = sqlite3_close(ssb->db_writer); + if (r != SQLITE_OK) + { + tf_printf("sqlite3_close: %s\n", sqlite3_errstr(r)); + } ssb->db_writer = NULL; } while (ssb->broadcasts) @@ -2846,7 +2850,11 @@ void tf_ssb_destroy(tf_ssb_t* ssb) } for (int i = 0; i < ssb->db_readers_count; i++) { - sqlite3_close(ssb->db_readers[i]); + int r = sqlite3_close(ssb->db_readers[i]); + if (r != SQLITE_OK) + { + tf_printf("sqlite3_close: %s\n", sqlite3_errstr(r)); + } } ssb->db_readers_count = 0; if (ssb->db_readers) diff --git a/src/ssb.connections.c b/src/ssb.connections.c index d1ada42b..466d4940 100644 --- a/src/ssb.connections.c +++ b/src/ssb.connections.c @@ -56,7 +56,7 @@ static bool _tf_ssb_connections_get_next_connection(tf_ssb_connections_t* connec bool result = false; sqlite3_stmt* statement; sqlite3* db = tf_ssb_acquire_db_reader(connections->ssb); - if (sqlite3_prepare(db, "SELECT host, port, key FROM connections WHERE last_attempt IS NULL OR (strftime('%s', 'now') - last_attempt > ?1) ORDER BY last_attempt LIMIT 1", -1, + if (sqlite3_prepare_v2(db, "SELECT host, port, key FROM connections WHERE last_attempt IS NULL OR (strftime('%s', 'now') - last_attempt > ?1) ORDER BY last_attempt LIMIT 1", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_int(statement, 1, 60000) == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW) @@ -178,7 +178,7 @@ static void _tf_ssb_connections_update_work(tf_ssb_t* ssb, void* user_data) sqlite3* db = tf_ssb_acquire_db_writer(ssb); if (update->attempted) { - if (sqlite3_prepare(db, "UPDATE connections SET last_attempt = strftime('%s', 'now') WHERE host = ?1 AND port = ?2 AND key = ?3", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "UPDATE connections SET last_attempt = strftime('%s', 'now') WHERE host = ?1 AND port = ?2 AND key = ?3", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, update->host, -1, NULL) == SQLITE_OK && sqlite3_bind_int(statement, 2, update->port) == SQLITE_OK && sqlite3_bind_text(statement, 3, update->key, -1, NULL) == SQLITE_OK) @@ -194,7 +194,7 @@ static void _tf_ssb_connections_update_work(tf_ssb_t* ssb, void* user_data) } else if (update->succeeded) { - if (sqlite3_prepare(db, "UPDATE connections SET last_success = strftime('%s', 'now') WHERE host = ?1 AND port = ?2 AND key = ?3", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "UPDATE connections SET last_success = strftime('%s', 'now') WHERE host = ?1 AND port = ?2 AND key = ?3", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, update->host, -1, NULL) == SQLITE_OK && sqlite3_bind_int(statement, 2, update->port) == SQLITE_OK && sqlite3_bind_text(statement, 3, update->key, -1, NULL) == SQLITE_OK) @@ -210,7 +210,7 @@ static void _tf_ssb_connections_update_work(tf_ssb_t* ssb, void* user_data) } else { - if (sqlite3_prepare(db, "INSERT INTO connections (host, port, key) VALUES (?1, ?2, ?3) ON CONFLICT DO NOTHING", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "INSERT INTO connections (host, port, key) VALUES (?1, ?2, ?3) ON CONFLICT DO NOTHING", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, update->host, -1, NULL) == SQLITE_OK && sqlite3_bind_int(statement, 2, update->port) == SQLITE_OK && sqlite3_bind_text(statement, 3, update->key, -1, NULL) == SQLITE_OK) @@ -308,7 +308,7 @@ static void _tf_ssb_connections_get_all_work(tf_ssb_t* ssb, void* user_data) tf_ssb_connections_get_all_work_t* work = user_data; sqlite3_stmt* statement; sqlite3* db = tf_ssb_acquire_db_reader(ssb); - if (sqlite3_prepare(db, "SELECT host, port, key FROM connections ORDER BY last_attempt", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT host, port, key FROM connections ORDER BY last_attempt", -1, &statement, NULL) == SQLITE_OK) { while (sqlite3_step(statement) == SQLITE_ROW) { diff --git a/src/ssb.db.c b/src/ssb.db.c index 08dd41fc..723a54fd 100644 --- a/src/ssb.db.c +++ b/src/ssb.db.c @@ -49,7 +49,7 @@ static bool _tf_ssb_db_has_rows(sqlite3* db, const char* query) { bool found = false; sqlite3_stmt* statement = NULL; - if (sqlite3_prepare(db, query, -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, query, -1, &statement, NULL) == SQLITE_OK) { int result = SQLITE_OK; while ((result = sqlite3_step(statement)) == SQLITE_ROW) @@ -96,7 +96,7 @@ void tf_ssb_db_init(tf_ssb_t* ssb) sqlite3_stmt* statement = NULL; int auto_vacuum = 0; - if (sqlite3_prepare(db, "PRAGMA auto_vacuum", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "PRAGMA auto_vacuum", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_step(statement) == SQLITE_ROW) { @@ -415,7 +415,7 @@ void tf_ssb_db_init(tf_ssb_t* ssb) bool need_add_flags = true; bool need_convert_timestamp_to_real = false; - if (sqlite3_prepare(db, "PRAGMA table_info(messages)", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "PRAGMA table_info(messages)", -1, &statement, NULL) == SQLITE_OK) { int result = SQLITE_OK; while ((result = sqlite3_step(statement)) == SQLITE_ROW) @@ -464,7 +464,7 @@ static bool _tf_ssb_db_previous_message_exists(sqlite3* db, const char* author, else { sqlite3_stmt* statement; - if (sqlite3_prepare(db, "SELECT COUNT(*), id != ?3 AS is_mismatch FROM messages WHERE author = ?1 AND sequence = ?2", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT COUNT(*), id != ?3 AS is_mismatch FROM messages WHERE author = ?1 AND sequence = ?2", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, author, -1, NULL) == SQLITE_OK && sqlite3_bind_int64(statement, 2, sequence - 1) == SQLITE_OK && sqlite3_bind_text(statement, 3, previous, -1, NULL) == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW) @@ -489,7 +489,7 @@ static int64_t _tf_ssb_db_store_message_raw(sqlite3* db, const char* id, const c const char* query = "INSERT INTO messages (id, previous, author, sequence, timestamp, content, hash, signature, flags) VALUES (?, ?, ?, ?, ?, jsonb(?), " "?, ?, ?) ON CONFLICT DO NOTHING"; sqlite3_stmt* statement; - if (sqlite3_prepare(db, query, -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, query, -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, id, -1, NULL) == SQLITE_OK && (previous ? sqlite3_bind_text(statement, 2, previous, -1, NULL) : sqlite3_bind_null(statement, 2)) == SQLITE_OK && @@ -539,7 +539,7 @@ static char* _tf_ssb_db_get_message_blob_wants(tf_ssb_t* ssb, int64_t rowid) char* result = NULL; size_t size = 0; - if (sqlite3_prepare(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 " "json.value LIKE '&%%.sha256' AND length(json.value) = ?2 AND blobs.content IS NULL", -1, &statement, NULL) == SQLITE_OK) @@ -776,7 +776,7 @@ bool tf_ssb_db_message_content_get(tf_ssb_t* ssb, const char* id, uint8_t** out_ sqlite3_stmt* statement; sqlite3* db = tf_ssb_acquire_db_reader(ssb); const char* query = "SELECT json(content) FROM messages WHERE id = ?"; - if (sqlite3_prepare(db, query, -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, query, -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, id, -1, NULL) == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW) { @@ -805,7 +805,7 @@ bool tf_ssb_db_blob_has(sqlite3* db, const char* id) bool result = false; sqlite3_stmt* statement; const char* query = "SELECT COUNT(*) FROM blobs WHERE id = ?1"; - if (sqlite3_prepare(db, query, -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, query, -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, id, -1, NULL) == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW) { @@ -822,7 +822,7 @@ bool tf_ssb_db_blob_get(tf_ssb_t* ssb, const char* id, uint8_t** out_blob, size_ sqlite3_stmt* statement; sqlite3* db = tf_ssb_acquire_db_reader(ssb); const char* query = "SELECT content FROM blobs WHERE id = ?1"; - if (sqlite3_prepare(db, query, -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, query, -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, id, -1, NULL) == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW) { @@ -852,7 +852,7 @@ bool tf_ssb_db_blob_get(tf_ssb_t* ssb, const char* id, uint8_t** out_blob, size_ void tf_ssb_db_add_blob_wants(sqlite3* db, const char* id) { sqlite3_stmt* statement; - if (sqlite3_prepare(db, "INSERT OR REPLACE INTO blob_wants_cache (id, timestamp) VALUES (?, unixepoch() * 1000) ON CONFLICT DO UPDATE SET timestamp = excluded.timestamp", -1, + if (sqlite3_prepare_v2(db, "INSERT OR REPLACE INTO blob_wants_cache (id, timestamp) VALUES (?, unixepoch() * 1000) ON CONFLICT DO UPDATE SET timestamp = excluded.timestamp", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, id, -1, NULL) == SQLITE_OK) @@ -978,7 +978,7 @@ bool tf_ssb_db_blob_store(tf_ssb_t* ssb, const uint8_t* blob, size_t size, char* sqlite3* db = tf_ssb_acquire_db_writer(ssb); sqlite3_stmt* statement; - if (sqlite3_prepare(db, "INSERT INTO blobs (id, content, created) VALUES (?1, ?2, CAST(strftime('%s') AS INTEGER)) ON CONFLICT DO NOTHING", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "INSERT INTO blobs (id, content, created) VALUES (?1, ?2, CAST(strftime('%s') AS INTEGER)) ON CONFLICT DO NOTHING", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, id, -1, NULL) == SQLITE_OK && sqlite3_bind_blob(statement, 2, blob, size, NULL) == SQLITE_OK) { @@ -1020,7 +1020,7 @@ bool tf_ssb_db_get_message_by_author_and_sequence(tf_ssb_t* ssb, const char* aut sqlite3_stmt* statement; const char* query = "SELECT id, previous, timestamp, json(content), hash, signature, flags FROM messages WHERE author = ?1 AND sequence = ?2"; sqlite3* db = tf_ssb_acquire_db_reader(ssb); - if (sqlite3_prepare(db, query, -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, query, -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, author, -1, NULL) == SQLITE_OK && sqlite3_bind_int64(statement, 2, sequence) == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW) { @@ -1083,7 +1083,7 @@ bool tf_ssb_db_get_latest_message_by_author(tf_ssb_t* ssb, const char* author, i if (out_message_id) { const char* query = "SELECT id, sequence FROM messages WHERE author = ?1 ORDER BY sequence DESC LIMIT 1"; - if (sqlite3_prepare(db, query, -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, query, -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, author, -1, NULL) == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW) { @@ -1107,7 +1107,7 @@ bool tf_ssb_db_get_latest_message_by_author(tf_ssb_t* ssb, const char* author, i else { const char* query = "SELECT max_sequence FROM messages_stats WHERE author = ?1"; - if (sqlite3_prepare(db, query, -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, query, -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, author, -1, NULL) == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW) { @@ -1256,7 +1256,7 @@ JSValue tf_ssb_db_visit_query(tf_ssb_t* ssb, const char* query, const JSValue bi sqlite3* db = tf_ssb_acquire_db_reader_restricted(ssb); JSContext* context = tf_ssb_get_context(ssb); sqlite3_stmt* statement; - if (sqlite3_prepare(db, query, -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, query, -1, &statement, NULL) == SQLITE_OK) { JSValue bind_result = _tf_ssb_sqlite_bind_json(context, db, statement, binds); if (JS_IsUndefined(bind_result)) @@ -1317,7 +1317,7 @@ int tf_ssb_db_identity_get_count_for_user(tf_ssb_t* ssb, const char* user) int count = 0; sqlite3* db = tf_ssb_acquire_db_reader(ssb); sqlite3_stmt* statement = NULL; - if (sqlite3_prepare(db, "SELECT COUNT(*) FROM identities WHERE user = ?", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT COUNT(*) FROM identities WHERE user = ?", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, user, -1, NULL) == SQLITE_OK) { @@ -1363,7 +1363,7 @@ bool tf_ssb_db_identity_add(tf_ssb_t* ssb, const char* user, const char* public_ bool added = false; sqlite3* db = tf_ssb_acquire_db_writer(ssb); sqlite3_stmt* statement = NULL; - if (sqlite3_prepare(db, "INSERT INTO identities (user, public_key, private_key) VALUES (?, ?, ?) ON CONFLICT DO NOTHING", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "INSERT INTO identities (user, public_key, private_key) VALUES (?, ?, ?) ON CONFLICT DO NOTHING", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, user, -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 2, public_key, -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 3, private_key, -1, NULL) == SQLITE_OK) @@ -1386,7 +1386,7 @@ bool tf_ssb_db_identity_delete(tf_ssb_t* ssb, const char* user, const char* publ sqlite3* db = tf_ssb_acquire_db_writer(ssb); sqlite3_stmt* statement = NULL; tf_printf("deleting [%s] [%s]\n", user, public_key); - if (sqlite3_prepare(db, "DELETE FROM identities WHERE user = ? AND public_key = ?", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "DELETE FROM identities WHERE user = ? AND public_key = ?", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, user, -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 2, public_key, -1, NULL) == SQLITE_OK) { @@ -1406,7 +1406,7 @@ void tf_ssb_db_identity_visit(tf_ssb_t* ssb, const char* user, void (*callback)( { sqlite3* db = tf_ssb_acquire_db_reader(ssb); sqlite3_stmt* statement = NULL; - if (sqlite3_prepare(db, "SELECT public_key FROM identities WHERE user = ? ORDER BY public_key", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT public_key FROM identities WHERE user = ? ORDER BY public_key", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, user, -1, NULL) == SQLITE_OK) { @@ -1424,7 +1424,7 @@ void tf_ssb_db_identity_visit_all(tf_ssb_t* ssb, void (*callback)(const char* id { sqlite3* db = tf_ssb_acquire_db_reader(ssb); sqlite3_stmt* statement = NULL; - if (sqlite3_prepare(db, "SELECT public_key FROM identities ORDER BY public_key", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT public_key FROM identities ORDER BY public_key", -1, &statement, NULL) == SQLITE_OK) { while (sqlite3_step(statement) == SQLITE_ROW) { @@ -1440,7 +1440,7 @@ const char* tf_ssb_db_get_user_for_identity(tf_ssb_t* ssb, const char* public_ke const char* result = NULL; sqlite3* db = tf_ssb_acquire_db_reader(ssb); sqlite3_stmt* statement = NULL; - if (sqlite3_prepare(db, "SELECT user FROM identities WHERE public_key = ?", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT user FROM identities WHERE public_key = ?", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, (public_key && *public_key == '@') ? public_key + 1 : public_key, -1, NULL) == SQLITE_OK) { @@ -1472,7 +1472,7 @@ bool tf_ssb_db_identity_get_private_key(tf_ssb_t* ssb, const char* user, const c } sqlite3* db = tf_ssb_acquire_db_reader(ssb); sqlite3_stmt* statement = NULL; - if (sqlite3_prepare(db, "SELECT private_key FROM identities WHERE user = ? AND public_key = ?", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT private_key FROM identities WHERE user = ? AND public_key = ?", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, user, -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 2, (public_key && *public_key == '@') ? public_key + 1 : public_key, -1, NULL) == SQLITE_OK) @@ -1699,7 +1699,7 @@ static sqlite3_stmt* _make_following_statement(sqlite3* db) { sqlite3_stmt* statement = NULL; - if (sqlite3_prepare(db, + if (sqlite3_prepare_v2(db, "SELECT content ->> '$.contact' AS contact, content ->> '$.following', content ->> '$.blocking' " "FROM messages " "WHERE author = ? AND content ->> '$.type' = 'contact' AND contact IS NOT NULL " @@ -1849,7 +1849,7 @@ JSValue tf_ssb_db_get_message_by_id(tf_ssb_t* ssb, const char* id, bool is_keys) JSContext* context = tf_ssb_get_context(ssb); sqlite3* db = tf_ssb_acquire_db_reader(ssb); sqlite3_stmt* statement; - if (sqlite3_prepare(db, "SELECT previous, author, id, sequence, timestamp, hash, json(content), signature, flags FROM messages WHERE id = ?", -1, &statement, NULL) == + if (sqlite3_prepare_v2(db, "SELECT previous, author, id, sequence, timestamp, hash, json(content), signature, flags FROM messages WHERE id = ?", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, id, -1, NULL) == SQLITE_OK) @@ -1887,7 +1887,7 @@ tf_ssb_db_stored_connection_t* tf_ssb_db_get_stored_connections(tf_ssb_t* ssb, i int count = 0; sqlite3_stmt* statement; - if (sqlite3_prepare(db, "SELECT host, port, key FROM connections ORDER BY host, port, key", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT host, port, key FROM connections ORDER BY host, port, key", -1, &statement, NULL) == SQLITE_OK) { while (sqlite3_step(statement) == SQLITE_ROW) { @@ -1911,7 +1911,7 @@ void tf_ssb_db_forget_stored_connection(tf_ssb_t* ssb, const char* address, int { sqlite3* db = tf_ssb_acquire_db_writer(ssb); sqlite3_stmt* statement; - if (sqlite3_prepare(db, "DELETE FROM connections WHERE host = ? AND port = ? AND key = ?", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "DELETE FROM connections WHERE host = ? AND port = ? AND key = ?", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, address, -1, NULL) != SQLITE_OK || sqlite3_bind_int(statement, 2, port) != SQLITE_OK || sqlite3_bind_text(statement, 3, pubkey, -1, NULL) != SQLITE_OK || sqlite3_step(statement) != SQLITE_DONE) @@ -1928,7 +1928,7 @@ bool tf_ssb_db_get_account_password_hash(tf_ssb_t* ssb, const char* name, char* bool result = false; sqlite3* db = tf_ssb_acquire_db_reader(ssb); sqlite3_stmt* statement = NULL; - if (sqlite3_prepare(db, "SELECT value ->> '$.password' FROM properties WHERE id = 'auth' AND key = 'user:' || ?", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT value ->> '$.password' FROM properties WHERE id = 'auth' AND key = 'user:' || ?", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, name, -1, NULL) == SQLITE_OK) { @@ -1963,7 +1963,7 @@ bool tf_ssb_db_set_account_password(uv_loop_t* loop, sqlite3* db, JSContext* con const char* user_string = JS_ToCStringLen(context, &user_length, user_json); sqlite3_stmt* statement = NULL; - if (sqlite3_prepare(db, "INSERT OR REPLACE INTO properties (id, key, value) VALUES ('auth', 'user:' || ?, ?)", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "INSERT OR REPLACE INTO properties (id, key, value) VALUES ('auth', 'user:' || ?, ?)", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, name, -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 2, user_string, user_length, NULL) == SQLITE_OK) { @@ -1988,7 +1988,7 @@ bool tf_ssb_db_register_account(uv_loop_t* loop, sqlite3* db, JSContext* context if (registration_allowed) { sqlite3_stmt* statement = NULL; - if (sqlite3_prepare(db, "SELECT value FROM properties WHERE id = 'auth' AND key = 'users'", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT value FROM properties WHERE id = 'auth' AND key = 'users'", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_step(statement) == SQLITE_ROW) { @@ -2007,7 +2007,7 @@ bool tf_ssb_db_register_account(uv_loop_t* loop, sqlite3* db, JSContext* context JS_FreeValue(context, users_array); size_t value_length = 0; const char* value = JS_ToCStringLen(context, &value_length, json); - if (sqlite3_prepare(db, "INSERT OR REPLACE INTO properties (id, key, value) VALUES ('auth', 'users', ?)", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "INSERT OR REPLACE INTO properties (id, key, value) VALUES ('auth', 'users', ?)", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, value, value_length, NULL) == SQLITE_OK) { @@ -2028,7 +2028,7 @@ const char* tf_ssb_db_get_property(tf_ssb_t* ssb, const char* id, const char* ke char* result = NULL; sqlite3* db = tf_ssb_acquire_db_reader(ssb); sqlite3_stmt* statement = NULL; - if (sqlite3_prepare(db, "SELECT value FROM properties WHERE id = ? AND key = ?", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT value FROM properties WHERE id = ? AND key = ?", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, id, -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 2, key, -1, NULL) == SQLITE_OK) { @@ -2051,7 +2051,7 @@ bool tf_ssb_db_set_property(tf_ssb_t* ssb, const char* id, const char* key, cons bool result = false; sqlite3* db = tf_ssb_acquire_db_writer(ssb); sqlite3_stmt* statement = NULL; - if (sqlite3_prepare(db, "INSERT OR REPLACE INTO properties (id, key, value) VALUES (?, ?, ?)", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "INSERT OR REPLACE INTO properties (id, key, value) VALUES (?, ?, ?)", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, id, -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 2, key, -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 3, value, -1, NULL) == SQLITE_OK) @@ -2069,7 +2069,7 @@ bool tf_ssb_db_remove_property(tf_ssb_t* ssb, const char* id, const char* key) bool result = false; sqlite3* db = tf_ssb_acquire_db_writer(ssb); sqlite3_stmt* statement = NULL; - if (sqlite3_prepare(db, "DELETE FROM properties WHERE id = ? AND key = ?", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "DELETE FROM properties WHERE id = ? AND key = ?", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, id, -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 2, key, -1, NULL) == SQLITE_OK) { @@ -2086,7 +2086,7 @@ bool tf_ssb_db_remove_value_from_array_property(tf_ssb_t* ssb, const char* id, c bool result = false; sqlite3* db = tf_ssb_acquire_db_writer(ssb); sqlite3_stmt* statement = NULL; - if (sqlite3_prepare(db, + if (sqlite3_prepare_v2(db, "UPDATE properties SET value = json_remove(properties.value, entry.fullkey) FROM json_each(properties.value) AS entry WHERE properties.id = ? AND properties.key = ? " "AND entry.value = ?", -1, &statement, NULL) == SQLITE_OK) @@ -2107,7 +2107,7 @@ bool tf_ssb_db_add_value_to_array_property(tf_ssb_t* ssb, const char* id, const bool result = false; sqlite3* db = tf_ssb_acquire_db_writer(ssb); sqlite3_stmt* statement = NULL; - if (sqlite3_prepare(db, + if (sqlite3_prepare_v2(db, "INSERT INTO properties (id, key, value) VALUES (?1, ?2, json_array(?3)) ON CONFLICT DO UPDATE SET value = json_insert(properties.value, '$[#]', ?3) WHERE " "properties.id = ?1 AND properties.key = ?2 AND NOT EXISTS (SELECT 1 FROM json_each(properties.value) AS entry WHERE entry.value = ?3)", -1, &statement, NULL) == SQLITE_OK) @@ -2127,7 +2127,7 @@ bool tf_ssb_db_identity_get_active(sqlite3* db, const char* user, const char* pa { sqlite3_stmt* statement = NULL; bool found = false; - if (sqlite3_prepare(db, "SELECT value FROM properties WHERE id = ? AND key = 'id:' || ? || ':' || ?", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT value FROM properties WHERE id = ? AND key = 'id:' || ? || ':' || ?", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, user, -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 2, package_owner, -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 3, package_name, -1, NULL) == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW) @@ -2154,7 +2154,7 @@ static void _tf_ssb_db_resolve_index_work(tf_ssb_t* ssb, void* user_data) sqlite3* db = tf_ssb_acquire_db_reader(ssb); sqlite3_stmt* statement; - if (sqlite3_prepare(db, "SELECT json_extract(value, '$.index_map') FROM properties WHERE id = 'core' AND key = 'settings'", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT json_extract(value, '$.index_map') FROM properties WHERE id = 'core' AND key = 'settings'", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_step(statement) == SQLITE_ROW) { @@ -2185,7 +2185,7 @@ static void _tf_ssb_db_resolve_index_work(tf_ssb_t* ssb, void* user_data) if (!request->path) { - if (sqlite3_prepare(db, "SELECT json_extract(value, '$.index') FROM properties WHERE id = 'core' AND key = 'settings'", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT json_extract(value, '$.index') FROM properties WHERE id = 'core' AND key = 'settings'", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_step(statement) == SQLITE_ROW) { @@ -2230,7 +2230,7 @@ static void _tf_ssb_db_set_flags(tf_ssb_t* ssb, const char* message_id, int flag { sqlite3* db = tf_ssb_acquire_db_writer(ssb); sqlite3_stmt* statement = NULL; - if (sqlite3_prepare(db, "UPDATE messages SET flags = ? WHERE id = ?", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "UPDATE messages SET flags = ? WHERE id = ?", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_int(statement, 1, flags) == SQLITE_OK && sqlite3_bind_text(statement, 2, message_id, -1, NULL) == SQLITE_OK) { @@ -2319,7 +2319,7 @@ bool tf_ssb_db_user_has_permission(tf_ssb_t* ssb, sqlite3* db, const char* id, c bool has_permission = false; sqlite3* reader = db ? db : tf_ssb_acquire_db_reader(ssb); sqlite3_stmt* statement = NULL; - if (sqlite3_prepare(reader, + if (sqlite3_prepare_v2(reader, "SELECT COUNT(*) FROM properties, json_each(properties.value -> 'permissions' -> ?) AS permission WHERE properties.id = 'core' AND properties.key = 'settings' AND " "permission.value = ?", -1, &statement, NULL) == SQLITE_OK) @@ -2342,7 +2342,7 @@ bool tf_ssb_db_get_global_setting_bool(sqlite3* db, const char* name, bool* out_ { bool result = false; sqlite3_stmt* statement; - if (sqlite3_prepare(db, "SELECT json_extract(value, '$.' || ?) FROM properties WHERE id = 'core' AND key = 'settings'", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT json_extract(value, '$.' || ?) FROM properties WHERE id = 'core' AND key = 'settings'", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, name, -1, NULL) == SQLITE_OK) { @@ -2369,7 +2369,7 @@ bool tf_ssb_db_get_global_setting_int64(sqlite3* db, const char* name, int64_t* { bool result = false; sqlite3_stmt* statement; - if (sqlite3_prepare(db, "SELECT json_extract(value, '$.' || ?) FROM properties WHERE id = 'core' AND key = 'settings'", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT json_extract(value, '$.' || ?) FROM properties WHERE id = 'core' AND key = 'settings'", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, name, -1, NULL) == SQLITE_OK) { @@ -2396,7 +2396,7 @@ bool tf_ssb_db_get_global_setting_string(sqlite3* db, const char* name, char* ou { bool result = false; sqlite3_stmt* statement; - if (sqlite3_prepare(db, "SELECT json_extract(value, '$.' || ?) FROM properties WHERE id = 'core' AND key = 'settings'", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT json_extract(value, '$.' || ?) FROM properties WHERE id = 'core' AND key = 'settings'", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, name, -1, NULL) == SQLITE_OK) { @@ -2429,7 +2429,7 @@ bool tf_ssb_db_set_global_setting_from_string(sqlite3* db, const char* name, cha bool result = false; sqlite3_stmt* statement; - if (sqlite3_prepare(db, + if (sqlite3_prepare_v2(db, "INSERT INTO properties (id, key, value) VALUES ('core', 'settings', json_object(?1, ?2)) ON CONFLICT DO UPDATE SET value = json_set(value, '$.' || ?1, ?2)", -1, &statement, NULL) == SQLITE_OK) { @@ -2468,7 +2468,7 @@ const char* tf_ssb_db_get_profile(sqlite3* db, const char* id) { const char* result = NULL; sqlite3_stmt* statement; - if (sqlite3_prepare(db, + if (sqlite3_prepare_v2(db, "SELECT json(json_group_object(key, value)) FROM (SELECT fields.key, RANK() OVER (PARTITION BY fields.key ORDER BY messages.sequence DESC) AS rank, fields.value FROM " "messages, json_each(messages.content) AS fields WHERE messages.author = ? AND messages.content ->> '$.type' = 'about' AND messages.content ->> '$.about' = " "messages.author AND NOT fields.key IN ('about', 'type')) WHERE rank = 1", @@ -2494,7 +2494,7 @@ const char* tf_ssb_db_get_profile_name(sqlite3* db, const char* id) { const char* result = NULL; sqlite3_stmt* statement; - if (sqlite3_prepare(db, + if (sqlite3_prepare_v2(db, "SELECT name FROM (SELECT messages.author, RANK() OVER (PARTITION BY messages.author ORDER BY messages.sequence DESC) AS author_rank, " "messages.content ->> 'name' AS name FROM messages WHERE messages.author = ? " "AND messages.content ->> '$.type' = 'about' AND content ->> 'about' = messages.author AND name IS NOT NULL) " @@ -2520,7 +2520,7 @@ const char* tf_ssb_db_get_profile_name(sqlite3* db, const char* id) static void _tf_ssb_db_invite_cleanup(sqlite3* db) { sqlite3_stmt* statement; - if (sqlite3_prepare(db, "DELETE FROM invites WHERE use_count = 0 OR (expires > 0 AND expires < ?)", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "DELETE FROM invites WHERE use_count = 0 OR (expires > 0 AND expires < ?)", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_int64(statement, 1, (int64_t)time(NULL)) == SQLITE_OK) { @@ -2572,7 +2572,7 @@ bool tf_ssb_db_generate_invite(sqlite3* db, const char* id, const char* host, in bool inserted = false; sqlite3_stmt* statement; - if (sqlite3_prepare(db, "INSERT INTO invites (invite_public_key, account, use_count, expires) VALUES (?, ?, ?, ?)", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "INSERT INTO invites (invite_public_key, account, use_count, expires) VALUES (?, ?, ?, ?)", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, public, -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 2, id, -1, NULL) == SQLITE_OK && sqlite3_bind_int(statement, 3, use_count) == SQLITE_OK && @@ -2593,7 +2593,7 @@ bool tf_ssb_db_use_invite(sqlite3* db, const char* id) { bool used = false; sqlite3_stmt* statement; - if (sqlite3_prepare(db, "UPDATE invites SET use_count = use_count - 1 WHERE invite_public_key = ? AND (expires < 0 OR expires >= ?) AND (use_count > 0 OR use_count = -1)", -1, + if (sqlite3_prepare_v2(db, "UPDATE invites SET use_count = use_count - 1 WHERE invite_public_key = ? AND (expires < 0 OR expires >= ?) AND (use_count > 0 OR use_count = -1)", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, id, -1, NULL) == SQLITE_OK && sqlite3_bind_int64(statement, 2, (int64_t)time(NULL)) == SQLITE_OK) @@ -2612,7 +2612,7 @@ bool tf_ssb_db_has_invite(sqlite3* db, const char* id) { bool has = false; sqlite3_stmt* statement; - if (sqlite3_prepare(db, "SELECT COUNT(*) FROM invites WHERE invite_public_key = ? AND (expires < 0 OR expires >= ?) AND (use_count > 0 OR use_count = -1)", -1, &statement, + if (sqlite3_prepare_v2(db, "SELECT COUNT(*) FROM invites WHERE invite_public_key = ? AND (expires < 0 OR expires >= ?) AND (use_count > 0 OR use_count = -1)", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, id, -1, NULL) == SQLITE_OK && sqlite3_bind_int64(statement, 2, (int64_t)time(NULL)) == SQLITE_OK) @@ -2653,7 +2653,7 @@ tf_ssb_identity_info_t* tf_ssb_db_get_identity_info(tf_ssb_t* ssb, const char* u sqlite3* db = tf_ssb_acquire_db_reader(ssb); sqlite3_stmt* statement = NULL; - int result = sqlite3_prepare(db, + int result = sqlite3_prepare_v2(db, "SELECT author, name FROM ( " " SELECT " " messages.author, " diff --git a/src/ssb.export.c b/src/ssb.export.c index 0a8df7e8..a63e749c 100644 --- a/src/ssb.export.c +++ b/src/ssb.export.c @@ -94,7 +94,7 @@ void tf_ssb_export(tf_ssb_t* ssb, const char* key) sqlite3* db = tf_ssb_acquire_db_reader(ssb); sqlite3_busy_timeout(db, 10000); sqlite3_stmt* statement; - if (sqlite3_prepare(db, "SELECT value FROM properties WHERE id = ?1 AND key = 'path:' || ?2", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT value FROM properties WHERE id = ?1 AND key = 'path:' || ?2", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, user, -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 2, path, -1, NULL) == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW) { diff --git a/src/ssb.import.c b/src/ssb.import.c index 61bb77cb..53907ac7 100644 --- a/src/ssb.import.c +++ b/src/ssb.import.c @@ -21,7 +21,7 @@ static void _tf_ssb_import_add_app(tf_ssb_t* ssb, const char* user, const char* JSContext* context = tf_ssb_get_context(ssb); JSValue apps = JS_UNDEFINED; sqlite3* db = tf_ssb_acquire_db_writer(ssb); - if (sqlite3_prepare(db, "SELECT value FROM properties WHERE id = ?1 AND key = 'apps'", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT value FROM properties WHERE id = ?1 AND key = 'apps'", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, user, -1, NULL) == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW) { @@ -68,7 +68,7 @@ static void _tf_ssb_import_add_app(tf_ssb_t* ssb, const char* user, const char* JSValue json = JS_JSONStringify(context, out_apps, JS_NULL, JS_NULL); const char* text = JS_ToCString(context, json); - if (sqlite3_prepare(db, "INSERT OR REPLACE INTO properties (id, key, value) VALUES (?1, 'apps', ?2)", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "INSERT OR REPLACE INTO properties (id, key, value) VALUES (?1, 'apps', ?2)", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, user, -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 2, text, -1, NULL) == SQLITE_OK && sqlite3_step(statement) == SQLITE_OK) { @@ -165,7 +165,7 @@ static bool _tf_ssb_register_app(tf_ssb_t* ssb, const char* user, const char* ap bool result = false; sqlite3_stmt* statement; sqlite3* db = tf_ssb_acquire_db_writer(ssb); - if (sqlite3_prepare(db, "INSERT INTO properties (id, key, value) VALUES (?1, 'path:' || ?2, ?3) ON CONFLICT DO UPDATE SET value = excluded.value WHERE value != excluded.value", + if (sqlite3_prepare_v2(db, "INSERT INTO properties (id, key, value) VALUES (?1, 'path:' || ?2, ?3) ON CONFLICT DO UPDATE SET value = excluded.value WHERE value != excluded.value", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, user, -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 2, app, -1, NULL) == SQLITE_OK && diff --git a/src/ssb.js.c b/src/ssb.js.c index 461dfe91..f72fba79 100644 --- a/src/ssb.js.c +++ b/src/ssb.js.c @@ -271,7 +271,7 @@ static void _tf_ssb_swap_with_server_identity_work(tf_ssb_t* ssb, void* user_dat if (sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, &error) == SQLITE_OK) { sqlite3_stmt* statement = NULL; - if (sqlite3_prepare(db, "UPDATE identities SET user = ? WHERE user = ? AND '@' || public_key = ?", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "UPDATE identities SET user = ? WHERE user = ? AND '@' || public_key = ?", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, work->user, -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 2, ":admin", -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 3, work->server_id, -1, NULL) == SQLITE_OK && sqlite3_step(statement) == SQLITE_DONE && sqlite3_changes(db) == 1 && @@ -1071,7 +1071,7 @@ static void _tf_ssb_sqlAsync_work(tf_ssb_t* ssb, void* user_data) uv_mutex_unlock(&sql_work->lock); uv_async_send(&sql_work->async); sqlite3_stmt* statement = NULL; - sql_work->result = sqlite3_prepare(db, sql_work->query, -1, &statement, NULL); + sql_work->result = sqlite3_prepare_v2(db, sql_work->query, -1, &statement, NULL); if (sql_work->result == SQLITE_OK) { const uint8_t* p = sql_work->binds; @@ -1805,7 +1805,7 @@ static bool _tf_ssb_get_private_key_curve25519_internal(sqlite3* db, const char* bool success = false; sqlite3_stmt* statement = NULL; - if (sqlite3_prepare(db, "SELECT private_key FROM identities WHERE user = ? AND public_key = ?", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT private_key FROM identities WHERE user = ? AND public_key = ?", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, user, -1, NULL) == SQLITE_OK && sqlite3_bind_text(statement, 2, *identity == '@' ? identity + 1 : identity, -1, NULL) == SQLITE_OK) { diff --git a/src/ssb.rpc.c b/src/ssb.rpc.c index 00c9639e..ce6c1c5d 100644 --- a/src/ssb.rpc.c +++ b/src/ssb.rpc.c @@ -232,7 +232,7 @@ static void _tf_ssb_request_blob_wants_work(tf_ssb_connection_t* connection, voi db = tf_ssb_acquire_db_reader(ssb); sqlite3_stmt* statement; - if (sqlite3_prepare(db, "SELECT id FROM blob_wants_cache WHERE id > ? AND timestamp > ? ORDER BY id LIMIT ?", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "SELECT id FROM blob_wants_cache WHERE id > ? AND timestamp > ? ORDER BY id LIMIT ?", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_text(statement, 1, blob_wants->last_id, -1, NULL) == SQLITE_OK && sqlite3_bind_int64(statement, 2, timestamp) == SQLITE_OK && sqlite3_bind_int(statement, 3, tf_countof(work->out_id)) == SQLITE_OK) @@ -884,7 +884,7 @@ static void _tf_ssb_connection_send_history_stream_work(tf_ssb_connection_t* con sqlite3* db = tf_ssb_acquire_db_reader(ssb); sqlite3_stmt* statement; const int k_max = 32; - if (sqlite3_prepare(db, + if (sqlite3_prepare_v2(db, "SELECT previous, author, id, sequence, timestamp, hash, json(content), signature, flags FROM messages WHERE author = ?1 AND sequence > ?2 AND " "sequence < ?3 ORDER BY sequence", -1, &statement, NULL) == SQLITE_OK) @@ -1505,7 +1505,7 @@ static void _tf_ssb_rpc_delete_blobs_work(tf_ssb_t* ssb, void* user_data) int64_t timestamp = now - age * 1000ULL; const int k_limit = 128; int deleted = 0; - if (sqlite3_prepare(db, "DELETE FROM blob_wants_cache WHERE source IS NULL and timestamp < ?1", -1, &statement, NULL) == SQLITE_OK) + if (sqlite3_prepare_v2(db, "DELETE FROM blob_wants_cache WHERE source IS NULL and timestamp < ?1", -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_bind_int64(statement, 1, timestamp) == SQLITE_OK) { @@ -1516,7 +1516,7 @@ static void _tf_ssb_rpc_delete_blobs_work(tf_ssb_t* ssb, void* user_data) } sqlite3_finalize(statement); } - if (sqlite3_prepare(db, + if (sqlite3_prepare_v2(db, "DELETE FROM blobs WHERE blobs.id IN (" " SELECT blobs.id FROM blobs " " JOIN messages_refs ON blobs.id = messages_refs.ref " @@ -1604,7 +1604,7 @@ static void _tf_ssb_rpc_delete_feeds_work(tf_ssb_t* ssb, void* user_data) db = tf_ssb_acquire_db_writer(ssb); sqlite3_stmt* statement; - if (sqlite3_prepare(db, + if (sqlite3_prepare_v2(db, "DELETE FROM messages WHERE id IN (" " SELECT id FROM messages WHERE author NOT IN (SELECT value FROM json_each(?)) ORDER BY rowid DESC LIMIT 1024" ")",