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)
{
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
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)
{
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. */

View File

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