make MDBDbi a value type, improve some error messages, make a delete with no data part

This commit is contained in:
bert hubert 2018-12-13 23:16:46 +01:00
parent 3dd2f703db
commit ac4876876e
2 changed files with 37 additions and 14 deletions

View File

@ -151,7 +151,7 @@ MDBDbi MDBEnv::openDB(const char* dbname, int flags)
MDBRWTransaction::MDBRWTransaction(MDBEnv* parent, int flags) : d_parent(parent) MDBRWTransaction::MDBRWTransaction(MDBEnv* parent, int flags) : d_parent(parent)
{ {
if(d_parent->getROTX() || d_parent->getRWTX()) if(d_parent->getROTX() || d_parent->getRWTX())
throw std::runtime_error("Duplicate transaction"); throw std::runtime_error("Duplicate RW transaction");
for(int tries =0 ; tries < 3; ++tries) { // it might happen twice, who knows for(int tries =0 ; tries < 3; ++tries) { // it might happen twice, who knows
if(int rc=mdb_txn_begin(d_parent->d_env, 0, flags, &d_txn)) { if(int rc=mdb_txn_begin(d_parent->d_env, 0, flags, &d_txn)) {
@ -171,7 +171,7 @@ MDBRWTransaction::MDBRWTransaction(MDBEnv* parent, int flags) : d_parent(parent)
MDBROTransaction::MDBROTransaction(MDBEnv* parent, int flags) : d_parent(parent) MDBROTransaction::MDBROTransaction(MDBEnv* parent, int flags) : d_parent(parent)
{ {
if(d_parent->getRWTX()) if(d_parent->getRWTX())
throw std::runtime_error("Duplicate transaction"); throw std::runtime_error("Duplicate RO transaction");
/* /*
A transaction and its cursors must only be used by a single thread, and a thread may only have a single transaction at a time. If MDB_NOTLS is in use, this does not apply to read-only transactions. */ A transaction and its cursors must only be used by a single thread, and a thread may only have a single transaction at a time. If MDB_NOTLS is in use, this does not apply to read-only transactions. */

View File

@ -36,6 +36,10 @@ The error strategy. Anything that "should never happen" turns into an exception.
class MDBDbi class MDBDbi
{ {
public: public:
MDBDbi()
{
d_dbi = -1;
}
explicit MDBDbi(MDB_env* env, MDB_txn* txn, const char* dbname, int flags); explicit MDBDbi(MDB_env* env, MDB_txn* txn, const char* dbname, int flags);
operator const MDB_dbi&() const operator const MDB_dbi&() const
@ -222,9 +226,9 @@ public:
void renew() void renew()
{ {
if(d_parent->getROTX()) if(d_parent->getROTX())
throw std::runtime_error("Duplicate transaction"); throw std::runtime_error("Duplicate RO transaction");
if(mdb_txn_renew(d_txn)) if(int rc = mdb_txn_renew(d_txn))
throw std::runtime_error("Renewing transaction"); throw std::runtime_error("Renewing RO transaction: "+std::string(mdb_strerror(rc)));
d_parent->incROTX(); d_parent->incROTX();
} }
@ -314,9 +318,19 @@ public:
int get(MDBOutVal& key, MDBOutVal& data, MDB_cursor_op op) int get(MDBOutVal& key, MDBOutVal& data, MDB_cursor_op op)
{ {
// XXX add rc check
return mdb_cursor_get(d_cursor, &key.d_mdbval, &data.d_mdbval, op); return mdb_cursor_get(d_cursor, &key.d_mdbval, &data.d_mdbval, op);
} }
int find(const MDBInVal& in, MDBOutVal& key, MDBOutVal& data)
{
// XXX add rc check
key.d_mdbval = in.d_mdbval;
return mdb_cursor_get(d_cursor, const_cast<MDB_val*>(&key.d_mdbval), &data.d_mdbval, MDB_SET);
}
MDB_cursor* d_cursor; MDB_cursor* d_cursor;
MDBROTransaction* d_parent; MDBROTransaction* d_parent;
}; };
@ -393,17 +407,20 @@ public:
throw std::runtime_error("putting data: " + std::string(mdb_strerror(rc))); throw std::runtime_error("putting data: " + std::string(mdb_strerror(rc)));
} }
/*
void put(MDB_dbi dbi, string_view key, string_view val, int flags=0)
{
put(dbi, MDBInVal(key), MDBInVal(val), flags);
}
*/
int del(MDB_dbi dbi, const MDB_val& key) int del(MDB_dbi dbi, const MDBInVal& key, const MDBInVal& val)
{ {
int rc; int rc;
rc=mdb_del(d_txn, dbi, (MDB_val*)&key, 0); rc=mdb_del(d_txn, dbi, (MDB_val*)&key.d_mdbval, (MDB_val*)&val.d_mdbval);
if(rc && rc != MDB_NOTFOUND)
throw std::runtime_error("deleting data: " + std::string(mdb_strerror(rc)));
return rc;
}
int del(MDB_dbi dbi, const MDBInVal& key)
{
int rc;
rc=mdb_del(d_txn, dbi, (MDB_val*)&key.d_mdbval, 0);
if(rc && rc != MDB_NOTFOUND) if(rc && rc != MDB_NOTFOUND)
throw std::runtime_error("deleting data: " + std::string(mdb_strerror(rc))); throw std::runtime_error("deleting data: " + std::string(mdb_strerror(rc)));
return rc; return rc;
@ -518,15 +535,21 @@ public:
int put(const MDBOutVal& key, const MDBOutVal& data, int flags=0) int put(const MDBOutVal& key, const MDBOutVal& data, int flags=0)
{ {
// XXX check errors
return mdb_cursor_put(d_cursor, return mdb_cursor_put(d_cursor,
const_cast<MDB_val*>(&key.d_mdbval), const_cast<MDB_val*>(&key.d_mdbval),
const_cast<MDB_val*>(&data.d_mdbval), flags); const_cast<MDB_val*>(&data.d_mdbval), flags);
} }
int del(MDB_val& key, int flags) int del(int flags=0)
{ {
return mdb_cursor_del(d_cursor, flags); return mdb_cursor_del(d_cursor, flags);
} }
operator MDB_cursor*&()
{
return d_cursor;
}
MDB_cursor* d_cursor; MDB_cursor* d_cursor;
MDBRWTransaction* d_parent; MDBRWTransaction* d_parent;