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