[Midnightbsd-cvs] src [7676] trunk/lib/libmport/db.c: attempt to protect prepare with a serial queue

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Sun Aug 7 02:02:24 EDT 2016


Revision: 7676
          http://svnweb.midnightbsd.org/src/?rev=7676
Author:   laffer1
Date:     2016-08-07 02:02:23 -0400 (Sun, 07 Aug 2016)
Log Message:
-----------
attempt to protect prepare with a serial queue

Modified Paths:
--------------
    trunk/lib/libmport/db.c

Modified: trunk/lib/libmport/db.c
===================================================================
--- trunk/lib/libmport/db.c	2016-08-07 04:58:55 UTC (rev 7675)
+++ trunk/lib/libmport/db.c	2016-08-07 06:02:23 UTC (rev 7676)
@@ -47,45 +47,48 @@
  * sqlite3_vmprintf() for format information.
  */
 int
-mport_db_do(sqlite3 *db, const char *fmt, ...) {
-    va_list args;
-    char *sql;
-    __block int result = MPORT_OK;
-    __block char *err;
+mport_db_do(sqlite3 *db, const char *fmt, ...)
+{
+	va_list args;
+	char *sql;
+	__block int result = MPORT_OK;
+	__block char *err;
 
-    va_start(args, fmt);
+	va_start(args, fmt);
 
-    sql = sqlite3_vmprintf(fmt, args);
+	sql = sqlite3_vmprintf(fmt, args);
 
-    va_end(args);
+	va_end(args);
 
-    if (sql == NULL)
-        RETURN_ERROR(MPORT_ERR_FATAL, "Couldn't allocate memory for sql statement");
+	if (sql == NULL)
+		RETURN_ERROR(MPORT_ERR_FATAL, "Couldn't allocate memory for sql statement");
 
-    dispatch_sync(mportSQLSerial, ^{
-        int sqlcode = sqlite3_exec(db, sql, 0, 0, 0);
-        /* if we get an error code, we want to run it again in some cases */
-        if (sqlcode == SQLITE_BUSY || sqlcode == SQLITE_LOCKED) {
-            sleep(1);
-            if (sqlite3_exec(db, sql, 0, 0, 0) != SQLITE_OK) {
-                sqlite3_free(sql);
-                err = (char *)sqlite3_errmsg(db);
-                result = MPORT_ERR_FATAL;
-            }
-        } else if (sqlcode != SQLITE_OK) {
-            sqlite3_free(sql);
-            err = (char *)sqlite3_errmsg(db);
-            result = MPORT_ERR_FATAL;
-        }
+	dispatch_sync(mportSQLSerial, ^{
+		int sqlcode = sqlite3_exec(db, sql, 0, 0, 0);
+		/* if we get an error code, we want to run it again in some cases */
+		if (sqlcode == SQLITE_BUSY || sqlcode == SQLITE_LOCKED) {
+			sleep(1);
+			if (sqlite3_exec(db, sql, 0, 0, 0) != SQLITE_OK) {
+				sqlite3_free(sql);
+				err = (char *) sqlite3_errmsg(db);
+				result = MPORT_ERR_FATAL;
+			}
+		} else if (sqlcode != SQLITE_OK) {
+			sqlite3_free(sql);
+			err = (char *) sqlite3_errmsg(db);
+			result = MPORT_ERR_FATAL;
+		}
 
-        sqlite3_free(sql);
-    });
+		sqlite3_free(sql);
+	});
 
-    return result;
+	if (result == MPORT_ERR_FATAL)
+		SET_ERRORX(result, "sql error preparing '%s' : %s", sql, err);
+
+	return result;
 }
 
 
-
 /* mport_db_prepare(sqlite3 *, sqlite3_stmt **, const char *, ...)
  * 
  * A wrapper for preparing sqlite statements into statement structs.
@@ -93,27 +96,38 @@
  * may be null if this function does not return MPORT_OK.
  */
 int
-mport_db_prepare(sqlite3 *db, sqlite3_stmt **stmt, const char * fmt, ...)
+mport_db_prepare(sqlite3 *db, sqlite3_stmt **stmt, const char *fmt, ...)
 {
-  va_list args;
-  char *sql;
-  
-  va_start(args, fmt);
-  sql = sqlite3_vmprintf(fmt, args);
-  va_end(args);
-  
-  if (sql == NULL)
-    RETURN_ERROR(MPORT_ERR_FATAL, "Couldn't allocate memory for sql statement");
-  
-  if (sqlite3_prepare_v2(db, sql, -1, stmt, NULL) != SQLITE_OK) {
-    SET_ERRORX(MPORT_ERR_FATAL, "sql error preparing '%s': %s", sql, sqlite3_errmsg(db));
-    sqlite3_free(sql);
-    RETURN_CURRENT_ERROR;
-  }
-  
-  sqlite3_free(sql);
-  
-  return MPORT_OK;
+	va_list args;
+	char *sql;
+	__block int result = MPORT_OK;
+	__block char *err;
+
+	va_start(args, fmt);
+	sql = sqlite3_vmprintf(fmt, args);
+	va_end(args);
+
+	if (sql == NULL)
+		RETURN_ERROR(MPORT_ERR_FATAL, "Couldn't allocate memory for sql statement");
+
+	dispatch_sync(mportSQLSerial, ^{
+		int sqlcode = sqlite3_prepare_v2(db, sql, -1, stmt, NULL);
+		if (sqlcode == SQLITE_BUSY || sqlcode == SQLITE_LOCKED) {
+			sleep(1);
+			if (sqlite3_prepare_v2(db, sql, -1, stmt, NULL) != SQLITE_OK) {
+				sqlite3_free(sql);
+				err = (char *) sqlite3_errmsg(db);
+				result = MPORT_ERR_FATAL;
+				return;
+			}
+		}
+
+		sqlite3_free(sql);
+	});
+
+	if (result == MPORT_ERR_FATAL)
+		SET_ERRORX(result, "sql error preparing '%s' : %s", sql, err);
+	return result;
 }
 
   



More information about the Midnightbsd-cvs mailing list