diff --git a/db/exec.c b/db/exec.c index b791be16cf29..21b9beef36b3 100644 --- a/db/exec.c +++ b/db/exec.c @@ -25,7 +25,7 @@ int db_get_version(struct db *db) * table that doesn't exist yet, so we need to terminate and restart * the DB transaction. */ - if (!db_query_prepared(stmt)) { + if (!db_query_prepared_canfail(stmt)) { db_commit_transaction(stmt->db); db_begin_transaction(stmt->db); tal_free(stmt); @@ -45,7 +45,7 @@ u32 db_data_version_get(struct db *db) u32 version; stmt = db_prepare_v2(db, SQL("SELECT intval FROM vars WHERE name = 'data_version'")); /* postgres will act upset if the table doesn't exist yet. */ - if (!db_query_prepared(stmt)) { + if (!db_query_prepared_canfail(stmt)) { tal_free(stmt); return 0; } @@ -58,14 +58,13 @@ u32 db_data_version_get(struct db *db) return version; } -void db_set_intvar(struct db *db, char *varname, s64 val) +void db_set_intvar(struct db *db, const char *varname, s64 val) { size_t changes; struct db_stmt *stmt = db_prepare_v2(db, SQL("UPDATE vars SET intval=? WHERE name=?;")); db_bind_int(stmt, 0, val); db_bind_text(stmt, 1, varname); - if (!db_exec_prepared_v2(stmt)) - db_fatal("Error executing update: %s", stmt->error); + db_exec_prepared_v2(stmt); changes = db_count_changes(stmt); tal_free(stmt); @@ -73,19 +72,18 @@ void db_set_intvar(struct db *db, char *varname, s64 val) stmt = db_prepare_v2(db, SQL("INSERT INTO vars (name, intval) VALUES (?, ?);")); db_bind_text(stmt, 0, varname); db_bind_int(stmt, 1, val); - if (!db_exec_prepared_v2(stmt)) - db_fatal("Error executing insert: %s", stmt->error); + db_exec_prepared_v2(stmt); tal_free(stmt); } } -s64 db_get_intvar(struct db *db, char *varname, s64 defval) +s64 db_get_intvar(struct db *db, const char *varname, s64 defval) { s64 res = defval; struct db_stmt *stmt = db_prepare_v2( db, SQL("SELECT intval FROM vars WHERE name= ? LIMIT 1")); db_bind_text(stmt, 0, varname); - if (db_query_prepared(stmt) && db_step(stmt)) + if (db_query_prepared_canfail(stmt) && db_step(stmt)) res = db_col_int(stmt, "intval"); tal_free(stmt); diff --git a/db/exec.h b/db/exec.h index 70799532a55a..e592042d925c 100644 --- a/db/exec.h +++ b/db/exec.h @@ -13,7 +13,7 @@ struct db; * Utility function to store generic integer values in the * database. */ -void db_set_intvar(struct db *db, char *varname, s64 val); +void db_set_intvar(struct db *db, const char *varname, s64 val); /** * db_get_intvar - Retrieve an integer variable from the database @@ -21,7 +21,7 @@ void db_set_intvar(struct db *db, char *varname, s64 val); * Either returns the value in the database, or @defval if * the query failed or no such variable exists. */ -s64 db_get_intvar(struct db *db, char *varname, s64 defval); +s64 db_get_intvar(struct db *db, const char *varname, s64 defval); /* Get the current data version (entries). */ u32 db_data_version_get(struct db *db); diff --git a/db/utils.c b/db/utils.c index 106aae834905..52e209fa41d2 100644 --- a/db/utils.c +++ b/db/utils.c @@ -135,7 +135,7 @@ struct db_stmt *db_prepare_untranslated(struct db *db, const char *query) return stmt; } -bool db_query_prepared(struct db_stmt *stmt) +bool db_query_prepared_canfail(struct db_stmt *stmt) { /* Make sure we don't accidentally execute a modifying query using a * read-only path. */ @@ -147,6 +147,13 @@ bool db_query_prepared(struct db_stmt *stmt) return ret; } +void db_query_prepared(struct db_stmt *stmt) +{ + if (!db_query_prepared_canfail(stmt)) + db_fatal("query failed: %s: %s", + stmt->location, stmt->query->query); +} + bool db_step(struct db_stmt *stmt) { bool ret; @@ -164,7 +171,7 @@ bool db_step(struct db_stmt *stmt) return ret; } -bool db_exec_prepared_v2(struct db_stmt *stmt TAKES) +void db_exec_prepared_v2(struct db_stmt *stmt TAKES) { bool ret = stmt->db->config->exec_fn(stmt); @@ -184,8 +191,6 @@ bool db_exec_prepared_v2(struct db_stmt *stmt TAKES) if (taken(stmt)) tal_free(stmt); - - return ret; } size_t db_count_changes(struct db_stmt *stmt) diff --git a/db/utils.h b/db/utils.h index e0c1f97f337d..8793d5c09953 100644 --- a/db/utils.h +++ b/db/utils.h @@ -34,7 +34,7 @@ bool db_step(struct db_stmt *stmt); * * @stmt: The prepared statement to execute */ -bool db_exec_prepared_v2(struct db_stmt *stmt TAKES); +void db_exec_prepared_v2(struct db_stmt *stmt TAKES); /** * db_query_prepared -- Execute a prepared query @@ -49,7 +49,12 @@ bool db_exec_prepared_v2(struct db_stmt *stmt TAKES); * * @stmt: The prepared statement to execute */ -bool db_query_prepared(struct db_stmt *stmt); +void db_query_prepared(struct db_stmt *stmt); + +/** + * Variation which allows failure. + */ +bool db_query_prepared_canfail(struct db_stmt *stmt); size_t db_count_changes(struct db_stmt *stmt); void db_report_changes(struct db *db, const char *final, size_t min); diff --git a/gossipd/test/run-check_channel_announcement.c b/gossipd/test/run-check_channel_announcement.c index 5b25af4b04a1..bd3cf97dcf2a 100644 --- a/gossipd/test/run-check_channel_announcement.c +++ b/gossipd/test/run-check_channel_announcement.c @@ -86,14 +86,6 @@ const u8 *gossip_store_get_private_update(const tal_t *ctx UNNEEDED, void gossip_store_mark_channel_deleted(struct gossip_store *gs UNNEEDED, const struct short_channel_id *scid UNNEEDED) { fprintf(stderr, "gossip_store_mark_channel_deleted called!\n"); abort(); } -/* Generated stub for gossip_store_mark_channel_zombie */ -void gossip_store_mark_channel_zombie(struct gossip_store *gs UNNEEDED, - struct broadcastable *bcast UNNEEDED) -{ fprintf(stderr, "gossip_store_mark_channel_zombie called!\n"); abort(); } -/* Generated stub for gossip_store_mark_cupdate_zombie */ -void gossip_store_mark_cupdate_zombie(struct gossip_store *gs UNNEEDED, - struct broadcastable *bcast UNNEEDED) -{ fprintf(stderr, "gossip_store_mark_cupdate_zombie called!\n"); abort(); } /* Generated stub for gossip_store_new */ struct gossip_store *gossip_store_new(struct routing_state *rstate UNNEEDED, struct list_head *peers UNNEEDED) diff --git a/gossipd/test/run-txout_failure.c b/gossipd/test/run-txout_failure.c index 90e01bd4cbac..5db4ef8f3c0f 100644 --- a/gossipd/test/run-txout_failure.c +++ b/gossipd/test/run-txout_failure.c @@ -57,14 +57,6 @@ const u8 *gossip_store_get_private_update(const tal_t *ctx UNNEEDED, void gossip_store_mark_channel_deleted(struct gossip_store *gs UNNEEDED, const struct short_channel_id *scid UNNEEDED) { fprintf(stderr, "gossip_store_mark_channel_deleted called!\n"); abort(); } -/* Generated stub for gossip_store_mark_channel_zombie */ -void gossip_store_mark_channel_zombie(struct gossip_store *gs UNNEEDED, - struct broadcastable *bcast UNNEEDED) -{ fprintf(stderr, "gossip_store_mark_channel_zombie called!\n"); abort(); } -/* Generated stub for gossip_store_mark_cupdate_zombie */ -void gossip_store_mark_cupdate_zombie(struct gossip_store *gs UNNEEDED, - struct broadcastable *bcast UNNEEDED) -{ fprintf(stderr, "gossip_store_mark_cupdate_zombie called!\n"); abort(); } /* Generated stub for memleak_add_helper_ */ void memleak_add_helper_(const tal_t *p UNNEEDED, void (*cb)(struct htable *memtable UNNEEDED, const tal_t *)){ } diff --git a/lightningd/test/run-find_my_abspath.c b/lightningd/test/run-find_my_abspath.c index c09bd01280cc..bd59df06edfd 100644 --- a/lightningd/test/run-find_my_abspath.c +++ b/lightningd/test/run-find_my_abspath.c @@ -41,7 +41,7 @@ void db_begin_transaction_(struct db *db UNNEEDED, const char *location UNNEEDED void db_commit_transaction(struct db *db UNNEEDED) { fprintf(stderr, "db_commit_transaction called!\n"); abort(); } /* Generated stub for db_get_intvar */ -s64 db_get_intvar(struct db *db UNNEEDED, char *varname UNNEEDED, s64 defval UNNEEDED) +s64 db_get_intvar(struct db *db UNNEEDED, const char *varname UNNEEDED, s64 defval UNNEEDED) { fprintf(stderr, "db_get_intvar called!\n"); abort(); } /* Generated stub for db_in_transaction */ bool db_in_transaction(struct db *db UNNEEDED) diff --git a/lightningd/test/run-invoice-select-inchan.c b/lightningd/test/run-invoice-select-inchan.c index 76f5e6e392e3..b3658571809d 100644 --- a/lightningd/test/run-invoice-select-inchan.c +++ b/lightningd/test/run-invoice-select-inchan.c @@ -14,8 +14,7 @@ struct channel *any_channel_by_scid(struct lightningd *ld UNNEEDED, bool privacy_leak_ok UNNEEDED) { fprintf(stderr, "any_channel_by_scid called!\n"); abort(); } /* Generated stub for bip32_pubkey */ -void bip32_pubkey(struct lightningd *ld UNNEEDED, - struct pubkey *pubkey UNNEEDED, u32 index UNNEEDED) +void bip32_pubkey(struct lightningd *ld UNNEEDED, struct pubkey *pubkey UNNEEDED, u32 index UNNEEDED) { fprintf(stderr, "bip32_pubkey called!\n"); abort(); } /* Generated stub for bitcoind_getutxout_ */ void bitcoind_getutxout_(struct bitcoind *bitcoind UNNEEDED, diff --git a/plugins/bkpr/recorder.c b/plugins/bkpr/recorder.c index 0d8ab5b4742f..a3561b02b381 100644 --- a/plugins/bkpr/recorder.c +++ b/plugins/bkpr/recorder.c @@ -342,7 +342,7 @@ struct fee_sum **find_account_onchain_fees(const tal_t *ctx, ", CAST(SUM(debit) AS BIGINT) as debit" " FROM onchain_fees" " WHERE account_id = ?" - " GROUP BY txid" + " GROUP BY txid, update_count" " ORDER BY txid, update_count")); db_bind_u64(stmt, 0, acct->db_id); diff --git a/wallet/test/run-db.c b/wallet/test/run-db.c index e6c0987e9805..0cfab066f72f 100644 --- a/wallet/test/run-db.c +++ b/wallet/test/run-db.c @@ -127,16 +127,10 @@ static bool test_primitives(void) db_begin_transaction(db); stmt = db_prepare_v2(db, SQL("SELECT name FROM sqlite_master WHERE type='table';")); - CHECK_MSG(db_exec_prepared_v2(stmt), "db_exec_prepared must succeed"); + db_exec_prepared_v2(stmt); CHECK_MSG(!db_err, "Simple correct SQL command"); tal_free(stmt); - stmt = db_prepare_v2(db, SQL("not a valid SQL statement")); - CHECK_MSG(!db_exec_prepared_v2(stmt), "db_exec_prepared must fail"); - CHECK_MSG(db_err, "Failing SQL command"); - tal_free(stmt); - db_err = tal_free(db_err); - /* We didn't migrate the DB, so don't have the vars table. Pretend we * didn't change anything so we don't bump the data_version. */ db->dirty = false; @@ -184,12 +178,12 @@ static bool test_manip_columns(void) " id BIGSERIAL" ", field1 INTEGER" ", PRIMARY KEY (id))")); - CHECK_MSG(db_exec_prepared_v2(stmt), "db_exec_prepared must succeed"); + db_exec_prepared_v2(stmt); CHECK_MSG(!db_err, "Simple correct SQL command"); tal_free(stmt); stmt = db_prepare_v2(db, SQL("INSERT INTO tablea (id, field1) VALUES (0, 1);")); - CHECK_MSG(db_exec_prepared_v2(stmt), "db_exec_prepared must succeed"); + db_exec_prepared_v2(stmt); CHECK_MSG(!db_err, "Simple correct SQL command"); tal_free(stmt); @@ -197,22 +191,22 @@ static bool test_manip_columns(void) " id REFERENCES tablea(id) ON DELETE CASCADE" ", field1 INTEGER" ", field2 INTEGER);")); - CHECK_MSG(db_exec_prepared_v2(stmt), "db_exec_prepared must succeed"); + db_exec_prepared_v2(stmt); CHECK_MSG(!db_err, "Simple correct SQL command"); tal_free(stmt); stmt = db_prepare_v2(db, SQL("INSERT INTO tableb (id, field1, field2) VALUES (0, 1, 2);")); - CHECK_MSG(db_exec_prepared_v2(stmt), "db_exec_prepared must succeed"); + db_exec_prepared_v2(stmt); CHECK_MSG(!db_err, "Simple correct SQL command"); tal_free(stmt); /* Needs vars table, since this changes db. */ stmt = db_prepare_v2(db, SQL("CREATE TABLE vars (name VARCHAR(32), intval);")); - CHECK_MSG(db_exec_prepared_v2(stmt), "db_exec_prepared must succeed"); + db_exec_prepared_v2(stmt); CHECK_MSG(!db_err, "Simple correct SQL command"); tal_free(stmt); stmt = db_prepare_v2(db, SQL("INSERT INTO vars VALUES ('data_version', 0);")); - CHECK_MSG(db_exec_prepared_v2(stmt), "db_exec_prepared must succeed"); + db_exec_prepared_v2(stmt); CHECK_MSG(!db_err, "Simple correct SQL command"); tal_free(stmt); @@ -222,7 +216,7 @@ static bool test_manip_columns(void) CHECK(db->config->delete_columns(db, "tableb", &field1, 1)); stmt = db_prepare_v2(db, SQL("SELECT id, field1a FROM tablea;")); - CHECK_MSG(db_query_prepared(stmt), "db_query_prepared must succeed"); + CHECK_MSG(db_query_prepared_canfail(stmt), "db_query_prepared must succeed"); CHECK_MSG(!db_err, "Simple correct SQL command"); CHECK(db_step(stmt)); CHECK(db_col_u64(stmt, "id") == 0); @@ -231,7 +225,7 @@ static bool test_manip_columns(void) tal_free(stmt); stmt = db_prepare_v2(db, SQL("SELECT id, field2 FROM tableb;")); - CHECK_MSG(db_query_prepared(stmt), "db_query_prepared must succeed"); + CHECK_MSG(db_query_prepared_canfail(stmt), "db_query_prepared must succeed"); CHECK_MSG(!db_err, "Simple correct SQL command"); CHECK(db_step(stmt)); CHECK(db_col_u64(stmt, "id") == 0); @@ -245,7 +239,7 @@ static bool test_manip_columns(void) db_begin_transaction(db); /* This will actually fail */ stmt = db_prepare_v2(db, SQL("SELECT field1 FROM tablea;")); - CHECK_MSG(!db_query_prepared(stmt), "db_query_prepared must fail"); + CHECK_MSG(!db_query_prepared_canfail(stmt), "db_query_prepared must fail"); db->dirty = false; db->changes = tal_arr(db, const char *, 0); db_commit_transaction(db); @@ -253,7 +247,7 @@ static bool test_manip_columns(void) db_begin_transaction(db); /* This will actually fail */ stmt = db_prepare_v2(db, SQL("SELECT field1 FROM tableb;")); - CHECK_MSG(!db_query_prepared(stmt), "db_query_prepared must fail"); + CHECK_MSG(!db_query_prepared_canfail(stmt), "db_query_prepared must fail"); db->dirty = false; db->changes = tal_arr(db, const char *, 0); db_commit_transaction(db);