1 /*
2 Copyright (C) 2015-2021, Dirk Krause
3 SPDX-License-Identifier: BSD-3-Clause
4 */
5
6 /*
7 WARNING: This file was generated by the dkct program (see
8 http://dktools.sourceforge.net/ for details).
9 Changes you make here will be lost if dkct is run again!
10 You should modify the original source and run dkct on it.
11 Original source: dk4dbit8.ctr
12 */
13
14 /** @file dk4dbit8.c The dk4dbit8 module.
15 */
16
17
18 #include "dk4conf.h"
19
20 #if DK4_HAVE_ASSERT_H
21 #ifndef ASSERT_H_INCLUDED
22 #include <assert.h>
23 #define ASSERT_H_INCLUDED 1
24 #endif
25 #endif
26
27 #include <libdk4base/dk4str8.h>
28 #include <libdk4dbi/dk4dbit8.h>
29 #include <libdk4ma/dk4maasz.h>
30
31
32
33
34
35
36
37 /** Object for database traversal.
38 */
39 typedef struct {
40 void *obj; /**< Object for string traversal. */
41 dk4dbi_c8_traverse_fct_t *fct; /**< String traversal function. */
42 } dk4dbi_c8_traversal_object_t;
43
44
45
46 int
dk4dbi_c8_del(dk4_dbi_t * db,const char * k,dk4_er_t * erp)47 dk4dbi_c8_del(
48 dk4_dbi_t *db,
49 const char *k,
50 dk4_er_t *erp
51 )
52 {
53 dk4_er_t er; /* Internal error report for size calc */
54 size_t ks = 0; /* Key size */
55 int back = 0;
56
57 if ((NULL != db) && (NULL != k)) {
58 dk4error_init(&er);
59 ks = dk4ma_size_t_add(1, dk4str8_len(k), &er);
60 if (DK4_E_NONE == er.ec) {
61 back = dk4dbi_delete(db, k, ks, erp);
62 } else {
63 dk4error_copy(erp, &er);
64 }
65 } else {
66 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
67 }
68 return back;
69 }
70
71
72
73 int
dk4dbi_c8_set(dk4_dbi_t * db,const char * k,const char * v,dk4_er_t * erp)74 dk4dbi_c8_set(
75 dk4_dbi_t *db,
76 const char *k,
77 const char *v,
78 dk4_er_t *erp
79 )
80 {
81 dk4_er_t er; /* Internal error report for size calc */
82 size_t ks = 0; /* Key size */
83 size_t vs = 0; /* Value size */
84 int back = 0;
85
86 if ((NULL != db) && (NULL != k)) {
87 if (NULL != v) {
88 dk4error_init(&er);
89 ks = dk4ma_size_t_add(1, dk4str8_len(k), &er);
90 vs = dk4ma_size_t_add(1, dk4str8_len(v), &er);
91 if (DK4_E_NONE == er.ec) {
92 back = dk4dbi_set(db, k, ks, v, vs, erp);
93 } else {
94 dk4error_copy(erp, &er);
95 }
96 } else {
97 back = dk4dbi_c8_del(db, k, erp);
98 }
99 } else {
100 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
101 }
102 return back;
103 }
104
105
106
107 int
dk4dbi_c8_get(dk4_dbi_t * db,const char * k,char * vbuf,size_t vsz,dk4_er_t * erp)108 dk4dbi_c8_get(
109 dk4_dbi_t *db,
110 const char *k,
111 char *vbuf,
112 size_t vsz,
113 dk4_er_t *erp
114 )
115 {
116 dk4_er_t er; /* Internal error report for size calc */
117 size_t ks = 0; /* Key size */
118 size_t ressz = 0; /* Result size */
119 int back = 0;
120
121
122 if ((NULL != vbuf) && (0 < vsz)) { *vbuf = '\0'; }
123 if ((NULL != db) && (NULL != k) && (NULL != vbuf) && (0 < vsz)) {
124 dk4error_init(&er);
125 ressz = vsz;
126 ks = dk4ma_size_t_add(1, dk4str8_len(k), &er);
127 if (DK4_E_NONE == er.ec) {
128 if (0 != dk4dbi_get(db, k, ks, vbuf, &ressz, erp)) {
129 if (0 < ressz) {
130 if ('\0' == vbuf[ressz - 1]) {
131 back = 1;
132 } else {
133 if (ressz < vsz) {
134 vbuf[ressz] = '\0';
135 back = 1;
136 } else {
137 *vbuf = '\0';
138 dk4error_set_simple_error_code(erp, DK4_E_BUFFER_TOO_SMALL);
139 }
140 }
141 } else {
142 *vbuf = '\0';
143 dk4error_set_simple_error_code(erp, DK4_E_NOT_FOUND);
144 }
145 }
146 #if TRACE_DEBUG
147 else {
148 }
149 #endif
150 } else {
151 dk4error_copy(erp, &er);
152 }
153 } else {
154 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
155 }
156 return back;
157 }
158
159
160
161 /** Function to traverse a simple database.
162 The function must check the kb, ks, vb and vs arguments
163 for validity, they are passed as found by the backend
164 functions (this means pointers may be NULL, sizes may be 0).
165 @param Object modified during traversal, may be NULL.
166 @param kb Key data.
167 @param ks Key size.
168 @param vb Value data.
169 @param vs Value size.
170 @return 1 on success, 0 on error (can continue), -1 on error (abort).
171 */
172 static
173 int
dk4dbi_c8_internal_traverse(void * obj,const void * kb,size_t ks,const void * vb,size_t vs)174 dk4dbi_c8_internal_traverse(
175 void *obj,
176 const void *kb,
177 size_t ks,
178 const void *vb,
179 size_t vs
180 )
181 {
182 dk4dbi_c8_traversal_object_t *myobj; /* Passed from dk4dbi_traverse() */
183 const char *pk; /* Key pointer */
184 const char *pv; /* Value pointer */
185 int back = 0;
186
187 if ((NULL != obj) && (NULL != kb) && (NULL != vb) && (0 < ks) && (0 < vs)) {
188 pk = (const char *)kb;
189 pv = (const char *)vb;
190 if (('\0' == pk[ks - 1]) && ('\0' == pv[vs - 1])) {
191 myobj = (dk4dbi_c8_traversal_object_t *)obj;
192 back = (*(myobj->fct))(myobj->obj, pk, pv);
193 }
194 }
195 return back;
196 }
197
198
199
200 int
dk4dbi_c8_traverse(dk4_dbi_t * db,void * obj,dk4dbi_c8_traverse_fct_t * fct)201 dk4dbi_c8_traverse(
202 dk4_dbi_t *db,
203 void *obj,
204 dk4dbi_c8_traverse_fct_t *fct
205 )
206 {
207 dk4dbi_c8_traversal_object_t myobj; /* Passed to dk4dbi_traverse */
208 int back = -1;
209
210
211 if ((NULL != db) && (NULL != fct)) {
212 myobj.obj = obj;
213 myobj.fct = fct;
214 back = dk4dbi_traverse(db, &myobj, dk4dbi_c8_internal_traverse);
215 }
216 return back;
217 }
218
219
220