MCPcopy Create free account
hub / github.com/ElementsProject/lightning / db_migrate

Function db_migrate

wallet/db.c:25–89  ·  view source on GitHub ↗

* db_migrate - Apply all remaining migrations from the current version */

Source from the content-addressed store, hash-verified

23 * db_migrate - Apply all remaining migrations from the current version
24 */
25static bool db_migrate(struct lightningd *ld, struct db *db,
26 const struct ext_key *bip32_base)
27{
28 /* Attempt to read the version from the database */
29 int current, orig, available;
30 size_t num_migrations;
31 char *err_msg;
32 struct db_stmt *stmt;
33 const struct db_migration *dbmigrations = get_db_migrations(&num_migrations);
34
35 /* This is the final number, not the count! */
36 available = num_migrations - 1;
37 orig = current = db_get_version(db);
38
39 /* Disable STRICT for upgrades: legacy data may have wrong type affinity. */
40 db->in_migration = (current != -1);
41
42 if (current == -1)
43 log_info(ld->log, "Creating database");
44 else if (available < current) {
45 err_msg = tal_fmt(tmpctx, "Refusing to migrate down from version %u to %u",
46 current, available);
47 db_fatal(db, "%s", err_msg);
48 } else if (current != available) {
49 if (ld->db_upgrade_ok && *ld->db_upgrade_ok == false) {
50 db_fatal(db,
51 "Refusing to upgrade db from version %u to %u (database-upgrade=false)",
52 current, available);
53 } else if (!ld->db_upgrade_ok && !is_released_version()) {
54 db_fatal(db, "Refusing to irreversibly upgrade db from version %u to %u in non-final version %s (use --database-upgrade=true to override)",
55 current, available, version());
56 }
57 log_info(ld->log, "Updating database from version %u to %u",
58 current, available);
59 }
60
61 while (current < available) {
62 current++;
63 if (dbmigrations[current].sql) {
64 stmt = db_prepare_v2(db, dbmigrations[current].sql);
65 db_exec_prepared_v2(stmt);
66 tal_free(stmt);
67 }
68 if (dbmigrations[current].func)
69 dbmigrations[current].func(ld, db);
70 }
71
72 /* Finally update the version number in the version table */
73 stmt = db_prepare_v2(db, SQL("UPDATE version SET version=?;"));
74 db_bind_int(stmt, available);
75 db_exec_prepared_v2(stmt);
76 tal_free(stmt);
77
78 /* Annotate that we did upgrade, if any. */
79 if (current != orig) {
80 stmt = db_prepare_v2(
81 db, SQL("INSERT INTO db_upgrades VALUES (?, ?);"));
82 db_bind_int(stmt, orig);

Callers 4

db_setupFunction · 0.70
test_empty_db_migrateFunction · 0.50
test_varsFunction · 0.50
create_test_walletFunction · 0.50

Calls 10

db_get_versionFunction · 0.85
log_infoClass · 0.85
db_fatalFunction · 0.85
is_released_versionFunction · 0.85
versionFunction · 0.85
db_exec_prepared_v2Function · 0.85
tal_freeFunction · 0.85
db_bind_intFunction · 0.85
db_bind_textFunction · 0.85
get_db_migrationsFunction · 0.70

Tested by 3

test_empty_db_migrateFunction · 0.40
test_varsFunction · 0.40
create_test_walletFunction · 0.40