add function conv param string
[oweals/gnunet.git] / src / include / gnunet_mysql_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_MYSQL_LIB_H
31 #define GNUNET_MYSQL_LIB_H
32
33 #include "gnunet_util_lib.h"
34 #include <mysql/mysql.h>
35
36 #ifdef __cplusplus
37 extern "C"
38 {
39 #if 0                           /* keep Emacsens' auto-indent happy */
40 }
41 #endif
42 #endif
43
44
45 /**
46  * Mysql context.
47  */
48 struct GNUNET_MYSQL_Context;
49
50
51 /**
52  * Handle for a prepared statement.
53  */
54 struct GNUNET_MYSQL_StatementHandle;
55
56
57 /**
58  * Type of a callback that will be called for each
59  * data set returned from MySQL.
60  *
61  * @param cls user-defined argument
62  * @param num_values number of elements in values
63  * @param values values returned by MySQL
64  * @return GNUNET_OK to continue iterating, GNUNET_SYSERR to abort
65  */
66 typedef int (*GNUNET_MYSQL_DataProcessor) (void *cls, unsigned int num_values,
67                                            MYSQL_BIND * values);
68
69
70 /**
71  * Create a mysql context.
72  *
73  * @param cfg configuration
74  * @param section configuration section to use to get MySQL configuration options
75  * @return the mysql context
76  */
77 struct GNUNET_MYSQL_Context *
78 GNUNET_MYSQL_context_create (const struct GNUNET_CONFIGURATION_Handle *cfg,
79                              const char *section);
80
81
82 /**
83  * Destroy a mysql context.  Also frees all associated prepared statements.
84  *
85  * @param mc context to destroy
86  */
87 void
88 GNUNET_MYSQL_context_destroy (struct GNUNET_MYSQL_Context *mc);
89
90
91 /**
92  * Close database connection and all prepared statements (we got a DB
93  * error).  The connection will automatically be re-opened and
94  * statements will be re-prepared if they are needed again later.
95  *
96  * @param mc mysql context
97  */
98 void
99 GNUNET_MYSQL_statements_invalidate (struct GNUNET_MYSQL_Context *mc);
100
101
102 /**
103  * Get internal handle for a prepared statement.  This function should rarely
104  * be used, and if, with caution!  On failures during the interaction with
105  * the handle, you must call 'GNUNET_MYSQL_statements_invalidate'!
106  *
107  * @param sh prepared statement to introspect
108  * @return MySQL statement handle, NULL on error
109  */
110 MYSQL_STMT *
111 GNUNET_MYSQL_statement_get_stmt (struct GNUNET_MYSQL_StatementHandle *sh);
112
113
114 /**
115  * Prepare a statement.  Prepared statements are automatically discarded
116  * when the MySQL context is destroyed.
117  *
118  * @param mc mysql context
119  * @param query query text
120  * @return prepared statement, NULL on error
121  */
122 struct GNUNET_MYSQL_StatementHandle *
123 GNUNET_MYSQL_statement_prepare (struct GNUNET_MYSQL_Context *mc,
124                                 const char *query);
125
126
127 /**
128  * Run a SQL statement.
129  *
130  * @param mc mysql context
131  * @param sql SQL statement to run
132  * @return GNUNET_OK on success
133  *         GNUNET_SYSERR if there was a problem
134  */
135 int
136 GNUNET_MYSQL_statement_run (struct GNUNET_MYSQL_Context *mc,
137                             const char *sql);
138
139
140 /**
141  * Run a prepared SELECT statement.
142  *
143  * @param sh handle to SELECT statment
144  * @param result_size number of elements in results array
145  * @param results pointer to already initialized MYSQL_BIND
146  *        array (of sufficient size) for passing results
147  * @param processor function to call on each result
148  * @param processor_cls extra argument to processor
149  * @param ... pairs and triplets of "MYSQL_TYPE_XXX" keys and their respective
150  *        values (size + buffer-reference for pointers); terminated
151  *        with "-1"
152  * @return GNUNET_SYSERR on error, otherwise
153  *         the number of successfully affected (or queried) rows
154  */
155 int
156 GNUNET_MYSQL_statement_run_prepared_select (struct GNUNET_MYSQL_StatementHandle *sh,
157                                             unsigned int result_size, MYSQL_BIND * results,
158                                             GNUNET_MYSQL_DataProcessor processor,
159                                             void *processor_cls, ...);
160
161
162 /**
163  * Run a prepared SELECT statement.
164  *
165  * @param s statement to run
166  * @param result_size number of elements in results array
167  * @param results pointer to already initialized MYSQL_BIND
168  *        array (of sufficient size) for passing results
169  * @param processor function to call on each result
170  * @param processor_cls extra argument to processor
171  * @param ap pairs and triplets of "MYSQL_TYPE_XXX" keys and their respective
172  *        values (size + buffer-reference for pointers); terminated
173  *        with "-1"
174  * @return GNUNET_SYSERR on error, otherwise
175  *         the number of successfully affected (or queried) rows
176  */
177 int
178 GNUNET_MYSQL_statement_run_prepared_select_va (struct GNUNET_MYSQL_StatementHandle *s,
179                                                unsigned int result_size,
180                                                MYSQL_BIND * results,
181                                                GNUNET_MYSQL_DataProcessor processor,
182                                                void *processor_cls,
183                                                va_list ap);
184
185
186 /**
187  * Run a prepared statement that does NOT produce results.
188  *
189  * @param sh handle to statment
190  * @param insert_id NULL or address where to store the row ID of whatever
191  *        was inserted (only for INSERT statements!)
192  * @param ... pairs and triplets of "MYSQL_TYPE_XXX" keys and their respective
193  *        values (size + buffer-reference for pointers); terminated
194  *        with "-1"
195  * @return GNUNET_SYSERR on error, otherwise
196  *         the number of successfully affected rows
197  */
198 int
199 GNUNET_MYSQL_statement_run_prepared (struct GNUNET_MYSQL_StatementHandle *sh,
200                                      unsigned long long *insert_id, ...);
201
202
203 #if 0                           /* keep Emacsens' auto-indent happy */
204 {
205 #endif
206 #ifdef __cplusplus
207 }
208 #endif
209
210 #endif
211
212 /** @} */  /* end of group */