summaryrefslogtreecommitdiff
path: root/test/format/bdb.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/format/bdb.c')
-rw-r--r--test/format/bdb.c200
1 files changed, 200 insertions, 0 deletions
diff --git a/test/format/bdb.c b/test/format/bdb.c
new file mode 100644
index 00000000000..70633817661
--- /dev/null
+++ b/test/format/bdb.c
@@ -0,0 +1,200 @@
+/*-
+ * Copyright (c) 2008-2012 WiredTiger, Inc.
+ * All rights reserved.
+ *
+ * See the file LICENSE for redistribution information.
+ */
+
+#define BDB 1 /* Berkeley DB header files */
+#include "format.h"
+
+static int
+bdb_compare_reverse(DB *dbp, const DBT *k1, const DBT *k2)
+{
+ int cmp;
+ size_t len;
+
+ UNUSED(dbp);
+
+ len = (k1->size < k2->size) ? k1->size : k2->size;
+ if ((cmp = memcmp(k2->data, k1->data, len)) == 0)
+ cmp = ((int)k1->size - (int)k2->size);
+ return (cmp);
+}
+
+void
+bdb_startup(void)
+{
+ DB *db;
+ DBC *dbc;
+ DB_ENV *dbenv;
+
+ assert(db_env_create(&dbenv, 0) == 0);
+ dbenv->set_errpfx(dbenv, "bdb");
+ dbenv->set_errfile(dbenv, stderr);
+ assert(dbenv->mutex_set_max(dbenv, 10000) == 0);
+ assert(dbenv->set_cachesize(dbenv, 0, 50 * 1024 * 1024, 1) == 0);
+ assert(dbenv->open(dbenv, NULL,
+ DB_CREATE |
+ (g.c_delete_pct == 0 && g.c_insert_pct == 0 && g.c_write_pct == 0 ?
+ 0 : DB_INIT_LOCK) |
+ DB_INIT_MPOOL | DB_PRIVATE, 0) == 0);
+ assert(db_create(&db, dbenv, 0) == 0);
+
+ if (g.c_file_type == ROW && g.c_reverse)
+ assert(db->set_bt_compare(db, bdb_compare_reverse) == 0);
+
+ assert(db->open(db, NULL, "__bdb", NULL, DB_BTREE, DB_CREATE, 0) == 0);
+ g.bdb = db;
+ assert(db->cursor(db, NULL, &dbc, 0) == 0);
+ g.dbc = dbc;
+}
+
+void
+bdb_teardown(void)
+{
+ DB *db;
+ DBC *dbc;
+ DB_ENV *dbenv;
+
+ dbc = g.dbc;
+ db = g.bdb;
+ dbenv = db->dbenv;
+ assert(dbc->close(dbc) == 0);
+ assert(db->close(db, 0) == 0);
+ assert(dbenv->close(dbenv, 0) == 0);
+}
+
+void
+bdb_insert(
+ const void *key_data, uint32_t key_size,
+ const void *value_data, uint32_t value_size)
+{
+ static DBT key, value;
+ DBC *dbc;
+
+ key.data = (void *)key_data;
+ key.size = key_size;
+ value.data = (void *)value_data;
+ value.size = value_size;
+
+ dbc = g.dbc;
+
+ assert(dbc->put(dbc, &key, &value, DB_KEYFIRST) == 0);
+}
+
+int
+bdb_np(int next,
+ void *keyp, uint32_t *keysizep,
+ void *valuep, uint32_t *valuesizep, int *notfoundp)
+{
+ static DBT key, value;
+ DB *db = g.bdb;
+ DBC *dbc = g.dbc;
+ int ret;
+
+ *notfoundp = 0;
+
+ if ((ret =
+ dbc->get(dbc, &key, &value, next ? DB_NEXT : DB_PREV)) != 0) {
+ if (ret == DB_NOTFOUND) {
+ *notfoundp = 1;
+ return (0);
+ }
+ db->err(db, ret,
+ "dbc->get: %s: {%.*s}",
+ next ? "DB_NEXT" : "DB_PREV",
+ (int)key.size, (char *)key.data);
+ return (1);
+ }
+ *(void **)keyp = key.data;
+ *keysizep = key.size;
+ *(void **)valuep = value.data;
+ *valuesizep = value.size;
+ return (0);
+}
+
+int
+bdb_read(uint64_t keyno, void *valuep, uint32_t *valuesizep, int *notfoundp)
+{
+ static DBT key, value;
+ DB *db = g.bdb;
+ DBC *dbc = g.dbc;
+ int ret;
+
+ *notfoundp = 0;
+
+ key_gen(&key.data, &key.size, keyno, 0);
+
+ if ((ret = dbc->get(dbc, &key, &value, DB_SET)) != 0) {
+ if (ret == DB_NOTFOUND) {
+ *notfoundp = 1;
+ return (0);
+ }
+ db->err(db, ret,
+ "dbc->get: DB_SET: {%.*s}",
+ (int)key.size, (char *)key.data);
+ return (1);
+ }
+ *(void **)valuep = value.data;
+ *valuesizep = value.size;
+ return (0);
+}
+
+int
+bdb_put(const void *arg_key, uint32_t arg_key_size,
+ const void *arg_value, uint32_t arg_value_size, int *notfoundp)
+{
+ static DBT key, value;
+ DB *db = g.bdb;
+ DBC *dbc = g.dbc;
+ int ret;
+
+ *notfoundp = 0;
+
+ key.data = (void *)arg_key;
+ key.size = arg_key_size;
+ value.data = (void *)arg_value;
+ value.size = arg_value_size;
+
+ if ((ret = dbc->put(dbc, &key, &value, DB_KEYFIRST)) != 0) {
+ if (ret == DB_NOTFOUND) {
+ *notfoundp = 1;
+ return (0);
+ }
+ db->err(db, ret, "dbc->put: DB_KEYFIRST: {%.*s}{%.*s}",
+ (int)key.size, (char *)key.data,
+ (int)value.size, (char *)value.data);
+ return (1);
+ }
+ return (0);
+}
+
+int
+bdb_del(uint64_t keyno, int *notfoundp)
+{
+ static DBT value;
+ static DBT key;
+ DB *db = g.bdb;
+ DBC *dbc = g.dbc;
+ int ret;
+
+ *notfoundp = 0;
+
+ key_gen(&key.data, &key.size, keyno, 0);
+
+ if ((ret = bdb_read(keyno, &value.data, &value.size, notfoundp)) != 0)
+ return (1);
+ if (*notfoundp)
+ return (0);
+ if ((ret = dbc->del(dbc, 0)) != 0) {
+ if (ret == DB_NOTFOUND) {
+ *notfoundp = 1;
+ return (0);
+ }
+ db->err(db, ret,
+ "dbc->del: {%.*s}", (int)key.size, (char *)key.data);
+ return (1);
+ }
+ return (0);
+}