[Midnightbsd-cvs] src [7677] trunk/lib/libmport/stats.c: protect stats with serial queue for db queries

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


Revision: 7677
          http://svnweb.midnightbsd.org/src/?rev=7677
Author:   laffer1
Date:     2016-08-07 02:03:58 -0400 (Sun, 07 Aug 2016)
Log Message:
-----------
protect stats with serial queue for db queries

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

Modified: trunk/lib/libmport/stats.c
===================================================================
--- trunk/lib/libmport/stats.c	2016-08-07 06:02:23 UTC (rev 7676)
+++ trunk/lib/libmport/stats.c	2016-08-07 06:03:58 UTC (rev 7677)
@@ -27,27 +27,37 @@
 MPORT_PUBLIC_API int
 mport_stats(mportInstance *mport, mportStats **stats)
 {
-    sqlite3_stmt *stmt;
-    sqlite3 *db = mport->db;
-    mportStats *s;
+	__block sqlite3_stmt *stmt;
+	__block sqlite3 *db = mport->db;
+	__block mportStats *s;
+	__block int result = MPORT_OK;
+	__block char *err;
 
-    if ((s = mport_stats_new()) == NULL)
-        RETURN_ERROR(MPORT_ERR_FATAL, "Out of memory.");
+	if ((s = mport_stats_new()) == NULL)
+		RETURN_ERROR(MPORT_ERR_FATAL, "Out of memory.");
 
-    *stats = s;
+	*stats = s;
 
-    if (mport_db_prepare(db, &stmt, "SELECT COUNT(*) FROM packages") != MPORT_OK) {
+	if (mport_db_prepare(db, &stmt, "SELECT COUNT(*) FROM packages") != MPORT_OK) {
 		sqlite3_finalize(stmt);
 		RETURN_CURRENT_ERROR;
 	}
 
-    if (sqlite3_step(stmt) != SQLITE_ROW) {
-        sqlite3_finalize(stmt);
-        RETURN_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
-    }
+	dispatch_sync(mportSQLSerial, ^{
+		if (sqlite3_step(stmt) != SQLITE_ROW) {
+			sqlite3_finalize(stmt);
+			err = (char *) sqlite3_errmsg(db);
+			result = MPORT_ERR_FATAL;
+			return;
+		}
 
-    s->pkg_installed = (unsigned int) sqlite3_column_int(stmt, 0);
-    sqlite3_finalize(stmt);
+		s->pkg_installed = (unsigned int) sqlite3_column_int(stmt, 0);
+		sqlite3_finalize(stmt);
+	});
+	if (result == MPORT_ERR_FATAL) {
+		SET_ERRORX(result, "%s", err);
+		return result;
+	}
 
     if (mport_db_prepare(db, &stmt, "SELECT COUNT(*) FROM idx.packages") != MPORT_OK) {
 		sqlite3_finalize(stmt);
@@ -54,13 +64,19 @@
 		RETURN_CURRENT_ERROR;
 	}
 
-    if (sqlite3_step(stmt) != SQLITE_ROW) {
-        sqlite3_finalize(stmt);
-        RETURN_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
-    }
+	dispatch_sync(mportSQLSerial, ^{
+		if (sqlite3_step(stmt) != SQLITE_ROW) {
+			sqlite3_finalize(stmt);
+			err = (char *) sqlite3_errmsg(db);
+			result = MPORT_ERR_FATAL;
+			return;
+		}
 
-    s->pkg_available = (unsigned int) sqlite3_column_int(stmt, 0);
-    sqlite3_finalize(stmt);
+		s->pkg_available = (unsigned int) sqlite3_column_int(stmt, 0);
+		sqlite3_finalize(stmt);
+	});
 
-    return (MPORT_OK);
+	if (result == MPORT_ERR_FATAL)
+		SET_ERRORX(result, "%s", err);
+	return result;
 }



More information about the Midnightbsd-cvs mailing list