<pre style='margin:0'>
Zero King (l2dy) pushed a commit to branch master
in repository macports-base.

</pre>
<p><a href="https://github.com/macports/macports-base/commit/09b3fecc39ec6b419813fbc08aabdf04b3271fc0">https://github.com/macports/macports-base/commit/09b3fecc39ec6b419813fbc08aabdf04b3271fc0</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 09b3fecc cregistry: replace nested statements with a loop
</span>09b3fecc is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 09b3fecc39ec6b419813fbc08aabdf04b3271fc0
</span>Author: Zero King <l2dy@macports.org>
AuthorDate: Tue Feb 15 11:37:40 2022 +0000

<span style='display:block; white-space:pre;color:#404040;'>    cregistry: replace nested statements with a loop
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    with the necessary evil of goto
</span>---
 src/cregistry/entry.c | 94 +++++++++++++++++++--------------------------------
 1 file changed, 35 insertions(+), 59 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 e73ab0cd..34800f7b 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,72 +257,52 @@ 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* files = NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    sqlite3_stmt* dependencies = NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    sqlite3_stmt* portgroups = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    sqlite3_stmt* followups[] = { NULL, NULL, NULL };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    sqlite3_stmt** pFiles = &followups[0];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    sqlite3_stmt** pDependencies = &followups[1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    sqlite3_stmt** pPortgroups = &followups[2];
</span>     char* ports_query = "DELETE FROM registry.ports WHERE id=?";
     char* files_query = "DELETE FROM registry.files WHERE id=?";
     char* dependencies_query = "DELETE FROM registry.dependencies WHERE id=?";
     char* portgroups_query = "DELETE FROM registry.portgroups WHERE id=?";
     if ((sqlite3_prepare_v2(reg->db, ports_query, -1, &ports, NULL) == SQLITE_OK)
             && (sqlite3_bind_int64(ports, 1, entry->id) == SQLITE_OK)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            && (sqlite3_prepare_v2(reg->db, files_query, -1, &files, NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            /* follow-ups */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            && (sqlite3_prepare_v2(reg->db, files_query, -1, pFiles, NULL)
</span>                 == SQLITE_OK)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            && (sqlite3_bind_int64(files, 1, entry->id) == SQLITE_OK)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            && (sqlite3_prepare_v2(reg->db, dependencies_query, -1, &dependencies,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            && (sqlite3_bind_int64(*pFiles, 1, entry->id) == SQLITE_OK)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            && (sqlite3_prepare_v2(reg->db, dependencies_query, -1, pDependencies,
</span>                     NULL) == SQLITE_OK)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            && (sqlite3_bind_int64(dependencies, 1, entry->id) == SQLITE_OK)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            && (sqlite3_prepare_v2(reg->db, portgroups_query, -1, &portgroups,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            && (sqlite3_bind_int64(*pDependencies, 1, entry->id) == SQLITE_OK)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            && (sqlite3_prepare_v2(reg->db, portgroups_query, -1, pPortgroups,
</span>                     NULL) == SQLITE_OK)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            && (sqlite3_bind_int64(portgroups, 1, entry->id) == SQLITE_OK)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            && (sqlite3_bind_int64(*pPortgroups, 1, entry->id) == SQLITE_OK)) {
</span>         int r;
         do {
             r = sqlite3_step(ports);
             switch (r) {
                 case SQLITE_DONE:
                     if (sqlite3_changes(reg->db) > 0) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        do {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            r = sqlite3_step(files);
</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;'>-                                    do {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                        r = sqlite3_step(dependencies);
</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;'>-                                                do {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                                    r = sqlite3_step(portgroups);
</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;'>-                                                            result = 1;
</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;'>-                                                            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;'>-                                                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;'>-                                                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;'>-                                    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, errPtr, NULL);
</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:#e0ffe0;'>+                        result = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        for (size_t i = 0; i < sizeof(followups)/sizeof(followups[0]); i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            do {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                r = sqlite3_step(followups[i]);
</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;'>+                                    case SQLITE_ERROR:
</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,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                errPtr, NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                        result = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                        goto stmt_finish;
</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;'>+                        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+stmt_finish:
</span>                         break;
                     } else {
                         errPtr->code = REG_INVALID;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -344,14 +324,10 @@ 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;'>-    if (files) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        sqlite3_finalize(files);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if (dependencies) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        sqlite3_finalize(dependencies);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if (portgroups) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        sqlite3_finalize(portgroups);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    for (size_t i = 0; i < sizeof(followups)/sizeof(followups[0]); i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (followups[i]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            sqlite3_finalize(followups[i]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span>     }
     return result;
 }
</pre><pre style='margin:0'>

</pre>