OpenDNSSEC-enforcer  2.1.3
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 
79 int 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 
93 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) {
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 
113 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) {
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 
127 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) {
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 
147 int 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 
161 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) {
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 
295 int 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) {
321  db_backend_handle_free(backend->handle);
322  }
323  if (backend->name) {
324  free(backend->name);
325  }
326  free(backend);
327  }
328 }
329 
330 int 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 
360 int db_backend_initialize(const db_backend_t* backend) {
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 
371 int 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 
385 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) {
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 
405 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) {
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 
419 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) {
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 
439 int 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 
453 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) {
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 }
db_backend_handle_connect_t connect_function
Definition: db_backend.h:173
int(* db_backend_handle_transaction_rollback_t)(void *data)
Definition: db_backend.h:163
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
void db_backend_free(db_backend_t *backend)
Definition: db_backend.c:318
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_set_handle(db_backend_t *backend, db_backend_handle_t *handle)
Definition: db_backend.c:348
#define DB_ERROR_UNKNOWN
Definition: db_error.h:40
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
char * name
Definition: db_backend.h:386
int db_backend_handle_set_data(db_backend_handle_t *backend_handle, void *data)
Definition: db_backend.c:295
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
db_backend_handle_transaction_begin_t transaction_begin_function
Definition: db_backend.h:181
void db_backend_handle_free(db_backend_handle_t *backend_handle)
Definition: db_backend.c:56
db_backend_handle_t * db_backend_handle_new(void)
Definition: db_backend.c:49
db_backend_handle_initialize_t initialize_function
Definition: db_backend.h:171
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_connect(db_backend_handle_t *backend_handle, db_backend_handle_connect_t connect_function)
Definition: db_backend.c:196
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_transaction_begin_t)(void *data)
Definition: db_backend.h:147
db_backend_handle_transaction_rollback_t transaction_rollback_function
Definition: db_backend.h:183
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_free(db_backend_handle_t *backend_handle, db_backend_handle_free_t free_function)
Definition: db_backend.c:259
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(const db_backend_handle_t *backend_handle, const db_configuration_list_t *configuration_list)
Definition: db_backend.c:79
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
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
int db_backend_connect(const db_backend_t *backend, const db_configuration_list_t *configuration_list)
Definition: db_backend.c:371
db_backend_t * db_backend_factory_get_backend(const char *name)
Definition: db_backend.c:472
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_handle_set_delete(db_backend_handle_t *backend_handle, db_backend_handle_delete_t delete_function)
Definition: db_backend.c:241
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_initialize_t)(void *data)
Definition: db_backend.h:51
int(* db_backend_handle_transaction_commit_t)(void *data)
Definition: db_backend.h:155
db_backend_handle_update_t update_function
Definition: db_backend.h:177
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
db_backend_handle_t * db_backend_sqlite_new_handle(void)
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
db_backend_handle_shutdown_t shutdown_function
Definition: db_backend.h:172
void(* db_backend_handle_free_t)(void *data)
Definition: db_backend.h:139
int db_backend_handle_initialize(const db_backend_handle_t *backend_handle)
Definition: db_backend.c:68
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
db_backend_handle_disconnect_t disconnect_function
Definition: db_backend.h:174
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_initialize(const db_backend_t *backend)
Definition: db_backend.c:360
#define DB_OK
Definition: db_error.h:36
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_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_set_disconnect(db_backend_handle_t *backend_handle, db_backend_handle_disconnect_t disconnect_function)
Definition: db_backend.c:205
db_backend_handle_transaction_commit_t transaction_commit_function
Definition: db_backend.h:182
int(* db_backend_handle_disconnect_t)(void *data)
Definition: db_backend.h:76
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_count(db_backend_handle_t *backend_handle, db_backend_handle_count_t count_function)
Definition: db_backend.c:250
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
db_backend_handle_count_t count_function
Definition: db_backend.h:179
db_backend_t * db_backend_new(void)
Definition: db_backend.c:311
db_backend_handle_t * handle
Definition: db_backend.h:387
int(* db_backend_handle_shutdown_t)(void *data)
Definition: db_backend.h:59
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
int db_backend_handle_set_read(db_backend_handle_t *backend_handle, db_backend_handle_read_t read_function)
Definition: db_backend.c:223
db_backend_handle_create_t create_function
Definition: db_backend.h:175
int(* db_backend_handle_connect_t)(void *data, const db_configuration_list_t *configuration_list)
Definition: db_backend.h:68
db_backend_handle_t * db_backend_mysql_new_handle(void)
int db_backend_handle_set_initialize(db_backend_handle_t *backend_handle, db_backend_handle_initialize_t initialize_function)
Definition: db_backend.c:178
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_free_t free_function
Definition: db_backend.h:180