diff --git a/lmdb-safe.cc b/lmdb-safe.cc index 7f28100..0f34ae4 100644 --- a/lmdb-safe.cc +++ b/lmdb-safe.cc @@ -226,8 +226,4 @@ MDBROCursor MDBROTransaction::getCursor(const MDBDbi& dbi) return MDBROCursor(this, dbi); } -void MDBRWTransaction::put(MDB_dbi dbi, string_view key, string_view val, int flags) -{ - put(dbi, MDB_val{key.size(), (void*)&key[0]}, MDB_val{val.size(), (void*)&val[0]}, flags); -} diff --git a/lmdb-safe.hh b/lmdb-safe.hh index c01a9cd..c340397 100644 --- a/lmdb-safe.hh +++ b/lmdb-safe.hh @@ -169,6 +169,13 @@ public: d_mdbval.mv_data = (void*)&v[0]; } + MDBInVal(const string& v) + { + d_mdbval.mv_size = v.size(); + d_mdbval.mv_data = (void*)&v[0]; + } + + template static MDBInVal fromStruct(const T& t) { @@ -376,17 +383,23 @@ public: void clear(MDB_dbi dbi); - void put(MDB_dbi dbi, const MDB_val& key, const MDB_val& val, int flags=0) + void put(MDB_dbi dbi, const MDBInVal& key, const MDBInVal& val, int flags=0) { if(!d_txn) throw std::runtime_error("Attempt to use a closed RW transaction for put"); int rc; - if((rc=mdb_put(d_txn, dbi, (MDB_val*)&key, (MDB_val*)&val, flags))) + if((rc=mdb_put(d_txn, dbi, + const_cast(&key.d_mdbval), + const_cast(&val.d_mdbval), flags))) 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); - + /* + 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) { @@ -498,9 +511,11 @@ public: return rc; } - int put(MDB_val& key, MDB_val& data, int flags=0) + int put(const MDBOutVal& key, const MDBOutVal& data, int flags=0) { - return mdb_cursor_put(d_cursor, &key, &data, flags); + return mdb_cursor_put(d_cursor, + const_cast(&key.d_mdbval), + const_cast(&data.d_mdbval), flags); } int del(MDB_val& key, int flags) diff --git a/lmdb-test.cc b/lmdb-test.cc index 718af18..67bbf32 100644 --- a/lmdb-test.cc +++ b/lmdb-test.cc @@ -40,8 +40,7 @@ try for(int n=0; n < 15; ++n) { auto txn = env->getRWTransaction(); int val = n + 1000*tid; - txn.put(dbi, {sizeof(val), (char*)&val}, - {sizeof(val), (char*)&val}); + txn.put(dbi, val, val); txn.commit(); cout << "Done with transaction "<(); cout<<"Got something: id="<