Commit Graph

81 Commits

Author SHA1 Message Date
Martchus b499a201c2 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
2022-01-30 01:14:42 +01:00
Martchus adcb9338e8 Speed-up cleaning DB/indexes via `mdb_drop` instead of manual deletions 2022-01-26 00:43:21 +01:00
Martchus 31a45912dc Add `keyConv` function for `string_view` 2022-01-25 23:39:06 +01:00
Martchus f2042c59a5 Avoid instantiating an std::string when calling serializer 2022-01-25 23:39:06 +01:00
Martchus c8a865528e Pass string_view in serFromString() by value as it is just two pointers 2022-01-25 23:38:30 +01:00
Martchus 74d7bbd93b Throw errors in all cursor put/del functions 2022-01-22 19:18:56 +01:00
Martchus f35efb5a7c Expose raw return code in LMDBError 2022-01-22 19:17:14 +01:00
Martchus 4cec520c83 Avoid useless use of `const_cast` 2022-01-22 19:09:44 +01:00
Martchus 3bafada5cc Use distinct exception class and unify format of error messages
* Avoid manual code for making error message
* Use `const` for the return code variable where possible
* Unify formatting of error messages
2022-01-22 18:59:54 +01:00
Martchus a002cdecdf Improve some comments converting them to Doxygen-recognized comments 2022-01-22 18:18:15 +01:00
Martchus 156e01f15d Fix typos in README 2022-01-18 22:38:12 +01:00
Martchus 826637167c Update README for Reflective RapidJSON 2022-01-18 22:35:23 +01:00
Martchus d53687bdee Allow users to plug their own (de)serialization implementation
* Move serialization-specific code into its own header
* Keep reflective-rapidjson-based implementation as example
2022-01-18 22:24:31 +01:00
Martchus b833bfef3b Move everything under a namespace 2022-01-18 22:09:12 +01:00
Martchus c96b87c60a Remove obsolete comments 2022-01-18 22:09:12 +01:00
Martchus 64bde44fa2 Rearange includes to group them more systematically preferring C++ headers 2022-01-18 22:09:08 +01:00
Martchus 462e5e4b51 Fix example for iterating range
One must use `equal_range` here, otherwise the iteration will not stop
after the last matching key.
2022-01-18 21:53:51 +01:00
Rosen Penev bd72fce0a7 Use std::string_view whenever possible
std::string_view is available with libcxx, even in C++11 mode. Use the proper macro to check it.
2022-01-18 20:38:55 +01:00
Jonas Schäfer 91920e7c3b Allow reader and writer transactions in the same thread
This is supported by LMDB if the MDB_NOTLS flag is set on the
environment, which it always is with lmdb-safe.

Fixes #9.
2022-01-18 20:36:24 +01:00
Martchus 551339ff8f Avoid instantiating new `std::string` when converting key 2022-01-18 20:35:43 +01:00
Martchus 6a2a752203 Allow configuring maximum number of DBs 2022-01-18 20:35:43 +01:00
Martchus 97fab01b15 Improve error handling when calling `mdb_env_set_mapsize`/`mdb_env_set_maxdbs`
* Handle all errors
* Include error string in exception
2022-01-18 20:35:43 +01:00
Martchus ef0bbb4462 Handle errors when committing transaction 2022-01-18 20:35:38 +01:00
Martchus 98bf74ed80 Allow returning non-const value when iterating
Modifying the object shouldn't harm and directly using it avoids a copy.
Of course this does not modify the object in the database.
2021-12-25 23:05:49 +01:00
Martchus 84e2e9ceea Use ReflectiveRapidJSON for serialization 2021-12-25 23:05:49 +01:00
Martchus 155c2c36dd Avoid warnings about bypassing virtual dispatch in destructors 2021-12-25 23:05:49 +01:00
Martchus b621c27ad4 Fix several warnings
* Avoid implicit signedness conversions where possible
* Avoid c-style casts
2021-12-25 23:02:10 +01:00
bert hubert 469de3c0e2
Merge pull request #6 from horazont/feature/nested-transactions
Implement support for nesting transactions
2019-11-20 21:38:58 +01:00
Jonas Schäfer 7ce9a82141 Implement support for nesting transactions
RW transactions can have RW and RO transactions nested (although
the RO transactions are really just disguised RW transactions,
because LMDB does not support nesting real RO transactions to RW
transactions).

RO transactions can not be nested (again an LMDB limitation).
2019-11-11 21:23:37 +01:00
Jonas Schäfer 3c57c6a113 Hide MDB*Transaction behind a unique_ptr front
This is to prevent the issue with Object Slicing. With the previous
solution (where MDB*Transaction are normal objects), consider the
following code:

    MDBRWTransaction txn = env.getRWTransaction();

    //! Invalid: We explicitly break this move because it would be
    //! unsafe:
    // MDBROTransaction ro_txn(std::move(txn));

    //! Valid, RW inherits from RO now, so we can bind an RO
    //! reference to an RW transaction.
    MDBROTransaction &ro_txn = txn;

    //! Dangerous!!
    MDBROTransaction ro_txn2(std::move(ro_txn));

The last move there breaks the semantics of the RW transaction which
is bound to the reference ro_txn. It looses its RW cursors, which
remain partly inside the txn instance. All kinds of weird and bad
things can happen here. For instance, the ro_txn2 would go out of
scope before the txn, calling the destructor MDBROTransaction
destructor (which defaults to commit instead of abort!) and only
freeing parts of the cursors. Only then the MDBRWTransaction
destructor is called, which will free the cursors which belong to
the RW transaction which has already been committed.

The only safe way to prevent Object Slicing in this scenario I
could come up with is to disallow moves of the objects altogether
and instead use unique_ptr as front for them. This also removes
an additional dynamic allocation per RW transaction (for the
cursor vector), since the address of that vector is now constant
over the lifetime of the transaction without indirection.
2019-11-11 21:23:20 +01:00
Jonas Schäfer d2b0ee057a Re-work the class hierarchy of cursors and transactions
MDBRWTransaction now inherits from MDBROTransaction. Both
transaction types will free their cursors before aborting or
committing. In addition, transactions are now virtual classes.

The reason for this is that RW and RO transactions are handled
very differently in LMDB. Nevertheless, it is very useful to be
able to write read-only code in a way which also can use an RW
transaction. This saves code duplication or unnecessary templates.

Since the only methods which are reqiured to be virtual on
transactions for this to work are the destructor and the
abort/commit methods, the overhead should be neglegible.

This also comes in very handy when going forward to implement
nested transactions, because it is not possible to nest RO
transactions below RW transactions, exacerbating the issue
described above.

Fixes #7 en passant.
2019-11-11 21:23:20 +01:00
bert hubert c0cc016f3a add get_struct_ptr for speedup 2019-06-24 11:16:03 +02:00
bert hubert e02d654dfe namespace cleanliness 2019-02-06 11:08:55 +01:00
bert hubert 9c5bb43cb5 solve crashes when using read-only cursor 2019-01-13 21:35:02 +01:00
bert hubert 99b4caf61c enhance multi test a bit 2019-01-09 10:30:59 +01:00
bert hubert bdcd9150a9 unify RO and RW cursor operations, move serFromString to a view 2019-01-09 09:58:04 +01:00
bert hubert 7dac111b02 to work around clang issue, keyConv is now very ugly, but completely generic 2019-01-05 14:40:28 +01:00
bert hubert 505d31fd89 add range tests (lower_bound) 2019-01-05 14:40:04 +01:00
bert hubert a6ee07d8ef add rc checking to cursors, add lower_bound(), next() 2019-01-05 14:38:52 +01:00
bert hubert 66a6adaf10 makefile was silly with -lboost_serialization 2019-01-05 14:38:21 +01:00
bert hubert cb2ed50e1f getKey for typed +const correctness 2019-01-04 20:51:04 +01:00
bert hubert f35ffb8bd8 fix boost version sensing 2018-12-28 22:02:29 +01:00
bert hubert 063e658aa9 pare down boost apt-get for travis 2018-12-28 19:25:39 +01:00
bert hubert 8851f18cbe better default init of MDBOutVal in typed 2018-12-28 19:21:32 +01:00
bert hubert 30b9a78059 adapt to older boost on travis 2018-12-28 19:14:00 +01:00
bert hubert 6790f50612 add boost & catch2 2018-12-28 19:00:09 +01:00
bert hubert a35390622c add lmdb to travis 2018-12-28 18:39:43 +01:00
bert hubert f977301e94 expand tests to time_t indexes, found bug in our keyconv! 2018-12-28 16:45:44 +01:00
bert hubert fd9e5841bc add travis tests 2018-12-28 16:35:32 +01:00
bert hubert b3eb2a03cb add tests, prefix_range 2018-12-28 16:33:20 +01:00