aboutsummaryrefslogtreecommitdiffstats
path: root/g10/sqlite.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2016-05-21 18:06:59 +0000
committerWerner Koch <[email protected]>2016-05-21 18:06:59 +0000
commitb1ba460d8f3358342c2ee2927114d36e767a439f (patch)
tree6f6e61e8b8ac5dcff7b1f3bb8dbc4feae8fe21d8 /g10/sqlite.c
parentgpg: Explicitly close a combined Tofu DB. (diff)
downloadgnupg-b1ba460d8f3358342c2ee2927114d36e767a439f.tar.gz
gnupg-b1ba460d8f3358342c2ee2927114d36e767a439f.zip
gpg: Avoid name spaces clash with future sqlite versions.
* g10/sqlite.c: Rename to gpgsql.c. Change function prefixes to gpgsql_. * g10/sqlite.h: Rename to gpgsql.h. * g10/tofu.c: Adjust for changes. -- We used for our own extensions symbols with an sqlite_ names prefix. This may in theory lead to duplicated symbols but more important, it is harder to understand what is from gpg and what is from libsqlite. Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'g10/sqlite.c')
-rw-r--r--g10/sqlite.c251
1 files changed, 0 insertions, 251 deletions
diff --git a/g10/sqlite.c b/g10/sqlite.c
deleted file mode 100644
index 90490c297..000000000
--- a/g10/sqlite.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/* sqlite.c - SQLite helper functions.
- * Copyright (C) 2015 g10 Code GmbH
- *
- * This file is part of GnuPG.
- *
- * GnuPG is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * GnuPG is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <config.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "gpg.h"
-#include "util.h"
-#include "logging.h"
-
-#include "sqlite.h"
-
-/* This is a convenience function that combines sqlite3_mprintf and
- sqlite3_exec. */
-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;
-}
-
-int
-sqlite3_stepx (sqlite3 *db,
- sqlite3_stmt **stmtp,
- sqlite3_stepx_callback callback,
- 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. */
- log_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 == '\n')
- 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;
- }
- case SQLITE_ARG_BLOB:
- {
- char *blob = va_arg (va, void *);
- long long length = va_arg (va, long long);
- err = sqlite3_bind_blob (stmt, i, blob, length, 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);
- log_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 occurred. */
- 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, stmt))
- /* 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;
-}