aboutsummaryrefslogtreecommitdiff
path: root/src/my/my.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/my/my.c')
-rw-r--r--src/my/my.c269
1 files changed, 0 insertions, 269 deletions
diff --git a/src/my/my.c b/src/my/my.c
deleted file mode 100644
index 468a4a47c..000000000
--- a/src/my/my.c
+++ /dev/null
@@ -1,269 +0,0 @@
1/*
2 This file is part of GNUnet
3 Copyright (C) 2016, 2018 GNUnet e.V.
4
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.
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 Affero General Public License for more details.
14
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/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
20/**
21 * @file my/my.c
22 * @brief library to help with access to a MySQL database
23 * @author Christophe Genevey
24 * @author Christian Grothoff
25 */
26#include "platform.h"
27#include <mysql/mysql.h>
28#include "gnunet_my_lib.h"
29
30
31/**
32 * Run a prepared SELECT statement.
33 *
34 * @param mc mysql context
35 * @param sh handle to SELECT statement
36 * @param params parameters to the statement
37 * @return
38 #GNUNET_YES if we can prepare all statement
39 #GNUNET_SYSERR if we can't prepare all statement
40 */
41int
42GNUNET_MY_exec_prepared (struct GNUNET_MYSQL_Context *mc,
43 struct GNUNET_MYSQL_StatementHandle *sh,
44 struct GNUNET_MY_QueryParam *params)
45{
46 const struct GNUNET_MY_QueryParam *p;
47 unsigned int num;
48 MYSQL_STMT *stmt;
49
50 num = 0;
51 for (unsigned int i = 0; NULL != params[i].conv; i++)
52 num += params[i].num_params;
53 {
54 MYSQL_BIND qbind[num];
55 unsigned int off;
56
57 memset (qbind,
58 0,
59 sizeof(qbind));
60 off = 0;
61 for (unsigned int i = 0; NULL != (p = &params[i])->conv; i++)
62 {
63 if (GNUNET_OK !=
64 p->conv (p->conv_cls,
65 p,
66 &qbind[off]))
67 {
68 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
69 "Conversion for MySQL query failed at offset %u\n",
70 i);
71 return GNUNET_SYSERR;
72 }
73 off += p->num_params;
74 }
75 stmt = GNUNET_MYSQL_statement_get_stmt (sh);
76 if (mysql_stmt_bind_param (stmt,
77 qbind))
78 {
79 GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR,
80 "my",
81 _ ("`%s' failed at %s:%d with error: %s\n"),
82 "mysql_stmt_bind_param",
83 __FILE__, __LINE__,
84 mysql_stmt_error (stmt));
85 GNUNET_MYSQL_statements_invalidate (mc);
86 return GNUNET_SYSERR;
87 }
88
89 if (mysql_stmt_execute (stmt))
90 {
91 GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR,
92 "my",
93 _ ("`%s' failed at %s:%d with error: %s\n"),
94 "mysql_stmt_execute", __FILE__, __LINE__,
95 mysql_stmt_error (stmt));
96 GNUNET_MYSQL_statements_invalidate (mc);
97 return GNUNET_SYSERR;
98 }
99 GNUNET_MY_cleanup_query (params,
100 qbind);
101 }
102 return GNUNET_OK;
103}
104
105
106/**
107 * Free all memory that was allocated in @a qp during
108 * #GNUNET_MY_exec_prepared().
109 *
110 * @param qp query specification to clean up
111 * @param qbind array of parameter to clean up
112 */
113void
114GNUNET_MY_cleanup_query (struct GNUNET_MY_QueryParam *qp,
115 MYSQL_BIND *qbind)
116{
117 for (unsigned int i = 0; NULL != qp[i].conv; i++)
118 if (NULL != qp[i].cleaner)
119 qp[i].cleaner (qp[i].conv_cls,
120 &qbind[i]);
121}
122
123
124/**
125 * Extract results from a query result according to the given
126 * specification. Always fetches the next row.
127 *
128 * @param sh statement that returned results
129 * @param rs specification to extract for
130 * @return
131 * #GNUNET_YES if all results could be extracted
132 * #GNUNET_NO if there is no more data in the result set
133 * #GNUNET_SYSERR if a result was invalid
134 */
135int
136GNUNET_MY_extract_result (struct GNUNET_MYSQL_StatementHandle *sh,
137 struct GNUNET_MY_ResultSpec *rs)
138{
139 unsigned int num_fields;
140 int ret;
141 MYSQL_STMT *stmt;
142
143 stmt = GNUNET_MYSQL_statement_get_stmt (sh);
144 if (NULL == stmt)
145 {
146 GNUNET_break (0);
147 return GNUNET_SYSERR;
148 }
149 if (NULL == rs)
150 {
151 mysql_stmt_free_result (stmt);
152 return GNUNET_NO;
153 }
154
155 num_fields = 0;
156 for (unsigned int i = 0; NULL != rs[i].pre_conv; i++)
157 num_fields += rs[i].num_fields;
158
159 if (mysql_stmt_field_count (stmt) != num_fields)
160 {
161 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
162 "Number of fields mismatch between SQL result and result specification\n");
163 return GNUNET_SYSERR;
164 }
165
166 {
167 MYSQL_BIND result[num_fields];
168 unsigned int field_off;
169
170 memset (result, 0, sizeof(MYSQL_BIND) * num_fields);
171 field_off = 0;
172 for (unsigned int i = 0; NULL != rs[i].pre_conv; i++)
173 {
174 struct GNUNET_MY_ResultSpec *rp = &rs[i];
175
176 if (GNUNET_OK !=
177 rp->pre_conv (rp->conv_cls,
178 rp,
179 stmt,
180 field_off,
181 &result[field_off]))
182
183 {
184 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
185 "Pre-conversion for MySQL result failed at offset %u\n",
186 i);
187 return GNUNET_SYSERR;
188 }
189 field_off += rp->num_fields;
190 }
191
192 if (mysql_stmt_bind_result (stmt, result))
193 {
194 GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR,
195 "my",
196 _ ("%s failed at %s:%d with error: %s\n"),
197 "mysql_stmt_bind_result",
198 __FILE__, __LINE__,
199 mysql_stmt_error (stmt));
200 return GNUNET_SYSERR;
201 }
202#if TEST_OPTIMIZATION
203 (void) mysql_stmt_store_result (stmt);
204#endif
205 ret = mysql_stmt_fetch (stmt);
206 if (MYSQL_NO_DATA == ret)
207 {
208 mysql_stmt_free_result (stmt);
209 return GNUNET_NO;
210 }
211 if (1 == ret)
212 {
213 GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR,
214 "my",
215 _ ("%s failed at %s:%d with error: %s\n"),
216 "mysql_stmt_fetch",
217 __FILE__, __LINE__,
218 mysql_stmt_error (stmt));
219 GNUNET_MY_cleanup_result (rs);
220 mysql_stmt_free_result (stmt);
221 return GNUNET_SYSERR;
222 }
223 field_off = 0;
224 for (unsigned int i = 0; NULL != rs[i].post_conv; i++)
225 {
226 struct GNUNET_MY_ResultSpec *rp = &rs[i];
227
228 if (NULL != rp->post_conv)
229 if (GNUNET_OK !=
230 rp->post_conv (rp->conv_cls,
231 rp,
232 stmt,
233 field_off,
234 &result[field_off]))
235 {
236 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
237 "Post-conversion for MySQL result failed at offset %u\n",
238 i);
239 mysql_stmt_free_result (stmt);
240 for (unsigned int j = 0; j < i; j++)
241 if (NULL != rs[j].cleaner)
242 rs[j].cleaner (rs[j].conv_cls,
243 rs[j].dst);
244 return GNUNET_SYSERR;
245 }
246 field_off += rp->num_fields;
247 }
248 }
249 return GNUNET_OK;
250}
251
252
253/**
254 * Free all memory that was allocated in @a rs during
255 * #GNUNET_MY_extract_result().
256 *
257 * @param rs result specification to clean up
258 */
259void
260GNUNET_MY_cleanup_result (struct GNUNET_MY_ResultSpec *rs)
261{
262 for (unsigned int i = 0; NULL != rs[i].post_conv; i++)
263 if (NULL != rs[i].cleaner)
264 rs[i].cleaner (rs[i].conv_cls,
265 &rs[i]);
266}
267
268
269/* end of my.c */