mirror of
git://git.gnupg.org/gnupg.git
synced 2024-12-22 10:19:57 +01:00
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:
parent
351f4213e1
commit
421827424f
11
g10/sqlite.c
11
g10/sqlite.c
@ -59,7 +59,7 @@ sqlite3_exec_printf (sqlite3 *db,
|
|||||||
int
|
int
|
||||||
sqlite3_stepx (sqlite3 *db,
|
sqlite3_stepx (sqlite3 *db,
|
||||||
sqlite3_stmt **stmtp,
|
sqlite3_stmt **stmtp,
|
||||||
int (*callback) (void*,int,char**,char**),
|
sqlite3_stepx_callback callback,
|
||||||
void *cookie,
|
void *cookie,
|
||||||
char **errmsg,
|
char **errmsg,
|
||||||
const char *sql, ...)
|
const char *sql, ...)
|
||||||
@ -150,6 +150,13 @@ sqlite3_stepx (sqlite3 *db,
|
|||||||
err = sqlite3_bind_text (stmt, i, text, -1, SQLITE_STATIC);
|
err = sqlite3_bind_text (stmt, i, text, -1, SQLITE_STATIC);
|
||||||
break;
|
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:
|
default:
|
||||||
/* Internal error. Likely corruption. */
|
/* Internal error. Likely corruption. */
|
||||||
log_fatal ("Bad value for parameter type %d.\n", t);
|
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. */
|
/* A non-zero result means to abort. */
|
||||||
{
|
{
|
||||||
err = SQLITE_ABORT;
|
err = SQLITE_ABORT;
|
||||||
|
20
g10/sqlite.h
20
g10/sqlite.h
@ -27,7 +27,10 @@ enum sqlite_arg_type
|
|||||||
SQLITE_ARG_END = 0xdead001,
|
SQLITE_ARG_END = 0xdead001,
|
||||||
SQLITE_ARG_INT,
|
SQLITE_ARG_INT,
|
||||||
SQLITE_ARG_LONG_LONG,
|
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,
|
char **errmsg,
|
||||||
const char *sql, ...);
|
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,
|
int sqlite3_stepx (sqlite3 *db,
|
||||||
sqlite3_stmt **stmtp,
|
sqlite3_stmt **stmtp,
|
||||||
int (*callback) (void*,int,char**,char**),
|
sqlite3_stepx_callback callback,
|
||||||
void *cookie,
|
void *cookie,
|
||||||
char **errmsg,
|
char **errmsg,
|
||||||
const char *sql, ...);
|
const char *sql, ...);
|
||||||
|
37
g10/tofu.c
37
g10/tofu.c
@ -418,6 +418,14 @@ get_single_unsigned_long_cb (void *cookie, int argc, char **argv,
|
|||||||
return 0;
|
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
|
/* We expect a single integer column whose name is "version". COOKIE
|
||||||
must point to an int. This function always aborts. On error or a
|
must point to an int. This function always aborts. On error or a
|
||||||
if the version is bad, sets *VERSION to -1. */
|
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;
|
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)
|
/* Record (or update) a trust policy about a (possibly new)
|
||||||
binding.
|
binding.
|
||||||
@ -1109,7 +1124,7 @@ record_binding (struct dbs *dbs, const char *fingerprint, const char *email,
|
|||||||
{
|
{
|
||||||
rc = sqlite3_stepx
|
rc = sqlite3_stepx
|
||||||
(db_email->db, &db_email->s.record_binding_get_old_policy,
|
(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 = ?",
|
"select policy from bindings where fingerprint = ? and email = ?",
|
||||||
SQLITE_ARG_STRING, fingerprint, SQLITE_ARG_STRING, email,
|
SQLITE_ARG_STRING, fingerprint, SQLITE_ARG_STRING, email,
|
||||||
SQLITE_ARG_END);
|
SQLITE_ARG_END);
|
||||||
@ -1261,6 +1276,15 @@ strings_collect_cb (void *cookie, int argc, char **argv, char **azColName)
|
|||||||
return 0;
|
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
|
/* Auxiliary data structure to collect statistics about
|
||||||
signatures. */
|
signatures. */
|
||||||
struct signature_stats
|
struct signature_stats
|
||||||
@ -1316,7 +1340,7 @@ signature_stats_prepend (struct signature_stats **statsp,
|
|||||||
<fingerprint, policy, time ago, count>. */
|
<fingerprint, policy, time ago, count>. */
|
||||||
static int
|
static int
|
||||||
signature_stats_collect_cb (void *cookie, int argc, char **argv,
|
signature_stats_collect_cb (void *cookie, int argc, char **argv,
|
||||||
char **azColName)
|
char **azColName, sqlite3_stmt *stmt)
|
||||||
{
|
{
|
||||||
struct signature_stats **statsp = cookie;
|
struct signature_stats **statsp = cookie;
|
||||||
char *tail;
|
char *tail;
|
||||||
@ -1326,6 +1350,7 @@ signature_stats_collect_cb (void *cookie, int argc, char **argv,
|
|||||||
unsigned long count;
|
unsigned long count;
|
||||||
|
|
||||||
(void) azColName;
|
(void) azColName;
|
||||||
|
(void) stmt;
|
||||||
|
|
||||||
i ++;
|
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
|
still TOFU_POLICY_NONE after executing the query, then the
|
||||||
result set was empty.) */
|
result set was empty.) */
|
||||||
rc = sqlite3_stepx (db->db, &db->s.get_policy_select_policy_and_conflict,
|
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"
|
"select policy, conflict from bindings\n"
|
||||||
" where fingerprint = ? and email = ?",
|
" where fingerprint = ? and email = ?",
|
||||||
SQLITE_ARG_STRING, fingerprint,
|
SQLITE_ARG_STRING, fingerprint,
|
||||||
@ -1692,7 +1717,7 @@ get_trust (struct dbs *dbs, const char *fingerprint, const char *email,
|
|||||||
a new binding. */
|
a new binding. */
|
||||||
rc = sqlite3_stepx
|
rc = sqlite3_stepx
|
||||||
(db->db, &db->s.get_trust_bindings_with_this_email,
|
(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 = ?;",
|
"select distinct fingerprint from bindings where email = ?;",
|
||||||
SQLITE_ARG_STRING, email, SQLITE_ARG_END);
|
SQLITE_ARG_STRING, email, SQLITE_ARG_END);
|
||||||
if (rc)
|
if (rc)
|
||||||
@ -1835,7 +1860,7 @@ get_trust (struct dbs *dbs, const char *fingerprint, const char *email,
|
|||||||
{
|
{
|
||||||
rc = sqlite3_stepx
|
rc = sqlite3_stepx
|
||||||
(db_key->db, &db_key->s.get_trust_gather_other_user_ids,
|
(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
|
opt.tofu_db_format == TOFU_DB_SPLIT
|
||||||
? "select user_id, email from bindings where fingerprint = ?;"
|
? "select user_id, email from bindings where fingerprint = ?;"
|
||||||
: "select user_id, policy 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. */
|
it again. */
|
||||||
rc = sqlite3_stepx
|
rc = sqlite3_stepx
|
||||||
(db->db, &db->s.register_already_seen,
|
(db->db, &db->s.register_already_seen,
|
||||||
get_single_unsigned_long_cb, &c, &err,
|
get_single_unsigned_long_cb2, &c, &err,
|
||||||
"select count (*)\n"
|
"select count (*)\n"
|
||||||
" from signatures left join bindings\n"
|
" from signatures left join bindings\n"
|
||||||
" on signatures.binding = bindings.oid\n"
|
" on signatures.binding = bindings.oid\n"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user