2 This file is part of GNUnet
3 Copyright (C) 2006, 2009, 2015 GNUnet e.V.
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
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 Affero General Public License for more details.
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
18 SPDX-License-Identifier: AGPL3.0-or-later
22 * @file datacache/plugin_datacache_template.c
23 * @brief template for an implementation of a database backend for the datacache
24 * @author Christian Grothoff
27 #include "gnunet_util_lib.h"
28 #include "gnunet_datacache_plugin.h"
32 * Context for all functions in this plugin.
36 * Our execution environment.
38 struct GNUNET_DATACACHE_PluginEnvironment *env;
43 * Store an item in the datastore.
45 * @param cls closure (our `struct Plugin`)
46 * @param key key to store @a data under
47 * @param xor_distance distance of @a key to our PID
48 * @param size number of bytes in @a data
49 * @param data data to store
50 * @param type type of the value
51 * @param discard_time when to discard the value in any case
52 * @param path_info_len number of entries in @a path_info
53 * @param path_info a path through the network
54 * @return 0 if duplicate, -1 on error, number of bytes used otherwise
57 template_plugin_put(void *cls,
58 const struct GNUNET_HashCode *key,
59 uint32_t xor_distance,
62 enum GNUNET_BLOCK_Type type,
63 struct GNUNET_TIME_Absolute discard_time,
64 unsigned int path_info_len,
65 const struct GNUNET_PeerIdentity *path_info)
73 * Iterate over the results for a particular key
76 * @param cls closure (our `struct Plugin`)
78 * @param type entries of which type are relevant?
79 * @param iter maybe NULL (to just count)
80 * @param iter_cls closure for @a iter
81 * @return the number of results found
84 template_plugin_get(void *cls,
85 const struct GNUNET_HashCode *key,
86 enum GNUNET_BLOCK_Type type,
87 GNUNET_DATACACHE_Iterator iter,
96 * Delete the entry with the lowest expiration value
97 * from the datacache right now.
99 * @param cls closure (our `struct Plugin`)
100 * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
103 template_plugin_del(void *cls)
106 return GNUNET_SYSERR;
111 * Return a random value from the datastore.
113 * @param cls closure (internal context for the plugin)
114 * @param iter maybe NULL (to just count)
115 * @param iter_cls closure for @a iter
116 * @return the number of results found (zero or one)
119 template_plugin_get_random(void *cls,
120 GNUNET_DATACACHE_Iterator iter,
130 * Iterate over the results that are "close" to a particular key in
131 * the datacache. "close" is defined as numerically larger than @a
132 * key (when interpreted as a circular address space), with small
135 * @param cls closure (internal context for the plugin)
136 * @param key area of the keyspace to look into
137 * @param num_results number of results that should be returned to @a iter
138 * @param iter maybe NULL (to just count)
139 * @param iter_cls closure for @a iter
140 * @return the number of results found
143 template_plugin_get_closest(void *cls,
144 const struct GNUNET_HashCode *key,
145 unsigned int num_results,
146 GNUNET_DATACACHE_Iterator iter,
155 * Entry point for the plugin.
157 * @param cls closure (the `struct GNUNET_DATACACHE_PluginEnvironmnet`)
158 * @return the plugin's closure (our `struct Plugin`)
161 libgnunet_plugin_datacache_template_init(void *cls)
163 struct GNUNET_DATACACHE_PluginEnvironment *env = cls;
164 struct GNUNET_DATACACHE_PluginFunctions *api;
165 struct Plugin *plugin;
167 plugin = GNUNET_new(struct Plugin);
169 api = GNUNET_new(struct GNUNET_DATACACHE_PluginFunctions);
171 api->get = &template_plugin_get;
172 api->put = &template_plugin_put;
173 api->del = &template_plugin_del;
174 api->get_random = &template_plugin_get_random;
175 api->get_closest = &template_plugin_get_closest;
176 GNUNET_log_from(GNUNET_ERROR_TYPE_INFO,
178 "Template datacache running\n");
184 * Exit point from the plugin.
186 * @param cls closure (our `struct Plugin`)
190 libgnunet_plugin_datacache_template_done(void *cls)
192 struct GNUNET_DATACACHE_PluginFunctions *api = cls;
193 struct Plugin *plugin = api->cls;
201 /* end of plugin_datacache_template.c */