<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/f19c5da900c7a33cc34d9deabfde4a32e52e003f">https://github.com/macports/macports-base/commit/f19c5da900c7a33cc34d9deabfde4a32e52e003f</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit f19c5da900c7a33cc34d9deabfde4a32e52e003f
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Tue May 28 02:01:21 2024 +1000

<span style='display:block; white-space:pre;color:#404040;'>    Add installed files to snapshots
</span>---
 src/cregistry/snapshot.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
 src/cregistry/snapshot.h |  3 +++
 src/cregistry/sql.c      | 47 +++++++++++++++++++++++++++++++++++++++++++++--
 3 files changed, 93 insertions(+), 2 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/cregistry/snapshot.c b/src/cregistry/snapshot.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 7fb9e4821..5a03c9f57 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/cregistry/snapshot.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/cregistry/snapshot.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -250,6 +250,51 @@ int snapshot_store_ports(reg_registry* reg, reg_snapshot* snapshot, reg_error* e
</span>         sqlite3_finalize(stmt);
     }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    return result ? snapshot_store_files(reg, snapshot, errPtr) : result;
</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;'>+/**
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * helper method for storing files for this snapshot
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [in] reg          associated registry
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [in] snapshot     reg_snapshot, its id to use for foreignkey'ing the files
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [out] errPtr      on error, a description of the error that occurred
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @return                  true if success; 0 if failure
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int snapshot_store_files(reg_registry* reg, reg_snapshot* snapshot, reg_error* errPtr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    int result = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    sqlite3_stmt* stmt = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    char* query = "INSERT INTO registry.snapshot_files (id, path) "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        "SELECT snapshot_ports.id, files.path "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        "FROM registry.ports INNER JOIN registry.files ON ports.id = files.id "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        "INNER JOIN registry.snapshot_ports ON ports.name = snapshot_ports.port_name "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        "WHERE snapshot_ports.snapshots_id = ? AND ports.state = 'installed'";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if ((sqlite3_prepare_v2(reg->db, query, -1, &stmt, NULL) == SQLITE_OK)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            && (sqlite3_bind_int64(stmt, 1, snapshot->id) == 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;'>+            r = sqlite3_step(stmt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            switch (r) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                case SQLITE_DONE:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                case SQLITE_BUSY:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    reg_sqlite_error(reg->db, errPtr, query);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    result = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    break;
</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;'>+    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        reg_sqlite_error(reg->db, errPtr, query);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        result = 0;
</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><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/snapshot.h b/src/cregistry/snapshot.h
</span><span style='display:block; white-space:pre;color:#808080;'>index af5a690d9..e1d1fcf52 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/cregistry/snapshot.h
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/cregistry/snapshot.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -67,6 +67,9 @@ reg_snapshot* reg_snapshot_create(reg_registry* reg, char* note,
</span> // helper method for storing ports for this snapshot
 int snapshot_store_ports(reg_registry* reg, reg_snapshot* snapshot,
         reg_error* errPtr);
<span style='display:block; white-space:pre;background:#e0ffe0;'>+// helper method for storing files for this snapshot
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int snapshot_store_files(reg_registry* reg, reg_snapshot* snapshot,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        reg_error* errPtr);
</span> 
 // snapshot properties retrieval methods
 int reg_snapshot_propget(reg_snapshot* snapshot, char* key, char** value,
<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 bb0a510ed..cfc427a2a 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;'>@@ -141,7 +141,7 @@ int create_tables(sqlite3* db, reg_error* errPtr) {
</span> 
         /* 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.212')",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        "INSERT INTO registry.metadata (key, value) VALUES ('version', '1.213')",
</span>         "INSERT INTO registry.metadata (key, value) VALUES ('created', strftime('%s', 'now'))",
 
         /* ports table */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -224,6 +224,16 @@ int create_tables(sqlite3* db, reg_error* errPtr) {
</span>             " ON DELETE CASCADE"
             ")",
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        /* Files registered to ports in snapshots.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           Needed to resolve file-based dependencies. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        "CREATE TABLE registry.snapshot_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;'>+            ", FOREIGN KEY(id) REFERENCES snapshot_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;'>+            ")",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        "CREATE INDEX registry.snapshot_file_path ON snapshot_files(path)",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>         "COMMIT",
         NULL
     };
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -922,6 +932,39 @@ 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.213") < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            /* Add files to snapshots */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            static char* version_1_213_queries[] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                /* Files registered to ports in snapshots.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   Needed to resolve file-based dependencies. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "CREATE TABLE registry.snapshot_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;'>+                    ", FOREIGN KEY(id) REFERENCES snapshot_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;'>+                    ")",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "CREATE INDEX registry.snapshot_file_path ON snapshot_files(path)",
</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.213' 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_213_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;'>@@ -931,7 +974,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.212") > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (sql_version(NULL, -1, version, -1, "1.213") > 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>