22 #include "opensync_internals.h"
24 void osync_db_errcall_fcn(
const char *errpfx,
char *msg)
26 osync_debug(
"OSGRP", 3,
"BDB error %s: %s", errpfx, msg);
29 DB_ENV *osync_db_setup(
char *configdir, FILE *errfp)
34 if ((ret = db_env_create(&dbenv, 0)) != 0) {
35 fprintf(errfp,
"opensync: %s\n", db_strerror(ret));
38 dbenv->set_errfile(dbenv, errfp);
39 dbenv->set_errpfx(dbenv,
"opensync");
41 if ((ret = dbenv->set_verbose(dbenv, DB_VERB_RECOVERY, 1)) != 0) {
42 dbenv->err(dbenv, ret,
"set_verbose: db");
46 dbenv->set_errcall(dbenv, osync_db_errcall_fcn);
53 if ((ret = dbenv->set_data_dir(dbenv,
"db")) != 0) {
54 dbenv->err(dbenv, ret,
"set_data_dir: db");
58 if ((ret = dbenv->set_flags(dbenv, DB_LOG_AUTOREMOVE, 1)) != 0) {
59 dbenv->err(dbenv, ret,
"set_flags: db");
63 if ((ret = dbenv->open(dbenv, configdir, DB_CREATE | DB_INIT_LOG | DB_INIT_MPOOL | DB_INIT_TXN | DB_RECOVER | DB_PRIVATE | DB_INIT_LOCK, 0)) != 0) {
64 dbenv->err(dbenv, ret,
"environment open: %s", configdir);
71 (void)dbenv->close(dbenv, 0);
75 void osync_db_tear_down(DB_ENV *dbenv)
77 dbenv->close(dbenv, 0);
80 DB *osync_db_open(
char *filename,
char *dbname,
int type, DB_ENV *dbenv)
84 if ((ret = db_create(&dbp, NULL, 0)) != 0) {
85 printf(
"db_create: %s\n", db_strerror(ret));
91 if ((ret = dbp->verify(dbp, g_strdup(filename), NULL, NULL, 0)) != 0) {
93 printf(
"%i verify failed for db %s: %s\n", ret, filename, db_strerror(ret));
99 if ((ret = db_create(&dbp, dbenv, 0)) != 0) {
100 printf(
"db_create: %s\n", db_strerror(ret));
104 if ((ret = dbp->set_flags(dbp, DB_RECNUM)) != 0) {
105 dbp->err(dbp, ret,
"set_flags: DB_RECNUM");
110 if ((ret = dbp->open(dbp, NULL, g_strdup(filename), g_strdup(dbname), type, DB_CREATE, 0664)) != 0) {
111 printf(
"opening db %s", filename);
117 int stubcallback(DB *dbp,
const DBT *dbt1,
const DBT *dbt2, DBT *dbt3)
119 printf(
"Stubcallback called\n");
120 return DB_DONOTINDEX;
123 void osync_db_sync(DB *dbp)
128 DB *osync_db_open_secondary(DB *firstdb,
char *filename,
char *dbname,
int (*callback)(DB *,
const DBT *,
const DBT *, DBT *), DB_ENV *dbenv)
132 int (*secfunc)(DB *,
const DBT *,
const DBT *, DBT *);
134 if ((ret = db_create(&sdbp, dbenv, 0)) != 0) {
135 printf(
"sec_db_create: %s\n", db_strerror(ret));
138 if ((ret = sdbp->set_flags(sdbp, DB_DUP | DB_DUPSORT)) != 0) {
139 printf(
"sec_db_set_flag: %s\n", db_strerror(ret));
142 if ((ret = sdbp->open(sdbp, NULL, filename, dbname, DB_BTREE, DB_CREATE, 0600)) != 0) {
143 printf(
"sec_db_open: %s\n", db_strerror(ret));
148 secfunc = stubcallback;
152 if ((ret = firstdb->associate(firstdb, NULL, sdbp, secfunc, 0)) != 0) {
153 printf(
"sec_db_associate: %s\n", db_strerror(ret));
159 osync_bool osync_db_put_dbt(DB *dbp, DBT *key, DBT *data)
162 if ((ret = dbp->put(dbp, NULL, key, data, 0)) != 0) {
163 dbp->err(dbp, ret,
"DB->put");
170 osync_bool osync_db_put(DB *dbp,
void *key,
int keysize,
void *data,
int datasize)
173 memset(&keydbt, 0,
sizeof(keydbt));
174 memset(&datadbt, 0,
sizeof(datadbt));
177 keydbt.size = keysize;
179 datadbt.size = datasize;
181 return osync_db_put_dbt(dbp, &keydbt, &datadbt);
184 osync_bool osync_db_del_dbt(DB *dbp, DBT *key)
188 if ((ret = dbp->del(dbp, NULL, key, 0)) != 0) {
189 dbp->err(dbp, ret,
"DB->del");
196 osync_bool osync_db_del(DB *dbp,
void *key,
int keysize)
199 memset(&keydbt, 0,
sizeof(keydbt));
202 keydbt.size = keysize;
203 return osync_db_del_dbt(dbp, &keydbt);
206 void osync_db_close(DB *dbp)
211 DBC *osync_db_cursor_new(DB *dbp)
216 if ((ret = dbp->cursor(dbp, NULL, &dbcp, 0)) != 0) {
217 dbp->err(dbp, ret,
"DB->cursor");
223 osync_bool osync_db_cursor_next_sec(DBC *dbcp,
void **pkey,
void **skey,
void **data)
225 DBT pkeydbt, skeydbt, datadbt;
228 memset(&pkeydbt, 0,
sizeof(pkeydbt));
229 memset(&skeydbt, 0,
sizeof(skeydbt));
230 memset(&datadbt, 0,
sizeof(datadbt));
232 if ((ret = dbcp->c_pget(dbcp, &skeydbt, &pkeydbt, &datadbt, DB_NEXT)) == 0) {
233 *pkey = g_malloc0(pkeydbt.size);
234 memcpy(*pkey, pkeydbt.data, pkeydbt.size);
235 *skey = g_malloc0(skeydbt.size);
236 memcpy(*skey, skeydbt.data, skeydbt.size);
237 *data = g_malloc0(datadbt.size);
238 memcpy(*data, datadbt.data, datadbt.size);
244 osync_bool osync_db_cursor_next(DBC *dbcp,
void **key,
void **data)
249 memset(&keydbt, 0,
sizeof(keydbt));
250 memset(&datadbt, 0,
sizeof(datadbt));
252 if ((ret = dbcp->c_get(dbcp, &keydbt, &datadbt, DB_NEXT)) == 0) {
253 *key = g_malloc0(keydbt.size);
254 memcpy(*key, keydbt.data, keydbt.size);
255 *data = g_malloc0(datadbt.size);
256 memcpy(*data, datadbt.data, datadbt.size);
263 osync_bool osync_db_get(DB *dbp,
void *key,
int keysize,
void **target)
267 memset(&keydbt, 0,
sizeof(keydbt));
268 memset(&datadbt, 0,
sizeof(datadbt));
271 keydbt.size = keysize;
273 if ((ret = dbp->get(dbp, NULL, &keydbt, &datadbt, 0)) == 0) {
274 *target = g_malloc0(datadbt.size);
275 memcpy(*target, datadbt.data, datadbt.size);
278 if (ret != DB_NOTFOUND) {
279 dbp->err(dbp, ret,
"DB->get");
285 void osync_db_empty(DB *db)
287 u_int32_t deleted = 0;
288 db->truncate(db, NULL, &deleted, DB_AUTO_COMMIT);
291 void osync_db_cursor_close(DBC *dbcp)