-rps: logging
[oweals/gnunet.git] / src / include / gnunet_peerstore_service.h
1 /*
2       This file is part of GNUnet
3       Copyright (C)
4
5       GNUnet is free software; you can redistribute it and/or modify
6       it under the terms of the GNU General Public License as published
7       by the Free Software Foundation; either version 3, or (at your
8       option) any later version.
9
10       GNUnet is distributed in the hope that it will be useful, but
11       WITHOUT ANY WARRANTY; without even the implied warranty of
12       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13       General Public License for more details.
14
15       You should have received a copy of the GNU General Public License
16       along with GNUnet; see the file COPYING.  If not, write to the
17       Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18       Boston, MA 02110-1301, USA.
19  */
20
21 /**
22  * @author Omar Tarabai
23  *
24  * @file
25  * API to the peerstore service
26  *
27  * @defgroup peerstore  Peer Store service
28  *
29  * @see [Documentation](https://gnunet.org/gnunets-peerstore-subsystem)
30  *
31  * @{
32  */
33 #ifndef GNUNET_PEERSTORE_SERVICE_H
34 #define GNUNET_PEERSTORE_SERVICE_H
35
36 #include "gnunet_util_lib.h"
37 #include "gnunet_common.h"
38
39 #ifdef __cplusplus
40 extern "C"
41 {
42 #if 0                           /* keep Emacsens' auto-indent happy */
43 }
44 #endif
45 #endif
46
47 /**
48  * Options for storing values in PEERSTORE
49  */
50 enum GNUNET_PEERSTORE_StoreOption
51 {
52
53   /**
54    * Possibly store multiple values under given key.
55    */
56   GNUNET_PEERSTORE_STOREOPTION_MULTIPLE = 0,
57
58   /**
59    * Delete any previous values for the given key before
60    * storing the given value.
61    */
62   GNUNET_PEERSTORE_STOREOPTION_REPLACE = 1
63
64 };
65
66 /**
67  * Handle to the peerstore service.
68  */
69 struct GNUNET_PEERSTORE_Handle;
70
71 /**
72  * Context for a store request
73  */
74 struct GNUNET_PEERSTORE_StoreContext;
75
76 /**
77  * Single PEERSTORE record
78  */
79 struct GNUNET_PEERSTORE_Record
80 {
81
82   /**
83    * Responsible sub system string
84    */
85   char *sub_system;
86
87   /**
88    * Peer Identity
89    */
90   struct GNUNET_PeerIdentity *peer;
91
92   /**
93    * Record key string
94    */
95   char *key;
96
97   /**
98    * Record value BLOB
99    */
100   void *value;
101
102   /**
103    * Size of @e value BLOB
104    */
105   size_t value_size;
106
107   /**
108    * Expiry time of entry
109    */
110   struct GNUNET_TIME_Absolute *expiry;
111
112   /**
113    * Client from which this record originated
114    */
115   struct GNUNET_SERVER_Client *client;
116 };
117
118
119 /**
120  * Continuation called with a status result.
121  *
122  * @param cls closure
123  * @param success #GNUNET_OK or #GNUNET_SYSERR
124  */
125 typedef void
126 (*GNUNET_PEERSTORE_Continuation)(void *cls,
127                                  int success);
128
129
130 /**
131  * Function called by PEERSTORE for each matching record.
132  *
133  * @param cls closure
134  * @param record peerstore record information
135  * @param emsg error message, or NULL if no errors
136  * @return #GNUNET_YES to continue iterating, #GNUNET_NO to stop
137  */
138 typedef int
139 (*GNUNET_PEERSTORE_Processor) (void *cls,
140                                const struct GNUNET_PEERSTORE_Record *record,
141                                const char *emsg);
142
143 /**
144  * Connect to the PEERSTORE service.
145  *
146  * @return NULL on error
147  */
148 struct GNUNET_PEERSTORE_Handle *
149 GNUNET_PEERSTORE_connect (const struct GNUNET_CONFIGURATION_Handle *cfg);
150
151
152 /**
153  * Disconnect from the PEERSTORE service. Any pending ITERATE and WATCH requests
154  * will be canceled.
155  * Any pending STORE requests will depend on @e snyc_first flag.
156  *
157  * @param h handle to disconnect
158  * @param sync_first send any pending STORE requests before disconnecting
159  */
160 void
161 GNUNET_PEERSTORE_disconnect (struct GNUNET_PEERSTORE_Handle *h,
162                              int sync_first);
163
164
165 /**
166  * Store a new entry in the PEERSTORE.
167  * Note that stored entries can be lost in some cases
168  * such as power failure.
169  *
170  * @param h Handle to the PEERSTORE service
171  * @param sub_system name of the sub system
172  * @param peer Peer Identity
173  * @param key entry key
174  * @param value entry value BLOB
175  * @param size size of @e value
176  * @param expiry absolute time after which the entry is (possibly) deleted
177  * @param options options specific to the storage operation
178  * @param cont Continuation function after the store request is sent
179  * @param cont_cls Closure for @a cont
180  */
181 struct GNUNET_PEERSTORE_StoreContext *
182 GNUNET_PEERSTORE_store (struct GNUNET_PEERSTORE_Handle *h,
183                         const char *sub_system,
184                         const struct GNUNET_PeerIdentity *peer,
185                         const char *key,
186                         const void *value,
187                         size_t size,
188                         struct GNUNET_TIME_Absolute expiry,
189                         enum GNUNET_PEERSTORE_StoreOption options,
190                         GNUNET_PEERSTORE_Continuation cont,
191                         void *cont_cls);
192
193
194 /**
195  * Cancel a store request
196  *
197  * @param sc Store request context
198  */
199 void
200 GNUNET_PEERSTORE_store_cancel (struct GNUNET_PEERSTORE_StoreContext *sc);
201
202
203 /**
204  * Iterate over records matching supplied key information
205  *
206  * @param h handle to the PEERSTORE service
207  * @param sub_system name of sub system
208  * @param peer Peer identity (can be NULL)
209  * @param key entry key string (can be NULL)
210  * @param timeout time after which the iterate request is canceled
211  * @param callback function called with each matching record, all NULL's on end
212  * @param callback_cls closure for @a callback
213  */
214 struct GNUNET_PEERSTORE_IterateContext *
215 GNUNET_PEERSTORE_iterate (struct GNUNET_PEERSTORE_Handle *h,
216                           const char *sub_system,
217                           const struct GNUNET_PeerIdentity *peer,
218                           const char *key,
219                           struct GNUNET_TIME_Relative timeout,
220                           GNUNET_PEERSTORE_Processor callback,
221                           void *callback_cls);
222
223
224 /**
225  * Cancel an iterate request
226  * Please do not call after the iterate request is done
227  *
228  * @param ic Iterate request context as returned by GNUNET_PEERSTORE_iterate()
229  */
230 void
231 GNUNET_PEERSTORE_iterate_cancel (struct GNUNET_PEERSTORE_IterateContext *ic);
232
233
234 /**
235  * Request watching a given key
236  * User will be notified with any new values added to key.
237  *
238  * @param h handle to the PEERSTORE service
239  * @param sub_system name of sub system
240  * @param peer Peer identity
241  * @param key entry key string
242  * @param callback function called with each new value
243  * @param callback_cls closure for @a callback
244  * @return Handle to watch request
245  */
246 struct GNUNET_PEERSTORE_WatchContext *
247 GNUNET_PEERSTORE_watch (struct GNUNET_PEERSTORE_Handle *h,
248                         const char *sub_system,
249                         const struct GNUNET_PeerIdentity *peer,
250                         const char *key,
251                         GNUNET_PEERSTORE_Processor callback,
252                         void *callback_cls);
253
254
255 /**
256  * Cancel a watch request
257  *
258  * @param wc handle to the watch request
259  */
260 void
261 GNUNET_PEERSTORE_watch_cancel (struct GNUNET_PEERSTORE_WatchContext *wc);
262
263
264 #if 0                           /* keep Emacsens' auto-indent happy */
265 {
266 #endif
267 #ifdef __cplusplus
268 }
269 #endif
270
271 #endif
272
273 /** @} */  /* end of group */