Add CMake build system replacing Makefile
* Allow building a shared library with proper exports * Remove bundled catch2 library in favor of searching for system-provided version * Adapt/fix tests and examples to latest changes * Fix several warnings
This commit is contained in:
parent
adcb9338e8
commit
b499a201c2
|
@ -0,0 +1,78 @@
|
||||||
|
cmake_minimum_required(VERSION 3.3.0 FATAL_ERROR)
|
||||||
|
|
||||||
|
project(lmdb-safe)
|
||||||
|
|
||||||
|
# define meta data
|
||||||
|
set(META_PROJECT_NAME lmdb-safe)
|
||||||
|
set(META_PROJECT_TYPE library)
|
||||||
|
set(META_PROJECT_VARNAME LMDB_SAFE)
|
||||||
|
set(META_APP_NAME "LMDB-Safe")
|
||||||
|
set(META_APP_AUTHOR "Martchus")
|
||||||
|
set(META_APP_URL "https://github.com/${META_APP_AUTHOR}/${META_PROJECT_NAME}")
|
||||||
|
set(META_APP_DESCRIPTION "A safe modern & performant C++ wrapper of LMDB")
|
||||||
|
set(META_VERSION_MAJOR 0)
|
||||||
|
set(META_VERSION_MINOR 0)
|
||||||
|
set(META_VERSION_PATCH 1)
|
||||||
|
set(META_VERSION_EXACT_SONAME ON)
|
||||||
|
|
||||||
|
# add project files
|
||||||
|
set(HEADER_FILES
|
||||||
|
lmdb-safe.hh
|
||||||
|
lmdb-typed.hh
|
||||||
|
lmdb-reflective.hh
|
||||||
|
lmdb-boost-serialization.hh)
|
||||||
|
set(SRC_FILES
|
||||||
|
lmdb-safe.cc
|
||||||
|
lmdb-typed.cc)
|
||||||
|
|
||||||
|
set(DOC_FILES README.md)
|
||||||
|
|
||||||
|
# find c++utilities
|
||||||
|
set(CONFIGURATION_PACKAGE_SUFFIX
|
||||||
|
""
|
||||||
|
CACHE STRING "sets the suffix for find_package() calls to packages configured via c++utilities")
|
||||||
|
set(PACKAGE_NAMESPACE
|
||||||
|
""
|
||||||
|
CACHE STRING "sets the namespace (prefix) for find_package() calls to packages configured via c++utilities")
|
||||||
|
if (PACKAGE_NAMESPACE)
|
||||||
|
set(PACKAGE_NAMESPACE_PREFIX "${PACKAGE_NAMESPACE}-")
|
||||||
|
endif ()
|
||||||
|
find_package(${PACKAGE_NAMESPACE_PREFIX}c++utilities${CONFIGURATION_PACKAGE_SUFFIX} 5.5.0 REQUIRED)
|
||||||
|
use_cpp_utilities(ONLY_HEADERS VISIBILITY PUBLIC)
|
||||||
|
use_cpp_utilities(LIBRARIES_VARIABLE "TEST_LIBRARIES")
|
||||||
|
|
||||||
|
# find lmdb
|
||||||
|
include(3rdParty)
|
||||||
|
use_pkg_config_module(PKG_CONFIG_MODULES "lmdb")
|
||||||
|
|
||||||
|
# find boost libraries (required by tests)
|
||||||
|
option(BOOST_STATIC_LINKAGE "${STATIC_LINKAGE}" "link statically against Boost (instead of dynamically)")
|
||||||
|
set(Boost_USE_MULTITHREADED ON)
|
||||||
|
if (BOOST_STATIC_LINKAGE)
|
||||||
|
set(Boost_USE_STATIC_LIBS ON)
|
||||||
|
endif ()
|
||||||
|
set(BOOST_ARGS "REQUIRED;COMPONENTS;serialization;iostreams")
|
||||||
|
use_package(TARGET_NAME Boost::iostreams PACKAGE_NAME Boost PACKAGE_ARGS "${BOOST_ARGS}" LIBRARIES_VARIABLE "TEST_LIBRARIES")
|
||||||
|
use_package(TARGET_NAME Boost::serialization PACKAGE_NAME Boost PACKAGE_ARGS "${BOOST_ARGS}" LIBRARIES_VARIABLE "TEST_LIBRARIES")
|
||||||
|
|
||||||
|
# find catch2 (required by tests)
|
||||||
|
use_package(TARGET_NAME Catch2::Catch2 PACKAGE_NAME Catch2 LIBRARIES_VARIABLE "TEST_LIBRARIES")
|
||||||
|
|
||||||
|
# include modules to apply configuration
|
||||||
|
include(BasicConfig)
|
||||||
|
include(WindowsResources)
|
||||||
|
include(LibraryTarget)
|
||||||
|
include(Doxygen)
|
||||||
|
include(ConfigHeader)
|
||||||
|
|
||||||
|
# configure test targets
|
||||||
|
include(TestUtilities)
|
||||||
|
list(APPEND TEST_LIBRARIES ${META_TARGET_NAME})
|
||||||
|
set(TESTS basic typed)
|
||||||
|
foreach (TEST ${TESTS})
|
||||||
|
configure_test_target(TEST_NAME "${TEST}_tests" SRC_FILES "tests/${TEST}.cc" LIBRARIES "${TEST_LIBRARIES}")
|
||||||
|
endforeach ()
|
||||||
|
set(EXAMPLES multi rel resize scale typed)
|
||||||
|
foreach (EXAMPLE ${EXAMPLES})
|
||||||
|
configure_test_target(TEST_NAME "${EXAMPLE}_example" SRC_FILES "examples/${EXAMPLE}.cc" LIBRARIES "${TEST_LIBRARIES}")
|
||||||
|
endforeach ()
|
|
@ -1,4 +1,4 @@
|
||||||
#include "lmdb-safe.hh"
|
#include "../lmdb-safe.hh"
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
#include "lmdb-safe.hh"
|
#include "../lmdb-safe.hh"
|
||||||
|
|
||||||
#include <boost/archive/binary_oarchive.hpp>
|
#include <boost/archive/binary_oarchive.hpp>
|
||||||
#include <boost/archive/binary_iarchive.hpp>
|
#include <boost/archive/binary_iarchive.hpp>
|
||||||
|
|
||||||
|
#include <c++utilities/application/global.h>
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
@ -15,6 +17,7 @@ struct Record
|
||||||
template<class Archive>
|
template<class Archive>
|
||||||
void serialize(Archive & ar, const unsigned int version)
|
void serialize(Archive & ar, const unsigned int version)
|
||||||
{
|
{
|
||||||
|
CPP_UTILITIES_UNUSED(version)
|
||||||
ar & id & domain_id & name & type & ttl & content & enabled & auth;
|
ar & id & domain_id & name & type & ttl & content & enabled & auth;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,7 +55,7 @@ static void store(MDBRWTransaction& txn, MDBDbi& records, MDBDbi& domainidx, MDB
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int, char** argv)
|
||||||
{
|
{
|
||||||
auto env = getMDBEnv("pdns", 0, 0600);
|
auto env = getMDBEnv("pdns", 0, 0600);
|
||||||
auto records = env->openDB("records", MDB_INTEGERKEY | MDB_CREATE );
|
auto records = env->openDB("records", MDB_INTEGERKEY | MDB_CREATE );
|
|
@ -1,11 +1,17 @@
|
||||||
#include "lmdb-safe.hh"
|
#include "../lmdb-safe.hh"
|
||||||
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace LMDBSafe;
|
using namespace LMDBSafe;
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
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 env = getMDBEnv("resize", MDB_NOSUBDIR | MDB_NOSYNC, 0600);
|
||||||
auto main = env->openDB("ahu", MDB_CREATE );
|
auto main = env->openDB("ahu", MDB_CREATE );
|
||||||
|
@ -14,20 +20,20 @@ int main(int argc, char** argv)
|
||||||
|
|
||||||
auto rwtxn = env->getRWTransaction();
|
auto rwtxn = env->getRWTransaction();
|
||||||
rwtxn->put(main, "counter", "1234");
|
rwtxn->put(main, "counter", "1234");
|
||||||
rwtxn->put(main, MDBInVal::fromStruct(std::make_pair(12,13)), "hoi dan 12,13");
|
rwtxn->put(main, MDBInVal::fromStruct(Pair<int, int>{12,13}), "hoi dan 12,13");
|
||||||
|
|
||||||
rwtxn->put(main, MDBInVal::fromStruct(std::make_pair(14,15)),
|
rwtxn->put(main, MDBInVal::fromStruct(Pair<int, int>{14,15}),
|
||||||
MDBInVal::fromStruct(std::make_pair(20,23)));
|
MDBInVal::fromStruct(Pair<int, int>{20,23}));
|
||||||
|
|
||||||
|
|
||||||
MDBOutVal out;
|
MDBOutVal out;
|
||||||
if(!rwtxn->get(main, MDBInVal::fromStruct(std::make_pair(12,13)), out))
|
if(!rwtxn->get(main, MDBInVal::fromStruct(Pair<int, int>{12,13}), out))
|
||||||
cout << "Got: " << out.get<string_view>() << endl;
|
cout << "Got: " << out.get<string_view>() << endl;
|
||||||
else
|
else
|
||||||
cout << "Got nothing!1"<<endl;
|
cout << "Got nothing!1"<<endl;
|
||||||
|
|
||||||
if(!rwtxn->get(main, MDBInVal::fromStruct(std::make_pair(14,15)), out)) {
|
if(!rwtxn->get(main, MDBInVal::fromStruct(Pair<int, int>{14,15}), out)) {
|
||||||
auto res = out.get_struct<pair<int,int>>();
|
auto res = out.get_struct<Pair<int,int>>();
|
||||||
cout << "Got: " << res.first<<", "<<res.second << endl;
|
cout << "Got: " << res.first<<", "<<res.second << endl;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -77,7 +83,7 @@ int main(int argc, char** argv)
|
||||||
}
|
}
|
||||||
auto txn = env->getRWTransaction();
|
auto txn = env->getRWTransaction();
|
||||||
txn->put(main, key, MDBInVal(n));
|
txn->put(main, key, MDBInVal(n));
|
||||||
for(int k=0; k < 100; ++k)
|
for(unsigned int k=0; k < 100; ++k)
|
||||||
txn->put(main, MDBInVal(n+1000*k), MDBInVal(n+1000*k));
|
txn->put(main, MDBInVal(n+1000*k), MDBInVal(n+1000*k));
|
||||||
txn->commit();
|
txn->commit();
|
||||||
}
|
}
|
|
@ -1,4 +1,6 @@
|
||||||
#include "lmdb-safe.hh"
|
#include "../lmdb-safe.hh"
|
||||||
|
|
||||||
|
#include <c++utilities/conversion/stringconversion.h>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace LMDBSafe;
|
using namespace LMDBSafe;
|
||||||
|
@ -22,12 +24,12 @@ struct MDBVal
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
auto env = getMDBEnv("./database", 0, 0600);
|
auto env = getMDBEnv("./database", 0, 0600);
|
||||||
auto dbi = env->openDB(0, MDB_CREATE | MDB_INTEGERKEY);
|
auto dbi = env->openDB(std::string_view(), MDB_CREATE | MDB_INTEGERKEY);
|
||||||
auto txn = env->getRWTransaction();
|
auto txn = env->getRWTransaction();
|
||||||
|
|
||||||
unsigned int limit=20000000;
|
unsigned int limit=20000000;
|
||||||
if(argc > 1)
|
if(argc > 1)
|
||||||
limit = atoi(argv[1]);
|
limit = CppUtilities::stringToNumber<unsigned int>(argv[1]);
|
||||||
|
|
||||||
cout<<"Counting records.. "; cout.flush();
|
cout<<"Counting records.. "; cout.flush();
|
||||||
auto cursor = txn->getCursor(dbi);
|
auto cursor = txn->getCursor(dbi);
|
|
@ -1,4 +1,7 @@
|
||||||
#include "lmdb-typed.hh"
|
#include "../lmdb-boost-serialization.hh"
|
||||||
|
#include "../lmdb-typed.hh"
|
||||||
|
|
||||||
|
#include <c++utilities/application/global.h>
|
||||||
|
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
|
@ -27,12 +30,14 @@ struct DomainInfo
|
||||||
template<class Archive>
|
template<class Archive>
|
||||||
void serialize(Archive & ar, DomainInfo& g, const unsigned int version)
|
void serialize(Archive & ar, DomainInfo& g, const unsigned int version)
|
||||||
{
|
{
|
||||||
|
CPP_UTILITIES_UNUSED(version)
|
||||||
ar & g.qname & g.master;
|
ar & g.qname & g.master;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Archive>
|
template<class Archive>
|
||||||
void serialize(Archive & ar, DNSResourceRecord& g, const unsigned int version)
|
void serialize(Archive & ar, DNSResourceRecord& g, const unsigned int version)
|
||||||
{
|
{
|
||||||
|
CPP_UTILITIES_UNUSED(version)
|
||||||
ar & g.qtype;
|
ar & g.qtype;
|
||||||
ar & g.qname;
|
ar & g.qname;
|
||||||
ar & g.content;
|
ar & g.content;
|
||||||
|
@ -49,7 +54,7 @@ struct compound
|
||||||
{
|
{
|
||||||
std::string ret;
|
std::string ret;
|
||||||
uint32_t id = htonl(rr.domain_id);
|
uint32_t id = htonl(rr.domain_id);
|
||||||
ret.assign((char*)&id, 4);
|
ret.assign(reinterpret_cast<char *>(&id), 4);
|
||||||
ret.append(rr.ordername);
|
ret.append(rr.ordername);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -199,23 +204,23 @@ int main()
|
||||||
|
|
||||||
cout<<"Going to iterate over the name powerdns.com!"<<endl;
|
cout<<"Going to iterate over the name powerdns.com!"<<endl;
|
||||||
|
|
||||||
for(auto iter = txn.equal_range<0>("powerdns.com"); iter.first != iter.second; ++iter.first) {
|
for(auto iter2 = txn.equal_range<0>("powerdns.com"); iter2.first != iter2.second; ++iter2.first) {
|
||||||
cout << iter.first.getID()<<": "<<iter.first->qname << " " << iter.first->qtype << " " << iter.first->content <<endl;
|
cout << iter2.first.getID()<<": "<<iter2.first->qname << " " << iter2.first->qtype << " " << iter2.first->content <<endl;
|
||||||
}
|
}
|
||||||
cout<<"Done iterating"<<endl;
|
cout<<"Done iterating"<<endl;
|
||||||
|
|
||||||
cout<<"Going to iterate over the zone ds9a.nl!"<<endl;
|
cout<<"Going to iterate over the zone ds9a.nl!"<<endl;
|
||||||
|
|
||||||
for(auto iter = txn.find<1>(10); iter != txn.end(); ++iter) {
|
for(auto iter2 = txn.find<1>(10); iter2 != txn.end(); ++iter2) {
|
||||||
cout << iter.getID()<<": "<<iter->qname << " " << iter->qtype << " " << iter->content <<endl;
|
cout << iter2.getID()<<": "<<iter2->qname << " " << iter2->qtype << " " << iter2->content <<endl;
|
||||||
}
|
}
|
||||||
cout<<"Done iterating"<<endl;
|
cout<<"Done iterating"<<endl;
|
||||||
|
|
||||||
DNSResourceRecord change;
|
DNSResourceRecord change;
|
||||||
txn.get(1, change);
|
txn.get(1, change);
|
||||||
cout<<"1.auth: "<<change.auth << endl;
|
cout<<"1.auth: "<<change.auth << endl;
|
||||||
txn.modify(1, [](DNSResourceRecord& c) {
|
txn.modify(1, [](DNSResourceRecord& record) {
|
||||||
c.auth = false;
|
record.auth = false;
|
||||||
});
|
});
|
||||||
txn.get(1, change);
|
txn.get(1, change);
|
||||||
cout<<"1.auth: "<<change.auth << endl;
|
cout<<"1.auth: "<<change.auth << endl;
|
14362
ext/catch2/catch.hpp
14362
ext/catch2/catch.hpp
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,27 @@
|
||||||
|
// Created via CMake from template global.h.in
|
||||||
|
// WARNING! Any changes to this file will be overwritten by the next CMake run!
|
||||||
|
|
||||||
|
#ifndef LMDB_SAFE_GLOBAL
|
||||||
|
#define LMDB_SAFE_GLOBAL
|
||||||
|
|
||||||
|
#include <c++utilities/application/global.h>
|
||||||
|
|
||||||
|
#ifdef LMDB_SAFE_STATIC
|
||||||
|
#define LMDB_SAFE_EXPORT
|
||||||
|
#define LMDB_SAFE_IMPORT
|
||||||
|
#else
|
||||||
|
#define LMDB_SAFE_EXPORT CPP_UTILITIES_GENERIC_LIB_EXPORT
|
||||||
|
#define LMDB_SAFE_IMPORT CPP_UTILITIES_GENERIC_LIB_IMPORT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \def LMDB_SAFE_EXPORT
|
||||||
|
* \brief Marks the symbol to be exported by the lmdb-safe library.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \def LMDB_SAFE_IMPORT
|
||||||
|
* \brief Marks the symbol to be imported from the lmdb-safe library.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif // LMDB_SAFE_GLOBAL
|
|
@ -0,0 +1,38 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "./lmdb-safe.hh"
|
||||||
|
|
||||||
|
#include <boost/archive/binary_oarchive.hpp>
|
||||||
|
#include <boost/archive/binary_iarchive.hpp>
|
||||||
|
|
||||||
|
#include <boost/serialization/vector.hpp>
|
||||||
|
#include <boost/serialization/string.hpp>
|
||||||
|
#include <boost/serialization/utility.hpp>
|
||||||
|
|
||||||
|
#include <boost/iostreams/stream.hpp>
|
||||||
|
#include <boost/iostreams/stream_buffer.hpp>
|
||||||
|
#include <boost/iostreams/device/back_inserter.hpp>
|
||||||
|
|
||||||
|
namespace LMDBSafe {
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
std::string serToString(const T& t)
|
||||||
|
{
|
||||||
|
auto ret = std::string();
|
||||||
|
auto inserter = boost::iostreams::back_insert_device<std::string>(ret);
|
||||||
|
auto stream = boost::iostreams::stream<boost::iostreams::back_insert_device<std::string>>(inserter);
|
||||||
|
auto oa = boost::archive::binary_oarchive(stream, boost::archive::no_header | boost::archive::no_codecvt);
|
||||||
|
oa << t;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void serFromString(string_view str, T& ret)
|
||||||
|
{
|
||||||
|
auto source = boost::iostreams::array_source(str.data(), str.size());
|
||||||
|
auto stream = boost::iostreams::stream<boost::iostreams::array_source>(source);
|
||||||
|
auto ia = boost::archive::binary_iarchive(stream, boost::archive::no_header|boost::archive::no_codecvt);
|
||||||
|
ia >> ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -2,7 +2,7 @@
|
||||||
// Example for plugging a (de)serialization implementation using the binary
|
// Example for plugging a (de)serialization implementation using the binary
|
||||||
// (de)serializer provided by https://github.com/Martchus/reflective-rapidjson.
|
// (de)serializer provided by https://github.com/Martchus/reflective-rapidjson.
|
||||||
|
|
||||||
#include "lmdb-safe.hh"
|
#include "./lmdb-safe.hh"
|
||||||
|
|
||||||
#include <reflective-rapidjson/lib/binary/reflector.h>
|
#include <reflective-rapidjson/lib/binary/reflector.h>
|
||||||
|
|
||||||
|
|
31
lmdb-safe.hh
31
lmdb-safe.hh
|
@ -1,5 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "./global.h"
|
||||||
|
|
||||||
#include <lmdb.h>
|
#include <lmdb.h>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
@ -41,7 +43,7 @@ using string_view = boost::string_ref;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
class LMDBError : public std::runtime_error
|
class LMDB_SAFE_EXPORT LMDBError : public std::runtime_error
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit LMDBError(const std::string &error) noexcept
|
explicit LMDBError(const std::string &error) noexcept
|
||||||
|
@ -63,7 +65,7 @@ public:
|
||||||
* \brief The MDBDbi class is our only 'value type' object as 1) a dbi is actually an integer
|
* \brief The MDBDbi class is our only 'value type' object as 1) a dbi is actually an integer
|
||||||
* and 2) per LMDB documentation, we never close it.
|
* and 2) per LMDB documentation, we never close it.
|
||||||
*/
|
*/
|
||||||
class MDBDbi
|
class LMDB_SAFE_EXPORT MDBDbi
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
MDBDbi()
|
MDBDbi()
|
||||||
|
@ -86,10 +88,10 @@ class MDBROTransactionImpl;
|
||||||
using MDBROTransaction = std::unique_ptr<MDBROTransactionImpl>;
|
using MDBROTransaction = std::unique_ptr<MDBROTransactionImpl>;
|
||||||
using MDBRWTransaction = std::unique_ptr<MDBRWTransactionImpl>;
|
using MDBRWTransaction = std::unique_ptr<MDBRWTransactionImpl>;
|
||||||
|
|
||||||
class MDBEnv
|
class LMDB_SAFE_EXPORT MDBEnv
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
MDBEnv(const char* fname, unsigned int flags, mdb_mode_t mode, MDB_dbi maxDBs);
|
MDBEnv(const char* fname, unsigned int flags, mdb_mode_t mode, MDB_dbi maxDBs = 10);
|
||||||
|
|
||||||
~MDBEnv()
|
~MDBEnv()
|
||||||
{
|
{
|
||||||
|
@ -122,11 +124,9 @@ private:
|
||||||
std::map<std::thread::id, int> d_ROtransactionsOut;
|
std::map<std::thread::id, int> d_ROtransactionsOut;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::shared_ptr<MDBEnv> getMDBEnv(const char* fname, unsigned int flags, mdb_mode_t mode, MDB_dbi maxDBs = 128);
|
LMDB_SAFE_EXPORT std::shared_ptr<MDBEnv> getMDBEnv(const char* fname, unsigned int flags, mdb_mode_t mode, MDB_dbi maxDBs = 128);
|
||||||
|
|
||||||
|
struct LMDB_SAFE_EXPORT MDBOutVal
|
||||||
|
|
||||||
struct MDBOutVal
|
|
||||||
{
|
{
|
||||||
operator MDB_val&()
|
operator MDB_val&()
|
||||||
{
|
{
|
||||||
|
@ -184,7 +184,7 @@ template<> inline string_view MDBOutVal::get<string_view>() const
|
||||||
return string_view(static_cast<char*>(d_mdbval.mv_data), d_mdbval.mv_size);
|
return string_view(static_cast<char*>(d_mdbval.mv_data), d_mdbval.mv_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
class MDBInVal
|
class LMDB_SAFE_EXPORT MDBInVal
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
MDBInVal(const MDBOutVal& rhs)
|
MDBInVal(const MDBOutVal& rhs)
|
||||||
|
@ -226,7 +226,7 @@ public:
|
||||||
{
|
{
|
||||||
MDBInVal ret;
|
MDBInVal ret;
|
||||||
ret.d_mdbval.mv_size = sizeof(T);
|
ret.d_mdbval.mv_size = sizeof(T);
|
||||||
ret.d_mdbval.mv_data = static_cast<void*>(const_cast<char*>(&t[0]));
|
ret.d_mdbval.mv_data = static_cast<void*>(&const_cast<T&>(t));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,12 +241,9 @@ private:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class MDBROCursor;
|
class MDBROCursor;
|
||||||
|
|
||||||
class MDBROTransactionImpl
|
class LMDB_SAFE_EXPORT MDBROTransactionImpl
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
MDBROTransactionImpl(MDBEnv *parent, MDB_txn *txn);
|
MDBROTransactionImpl(MDBEnv *parent, MDB_txn *txn);
|
||||||
|
@ -495,7 +492,7 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class MDBROCursor : public MDBGenCursor<MDBROTransactionImpl, MDBROCursor>
|
class LMDB_SAFE_EXPORT MDBROCursor : public MDBGenCursor<MDBROTransactionImpl, MDBROCursor>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
MDBROCursor() = default;
|
MDBROCursor() = default;
|
||||||
|
@ -510,7 +507,7 @@ public:
|
||||||
|
|
||||||
class MDBRWCursor;
|
class MDBRWCursor;
|
||||||
|
|
||||||
class MDBRWTransactionImpl: public MDBROTransactionImpl
|
class LMDB_SAFE_EXPORT MDBRWTransactionImpl: public MDBROTransactionImpl
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
MDBRWTransactionImpl(MDBEnv* parent, MDB_txn* txn);
|
MDBRWTransactionImpl(MDBEnv* parent, MDB_txn* txn);
|
||||||
|
@ -610,7 +607,7 @@ public:
|
||||||
* be closed when its transaction ends." This is a problem for us since it may means we are closing
|
* be closed when its transaction ends." This is a problem for us since it may means we are closing
|
||||||
* the cursor twice, which is bad.
|
* the cursor twice, which is bad.
|
||||||
*/
|
*/
|
||||||
class MDBRWCursor : public MDBGenCursor<MDBRWTransactionImpl, MDBRWCursor>
|
class LMDB_SAFE_EXPORT MDBRWCursor : public MDBGenCursor<MDBRWTransactionImpl, MDBRWCursor>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
MDBRWCursor() = default;
|
MDBRWCursor() = default;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "lmdb-safe.hh"
|
|
||||||
|
#include "./lmdb-safe.hh"
|
||||||
|
|
||||||
namespace LMDBSafe {
|
namespace LMDBSafe {
|
||||||
|
|
||||||
|
@ -18,7 +19,7 @@ namespace LMDBSafe {
|
||||||
This makes us start everything at ID=1, which might make it possible to
|
This makes us start everything at ID=1, which might make it possible to
|
||||||
treat id 0 as special
|
treat id 0 as special
|
||||||
*/
|
*/
|
||||||
unsigned int MDBGetMaxID(MDBRWTransaction& txn, MDBDbi& dbi);
|
LMDB_SAFE_EXPORT unsigned int MDBGetMaxID(MDBRWTransaction& txn, MDBDbi& dbi);
|
||||||
|
|
||||||
/** This is the serialization interface.
|
/** This is the serialization interface.
|
||||||
You need to define your these functions for the types you'd like to store.
|
You need to define your these functions for the types you'd like to store.
|
||||||
|
@ -65,7 +66,7 @@ inline string_view keyConv(string_view t)
|
||||||
* don't exist.
|
* don't exist.
|
||||||
*/
|
*/
|
||||||
template<class Class,typename Type, typename Parent>
|
template<class Class,typename Type, typename Parent>
|
||||||
struct LMDBIndexOps
|
struct LMDB_SAFE_EXPORT LMDBIndexOps
|
||||||
{
|
{
|
||||||
explicit LMDBIndexOps(Parent* parent) : d_parent(parent){}
|
explicit LMDBIndexOps(Parent* parent) : d_parent(parent){}
|
||||||
void put(MDBRWTransaction& txn, const Class& t, uint32_t id, unsigned int flags=0)
|
void put(MDBRWTransaction& txn, const Class& t, uint32_t id, unsigned int flags=0)
|
||||||
|
@ -161,7 +162,7 @@ struct nullindex_t
|
||||||
|
|
||||||
/** The main class. Templatized only on the indexes and typename right now */
|
/** The main class. Templatized only on the indexes and typename right now */
|
||||||
template<typename T, class I1=nullindex_t, class I2=nullindex_t, class I3 = nullindex_t, class I4 = nullindex_t>
|
template<typename T, class I1=nullindex_t, class I2=nullindex_t, class I3 = nullindex_t, class I4 = nullindex_t>
|
||||||
class TypedDBI
|
class LMDB_SAFE_EXPORT TypedDBI
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TypedDBI(std::shared_ptr<MDBEnv> env, string_view name)
|
TypedDBI(std::shared_ptr<MDBEnv> env, string_view name)
|
||||||
|
@ -284,7 +285,7 @@ public:
|
||||||
serFromString(d_id.get<string_view>(), d_t);
|
serFromString(d_id.get<string_view>(), d_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
explicit iter_t(Parent* parent, typename Parent::cursor_t&& cursor, const std::string& prefix) :
|
explicit iter_t(Parent* parent, typename Parent::cursor_t&& cursor, string_view prefix) :
|
||||||
d_parent(parent),
|
d_parent(parent),
|
||||||
d_cursor(std::move(cursor)),
|
d_cursor(std::move(cursor)),
|
||||||
d_on_index(true), // is this an iterator on main database or on index?
|
d_on_index(true), // is this an iterator on main database or on index?
|
||||||
|
@ -532,7 +533,7 @@ public:
|
||||||
Parent& d_parent;
|
Parent& d_parent;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ROTransaction : public ReadonlyOperations<ROTransaction>
|
class LMDB_SAFE_EXPORT ROTransaction : public ReadonlyOperations<ROTransaction>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit ROTransaction(TypedDBI* parent) : ReadonlyOperations<ROTransaction>(*this), d_parent(parent), d_txn(std::make_shared<MDBROTransaction>(d_parent->d_env->getROTransaction()))
|
explicit ROTransaction(TypedDBI* parent) : ReadonlyOperations<ROTransaction>(*this), d_parent(parent), d_txn(std::make_shared<MDBROTransaction>(d_parent->d_env->getROTransaction()))
|
||||||
|
@ -563,7 +564,7 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class RWTransaction : public ReadonlyOperations<RWTransaction>
|
class LMDB_SAFE_EXPORT RWTransaction : public ReadonlyOperations<RWTransaction>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit RWTransaction(TypedDBI* parent) : ReadonlyOperations<RWTransaction>(*this), d_parent(parent)
|
explicit RWTransaction(TypedDBI* parent) : ReadonlyOperations<RWTransaction>(*this), d_parent(parent)
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
|
#include "../lmdb-safe.hh"
|
||||||
|
|
||||||
#define CATCH_CONFIG_MAIN
|
#define CATCH_CONFIG_MAIN
|
||||||
#include "lmdb-safe.hh"
|
#include <catch2/catch.hpp>
|
||||||
#include "catch2/catch.hpp"
|
|
||||||
|
#include <c++utilities/application/global.h>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
@ -146,7 +149,7 @@ TEST_CASE("transaction inheritance and moving")
|
||||||
// aborting by default)
|
// aborting by default)
|
||||||
}
|
}
|
||||||
|
|
||||||
CHECK(!cursor);
|
CHECK(!const_cast<const MDBRWCursor&>(cursor));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("nested RW transactions", "[transactions]")
|
TEST_CASE("nested RW transactions", "[transactions]")
|
||||||
|
@ -301,6 +304,7 @@ TEST_CASE("transaction counter correctness for RW->RW nesting")
|
||||||
REQUIRE(1);
|
REQUIRE(1);
|
||||||
|
|
||||||
MDBDbi main = env.openDB("", MDB_CREATE);
|
MDBDbi main = env.openDB("", MDB_CREATE);
|
||||||
|
CPP_UTILITIES_UNUSED(main)
|
||||||
|
|
||||||
{
|
{
|
||||||
auto txn = env.getRWTransaction();
|
auto txn = env.getRWTransaction();
|
||||||
|
@ -319,6 +323,7 @@ TEST_CASE("transaction counter correctness for RW->RO nesting")
|
||||||
REQUIRE(1);
|
REQUIRE(1);
|
||||||
|
|
||||||
MDBDbi main = env.openDB("", MDB_CREATE);
|
MDBDbi main = env.openDB("", MDB_CREATE);
|
||||||
|
CPP_UTILITIES_UNUSED(main)
|
||||||
|
|
||||||
{
|
{
|
||||||
auto txn = env.getRWTransaction();
|
auto txn = env.getRWTransaction();
|
|
@ -1,5 +1,10 @@
|
||||||
#include "lmdb-typed.hh"
|
#include "../lmdb-boost-serialization.hh"
|
||||||
#include "catch2/catch.hpp"
|
#include "../lmdb-typed.hh"
|
||||||
|
|
||||||
|
#define CATCH_CONFIG_MAIN
|
||||||
|
#include <catch2/catch.hpp>
|
||||||
|
|
||||||
|
#include <c++utilities/application/global.h>
|
||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
|
@ -18,6 +23,7 @@ struct Member
|
||||||
template<class Archive>
|
template<class Archive>
|
||||||
void serialize(Archive & ar, Member& g, const unsigned int version)
|
void serialize(Archive & ar, Member& g, const unsigned int version)
|
||||||
{
|
{
|
||||||
|
CPP_UTILITIES_UNUSED(version)
|
||||||
ar & g.firstName & g.lastName & g.enrolled;
|
ar & g.firstName & g.lastName & g.enrolled;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue