[65568] trunk/base/src/cregistry/registry.c

raimue at macports.org raimue at macports.org
Sat Mar 27 19:16:48 PDT 2010


Revision: 65568
          http://trac.macports.org/changeset/65568
Author:   raimue at macports.org
Date:     2010-03-27 19:16:46 -0700 (Sat, 27 Mar 2010)
Log Message:
-----------
cregistry:
Fix "SQL logic error or missing database" which could happen when running
multiple port commands in parallel:
Need sqlite3_reset() before executing query with sqlite3_step() again.

Modified Paths:
--------------
    trunk/base/src/cregistry/registry.c

Modified: trunk/base/src/cregistry/registry.c
===================================================================
--- trunk/base/src/cregistry/registry.c	2010-03-28 02:11:30 UTC (rev 65567)
+++ trunk/base/src/cregistry/registry.c	2010-03-28 02:16:46 UTC (rev 65568)
@@ -196,8 +196,9 @@
     if (initialized || can_write) {
         sqlite3_stmt* stmt;
         char* query = sqlite3_mprintf("ATTACH DATABASE '%q' AS registry", path);
-        if (sqlite3_prepare(reg->db, query, -1, &stmt, NULL) == SQLITE_OK) {
+        if (sqlite3_prepare_v2(reg->db, query, -1, &stmt, NULL) == SQLITE_OK) {
             int r;
+            /* XXX: Busy waiting, consider using sqlite3_busy_handler/timeout */
             do {
                 r = sqlite3_step(stmt);
                 switch (r) {
@@ -214,6 +215,7 @@
                     default:
                         reg_sqlite_error(reg->db, errPtr, query);
                 }
+                sqlite3_reset(stmt);
             } while (r == SQLITE_BUSY);
         } else {
             reg_sqlite_error(reg->db, errPtr, query);
@@ -244,11 +246,12 @@
         reg_throw(errPtr,REG_MISUSE,"no database is attached to this registry");
         return 0;
     }
-    if (sqlite3_prepare(reg->db, query, -1, &stmt, NULL) == SQLITE_OK) {
+    if (sqlite3_prepare_v2(reg->db, query, -1, &stmt, NULL) == SQLITE_OK) {
         int r;
         reg_entry* entry;
         Tcl_HashEntry* curr;
         Tcl_HashSearch search;
+        /* XXX: Busy waiting, consider using sqlite3_busy_handler/timeout */
         do {
             r = sqlite3_step(stmt);
             switch (r) {
@@ -271,6 +274,7 @@
                     reg_sqlite_error(reg->db, errPtr, query);
                     break;
             }
+            sqlite3_reset(stmt);
         } while (r == SQLITE_BUSY);
     } else {
         reg_sqlite_error(reg->db, errPtr, query);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-changes/attachments/20100327/5bc8d339/attachment.html>


More information about the macports-changes mailing list