OpenDNSSEC-enforcer 2.1.12
db_backend.c
Go to the documentation of this file.
1/*
2 * Copyright (c) 2014 Jerry Lundström <lundstrom.jerry@gmail.com>
3 * Copyright (c) 2014 .SE (The Internet Infrastructure Foundation).
4 * Copyright (c) 2014 OpenDNSSEC AB (svb)
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
22 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
24 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 */
29
30#include "config.h"
31
32#include "db_backend.h"
33#if defined(ENFORCER_DATABASE_SQLITE3)
34#include "db_backend_sqlite.h"
35#endif
36#include "db_backend_mysql.h"
37#include "db_error.h"
38#include "database_version.h"
39#include "hsm_key.h"
40
41
42#include <stdlib.h>
43#include <string.h>
44
45/* DB BACKEND HANDLE */
46
47
48
50 db_backend_handle_t* backend_handle =
51 (db_backend_handle_t*)calloc(1, sizeof(db_backend_handle_t));
52
53 return backend_handle;
54}
55
57 if (backend_handle) {
58 if (backend_handle->disconnect_function) {
59 (void)(*backend_handle->disconnect_function)(backend_handle->data);
60 }
61 if (backend_handle->free_function) {
62 (*backend_handle->free_function)(backend_handle->data);
63 }
64 free(backend_handle);
65 }
66}
67
69 if (!backend_handle) {
70 return DB_ERROR_UNKNOWN;
71 }
72 if (!backend_handle->initialize_function) {
73 return DB_ERROR_UNKNOWN;
74 }
75
76 return backend_handle->initialize_function((void*)backend_handle->data);
77}
78
79int db_backend_handle_connect(const db_backend_handle_t* backend_handle, const db_configuration_list_t* configuration_list) {
80 if (!backend_handle) {
81 return DB_ERROR_UNKNOWN;
82 }
83 if (!configuration_list) {
84 return DB_ERROR_UNKNOWN;
85 }
86 if (!backend_handle->connect_function) {
87 return DB_ERROR_UNKNOWN;
88 }
89
90 return backend_handle->connect_function((void*)backend_handle->data, configuration_list);
91}
92
93int db_backend_handle_create(const db_backend_handle_t* backend_handle, const db_object_t* object, const db_object_field_list_t* object_field_list, const db_value_set_t* value_set) {
94 if (!backend_handle) {
95 return DB_ERROR_UNKNOWN;
96 }
97 if (!object) {
98 return DB_ERROR_UNKNOWN;
99 }
100 if (!object_field_list) {
101 return DB_ERROR_UNKNOWN;
102 }
103 if (!value_set) {
104 return DB_ERROR_UNKNOWN;
105 }
106 if (!backend_handle->create_function) {
107 return DB_ERROR_UNKNOWN;
108 }
109
110 return backend_handle->create_function((void*)backend_handle->data, object, object_field_list, value_set);
111}
112
113db_result_list_t* db_backend_handle_read(const db_backend_handle_t* backend_handle, const db_object_t* object, const db_join_list_t* join_list, const db_clause_list_t* clause_list) {
114 if (!backend_handle) {
115 return NULL;
116 }
117 if (!object) {
118 return NULL;
119 }
120 if (!backend_handle->read_function) {
121 return NULL;
122 }
123
124 return backend_handle->read_function((void*)backend_handle->data, object, join_list, clause_list);
125}
126
127int db_backend_handle_update(const db_backend_handle_t* backend_handle, const db_object_t* object, const db_object_field_list_t* object_field_list, const db_value_set_t* value_set, const db_clause_list_t* clause_list) {
128 if (!backend_handle) {
129 return DB_ERROR_UNKNOWN;
130 }
131 if (!object) {
132 return DB_ERROR_UNKNOWN;
133 }
134 if (!object_field_list) {
135 return DB_ERROR_UNKNOWN;
136 }
137 if (!value_set) {
138 return DB_ERROR_UNKNOWN;
139 }
140 if (!backend_handle->update_function) {
141 return DB_ERROR_UNKNOWN;
142 }
143
144 return backend_handle->update_function((void*)backend_handle->data, object, object_field_list, value_set, clause_list);
145}
146
147int db_backend_handle_delete(const db_backend_handle_t* backend_handle, const db_object_t* object, const db_clause_list_t* clause_list) {
148 if (!backend_handle) {
149 return DB_ERROR_UNKNOWN;
150 }
151 if (!object) {
152 return DB_ERROR_UNKNOWN;
153 }
154 if (!backend_handle->delete_function) {
155 return DB_ERROR_UNKNOWN;
156 }
157
158 return backend_handle->delete_function((void*)backend_handle->data, object, clause_list);
159}
160
161int db_backend_handle_count(const db_backend_handle_t* backend_handle, const db_object_t* object, const db_join_list_t* join_list, const db_clause_list_t* clause_list, size_t* count) {
162 if (!backend_handle) {
163 return DB_ERROR_UNKNOWN;
164 }
165 if (!object) {
166 return DB_ERROR_UNKNOWN;
167 }
168 if (!count) {
169 return DB_ERROR_UNKNOWN;
170 }
171 if (!backend_handle->count_function) {
172 return DB_ERROR_UNKNOWN;
173 }
174
175 return backend_handle->count_function((void*)backend_handle->data, object, join_list, clause_list, count);
176}
177
179 if (!backend_handle) {
180 return DB_ERROR_UNKNOWN;
181 }
182
183 backend_handle->initialize_function = initialize_function;
184 return DB_OK;
185}
186
188 if (!backend_handle) {
189 return DB_ERROR_UNKNOWN;
190 }
191
192 backend_handle->shutdown_function = shutdown_function;
193 return DB_OK;
194}
195
197 if (!backend_handle) {
198 return DB_ERROR_UNKNOWN;
199 }
200
201 backend_handle->connect_function = connect_function;
202 return DB_OK;
203}
204
206 if (!backend_handle) {
207 return DB_ERROR_UNKNOWN;
208 }
209
210 backend_handle->disconnect_function = disconnect_function;
211 return DB_OK;
212}
213
215 if (!backend_handle) {
216 return DB_ERROR_UNKNOWN;
217 }
218
219 backend_handle->create_function = create_function;
220 return DB_OK;
221}
222
224 if (!backend_handle) {
225 return DB_ERROR_UNKNOWN;
226 }
227
228 backend_handle->read_function = read_function;
229 return DB_OK;
230}
231
233 if (!backend_handle) {
234 return DB_ERROR_UNKNOWN;
235 }
236
237 backend_handle->update_function = update_function;
238 return DB_OK;
239}
240
242 if (!backend_handle) {
243 return DB_ERROR_UNKNOWN;
244 }
245
246 backend_handle->delete_function = delete_function;
247 return DB_OK;
248}
249
251 if (!backend_handle) {
252 return DB_ERROR_UNKNOWN;
253 }
254
255 backend_handle->count_function = count_function;
256 return DB_OK;
257}
258
260 if (!backend_handle) {
261 return DB_ERROR_UNKNOWN;
262 }
263
264 backend_handle->free_function = free_function;
265 return DB_OK;
266}
267
269 if (!backend_handle) {
270 return DB_ERROR_UNKNOWN;
271 }
272
273 backend_handle->transaction_begin_function = transaction_begin_function;
274 return DB_OK;
275}
276
278 if (!backend_handle) {
279 return DB_ERROR_UNKNOWN;
280 }
281
282 backend_handle->transaction_commit_function = transaction_commit_function;
283 return DB_OK;
284}
285
287 if (!backend_handle) {
288 return DB_ERROR_UNKNOWN;
289 }
290
291 backend_handle->transaction_rollback_function = transaction_rollback_function;
292 return DB_OK;
293}
294
295int db_backend_handle_set_data(db_backend_handle_t* backend_handle, void* data) {
296 if (!backend_handle) {
297 return DB_ERROR_UNKNOWN;
298 }
299 if (backend_handle->data) {
300 return DB_ERROR_UNKNOWN;
301 }
302
303 backend_handle->data = data;
304 return DB_OK;
305}
306
307/* DB BACKEND */
308
309
310
312 db_backend_t* backend =
313 (db_backend_t*)calloc(1, sizeof(db_backend_t));
314
315 return backend;
316}
317
319 if (backend) {
320 if (backend->handle) {
322 }
323 if (backend->name) {
324 free(backend->name);
325 }
326 free(backend);
327 }
328}
329
330int db_backend_set_name(db_backend_t* backend, const char* name) {
331 char* new_name;
332
333 if (!backend) {
334 return DB_ERROR_UNKNOWN;
335 }
336
337 if (!(new_name = strdup(name))) {
338 return DB_ERROR_UNKNOWN;
339 }
340
341 if (backend->name) {
342 free(backend->name);
343 }
344 backend->name = new_name;
345 return DB_OK;
346}
347
349 if (!backend) {
350 return DB_ERROR_UNKNOWN;
351 }
352 if (backend->handle) {
353 return DB_ERROR_UNKNOWN;
354 }
355
356 backend->handle = handle;
357 return DB_OK;
358}
359
361 if (!backend) {
362 return DB_ERROR_UNKNOWN;
363 }
364 if (!backend->handle) {
365 return DB_ERROR_UNKNOWN;
366 }
367
368 return db_backend_handle_initialize(backend->handle);
369}
370
371int db_backend_connect(const db_backend_t* backend, const db_configuration_list_t* configuration_list) {
372 if (!backend) {
373 return DB_ERROR_UNKNOWN;
374 }
375 if (!configuration_list) {
376 return DB_ERROR_UNKNOWN;
377 }
378 if (!backend->handle) {
379 return DB_ERROR_UNKNOWN;
380 }
381
382 return db_backend_handle_connect(backend->handle, configuration_list);
383}
384
385int db_backend_create(const db_backend_t* backend, const db_object_t* object, const db_object_field_list_t* object_field_list, const db_value_set_t* value_set) {
386 if (!backend) {
387 return DB_ERROR_UNKNOWN;
388 }
389 if (!object) {
390 return DB_ERROR_UNKNOWN;
391 }
392 if (!object_field_list) {
393 return DB_ERROR_UNKNOWN;
394 }
395 if (!value_set) {
396 return DB_ERROR_UNKNOWN;
397 }
398 if (!backend->handle) {
399 return DB_ERROR_UNKNOWN;
400 }
401
402 return db_backend_handle_create(backend->handle, object, object_field_list, value_set);
403}
404
405db_result_list_t* db_backend_read(const db_backend_t* backend, const db_object_t* object, const db_join_list_t* join_list, const db_clause_list_t* clause_list) {
406 if (!backend) {
407 return NULL;
408 }
409 if (!object) {
410 return NULL;
411 }
412 if (!backend->handle) {
413 return NULL;
414 }
415
416 return db_backend_handle_read(backend->handle, object, join_list, clause_list);
417}
418
419int db_backend_update(const db_backend_t* backend, const db_object_t* object, const db_object_field_list_t* object_field_list, const db_value_set_t* value_set, const db_clause_list_t* clause_list) {
420 if (!backend) {
421 return DB_ERROR_UNKNOWN;
422 }
423 if (!object) {
424 return DB_ERROR_UNKNOWN;
425 }
426 if (!object_field_list) {
427 return DB_ERROR_UNKNOWN;
428 }
429 if (!value_set) {
430 return DB_ERROR_UNKNOWN;
431 }
432 if (!backend->handle) {
433 return DB_ERROR_UNKNOWN;
434 }
435
436 return db_backend_handle_update(backend->handle, object, object_field_list, value_set, clause_list);
437}
438
439int db_backend_delete(const db_backend_t* backend, const db_object_t* object, const db_clause_list_t* clause_list) {
440 if (!backend) {
441 return DB_ERROR_UNKNOWN;
442 }
443 if (!object) {
444 return DB_ERROR_UNKNOWN;
445 }
446 if (!backend->handle) {
447 return DB_ERROR_UNKNOWN;
448 }
449
450 return db_backend_handle_delete(backend->handle, object, clause_list);
451}
452
453int db_backend_count(const db_backend_t* backend, const db_object_t* object, const db_join_list_t* join_list, const db_clause_list_t* clause_list, size_t* count) {
454 if (!backend) {
455 return DB_ERROR_UNKNOWN;
456 }
457 if (!object) {
458 return DB_ERROR_UNKNOWN;
459 }
460 if (!count) {
461 return DB_ERROR_UNKNOWN;
462 }
463 if (!backend->handle) {
464 return DB_ERROR_UNKNOWN;
465 }
466
467 return db_backend_handle_count(backend->handle, object, join_list, clause_list, count);
468}
469
470/* DB BACKEND FACTORY */
471
473 db_backend_t* backend = NULL;
474
475 if (!name) {
476 return NULL;
477 }
478
479#if defined(ENFORCER_DATABASE_SQLITE3)
480 if (!strcmp(name, "sqlite")) {
481 if (!(backend = db_backend_new())
482 || db_backend_set_name(backend, "sqlite")
484 || db_backend_initialize(backend))
485 {
486 db_backend_free(backend);
487 return NULL;
488 }
489 return backend;
490 }
491#endif
492#if defined(ENFORCER_DATABASE_MYSQL)
493 if (!strcmp(name, "mysql")) {
494 if (!(backend = db_backend_new())
495 || db_backend_set_name(backend, "mysql")
497 || db_backend_initialize(backend))
498 {
499 db_backend_free(backend);
500 return NULL;
501 }
502 return backend;
503 }
504#endif
505
506 return backend;
507}
int db_backend_update(const db_backend_t *backend, const db_object_t *object, const db_object_field_list_t *object_field_list, const db_value_set_t *value_set, const db_clause_list_t *clause_list)
Definition: db_backend.c:419
int db_backend_handle_set_count(db_backend_handle_t *backend_handle, db_backend_handle_count_t count_function)
Definition: db_backend.c:250
int db_backend_handle_set_update(db_backend_handle_t *backend_handle, db_backend_handle_update_t update_function)
Definition: db_backend.c:232
int db_backend_handle_update(const db_backend_handle_t *backend_handle, const db_object_t *object, const db_object_field_list_t *object_field_list, const db_value_set_t *value_set, const db_clause_list_t *clause_list)
Definition: db_backend.c:127
int db_backend_handle_initialize(const db_backend_handle_t *backend_handle)
Definition: db_backend.c:68
db_backend_handle_t * db_backend_handle_new(void)
Definition: db_backend.c:49
int db_backend_handle_count(const db_backend_handle_t *backend_handle, const db_object_t *object, const db_join_list_t *join_list, const db_clause_list_t *clause_list, size_t *count)
Definition: db_backend.c:161
int db_backend_set_name(db_backend_t *backend, const char *name)
Definition: db_backend.c:330
int db_backend_handle_set_shutdown(db_backend_handle_t *backend_handle, db_backend_handle_shutdown_t shutdown_function)
Definition: db_backend.c:187
int db_backend_handle_set_initialize(db_backend_handle_t *backend_handle, db_backend_handle_initialize_t initialize_function)
Definition: db_backend.c:178
void db_backend_handle_free(db_backend_handle_t *backend_handle)
Definition: db_backend.c:56
void db_backend_free(db_backend_t *backend)
Definition: db_backend.c:318
int db_backend_handle_set_disconnect(db_backend_handle_t *backend_handle, db_backend_handle_disconnect_t disconnect_function)
Definition: db_backend.c:205
int db_backend_handle_set_delete(db_backend_handle_t *backend_handle, db_backend_handle_delete_t delete_function)
Definition: db_backend.c:241
db_result_list_t * db_backend_handle_read(const db_backend_handle_t *backend_handle, const db_object_t *object, const db_join_list_t *join_list, const db_clause_list_t *clause_list)
Definition: db_backend.c:113
int db_backend_handle_create(const db_backend_handle_t *backend_handle, const db_object_t *object, const db_object_field_list_t *object_field_list, const db_value_set_t *value_set)
Definition: db_backend.c:93
int db_backend_handle_set_transaction_rollback(db_backend_handle_t *backend_handle, db_backend_handle_transaction_rollback_t transaction_rollback_function)
Definition: db_backend.c:286
db_result_list_t * db_backend_read(const db_backend_t *backend, const db_object_t *object, const db_join_list_t *join_list, const db_clause_list_t *clause_list)
Definition: db_backend.c:405
db_backend_t * db_backend_factory_get_backend(const char *name)
Definition: db_backend.c:472
int db_backend_create(const db_backend_t *backend, const db_object_t *object, const db_object_field_list_t *object_field_list, const db_value_set_t *value_set)
Definition: db_backend.c:385
db_backend_t * db_backend_new(void)
Definition: db_backend.c:311
int db_backend_handle_connect(const db_backend_handle_t *backend_handle, const db_configuration_list_t *configuration_list)
Definition: db_backend.c:79
int db_backend_handle_delete(const db_backend_handle_t *backend_handle, const db_object_t *object, const db_clause_list_t *clause_list)
Definition: db_backend.c:147
int db_backend_handle_set_transaction_commit(db_backend_handle_t *backend_handle, db_backend_handle_transaction_commit_t transaction_commit_function)
Definition: db_backend.c:277
int db_backend_initialize(const db_backend_t *backend)
Definition: db_backend.c:360
int db_backend_handle_set_transaction_begin(db_backend_handle_t *backend_handle, db_backend_handle_transaction_begin_t transaction_begin_function)
Definition: db_backend.c:268
int db_backend_handle_set_read(db_backend_handle_t *backend_handle, db_backend_handle_read_t read_function)
Definition: db_backend.c:223
int db_backend_set_handle(db_backend_t *backend, db_backend_handle_t *handle)
Definition: db_backend.c:348
int db_backend_handle_set_create(db_backend_handle_t *backend_handle, db_backend_handle_create_t create_function)
Definition: db_backend.c:214
int db_backend_delete(const db_backend_t *backend, const db_object_t *object, const db_clause_list_t *clause_list)
Definition: db_backend.c:439
int db_backend_count(const db_backend_t *backend, const db_object_t *object, const db_join_list_t *join_list, const db_clause_list_t *clause_list, size_t *count)
Definition: db_backend.c:453
int db_backend_handle_set_data(db_backend_handle_t *backend_handle, void *data)
Definition: db_backend.c:295
int db_backend_connect(const db_backend_t *backend, const db_configuration_list_t *configuration_list)
Definition: db_backend.c:371
int db_backend_handle_set_free(db_backend_handle_t *backend_handle, db_backend_handle_free_t free_function)
Definition: db_backend.c:259
int db_backend_handle_set_connect(db_backend_handle_t *backend_handle, db_backend_handle_connect_t connect_function)
Definition: db_backend.c:196
int(* db_backend_handle_create_t)(void *data, const db_object_t *object, const db_object_field_list_t *object_field_list, const db_value_set_t *value_set)
Definition: db_backend.h:87
int(* db_backend_handle_count_t)(void *data, const db_object_t *object, const db_join_list_t *join_list, const db_clause_list_t *clause_list, size_t *count)
Definition: db_backend.h:133
int(* db_backend_handle_connect_t)(void *data, const db_configuration_list_t *configuration_list)
Definition: db_backend.h:68
int(* db_backend_handle_transaction_begin_t)(void *data)
Definition: db_backend.h:147
int(* db_backend_handle_update_t)(void *data, const db_object_t *object, const db_object_field_list_t *object_field_list, const db_value_set_t *value_set, const db_clause_list_t *clause_list)
Definition: db_backend.h:111
int(* db_backend_handle_disconnect_t)(void *data)
Definition: db_backend.h:76
int(* db_backend_handle_delete_t)(void *data, const db_object_t *object, const db_clause_list_t *clause_list)
Definition: db_backend.h:121
int(* db_backend_handle_transaction_commit_t)(void *data)
Definition: db_backend.h:155
int(* db_backend_handle_shutdown_t)(void *data)
Definition: db_backend.h:59
int(* db_backend_handle_transaction_rollback_t)(void *data)
Definition: db_backend.h:163
void(* db_backend_handle_free_t)(void *data)
Definition: db_backend.h:139
db_result_list_t *(* db_backend_handle_read_t)(void *data, const db_object_t *object, const db_join_list_t *join_list, const db_clause_list_t *clause_list)
Definition: db_backend.h:99
int(* db_backend_handle_initialize_t)(void *data)
Definition: db_backend.h:51
db_backend_handle_t * db_backend_mysql_new_handle(void)
db_backend_handle_t * db_backend_sqlite_new_handle(void)
#define DB_ERROR_UNKNOWN
Definition: db_error.h:40
#define DB_OK
Definition: db_error.h:36
db_backend_handle_read_t read_function
Definition: db_backend.h:176
db_backend_handle_delete_t delete_function
Definition: db_backend.h:178
db_backend_handle_create_t create_function
Definition: db_backend.h:175
db_backend_handle_count_t count_function
Definition: db_backend.h:179
db_backend_handle_shutdown_t shutdown_function
Definition: db_backend.h:172
db_backend_handle_connect_t connect_function
Definition: db_backend.h:173
db_backend_handle_update_t update_function
Definition: db_backend.h:177
db_backend_handle_initialize_t initialize_function
Definition: db_backend.h:171
db_backend_handle_transaction_rollback_t transaction_rollback_function
Definition: db_backend.h:183
db_backend_handle_free_t free_function
Definition: db_backend.h:180
db_backend_handle_transaction_commit_t transaction_commit_function
Definition: db_backend.h:182
db_backend_handle_disconnect_t disconnect_function
Definition: db_backend.h:174
db_backend_handle_transaction_begin_t transaction_begin_function
Definition: db_backend.h:181
char * name
Definition: db_backend.h:386
db_backend_handle_t * handle
Definition: db_backend.h:387