1*00b67f09SDavid van Moolenbroek /* $NetBSD: sqlitedb.c,v 1.4 2014/12/10 04:37:57 christos Exp $ */
2*00b67f09SDavid van Moolenbroek
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek * Copyright (C) 2007 Internet Software Consortium.
5*00b67f09SDavid van Moolenbroek *
6*00b67f09SDavid van Moolenbroek * Permission to use, copy, modify, and distribute this software for any
7*00b67f09SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above
8*00b67f09SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies.
9*00b67f09SDavid van Moolenbroek *
10*00b67f09SDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
11*00b67f09SDavid van Moolenbroek * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
12*00b67f09SDavid van Moolenbroek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
13*00b67f09SDavid van Moolenbroek * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
14*00b67f09SDavid van Moolenbroek * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
15*00b67f09SDavid van Moolenbroek * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
16*00b67f09SDavid van Moolenbroek * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
17*00b67f09SDavid van Moolenbroek * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18*00b67f09SDavid van Moolenbroek */
19*00b67f09SDavid van Moolenbroek
20*00b67f09SDavid van Moolenbroek /* Id: sqlitedb.c,v 1.2 2011/10/11 00:09:02 each Exp */
21*00b67f09SDavid van Moolenbroek
22*00b67f09SDavid van Moolenbroek #include <config.h>
23*00b67f09SDavid van Moolenbroek
24*00b67f09SDavid van Moolenbroek #include <stdio.h>
25*00b67f09SDavid van Moolenbroek #include <string.h>
26*00b67f09SDavid van Moolenbroek #include <stdlib.h>
27*00b67f09SDavid van Moolenbroek #include <unistd.h>
28*00b67f09SDavid van Moolenbroek
29*00b67f09SDavid van Moolenbroek #include <sqlite3.h>
30*00b67f09SDavid van Moolenbroek
31*00b67f09SDavid van Moolenbroek #include <isc/mem.h>
32*00b67f09SDavid van Moolenbroek #include <isc/print.h>
33*00b67f09SDavid van Moolenbroek #include <isc/result.h>
34*00b67f09SDavid van Moolenbroek #include <isc/util.h>
35*00b67f09SDavid van Moolenbroek
36*00b67f09SDavid van Moolenbroek #include <dns/sdb.h>
37*00b67f09SDavid van Moolenbroek #include <dns/result.h>
38*00b67f09SDavid van Moolenbroek
39*00b67f09SDavid van Moolenbroek #include <named/globals.h>
40*00b67f09SDavid van Moolenbroek
41*00b67f09SDavid van Moolenbroek #include "sqlitedb.h"
42*00b67f09SDavid van Moolenbroek
43*00b67f09SDavid van Moolenbroek /*
44*00b67f09SDavid van Moolenbroek * A simple database driver that interfaces to a SQLite database.
45*00b67f09SDavid van Moolenbroek *
46*00b67f09SDavid van Moolenbroek * The table must contain the fields "name", "rdtype", and "rdata", and
47*00b67f09SDavid van Moolenbroek * is expected to contain a properly constructed zone. The program "zonetodb"
48*00b67f09SDavid van Moolenbroek * creates such a table.
49*00b67f09SDavid van Moolenbroek */
50*00b67f09SDavid van Moolenbroek
51*00b67f09SDavid van Moolenbroek static dns_sdbimplementation_t *sqlitedb = NULL;
52*00b67f09SDavid van Moolenbroek
53*00b67f09SDavid van Moolenbroek typedef struct _dbinfo {
54*00b67f09SDavid van Moolenbroek sqlite3 *db;
55*00b67f09SDavid van Moolenbroek char *filename;
56*00b67f09SDavid van Moolenbroek char *table;
57*00b67f09SDavid van Moolenbroek } dbinfo_t;
58*00b67f09SDavid van Moolenbroek
59*00b67f09SDavid van Moolenbroek
60*00b67f09SDavid van Moolenbroek static isc_result_t
db_connect(dbinfo_t * dbi)61*00b67f09SDavid van Moolenbroek db_connect(dbinfo_t *dbi)
62*00b67f09SDavid van Moolenbroek {
63*00b67f09SDavid van Moolenbroek if (sqlite3_open(dbi->filename, &dbi->db) == SQLITE_OK) {
64*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
65*00b67f09SDavid van Moolenbroek } else {
66*00b67f09SDavid van Moolenbroek /* a connection is returned even if the open fails */
67*00b67f09SDavid van Moolenbroek sqlite3_close(dbi->db);
68*00b67f09SDavid van Moolenbroek dbi->db = NULL;
69*00b67f09SDavid van Moolenbroek return (ISC_R_FAILURE);
70*00b67f09SDavid van Moolenbroek }
71*00b67f09SDavid van Moolenbroek }
72*00b67f09SDavid van Moolenbroek
73*00b67f09SDavid van Moolenbroek
74*00b67f09SDavid van Moolenbroek typedef struct _lookup_parm_t {
75*00b67f09SDavid van Moolenbroek int i;
76*00b67f09SDavid van Moolenbroek dns_sdblookup_t *lookup;
77*00b67f09SDavid van Moolenbroek isc_result_t result;
78*00b67f09SDavid van Moolenbroek } lookup_parm_t;
79*00b67f09SDavid van Moolenbroek
80*00b67f09SDavid van Moolenbroek
81*00b67f09SDavid van Moolenbroek static int
sqlitedb_lookup_cb(void * p,int cc,char ** cv,char ** cn)82*00b67f09SDavid van Moolenbroek sqlitedb_lookup_cb(void *p, int cc, char **cv, char **cn)
83*00b67f09SDavid van Moolenbroek {
84*00b67f09SDavid van Moolenbroek lookup_parm_t *parm = p;
85*00b67f09SDavid van Moolenbroek dns_ttl_t ttl;
86*00b67f09SDavid van Moolenbroek char *endp;
87*00b67f09SDavid van Moolenbroek
88*00b67f09SDavid van Moolenbroek /* FIXME - check these(num/names); I'm assuming a mapping for now */
89*00b67f09SDavid van Moolenbroek char *ttlstr = cv[0];
90*00b67f09SDavid van Moolenbroek char *type = cv[1];
91*00b67f09SDavid van Moolenbroek char *data = cv[2];
92*00b67f09SDavid van Moolenbroek
93*00b67f09SDavid van Moolenbroek UNUSED(cc);
94*00b67f09SDavid van Moolenbroek UNUSED(cn);
95*00b67f09SDavid van Moolenbroek
96*00b67f09SDavid van Moolenbroek ttl = strtol(ttlstr, &endp, 10);
97*00b67f09SDavid van Moolenbroek if (*endp) {
98*00b67f09SDavid van Moolenbroek parm->result = DNS_R_BADTTL;
99*00b67f09SDavid van Moolenbroek return 1;
100*00b67f09SDavid van Moolenbroek }
101*00b67f09SDavid van Moolenbroek
102*00b67f09SDavid van Moolenbroek parm->result = dns_sdb_putrr(parm->lookup, type, ttl, data);
103*00b67f09SDavid van Moolenbroek
104*00b67f09SDavid van Moolenbroek if (parm->result != ISC_R_SUCCESS)
105*00b67f09SDavid van Moolenbroek return 1;
106*00b67f09SDavid van Moolenbroek
107*00b67f09SDavid van Moolenbroek (parm->i)++;
108*00b67f09SDavid van Moolenbroek
109*00b67f09SDavid van Moolenbroek return 0;
110*00b67f09SDavid van Moolenbroek }
111*00b67f09SDavid van Moolenbroek
112*00b67f09SDavid van Moolenbroek
113*00b67f09SDavid van Moolenbroek #ifdef DNS_CLIENTINFO_VERSION
114*00b67f09SDavid van Moolenbroek static isc_result_t
sqlitedb_lookup(const char * zone,const char * name,void * dbdata,dns_sdblookup_t * lookup,dns_clientinfomethods_t * methods,dns_clientinfo_t * clientinfo)115*00b67f09SDavid van Moolenbroek sqlitedb_lookup(const char *zone, const char *name, void *dbdata,
116*00b67f09SDavid van Moolenbroek dns_sdblookup_t *lookup, dns_clientinfomethods_t *methods,
117*00b67f09SDavid van Moolenbroek dns_clientinfo_t *clientinfo)
118*00b67f09SDavid van Moolenbroek #else
119*00b67f09SDavid van Moolenbroek static isc_result_t
120*00b67f09SDavid van Moolenbroek sqlitedb_lookup(const char *zone, const char *name, void *dbdata,
121*00b67f09SDavid van Moolenbroek dns_sdblookup_t *lookup)
122*00b67f09SDavid van Moolenbroek #endif /* DNS_CLIENTINFO_VERSION */
123*00b67f09SDavid van Moolenbroek /*
124*00b67f09SDavid van Moolenbroek * synchronous absolute name lookup
125*00b67f09SDavid van Moolenbroek */
126*00b67f09SDavid van Moolenbroek {
127*00b67f09SDavid van Moolenbroek dbinfo_t *dbi = (dbinfo_t *) dbdata;
128*00b67f09SDavid van Moolenbroek char *sql;
129*00b67f09SDavid van Moolenbroek lookup_parm_t parm = { 0, lookup, ISC_R_SUCCESS };
130*00b67f09SDavid van Moolenbroek char *errmsg = NULL;
131*00b67f09SDavid van Moolenbroek int result;
132*00b67f09SDavid van Moolenbroek
133*00b67f09SDavid van Moolenbroek UNUSED(zone);
134*00b67f09SDavid van Moolenbroek #ifdef DNS_CLIENTINFO_VERSION
135*00b67f09SDavid van Moolenbroek UNUSED(methods);
136*00b67f09SDavid van Moolenbroek UNUSED(clientinfo);
137*00b67f09SDavid van Moolenbroek #endif /* DNS_CLIENTINFO_VERSION */
138*00b67f09SDavid van Moolenbroek
139*00b67f09SDavid van Moolenbroek sql = sqlite3_mprintf(
140*00b67f09SDavid van Moolenbroek "SELECT TTL,RDTYPE,RDATA FROM \"%q\" WHERE "
141*00b67f09SDavid van Moolenbroek "lower(NAME) = lower('%q')",
142*00b67f09SDavid van Moolenbroek dbi->table, name);
143*00b67f09SDavid van Moolenbroek
144*00b67f09SDavid van Moolenbroek result = sqlite3_exec(dbi->db, sql,
145*00b67f09SDavid van Moolenbroek &sqlitedb_lookup_cb, &parm,
146*00b67f09SDavid van Moolenbroek &errmsg);
147*00b67f09SDavid van Moolenbroek sqlite3_free(sql);
148*00b67f09SDavid van Moolenbroek
149*00b67f09SDavid van Moolenbroek if (result != SQLITE_OK)
150*00b67f09SDavid van Moolenbroek return (ISC_R_FAILURE);
151*00b67f09SDavid van Moolenbroek if (parm.i == 0)
152*00b67f09SDavid van Moolenbroek return (ISC_R_NOTFOUND);
153*00b67f09SDavid van Moolenbroek
154*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
155*00b67f09SDavid van Moolenbroek }
156*00b67f09SDavid van Moolenbroek
157*00b67f09SDavid van Moolenbroek
158*00b67f09SDavid van Moolenbroek typedef struct _allnodes_parm_t {
159*00b67f09SDavid van Moolenbroek int i;
160*00b67f09SDavid van Moolenbroek dns_sdballnodes_t *allnodes;
161*00b67f09SDavid van Moolenbroek isc_result_t result;
162*00b67f09SDavid van Moolenbroek } allnodes_parm_t;
163*00b67f09SDavid van Moolenbroek
164*00b67f09SDavid van Moolenbroek
165*00b67f09SDavid van Moolenbroek static int
sqlitedb_allnodes_cb(void * p,int cc,char ** cv,char ** cn)166*00b67f09SDavid van Moolenbroek sqlitedb_allnodes_cb(void *p, int cc, char **cv, char **cn)
167*00b67f09SDavid van Moolenbroek {
168*00b67f09SDavid van Moolenbroek allnodes_parm_t *parm = p;
169*00b67f09SDavid van Moolenbroek dns_ttl_t ttl;
170*00b67f09SDavid van Moolenbroek char *endp;
171*00b67f09SDavid van Moolenbroek
172*00b67f09SDavid van Moolenbroek /* FIXME - check these(num/names); I'm assuming a mapping for now */
173*00b67f09SDavid van Moolenbroek char *ttlstr = cv[0];
174*00b67f09SDavid van Moolenbroek char *name = cv[1];
175*00b67f09SDavid van Moolenbroek char *type = cv[2];
176*00b67f09SDavid van Moolenbroek char *data = cv[3];
177*00b67f09SDavid van Moolenbroek
178*00b67f09SDavid van Moolenbroek UNUSED(cc);
179*00b67f09SDavid van Moolenbroek UNUSED(cn);
180*00b67f09SDavid van Moolenbroek
181*00b67f09SDavid van Moolenbroek ttl = strtol(ttlstr, &endp, 10);
182*00b67f09SDavid van Moolenbroek if (*endp) {
183*00b67f09SDavid van Moolenbroek parm->result = DNS_R_BADTTL;
184*00b67f09SDavid van Moolenbroek return 1;
185*00b67f09SDavid van Moolenbroek }
186*00b67f09SDavid van Moolenbroek
187*00b67f09SDavid van Moolenbroek parm->result = dns_sdb_putnamedrr(parm->allnodes, name, type, ttl, data);
188*00b67f09SDavid van Moolenbroek
189*00b67f09SDavid van Moolenbroek if (parm->result != ISC_R_SUCCESS)
190*00b67f09SDavid van Moolenbroek return 1;
191*00b67f09SDavid van Moolenbroek
192*00b67f09SDavid van Moolenbroek (parm->i)++;
193*00b67f09SDavid van Moolenbroek
194*00b67f09SDavid van Moolenbroek return 0;
195*00b67f09SDavid van Moolenbroek }
196*00b67f09SDavid van Moolenbroek
197*00b67f09SDavid van Moolenbroek
198*00b67f09SDavid van Moolenbroek static isc_result_t
sqlitedb_allnodes(const char * zone,void * dbdata,dns_sdballnodes_t * allnodes)199*00b67f09SDavid van Moolenbroek sqlitedb_allnodes(const char *zone,
200*00b67f09SDavid van Moolenbroek void *dbdata,
201*00b67f09SDavid van Moolenbroek dns_sdballnodes_t *allnodes)
202*00b67f09SDavid van Moolenbroek {
203*00b67f09SDavid van Moolenbroek dbinfo_t *dbi = (dbinfo_t *) dbdata;
204*00b67f09SDavid van Moolenbroek char *sql;
205*00b67f09SDavid van Moolenbroek allnodes_parm_t parm = { 0, allnodes, ISC_R_SUCCESS };
206*00b67f09SDavid van Moolenbroek char *errmsg = NULL;
207*00b67f09SDavid van Moolenbroek int result;
208*00b67f09SDavid van Moolenbroek
209*00b67f09SDavid van Moolenbroek UNUSED(zone);
210*00b67f09SDavid van Moolenbroek
211*00b67f09SDavid van Moolenbroek sql = sqlite3_mprintf(
212*00b67f09SDavid van Moolenbroek "SELECT TTL,NAME,RDTYPE,RDATA FROM \"%q\" ORDER BY NAME",
213*00b67f09SDavid van Moolenbroek dbi->table);
214*00b67f09SDavid van Moolenbroek
215*00b67f09SDavid van Moolenbroek result = sqlite3_exec(dbi->db, sql,
216*00b67f09SDavid van Moolenbroek &sqlitedb_allnodes_cb, &parm,
217*00b67f09SDavid van Moolenbroek &errmsg);
218*00b67f09SDavid van Moolenbroek sqlite3_free(sql);
219*00b67f09SDavid van Moolenbroek
220*00b67f09SDavid van Moolenbroek if (result != SQLITE_OK)
221*00b67f09SDavid van Moolenbroek return (ISC_R_FAILURE);
222*00b67f09SDavid van Moolenbroek if (parm.i == 0)
223*00b67f09SDavid van Moolenbroek return (ISC_R_NOTFOUND);
224*00b67f09SDavid van Moolenbroek
225*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
226*00b67f09SDavid van Moolenbroek }
227*00b67f09SDavid van Moolenbroek
228*00b67f09SDavid van Moolenbroek
229*00b67f09SDavid van Moolenbroek static void
sqlitedb_destroy(const char * zone,void * driverdata,void ** dbdata)230*00b67f09SDavid van Moolenbroek sqlitedb_destroy(const char *zone, void *driverdata, void **dbdata)
231*00b67f09SDavid van Moolenbroek {
232*00b67f09SDavid van Moolenbroek dbinfo_t *dbi = *dbdata;
233*00b67f09SDavid van Moolenbroek
234*00b67f09SDavid van Moolenbroek UNUSED(zone);
235*00b67f09SDavid van Moolenbroek UNUSED(driverdata);
236*00b67f09SDavid van Moolenbroek
237*00b67f09SDavid van Moolenbroek if (dbi->db != NULL)
238*00b67f09SDavid van Moolenbroek sqlite3_close(dbi->db);
239*00b67f09SDavid van Moolenbroek if (dbi->table != NULL)
240*00b67f09SDavid van Moolenbroek isc_mem_free(ns_g_mctx, dbi->table);
241*00b67f09SDavid van Moolenbroek if (dbi->filename != NULL)
242*00b67f09SDavid van Moolenbroek isc_mem_free(ns_g_mctx, dbi->filename);
243*00b67f09SDavid van Moolenbroek
244*00b67f09SDavid van Moolenbroek isc_mem_put(ns_g_mctx, dbi, sizeof(dbinfo_t));
245*00b67f09SDavid van Moolenbroek }
246*00b67f09SDavid van Moolenbroek
247*00b67f09SDavid van Moolenbroek
248*00b67f09SDavid van Moolenbroek #define STRDUP_OR_FAIL(target, source) \
249*00b67f09SDavid van Moolenbroek do { \
250*00b67f09SDavid van Moolenbroek target = isc_mem_strdup(ns_g_mctx, source); \
251*00b67f09SDavid van Moolenbroek if (target == NULL) { \
252*00b67f09SDavid van Moolenbroek result = ISC_R_NOMEMORY; \
253*00b67f09SDavid van Moolenbroek goto cleanup; \
254*00b67f09SDavid van Moolenbroek } \
255*00b67f09SDavid van Moolenbroek } while (/*CONSTCOND*/0);
256*00b67f09SDavid van Moolenbroek
257*00b67f09SDavid van Moolenbroek /*
258*00b67f09SDavid van Moolenbroek * Create a connection to the database and save any necessary information
259*00b67f09SDavid van Moolenbroek * in dbdata.
260*00b67f09SDavid van Moolenbroek *
261*00b67f09SDavid van Moolenbroek * argv[0] is the name of the database file
262*00b67f09SDavid van Moolenbroek * argv[1] is the name of the table
263*00b67f09SDavid van Moolenbroek */
264*00b67f09SDavid van Moolenbroek static isc_result_t
sqlitedb_create(const char * zone,int argc,char ** argv,void * driverdata,void ** dbdata)265*00b67f09SDavid van Moolenbroek sqlitedb_create(const char *zone,
266*00b67f09SDavid van Moolenbroek int argc, char **argv,
267*00b67f09SDavid van Moolenbroek void *driverdata, void **dbdata)
268*00b67f09SDavid van Moolenbroek {
269*00b67f09SDavid van Moolenbroek dbinfo_t *dbi;
270*00b67f09SDavid van Moolenbroek isc_result_t result;
271*00b67f09SDavid van Moolenbroek
272*00b67f09SDavid van Moolenbroek UNUSED(zone);
273*00b67f09SDavid van Moolenbroek UNUSED(driverdata);
274*00b67f09SDavid van Moolenbroek
275*00b67f09SDavid van Moolenbroek if (argc < 2)
276*00b67f09SDavid van Moolenbroek return (ISC_R_FAILURE);
277*00b67f09SDavid van Moolenbroek
278*00b67f09SDavid van Moolenbroek dbi = isc_mem_get(ns_g_mctx, sizeof(dbinfo_t));
279*00b67f09SDavid van Moolenbroek if (dbi == NULL)
280*00b67f09SDavid van Moolenbroek return (ISC_R_NOMEMORY);
281*00b67f09SDavid van Moolenbroek dbi->db = NULL;
282*00b67f09SDavid van Moolenbroek dbi->filename = NULL;
283*00b67f09SDavid van Moolenbroek dbi->table = NULL;
284*00b67f09SDavid van Moolenbroek
285*00b67f09SDavid van Moolenbroek STRDUP_OR_FAIL(dbi->filename, argv[0]);
286*00b67f09SDavid van Moolenbroek STRDUP_OR_FAIL(dbi->table, argv[1]);
287*00b67f09SDavid van Moolenbroek
288*00b67f09SDavid van Moolenbroek result = db_connect(dbi);
289*00b67f09SDavid van Moolenbroek if (result != ISC_R_SUCCESS)
290*00b67f09SDavid van Moolenbroek goto cleanup;
291*00b67f09SDavid van Moolenbroek
292*00b67f09SDavid van Moolenbroek *dbdata = dbi;
293*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
294*00b67f09SDavid van Moolenbroek
295*00b67f09SDavid van Moolenbroek cleanup:
296*00b67f09SDavid van Moolenbroek sqlitedb_destroy(zone, driverdata, (void **)&dbi);
297*00b67f09SDavid van Moolenbroek return (result);
298*00b67f09SDavid van Moolenbroek }
299*00b67f09SDavid van Moolenbroek
300*00b67f09SDavid van Moolenbroek
301*00b67f09SDavid van Moolenbroek /*
302*00b67f09SDavid van Moolenbroek * Since the SQL database corresponds to a zone, the authority data should
303*00b67f09SDavid van Moolenbroek * be returned by the lookup() function. Therefore the authority() function
304*00b67f09SDavid van Moolenbroek * is NULL.
305*00b67f09SDavid van Moolenbroek */
306*00b67f09SDavid van Moolenbroek static dns_sdbmethods_t sqlitedb_methods = {
307*00b67f09SDavid van Moolenbroek sqlitedb_lookup,
308*00b67f09SDavid van Moolenbroek NULL, /* authority */
309*00b67f09SDavid van Moolenbroek sqlitedb_allnodes,
310*00b67f09SDavid van Moolenbroek sqlitedb_create,
311*00b67f09SDavid van Moolenbroek sqlitedb_destroy,
312*00b67f09SDavid van Moolenbroek NULL /* lookup2 */
313*00b67f09SDavid van Moolenbroek };
314*00b67f09SDavid van Moolenbroek
315*00b67f09SDavid van Moolenbroek
316*00b67f09SDavid van Moolenbroek /*
317*00b67f09SDavid van Moolenbroek * Wrapper around dns_sdb_register().
318*00b67f09SDavid van Moolenbroek */
319*00b67f09SDavid van Moolenbroek isc_result_t
sqlitedb_init(void)320*00b67f09SDavid van Moolenbroek sqlitedb_init(void)
321*00b67f09SDavid van Moolenbroek {
322*00b67f09SDavid van Moolenbroek unsigned int flags;
323*00b67f09SDavid van Moolenbroek flags = 0;
324*00b67f09SDavid van Moolenbroek return (dns_sdb_register("sqlite", &sqlitedb_methods, NULL, flags,
325*00b67f09SDavid van Moolenbroek ns_g_mctx, &sqlitedb));
326*00b67f09SDavid van Moolenbroek }
327*00b67f09SDavid van Moolenbroek
328*00b67f09SDavid van Moolenbroek
329*00b67f09SDavid van Moolenbroek /*
330*00b67f09SDavid van Moolenbroek * Wrapper around dns_sdb_unregister().
331*00b67f09SDavid van Moolenbroek */
332*00b67f09SDavid van Moolenbroek void
sqlitedb_clear(void)333*00b67f09SDavid van Moolenbroek sqlitedb_clear(void)
334*00b67f09SDavid van Moolenbroek {
335*00b67f09SDavid van Moolenbroek if (sqlitedb != NULL)
336*00b67f09SDavid van Moolenbroek dns_sdb_unregister(&sqlitedb);
337*00b67f09SDavid van Moolenbroek }
338