gpg: Change sqlite3_stepx to pass the sqlite3_stmt * to the callback.

* g10/sqlite.h (enum sqlite_arg_type): Add SQLITE_ARG_BLOB.
(sqlite3_stepx_callback): New declaration.
(sqlite3_stepx): Change the callback's type to sqlite3_stepx_callback,
which passes an additional parameter, the sqlite3_stmt *.  Update
users.

--
Signed-off-by: Neal H. Walfield <neal@g10code.com>
This commit is contained in:
Neal H. Walfield 2015-10-29 09:36:36 +01:00
parent 351f4213e1
commit 421827424f
3 changed files with 58 additions and 10 deletions

View File

@ -59,7 +59,7 @@ sqlite3_exec_printf (sqlite3 *db,
int
sqlite3_stepx (sqlite3 *db,
sqlite3_stmt **stmtp,
int (*callback) (void*,int,char**,char**),
sqlite3_stepx_callback callback,
void *cookie,
char **errmsg,
const char *sql, ...)
@ -150,6 +150,13 @@ sqlite3_stepx (sqlite3 *db,
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);
@ -201,7 +208,7 @@ sqlite3_stepx (sqlite3 *db,
}
}
if (callback (cookie, cols, (char **) azVals, (char **) azColName))
if (callback (cookie, cols, (char **) azVals, (char **) azColName, stmt))
/* A non-zero result means to abort. */
{
err = SQLITE_ABORT;

View File

@ -27,7 +27,10 @@ enum sqlite_arg_type
SQLITE_ARG_END = 0xdead001,
SQLITE_ARG_INT,
SQLITE_ARG_LONG_LONG,
SQLITE_ARG_STRING
SQLITE_ARG_STRING,
/* This takes two arguments: the blob as a void * and the length
of the blob as a long long. */
SQLITE_ARG_BLOB
};
@ -36,9 +39,22 @@ int sqlite3_exec_printf (sqlite3 *db,
char **errmsg,
const char *sql, ...);
typedef int (*sqlite3_stepx_callback) (void *cookie,
/* number of columns. */
int cols,
/* columns as text. */
char **values,
/* column names. */
char **names,
/* The prepared statement so
that it is possible to use
something like
sqlite3_column_blob(). */
sqlite3_stmt *statement);
int sqlite3_stepx (sqlite3 *db,
sqlite3_stmt **stmtp,
int (*callback) (void*,int,char**,char**),
sqlite3_stepx_callback callback,
void *cookie,
char **errmsg,
const char *sql, ...);

View File

@ -418,6 +418,14 @@ get_single_unsigned_long_cb (void *cookie, int argc, char **argv,
return 0;
}
static int
get_single_unsigned_long_cb2 (void *cookie, int argc, char **argv,
char **azColName, sqlite3_stmt *stmt)
{
(void) stmt;
return get_single_unsigned_long_cb (cookie, argc, argv, azColName);
}
/* We expect a single integer column whose name is "version". COOKIE
must point to an int. This function always aborts. On error or a
if the version is bad, sets *VERSION to -1. */
@ -1050,6 +1058,13 @@ get_single_long_cb (void *cookie, int argc, char **argv, char **azColName)
return 0;
}
static int
get_single_long_cb2 (void *cookie, int argc, char **argv, char **azColName,
sqlite3_stmt *stmt)
{
(void) stmt;
return get_single_long_cb (cookie, argc, argv, azColName);
}
/* Record (or update) a trust policy about a (possibly new)
binding.
@ -1109,7 +1124,7 @@ record_binding (struct dbs *dbs, const char *fingerprint, const char *email,
{
rc = sqlite3_stepx
(db_email->db, &db_email->s.record_binding_get_old_policy,
get_single_long_cb, &policy_old, &err,
get_single_long_cb2, &policy_old, &err,
"select policy from bindings where fingerprint = ? and email = ?",
SQLITE_ARG_STRING, fingerprint, SQLITE_ARG_STRING, email,
SQLITE_ARG_END);
@ -1261,6 +1276,15 @@ strings_collect_cb (void *cookie, int argc, char **argv, char **azColName)
return 0;
}
static int
strings_collect_cb2 (void *cookie, int argc, char **argv, char **azColName,
sqlite3_stmt *stmt)
{
(void) stmt;
return strings_collect_cb (cookie, argc, argv, azColName);
}
/* Auxiliary data structure to collect statistics about
signatures. */
struct signature_stats
@ -1316,7 +1340,7 @@ signature_stats_prepend (struct signature_stats **statsp,
<fingerprint, policy, time ago, count>. */
static int
signature_stats_collect_cb (void *cookie, int argc, char **argv,
char **azColName)
char **azColName, sqlite3_stmt *stmt)
{
struct signature_stats **statsp = cookie;
char *tail;
@ -1326,6 +1350,7 @@ signature_stats_collect_cb (void *cookie, int argc, char **argv,
unsigned long count;
(void) azColName;
(void) stmt;
i ++;
@ -1447,7 +1472,7 @@ get_policy (struct dbs *dbs, const char *fingerprint, const char *email,
still TOFU_POLICY_NONE after executing the query, then the
result set was empty.) */
rc = sqlite3_stepx (db->db, &db->s.get_policy_select_policy_and_conflict,
strings_collect_cb, &strlist, &err,
strings_collect_cb2, &strlist, &err,
"select policy, conflict from bindings\n"
" where fingerprint = ? and email = ?",
SQLITE_ARG_STRING, fingerprint,
@ -1692,7 +1717,7 @@ get_trust (struct dbs *dbs, const char *fingerprint, const char *email,
a new binding. */
rc = sqlite3_stepx
(db->db, &db->s.get_trust_bindings_with_this_email,
strings_collect_cb, &bindings_with_this_email, &err,
strings_collect_cb2, &bindings_with_this_email, &err,
"select distinct fingerprint from bindings where email = ?;",
SQLITE_ARG_STRING, email, SQLITE_ARG_END);
if (rc)
@ -1835,7 +1860,7 @@ get_trust (struct dbs *dbs, const char *fingerprint, const char *email,
{
rc = sqlite3_stepx
(db_key->db, &db_key->s.get_trust_gather_other_user_ids,
strings_collect_cb, &other_user_ids, &err,
strings_collect_cb2, &other_user_ids, &err,
opt.tofu_db_format == TOFU_DB_SPLIT
? "select user_id, email from bindings where fingerprint = ?;"
: "select user_id, policy from bindings where fingerprint = ?;",
@ -2519,7 +2544,7 @@ tofu_register (const byte *fingerprint_bin, const char *user_id,
it again. */
rc = sqlite3_stepx
(db->db, &db->s.register_already_seen,
get_single_unsigned_long_cb, &c, &err,
get_single_unsigned_long_cb2, &c, &err,
"select count (*)\n"
" from signatures left join bindings\n"
" on signatures.binding = bindings.oid\n"