@ -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 ) ;
}
}