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