Browse Source

db: add version field.

We can get weird errors when we try to load a database of a different
from.  Just slap a git version in there for now.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ppa-0.6.1
Rusty Russell 8 years ago
parent
commit
7b44f2851f
  1. 175
      daemon/db.c

175
daemon/db.c

@ -2,6 +2,7 @@
#include "commit_tx.h" #include "commit_tx.h"
#include "db.h" #include "db.h"
#include "feechange.h" #include "feechange.h"
#include "gen_version.h"
#include "htlc.h" #include "htlc.h"
#include "invoice.h" #include "invoice.h"
#include "lightningd.h" #include "lightningd.h"
@ -1149,8 +1150,38 @@ static void db_load_addresses(struct lightningd_state *dstate)
tal_free(ctx); tal_free(ctx);
} }
static void db_check_version(struct lightningd_state *dstate)
{
int err;
sqlite3_stmt *stmt;
sqlite3 *sql = dstate->db->sql;
char *ctx = tal_tmpctx(dstate);
const char *select;
select = tal_fmt(ctx, "SELECT * FROM version;");
err = sqlite3_prepare_v2(sql, select, -1, &stmt, NULL);
if (err != SQLITE_OK)
fatal("DATABASE NEEDS UPDATE. Can't access VERSION: %s:%s",
sqlite3_errstr(err), sqlite3_errmsg(sql));
while ((err = sqlite3_step(stmt)) != SQLITE_DONE) {
const char *ver;
if (err != SQLITE_ROW)
fatal("db_check_version:step gave %s:%s",
sqlite3_errstr(err), sqlite3_errmsg(sql));
ver = sqlite3_column_str(stmt, 0);
if (!streq(ver, VERSION))
fatal("DATABASE NEEDS UPDATE. Version %s does not match %s",
ver, VERSION);
}
tal_free(ctx);
}
static void db_load(struct lightningd_state *dstate) static void db_load(struct lightningd_state *dstate)
{ {
db_check_version(dstate);
db_load_wallet(dstate); db_load_wallet(dstate);
db_load_addresses(dstate); db_load_addresses(dstate);
db_load_peers(dstate); db_load_peers(dstate);
@ -1194,74 +1225,82 @@ void db_init(struct lightningd_state *dstate)
} }
/* Set up tables. */ /* Set up tables. */
if (!db_exec(__func__, dstate, dstate->db->in_transaction = true;
TABLE(wallet, db_exec(__func__, dstate, "BEGIN IMMEDIATE;");
SQL_PRIVKEY(privkey)) db_exec(__func__, dstate,
TABLE(pay, TABLE(wallet,
SQL_RHASH(rhash), SQL_U64(msatoshi), SQL_PRIVKEY(privkey))
SQL_BLOB(ids), SQL_PUBKEY(htlc_peer), TABLE(pay,
SQL_U64(htlc_id), SQL_R(r), SQL_FAIL(fail), SQL_RHASH(rhash), SQL_U64(msatoshi),
"PRIMARY KEY(rhash)") SQL_BLOB(ids), SQL_PUBKEY(htlc_peer),
TABLE(invoice, SQL_U64(htlc_id), SQL_R(r), SQL_FAIL(fail),
SQL_R(r), SQL_U64(msatoshi), SQL_INVLABEL(label), "PRIMARY KEY(rhash)")
SQL_U64(paid_num), TABLE(invoice,
"PRIMARY KEY(label)") SQL_R(r), SQL_U64(msatoshi), SQL_INVLABEL(label),
TABLE(anchors, SQL_U64(paid_num),
SQL_PUBKEY(peer), "PRIMARY KEY(label)")
SQL_TXID(txid), SQL_U32(idx), SQL_U64(amount), TABLE(anchors,
SQL_U32(ok_depth), SQL_U32(min_depth), SQL_PUBKEY(peer),
SQL_BOOL(ours)) SQL_TXID(txid), SQL_U32(idx), SQL_U64(amount),
/* FIXME: state in key is overkill: just need side */ SQL_U32(ok_depth), SQL_U32(min_depth),
TABLE(htlcs, SQL_BOOL(ours))
SQL_PUBKEY(peer), SQL_U64(id), /* FIXME: state in key is overkill: just need side */
SQL_STATENAME(state), SQL_U64(msatoshi), TABLE(htlcs,
SQL_U32(expiry), SQL_RHASH(rhash), SQL_R(r), SQL_PUBKEY(peer), SQL_U64(id),
SQL_ROUTING(routing), SQL_PUBKEY(src_peer), SQL_STATENAME(state), SQL_U64(msatoshi),
SQL_U64(src_id), SQL_BLOB(fail), SQL_U32(expiry), SQL_RHASH(rhash), SQL_R(r),
"PRIMARY KEY(peer, id, state)") SQL_ROUTING(routing), SQL_PUBKEY(src_peer),
TABLE(feechanges, SQL_U64(src_id), SQL_BLOB(fail),
SQL_PUBKEY(peer), SQL_STATENAME(state), "PRIMARY KEY(peer, id, state)")
SQL_U32(fee_rate), TABLE(feechanges,
"PRIMARY KEY(peer,state)") SQL_PUBKEY(peer), SQL_STATENAME(state),
TABLE(commit_info, SQL_U32(fee_rate),
SQL_PUBKEY(peer), SQL_U32(side), "PRIMARY KEY(peer,state)")
SQL_U64(commit_num), SQL_SHA256(revocation_hash), TABLE(commit_info,
SQL_U64(xmit_order), SQL_SIGNATURE(sig), SQL_PUBKEY(peer), SQL_U32(side),
SQL_SHA256(prev_revocation_hash), SQL_U64(commit_num), SQL_SHA256(revocation_hash),
"PRIMARY KEY(peer, side)") SQL_U64(xmit_order), SQL_SIGNATURE(sig),
TABLE(shachain, SQL_SHA256(prev_revocation_hash),
SQL_PUBKEY(peer), SQL_SHACHAIN(shachain), "PRIMARY KEY(peer, side)")
"PRIMARY KEY(peer)") TABLE(shachain,
TABLE(their_visible_state, SQL_PUBKEY(peer), SQL_SHACHAIN(shachain),
SQL_PUBKEY(peer), SQL_BOOL(offered_anchor), "PRIMARY KEY(peer)")
SQL_PUBKEY(commitkey), SQL_PUBKEY(finalkey), TABLE(their_visible_state,
SQL_U32(locktime), SQL_U32(mindepth), SQL_PUBKEY(peer), SQL_BOOL(offered_anchor),
SQL_U32(commit_fee_rate), SQL_PUBKEY(commitkey), SQL_PUBKEY(finalkey),
SQL_SHA256(next_revocation_hash), SQL_U32(locktime), SQL_U32(mindepth),
"PRIMARY KEY(peer)") SQL_U32(commit_fee_rate),
TABLE(their_commitments, SQL_SHA256(next_revocation_hash),
SQL_PUBKEY(peer), SQL_SHA256(txid), "PRIMARY KEY(peer)")
SQL_U64(commit_num), TABLE(their_commitments,
"PRIMARY KEY(peer, txid)") SQL_PUBKEY(peer), SQL_SHA256(txid),
TABLE(peer_secrets, SQL_U64(commit_num),
SQL_PUBKEY(peer), SQL_PRIVKEY(commitkey), "PRIMARY KEY(peer, txid)")
SQL_PRIVKEY(finalkey), TABLE(peer_secrets,
SQL_SHA256(revocation_seed), SQL_PUBKEY(peer), SQL_PRIVKEY(commitkey),
"PRIMARY KEY(peer)") SQL_PRIVKEY(finalkey),
TABLE(peer_address, SQL_SHA256(revocation_seed),
SQL_PUBKEY(peer), SQL_BLOB(addr), "PRIMARY KEY(peer)")
"PRIMARY KEY(peer)") TABLE(peer_address,
TABLE(closing, SQL_PUBKEY(peer), SQL_BLOB(addr),
SQL_PUBKEY(peer), SQL_U64(our_fee), "PRIMARY KEY(peer)")
SQL_U64(their_fee), SQL_SIGNATURE(their_sig), TABLE(closing,
SQL_BLOB(our_script), SQL_BLOB(their_script), SQL_PUBKEY(peer), SQL_U64(our_fee),
SQL_U64(shutdown_order), SQL_U64(closing_order), SQL_U64(their_fee), SQL_SIGNATURE(their_sig),
SQL_U64(sigs_in), SQL_BLOB(our_script), SQL_BLOB(their_script),
"PRIMARY KEY(peer)") SQL_U64(shutdown_order), SQL_U64(closing_order),
TABLE(peers, SQL_U64(sigs_in),
SQL_PUBKEY(peer), SQL_STATENAME(state), "PRIMARY KEY(peer)")
SQL_BOOL(offered_anchor), SQL_U32(our_feerate), TABLE(peers,
"PRIMARY KEY(peer)"))) { SQL_PUBKEY(peer), SQL_STATENAME(state),
SQL_BOOL(offered_anchor), SQL_U32(our_feerate),
"PRIMARY KEY(peer)")
TABLE(version, "version VARCHAR(100)"));
db_exec(__func__, dstate, "INSERT INTO version VALUES ('"VERSION"');");
db_exec(__func__, dstate, "COMMIT;");
dstate->db->in_transaction = false;
if (dstate->db->err) {
unlink(DB_FILE); unlink(DB_FILE);
fatal("%s", dstate->db->err); fatal("%s", dstate->db->err);
} }

Loading…
Cancel
Save