git » nmdb » master » tree

[master] / nmdb / be-qdbm.c

#if BE_ENABLE_QDBM

#include <depot.h>	/* QDBM's Depot API */
#include <stdlib.h>

#include "be.h"


int qdbm_set(struct db_conn *db, const unsigned char *key, size_t ksize,
		unsigned char *val, size_t vsize);
int qdbm_get(struct db_conn *db, const unsigned char *key, size_t ksize,
		unsigned char *val, size_t *vsize);
int qdbm_del(struct db_conn *db, const unsigned char *key, size_t ksize);
int qdbm_close(struct db_conn *db);


struct db_conn *qdbm_open(const char *name, int flags)
{
	int f;
	struct db_conn *db;
	DEPOT *qdbm_db;

	f = DP_OREADER | DP_OWRITER | DP_ONOLCK | DP_OCREAT;
	qdbm_db = dpopen(name, f, 0);
	if (qdbm_db == NULL)
		return NULL;

	db = malloc(sizeof(struct db_conn));
	if (db == NULL) {
		dpclose(qdbm_db);
		return NULL;
	}

	db->conn = qdbm_db;
	db->set = qdbm_set;
	db->get = qdbm_get;
	db->del = qdbm_del;
	db->firstkey = NULL;
	db->nextkey = NULL;
	db->close = qdbm_close;

	return db;
}


int qdbm_close(struct db_conn *db)
{
	int rv;

	rv = dpclose(db->conn);
	free(db);
	return rv;
}


int qdbm_set(struct db_conn *db, const unsigned char *key, size_t ksize,
		unsigned char *val, size_t vsize)
{
	return dpput(db->conn, (char *) key, ksize,
			(char *) val, vsize, DP_DOVER);
}


int qdbm_get(struct db_conn *db, const unsigned char *key, size_t ksize,
		unsigned char *val, size_t *vsize)
{
	int rv;

	rv = dpgetwb(db->conn, (char *) key, ksize, 0, *vsize, (char *) val);
	if (rv >= 0) {
		*vsize = rv;
		return 1;
	} else {
		return 0;
	}
}

int qdbm_del(struct db_conn *db, const unsigned char *key, size_t ksize)
{
	return dpout(db->conn, (char *) key, ksize);
}

#else

#include <stddef.h>	/* NULL */

struct db_conn *qdbm_open(const char *name, int flags)
{
	return NULL;
}

#endif