2007-12-18 16:22:21 +00:00
|
|
|
#include <assert.h>
|
|
|
|
#include <db.h>
|
|
|
|
#include <errno.h>
|
2007-12-18 20:39:02 +00:00
|
|
|
#include <db_cxx.h>
|
2007-12-18 01:31:34 +00:00
|
|
|
|
2007-12-20 23:47:44 +00:00
|
|
|
#define do_maybe_error(errno)
|
|
|
|
|
2007-12-18 16:34:48 +00:00
|
|
|
Db::Db(DbEnv *env, u_int32_t flags)
|
|
|
|
: the_Env(env)
|
|
|
|
{
|
2007-12-18 16:22:21 +00:00
|
|
|
the_db = 0;
|
2007-12-18 16:34:48 +00:00
|
|
|
|
2007-12-18 20:39:02 +00:00
|
|
|
is_private_env = (the_Env == 0);
|
|
|
|
|
2007-12-18 16:22:21 +00:00
|
|
|
DB *tmp_db;
|
|
|
|
int ret = db_create(&tmp_db, the_Env->get_DB_ENV(), flags & !(DB_CXX_NO_EXCEPTIONS));
|
|
|
|
if (ret!=0) {
|
2007-12-20 23:47:44 +00:00
|
|
|
the_Env->maybe_throw_error(ret);
|
|
|
|
// Otherwise cannot do much
|
|
|
|
return;
|
2007-12-18 16:22:21 +00:00
|
|
|
}
|
|
|
|
the_db = tmp_db;
|
|
|
|
tmp_db->api_internal = this;
|
|
|
|
if (is_private_env) {
|
|
|
|
the_Env = new DbEnv(tmp_db->dbenv, flags & DB_CXX_NO_EXCEPTIONS);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-12-18 01:31:34 +00:00
|
|
|
Db::~Db() {
|
2007-12-18 19:57:36 +00:00
|
|
|
if (is_private_env) {
|
|
|
|
delete the_Env; // The destructor closes the env.
|
|
|
|
}
|
2007-12-18 01:31:34 +00:00
|
|
|
if (!the_db) {
|
2007-12-18 01:52:52 +00:00
|
|
|
close(0); // the user should have called close, but we do it here if not done.
|
2007-12-18 01:31:34 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-12-18 01:52:52 +00:00
|
|
|
int Db::close (u_int32_t flags) {
|
2007-12-18 01:31:34 +00:00
|
|
|
if (!the_db) {
|
2007-12-20 23:47:44 +00:00
|
|
|
return the_Env->maybe_throw_error(EINVAL);
|
2007-12-18 01:31:34 +00:00
|
|
|
}
|
2007-12-18 16:22:21 +00:00
|
|
|
the_db->api_internal = 0;
|
2007-12-18 01:52:52 +00:00
|
|
|
|
2007-12-18 16:22:21 +00:00
|
|
|
int ret = the_db->close(the_db, flags);
|
2007-12-18 01:31:34 +00:00
|
|
|
|
2007-12-18 01:52:52 +00:00
|
|
|
the_db = 0;
|
2007-12-18 01:31:34 +00:00
|
|
|
// Do we need to clean up "private environments"?
|
2007-12-18 16:22:21 +00:00
|
|
|
// What about cursors? They should be cleaned up already, but who did it?
|
|
|
|
|
2007-12-20 23:47:44 +00:00
|
|
|
return the_Env->maybe_throw_error(ret);
|
2007-12-18 16:22:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int Db::open(DbTxn *txn, const char *filename, const char *subname, DBTYPE typ, u_int32_t flags, int mode) {
|
|
|
|
int ret = the_db->open(the_db, txn->get_DB_TXN(), filename, subname, typ, flags, mode);
|
2007-12-20 23:47:44 +00:00
|
|
|
return the_Env->maybe_throw_error(ret);
|
2007-12-18 16:22:21 +00:00
|
|
|
}
|
2007-12-18 01:31:34 +00:00
|
|
|
|
2007-12-18 16:22:21 +00:00
|
|
|
int Db::put(DbTxn *txn, Dbt *key, Dbt *data, u_int32_t flags) {
|
|
|
|
int ret = the_db->put(the_db, txn->get_DB_TXN(), key->get_DBT(), data->get_DBT(), flags);
|
2007-12-20 23:47:44 +00:00
|
|
|
return the_Env->maybe_throw_error(ret);
|
2007-12-18 01:31:34 +00:00
|
|
|
}
|
2007-12-18 16:22:21 +00:00
|
|
|
|
2007-12-18 18:34:44 +00:00
|
|
|
int Db::cursor(DbTxn *txn, Dbc **cursorp, u_int32_t flags) {
|
|
|
|
int ret = the_db->cursor(the_db, txn->get_DB_TXN(), (DBC**)cursorp, flags);
|
2007-12-20 23:47:44 +00:00
|
|
|
return the_Env->maybe_throw_error(ret);
|
2007-12-18 18:34:44 +00:00
|
|
|
}
|
2007-12-20 19:00:35 +00:00
|
|
|
|
2007-12-18 19:37:59 +00:00
|
|
|
int Db::set_pagesize(u_int32_t size) {
|
|
|
|
int ret = the_db->set_pagesize(the_db, size);
|
2007-12-20 23:47:44 +00:00
|
|
|
return the_Env->maybe_throw_error(ret);
|
2007-12-18 19:37:59 +00:00
|
|
|
}
|
2007-12-18 18:34:44 +00:00
|
|
|
|
2007-12-20 19:00:35 +00:00
|
|
|
int Db::remove(const char *file, const char *database, u_int32_t flags) {
|
|
|
|
int ret = the_db->remove(the_db, file, database, flags);
|
2007-12-20 23:47:44 +00:00
|
|
|
return the_Env->maybe_throw_error(ret);
|
2007-12-20 19:00:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int Db::set_bt_compare(bt_compare_fcn_type bt_compare_fcn) {
|
|
|
|
int ret = the_db->set_bt_compare(the_db, bt_compare_fcn);
|
2007-12-20 23:47:44 +00:00
|
|
|
return the_Env->maybe_throw_error(ret);
|
2007-12-20 19:00:35 +00:00
|
|
|
}
|