Browse Source

wallet: Remove printf-like db_select variant

We need to have full DB queries that can be extracted at compile time later in
order to be able to rewrite them in other SQL dialects. In addition we had a
bit of unnecessary code-duplication in db_select and db_select_prepare. Now
the former uses the latter internally.

Signed-off-by: Christian Decker <decker.christian@gmail.com>
pull/2803/head
Christian Decker 6 years ago
committed by Rusty Russell
parent
commit
f08fd9eaab
  1. 15
      wallet/db.c
  2. 7
      wallet/db.h
  3. 48
      wallet/wallet.c

15
wallet/db.c

@ -586,24 +586,13 @@ static sqlite3_stmt *db_query(const char *location,
return stmt; return stmt;
} }
sqlite3_stmt *PRINTF_FMT(3, 4) sqlite3_stmt *db_select_(const char *location, struct db *db, const char *query)
db_select_(const char *location, struct db *db, const char *fmt, ...)
{ {
va_list ap;
char *query = tal_strdup(db, "SELECT ");
sqlite3_stmt *stmt; sqlite3_stmt *stmt;
assert(db->in_transaction); assert(db->in_transaction);
va_start(ap, fmt); stmt = db_select_prepare(db, query);
tal_append_vfmt(&query, fmt, ap);
va_end(ap);
stmt = db_query(location, db, query);
if (!stmt)
db_fatal("%s:%s:%s", location, query, sqlite3_errmsg(db->sql));
tal_free(query);
return stmt; return stmt;
} }

7
wallet/db.h

@ -44,10 +44,9 @@ struct db *db_setup(const tal_t *ctx, struct lightningd *ld, struct log *log);
* *
* A simpler version of db_select_prepare. * A simpler version of db_select_prepare.
*/ */
sqlite3_stmt *PRINTF_FMT(3, 4) sqlite3_stmt *db_select_(const char *location, struct db *db, const char *query);
db_select_(const char *location, struct db *db, const char *fmt, ...); #define db_select(db, query) \
#define db_select(db, ...) \ db_select_(__FILE__ ":" stringify(__LINE__), db, query)
db_select_(__FILE__ ":" stringify(__LINE__), db, __VA_ARGS__)
/** /**
* db_begin_transaction - Begin a transaction * db_begin_transaction - Begin a transaction

48
wallet/wallet.c

@ -634,9 +634,9 @@ static struct peer *wallet_peer_load(struct wallet *w, const u64 dbid)
struct node_id id; struct node_id id;
struct wireaddr_internal addr; struct wireaddr_internal addr;
sqlite3_stmt *stmt = sqlite3_stmt *stmt = db_select_prepare(
db_select(w->db, w->db, "id, node_id, address FROM peers WHERE id=?;");
"id, node_id, address FROM peers WHERE id=%"PRIu64";", dbid); sqlite3_bind_int64(stmt, 1, dbid);
if (!db_select_step(w->db, stmt)) if (!db_select_step(w->db, stmt))
return NULL; return NULL;
@ -937,8 +937,8 @@ static bool wallet_channels_load_active(struct wallet *w)
", feerate_base" ", feerate_base"
", feerate_ppm" ", feerate_ppm"
", remote_upfront_shutdown_script" ", remote_upfront_shutdown_script"
" FROM channels WHERE state < %d;", " FROM channels WHERE state < ?;");
CLOSED); sqlite3_bind_int(stmt, 1, CLOSED);
while (db_select_step(w->db, stmt)) { while (db_select_step(w->db, stmt)) {
struct channel *c = wallet_stmt2channel(w, stmt); struct channel *c = wallet_stmt2channel(w, stmt);
@ -1098,8 +1098,10 @@ bool wallet_channel_config_load(struct wallet *w, const u64 id,
const char *query = const char *query =
"id, dust_limit_satoshis, max_htlc_value_in_flight_msat, " "id, dust_limit_satoshis, max_htlc_value_in_flight_msat, "
"channel_reserve_satoshis, htlc_minimum_msat, to_self_delay, " "channel_reserve_satoshis, htlc_minimum_msat, to_self_delay, "
"max_accepted_htlcs FROM channel_configs WHERE id=%" PRIu64 ";"; "max_accepted_htlcs FROM channel_configs WHERE id= ? ;";
sqlite3_stmt *stmt = db_select(w->db, query, id); sqlite3_stmt *stmt = db_select_prepare(w->db, query);
sqlite3_bind_int64(stmt, 1, id);
if (!db_select_step(w->db, stmt)) if (!db_select_step(w->db, stmt))
return false; return false;
@ -1364,9 +1366,9 @@ void wallet_peer_delete(struct wallet *w, u64 peer_dbid)
sqlite3_stmt *stmt; sqlite3_stmt *stmt;
/* Must not have any channels still using this peer */ /* Must not have any channels still using this peer */
stmt = db_select(w->db, stmt = db_select_prepare(w->db, "* FROM channels WHERE peer_id = ?;");
"* FROM channels WHERE peer_id = %"PRIu64, sqlite3_bind_int64(stmt, 1, peer_dbid);
peer_dbid);
if (db_select_step(w->db, stmt)) if (db_select_step(w->db, stmt))
fatal("We have channels using peer %"PRIu64, peer_dbid); fatal("We have channels using peer %"PRIu64, peer_dbid);
@ -1725,8 +1727,7 @@ bool wallet_htlcs_load_for_channel(struct wallet *wallet,
int incount = 0, outcount = 0; int incount = 0, outcount = 0;
log_debug(wallet->log, "Loading HTLCs for channel %"PRIu64, chan->dbid); log_debug(wallet->log, "Loading HTLCs for channel %"PRIu64, chan->dbid);
sqlite3_stmt *stmt = db_select(wallet->db, sqlite3_stmt *stmt = db_select_prepare(wallet->db, " id"
" id"
", channel_htlc_id" ", channel_htlc_id"
", msatoshi" ", msatoshi"
", cltv_expiry" ", cltv_expiry"
@ -1740,10 +1741,12 @@ bool wallet_htlcs_load_for_channel(struct wallet *wallet,
", shared_secret" ", shared_secret"
", received_time" ", received_time"
" FROM channel_htlcs" " FROM channel_htlcs"
" WHERE direction=%d" " WHERE direction= ?"
" AND channel_id=%" PRIu64 " AND channel_id= ?"
" AND hstate != %d", " AND hstate != ?");
DIRECTION_INCOMING, chan->dbid, SENT_REMOVE_ACK_REVOCATION); sqlite3_bind_int(stmt, 1, DIRECTION_INCOMING);
sqlite3_bind_int64(stmt, 2, chan->dbid);
sqlite3_bind_int(stmt, 3, SENT_REMOVE_ACK_REVOCATION);
while (db_select_step(wallet->db, stmt)) { while (db_select_step(wallet->db, stmt)) {
struct htlc_in *in = tal(chan, struct htlc_in); struct htlc_in *in = tal(chan, struct htlc_in);
@ -1754,8 +1757,7 @@ bool wallet_htlcs_load_for_channel(struct wallet *wallet,
incount++; incount++;
} }
stmt = db_select(wallet->db, stmt = db_select_prepare(wallet->db, " id"
" id"
", channel_htlc_id" ", channel_htlc_id"
", msatoshi" ", msatoshi"
", cltv_expiry" ", cltv_expiry"
@ -1769,10 +1771,12 @@ bool wallet_htlcs_load_for_channel(struct wallet *wallet,
", shared_secret" ", shared_secret"
", received_time" ", received_time"
" FROM channel_htlcs" " FROM channel_htlcs"
" WHERE direction=%d" " WHERE direction = ?"
" AND channel_id=%" PRIu64 " AND channel_id = ?"
" AND hstate != %d", " AND hstate != ?");
DIRECTION_OUTGOING, chan->dbid, RCVD_REMOVE_ACK_REVOCATION); sqlite3_bind_int(stmt, 1, DIRECTION_OUTGOING);
sqlite3_bind_int64(stmt, 2, chan->dbid);
sqlite3_bind_int(stmt, 3, RCVD_REMOVE_ACK_REVOCATION);
while (db_select_step(wallet->db, stmt)) { while (db_select_step(wallet->db, stmt)) {
struct htlc_out *out = tal(chan, struct htlc_out); struct htlc_out *out = tal(chan, struct htlc_out);

Loading…
Cancel
Save