[darwinbuild-changes] [725] branches/PR-7489777/darwinup

source_changes at macosforge.org source_changes at macosforge.org
Mon Mar 1 13:29:02 PST 2010


Revision: 725
          http://trac.macosforge.org/projects/darwinbuild/changeset/725
Author:   wsiegrist at apple.com
Date:     2010-03-01 13:28:59 -0800 (Mon, 01 Mar 2010)
Log Message:
-----------
Properly cache, retain, and release sqlite statements

Modified Paths:
--------------
    branches/PR-7489777/darwinup/Database.cpp
    branches/PR-7489777/darwinup/Database.h
    branches/PR-7489777/darwinup/Table.cpp
    branches/PR-7489777/darwinup/Table.h

Modified: branches/PR-7489777/darwinup/Database.cpp
===================================================================
--- branches/PR-7489777/darwinup/Database.cpp	2010-02-25 17:33:55 UTC (rev 724)
+++ branches/PR-7489777/darwinup/Database.cpp	2010-03-01 21:28:59 UTC (rev 725)
@@ -227,15 +227,17 @@
 
 #define __get_stmt(expr) \
 	sqlite3_stmt* stmt; \
+    sqlite3_stmt** pps; \
 	char* key = strdup(name); \
-	cache_get_and_retain(m_statement_cache, key, (void**)&stmt); \
-	if (!stmt) { \
+	cache_get_and_retain(m_statement_cache, key, (void**)&pps); \
+	if (!pps) { \
 		va_list args; \
 		va_start(args, count); \
-		stmt = expr; \
+		pps = expr; \
 		va_end(args); \
-		cache_set_and_retain(m_statement_cache, key, stmt, sizeof(stmt)); \
+		cache_set_and_retain(m_statement_cache, key, pps, 0); \
 	} \
+    stmt = *pps; \
 	free(key);
 
 int Database::count(const char* name, void** output, Table* table, 
@@ -244,11 +246,12 @@
 	va_start(args, count);
 	__get_stmt(table->count(m_db, count, args));
 	int res = SQLITE_OK;
-	this->bind_va_columns(stmt, count, args);
+	res = this->bind_va_columns(stmt, count, args);
 	*output = malloc(sizeof(uint64_t));
+	assert(*output);
 	res = this->step_once(stmt, *(uint8_t**)output, NULL);
 	sqlite3_reset(stmt);
-	cache_release_value(m_statement_cache, &stmt);
+	cache_release_value(m_statement_cache, pps);
 	va_end(args);
 	return res;
 }
@@ -262,9 +265,10 @@
 	this->bind_va_columns(stmt, count, args);
 	uint32_t size = value_column->size();
 	*output = malloc(size);
+	assert(*output);
 	res = this->step_once(stmt, (uint8_t*)*output, NULL);
 	sqlite3_reset(stmt);
-	cache_release_value(m_statement_cache, &stmt);
+	cache_release_value(m_statement_cache, pps);
 	va_end(args);
 	return res;
 }
@@ -280,7 +284,7 @@
 	*output = malloc(size);
 	res = this->step_all(stmt, output, size, result_count);
 	sqlite3_reset(stmt);
-	cache_release_value(m_statement_cache, &stmt);
+	cache_release_value(m_statement_cache, pps);
 	va_end(args);
 	return res;
 }
@@ -295,7 +299,7 @@
 	*output = table->alloc_result();
 	res = this->step_once(stmt, *output, NULL);
 	sqlite3_reset(stmt);
-	cache_release_value(m_statement_cache, &stmt);
+	cache_release_value(m_statement_cache, pps);
 	va_end(args);
 	return res;
 }
@@ -310,7 +314,7 @@
 	*output = table->alloc_result();
 	res = this->step_once(stmt, *output, NULL);
 	sqlite3_reset(stmt);
-	cache_release_value(m_statement_cache, &stmt);
+	cache_release_value(m_statement_cache, pps);
 	va_end(args);
 	return res;
 }
@@ -350,7 +354,7 @@
 	}
 
 	sqlite3_reset(stmt);
-	cache_release_value(m_statement_cache, &stmt);
+	cache_release_value(m_statement_cache, pps);
 	va_end(args);
 	return res;
 }
@@ -384,7 +388,7 @@
 	this->bind_columns(stmt, count, param, args);
 	res = sqlite3_step(stmt);
 	sqlite3_reset(stmt);
-    cache_release_value(m_statement_cache, &stmt);
+    cache_release_value(m_statement_cache, pps);
 	va_end(args);
 	return (res == SQLITE_DONE ? SQLITE_OK : res);
 }
@@ -516,7 +520,7 @@
 			free(key);
 			return res;
 		}
-		cache_set_and_retain(m_statement_cache, key, stmt, sizeof(stmt)); \
+		cache_set_and_retain(m_statement_cache, key, stmt, 0); \
 		free(key);
 	}
 	return this->execute(stmt);
@@ -679,11 +683,14 @@
 	cache_attributes_t attrs;
 	attrs.version = CACHE_ATTRIBUTES_VERSION_2;
 	attrs.key_hash_cb = cache_key_hash_cb_cstring;
-	attrs.key_is_equal_cb = cache_key_is_equal;
+	attrs.key_is_equal_cb = cache_key_is_equal_cb_cstring;
 	attrs.key_retain_cb = cache_key_retain;
-	attrs.key_release_cb = cache_key_release;
-	attrs.value_release_cb = cache_value_release;
-	attrs.value_retain_cb = cache_value_retain;
+	attrs.key_release_cb = cache_release_cb_free;
+	attrs.value_release_cb = cache_statement_release;
+	attrs.value_retain_cb = NULL;
+	attrs.value_make_purgeable_cb = NULL;
+	attrs.value_make_nonpurgeable_cb = NULL;
+	attrs.user_data = NULL;
 	cache_create("org.macosforge.darwinbuild.darwinup.statements", 
 				 &attrs, &m_statement_cache);
 }
@@ -692,23 +699,10 @@
 	cache_destroy(m_statement_cache);
 }
 
-bool cache_key_is_equal(void* key1, void* key2, void* user) {
-	bool res = (strcmp((char*)key1, (char*)key2) == 0);
-	return res;
-}
-
 void cache_key_retain(void* key_in, void** key_out, void* user_data) {
 	*key_out = strdup((char*)key_in);
 }
 
-void cache_key_release(void* key, void* user_data) {
-	free(key);
+void cache_statement_release(void* value, void* user_data) {
+	sqlite3_finalize(*(sqlite3_stmt**)value);
 }
-
-void cache_value_retain(void* value, void* user_data) {
-	// do nothing
-}
-
-void cache_value_release(void* value, void* user_data) {
-	sqlite3_finalize((sqlite3_stmt*)value);
-}

Modified: branches/PR-7489777/darwinup/Database.h
===================================================================
--- branches/PR-7489777/darwinup/Database.h	2010-02-25 17:33:55 UTC (rev 724)
+++ branches/PR-7489777/darwinup/Database.h	2010-03-01 21:28:59 UTC (rev 725)
@@ -222,10 +222,8 @@
 };
 
 // libcache callbacks
-bool cache_key_is_equal(void* key1, void* key2, void* user);
 void cache_key_retain(void* key_in, void** key_out, void* user_data);
-void cache_key_release(void* key, void* user_data);
-void cache_value_retain(void* value, void* user_data);
-void cache_value_release(void* value, void* user_data);
+void cache_statement_retain(void* value, void* user_data);
+void cache_statement_release(void* value, void* user_data);
 
 #endif

Modified: branches/PR-7489777/darwinup/Table.cpp
===================================================================
--- branches/PR-7489777/darwinup/Table.cpp	2010-02-25 17:33:55 UTC (rev 724)
+++ branches/PR-7489777/darwinup/Table.cpp	2010-03-01 21:28:59 UTC (rev 725)
@@ -159,9 +159,8 @@
 	size_t size = 256; \
 	size_t used = 0; \
 	char* query = (char*)malloc(size); \
-	sqlite3_stmt* stmt = (sqlite3_stmt*)malloc(sizeof(sqlite3_stmt*));
+	sqlite3_stmt** pps = (sqlite3_stmt**)malloc(sizeof(sqlite3_stmt*));
 
-
 #define __check_and_cat(text) \
 	used = strlcat(query, text, size); \
     if (used >= size-1) { \
@@ -175,7 +174,7 @@
     }
 
 #define __prepare_stmt \
-    int res = sqlite3_prepare_v2(db, query, size, &stmt, NULL); \
+    int res = sqlite3_prepare_v2(db, query, size, pps, NULL); \
     free(query); \
     if (res != SQLITE_OK) { \
         fprintf(stderr, "Error: unable to prepare statement: %s\n", \
@@ -235,11 +234,17 @@
 	sqlite3_stmt* stmt = (sqlite3_stmt*)malloc(sizeof(sqlite3_stmt*));
 	char* query;
 	int size = asprintf(&query, "SELECT count(*) FROM %s ;", m_name) + 1;
-	__prepare_stmt;
+    int res = sqlite3_prepare_v2(db, query, size, &stmt, NULL); \
+    free(query); \
+    if (res != SQLITE_OK) { \
+        fprintf(stderr, "Error: unable to prepare statement: %s\n", \
+				sqlite3_errmsg(db)); \
+        return NULL; \
+    }	
 	return stmt;
 }
 
-sqlite3_stmt* Table::count(sqlite3* db, uint32_t count, va_list args) {
+sqlite3_stmt** Table::count(sqlite3* db, uint32_t count, va_list args) {
 	__alloc_stmt_query;
 	strlcpy(query, "SELECT count(*) FROM ", size);
 	__check_and_cat(m_name);
@@ -248,10 +253,10 @@
 	strlcat(query, ";", size);
 	__prepare_stmt;
 
-	return stmt;	
+	return pps;	
 }
 
-sqlite3_stmt* Table::get_column(sqlite3* db, Column* value_column, uint32_t count, va_list args) {
+sqlite3_stmt** Table::get_column(sqlite3* db, Column* value_column, uint32_t count, va_list args) {
 	__alloc_stmt_query;
 	strlcpy(query, "SELECT ", size);
 	__check_and_cat(value_column->name());
@@ -262,10 +267,10 @@
 	strlcat(query, ";", size);
 	__prepare_stmt;
 	
-	return stmt;
+	return pps;
 }
 
-sqlite3_stmt* Table::get_row(sqlite3* db, uint32_t count, va_list args) {
+sqlite3_stmt** Table::get_row(sqlite3* db, uint32_t count, va_list args) {
 	__alloc_stmt_query;
 	strlcpy(query, "SELECT * FROM ", size);
 	__check_and_cat(m_name);
@@ -274,10 +279,10 @@
 	strlcat(query, ";", size);
 	__prepare_stmt;
 	
-	return stmt;	
+	return pps;	
 }
 
-sqlite3_stmt* Table::get_row_ordered(sqlite3* db, Column* order_by, int order, 
+sqlite3_stmt** Table::get_row_ordered(sqlite3* db, Column* order_by, int order, 
 									 uint32_t count, va_list args) {
 	__alloc_stmt_query;
 	strlcpy(query, "SELECT * FROM ", size);
@@ -290,11 +295,11 @@
 	strlcat(query, ";", size);
 	__prepare_stmt;
 	
-	return stmt;	
+	return pps;	
 }
 
 
-sqlite3_stmt* Table::update_value(sqlite3* db, Column* value_column, uint32_t count, va_list args) {
+sqlite3_stmt** Table::update_value(sqlite3* db, Column* value_column, uint32_t count, va_list args) {
 	__alloc_stmt_query;
 	strlcpy(query, "UPDATE ", size);
 	__check_and_cat(m_name);
@@ -305,7 +310,7 @@
 	strlcat(query, ";", size);
 	__prepare_stmt;
 	
-	return stmt;
+	return pps;
 }
 
 /**
@@ -453,7 +458,7 @@
 	
 }
 
-sqlite3_stmt* Table::del(sqlite3* db, uint32_t count, va_list args) {
+sqlite3_stmt** Table::del(sqlite3* db, uint32_t count, va_list args) {
 	__alloc_stmt_query;
 	strlcpy(query, "DELETE FROM ", size);
 	__check_and_cat(m_name);
@@ -462,7 +467,7 @@
 	strlcat(query, ";", size);
 	__prepare_stmt;
 	
-	return stmt;
+	return pps;
 }
 
 int Table::where_va_columns(uint32_t count, char* query, size_t size, 

Modified: branches/PR-7489777/darwinup/Table.h
===================================================================
--- branches/PR-7489777/darwinup/Table.h	2010-02-25 17:33:55 UTC (rev 724)
+++ branches/PR-7489777/darwinup/Table.h	2010-03-01 21:28:59 UTC (rev 725)
@@ -73,18 +73,18 @@
 	 */
 	sqlite3_stmt*    create(sqlite3* db);  
 	sqlite3_stmt*    count(sqlite3* db);
-	sqlite3_stmt*    count(sqlite3* db, uint32_t count, va_list args);
-	sqlite3_stmt*    get_column(sqlite3* db, Column* value_column, 
+	sqlite3_stmt**    count(sqlite3* db, uint32_t count, va_list args);
+	sqlite3_stmt**    get_column(sqlite3* db, Column* value_column, 
 								uint32_t count, va_list args);
-	sqlite3_stmt*    get_row(sqlite3* db, uint32_t count, va_list args);
-	sqlite3_stmt*    get_row_ordered(sqlite3* db, Column* order_by, int order, 
+	sqlite3_stmt**    get_row(sqlite3* db, uint32_t count, va_list args);
+	sqlite3_stmt**    get_row_ordered(sqlite3* db, Column* order_by, int order, 
 							 uint32_t count, va_list args);
-	sqlite3_stmt*    update_value(sqlite3* db, Column* value_column, 
+	sqlite3_stmt**    update_value(sqlite3* db, Column* value_column, 
 								  uint32_t count, va_list args);
 	sqlite3_stmt*    update(sqlite3* db);
 	sqlite3_stmt*    insert(sqlite3* db);
 	sqlite3_stmt*    del(sqlite3* db);
-	sqlite3_stmt*    del(sqlite3* db, uint32_t count, va_list args);
+	sqlite3_stmt**    del(sqlite3* db, uint32_t count, va_list args);
 	
 protected:
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/darwinbuild-changes/attachments/20100301/c0d638d9/attachment-0001.html>


More information about the darwinbuild-changes mailing list