| 105 | }; |
| 106 | |
| 107 | static bool db_migrate(struct plugin *p, struct db *db, bool *created) |
| 108 | { |
| 109 | /* Read current version from database */ |
| 110 | int current, orig, available; |
| 111 | struct db_stmt *stmt; |
| 112 | |
| 113 | orig = current = db_get_version(db); |
| 114 | available = ARRAY_SIZE(db_migrations) - 1; |
| 115 | |
| 116 | *created = false; |
| 117 | if (current == -1) { |
| 118 | *created = true; |
| 119 | plugin_log(p, LOG_INFORM, "Creating database"); |
| 120 | } else if (available < current) |
| 121 | plugin_err(p, |
| 122 | "Refusing to migrate down from version %u to %u", |
| 123 | current, available); |
| 124 | else if (current != available) |
| 125 | plugin_log(p, LOG_INFORM, |
| 126 | "Updating database from version %u to %u", |
| 127 | current, available); |
| 128 | |
| 129 | while (current < available) { |
| 130 | current++; |
| 131 | if (db_migrations[current].sql) { |
| 132 | stmt = db_prepare_v2(db, db_migrations[current].sql); |
| 133 | db_exec_prepared_v2(take(stmt)); |
| 134 | } |
| 135 | if (db_migrations[current].func) |
| 136 | db_migrations[current].func(p, db); |
| 137 | } |
| 138 | |
| 139 | /* Finally, update the version number in the version table */ |
| 140 | stmt = db_prepare_v2(db, SQL("UPDATE version SET version=?;")); |
| 141 | db_bind_int(stmt, 0, available); |
| 142 | db_exec_prepared_v2(take(stmt)); |
| 143 | |
| 144 | return current != orig; |
| 145 | } |
| 146 | |
| 147 | static void migration_remove_dupe_lease_fees(struct plugin *p, struct db *db) |
| 148 | { |