<pre style='margin:0'>
Joshua Root (jmroot) pushed a commit to branch master
in repository macports-base.
</pre>
<p><a href="https://github.com/macports/macports-base/commit/03b8fa6545bf143a000625683c2bc1647ddc5a01">https://github.com/macports/macports-base/commit/03b8fa6545bf143a000625683c2bc1647ddc5a01</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'> new 03b8fa654 Enable foreign key constraints
</span>03b8fa654 is described below
<span style='display:block; white-space:pre;color:#808000;'>commit 03b8fa6545bf143a000625683c2bc1647ddc5a01
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Tue Jun 4 11:02:05 2024 +1000
<span style='display:block; white-space:pre;color:#404040;'> Enable foreign key constraints
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Apart from the integrity checking value, the snapshot tables are
</span><span style='display:block; white-space:pre;color:#404040;'> already specifying ON DELETE CASCADE, and adding it to other tables
</span><span style='display:block; white-space:pre;color:#404040;'> allows simplifying reg_entry_delete.
</span>---
src/cregistry/entry.c | 47 ++-----------------------
src/cregistry/registry.c | 19 ++++++++++
src/cregistry/sql.c | 90 +++++++++++++++++++++++++++++++++++++++++++++---
3 files changed, 107 insertions(+), 49 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/cregistry/entry.c b/src/cregistry/entry.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 948ee8aeb..211c86788 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/cregistry/entry.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/cregistry/entry.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -257,26 +257,11 @@ int reg_entry_delete(reg_entry* entry, reg_error* errPtr) {
</span> errPtr->free = NULL;
sqlite3_stmt* ports = NULL;
<span style='display:block; white-space:pre;background:#ffe0e0;'>- sqlite3_stmt* followups[] = { NULL, NULL, NULL };
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- sqlite3_stmt** pFiles = &followups[0];
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- sqlite3_stmt** pDependencies = &followups[1];
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- sqlite3_stmt** pPortgroups = &followups[2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Relies on cascading to delete associated files, dependencies,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ and portgroups. */
</span> char* ports_query = "DELETE FROM registry.ports WHERE id=?";
<span style='display:block; white-space:pre;background:#ffe0e0;'>- char* files_query = "DELETE FROM registry.files WHERE id=?";
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- char* dependencies_query = "DELETE FROM registry.dependencies WHERE id=?";
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- char* portgroups_query = "DELETE FROM registry.portgroups WHERE id=?";
</span> if ((sqlite3_prepare_v2(reg->db, ports_query, -1, &ports, NULL) == SQLITE_OK)
<span style='display:block; white-space:pre;background:#ffe0e0;'>- && (sqlite3_bind_int64(ports, 1, entry->id) == SQLITE_OK)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- /* follow-ups */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- && (sqlite3_prepare_v2(reg->db, files_query, -1, pFiles, NULL)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- == SQLITE_OK)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- && (sqlite3_bind_int64(*pFiles, 1, entry->id) == SQLITE_OK)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- && (sqlite3_prepare_v2(reg->db, dependencies_query, -1, pDependencies,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- NULL) == SQLITE_OK)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- && (sqlite3_bind_int64(*pDependencies, 1, entry->id) == SQLITE_OK)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- && (sqlite3_prepare_v2(reg->db, portgroups_query, -1, pPortgroups,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- NULL) == SQLITE_OK)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- && (sqlite3_bind_int64(*pPortgroups, 1, entry->id) == SQLITE_OK)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ && (sqlite3_bind_int64(ports, 1, entry->id) == SQLITE_OK)) {
</span> int r;
do {
r = sqlite3_step(ports);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -284,27 +269,6 @@ int reg_entry_delete(reg_entry* entry, reg_error* errPtr) {
</span> case SQLITE_DONE:
if (sqlite3_changes(reg->db) > 0) {
result = 1;
<span style='display:block; white-space:pre;background:#ffe0e0;'>- for (size_t i = 0; i < sizeof(followups)/sizeof(followups[0]); i++) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- do {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- r = sqlite3_step(followups[i]);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- switch (r) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- case SQLITE_DONE:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- case SQLITE_BUSY:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- case SQLITE_ERROR:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- default:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- reg_sqlite_error(reg->db,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- errPtr, NULL);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- result = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- } while (r == SQLITE_BUSY);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if (result == 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- break;
</span> } else {
errPtr->code = REG_INVALID;
errPtr->description = "an invalid entry was passed";
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -325,11 +289,6 @@ int reg_entry_delete(reg_entry* entry, reg_error* errPtr) {
</span> if (ports) {
sqlite3_finalize(ports);
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>- for (size_t i = 0; i < sizeof(followups)/sizeof(followups[0]); i++) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if (followups[i]) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- sqlite3_finalize(followups[i]);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span> return result;
}
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/cregistry/registry.c b/src/cregistry/registry.c
</span><span style='display:block; white-space:pre;color:#808080;'>index e53e02cc3..2b24642f4 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/cregistry/registry.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/cregistry/registry.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -202,6 +202,25 @@ int reg_configure(reg_registry* reg) {
</span> if (stmt) {
sqlite3_finalize(stmt);
}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!result) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return result;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Turn on foreign key support. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stmt = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ result = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (sqlite3_prepare_v2(reg->db, "PRAGMA foreign_keys = ON", -1, &stmt, NULL) == SQLITE_OK) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int r;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ do {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sqlite3_step(stmt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ r = sqlite3_reset(stmt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (r == SQLITE_OK) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ result = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } while (r == SQLITE_BUSY);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (stmt) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sqlite3_finalize(stmt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span> return result;
}
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/cregistry/sql.c b/src/cregistry/sql.c
</span><span style='display:block; white-space:pre;color:#808080;'>index cfc427a2a..dfd88969e 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/cregistry/sql.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/cregistry/sql.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -136,12 +136,13 @@ int create_tables(sqlite3* db, reg_error* errPtr) {
</span> #if SQLITE_VERSION_NUMBER >= 3022000
"PRAGMA journal_mode=WAL",
#endif
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ "PRAGMA foreign_keys = ON",
</span>
"BEGIN",
/* metadata table */
"CREATE TABLE registry.metadata (key UNIQUE, value)",
<span style='display:block; white-space:pre;background:#ffe0e0;'>- "INSERT INTO registry.metadata (key, value) VALUES ('version', '1.213')",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "INSERT INTO registry.metadata (key, value) VALUES ('version', '1.214')",
</span> "INSERT INTO registry.metadata (key, value) VALUES ('created', strftime('%s', 'now'))",
/* ports table */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -177,7 +178,8 @@ int create_tables(sqlite3* db, reg_error* errPtr) {
</span> ", actual_path TEXT"
", active INTEGER"
", binary BOOL"
<span style='display:block; white-space:pre;background:#ffe0e0;'>- ", FOREIGN KEY(id) REFERENCES ports(id))",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ", FOREIGN KEY(id) REFERENCES ports(id)"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ " ON DELETE CASCADE)",
</span> "CREATE INDEX registry.file_port ON files(id)",
"CREATE INDEX registry.file_path ON files(path)",
"CREATE INDEX registry.file_actual ON files(actual_path)",
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -188,7 +190,8 @@ int create_tables(sqlite3* db, reg_error* errPtr) {
</span> "id INTEGER"
", name TEXT"
", variants TEXT"
<span style='display:block; white-space:pre;background:#ffe0e0;'>- ", FOREIGN KEY(id) REFERENCES ports(id))",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ", FOREIGN KEY(id) REFERENCES ports(id)"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ " ON DELETE CASCADE)",
</span> "CREATE INDEX registry.dep_id ON dependencies(id)",
"CREATE INDEX registry.dep_name ON dependencies(name)",
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -199,7 +202,8 @@ int create_tables(sqlite3* db, reg_error* errPtr) {
</span> ", version TEXT COLLATE VERSION"
", size INTEGER"
", sha256 TEXT"
<span style='display:block; white-space:pre;background:#ffe0e0;'>- ", FOREIGN KEY(id) REFERENCES ports(id))",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ", FOREIGN KEY(id) REFERENCES ports(id)"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ " ON DELETE CASCADE)",
</span> "CREATE INDEX registry.portgroup_id ON portgroups(id)",
"CREATE INDEX registry.portgroup_open ON portgroups(id, name, version, size, sha256)",
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -287,6 +291,9 @@ int update_db(sqlite3* db, reg_error* errPtr) {
</span> char* query = q_begin;
sqlite3_stmt* stmt = NULL;
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Disable foreign key constraints while we're changing the schema. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sqlite3_exec(db, "PRAGMA foreign_keys = OFF", NULL, NULL, NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> do {
did_update = 0;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -965,6 +972,79 @@ int update_db(sqlite3* db, reg_error* errPtr) {
</span> continue;
}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (sql_version(NULL, -1, version, -1, "1.214") < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Add cascading deletes to foreign key constraints.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Unfortunately ALTER TABLE can't do this in sqlite, so
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ we have to copy the data into new tables that have the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ right constraint, then drop the old ones and rename, and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ then recreate the indices that were dropped with the old
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tables. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static char* version_1_214_queries[] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* file map */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "CREATE TABLE registry.tmp_files ("
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "id INTEGER"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ", path TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ", actual_path TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ", active INTEGER"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ", binary BOOL"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ", FOREIGN KEY(id) REFERENCES ports(id)"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ " ON DELETE CASCADE)",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "INSERT INTO registry.tmp_files SELECT * FROM registry.files",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "DROP TABLE registry.files",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "ALTER TABLE registry.tmp_files RENAME TO files",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "CREATE INDEX registry.file_port ON files(id)",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "CREATE INDEX registry.file_path ON files(path)",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "CREATE INDEX registry.file_actual ON files(actual_path)",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "CREATE INDEX registry.file_actual_nocase ON files(actual_path COLLATE NOCASE)",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* dependency map */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "CREATE TABLE registry.tmp_dependencies ("
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "id INTEGER"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ", name TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ", variants TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ", FOREIGN KEY(id) REFERENCES ports(id)"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ " ON DELETE CASCADE)",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "INSERT INTO registry.tmp_dependencies SELECT * FROM registry.dependencies",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "DROP TABLE registry.dependencies",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "ALTER TABLE registry.tmp_dependencies RENAME TO dependencies",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "CREATE INDEX registry.dep_id ON dependencies(id)",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "CREATE INDEX registry.dep_name ON dependencies(name)",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* portgroups table */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "CREATE TABLE registry.tmp_portgroups ("
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "id INTEGER"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ", name TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ", version TEXT COLLATE VERSION"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ", size INTEGER"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ", sha256 TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ", FOREIGN KEY(id) REFERENCES ports(id)"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ " ON DELETE CASCADE)",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "INSERT INTO registry.tmp_portgroups SELECT * FROM registry.portgroups",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "DROP TABLE registry.portgroups",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "ALTER TABLE registry.tmp_portgroups RENAME TO portgroups",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "CREATE INDEX registry.portgroup_id ON portgroups(id)",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "CREATE INDEX registry.portgroup_open ON portgroups(id, name, version, size, sha256)",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Update version and commit */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "UPDATE registry.metadata SET value = '1.214' WHERE key = 'version'",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "COMMIT",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ NULL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sqlite3_finalize(stmt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stmt = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!do_queries(db, version_1_214_queries, errPtr)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ rollback_db(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ did_update = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> /* add new versions here, but remember to:
* - finalize the version query statement and set stmt to NULL
* - do _not_ use "BEGIN" in your query list, since a transaction has
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -974,7 +1054,7 @@ int update_db(sqlite3* db, reg_error* errPtr) {
</span> * - update the current version number below
*/
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if (sql_version(NULL, -1, version, -1, "1.213") > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (sql_version(NULL, -1, version, -1, "1.214") > 0) {
</span> /* the registry was already upgraded to a newer version and cannot be used anymore */
reg_throw(errPtr, REG_INVALID, "Version number in metadata table is newer than expected.");
sqlite3_finalize(stmt);
</pre><pre style='margin:0'>
</pre>