Move dumpdb over to using iterate_keys.
[onak.git] / keydb.h
1 /*
2  * keydb.h - Routines to store and fetch keys.
3  *
4  * Jonathan McDowell <noodles@earth.li>
5  *
6  * Copyright 2002-2004 Project Purple
7  */
8
9 #ifndef __KEYDB_H__
10 #define __KEYDB_H__
11
12 #include <inttypes.h>
13
14 #include "keystructs.h"
15 #include "ll.h"
16
17 /**
18  *      initdb - Initialize the key database.
19  *      @readonly: If we'll only be reading the DB, not writing to it.
20  *
21  *      This function should be called before any of the other functions in
22  *      this file are called in order to allow the DB to be initialized ready
23  *      for access.
24  */
25 void initdb(bool readonly);
26
27 /**
28  *      cleanupdb - De-initialize the key database.
29  *
30  *      This function should be called upon program exit to allow the DB to
31  *      cleanup after itself.
32  */
33 void cleanupdb(void);
34
35 /**
36  *      starttrans - Start a transaction.
37  *
38  *      Start a transaction. Intended to be used if we're about to perform many
39  *      operations on the database to help speed it all up, or if we want
40  *      something to only succeed if all relevant operations are successful.
41  */
42 bool starttrans(void);
43
44 /**
45  *      endtrans - End a transaction.
46  *
47  *      Ends a transaction.
48  */
49 void endtrans(void);
50
51 /**
52  *      fetch_key - Given a keyid fetch the key from storage.
53  *      @keyid: The keyid to fetch.
54  *      @publickey: A pointer to a structure to return the key in.
55  *      @intrans: If we're already in a transaction.
56  *
57  *      This function returns a public key from whatever storage mechanism we
58  *      are using.
59  *
60  *      TODO: What about keyid collisions? Should we use fingerprint instead?
61  */
62 int fetch_key(uint64_t keyid, struct openpgp_publickey **publickey, bool intrans);
63
64 /**
65  *      store_key - Takes a key and stores it.
66  *      @publickey: A pointer to the public key to store.
67  *      @intrans: If we're already in a transaction.
68  *      @update: If true the key exists and should be updated.
69  *
70  *      This function stores a public key in whatever storage mechanism we are
71  *      using. intrans indicates if we're already in a transaction so don't
72  *      need to start one. update indicates if the key already exists and is
73  *      just being updated.
74  *
75  *      TODO: Do we store multiple keys of the same id? Or only one and replace
76  *      it?
77  */
78 int store_key(struct openpgp_publickey *publickey, bool intrans, bool update);
79
80 /**
81  *      delete_key - Given a keyid delete the key from storage.
82  *      @keyid: The keyid to delete.
83  *      @intrans: If we're already in a transaction.
84  *
85  *      This function deletes a public key from whatever storage mechanism we
86  *      are using. Returns 0 if the key existed.
87  */
88 int delete_key(uint64_t keyid, bool intrans);
89
90 /**
91  *      fetch_key_text - Trys to find the keys that contain the supplied text.
92  *      @search: The text to search for.
93  *      @publickey: A pointer to a structure to return the key in.
94  *
95  *      This function searches for the supplied text and returns the keys that
96  *      contain it.
97  */
98 int fetch_key_text(const char *search, struct openpgp_publickey **publickey);
99
100 /**
101  *      update_keys - Takes a list of public keys and updates them in the DB.
102  *      @keys: The keys to update in the DB.
103  *      @sendsync: If we should send a keysync mail.
104  *
105  *      Takes a list of keys and adds them to the database, merging them with
106  *      the key in the database if it's already present there. The key list is
107  *      update to contain the minimum set of updates required to get from what
108  *      we had before to what we have now (ie the set of data that was added to
109  *      the DB). Returns the number of entirely new keys added.
110  *
111  *      If sendsync is true then we send out a keysync mail to our sync peers
112  *      with the update.
113  */
114 int update_keys(struct openpgp_publickey **keys, bool sendsync);
115
116 /**
117  *      keyid2uid - Takes a keyid and returns the primary UID for it.
118  *      @keyid: The keyid to lookup.
119  *
120  *      This function returns a UID for the given key. Returns NULL if the key
121  *      isn't found.
122  */
123 char *keyid2uid(uint64_t keyid);
124
125 /**
126  *      getkeysigs - Gets a linked list of the signatures on a key.
127  *      @keyid: The keyid to get the sigs for.
128  *      @revoked: Is the key revoked?
129  *
130  *      This function gets the list of signatures on a key. Used for key 
131  *      indexing and doing stats bits. If revoked is non-NULL then if the key
132  *      is revoked it's set to true.
133  */
134 struct ll *getkeysigs(uint64_t keyid, bool *revoked);
135
136 /**
137  *      cached_getkeysigs - Gets the signatures on a key.
138  *      @keyid: The key we want the signatures for.
139  *      
140  *      This function gets the signatures on a key. It's the same as the
141  *      getkeysigs function above except we use the hash module to cache the
142  */
143 struct ll *cached_getkeysigs(uint64_t keyid);
144
145 /**
146  *      getfullkeyid - Maps a 32bit key id to a 64bit one.
147  *      @keyid: The 32bit keyid.
148  *
149  *      This function maps a 32bit key id to the full 64bit one. It returns the
150  *      full keyid. If the key isn't found a keyid of 0 is returned.
151  */
152 uint64_t getfullkeyid(uint64_t keyid);
153
154 /**
155  *      iterate_keys - call a function once for each key in the db.
156  *      @iterfunc: The function to call.
157  *      @ctx: A context pointer
158  *
159  *      Calls iterfunc once for each key in the database. ctx is passed
160  *      unaltered to iterfunc. This function is intended to aid database dumps
161  *      and statistic calculations.
162  *
163  *      Returns the number of keys we iterated over.
164  */
165 int iterate_keys(void (*iterfunc)(void *ctx, struct openpgp_publickey *key),
166                 void *ctx);
167
168 #endif /* __KEYDB_H__ */