* db_migrate - Apply all remaining migrations from the current version */
| 943 | * db_migrate - Apply all remaining migrations from the current version |
| 944 | */ |
| 945 | static bool db_migrate(struct lightningd *ld, struct db *db, |
| 946 | const struct ext_key *bip32_base) |
| 947 | { |
| 948 | /* Attempt to read the version from the database */ |
| 949 | int current, orig, available; |
| 950 | struct db_stmt *stmt; |
| 951 | const struct migration_context mc = { |
| 952 | .bip32_base = bip32_base, |
| 953 | .hsm_fd = ld->hsm_fd, |
| 954 | }; |
| 955 | |
| 956 | orig = current = db_get_version(db); |
| 957 | available = ARRAY_SIZE(dbmigrations) - 1; |
| 958 | |
| 959 | if (current == -1) |
| 960 | log_info(ld->log, "Creating database"); |
| 961 | else if (available < current) |
| 962 | db_fatal("Refusing to migrate down from version %u to %u", |
| 963 | current, available); |
| 964 | else if (current != available) { |
| 965 | if (ld->db_upgrade_ok && *ld->db_upgrade_ok == false) { |
| 966 | db_fatal("Refusing to upgrade db from version %u to %u (database-upgrade=false)", |
| 967 | current, available); |
| 968 | } else if (!ld->db_upgrade_ok && !is_released_version()) { |
| 969 | db_fatal("Refusing to irreversibly upgrade db from version %u to %u in non-final version %s (use --database-upgrade=true to override)", |
| 970 | current, available, version()); |
| 971 | } |
| 972 | log_info(ld->log, "Updating database from version %u to %u", |
| 973 | current, available); |
| 974 | } |
| 975 | |
| 976 | while (current < available) { |
| 977 | current++; |
| 978 | if (dbmigrations[current].sql) { |
| 979 | stmt = db_prepare_v2(db, dbmigrations[current].sql); |
| 980 | db_exec_prepared_v2(stmt); |
| 981 | tal_free(stmt); |
| 982 | } |
| 983 | if (dbmigrations[current].func) |
| 984 | dbmigrations[current].func(ld, db, &mc); |
| 985 | } |
| 986 | |
| 987 | /* Finally update the version number in the version table */ |
| 988 | stmt = db_prepare_v2(db, SQL("UPDATE version SET version=?;")); |
| 989 | db_bind_int(stmt, 0, available); |
| 990 | db_exec_prepared_v2(stmt); |
| 991 | tal_free(stmt); |
| 992 | |
| 993 | /* Annotate that we did upgrade, if any. */ |
| 994 | if (current != orig) { |
| 995 | stmt = db_prepare_v2( |
| 996 | db, SQL("INSERT INTO db_upgrades VALUES (?, ?);")); |
| 997 | db_bind_int(stmt, 0, orig); |
| 998 | db_bind_text(stmt, 1, version()); |
| 999 | db_exec_prepared_v2(stmt); |
| 1000 | tal_free(stmt); |
| 1001 | } |
| 1002 |