OpenDNSSEC-enforcer  2.1.4
database_version.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 "database_version.h"
31 #include "db_error.h"
32 
33 
34 #include <string.h>
35 
41 static db_object_t* __database_version_new_object(const db_connection_t* connection) {
42  db_object_field_list_t* object_field_list;
43  db_object_field_t* object_field;
44  db_object_t* object;
45 
46  if (!(object = db_object_new())
47  || db_object_set_connection(object, connection)
48  || db_object_set_table(object, "databaseVersion")
49  || db_object_set_primary_key_name(object, "id")
50  || !(object_field_list = db_object_field_list_new()))
51  {
52  db_object_free(object);
53  return NULL;
54  }
55 
56  if (!(object_field = db_object_field_new())
57  || db_object_field_set_name(object_field, "id")
59  || db_object_field_list_add(object_field_list, object_field))
60  {
61  db_object_field_free(object_field);
62  db_object_field_list_free(object_field_list);
63  db_object_free(object);
64  return NULL;
65  }
66 
67  if (!(object_field = db_object_field_new())
68  || db_object_field_set_name(object_field, "rev")
70  || db_object_field_list_add(object_field_list, object_field))
71  {
72  db_object_field_free(object_field);
73  db_object_field_list_free(object_field_list);
74  db_object_free(object);
75  return NULL;
76  }
77 
78  if (!(object_field = db_object_field_new())
79  || db_object_field_set_name(object_field, "version")
81  || db_object_field_list_add(object_field_list, object_field))
82  {
83  db_object_field_free(object_field);
84  db_object_field_list_free(object_field_list);
85  db_object_free(object);
86  return NULL;
87  }
88 
89  if (db_object_set_object_field_list(object, object_field_list)) {
90  db_object_field_list_free(object_field_list);
91  db_object_free(object);
92  return NULL;
93  }
94 
95  return object;
96 }
97 
98 /* DATABASE VERSION */
99 
100 
101 
104  (database_version_t*)calloc(1, sizeof(database_version_t));
105 
106  if (database_version) {
107  if (!(database_version->dbo = __database_version_new_object(connection))) {
108  free(database_version);
109  return NULL;
110  }
111  db_value_reset(&(database_version->id));
112  db_value_reset(&(database_version->rev));
113  }
114 
115  return database_version;
116 }
117 
119  if (database_version) {
120  if (database_version->dbo) {
121  db_object_free(database_version->dbo);
122  }
123  db_value_reset(&(database_version->id));
124  db_value_reset(&(database_version->rev));
125  free(database_version);
126  }
127 }
128 
130  const db_value_set_t* value_set;
131 
132  if (!database_version) {
133  return DB_ERROR_UNKNOWN;
134  }
135  if (!result) {
136  return DB_ERROR_UNKNOWN;
137  }
138 
139  db_value_reset(&(database_version->id));
140  db_value_reset(&(database_version->rev));
141  if (!(value_set = db_result_value_set(result))
142  || db_value_set_size(value_set) != 3
143  || db_value_copy(&(database_version->id), db_value_set_at(value_set, 0))
144  || db_value_copy(&(database_version->rev), db_value_set_at(value_set, 1))
145  || db_value_to_uint32(db_value_set_at(value_set, 2), &(database_version->version)))
146  {
147  return DB_ERROR_UNKNOWN;
148  }
149 
150  return DB_OK;
151 }
152 
154  if (!database_version) {
155  return 0;
156  }
157 
158  return database_version->version;
159 }
160 
161 /* DATABASE VERSION LIST */
162 
163 
164 
168 
169  if (database_version_list) {
170  if (!(database_version_list->dbo = __database_version_new_object(connection))) {
171  free(database_version_list);
172  return NULL;
173  }
174  }
175 
176  return database_version_list;
177 }
178 
180  size_t i;
181 
182  if (database_version_list) {
183  if (database_version_list->dbo) {
184  db_object_free(database_version_list->dbo);
185  }
186  if (database_version_list->result_list) {
187  db_result_list_free(database_version_list->result_list);
188  }
189  if (database_version_list->database_version) {
190  database_version_free(database_version_list->database_version);
191  }
192  for (i = 0; i < database_version_list->object_list_size; i++) {
193  if (database_version_list->object_list[i]) {
194  database_version_free(database_version_list->object_list[i]);
195  }
196  }
197  if (database_version_list->object_list) {
198  free(database_version_list->object_list);
199  }
200  free(database_version_list);
201  }
202 }
203 
204 static int database_version_list_get_associated(database_version_list_t* database_version_list) {
205  (void)database_version_list;
206  return DB_OK;
207 }
208 
210  size_t i;
211 
212  if (!database_version_list) {
213  return DB_ERROR_UNKNOWN;
214  }
215  if (!database_version_list->dbo) {
216  return DB_ERROR_UNKNOWN;
217  }
218 
219  if (database_version_list->result_list) {
220  db_result_list_free(database_version_list->result_list);
221  }
222  if (database_version_list->object_list_size) {
223  for (i = 0; i < database_version_list->object_list_size; i++) {
224  if (database_version_list->object_list[i]) {
225  database_version_free(database_version_list->object_list[i]);
226  }
227  }
228  database_version_list->object_list_size = 0;
229  database_version_list->object_list_first = 0;
230  }
231  if (database_version_list->object_list) {
232  free(database_version_list->object_list);
233  database_version_list->object_list = NULL;
234  }
235  if (!(database_version_list->result_list = db_object_read(database_version_list->dbo, NULL, NULL))
236  || db_result_list_fetch_all(database_version_list->result_list))
237  {
238  return DB_ERROR_UNKNOWN;
239  }
240  if (database_version_list->associated_fetch
241  && database_version_list_get_associated(database_version_list))
242  {
243  return DB_ERROR_UNKNOWN;
244  }
245  return DB_OK;
246 }
247 
249  database_version_list_t* database_version_list;
250 
251  if (!connection) {
252  return NULL;
253  }
254 
255  if (!(database_version_list = database_version_list_new(connection))
256  || database_version_list_get(database_version_list))
257  {
258  database_version_list_free(database_version_list);
259  return NULL;
260  }
261 
262  return database_version_list;
263 }
264 
266  const db_result_t* result;
267 
268  if (!database_version_list) {
269  return NULL;
270  }
271 
272  if (database_version_list->object_store) {
273  if (!database_version_list->object_list) {
274  if (!database_version_list->result_list) {
275  return NULL;
276  }
277  if (!db_result_list_size(database_version_list->result_list)) {
278  return NULL;
279  }
280  if (!(database_version_list->object_list = (database_version_t**)calloc(db_result_list_size(database_version_list->result_list), sizeof(database_version_t*)))) {
281  return NULL;
282  }
283  database_version_list->object_list_size = db_result_list_size(database_version_list->result_list);
284  database_version_list->object_list_position = 0;
285  }
286  else if (database_version_list->object_list_first) {
287  database_version_list->object_list_first = 0;
288  database_version_list->object_list_position = 0;
289  }
290  else {
291  database_version_list->object_list_position++;
292  }
293  if (database_version_list->object_list_position >= database_version_list->object_list_size) {
294  return NULL;
295  }
296  if (!(database_version_list->object_list[database_version_list->object_list_position])) {
297  if (!database_version_list->result_list) {
298  return NULL;
299  }
300  if (!(result = db_result_list_next(database_version_list->result_list))) {
301  return NULL;
302  }
303  if (!(database_version_list->object_list[database_version_list->object_list_position] = database_version_new(db_object_connection(database_version_list->dbo)))) {
304  return NULL;
305  }
306  if (database_version_from_result(database_version_list->object_list[database_version_list->object_list_position], result)) {
307  return NULL;
308  }
309  }
310  return database_version_list->object_list[database_version_list->object_list_position];
311  } else {
312  database_version_free(database_version_list->database_version);
313  database_version_list->database_version = NULL;
314  }
315 
316  if (!database_version_list->result_list) {
317  return NULL;
318  }
319 
320  if (!(result = db_result_list_next(database_version_list->result_list))) {
321  return NULL;
322  }
323  if (!database_version_list->database_version) {
324  if (!(database_version_list->database_version = database_version_new(db_object_connection(database_version_list->dbo)))) {
325  return NULL;
326  }
327  }
328  if (database_version_from_result(database_version_list->database_version, result)) {
329  return NULL;
330  }
331  return database_version_list->database_version;
332 }
database_version_t ** object_list
unsigned int version
int db_object_set_object_field_list(db_object_t *object, db_object_field_list_t *object_field_list)
Definition: db_object.c:386
int db_object_set_primary_key_name(db_object_t *object, const char *primary_key_name)
Definition: db_object.c:371
db_object_field_list_t * db_object_field_list_new(void)
Definition: db_object.c:174
int db_object_field_set_name(db_object_field_t *object_field, const char *name)
Definition: db_object.c:110
const db_value_t * db_value_set_at(const db_value_set_t *value_set, size_t at)
Definition: db_value.c:742
int db_value_to_uint32(const db_value_t *value, db_type_uint32_t *to_uint32)
Definition: db_value.c:372
#define DB_ERROR_UNKNOWN
Definition: db_error.h:40
int db_value_copy(db_value_t *value, const db_value_t *from_value)
Definition: db_value.c:77
database_version_t * database_version_new(const db_connection_t *connection)
int db_object_field_set_type(db_object_field_t *object_field, db_type_t type)
Definition: db_object.c:122
int database_version_from_result(database_version_t *database_version, const db_result_t *result)
database_version_list_t * database_version_list_new_get(const db_connection_t *connection)
void database_version_free(database_version_t *database_version)
db_result_list_t * result_list
database_version_list_t * database_version_list_new(const db_connection_t *connection)
int db_object_set_connection(db_object_t *object, const db_connection_t *connection)
Definition: db_object.c:341
const db_connection_t * db_object_connection(const db_object_t *object)
Definition: db_object.c:320
database_version_t * database_version
size_t db_value_set_size(const db_value_set_t *value_set)
Definition: db_value.c:734
db_result_list_t * db_object_read(const db_object_t *object, const db_join_list_t *join_list, const db_clause_list_t *clause_list)
Definition: db_object.c:424
void db_object_free(db_object_t *object)
Definition: db_object.c:311
const database_version_t * database_version_list_next(database_version_list_t *database_version_list)
void db_result_list_free(db_result_list_t *result_list)
Definition: db_result.c:160
void db_value_reset(db_value_t *value)
Definition: db_value.c:60
db_object_field_t * db_object_field_new(void)
Definition: db_object.c:40
int database_version_list_get(database_version_list_t *database_version_list)
unsigned int database_version_version(const database_version_t *database_version)
void database_version_list_free(database_version_list_t *database_version_list)
size_t db_result_list_size(const db_result_list_t *result_list)
Definition: db_result.c:333
void db_object_field_free(db_object_field_t *object_field)
Definition: db_object.c:69
const db_result_t * db_result_list_next(db_result_list_t *result_list)
Definition: db_result.c:310
void db_object_field_list_free(db_object_field_list_t *object_field_list)
Definition: db_object.c:199
db_object_t * db_object_new(void)
Definition: db_object.c:304
#define DB_OK
Definition: db_error.h:36
db_object_t * dbo
const db_value_set_t * db_result_value_set(const db_result_t *result)
Definition: db_result.c:97
int db_object_set_table(db_object_t *object, const char *table)
Definition: db_object.c:356
int db_result_list_fetch_all(db_result_list_t *result_list)
Definition: db_result.c:341
int db_object_field_list_add(db_object_field_list_t *object_field_list, db_object_field_t *object_field)
Definition: db_object.c:254