Use type alias for ID type

This commit is contained in:
Martchus 2022-02-21 22:57:15 +01:00
parent b87dd49bba
commit 6c21fe7cb1
2 changed files with 26 additions and 25 deletions

View File

@ -2,13 +2,13 @@
namespace LMDBSafe { namespace LMDBSafe {
unsigned int MDBGetMaxID(MDBRWTransaction &txn, MDBDbi &dbi) IDType MDBGetMaxID(MDBRWTransaction &txn, MDBDbi &dbi)
{ {
auto cursor = txn->getRWCursor(dbi); auto cursor = txn->getRWCursor(dbi);
MDBOutVal maxidval, maxcontent; MDBOutVal maxidval, maxcontent;
unsigned int maxid{ 0 }; auto maxid = IDType(0);
if (!cursor.get(maxidval, maxcontent, MDB_LAST)) { if (!cursor.get(maxidval, maxcontent, MDB_LAST)) {
maxid = maxidval.get<unsigned int>(); maxid = maxidval.get<IDType>();
} }
return maxid; return maxid;
} }

View File

@ -10,20 +10,21 @@ namespace LMDBSafe {
/* /*
Open issues: Open issues:
What is an error? What is an exception?
could id=0 be magic? ('no such id')
yes
Perhaps use the separate index concept from multi_index Perhaps use the separate index concept from multi_index
perhaps get eiter to be of same type so for(auto& a : x) works perhaps get eiter to be of same type so for(auto& a : x) works
make it more value "like" with unique_ptr make it more value "like" with unique_ptr
*/ */
/*!
* \brief The type used to store IDs. "0" indicates "no such ID".
*/
using IDType = std::uint32_t;
/** Return the highest ID used in a database. Returns 0 for an empty DB. /** Return the highest ID used in a database. Returns 0 for an empty DB.
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
*/ */
LMDB_SAFE_EXPORT unsigned int MDBGetMaxID(MDBRWTransaction &txn, MDBDbi &dbi); LMDB_SAFE_EXPORT IDType 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.
@ -142,12 +143,12 @@ template <class Class, typename Type, typename Parent> struct LMDB_SAFE_EXPORT L
: d_parent(parent) : d_parent(parent)
{ {
} }
void put(MDBRWTransaction &txn, const Class &t, std::uint32_t id, unsigned int flags = 0) void put(MDBRWTransaction &txn, const Class &t, IDType id, unsigned int flags = 0)
{ {
txn->put(d_idx, keyConv(d_parent->getMember(t)), id, flags); txn->put(d_idx, keyConv(d_parent->getMember(t)), id, flags);
} }
void del(MDBRWTransaction &txn, const Class &t, std::uint32_t id) void del(MDBRWTransaction &txn, const Class &t, IDType id)
{ {
if (const auto rc = txn->del(d_idx, keyConv(d_parent->getMember(t)), id)) { if (const auto rc = txn->del(d_idx, keyConv(d_parent->getMember(t)), id)) {
throw LMDBError("Error deleting from index: ", rc); throw LMDBError("Error deleting from index: ", rc);
@ -273,7 +274,7 @@ public:
} }
//! Get item with id, from main table directly //! Get item with id, from main table directly
bool get(std::uint32_t id, T &t) bool get(IDType id, T &t)
{ {
MDBOutVal data; MDBOutVal data;
if ((*d_parent.d_txn)->get(d_parent.d_parent->d_main, id, data)) if ((*d_parent.d_txn)->get(d_parent.d_parent->d_main, id, data))
@ -284,23 +285,23 @@ public:
} }
//! Get item through index N, then via the main database //! Get item through index N, then via the main database
template <std::size_t N> std::uint32_t get(const index_t<N> &key, T &out) template <std::size_t N> IDType get(const index_t<N> &key, T &out)
{ {
MDBOutVal id; MDBOutVal id;
if (!(*d_parent.d_txn)->get(std::get<N>(d_parent.d_parent->d_tuple).d_idx, keyConv(key), id)) { if (!(*d_parent.d_txn)->get(std::get<N>(d_parent.d_parent->d_tuple).d_idx, keyConv(key), id)) {
if (get(id.get<std::uint32_t>(), out)) if (get(id.get<IDType>(), out))
return id.get<std::uint32_t>(); return id.get<IDType>();
} }
return 0; return 0;
} }
//! Cardinality of index N //! Cardinality of index N
template <std::size_t N> std::uint32_t cardinality() template <std::size_t N> IDType cardinality()
{ {
auto cursor = (*d_parent.d_txn)->getCursor(std::get<N>(d_parent.d_parent->d_tuple).d_idx); auto cursor = (*d_parent.d_txn)->getCursor(std::get<N>(d_parent.d_parent->d_tuple).d_idx);
bool first = true; bool first = true;
MDBOutVal key, data; MDBOutVal key, data;
std::uint32_t count = 0; IDType count = 0;
while (!cursor.get(key, data, first ? MDB_FIRST : MDB_NEXT_NODUP)) { while (!cursor.get(key, data, first ? MDB_FIRST : MDB_NEXT_NODUP)) {
++count; ++count;
first = false; first = false;
@ -463,9 +464,9 @@ public:
} }
// get ID this iterator points to // get ID this iterator points to
std::uint32_t getID() IDType getID()
{ {
return d_on_index ? d_id.get<std::uint32_t>() : d_key.get<std::uint32_t>(); return d_on_index ? d_id.get<IDType>() : d_key.get<IDType>();
} }
const MDBOutVal &getKey() const MDBOutVal &getKey()
@ -526,7 +527,7 @@ public:
return iter_t<StorageType>{ &d_parent, std::move(cursor), false, false }; return iter_t<StorageType>{ &d_parent, std::move(cursor), false, false };
}; };
template <std::size_t N, template <typename> class StorageType = DirectStorage> iter_t<DirectStorage, std::uint32_t> begin_idx() template <std::size_t N, template <typename> class StorageType = DirectStorage> iter_t<DirectStorage, IDType> begin_idx()
{ {
typename Parent::cursor_t cursor = (*d_parent.d_txn)->getCursor(std::get<N>(d_parent.d_parent->d_tuple).d_idx); typename Parent::cursor_t cursor = (*d_parent.d_txn)->getCursor(std::get<N>(d_parent.d_parent->d_tuple).d_idx);
@ -534,10 +535,10 @@ public:
if (cursor.get(out, id, MDB_FIRST)) { if (cursor.get(out, id, MDB_FIRST)) {
// on_index, one_key, end // on_index, one_key, end
return iter_t<DirectStorage, std::uint32_t>{ &d_parent, std::move(cursor), false, false, true }; return iter_t<DirectStorage, IDType>{ &d_parent, std::move(cursor), false, false, true };
} }
return iter_t<DirectStorage, std::uint32_t>{ &d_parent, std::move(cursor), false, false }; return iter_t<DirectStorage, IDType>{ &d_parent, std::move(cursor), false, false };
} }
eiter_t end() eiter_t end()
@ -721,7 +722,7 @@ public:
} }
// insert something, with possibly a specific id // insert something, with possibly a specific id
std::uint32_t put(const T &t, std::uint32_t id = 0) IDType put(const T &t, IDType id = 0)
{ {
unsigned int flags = 0; unsigned int flags = 0;
if (!id) { if (!id) {
@ -734,7 +735,7 @@ public:
} }
// modify an item 'in place', plus update indexes // modify an item 'in place', plus update indexes
void modify(std::uint32_t id, std::function<void(T &)> func) void modify(IDType id, std::function<void(T &)> func)
{ {
T t; T t;
if (!this->get(id, t)) if (!this->get(id, t))
@ -746,7 +747,7 @@ public:
} }
//! delete an item, and from indexes //! delete an item, and from indexes
void del(std::uint32_t id) void del(IDType id)
{ {
T t; T t;
if (!this->get(id, t)) if (!this->get(id, t))
@ -786,7 +787,7 @@ public:
private: private:
// clear this ID from all indexes // clear this ID from all indexes
void clearIndex(std::uint32_t id, const T &t) void clearIndex(IDType id, const T &t)
{ {
d_parent->forEachIndex([&](auto &&i) { i.del(*d_txn, t, id); }); d_parent->forEachIndex([&](auto &&i) { i.del(*d_txn, t, id); });
} }