[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