X-Git-Url: http://the.earth.li/gitweb/?a=blobdiff_plain;f=keydb_pg.c;h=5933c91381647f4fb837c3de4ea859aafb9d59f9;hb=ec6d9d2d119c9b215103c13bcc5b9b44bd24b997;hp=8d974fd6d0f4122c334b3c74d0ea2ebf6235fda3;hpb=0a3cfdec02106998006653f8ad340e996261a3d5;p=onak.git diff --git a/keydb_pg.c b/keydb_pg.c index 8d974fd..5933c91 100644 --- a/keydb_pg.c +++ b/keydb_pg.c @@ -3,9 +3,7 @@ * * Jonathan McDowell * - * Copyright 2002 Project Purple - * - * $Id: keydb_pg.c,v 1.14 2004/03/23 12:33:47 noodles Exp $ + * Copyright 2002-2004 Project Purple */ #include @@ -570,22 +568,67 @@ struct ll *getkeysigs(uint64_t keyid, bool *revoked) } /** - * dumpdb - dump the key database - * @filenamebase: The base filename to use for the dump. + * iterate_keys - call a function once for each key in the db. + * @iterfunc: The function to call. + * @ctx: A context pointer + * + * Calls iterfunc once for each key in the database. ctx is passed + * unaltered to iterfunc. This function is intended to aid database dumps + * and statistic calculations. * - * Dumps the database into one or more files, which contain pure OpenPGP - * that can be reimported into onak or gpg. filenamebase provides a base - * file name for the dump; several files may be created, all of which will - * begin with this string and then have a unique number and a .pgp - * extension. - * */ -int dumpdb(char *filenamebase) + * Returns the number of keys we iterated over. + */ +int iterate_keys(void (*iterfunc)(void *ctx, struct openpgp_publickey *key), + void *ctx) { - return 0; + struct openpgp_packet_list *packets = NULL; + struct openpgp_publickey *key = NULL; + PGresult *result = NULL; + char *oids = NULL; + char statement[1024]; + int fd = -1; + int i = 0; + int numkeys = 0; + Oid key_oid; + + result = PQexec(dbconn, "SELECT keydata FROM onak_keys;"); + + if (PQresultStatus(result) == PGRES_TUPLES_OK) { + numkeys = PQntuples(result); + for (i = 0; i < numkeys; i++) { + oids = PQgetvalue(result, i, 0); + key_oid = (Oid) atoi(oids); + + fd = lo_open(dbconn, key_oid, INV_READ); + if (fd < 0) { + logthing(LOGTHING_ERROR, + "Can't open large object."); + } else { + read_openpgp_stream(keydb_fetchchar, &fd, + &packets, 0); + parse_keys(packets, key); + lo_close(dbconn, fd); + + iterfunc(ctx, key); + + free_publickey(key); + key = NULL; + free_packet_list(packets); + packets = NULL; + } + } + } else if (PQresultStatus(result) != PGRES_TUPLES_OK) { + logthing(LOGTHING_ERROR, "Problem retrieving key from DB."); + } + + PQclear(result); + + return (numkeys); } /* * Include the basic keydb routines. */ #define NEED_GETFULLKEYID 1 +#define NEED_UPDATEKEYS 1 #include "keydb.c"