diff options
Diffstat (limited to '')
-rw-r--r-- | g10/tofu.c | 224 |
1 files changed, 1 insertions, 223 deletions
diff --git a/g10/tofu.c b/g10/tofu.c index 43a6224a8..905010c2f 100644 --- a/g10/tofu.c +++ b/g10/tofu.c @@ -40,6 +40,7 @@ #include "i18n.h" #include "trustdb.h" #include "mkdir_p.h" +#include "sqlite.h" #include "tofu.h" @@ -213,229 +214,6 @@ tofu_policy_to_trust_level (enum tofu_policy policy) return 0; } } - -/* This is a convenience function that combines sqlite3_mprintf and - sqlite3_exec. */ -static int -sqlite3_exec_printf (sqlite3 *db, - int (*callback)(void*,int,char**,char**), void *cookie, - char **errmsg, - const char *sql, ...) -{ - va_list ap; - int rc; - char *sql2; - - va_start (ap, sql); - sql2 = sqlite3_vmprintf (sql, ap); - va_end (ap); - -#if 0 - log_debug ("tofo db: executing: '%s'\n", sql2); -#endif - - rc = sqlite3_exec (db, sql2, callback, cookie, errmsg); - - sqlite3_free (sql2); - - return rc; -} - -enum sqlite_arg_type - { - SQLITE_ARG_END = 0xdead001, - SQLITE_ARG_INT, - SQLITE_ARG_LONG_LONG, - SQLITE_ARG_STRING - }; - -static int -sqlite3_stepx (sqlite3 *db, - sqlite3_stmt **stmtp, - int (*callback) (void*,int,char**,char**), - void *cookie, - char **errmsg, - const char *sql, ...) -{ - int rc; - int err = 0; - sqlite3_stmt *stmt = NULL; - - va_list va; - int args; - enum sqlite_arg_type t; - int i; - - int cols; - /* Names of the columns. We initialize this lazily to avoid the - overhead in case the query doesn't return any results. */ - const char **azColName = 0; - int callback_initialized = 0; - - const char **azVals = 0; - - callback_initialized = 0; - - if (stmtp && *stmtp) - { - stmt = *stmtp; - - /* Make sure this statement is associated with the supplied db. */ - assert (db == sqlite3_db_handle (stmt)); - -#if DEBUG_TOFU_CACHE - prepares_saved ++; -#endif - } - else - { - const char *tail = NULL; - - rc = sqlite3_prepare_v2 (db, sql, -1, &stmt, &tail); - if (rc) - log_fatal ("failed to prepare SQL: %s", sql); - - /* We can only process a single statement. */ - if (tail) - { - while (*tail == ' ' || *tail == ';') - tail ++; - - if (*tail) - log_fatal - ("sqlite3_stepx can only process a single SQL statement." - " Second statement starts with: '%s'\n", - tail); - } - - if (stmtp) - *stmtp = stmt; - } - -#if DEBUG_TOFU_CACHE - queries ++; -#endif - - args = sqlite3_bind_parameter_count (stmt); - va_start (va, sql); - if (args) - { - for (i = 1; i <= args; i ++) - { - t = va_arg (va, enum sqlite_arg_type); - switch (t) - { - case SQLITE_ARG_INT: - { - int value = va_arg (va, int); - err = sqlite3_bind_int (stmt, i, value); - break; - } - case SQLITE_ARG_LONG_LONG: - { - long long value = va_arg (va, long long); - err = sqlite3_bind_int64 (stmt, i, value); - break; - } - case SQLITE_ARG_STRING: - { - char *text = va_arg (va, char *); - err = sqlite3_bind_text (stmt, i, text, -1, SQLITE_STATIC); - break; - } - default: - /* Internal error. Likely corruption. */ - log_fatal ("Bad value for parameter type %d.\n", t); - } - - if (err) - { - log_fatal ("Error binding parameter %d\n", i); - goto out; - } - } - - } - t = va_arg (va, enum sqlite_arg_type); - assert (t == SQLITE_ARG_END); - va_end (va); - - for (;;) - { - rc = sqlite3_step (stmt); - - if (rc != SQLITE_ROW) - /* No more data (SQLITE_DONE) or an error occured. */ - break; - - if (! callback) - continue; - - if (! callback_initialized) - { - cols = sqlite3_column_count (stmt); - azColName = xmalloc (2 * cols * sizeof (const char *) + 1); - - for (i = 0; i < cols; i ++) - azColName[i] = sqlite3_column_name (stmt, i); - - callback_initialized = 1; - } - - azVals = &azColName[cols]; - for (i = 0; i < cols; i ++) - { - azVals[i] = sqlite3_column_text (stmt, i); - if (! azVals[i] && sqlite3_column_type (stmt, i) != SQLITE_NULL) - /* Out of memory. */ - { - err = SQLITE_NOMEM; - break; - } - } - - if (callback (cookie, cols, (char **) azVals, (char **) azColName)) - /* A non-zero result means to abort. */ - { - err = SQLITE_ABORT; - break; - } - } - - out: - xfree (azColName); - - if (stmtp) - rc = sqlite3_reset (stmt); - else - rc = sqlite3_finalize (stmt); - if (rc == SQLITE_OK && err) - /* Local error. */ - { - rc = err; - if (errmsg) - { - const char *e = sqlite3_errstr (err); - size_t l = strlen (e) + 1; - *errmsg = sqlite3_malloc (l); - if (! *errmsg) - log_fatal ("Out of memory.\n"); - memcpy (*errmsg, e, l); - } - } - else if (rc != SQLITE_OK && errmsg) - /* Error reported by sqlite. */ - { - const char * e = sqlite3_errmsg (db); - size_t l = strlen (e) + 1; - *errmsg = sqlite3_malloc (l); - if (! *errmsg) - log_fatal ("Out of memory.\n"); - memcpy (*errmsg, e, l); - } - - return rc; -} static int batch_update; static time_t batch_update_started; |