diff --git a/wallet/db.c b/wallet/db.c index bdb7787ab..56d260d74 100644 --- a/wallet/db.c +++ b/wallet/db.c @@ -67,12 +67,15 @@ static void migrate_fill_in_channel_type(struct lightningd *ld, static void migrate_normalize_invstr(struct lightningd *ld, struct db *db); -static void migrate_initialize_wait_indexes(struct lightningd *ld, - struct db *db); +static void migrate_initialize_invoice_wait_indexes(struct lightningd *ld, + struct db *db); static void migrate_invoice_created_index_var(struct lightningd *ld, struct db *db); +static void migrate_initialize_payment_wait_indexes(struct lightningd *ld, + struct db *db); + /* Do not reorder or remove elements from this array, it is used to * migrate existing databases from a previous state, based on the * string indices */ @@ -965,7 +968,7 @@ static struct migration dbmigrations[] = { {SQL("CREATE TABLE runes (id BIGSERIAL, rune TEXT, PRIMARY KEY (id));"), NULL}, {SQL("CREATE TABLE runes_blacklist (start_index BIGINT, end_index BIGINT);"), NULL}, {SQL("ALTER TABLE channels ADD ignore_fee_limits INTEGER DEFAULT 0;"), NULL}, - {NULL, migrate_initialize_wait_indexes}, + {NULL, migrate_initialize_invoice_wait_indexes}, {SQL("ALTER TABLE invoices ADD updated_index BIGINT DEFAULT 0"), NULL}, {SQL("CREATE INDEX invoice_update_idx ON invoices (updated_index)"), NULL}, {NULL, migrate_datastore_commando_runes}, @@ -996,6 +999,7 @@ static struct migration dbmigrations[] = { {SQL("CREATE INDEX local_anchors_idx ON local_anchors (channel_id)"), NULL}, {SQL("ALTER TABLE payments ADD updated_index BIGINT DEFAULT 0"), NULL}, {SQL("CREATE INDEX payments_update_idx ON payments (updated_index)"), NULL}, + {NULL, migrate_initialize_payment_wait_indexes}, }; /** @@ -1685,8 +1689,8 @@ static void migrate_fill_in_channel_type(struct lightningd *ld, tal_free(stmt); } -static void migrate_initialize_wait_indexes(struct lightningd *ld, - struct db *db) +static void migrate_initialize_invoice_wait_indexes(struct lightningd *ld, + struct db *db) { struct db_stmt *stmt; bool res; @@ -1740,6 +1744,40 @@ static void migrate_invoice_created_index_var(struct lightningd *ld, struct db * tal_free(stmt); } +/* We expect to have a few of these... */ +static void migrate_initialize_wait_indexes(struct db *db, + enum wait_subsystem subsystem, + enum wait_index index, + const char *query, + const char *colname) +{ + struct db_stmt *stmt; + bool res; + + stmt = db_prepare_v2(db, query); + db_query_prepared(stmt); + res = db_step(stmt); + assert(res); + + if (!db_col_is_null(stmt, colname)) + db_set_intvar(db, + tal_fmt(tmpctx, "last_%s_%s_index", + wait_subsystem_name(subsystem), + wait_index_name(index)), + db_col_u64(stmt, colname)); + tal_free(stmt); +} + +static void migrate_initialize_payment_wait_indexes(struct lightningd *ld, + struct db *db) +{ + migrate_initialize_wait_indexes(db, + WAIT_SUBSYSTEM_SENDPAY, + WAIT_INDEX_CREATED, + SQL("SELECT MAX(id) FROM payments;"), + "MAX(id)"); +} + static void complain_unfixed(struct lightningd *ld, enum channel_state state, u64 id,