lmdb-safe/examples/resize.cc

92 lines
2.3 KiB
C++

#include "../lmdb-safe.hh"
#include <cstring>
using namespace std;
using namespace LMDBSafe;
template <typename First, typename Second>
struct Pair {
First first;
Second second;
};
int main(int argc, char**)
{
auto env = getMDBEnv("resize", MDB_NOSUBDIR | MDB_NOSYNC, 0600);
auto main = env->openDB("ahu", MDB_CREATE );
MDBInVal key("counter");
auto rwtxn = env->getRWTransaction();
rwtxn->put(main, "counter", "1234");
rwtxn->put(main, MDBInVal::fromStruct(Pair<int, int>{12,13}), "hoi dan 12,13");
rwtxn->put(main, MDBInVal::fromStruct(Pair<int, int>{14,15}),
MDBInVal::fromStruct(Pair<int, int>{20,23}));
MDBOutVal out;
if(!rwtxn->get(main, MDBInVal::fromStruct(Pair<int, int>{12,13}), out))
cout << "Got: " << out.get<string_view>() << endl;
else
cout << "Got nothing!1"<<endl;
if(!rwtxn->get(main, MDBInVal::fromStruct(Pair<int, int>{14,15}), out)) {
auto res = out.get_struct<Pair<int,int>>();
cout << "Got: " << res.first<<", "<<res.second << endl;
}
else
cout << "Got nothing!1"<<endl;
rwtxn->put(main, 12.12, 7.3);
if(!rwtxn->get(main, 12.12, out)) {
cout<<"Got: "<< out.get<double>() <<endl;
}
else
cout << "Got nothing!1"<<endl;
rwtxn->commit();
return 0;
if(argc==1) {
for(;;) {
auto rotxn = env->getROTransaction();
MDBOutVal data;
if(!rotxn->get(main, key, data)) {
cout<<"Counter is "<<data.get<unsigned int>() << endl;
cout <<data.get<string>() << endl;
cout<<data.get<string_view>() << endl;
struct Bert
{
uint16_t x,y;
};
auto b = data.get_struct<Bert>();
cout<<b.x<<" "<<b.y<<endl;
cout<<data.get<unsigned long>() << endl;
}
else
cout<<"Didn't find it"<<endl;
exit(1);
}
}
else {
size_t size = 1ULL*4096*244140ULL;
for(unsigned int n=0;;++n) {
if(!(n%16384)) {
size += 16384;
if(int rc=mdb_env_set_mapsize(*env.get(), size))
throw std::runtime_error("Resizing: "+string(mdb_strerror(rc)));
cout<<"Did resize"<<endl;
}
auto txn = env->getRWTransaction();
txn->put(main, key, MDBInVal(n));
for(unsigned int k=0; k < 100; ++k)
txn->put(main, MDBInVal(n+1000*k), MDBInVal(n+1000*k));
txn->commit();
}
}
}