[darwinbuild-changes] [723] branches/PR-7489777/darwinup
source_changes at macosforge.org
source_changes at macosforge.org
Wed Feb 24 14:45:27 PST 2010
Revision: 723
http://trac.macosforge.org/projects/darwinbuild/changeset/723
Author: wsiegrist at apple.com
Date: 2010-02-24 14:45:25 -0800 (Wed, 24 Feb 2010)
Log Message:
-----------
Convert __bind macros to functions
Modified Paths:
--------------
branches/PR-7489777/darwinup/Database.cpp
branches/PR-7489777/darwinup/Database.h
Modified: branches/PR-7489777/darwinup/Database.cpp
===================================================================
--- branches/PR-7489777/darwinup/Database.cpp 2010-02-24 18:50:56 UTC (rev 722)
+++ branches/PR-7489777/darwinup/Database.cpp 2010-02-24 22:45:25 UTC (rev 723)
@@ -149,74 +149,81 @@
return this->execute(m_commit_transaction);
}
+int Database::bind_all_columns(sqlite3_stmt* stmt, Table* table, va_list args) {
+ int res = DB_OK;
+ int param = 1;
+ for (uint32_t i=0; i<table->column_count(); i++) {
+ Column* col = table->column(i);
+ if (col->is_pk()) continue;
+ uint8_t* bdata = NULL;
+ uint32_t bsize = 0;
+ switch(col->type()) {
+ case TYPE_INTEGER:
+ res = sqlite3_bind_int64(stmt, param++, va_arg(args, uint64_t));
+ break;
+ case TYPE_TEXT:
+ res = sqlite3_bind_text(stmt, param++, va_arg(args, char*),
+ -1, SQLITE_STATIC);
+ break;
+ case TYPE_BLOB:
+ bdata = va_arg(args, uint8_t*);
+ bsize = va_arg(args, uint32_t);
+ res = sqlite3_bind_blob(stmt, param++,
+ bdata,
+ bsize,
+ SQLITE_STATIC);
+ break;
+ }
+ if (res != SQLITE_OK) {
+ fprintf(stderr, "Error: failed to bind parameter #%d with column #%d"
+ "of type %d table %s \n",
+ param, i, col->type(), table->name());
+ return res;
+ }
+ }
+ return res;
+}
-#define __bind_all_columns(_lastarg) \
- va_list args; \
- va_start(args, _lastarg); \
- for (uint32_t i=0; i<table->column_count(); i++) { \
- Column* col = table->column(i); \
- if (col->is_pk()) continue; \
- uint8_t* bdata = NULL; \
- uint32_t bsize = 0; \
- switch(col->type()) { \
- case TYPE_INTEGER: \
- res = sqlite3_bind_int64(stmt, param++, va_arg(args, uint64_t)); \
- break; \
- case TYPE_TEXT: \
- res = sqlite3_bind_text(stmt, param++, va_arg(args, char*), -1, SQLITE_STATIC); \
- break; \
- case TYPE_BLOB: \
- bdata = va_arg(args, uint8_t*); \
- bsize = va_arg(args, uint32_t); \
- res = sqlite3_bind_blob(stmt, param++, \
- bdata, \
- bsize, \
- SQLITE_STATIC); \
- break; \
- } \
- if (res != SQLITE_OK) { \
- fprintf(stderr, "Error: failed to bind parameter #%d with column #%d of type %d " \
- "table %s \n", \
- param, i, col->type(), table->name()); \
- return res; \
- } \
- } \
- va_end(args);
+int Database::bind_va_columns(sqlite3_stmt* stmt, uint32_t count, va_list args) {
+ return this->bind_columns(stmt, count, 1, args);
+}
-#define __bind_va_columns(_lastarg) \
- va_list args; \
- va_start(args, _lastarg); \
- for (uint32_t i=0; i<count; i++) { \
- Column* col = va_arg(args, Column*); \
- va_arg(args, int); \
- uint8_t* bdata = NULL; \
- uint32_t bsize = 0; \
- char* tval; \
- switch(col->type()) { \
- case TYPE_INTEGER: \
- res = sqlite3_bind_int64(stmt, param++, va_arg(args, uint64_t)); \
- break; \
- case TYPE_TEXT: \
- tval = va_arg(args, char*); \
- res = sqlite3_bind_text(stmt, param++, tval, -1, SQLITE_STATIC); \
- break; \
- case TYPE_BLOB: \
- bdata = va_arg(args, uint8_t*); \
- bsize = va_arg(args, uint32_t); \
- res = sqlite3_bind_blob(stmt, param++, \
- bdata, \
- bsize, \
- SQLITE_STATIC); \
- break; \
- } \
- if (res != SQLITE_OK) { \
- fprintf(stderr, "Error: failed to bind parameter #%d with column #%d of type %d " \
- "table %s res %d: %s \n", \
- param-1, i, col->type(), table->name(), res, sqlite3_errmsg(m_db)); \
- return res; \
- } \
- } \
- va_end(args);
+int Database::bind_columns(sqlite3_stmt* stmt, uint32_t count, int param,
+ va_list args) {
+ int res = DB_OK;
+ for (uint32_t i=0; i<count; i++) {
+ Column* col = va_arg(args, Column*);
+ va_arg(args, int);
+ uint8_t* bdata = NULL;
+ uint32_t bsize = 0;
+ char* tval;
+ switch(col->type()) {
+ case TYPE_INTEGER:
+ res = sqlite3_bind_int64(stmt, param++, va_arg(args, uint64_t));
+ break;
+ case TYPE_TEXT:
+ tval = va_arg(args, char*);
+ res = sqlite3_bind_text(stmt, param++, tval, -1, SQLITE_STATIC);
+ break;
+ case TYPE_BLOB:
+ bdata = va_arg(args, uint8_t*);
+ bsize = va_arg(args, uint32_t);
+ res = sqlite3_bind_blob(stmt, param++,
+ bdata,
+ bsize,
+ SQLITE_STATIC);
+ break;
+ }
+ if (res != SQLITE_OK) {
+ fprintf(stderr, "Error: failed to bind parameter #%d with column #%d "
+ "of type %d res %d: %s \n",
+ param-1, i, col->type(), res,
+ sqlite3_errmsg(m_db));
+ return res;
+ }
+ }
+ return res;
+}
#define __get_stmt(expr) \
sqlite3_stmt* stmt; \
@@ -231,81 +238,91 @@
} \
free(key);
-
int Database::count(const char* name, void** output, Table* table,
uint32_t count, ...) {
+ va_list args;
+ va_start(args, count);
__get_stmt(table->count(m_db, count, args));
int res = SQLITE_OK;
- uint32_t param = 1;
- __bind_va_columns(count);
+ this->bind_va_columns(stmt, count, args);
*output = malloc(sizeof(uint64_t));
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, &stmt);
+ va_end(args);
return res;
}
int Database::get_value(const char* name, void** output, Table* table,
Column* value_column, uint32_t count, ...) {
+ va_list args;
+ va_start(args, count);
__get_stmt(table->get_column(m_db, value_column, count, args));
int res = SQLITE_OK;
- uint32_t param = 1;
- __bind_va_columns(count);
+ this->bind_va_columns(stmt, count, args);
uint32_t size = value_column->size();
*output = malloc(size);
res = this->step_once(stmt, (uint8_t*)*output, NULL);
sqlite3_reset(stmt);
cache_release_value(m_statement_cache, &stmt);
+ va_end(args);
return res;
}
int Database::get_column(const char* name, void** output, uint32_t* result_count,
Table* table, Column* column, uint32_t count, ...) {
+ va_list args;
+ va_start(args, count);
__get_stmt(table->get_column(m_db, column, count, args));
int res = SQLITE_OK;
- uint32_t param = 1;
- __bind_va_columns(count);
+ this->bind_va_columns(stmt, count, args);
uint32_t size = INITIAL_ROWS * column->size();
*output = malloc(size);
res = this->step_all(stmt, output, size, result_count);
sqlite3_reset(stmt);
cache_release_value(m_statement_cache, &stmt);
+ va_end(args);
return res;
}
int Database::get_row(const char* name, uint8_t** output, Table* table,
uint32_t count, ...) {
+ va_list args;
+ va_start(args, count);
__get_stmt(table->get_row(m_db, count, args));
int res = SQLITE_OK;
- uint32_t param = 1;
- __bind_va_columns(count);
+ this->bind_va_columns(stmt, count, args);
*output = table->alloc_result();
res = this->step_once(stmt, *output, NULL);
sqlite3_reset(stmt);
cache_release_value(m_statement_cache, &stmt);
+ va_end(args);
return res;
}
int Database::get_row_ordered(const char* name, uint8_t** output, Table* table,
Column* order_by, int order, uint32_t count, ...) {
+ va_list args;
+ va_start(args, count);
__get_stmt(table->get_row_ordered(m_db, order_by, order, count, args));
int res = SQLITE_OK;
- uint32_t param = 1;
- __bind_va_columns(count);
+ this->bind_va_columns(stmt, count, args);
*output = table->alloc_result();
res = this->step_once(stmt, *output, NULL);
sqlite3_reset(stmt);
cache_release_value(m_statement_cache, &stmt);
+ va_end(args);
return res;
}
int Database::get_all_ordered(const char* name, uint8_t*** output,
uint32_t* result_count, Table* table,
Column* order_by, int order, uint32_t count, ...) {
+ va_list args;
+ va_start(args, count);
__get_stmt(table->get_row_ordered(m_db, order_by, order, count, args));
int res = SQLITE_OK;
- uint32_t param = 1;
- __bind_va_columns(count);
+ this->bind_va_columns(stmt, count, args);
uint8_t* current = NULL;
*result_count = 0;
uint32_t output_max = INITIAL_ROWS;
@@ -334,14 +351,17 @@
sqlite3_reset(stmt);
cache_release_value(m_statement_cache, &stmt);
+ va_end(args);
return res;
}
int Database::update_value(const char* name, Table* table, Column* value_column,
void** value, uint32_t count, ...) {
+ va_list args;
+ va_start(args, count);
__get_stmt(table->update_value(m_db, value_column, count, args));
+ int param = 1;
int res = SQLITE_OK;
- uint32_t param = 1;
switch(value_column->type()) {
case TYPE_INTEGER:
res = sqlite3_bind_int64(stmt, param++, (uint64_t)*value);
@@ -361,19 +381,22 @@
value_column->type(), table->name());
return res;
}
- __bind_va_columns(count);
+ this->bind_columns(stmt, count, param, args);
res = sqlite3_step(stmt);
sqlite3_reset(stmt);
cache_release_value(m_statement_cache, &stmt);
+ va_end(args);
return (res == SQLITE_DONE ? SQLITE_OK : res);
}
int Database::del(const char* name, Table* table, uint32_t count, ...) {
+ va_list args;
+ va_start(args, count);
__get_stmt(table->del(m_db, count, args));
int res = SQLITE_OK;
- uint32_t param = 1;
- __bind_va_columns(count);
+ this->bind_va_columns(stmt, count, args);
if (res == SQLITE_OK) res = this->execute(stmt);
+ va_end(args);
return res;
}
@@ -389,6 +412,9 @@
*
*/
int Database::update(Table* table, uint64_t pkvalue, ...) {
+ va_list args;
+ va_start(args, pkvalue);
+
int res = SQLITE_OK;
// get the prepared statement
@@ -399,16 +425,22 @@
return 1;
}
- uint32_t param = 1; // counter to track placeholders in sql statement
- __bind_all_columns(pkvalue);
+ this->bind_all_columns(stmt, table, args);
// bind the primary key in the WHERE clause
- if (res==SQLITE_OK) res = sqlite3_bind_int64(stmt, param++, pkvalue);
+ // bind_all_columns already bound the first n'th params, where n in the
+ // table's column count, so we provide that count as the parameter value
+ if (res==SQLITE_OK) res = sqlite3_bind_int64(stmt, table->column_count(),
+ pkvalue);
if (res==SQLITE_OK) res = this->execute(stmt);
+ va_end(args);
return res;
}
int Database::insert(Table* table, ...) {
+ va_list args;
+ va_start(args, table);
+
int res = SQLITE_OK;
// get the prepared statement
sqlite3_stmt* stmt = table->insert(m_db);
@@ -417,13 +449,12 @@
"insert.\n", table->name());
return 1;
}
- uint32_t param = 1; // counter to track placeholders in sql statement
- __bind_all_columns(table);
+ this->bind_all_columns(stmt, table, args);
if (res == SQLITE_OK) res = this->execute(stmt);
+ va_end(args);
return res;
}
-#undef __bind_all_columns
#undef __get_stmt
int Database::del(Table* table, uint64_t serial) {
Modified: branches/PR-7489777/darwinup/Database.h
===================================================================
--- branches/PR-7489777/darwinup/Database.h 2010-02-24 18:50:56 UTC (rev 722)
+++ branches/PR-7489777/darwinup/Database.h 2010-02-24 22:45:25 UTC (rev 723)
@@ -180,8 +180,14 @@
bool is_empty();
int create_tables();
-
-
+ // bind all table columns from va_list
+ int bind_all_columns(sqlite3_stmt* stmt, Table* table, va_list args);
+ // bind each set of parameters from va_list
+ int bind_va_columns(sqlite3_stmt* stmt, uint32_t count, va_list args);
+ // bind parameters from va_list, starting with the param'th parameter in stmt
+ int bind_columns(sqlite3_stmt* stmt, uint32_t count, int param,
+ va_list args);
+
/**
* step and store functions
*/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/darwinbuild-changes/attachments/20100224/6fcfff26/attachment-0001.html>
More information about the darwinbuild-changes
mailing list