* db_migrate - Apply all remaining migrations from the current version */
| 23 | * db_migrate - Apply all remaining migrations from the current version |
| 24 | */ |
| 25 | static 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); |