missing check
[oweals/gnunet.git] / src / include / gnunet_namestore_plugin.h
1 /*
2      This file is part of GNUnet
3      (C) 2012, 2013 Christian Grothoff (and other contributing authors)
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., 59 Temple Place - Suite 330,
18      Boston, MA 02111-1307, USA.
19 */
20
21 /**
22  * @file include/gnunet_namestore_plugin.h
23  * @brief plugin API for the namestore database backend
24  * @author Christian Grothoff
25  */
26 #ifndef GNUNET_NAMESTORE_PLUGIN_H
27 #define GNUNET_NAMESTORE_PLUGIN_H
28
29 #include "gnunet_common.h"
30 #include "gnunet_util_lib.h"
31 #include "gnunet_namestore_service.h"
32
33 #ifdef __cplusplus
34 extern "C"
35 {
36 #if 0                           /* keep Emacsens' auto-indent happy */
37 }
38 #endif
39 #endif
40
41
42 /**
43  * Function called for matching blocks.
44  *
45  * @param cls closure
46  * @param block lookup result
47  */
48 typedef void (*GNUNET_NAMESTORE_BlockCallback) (void *cls,
49                                                 const struct GNUNET_NAMESTORE_Block *block);
50
51
52 /**
53  * Function called by for each matching record.
54  *
55  * @param cls closure
56  * @param zone_key private key of the zone
57  * @param label name that is being mapped (at most 255 characters long)
58  * @param rd_count number of entries in 'rd' array
59  * @param rd array of records with data to store
60  */
61 typedef void (*GNUNET_NAMESTORE_RecordIterator) (void *cls,
62                                                  const struct GNUNET_CRYPTO_EccPrivateKey *private_key,
63                                                  const char *label,
64                                                  unsigned int rd_count,
65                                                  const struct GNUNET_NAMESTORE_RecordData *rd);
66
67
68 /**
69  * @brief struct returned by the initialization function of the plugin
70  */
71 struct GNUNET_NAMESTORE_PluginFunctions
72 {
73
74   /**
75    * Closure to pass to all plugin functions.
76    */
77   void *cls;
78
79   /**
80    * Cache a block in the datastore. Overwrites existing blocks
81    * for the same zone and label.
82    *
83    * @param cls closure (internal context for the plugin)
84    * @param block block to cache
85    * @return #GNUNET_OK on success, else #GNUNET_SYSERR
86    */
87   int (*cache_block) (void *cls, 
88                       const struct GNUNET_NAMESTORE_Block *block);
89
90
91   /**
92    * Get the block for a particular zone and label in the
93    * datastore.  Will return at most one result to the iterator.
94    *
95    * @param cls closure (internal context for the plugin)
96    * @param query hash of public key derived from the zone and the label
97    * @param iter function to call with the result
98    * @param iter_cls closure for iter
99    * @return #GNUNET_OK on success, #GNUNET_NO if there were no results, #GNUNET_SYSERR on error
100    */
101   int (*lookup_block) (void *cls, 
102                        const struct GNUNET_HashCode *query,
103                        GNUNET_NAMESTORE_BlockCallback iter, void *iter_cls);
104
105
106
107   /**
108    * Store a record in the datastore for which we are the authority.
109    * Removes any existing record in the same zone with the same name.
110    *
111    * @param cls closure (internal context for the plugin)
112    * @param zone private key of the zone
113    * @param label name of the record in the zone
114    * @param rd_count number of entries in @a rd array, 0 to delete all records
115    * @param rd array of records with data to store
116    * @return #GNUNET_OK on success, else #GNUNET_SYSERR
117    */
118   int (*store_records) (void *cls, 
119                         const struct GNUNET_CRYPTO_EccPrivateKey *zone,
120                         const char *label,
121                         unsigned int rd_count,
122                         const struct GNUNET_NAMESTORE_RecordData *rd);
123
124
125   /**
126    * Iterate over the results for a particular zone in the
127    * datastore.  Will return at most one result to the iterator.
128    *
129    * @param cls closure (internal context for the plugin)
130    * @param zone private key of the zone
131    * @param offset offset in the list of all matching records
132    * @param iter function to call with the result
133    * @param iter_cls closure for iter
134    * @return #GNUNET_OK on success, #GNUNET_NO if there were no results, #GNUNET_SYSERR on error
135    */
136   int (*iterate_records) (void *cls, 
137                           const struct GNUNET_CRYPTO_EccPrivateKey *zone,
138                           uint64_t offset,
139                           GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls);
140
141
142   /**
143    * Look for an existing PKEY delegation record for a given public key.
144    * Returns at most one result to the iterator.
145    *
146    * @param cls closure (internal context for the plugin)
147    * @param zone private key of the zone to look up in, never NULL
148    * @param value_zone public key of the target zone (value), never NULL
149    * @param iter function to call with the result
150    * @param iter_cls closure for iter
151    * @return #GNUNET_OK on success, #GNUNET_NO if there were no results, #GNUNET_SYSERR on error
152    */
153   int (*zone_to_name) (void *cls, 
154                        const struct GNUNET_CRYPTO_EccPrivateKey *zone,
155                        const struct GNUNET_CRYPTO_EccPublicKey *value_zone,
156                        GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls);
157
158
159 };
160
161
162 #if 0                           /* keep Emacsens' auto-indent happy */
163 {
164 #endif
165 #ifdef __cplusplus
166 }
167 #endif
168
169 /* end of gnunet_namestore_plugin.h */
170 #endif