function result helper rewritten
[oweals/gnunet.git] / src / include / gnunet_my_lib.h
1 /*
2      This file is part of GNUnet
3      Copyright (C) 2012 GNUnet e.V.
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  * @author Christian Grothoff
22  *
23  * @file
24  * Helper library to access a MySQL database
25  *
26  * @defgroup mysql  MySQL library
27  * Helper library to access a MySQL database.
28  * @{
29  */
30 #ifndef GNUNET_MY_LIB_H
31 #define GNUNET_MY_LIB_H
32
33 #include "gnunet_util_lib.h"
34 #include "gnunet_mysql_lib.h"
35 #include <mysql/mysql.h>
36
37 #ifdef __cplusplus
38 extern "C"
39 {
40 #if 0                           /* keep Emacsens' auto-indent happy */
41 }
42 #endif
43 #endif
44
45
46
47 /**
48  * Information we pass to #GNUNET_MY_exec_prepared() to
49  * initialize the arguments of the prepared statement.
50  */
51 struct GNUNET_MY_QueryParam;
52
53
54 /**
55  * Function called to convert input argument into SQL parameters.
56  *
57  * @param cls closure
58  * @param pq data about the query
59  * @param qbind array of parameters to initialize
60  * @return -1 on error
61  */
62 typedef int
63 (*GNUNET_MY_QueryConverter)(void *cls,
64                             const struct GNUNET_MY_QueryParam *qp,
65                             MYSQL_BIND *qbind);
66
67
68 /**
69  * Information we pass to #GNUNET_MY_exec_prepared() to
70  * initialize the arguments of the prepared statement.
71  */
72 struct GNUNET_MY_QueryParam
73 {
74
75   /**
76    * Function to call for the type conversion.
77    */
78   GNUNET_MY_QueryConverter conv;
79
80   /**
81    * Closure for @e conv.
82    */
83   void *conv_cls;
84
85   /**
86    * Number of arguments the @a conv converter expects to initialize.
87    */
88   unsigned int num_params;
89
90   /**
91    * Information to pass to @e conv.
92    */
93   const void *data;
94
95   /**
96    * Information to pass to @e conv.  Size of @a data.
97    */
98   unsigned long data_len ;
99
100 };
101
102
103 /**
104  * End of query parameter specification.
105  *
106  * @return array last entry for the result specification to use
107  */
108 #define GNUNET_MY_query_param_end { NULL, NULL, 0, NULL, 0 }
109
110
111
112 /**
113  * Generate query parameter for a buffer @a ptr of
114  * @a ptr_size bytes.
115  *
116  * @param ptr pointer to the query parameter to pass
117  * @oaran ptr_size number of bytes in @a ptr
118  */
119 struct GNUNET_MY_QueryParam
120 GNUNET_MY_query_param_fixed_size (const void *ptr,
121                                   size_t ptr_size);
122
123 /**
124  * Run a prepared SELECT statement.
125  *
126  * @param mc mysql context
127  * @param sh handle to SELECT statment
128  * @param params parameters to the statement
129  * @return TBD
130  */
131 int
132 GNUNET_MY_exec_prepared (struct GNUNET_MYSQL_Context *mc,
133                          struct GNUNET_MYSQL_StatementHandle *sh,
134                          const struct GNUNET_MY_QueryParam *params);
135
136
137 /**
138  * Information we pass to #GNUNET_MY_extract_result() to
139  * initialize the arguments of the prepared statement.
140  */
141 struct GNUNET_MY_ResultParam;
142
143 /**
144  * Function called to convert input argument into SQL parameters.
145  *
146  * @param cls closure
147  * @param pq data about the query
148  * @return -1 on error
149  */
150 typedef int
151 (*GNUNET_MY_ResultConverter)(void *cls,
152                              struct GNUNET_MY_ResultSpec *rs,
153                              MYSQL_BIND *results);
154
155 /**
156  * Information we pass to #GNUNET_MY_extract_result() to
157  * initialize the arguments of the prepared statement.
158  */
159 struct GNUNET_MY_ResultSpec
160 {
161
162   /**
163    * Function to call for the type conversion.
164    */
165   GNUNET_MY_ResultConverter conv;
166
167   /**
168    * Closure for @e conv.
169    */
170   void *conv_cls;
171
172   /**
173    * Destination for the data.
174    */
175   void *dst;
176
177   /**
178    * Allowed size for the data, 0 for variable-size
179    * (in this case, the type of @e dst is a `void **`
180    * and we need to allocate a buffer of the right size).
181    */
182   size_t dst_size;
183
184   /**
185    * Where to store actual size of the result.
186    */
187   size_t *result_size;
188
189 };
190
191
192 /**
193  * End of result speceter specification.
194  *
195  * @return array last entry for the result specification to use
196  */
197 #define GNUNET_MY_result_spec_end { NULL, NULL, NULL, 0, NULL }
198
199
200
201 /**
202  * Obtain fixed size result of @a ptr_size bytes from
203  * MySQL, store in already allocated buffer at @a ptr.
204  *
205  * @spec ptr where to write the result
206  * @oaran ptr_size number of bytes available at @a ptr
207  */
208 struct GNUNET_MY_ResultSpec
209 GNUNET_MY_result_spec_fixed_size (void *ptr,
210                                   size_t ptr_size);
211
212 /**
213   * Generate query parameter for a string
214   *
215   *@param ptr pointer to the string query parameter to pass
216   */
217 struct GNUNET_MY_QueryParam
218 GNUNET_MY_query_param_string (const char *ptr);
219
220 /**
221   * Generate fixed-size query parameter with size determined
222   * by variable type.
223   *
224   * @param x pointer to the query parameter to pass
225   */
226 #define GNUNET_MY_query_param_auto_from_type(x) GNUNET_MY_query_param_fixed_size ((x), sizeof (*(x)))
227
228 /**
229   * Generate query parameter for an RSA public key. The
230   * database must contain a BLOB type in the respective position.
231   *
232   * @param x the query parameter to pass
233   * @return array entry for the query parameters to use
234   */
235 struct GNUNET_MY_QueryParam
236 GNUNET_MY_query_param_rsa_public_key (const struct GNUNET_CRYPTO_RsaPublicKey *x);
237
238 /**
239   * Generate query parameter for an RSA signature. The
240   * database must contain a BLOB type in the respective position
241   *
242   *@param x the query parameter to pass
243   *@return array entry for the query parameters to use
244   */
245 struct GNUNET_MY_QueryParam
246 GNUNET_MY_query_param_rsa_signature (const struct GNUNET_CRYPTO_RsaSignature *x);
247
248 /**
249   * Generate query parameter for an absolute time value.
250   * The database must store a 64-bit integer.
251   *
252   *@param x pointer to the query parameter to pass
253   *@return array entry for the query parameters to use
254   */
255 struct GNUNET_MY_QueryParam
256 GNUNET_MY_query_param_absolute_time (const struct GNUNET_TIME_Absolute *x);
257
258 /**
259   * Generate query parameter for an absolute time value.
260   * The database must store a 64-bit integer.
261   *
262   *@param x pointer to the query parameter to pass
263   */
264 struct GNUNET_MY_QueryParam
265 GNUNET_MY_query_param_absolute_time_nbo (const struct GNUNET_TIME_AbsoluteNBO *x);
266
267 /**
268   * Generate query parameter for an uint16_t in host byte order.
269   *
270   * @param x pointer to the query parameter to pass
271   */
272 struct GNUNET_MY_QueryParam
273 GNUNET_MY_query_param_uint16 (const uint16_t *x);
274
275 /**
276   * Generate query parameter for an uint32_t in host byte order
277   *
278   *@param x pointer to the query parameter to pass
279   */
280 struct GNUNET_MY_QueryParam
281 GNUNET_MY_query_param_uint32 (const uint32_t *x);
282
283 /**
284   * Generate query parameter for an uint64_t in host byte order
285   *
286   *@param x pointer to the query parameter to pass
287   */
288 struct GNUNET_MY_QueryParam
289 GNUNET_MY_query_param_uint64 (const uint64_t *x);
290
291 /**
292  * We expect a fixed-size result, with size determined by the type of `* dst`
293  *
294  * @spec name name of the field in the table
295  * @spec dst point to where to store the result, type fits expected result size
296  * @return array entry for the result specification to use
297  */
298 #define GNUNET_MY_result_spec_auto_from_type(dst) GNUNET_MY_result_spec_fixed_size ((dst), sizeof (*(dst)))
299
300
301 /**
302  * FIXME.
303  *
304  */
305
306  /**
307   * Variable-size result expected
308   *
309   * @param[out] dst where to store the result, allocated
310   * @param[out] sptr where to store the size of @a dst
311   * @return array entru for the result specification to use
312   */
313 struct GNUNET_MY_ResultSpec
314 GNUNET_MY_result_spec_variable_size (void **dst,
315                                     size_t *ptr_size);
316 /**
317   * RSA public key expected
318   *
319   * @param name name of the field in the table
320   * @param[out] rsa where to store the result
321   * @return array entry for the result specification to use
322   */
323 struct GNUNET_MY_ResultSpec
324 GNUNET_MY_result_spec_rsa_public_key (struct GNUNET_CRYPTO_RsaPublicKey **rsa);
325
326 /**
327   * RSA signature expected.
328   *
329   * @param[out] sig where to store the result;
330   * @return array entry for the result specification to use
331   */
332 struct GNUNET_MY_ResultSpec
333 GNUNET_MY_result_spec_rsa_signature (struct GNUNET_CRYPTO_RsaSignature **sig);
334
335 /**
336   * 0- terminated string exprected.
337   *
338   * @param[out] dst where to store the result, allocated
339   * @return array entry for the result specification to use
340   */
341 struct GNUNET_MY_ResultSpec
342 GNUNET_MY_result_spec_string (char **dst);
343
344 /**
345   * Absolute time expected
346   *
347   * @param name name of the field in the table
348   * @param[out] at where to store the result
349   * @return array entry for the result specification to use
350   */
351 struct GNUNET_MY_ResultSpec
352 GNUNET_MY_result_spec_absolute_time (struct GNUNET_TIME_Absolute *at);
353
354 /**
355   * Absolute time in network byte order expected
356   *
357   * @param[out] at where to store the result
358   * @return array entry for the result specification to use
359   */
360 struct GNUNET_MY_ResultSpec
361 GNUNET_MY_result_spec_absolute_time_nbo (struct GNUNET_TIME_AbsoluteNBO *at);
362
363 /**
364   * uint16_t expected
365   *
366   * @param[out] u16 where to store the result
367   * @return array entry for the result specification to use
368   */
369 struct GNUNET_MY_ResultSpec
370 GNUNET_MY_result_spec_uint16 (uint16_t *u16);
371
372 /**
373   * uint32_t expected
374   *
375   * @param[out] u32 where to store the result
376   * @return array entry for the result specification to use
377   */
378 struct GNUNET_MY_ResultSpec
379 GNUNET_MY_result_spec_uint32 (uint32_t *u32);
380
381 /**
382   * uint64_t expected.
383   *
384   * @param[out] u64 where to store the result
385   * @return array entry for the result specification to use
386   */
387 struct GNUNET_MY_ResultSpec
388 GNUNET_MY_result_spec_uint64 (uint64_t *u64);
389
390 int
391 GNUNET_MY_extract_result (struct GNUNET_MYSQL_StatementHandle *sh,
392                           struct GNUNET_MY_QueryParam *qp,
393                           struct GNUNET_MY_ResultSpec *specs,
394                           int row);
395
396 #if 0                           /* keep Emacsens' auto-indent happy */
397 {
398 #endif
399 #ifdef __cplusplus
400 }
401 #endif
402
403 #endif
404
405 /** @} */  /* end of group */