Browse Source

wallet: Migrate shachain persistence to native sqlite3 binding

Signed-off-by: Christian Decker <decker.christian@gmail.com>
ppa-0.6.1
Christian Decker 8 years ago
committed by Rusty Russell
parent
commit
9c12c807d1
  1. 57
      wallet/wallet.c

57
wallet/wallet.c

@ -240,14 +240,15 @@ s64 wallet_get_newindex(struct lightningd *ld)
bool wallet_shachain_init(struct wallet *wallet, struct wallet_shachain *chain) bool wallet_shachain_init(struct wallet *wallet, struct wallet_shachain *chain)
{ {
sqlite3_stmt *stmt;
/* Create shachain */ /* Create shachain */
shachain_init(&chain->chain); shachain_init(&chain->chain);
if (!db_exec( stmt = db_prepare(wallet->db, "INSERT INTO shachains (min_index, num_valid) VALUES (?, 0);");
__func__, wallet->db, sqlite3_bind_int64(stmt, 1, chain->chain.min_index);
"INSERT INTO shachains (min_index, num_valid) VALUES (%"PRIu64",0);", if (!db_exec_prepared(wallet->db, stmt)) {
chain->chain.min_index)) {
return false; return false;
} }
chain->id = sqlite3_last_insert_rowid(wallet->db->sql); chain->id = sqlite3_last_insert_rowid(wallet->db->sql);
return true; return true;
} }
@ -273,34 +274,35 @@ bool wallet_shachain_add_hash(struct wallet *wallet,
uint64_t index, uint64_t index,
const struct sha256 *hash) const struct sha256 *hash)
{ {
tal_t *tmpctx = tal_tmpctx(wallet); sqlite3_stmt *stmt;
bool ok = true; bool ok = true;
u32 pos = count_trailing_zeroes(index); u32 pos = count_trailing_zeroes(index);
assert(index < SQLITE_MAX_UINT); assert(index < SQLITE_MAX_UINT);
char *hexhash = tal_hexstr(tmpctx, hash, sizeof(struct sha256));
if (!shachain_add_hash(&chain->chain, index, hash)) { if (!shachain_add_hash(&chain->chain, index, hash)) {
tal_free(tmpctx);
return false; return false;
} }
db_begin_transaction(wallet->db); db_begin_transaction(wallet->db);
ok &= db_exec(__func__, wallet->db, stmt = db_prepare(wallet->db, "UPDATE shachains SET num_valid=?, min_index=? WHERE id=?");
"UPDATE shachains SET num_valid=%d, min_index=%" PRIu64 sqlite3_bind_int(stmt, 1, chain->chain.num_valid);
" WHERE id=%" PRIu64, sqlite3_bind_int64(stmt, 2, index);
chain->chain.num_valid, index, chain->id); sqlite3_bind_int64(stmt, 3, chain->id);
ok &= db_exec_prepared(wallet->db, stmt);
ok &= db_exec(__func__, wallet->db, stmt = db_prepare(
"REPLACE INTO shachain_known " wallet->db,
"(shachain_id, pos, idx, hash) VALUES " "REPLACE INTO shachain_known (shachain_id, pos, idx, hash) VALUES (?, ?, ?, ?);");
"(%" PRIu64 ", %d, %" PRIu64 ", '%s');", sqlite3_bind_int64(stmt, 1, chain->id);
chain->id, pos, index, hexhash); sqlite3_bind_int(stmt, 2, pos);
sqlite3_bind_int64(stmt, 3, index);
sqlite3_bind_blob(stmt, 4, hash, sizeof(*hash), SQLITE_TRANSIENT);
ok &= db_exec_prepared(wallet->db, stmt);
if (ok) if (ok)
ok &= db_commit_transaction(wallet->db); ok &= db_commit_transaction(wallet->db);
else else
db_rollback_transaction(wallet->db); db_rollback_transaction(wallet->db);
tal_free(tmpctx);
return ok; return ok;
} }
@ -313,11 +315,9 @@ bool wallet_shachain_load(struct wallet *wallet, u64 id,
shachain_init(&chain->chain); shachain_init(&chain->chain);
/* Load shachain metadata */ /* Load shachain metadata */
stmt = db_query( stmt = db_prepare(wallet->db, "SELECT min_index, num_valid FROM shachains WHERE id=?");
__func__, wallet->db, sqlite3_bind_int64(stmt, 1, id);
"SELECT min_index, num_valid FROM shachains WHERE id=%" PRIu64, id);
if (!stmt)
return false;
err = sqlite3_step(stmt); err = sqlite3_step(stmt);
if (err != SQLITE_ROW) { if (err != SQLITE_ROW) {
sqlite3_finalize(stmt); sqlite3_finalize(stmt);
@ -329,21 +329,16 @@ bool wallet_shachain_load(struct wallet *wallet, u64 id,
sqlite3_finalize(stmt); sqlite3_finalize(stmt);
/* Load shachain known entries */ /* Load shachain known entries */
stmt = db_query( stmt = db_prepare(wallet->db, "SELECT idx, hash, pos FROM shachain_known WHERE shachain_id=?");
__func__, wallet->db, sqlite3_bind_int64(stmt, 1, id);
"SELECT idx, hash, pos FROM shachain_known WHERE shachain_id=%" PRIu64,
id);
if (!stmt)
return false;
while (sqlite3_step(stmt) == SQLITE_ROW) { while (sqlite3_step(stmt) == SQLITE_ROW) {
int pos = sqlite3_column_int(stmt, 2); int pos = sqlite3_column_int(stmt, 2);
chain->chain.known[pos].index = sqlite3_column_int64(stmt, 0); chain->chain.known[pos].index = sqlite3_column_int64(stmt, 0);
sqlite3_column_hexval(stmt, 1, &chain->chain.known[pos].hash, memcpy(&chain->chain.known[pos].hash, sqlite3_column_blob(stmt, 1), sqlite3_column_bytes(stmt, 1));
sizeof(struct sha256));
} }
sqlite3_finalize(stmt);
sqlite3_finalize(stmt);
return true; return true;
} }

Loading…
Cancel
Save