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. 43
      daemon/db.c

43
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,7 +1225,9 @@ void db_init(struct lightningd_state *dstate)
} }
/* Set up tables. */ /* Set up tables. */
if (!db_exec(__func__, dstate, dstate->db->in_transaction = true;
db_exec(__func__, dstate, "BEGIN IMMEDIATE;");
db_exec(__func__, dstate,
TABLE(wallet, TABLE(wallet,
SQL_PRIVKEY(privkey)) SQL_PRIVKEY(privkey))
TABLE(pay, TABLE(pay,
@ -1261,7 +1294,13 @@ void db_init(struct lightningd_state *dstate)
TABLE(peers, TABLE(peers,
SQL_PUBKEY(peer), SQL_STATENAME(state), SQL_PUBKEY(peer), SQL_STATENAME(state),
SQL_BOOL(offered_anchor), SQL_U32(our_feerate), SQL_BOOL(offered_anchor), SQL_U32(our_feerate),
"PRIMARY KEY(peer)"))) { "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