libmdbx is an extremely fast, compact, powerful, embedded, transactional key-value database, with permissive license

Overview

Please refer to the online documentation with C API description and pay attention to the C++ API.

Questions, feedback and suggestions are welcome to the Telegram' group.

For NEWS take a look to the ChangeLog.

libmdbx

libmdbx is an extremely fast, compact, powerful, embedded, transactional key-value database, with permissive license. libmdbx has a specific set of properties and capabilities, focused on creating unique lightweight solutions.

  1. Allows a swarm of multi-threaded processes to ACIDly read and update several key-value maps and multimaps in a locally-shared database.

  2. Provides extraordinary performance, minimal overhead through Memory-Mapping and Olog(N) operations costs by virtue of B+ tree.

  3. Requires no maintenance and no crash recovery since it doesn't use WAL, but that might be a caveat for write-intensive workloads with durability requirements.

  4. Compact and friendly for fully embedding. Only ≈25KLOC of C11, ≈64K x86 binary code of core, no internal threads neither server process(es), but implements a simplified variant of the Berkeley DB and dbm API.

  5. Enforces serializability for writers just by single mutex and affords wait-free for parallel readers without atomic/interlocked operations, while writing and reading transactions do not block each other.

  6. Guarantee data integrity after crash unless this was explicitly neglected in favour of write performance.

  7. Supports Linux, Windows, MacOS, Android, iOS, FreeBSD, DragonFly, Solaris, OpenSolaris, OpenIndiana, NetBSD, OpenBSD and other systems compliant with POSIX.1-2008.

Historically, libmdbx is a deeply revised and extended descendant of the amazing Lightning Memory-Mapped Database. libmdbx inherits all benefits from LMDB, but resolves some issues and adds a set of improvements.

The next version is under active non-public development from scratch and will be released as MithrilDB and libmithrildb for libraries & packages. Admittedly mythical Mithril is resembling silver but being stronger and lighter than steel. Therefore MithrilDB is a rightly relevant name.

MithrilDB will be radically different from libmdbx by the new database format and API based on C++17, as well as the Apache 2.0 License. The goal of this revolution is to provide a clearer and robust API, add more features and new valuable properties of the database.

https://t.me/libmdbx GithubCI AppveyorCI CircleCI CirrusCI Coverity Scan Status

The Future will (be) Positive. Всё будет хорошо.


Table of Contents

Characteristics

Features

  • Key-value data model, keys are always sorted.

  • Fully ACID-compliant, through to MVCC and CoW.

  • Multiple key-value sub-databases within a single datafile.

  • Range lookups, including range query estimation.

  • Efficient support for short fixed length keys, including native 32/64-bit integers.

  • Ultra-efficient support for multimaps. Multi-values sorted, searchable and iterable. Keys stored without duplication.

  • Data is memory-mapped and accessible directly/zero-copy. Traversal of database records is extremely-fast.

  • Transactions for readers and writers, ones do not block others.

  • Writes are strongly serialized. No transaction conflicts nor deadlocks.

  • Readers are non-blocking, notwithstanding snapshot isolation.

  • Nested write transactions.

  • Reads scale linearly across CPUs.

  • Continuous zero-overhead database compactification.

  • Automatic on-the-fly database size adjustment.

  • Customizable database page size.

  • Olog(N) cost of lookup, insert, update, and delete operations by virtue of B+ tree characteristics.

  • Online hot backup.

  • Append operation for efficient bulk insertion of pre-sorted data.

  • No WAL nor any transaction journal. No crash recovery needed. No maintenance is required.

  • No internal cache and/or memory management, all done by basic OS services.

Limitations

  • Page size: a power of 2, minimum 256 (mostly for testing), maximum 65536 bytes, default 4096 bytes.
  • Key size: minimum 0, maximum ≈½ pagesize (2022 bytes for default 4K pagesize, 32742 bytes for 64K pagesize).
  • Value size: minimum 0, maximum 2146435072 (0x7FF00000) bytes for maps, ≈½ pagesize for multimaps (2022 bytes for default 4K pagesize, 32742 bytes for 64K pagesize).
  • Write transaction size: up to 1327217884 pages (4.944272 TiB for default 4K pagesize, 79.108351 TiB for 64K pagesize).
  • Database size: up to 2147483648 pages (≈8.0 TiB for default 4K pagesize, ≈128.0 TiB for 64K pagesize).
  • Maximum sub-databases: 32765.

Gotchas

  1. There cannot be more than one writer at a time, i.e. no more than one write transaction at a time.

  2. libmdbx is based on B+ tree, so access to database pages is mostly random. Thus SSDs provide a significant performance boost over spinning disks for large databases.

  3. libmdbx uses shadow paging instead of WAL. Thus syncing data to disk might be a bottleneck for write intensive workload.

  4. libmdbx uses copy-on-write for snapshot isolation during updates, but read transactions prevents recycling an old retired/freed pages, since it read ones. Thus altering of data during a parallel long-lived read operation will increase the process work set, may exhaust entire free database space, the database can grow quickly, and result in performance degradation. Try to avoid long running read transactions.

  5. libmdbx is extraordinarily fast and provides minimal overhead for data access, so you should reconsider using brute force techniques and double check your code. On the one hand, in the case of libmdbx, a simple linear search may be more profitable than complex indexes. On the other hand, if you make something suboptimally, you can notice detrimentally only on sufficiently large data.

Comparison with other databases

For now please refer to chapter of "BoltDB comparison with other databases" which is also (mostly) applicable to libmdbx.

Improvements beyond LMDB

libmdbx is superior to legendary LMDB in terms of features and reliability, not inferior in performance. In comparison to LMDB, libmdbx make things "just work" perfectly and out-of-the-box, not silently and catastrophically break down. The list below is pruned down to the improvements most notable and obvious from the user's point of view.

Added Features

  1. Keys could be more than 2 times longer than LMDB.

For DB with default page size libmdbx support keys up to 2022 bytes and up to 32742 bytes for 64K page size. LMDB allows key size up to 511 bytes and may silently loses data with large values.

  1. Up to 30% faster than LMDB in CRUD benchmarks.

Benchmarks of the in-tmpfs scenarios, that tests the speed of the engine itself, showned that libmdbx 10-20% faster than LMDB, and up to 30% faster when libmdbx compiled with specific build options which downgrades several runtime checks to be match with LMDB behaviour.

These and other results could be easily reproduced with ioArena just by make bench-quartet command, including comparisons with RockDB and WiredTiger.

  1. Automatic on-the-fly database size adjustment, both increment and reduction.

libmdbx manages the database size according to parameters specified by mdbx_env_set_geometry() function, ones include the growth step and the truncation threshold.

Unfortunately, on-the-fly database size adjustment doesn't work under Wine due to its internal limitations and unimplemented functions, i.e. the MDBX_UNABLE_EXTEND_MAPSIZE error will be returned.

  1. Automatic continuous zero-overhead database compactification.

During each commit libmdbx merges a freeing pages which adjacent with the unallocated area at the end of file, and then truncates unused space when a lot enough of.

  1. The same database format for 32- and 64-bit builds.

libmdbx database format depends only on the endianness but not on the bitness.

  1. LIFO policy for Garbage Collection recycling. This can significantly increase write performance due write-back disk cache up to several times in a best case scenario.

LIFO means that for reuse will be taken the latest becomes unused pages. Therefore the loop of database pages circulation becomes as short as possible. In other words, the set of pages, that are (over)written in memory and on disk during a series of write transactions, will be as small as possible. Thus creates ideal conditions for the battery-backed or flash-backed disk cache efficiency.

  1. Fast estimation of range query result volume, i.e. how many items can be found between a KEY1 and a KEY2. This is a prerequisite for build and/or optimize query execution plans.

libmdbx performs a rough estimate based on common B-tree pages of the paths from root to corresponding keys.

  1. mdbx_chk utility for database integrity check. Since version 0.9.1, the utility supports checking the database using any of the three meta pages and the ability to switch to it.

  2. Support for opening databases in the exclusive mode, including on a network share.

  3. Zero-length for keys and values.

  4. Ability to determine whether the particular data is on a dirty page or not, that allows to avoid copy-out before updates.

  5. Extended information of whole-database, sub-databases, transactions, readers enumeration.

libmdbx provides a lot of information, including dirty and leftover pages for a write transaction, reading lag and holdover space for read transactions.

  1. Extended update and delete operations.

libmdbx allows one at once with getting previous value and addressing the particular item from multi-value with the same key.

  1. Useful runtime options for tuning engine to application's requirements and use cases specific.

  2. Automated steady sync-to-disk upon several thresholds and/or timeout via cheap polling.

  3. Sequence generation and three persistent 64-bit markers.

  4. Handle-Slow-Readers callback to resolve a database full/overflow issues due to long-lived read transaction(s).

  5. Ability to determine whether the cursor is pointed to a key-value pair, to the first, to the last, or not set to anything.

Other fixes and specifics

  1. Fixed more than 10 significant errors, in particular: page leaks, wrong sub-database statistics, segfault in several conditions, nonoptimal page merge strategy, updating an existing record with a change in data size (including for multimap), etc.

  2. All cursors can be reused and should be closed explicitly, regardless ones were opened within a write or read transaction.

  3. Opening database handles are spared from race conditions and pre-opening is not needed.

  4. Returning MDBX_EMULTIVAL error in case of ambiguous update or delete.

  5. Guarantee of database integrity even in asynchronous unordered write-to-disk mode.

libmdbx propose additional trade-off by MDBX_SAFE_NOSYNC with append-like manner for updates, that avoids database corruption after a system crash contrary to LMDB. Nevertheless, the MDBX_UTTERLY_NOSYNC mode is available to match behaviour of the MDB_NOSYNC in LMDB.

  1. On MacOS & iOS the fcntl(F_FULLFSYNC) syscall is used by default to synchronize data with the disk, as this is the only way to guarantee data durability in case of power failure. Unfortunately, in scenarios with high write intensity, the use of F_FULLFSYNC significantly degrades performance compared to LMDB, where the fsync() syscall is used. Therefore, libmdbx allows you to override this behavior by defining the MDBX_OSX_SPEED_INSTEADOF_DURABILITY=1 option while build the library.

  2. On Windows the LockFileEx() syscall is used for locking, since it allows place the database on network drives, and provides protection against incompetent user actions (aka poka-yoke). Therefore libmdbx may be a little lag in performance tests from LMDB where the named mutexes are used.

History

Historically, libmdbx is a deeply revised and extended descendant of the Lightning Memory-Mapped Database. At first the development was carried out within the ReOpenLDAP project. About a year later libmdbx was separated into a standalone project, which was presented at Highload++ 2015 conference.

Since 2017 libmdbx is used in Fast Positive Tables, and development is funded by Positive Technologies.

Acknowledgments

Howard Chu [email protected] is the author of LMDB, from which originated the libmdbx in 2015.

Martin Hedenfalk [email protected] is the author of btree.c code, which was used to begin development of LMDB.


Usage

Currently, libmdbx is only available in a source code form. Packages support for common Linux distributions is planned in the future, since release the version 1.0.

Never use tarballs nor zips automatically provided by Github !

Please don't use tarballs nor zips which are automatically provided by Github. These archives do not contain version information and thus are unfit to build libmdbx. Instead of ones just clone the git repository, either download a tarball or zip with the properly amalgamated source core. Moreover, please vote for ability of disabling auto-creation such unsuitable archives.

Source code embedding

libmdbx provides two official ways for integration in source code form:

  1. Using the amalgamated source code.

The amalgamated source code includes all files required to build and use libmdbx, but not for testing libmdbx itself.

  1. Adding the complete original source code as a git submodule.

This allows you to build as libmdbx and testing tool. On the other hand, this way requires you to pull git tags, and use C++11 compiler for test tool.

Please, avoid using any other techniques. Otherwise, at least don't ask for support and don't name such chimeras libmdbx.

The amalgamated source code could be created from the original clone of git repository on Linux by executing make dist. As a result, the desired set of files will be formed in the dist subdirectory.

Building and Testing

Both amalgamated and original source code provides build through the use CMake or GNU Make with bash. All build ways are completely traditional and have minimal prerequirements like build-essential, i.e. the non-obsolete C/C++ compiler and a SDK for the target platform. Obviously you need building tools itself, i.e. git, cmake or GNU make with bash. For your convenience, make help and make options are also available for listing existing targets and build options respectively.

The only significant specificity is that git' tags are required to build from complete (not amalgamated) source codes. Executing git fetch --tags --force --prune is enough to get ones, or git fetch --unshallow --tags --prune --force after the Github's actions/[email protected] either set fetch-depth: 0 for it.

So just using CMake or GNU Make in your habitual manner and feel free to fill an issue or make pull request in the case something will be unexpected or broken down.

Testing

The amalgamated source code does not contain any tests for or several reasons. Please read the explanation and don't ask to alter this. So for testing libmdbx itself you need a full source code, i.e. the clone of a git repository, there is no option.

The full source code of libmdbx has a test subdirectory with minimalistic test "framework". Actually yonder is a source code of the mdbx_test – console utility which has a set of command-line options that allow construct and run a reasonable enough test scenarios. This test utility is intended for libmdbx's developers for testing library itself, but not for use by users. Therefore, only basic information is provided:

  • There are few CRUD-based test cases (hill, TTL, nested, append, jitter, etc), which can be combined to test the concurrent operations within shared database in a multi-processes environment. This is the basic test scenario.
  • The Makefile provide several self-described targets for testing: smoke, test, check, memcheck, test-valgrind, test-asan, test-leak, test-ubsan, cross-gcc, cross-qemu, gcc-analyzer, smoke-fault, smoke-singleprocess, test-singleprocess, 'long-test'. Please run make --help if doubt.
  • In addition to the mdbx_test utility, there is the script long_stochastic.sh, which calls mdbx_test by going through set of modes and options, with gradually increasing the number of operations and the size of transactions. This script is used for mostly of all automatic testing, including Makefile targets and Continuous Integration.
  • Brief information of available command-line options is available by --help. However, you should dive into source code to get all, there is no option.

Anyway, no matter how thoroughly the libmdbx is tested, you should rely only on your own tests for a few reasons:

  1. Mostly of all use cases are unique. So it is no warranty that your use case was properly tested, even the libmdbx's tests engages stochastic approach.
  2. If there are problems, then your test on the one hand will help to verify whether you are using libmdbx correctly, on the other hand it will allow to reproduce the problem and insure against regression in a future.
  3. Actually you should rely on than you checked by yourself or take a risk.

Common important details

Build reproducibility

By default libmdbx track build time via MDBX_BUILD_TIMESTAMP build option and macro. So for a reproducible builds you should predefine/override it to known fixed string value. For instance:

  • for reproducible build with make: make MDBX_BUILD_TIMESTAMP=unknown ...
  • or during configure by CMake: cmake -DMDBX_BUILD_TIMESTAMP:STRING=unknown ...

Of course, in addition to this, your toolchain must ensure the reproducibility of builds. For more information please refer to reproducible-builds.org.

Containers

There are no special traits nor quirks if you use libmdbx ONLY inside the single container. But in a cross-container cases or with a host-container(s) mix the two major things MUST be guaranteed:

  1. Coherence of memory mapping content and unified page cache inside OS kernel for host and all container(s) operated with a some DB. Basically this means must be only a single physical copy of each memory mapped DB' page in the system memory.

  2. Uniqueness of PID values and/or a common space for ones:

    • for POSIX systems: PID uniqueness for all processes operated with a DB. I.e. the --pid=host is required for run DB-aware processes inside Docker, either without host interaction a --pid=container: with the same name/id.
    • for non-POSIX (i.e. Windows) systems: inter-visibility of processes handles. I.e. the OpenProcess(SYNCHRONIZE, ..., PID) must return reasonable error, including ERROR_ACCESS_DENIED, but not the ERROR_INVALID_PARAMETER as for an invalid/non-existent PID.

DSO/DLL unloading and destructors of Thread-Local-Storage objects

When building libmdbx as a shared library or use static libmdbx as a part of another dynamic library, it is advisable to make sure that your system ensures the correctness of the call destructors of Thread-Local-Storage objects when unloading dynamic libraries.

If this is not the case, then unloading a dynamic-link library with libmdbx code inside, can result in either a resource leak or a crash due to calling destructors from an already unloaded DSO/DLL object. The problem can only manifest in a multithreaded application, which makes the unloading of shared dynamic libraries with libmdbx code inside, after using libmdbx. It is known that TLS-destructors are properly maintained in the following cases:

  • On all modern versions of Windows (Windows 7 and later).

  • On systems with the __cxa_thread_atexit_impl() function in the standard C library, including systems with GNU libc version 2.18 and later.

  • On systems with libpthread/ntpl from GNU libc with bug fixes #21031 and #21032, or where there are no similar bugs in the pthreads implementation.

Linux and other platforms with GNU Make

To build the library it is enough to execute make all in the directory of source code, and make check to execute the basic tests.

If the make installed on the system is not GNU Make, there will be a lot of errors from make when trying to build. In this case, perhaps you should use gmake instead of make, or even gnu-make, etc.

FreeBSD and related platforms

As a rule, in such systems, the default is to use Berkeley Make. And GNU Make is called by the gmake command or may be missing. In addition, bash may be absent.

You need to install the required components: GNU Make, bash, C and C++ compilers compatible with GCC or CLANG. After that, to build the library, it is enough to execute gmake all (or make all) in the directory with source code, and gmake check (or make check) to run the basic tests.

Windows

For build libmdbx on Windows the original CMake and Microsoft Visual Studio 2019 are recommended. Otherwise do not forget to add ntdll.lib to linking.

Building by MinGW, MSYS or Cygwin is potentially possible. However, these scripts are not tested and will probably require you to modify the CMakeLists.txt or Makefile respectively.

It should be noted that in libmdbx was efforts to resolve runtime dependencies from CRT and other MSVC libraries. For this is enough to define the MDBX_WITHOUT_MSVC_CRT during build.

An example of running a basic test script can be found in the CI-script for AppVeyor. To run the long stochastic test scenario, bash is required, and such testing is recommended with placing the test data on the RAM-disk.

Windows Subsystem for Linux

libmdbx could be used in WSL2 but NOT in WSL1 environment. This is a consequence of the fundamental shortcomings of WSL1 and cannot be fixed. To avoid data loss, libmdbx returns the ENOLCK (37, "No record locks available") error when opening the database in a WSL1 environment.

MacOS

Current native build tools for MacOS include GNU Make, CLANG and an outdated version of bash. Therefore, to build the library, it is enough to run make all in the directory with source code, and run make check to execute the base tests. If something goes wrong, it is recommended to install Homebrew and try again.

To run the long stochastic test scenario, you will need to install the current (not outdated) version of bash. To do this, we recommend that you install Homebrew and then execute brew install bash.

Android

We recommend using CMake to build libmdbx for Android. Please refer to the official guide.

iOS

To build libmdbx for iOS, we recommend using CMake with the "toolchain file" from the ios-cmake project.

API description

Please refer to the online libmdbx API reference and/or see the mdbx.h header.

Bindings

Runtime Repo Author
Haskell libmdbx-hs Francisco Vallarino
NodeJS lmdbx-js Kris Zyp
NodeJS node-mdbx Сергей Федотов
Ruby ruby-mdbx Mahlon E. Smith
Go mdbx-go Alex Sharov
Nim NimDBX Jens Alfke
Rust libmdbx-rs Artem Vorotnikov
Rust mdbx gcxfd
Java mdbxjni Castor Technologies
Python (draft) python-bindings branch Noel Kuntze
.NET (obsolete) mdbx.NET Jerry Wang

Performance comparison

All benchmarks were done in 2015 by IOArena and multiple scripts runs on Lenovo Carbon-2 laptop, i7-4600U 2.1 GHz (2 physical cores, 4 HyperThreading cores), 8 Gb RAM, SSD SAMSUNG MZNTD512HAGL-000L1 (DXT23L0Q) 512 Gb.

Integral performance

Here showed sum of performance metrics in 3 benchmarks:

  • Read/Search on the machine with 4 logical CPUs in HyperThreading mode (i.e. actually 2 physical CPU cores);

  • Transactions with CRUD operations in sync-write mode (fdatasync is called after each transaction);

  • Transactions with CRUD operations in lazy-write mode (moment to sync data to persistent storage is decided by OS).

Reasons why asynchronous mode isn't benchmarked here:

  1. It doesn't make sense as it has to be done with DB engines, oriented for keeping data in memory e.g. Tarantool, Redis), etc.

  2. Performance gap is too high to compare in any meaningful way.

Comparison #1: Integral Performance


Read Scalability

Summary performance with concurrent read/search queries in 1-2-4-8 threads on the machine with 4 logical CPUs in HyperThreading mode (i.e. actually 2 physical CPU cores).

Comparison #2: Read Scalability


Sync-write mode

  • Linear scale on left and dark rectangles mean arithmetic mean transactions per second;

  • Logarithmic scale on right is in seconds and yellow intervals mean execution time of transactions. Each interval shows minimal and maximum execution time, cross marks standard deviation.

10,000 transactions in sync-write mode. In case of a crash all data is consistent and conforms to the last successful transaction. The fdatasync syscall is used after each write transaction in this mode.

In the benchmark each transaction contains combined CRUD operations (2 inserts, 1 read, 1 update, 1 delete). Benchmark starts on an empty database and after full run the database contains 10,000 small key-value records.

Comparison #3: Sync-write mode


Lazy-write mode

  • Linear scale on left and dark rectangles mean arithmetic mean of thousands transactions per second;

  • Logarithmic scale on right in seconds and yellow intervals mean execution time of transactions. Each interval shows minimal and maximum execution time, cross marks standard deviation.

100,000 transactions in lazy-write mode. In case of a crash all data is consistent and conforms to the one of last successful transactions, but transactions after it will be lost. Other DB engines use WAL or transaction journal for that, which in turn depends on order of operations in the journaled filesystem. libmdbx doesn't use WAL and hands I/O operations to filesystem and OS kernel (mmap).

In the benchmark each transaction contains combined CRUD operations (2 inserts, 1 read, 1 update, 1 delete). Benchmark starts on an empty database and after full run the database contains 100,000 small key-value records.

Comparison #4: Lazy-write mode


Async-write mode

  • Linear scale on left and dark rectangles mean arithmetic mean of thousands transactions per second;

  • Logarithmic scale on right in seconds and yellow intervals mean execution time of transactions. Each interval shows minimal and maximum execution time, cross marks standard deviation.

1,000,000 transactions in async-write mode. In case of a crash all data is consistent and conforms to the one of last successful transactions, but lost transaction count is much higher than in lazy-write mode. All DB engines in this mode do as little writes as possible on persistent storage. libmdbx uses msync(MS_ASYNC) in this mode.

In the benchmark each transaction contains combined CRUD operations (2 inserts, 1 read, 1 update, 1 delete). Benchmark starts on an empty database and after full run the database contains 10,000 small key-value records.

Comparison #5: Async-write mode


Cost comparison

Summary of used resources during lazy-write mode benchmarks:

  • Read and write IOPs;

  • Sum of user CPU time and sys CPU time;

  • Used space on persistent storage after the test and closed DB, but not waiting for the end of all internal housekeeping operations (LSM compactification, etc).

ForestDB is excluded because benchmark showed it's resource consumption for each resource (CPU, IOPs) much higher than other engines which prevents to meaningfully compare it with them.

All benchmark data is gathered by getrusage() syscall and by scanning the data directory.

Comparison #6: Cost comparison


This is a mirror of the origin repository that was moved to abf.io because of discriminatory restrictions for Russian Crimea.

Releases(v0.11.6)
  • v0.11.6(Mar 24, 2022)

    The stable release with the complete workaround for an incoherence flaw of Linux unified page/buffer cache. Nonetheless the cause for this trouble may be an issue of Intel CPU cache/MESI. See issue#269 for more information.

    Acknowledgements:

    Fixes:

    • Added complete workaround for an incoherence flaw of Linux unified page/buffer cache.
    • Fixed cursor reusing for read-only transactions.
    • Fixed copy&paste typo inside mdbx::cursor::find_multivalue().

    Minors:

    • Minor refine C++ API for convenience.
    • Minor internals refines.
    • Added lib-static and lib-shared targets for make.
    • Added minor workaround for AppleClang 13.3 bug.
    • Clarified error messages of a signature/version mismatch.

    Please refer to the ChangeLog for more historical information and actual TODOs.


    SHA256 checksums

    c15168cc97d8d2eb182f9b18f44295d72523d6654a2e34a5c634c62855047606  libmdbx-amalgamated-0.11.6.tar.gz
    f95524829d01361abeabc1283db6c1418c94629d01dd2766c574d1e534217c35  libmdbx-amalgamated-0_11_6.zip
    

    *** Please don't use github's tarballs nor zips, but the amalgamated sources or clone the git repository *** *** Moreover, please vote for "disable tarballs" feature to vanish this discommodity ***

    Source code(tar.gz)
    Source code(zip)
    libmdbx-amalgamated-0.11.6.tar.gz(659.65 KB)
    libmdbx-amalgamated-0_11_6.zip(671.29 KB)
  • v0.11.5(Feb 23, 2022)

    The bobsolete hotfix release for a flaw of Linux unified page/buffer cache. See issue#269 for more information.

    Acknowledgements:

    Fixes:

    • Added workaround for a flaw of Linux 4.19 (at least) unified page/buffer cache.
    • Fixed/Reworked move-assignment operators for "managed" classes of C++ API.
    • Fixed potential SIGSEGV while open DB with overrided non-default page size.
    • Made mdbx_env_open() idempotence in failure cases.
    • Refined/Fixed pages reservation inside mdbx_update_gc() to avoid non-reclamation in a rare cases.
    • Fixed typo in a retained space calculation for the hsr-callback.

    Minors:

    • Reworked functions for meta-pages, split-off non-volatile.
    • Disentangled C11-atomic fences/barriers and pure-functions (with __attribute__((__pure__))) to avoid compiler misoptimization.
    • Fixed hypotetic unaligned access to 64-bit dwords on ARM with __ARM_FEATURE_UNALIGNED defined.
    • Reasonable paranoia that makes clarity for code readers.
    • Minor fixes Doxygen references, comments, descriptions, etc.

    Please refer to the ChangeLog for more historical information and actual TODOs.


    SHA256 checksums

    d6f42ed3d910046eb1df8a6dc1e7959d59a409c1d0d7250837a843e2b5f43bd2  libmdbx-amalgamated-0.11.5.tar.gz
    88ba43a888f45718d6fc7f8b529ec9bcd40726d54feae8fa5e5892516f2acfb1  libmdbx-amalgamated-0_11_5.zip
    

    *** Please don't use github's tarballs nor zips, but the amalgamated sources or clone the git repository *** *** Moreover, please vote for "disable tarballs" feature to vanish this discommodity ***

    Source code(tar.gz)
    Source code(zip)
    libmdbx-amalgamated-0.11.5.tar.gz(657.45 KB)
    libmdbx-amalgamated-0_11_5.zip(669.07 KB)
  • v0.11.4(Feb 2, 2022)

    The stable release with fixes for large and huge databases sized of 4..128 TiB.

    Acknowledgements:

    New features, extensions and improvements:

    • Added treating the UINT64_MAX value as maximum for given option inside mdbx_env_set_option().
    • Added to_hex/to_base58/to_base64::output(std::ostream&) overloads without using temporary string objects as buffers.
    • Added --geometry-jitter=YES|no option to the test framework.
    • Added support for Deno support by Kris Zyp.

    Fixes:

    • Fixed handling MDBX_opt_rp_augment_limit for GC's records from huge transactions (Ethereum: Erigon/Akula/Silkworm).
    • Fixed build on Android (avoid including sys/sem.h).
    • Fixed missing copy assignment operator for mdbx::move_result.
    • Fixed missing & for std::ostream &operator<<() overloads.
    • Fixed unexpected EXDEV (Cross-device link) error from mdbx_env_copy().
    • Fixed base64 encoding/decoding bugs in auxillary C++ API.
    • Fixed overflow of pgno_t during checking PNL on 64-bit platforms.
    • Fixed excessive PNL checking after sort for spilling.
    • Reworked checking MAX_PAGENO and DB upper-size geometry limit.
    • Fixed build for some combinations of versions of MSVC and Windows SDK.

    Minors:

    • Added workaround for CLANG bug D79919/PR42445.
    • Fixed build test on Android (using pthread_barrier_t stub).
    • Disabled C++20 concepts for CLANG < 14 on Android.
    • Fixed minor unused parameter warning.
    • Added CI for Android.
    • Refine/cleanup internal logging.
    • Refined line splitting inside hex/base58/base64 encoding to avoid \n at the end.
    • Added workaround for modern libstdc++ with CLANG < 4.x
    • Relaxed txn-check rules for auxiliary functions.
    • Clarified a comments and descriptions, etc.
    • Using the -fno-semantic interposition option to reduce the overhead to calling self own public functions.

    Please refer to the ChangeLog for more historical information and actual TODOs.


    SHA256 checksums

    884de528f5c2abab2187b7c4c84b769d2551e1a748cbfdf0ae4c0f5c9f8dbd27  libmdbx-amalgamated-0.11.4.tar.gz
    a4cbe9b81df78ef6ab14276d31bdb3c982fe5b78cc26fb54aed785c2048f5947  libmdbx-amalgamated-0_11_4.zip
    

    *** Please don't use github's tarballs nor zips, but the amalgamated sources or clone the git repository *** *** Moreover, please vote for "disable tarballs" feature to vanish this discommodity ***

    Source code(tar.gz)
    Source code(zip)
    libmdbx-amalgamated-0.11.4.tar.gz(654.94 KB)
    libmdbx-amalgamated-0_11_4.zip(666.50 KB)
  • v0.11.3(Dec 31, 2021)

    Acknowledgements:

    New features, extensions and improvements:

    • Added mdbx_cursor_get_batch().
    • Added MDBX_SET_UPPERBOUND.
    • C++ API is finalized now.
    • The GC update stage has been significantly speeded when fixing huge Erigon's transactions (Ethereum ecosystem).

    Fixes:

    • Disabled C++20 concepts for stupid AppleClang 13.x
    • Fixed internal collision of MDBX_SHRINK_ALLOWED with MDBX_ACCEDE.

    Minors:

    • Fixed returning MDBX_RESULT_TRUE (unexpected -1) from mdbx_env_set_option().
    • Added mdbx_env_get_syncbytes() and mdbx_env_get_syncperiod().
    • Clarified description of MDBX_INTEGERKEY.
    • Reworked/simplified mdbx_env_sync_internal().
    • Fixed extra assertion inside mdbx_cursor_put() for MDBX_DUPFIXED cases.
    • Avoiding extra looping inside mdbx_env_info_ex().
    • Explicitly enabled core dumps from stochastic tests scripts on Linux.
    • Fixed mdbx_override_meta() to avoid false-positive assertions.
    • For compatibility reverted returning MDBX_ENODATAfor some cases.

    Please refer to the ChangeLog for more historical information and actual TODOs.


    SHA256 checksums

    bede0a58803c0183ecd56aecafb77d5defe57ec16fabc34eaf810317c15efd44  libmdbx-amalgamated-0.11.3.tar.gz
    03abf99bcc2ca45ff56b2c67ac50dab65e5451282fe0c1dcdd5d77073b027f11  libmdbx-amalgamated-0_11_3.zip
    

    *** Please don't use github's tarballs nor zips, but the amalgamated sources or clone the git repository *** *** Moreover, please vote for "disable tarballs" feature to vanish this discommodity ***

    Source code(tar.gz)
    Source code(zip)
    libmdbx-amalgamated-0.11.3.tar.gz(651.26 KB)
    libmdbx-amalgamated-0_11_3.zip(662.99 KB)
  • v0.11.2(Dec 2, 2021)

    Acknowledgements:

    Fixes:

    Minors:

    • Fixed constexpr-related macros for legacy compilers.
    • Allowed to define CMAKE_CXX_STANDARD using an environment variable.
    • Simplified collection statistics of page operation .
    • Added MDBX_FORCE_BUILD_AS_MAIN_PROJECT cmake option.
    • Remove unneeded #undef P_DIRTY.

    Please refer to the ChangeLog for more historical information and actual TODOs.


    SHA256 checksums

    efe64856e934621adf104385fad788e679c41e2df3eae96ab35caf19403c75e2  libmdbx-amalgamated-0.11.2.tar.gz
    2170d2f812a1df83ccb70e2978ee520d3fa9b254641d5834e2da0fc400fdd69a  libmdbx-amalgamated-0_11_2.zip
    

    *** Please don't use github's tarballs nor zips, but the amalgamated sources or clone the git repository *** *** Moreover, please vote for "disable tarballs" feature to vanish this discommodity ***

    Source code(tar.gz)
    Source code(zip)
    libmdbx-amalgamated-0.11.2.tar.gz(649.29 KB)
    libmdbx-amalgamated-0_11_2.zip(660.63 KB)
  • v0.11.1(Oct 23, 2021)

    Backward compatibility break:

    The database format signature has been changed to prevent forward-interoperability with an previous releases, which may lead to a false positive diagnosis of database corruption due to flaws of an old library versions.

    This change is mostly invisible:

    • previously versions are unable to read/write a new DBs;
    • but the new release is able to handle an old DBs and will silently upgrade ones.

    Acknowledgements:

    Please refer to the ChangeLog for more historical information and actual TODOs.


    SHA256 checksums

    f954ba8c9768914a92c2b46aac0d66bec674dbb4d7b0f01e362ea2921746ddaa  libmdbx-amalgamated-0.11.1.tar.gz
    dcc36463dd5239b2ed21eda58eddbefa695eddebef86cdaae3dac5dc89a575df  libmdbx-amalgamated-0_11_1.zip
    

    *** Please don't use github's tarballs nor zips, but the amalgamated sources or clone the git repository *** *** Moreover, please vote for "disable tarballs" feature to vanish this discommodity ***

    Source code(tar.gz)
    Source code(zip)
    libmdbx-amalgamated-0.11.1.tar.gz(648.07 KB)
    libmdbx-amalgamated-0_11_1.zip(659.73 KB)
  • v0.10.5(Oct 13, 2021)

    Warning:

    Unfortunately, the v0.10.5 accidentally comes not full-compatible with previous releases:

    • v0.10.5 can read/processing DBs created by previous releases, i.e. the backward-compatibility is provided;
    • however, previous releases may lead to false-corrupted state with DB that was touched by v0.10.5, i.e. the forward-compatibility is broken for v0.10.4 and earlier.

    This cannot be fixed, as it requires fixing past versions, which as a result we will just get a current version. Therefore, it is recommended to use v0.11.1 instead of v0.10.5.


    Acknowledgements:

    Fixes:

    • Fixed unaligned access regression after the #pragma pack fix for modern compilers.
    • Added UBSAN-test to CI to avoid a regression(s) similar to lately fixed.
    • Fixed possibility of meta-pages clashing after manually turn to a particular meta-page using mdbx_chk utility.

    Minors:

    • Refined handling of weak or invalid meta-pages while a DB opening.
    • Refined providing information for the @MAIN and @GC sub-databases of a last committed modification transaction's ID.

    SHA256 checksums

    67bc2db4de771a9cb3eea41536b37dbfad21b3df1e7e00f2361831fd2fc5f8f7  libmdbx-amalgamated-0.10.5.tar.gz
    9eb8fab53721c02e585a553c5eab0e87a888adfc59b10d816de7d6fd1fa0eecb  libmdbx-amalgamated-0_10_5.zip
    

    *** Please don't use github's tarballs nor zips, but the amalgamated sources or clone the git repository *** *** Moreover, please vote for "disable tarballs" feature to vanish this discommodity ***

    Source code(tar.gz)
    Source code(zip)
    libmdbx-amalgamated-0.10.5.tar.gz(647.38 KB)
    libmdbx-amalgamated-0_10_5.zip(658.97 KB)
  • v0.10.4(Oct 10, 2021)

    Acknowledgements:

    Fixes:

    • Fixed possibility of looping update GC during transaction commit (no public issue since the problem was discovered inside Positive Technologies).
    • Fixed #pragma pack to avoid provoking some compilers to generate code with unaligned access.
    • Fixed noexcept for potentially throwing txn::put() of C++ API.

    Minors:

    • Added stochastic test script for checking small transactions cases.
    • Removed extra transaction commit/restart inside test framework.
    • In debugging builds fixed a too small (single page) by default DB shrink threshold.

    SHA256 checksums

    e11d5339a1e1cc34407898933b62a208936fd761a2cc31e11244d581d1d2b5d0  libmdbx-amalgamated-0.10.4.tar.gz
    59d60111deb27b997d5aac817898e12f82c406f3eab1d411130e60d1d6a9dbf0  libmdbx-amalgamated-0_10_4.zip
    

    *** Please don't use github's tarballs nor zips, but the amalgamated sources or clone the git repository *** *** Moreover, please vote for "disable tarballs" feature to vanish this discommodity ***

    Source code(tar.gz)
    Source code(zip)
    libmdbx-amalgamated-0.10.4.tar.gz(647.29 KB)
    libmdbx-amalgamated-0_10_4.zip(658.61 KB)
  • v0.10.3(Aug 27, 2021)

    Acknowledgements:

    Extensions and improvements:

    • Added cursor::erase() overloads for key and for key-value.
    • Resolve minor Coverity Scan issues (no fixes but some hint/comment were added).
    • Resolve minor UndefinedBehaviorSanitizer issues (no fixes but some workaround were added).

    Fixes:

    • Always setup madvise while opening DB (fixes https://github.com/erthink/libmdbx/issues/231).
    • Fixed checking legacy P_DIRTY flag (0x10) for nested/sub-pages.

    Minors:

    • Fixed getting revision number from middle of history during amalgamation (GNU Makefile).
    • Fixed search GCC tools for LTO (CMake scripts).
    • Fixed/reorder dirs list for search CLANG tools for LTO (CMake scripts).
    • Fixed/workarounds for CLANG < 9.x
    • Fixed CMake warning about compatibility with 3.8.2

    SHA256 checksums

    a8f2436c4d008886e044f568a22bda44329fb1c67f175d91a929ff8e2065340a  libmdbx-amalgamated-0.10.3.tar.gz
    26fde175d6a80cbf3a65fbf15e7c78f4940f92089dc379fefdecaae8973f7ef2  libmdbx-amalgamated-0_10_3.zip
    

    *** Please don't use github's tarballs nor zips, but the amalgamated sources or clone the git repository *** *** Moreover, please vote for "disable tarballs" feature to vanish this discommodity ***

    Source code(tar.gz)
    Source code(zip)
    libmdbx-amalgamated-0.10.3.tar.gz(646.65 KB)
    libmdbx-amalgamated-0_10_3.zip(658.29 KB)
  • v0.10.2(Jul 26, 2021)

    Acknowledgements:

    New features, extensions and improvements:

    • Allow to predefine/override MDBX_BUILD_TIMESTAMP for builds reproducibility.
    • Added options support for long-stochastic script.
    • Avoided MDBX_TXN_FULL error for large transactions when possible.
    • The MDBX_READERS_LIMIT increased to 32767.
    • Raise MDBX_TOO_LARGE under Valgrind/ASAN if being opened DB is 100 larger than RAM (to avoid hangs and OOM).
    • Minimized the size of poisoned/unpoisoned regions to avoid Valgrind/ASAN stuck.
    • Added more workarounds for QEMU for testing builds for 32-bit platforms, Alpha and Sparc architectures.
    • mdbx_chk now skips iteration & checking of DB' records if corresponding page-tree is corrupted (to avoid SIGSEGV, ASAN failures, etc).
    • Added more checks for rare/fuzzing corruption cases.

    Backward compatibility break:

    • Use file VERSION.txt for version information instead of VERSION to avoid collision with #include <version>.
    • Rename slice::from/to_FOO_bytes() to `slice::envisage_from/to_FOO_length()'.
    • Rename MDBX_TEST_EXTRA make's variable to MDBX_SMOKE_EXTRA.
    • Some details of the C++ API have been changed for subsequent freezing.

    Fixes:

    TODO for next releases:


    SHA256 checksums

    745555704df76626a6612ad0c6bc6b1a66bfab98b9245b07dfb82640aa46d6fa  libmdbx-amalgamated-0.10.2.tar.gz
    95ca553437d99bb320216592a1b36cc20ef90feeb7dc413875f8e8a2a1d56c72  libmdbx-amalgamated-0_10_2.zip
    

    *** Please don't use github's tarballs nor zips, but the amalgamated sources or clone the git repository *** *** Moreover, please vote for "disable tarballs" feature to vanish this discommodity ***

    Source code(tar.gz)
    Source code(zip)
    libmdbx-amalgamated-0.10.2.tar.gz(645.35 KB)
    libmdbx-amalgamated-0_10_2.zip(656.98 KB)
  • v0.10.1(Jun 1, 2021)

    Acknowledgements:

    New features:

    • Added -p option to mdbx_stat utility for printing page operations statistic.
    • Added explicit checking for and warning about using unfit github's archives.

    Fixes:

    • Fixed minor "foo not used" warnings from modern C++ compilers when building the C++ part of the library.
    • Fixed confusing/messy errors when build library from unfit github's archives (https://github.com/erthink/libmdbx/issues/197).
    • Fixed #​e​l​s​i​f typo.
    • Fixed rare unexpected MDBX_PROBLEM error during altering data in huge transactions due to wrong spilling/oust of dirty pages (https://github.com/erthink/libmdbx/issues/195).

    TODO for next releases:


    SHA256 checksums

    dfcf8993a5242fcd7e7b28e3c3019d60a337e81d5e8c6f4d8368050264262e9a  libmdbx-amalgamated-0.10.1.tar.gz
    e58f24ea71a00b2aeda23c7a6382818091962e9738593891e382078b314ba35d  libmdbx-amalgamated-0_10_1.zip
    

    *** Please don't use github's tarballs nor zips, but the amalgamated sources or clone the git repository *** *** Moreover, please vote for "disable tarballs" feature to vanish this discommodity ***

    Source code(tar.gz)
    Source code(zip)
    libmdbx-amalgamated-0.10.1.tar.gz(632.28 KB)
    libmdbx-amalgamated-0_10_1.zip(644.16 KB)
  • v0.10.0(May 9, 2021)

    Acknowledgements:

    New features:

    • Added mdbx_env_set_option() and mdbx_env_get_option() for controls various runtime options for an environment (announce of this feature was missed in a previous news).
    • Added MDBX_DISABLE_PAGECHECKS build option to disable some checks to reduce an overhead and detection probability of database corruption to a values closer to the LMDB. The MDBX_DISABLE_PAGECHECKS=1 provides a performance boost of about 10% in CRUD scenarios, and conjointly with the MDBX_ENV_CHECKPID=0 and MDBX_TXN_CHECKOWNER=0 options can yield up to 30% more performance compared to LMDB.
    • Using float point (exponential quantized) representation for internal 16-bit values of grow step and shrink threshold when huge ones (https://github.com/erthink/libmdbx/issues/166). To minimize the impact on compatibility, only the odd values inside the upper half of the range (i.e. 32769..65533) are used for the new representation.
    • Added the mdbx_drop similar to LMDB command-line tool to purge or delete (sub)database(s).
    • Ruby bindings is available now by Mahlon E. Smith.
    • Added MDBX_ENABLE_MADVISE build option which controls the use of POSIX madvise() hints and friends.
    • The internal node sizes were refined, resulting in a reduction in large/overflow pages in some use cases and a slight increase in limits for a keys size to ≈½ of page size.
    • Added to mdbx_chk output number of keys/items on pages.
    • Added explicit install-strip and install-no-strip targets to the Makefile (https://github.com/erthink/libmdbx/pull/180).
    • Major rework page splitting (af9b7b560505684249b76730997f9e00614b8113) for
      • An "auto-appending" feature upon insertion for both ascending and descending key sequences. As a result, the optimality of page filling increases significantly (more densely, less slackness) while inserting ordered sequences of keys,
      • A "splitting at middle" to make page tree more balanced on average.
    • Added mdbx_get_sysraminfo() to the API.
    • Added guessing a reasonable maximum DB size for the default upper limit of geometry (https://github.com/erthink/libmdbx/issues/183).
    • Major rework internal labeling of a dirty pages (958fd5b9479f52f2124ab7e83c6b18b04b0e7dda) for a "transparent spilling" feature with the gist to make a dirty pages be ready to spilling (writing to a disk) without further altering ones. Thus in the MDBX_WRITEMAP mode the OS kernel able to oust dirty pages to DB file without further penalty during transaction commit. As a result, page swapping and I/O could be significantly reduced during extra large transactions and/or lack of memory.
    • Minimized reading leaf-pages during dropping subDB(s) and nested trees.
    • Major rework a spilling of dirty pages to support LRU policy and prioritization for a large/overflow pages.
    • Statistics of page operations (split, merge, copy, spill, etc) now available through mdbx_env_info_ex().
    • Auto-setup limit for length of dirty pages list (MDBX_opt_txn_dp_limit option).
    • Support make options to list available build options.
    • Support make help to list available make targets.
    • Silently make's build by default.
    • Preliminary Python bindings is available now by Noel Kuntze (https://github.com/erthink/libmdbx/issues/147).

    Backward compatibility break:

    • The MDBX_AVOID_CRT build option was renamed to MDBX_WITHOUT_MSVC_CRT. This option is only relevant when building for Windows.
    • The mdbx_env_stat() always, and mdbx_env_stat_ex() when called with the zeroed transaction parameter, now internally start temporary read transaction and thus may returns MDBX_BAD_RSLOT error. So, just never use deprecated mdbx_env_stat()' and callmdbx_env_stat_ex()` with transaction parameter.
    • The build option MDBX_CONFIG_MANUAL_TLS_CALLBACK was removed and now just a non-zero value of the MDBX_MANUAL_MODULE_HANDLER macro indicates the requirement to manually call mdbx_module_handler() when loading libraries and applications uses statically linked libmdbx on an obsolete Windows versions.

    Fixes:

    • Fixed performance regression due non-optimal C11 atomics usage (https://github.com/erthink/libmdbx/issues/160).
    • Fixed "reincarnation" of subDB after it deletion (https://github.com/erthink/libmdbx/issues/168).
    • Fixed (disallowing) implicit subDB deletion via operations on @MAIN's DBI-handle.
    • Fixed a crash of mdbx_env_info_ex() in case of a call for a non-open environment (https://github.com/erthink/libmdbx/issues/171).
    • Fixed the selecting/adjustment values inside mdbx_env_set_geometry() for implicit out-of-range cases (https://github.com/erthink/libmdbx/issues/170).
    • Fixed mdbx_env_set_option() for set initial and limit size of dirty page list ((https://github.com/erthink/libmdbx/issues/179).
    • Fixed an unreasonably huge default upper limit for DB geometry (https://github.com/erthink/libmdbx/issues/183).
    • Fixed constexpr specifier for the slice::invalid().
    • Fixed (no)readahead auto-handling (https://github.com/erthink/libmdbx/issues/164).
    • Fixed non-alloy build for Windows.
    • Switched to using Heap-functions instead of LocalAlloc/LocalFree on Windows.
    • Fixed mdbx_env_stat_ex() to returning statistics of the whole environment instead of MainDB only (https://github.com/erthink/libmdbx/issues/190).
    • Fixed building by GCC 4.8.5 (added workaround for a preprocessor's bug).
    • Fixed building C++ part for iOS <= 13.0 (unavailability of std::filesystem::path).
    • Fixed building for Windows target versions prior to Windows Vista (WIN32_WINNT < 0x0600).
    • Fixed building by MinGW for Windows (https://github.com/erthink/libmdbx/issues/155).

    TODO for a next releases:


    SHA256 checksums

    767776d961fadeb51ee895fb70ed82a03051bae855a19396f0067b03076103bb  libmdbx-amalgamated-0.10.0.tar.gz
    66a46c83b27fb47930e245d1dae99b5b9656a1e0017439f42c6a735fb710d427  libmdbx-amalgamated-0_10_0.zip
    

    *** Please don't use github's tarballs nor zips, but the amalgamated sources or clone the git repository ***

    Source code(tar.gz)
    Source code(zip)
    libmdbx-amalgamated-0.10.0.tar.gz(630.19 KB)
    libmdbx-amalgamated-0_10_0.zip(641.94 KB)
  • v0.9.3(Feb 2, 2021)

    Acknowledgements:

    Removed options and features:

    • Drop MDBX_HUGE_TRANSACTIONS build-option (now no longer required).

    New features:

    • Package for FreeBSD is available now by Mahlon E. Smith.
    • New API functions to get/set various options (https://github.com/erthink/libmdbx/issues/128):
      • the maximum number of named databases for the environment;
      • the maximum number of threads/reader slots;
      • threshold (since the last unsteady commit) to force flush the data buffers to disk;
      • relative period (since the last unsteady commit) to force flush the data buffers to disk;
      • limit to grow a list of reclaimed/recycled page's numbers for finding a sequence of contiguous pages for large data items;
      • limit to grow a cache of dirty pages for reuse in the current transaction;
      • limit of a pre-allocated memory items for dirty pages;
      • limit of dirty pages for a write transaction;
      • initial allocation size for dirty pages list of a write transaction;
      • maximal part of the dirty pages may be spilled when necessary;
      • minimal part of the dirty pages should be spilled when necessary;
      • how much of the parent transaction dirty pages will be spilled while start each child transaction;
    • Unlimited/Dynamic size of retired and dirty page lists (https://github.com/erthink/libmdbx/issues/123).
    • Added -p option (purge subDB before loading) to mdbx_load tool.
    • Reworked spilling of large transaction and committing of nested transactions:
      • page spilling code reworked to avoid the flaws and bugs inherited from LMDB;
      • limit for number of dirty pages now is controllable at runtime;
      • a spilled pages, including overflow/large pages, now can be reused and refunded/compactified in nested transactions;
      • more effective refunding/compactification especially for the loosed page cache.
    • Added MDBX_ENABLE_REFUND and MDBX_PNL_ASCENDING internal/advanced build options.
    • Added mdbx_default_pagesize() function.
    • Better support architectures with a weak/relaxed memory consistency model (ARM, AARCH64, PPC, MIPS, RISC-V, etc) by means C11 atomics.
    • Speed up page number lists and dirty page lists (https://github.com/erthink/libmdbx/issues/132).
    • Added LIBMDBX_NO_EXPORTS_LEGACY_API build option.

    Fixes:

    • Fixed missing cleanup (null assigned) in the C++ commit/abort (https://github.com/erthink/libmdbx/pull/143).
    • Fixed mdbx_realloc() for case of nullptr and MDBX_AVOID_CRT=ON for Windows.
    • Fixed the possibility to use invalid and renewed (closed & re-opened, dropped & re-created) DBI-handles (https://github.com/erthink/libmdbx/issues/146).
    • Fixed 4-byte aligned access to 64-bit integers, including access to the bootid meta-page's field (https://github.com/erthink/libmdbx/issues/153).
    • Fixed minor/potential memory leak during page flushing and unspilling.
    • Fixed handling states of cursors's and subDBs's for nested transactions.
    • Fixed page leak in extra rare case the list of retired pages changed during update GC on transaction commit.
    • Fixed assertions to avoid false-positive UB detection by CLANG/LLVM (https://github.com/erthink/libmdbx/issues/153).
    • Fixed MDBX_TXN_FULL and regressive MDBX_KEYEXIST during large transaction commit with MDBX_LIFORECLAIM (https://github.com/erthink/libmdbx/issues/123).
    • Fixed auto-recovery (weak->steady with the same boot-id) when Database size at last weak checkpoint is large than at last steady checkpoint.
    • Fixed operation on systems with unusual small/large page size, including PowerPC (https://github.com/erthink/libmdbx/issues/157).

    TODO:

    • Engage new terminology (https://github.com/erthink/libmdbx/issues/137).
    • Resolve few TODOs (https://github.com/erthink/libmdbx/issues/124, https://github.com/erthink/libmdbx/issues/127, https://github.com/erthink/libmdbx/issues/115).
    • Finalize C++ API.
    • Packages for ROSA Linux, ALT Linux, Fedora/RHEL, Debian/Ubuntu.

    SHA256 checksums

    d12bc7189b746beaa85514fcd1fcf26b957bb8feadb11662a0e20c4e79410d3f  libmdbx-amalgamated-0.9.3.tar.gz
    f8249209d31f61750c470f042ecb24e5465424a801221473a0eca49b6af69f66  libmdbx-amalgamated-0_9_3.zip
    2bae1558c37bd787df40d16c021bd074111aabde5a333b23ea46ba0c2f7fd2ce  v0.9.3.tar.gz
    876b820bd7519b7f8942e9fe5ddc88edd5c2bb002e383667aac953de408dfa2b  v0.9.3.zip
    
    Source code(tar.gz)
    Source code(zip)
    libmdbx-amalgamated-0.9.3.tar.gz(560.87 KB)
    libmdbx-amalgamated-0_9_3.zip(572.02 KB)
  • v0.9.2(Nov 27, 2020)

    Acknowledgements:

    Added features:

    • Provided package for buildroot.
    • Binding for Nim is available now by Jens Alfke.
    • Added mdbx_env_delete() for deletion an environment files in a proper and multiprocess-safe way.
    • Added mdbx_txn_commit_ex() with collecting latency information.
    • Fast completion pure nested transactions.
    • Added LIBMDBX_INLINE_API macro and inline versions of some API functions.
    • Added mdbx_cursor_copy() function.
    • Extended tests for checking cursor tracking.
    • Added MDBX_SET_LOWERBOUND operation for mdbx_cursor_get().

    Fixes:

    • Fixed missing installation of mdbx.h++.
    • Fixed use of obsolete __noreturn.
    • Fixed use of yield instruction on ARM if unsupported.
    • Added pthread workaround for buggy toolchain/cmake/buildroot.
    • Fixed use of pthread_yield() for non-GLIBC.
    • Fixed use of RegGetValueA() on Windows 2000/XP.
    • Fixed use of GetTickCount64() on Windows 2000/XP.
    • Fixed opening DB on a network shares (in the exclusive mode).
    • Fixed copy&paste typos.
    • Fixed minor false-positive GCC warning.
    • Added workaround for broken DEFINE_ENUM_FLAG_OPERATORS from Windows SDK.
    • Fixed cursor state after multimap/dupsort repeated deletes (https://github.com/erthink/libmdbx/issues/121).
    • Added SIGPIPE suppression for internal thread during mdbx_env_copy().
    • Fixed extra-rare MDBX_KEY_EXIST error during mdbx_commit() (https://github.com/erthink/libmdbx/issues/131).
    • Fixed spilled pages checking (https://github.com/erthink/libmdbx/issues/126).
    • Fixed mdbx_load for 'plain text' and without -s name cases (https://github.com/erthink/libmdbx/issues/136).
    • Fixed save/restore/commit of cursors for nested transactions.
    • Fixed cursors state in rare/special cases (move next beyond end-of-data, after deletion and so on).
    • Added workaround for MSVC 19.28 (Visual Studio 16.8) (but may still hang during compilation).
    • Fixed paranoidal Clang C++ UB for bitwise operations with flags defined by enums.
    • Fixed large pages checking (for compatibility and to avoid false-positive errors from mdbx_chk).
    • Added workaround for Wine (https://github.com/miranda-ng/miranda-ng/issues/1209).
    • Fixed ERROR_NOT_SUPPORTED while opening DB by UNC pathnames (https://github.com/miranda-ng/miranda-ng/issues/2627).
    • Added handling EXCEPTION_POSSIBLE_DEADLOCK condition for Windows.

    SHA256 checksums

    c35cc53d66d74ebfc86e39441ba26276541ac7892bf91dba1e70c83665a02767  libmdbx-amalgamated-0.9.2.tar.gz
    82523330f701939325ce96becace35ec739d30f8e98ec776c4d50bc8745297a8  libmdbx-amalgamated-0_9_2.zip
    a98382d85a06a551393a89152a50c53fd45abf6bf9f5e01e594bbd799c1352c7  v0.9.2.tar.gz
    099b31eef060bd41c35221ba2c805571d173b936075da9a97fcaf4801c8c2ecf  v0.9.2.zip
    
    Source code(tar.gz)
    Source code(zip)
    libmdbx-amalgamated-0.9.2.tar.gz(543.79 KB)
    libmdbx-amalgamated-0_9_2.zip(554.96 KB)
  • v0.9.1(Sep 30, 2020)

    Added features:

    • Preliminary C++ API with support for C++17 polymorphic allocators.
    • Online C++ API reference by Doxygen.
    • Quick reference for Insert/Update/Delete operations.
    • Explicit MDBX_SYNC_DURABLE to sync modes for API clarity.
    • Explicit MDBX_ALLDUPS and MDBX_UPSERT for API clarity.
    • Support for read transactions preparation (MDBX_TXN_RDONLY_PREPARE flag).
    • Support for cursor preparation/(pre)allocation and reusing (mdbx_cursor_create() and mdbx_cursor_bind() functions).
    • Support for checking database using specified meta-page (see mdbx_chk -h).
    • Support for turn to the specific meta-page after checking (see mdbx_chk -h).
    • Support for explicit reader threads (de)registration.
    • The mdbx_txn_break() function to explicitly mark a transaction as broken.
    • Improved handling of corrupted databases by mdbx_chk utility and mdbx_walk_tree() function.
    • Improved DB corruption detection by checking parent-page-txnid.
    • Improved opening large DB (> 4Gb) from 32-bit code.
    • Provided pure-function and const-function attributes to C API.
    • Support for user-settable context for transactions & cursors.
    • Revised API and documentation related to Handle-Slow-Readers callback feature.

    Deprecated functions and flags:

    • For clarity and API simplification the MDBX_MAPASYNC flag is deprecated. Just use MDBX_SAFE_NOSYNC or MDBX_UTTERLY_NOSYNC instead of it.
    • MDBX_oom_func, mdbx_env_set_oomfunc() and mdbx_env_get_oomfunc() replaced with MDBX_hsr_func, mdbx_env_get_hsr and mdbx_env_get_hsr().

    Fixes:

    • Fix mdbx_strerror() for MDBX_BUSY error (no error description is returned).
    • Fix update internal meta-geo information in read-only mode (EACCESS or EBADFD error).
    • Fix mdbx_page_get() null-defer when DB corrupted (crash by SIGSEGV).
    • Fix mdbx_env_open() for re-opening after non-fatal errors (mdbx_chk unexpected failures).
    • Workaround for MSVC 19.27 static_assert() bug.
    • Doxygen descriptions and refinement.
    • Update Valgrind's suppressions.
    • Workaround to avoid infinite loop of 'nested' testcase on MIPS under QEMU.
    • Fix a lot of typos & spelling (Thanks to Josh Soref for PR).
    • Fix getopt() messages for Windows (Thanks to Andrey Sporaw for reporting).
    • Fix MSVC compiler version requirements (Thanks to Andrey Sporaw for reporting).
    • Workarounds for QEMU's bugs to run tests for cross-builded library under QEMU.
    • Now C++ compiler optional for building by CMake.

    TODO for next version(s):

    • Rework/speedup the implementation of the dirty page list (lazy compactification, lazy sorting via merge).
    • Finalize C++ API (few typos and trivia bugs are likely for now).
    • Packages for ROSA Linux, ALT Linux, Fedora/RHEL, Debian/Ubuntu.

    SHA256 checksums

    c7fb24381eb4d92f2e2edc17e577cb721269683c816c6cca307c58f6f346e786  libmdbx-amalgamated-0.9.1.tar.gz
    1938a445a1e1375e1f142f10531a2e31a0525298a39d8d067cd9e145521d97b5  libmdbx-amalgamated-0_9_1.zip
    ef34f267f17720b79f8471b63ef3c4d94e110d22ad123ce0b691c1c7cfb077cc  v0.9.1.tar.gz
    7829738d1e76dc7873e8a3bb11a05f6b999ecae6102ecd03cc9010eee2bd7c4e  v0.9.1.zip
    
    Source code(tar.gz)
    Source code(zip)
    libmdbx-amalgamated-0.9.1.tar.gz(535.51 KB)
    libmdbx-amalgamated-0_9_1.zip(546.76 KB)
  • v0.8.2(Jul 6, 2020)

    • Added support multi-opening the same DB in a process with SysV locking (BSD).
    • Fixed warnings & minors for LCC compiler (E2K).
    • Enabled to simultaneously open the same database from processes with and without the MDBX_WRITEMAP option.
    • Added key-to-value, mdbx_get_keycmp() and mdbx_get_datacmp() functions (helpful to avoid using custom comparators).
    • Added ENABLE_UBSAN CMake option to enabling the UndefinedBehaviorSanitizer from GCC/CLANG.
    • Workaround for CLANG bug https://bugs.llvm.org/show_bug.cgi?id=43275.
    • Returning MDBX_CORRUPTED in case all meta-pages are weak and no other error.
    • Refined mode bits while auto-creating LCK-file.
    • Avoids unnecessary database file re-mapping in case geometry changed by another process(es). From the user's point of view, the MDBX_UNABLE_EXTEND_MAPSIZE error will now be returned less frequently and only when using the DB in the current process really requires it to be reopened.
    • Remapping on-the-fly and of the database file was implemented. Now remapping with a change of address is performed automatically if there are no dependent readers in the current process.
    Source code(tar.gz)
    Source code(zip)
    amalgamated.tar.gz(453.59 KB)
    amalgamated.zip(464.08 KB)
  • v0.8.1(Jun 13, 2020)

    • Minor change versioning. The last number in version now mean the number of commits since last release/tag.
    • Provide ChangeLog file.
    • Fix for using libmdbx as C-only sub-project with CMake.
    • Fix mdbx_env_set_geometry() for case it called from opened environment outside of write transaction.
    • Add support for huge transactions and MDBX_HUGE_TRANSACTIONS build-option (default OFF).
    • Refine LTO (link time optimization) for clang.
    • Force enabling exceptions handling for MSVC (/EHsc option).
    Source code(tar.gz)
    Source code(zip)
    amalgamated.tar.gz(449.28 KB)
    amalgamated.zip(459.83 KB)
  • v0.8.0(Jun 5, 2020)

    • Support for Android/Bionic.
    • Support for iOS.
    • Auto-handling MDBX_NOSUBDIR while opening for any exists database.
    • Engage github-actions to make release-assets.
    • Clarify API description.
    • Extended keygen-cases in stochastic test.
    • Fix fetching of first/lower key from LEAF2-page during page merge.
    • Fix missing comma in array of error messages.
    • Fix div-by-zero while copy-with-compaction for non-resizeable environment.
    • Fixes & enhancements for custom-comparators.
    • Fix MDBX_AVOID_CRT option and missing ntdll.def.
    • Fix mdbx_env_close() to work correctly called concurrently from several threads.
    • Fix null-deref in an ASAN-enabled builds while opening environment with error and/or read-only.
    • Fix AddressSanitizer errors after closing environment.
    • Fix/workaround to avoid GCC 10.x pedantic warnings.
    • Fix using ENODATA for FreeBSD.
    • Avoid invalidation of DBI-handle(s) when it just closing.
    • Avoid using pwritev() for single-writes (up to 10% speedup for some kernels & scenarios).
    • Avoiding MDBX_UTTERLY_NOSYNC as result of flags merge.
    • Add mdbx_dbi_dupsort_depthmask() function.
    • Add MDBX_CP_FORCE_RESIZEABLE option.
    • Add deprecated MDBX_MAP_RESIZED for compatibility.
    • Add MDBX_BUILD_TOOLS option.
    • Refine mdbx_dbi_open_ex() to safe concurrently opening the same handle from difference threads.
    • Truncate clk-file during environment closing. So zero-length lck file indicates that environment was closed properly.
    • Refine support for huge transactions with small sizes of database page.
    • Extends dump/load to support all MDBX attributes.
    • Avoid upsertion the same key-value data, fix related assertions.
    • Rework min/max length checking for keys & values.
    • Checking the order of keys on all pages during checking.
    • Support CFLAGS_EXTRA make-option for convenience.
    • Preserve last txnid while copy with compactification.
    • Auto-reset running transaction in mdbx_txn_renew().
    • Automatically abort errored transaction in mdbx_txn_commit().
    • Auto-choose pagesize for a large databases.
    • Rearrange source files, rework build, options-support by CMake.
    • Crutch for WSL1 (Windows subsystem for Linux).
    • Refine install/uninstall targets.
    • Refine LTO (link time optimization) for clang.
    • Support for Valgrind 3.14 and later.
    • Add check-analyzer check-ubsan check-asan check-leak targets to Makefile.
    • Minor fix/workaround to avoid UBSAN traps for memcpy(ptr, NULL, 0).
    • Avoid some GCC-analyzer false-positive warnings.
    Source code(tar.gz)
    Source code(zip)
    amalgamated.tar.gz(446.03 KB)
    amalgamated.zip(456.16 KB)
  • v0.7.0(Mar 18, 2020)

    • Workarounds for Wine (Windows compatibility layer for Linux).
    • MDBX_MAP_RESIZED renamed to MDBX_UNABLE_EXTEND_MAPSIZE.
    • Clarify API description, fix typos.
    • Speedup runtime checks in debug/checked builds.
    • Added checking for read/write transactions overlapping for the same thread, added MDBX_TXN_OVERLAPPING error and MDBX_DBG_LEGACY_OVERLAP option.
    • Added mdbx_key_from_jsonInteger(), mdbx_key_from_double(), mdbx_key_from_float(), mdbx_key_from_int64() and mdbx_key_from_int32() functions. See mdbx.h for description.
    • Fix compatibility (use zero for invalid DBI).
    • Refine/clarify error messages.
    • Avoids extra error messages "bad txn" from mdbx_chk when DB is corrupted.
    Source code(tar.gz)
    Source code(zip)
  • v0.6.0(Jun 12, 2020)

    • Fix mdbx_load utility for custom comparators.
    • Fix checks related to MDBX_APPEND flag inside mdbx_cursor_put().
    • Refine/fix dbi_bind() internals.
    • Refine/fix handling STATUS_CONFLICTING_ADDRESSES.
    • Rework MDBX_DBG_DUMP option to avoid disk I/O performance degradation.
    • Add built-in help to test tool.
    • Fix mdbx_env_set_geometry() for large page size.
    • Fix env_set_geometry() for large pagesize.
    • Clarify API description & comments, fix typos.
    Source code(tar.gz)
    Source code(zip)
  • v0.5.0(Jun 12, 2020)

    • Fix returning MDBX_RESULT_TRUE from page_alloc().
    • Fix false-positive ASAN issue.
    • Fix assertion for MDBX_NOTLS option.
    • Rework MADV_DONTNEED threshold.
    • Fix mdbx_chk utility for don't checking some numbers if walking of B-tree was disabled.
    • Use page's mp_txnid for basic integrity checking.
    • Add MDBX_FORCE_ASSERTIONS built-time option.
    • Rework MDBX_DBG_DUMP to avoid performance degradation.
    • Rename MDBX_NOSYNC to MDBX_SAFE_NOSYNC for clarity.
    • Interpret ERROR_ACCESS_DENIED from OpenProcess() as 'process exists'.
    • Avoid using FILE_FLAG_NO_BUFFERING for compatibility with small database pages.
    • Added install section for CMake.
    Source code(tar.gz)
    Source code(zip)
  • v0.4.0(Dec 7, 2019)

    1. Support for Mac OSX, FreeBSD, NetBSD, OpenBSD, DragonFly BSD, OpenSolaris, OpenIndiana (AIX and HP-UX pending).
    2. Use bootid for decisions of rollback.
    3. Counting retired pages and extended transaction info.
    4. MDBX_ACCEDE flag for database opening.
    5. Using OFD-locks and tracking for in-process multi-opening.
    6. Hot backup into pipe.
    7. cmake & amalgamated sources.
    8. Fastest internal sort implementation.
    9. New internal dirty-list implementation with lazy sorting.
    10. Support for lazy-sync-to-disk with polling.
    11. Extended key length.
    12. Last update transaction number for each sub-database.
    13. Automatic read ahead enabling/disabling.
    14. More auto-compactification.
    15. -fsanitize=undefined and -Wpedantic.
    16. Rework page merging.
    17. Nested transactions.
    18. API description.
    19. Checking for non-local filesystems to avoid DB corruption.
    Source code(tar.gz)
    Source code(zip)
  • v0.2.0(Sep 25, 2018)

    New features and Compatibility breaking:

    1. Compatible with v0.1.x (stable/1.0 branch).
    2. Identical database format for 32- and 64-bit builds.
    3. Dynamically DB file size (growth/shrink) and custom page size via mdbx_env_set_geometry().
    4. Support for Elbrus architecture.
    5. Support for Windows XP and later (building by MSVC 2013 and later, but not by MinGW).
    6. Support for MDBX_EXCLUSIVE mode, include network shares.
    7. Support for large write transactions.
    8. Extending mdbx_chk to verifing a inplaced sub-pages and accounting/statistics.
    9. Incompatible with v0.0.x (stable/0.0 branch) and with original/obsolete LMDB.

    Fixes since v0.1.x releases (stable/1.0 branch):

    • major: fix corruption due LMDB-inherited rebalance bugs.
    • major: fix accounting for sorted-duplicates tables.
    • major: fix internal (LMDB-inherited and broken) audit.

    Fixes since 0.1.5 2018-06-14:

    • fix LMDB-inherited empty and unneeded large/overflow pages.
    • fix LMDB-inherited cursor tracking bugs.
    • fix MDBX_CORRUPTED due concurrent open/shrink collision.
    • fix concurrent opening with custom pagesize.
    • fix MDBX_EKEYMISMATCH while update multi-value with MDBX_CURRENT.
    • linux: fix fallback2shared for mdbx_lck_exclusive().
    • windows: fix truncation race while unmap().
    • windows: fix nasty suspend_and_append() bug.
    • tools: fix wrong 'bad sequence' messages from mdbx_stat.
    • minor: doc fixes (ITS#8908 and ITS#8857).

    Fixes since 0.1.4 2018-05-04:

    • MAJOR: force steady-sync when shrinking DB.
    • windows: disable non-blocking DB-close.
    • minor: skip meta if usedbytes beyond EOF.
    • minor: return MDBX_CORRUPTED instead of crash if MDBX_DUPSORT mismatch.

    Fixes since 0.1.3 2018-04-03:

    • MAJOR: fix wrong freeDB search.
    • windows: fix lck_reader_alive_check().

    Fixes since 0.1.2 2018-03-22:

    • MAJOR: fix/rework rthc to avoid GNU libc ntpl bug.
    • minor: fix cursor tracking inside mdbx_rebalance().
    • minor: fix mdbx_cursor_put(MDBX_APPEND+MDBX_NOOVERWRITE) return MDBX_KEYEXIST instead of MDBX_EKEYMISMATCH.

    Fixes since 0.1.1 2018-03-14:

    • minor: fix/rework cache-line alignment.
    • minor: fix unaligned access to mp_ptrs[] on fake-page.
    • minor: lookup suitable txnid for rollback to avoid meta-pages clashes.
    • tool: rework/fix read-write mode inside mdbx_chk.
    • minor: fix minor memleak (Coverity).
    • minor: add workaround for Elbrus's libc bug.

    Fixes since 0.1.0 2018-03-07:

    • minor: fix missing MDBX_DEVEL=1.
    Source code(tar.gz)
    Source code(zip)
  • v0.1.6(Sep 25, 2018)

    New features and Compatibility breaking since stable/0.0:

    1. Incompatible with v0.0.x (stable/0.0 branch) and with original/obsolete LMDB.
    2. Identical database format for 32- and 64-bit builds.
    3. Dynamically DB file size (growth/shrink) and mdbx_env_set_geometry().
    4. Support for Elbrus architecture.
    5. Support for Windows (2008 and later, MSVC 2013 and later).

    Fixes since 0.1.5 2018-06-14:

    • fix LMDB-inherited empty and unneeded large/overflow pages.
    • fix LMDB-inherited cursor tracking bugs.
    • fix MDBX_CORRUPTED due concurrent open/shrink collision.
    • fix concurrent opening with custom pagesize.
    • fix MDBX_EKEYMISMATCH while update multi-value with MDBX_CURRENT.
    • linux: fix fallback2shared for mdbx_lck_exclusive().
    • windows: fix truncation race while unmap().
    • windows: fix nasty suspend_and_append() bug.
    • tools: fix wrong 'bad sequence' messages from mdbx_stat.
    • minor: doc fixes (ITS#8908 and ITS#8857).

    Fixes since 0.1.4 2018-05-04:

    • MAJOR: force steady-sync when shrinking DB.
    • windows: disable non-blocking DB-close.
    • minor: skip meta if usedbytes beyond EOF.
    • minor: return MDBX_CORRUPTED instead of crash if MDBX_DUPSORT mismatch.

    Fixes since 0.1.3 2018-04-03:

    • MAJOR: fix wrong freeDB search.
    • windows: fix lck_reader_alive_check().

    Fixes since 0.1.2 2018-03-22:

    • MAJOR: fix/rework rthc to avoid GNU libc ntpl bug.
    • minor: fix cursor tracking inside mdbx_rebalance().
    • minor: fix mdbx_cursor_put(MDBX_APPEND+MDBX_NOOVERWRITE) return MDBX_KEYEXIST instead of MDBX_EKEYMISMATCH.

    Fixes since 0.1.1 2018-03-14:

    • minor: fix/rework cache-line alignment.
    • minor: fix unaligned access to mp_ptrs[] on fake-page.
    • minor: lookup suitable txnid for rollback to avoid meta-pages clashes.
    • tool: rework/fix read-write mode inside mdbx_chk.
    • minor: fix minor memleak (Coverity).
    • minor: add workaround for Elbrus's libc bug.

    Fixes since 0.1.0 2018-03-07:

    • minor: fix missing MDBX_DEVEL=1.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.4(Sep 25, 2018)

    Release of the stable/0.0 branch, which contains legacy code that compatible to original LMDB API.

    Corresponds to LMDB v0.9.22, but NOT includes all fixes from libmdbx mainstream, for instance this fix for cursor state after a deletion.

    Changes since 0.0.2 2018-07-15:

    • prevent DB corruption due LMDB-inherited rebalance bug (fixed in the master branch and 0.2.x).
    • minor doc fixes (ITS#8908 and ITS#8857).

    Changes since 0.0.2 2018-05-04:

    • add fallthrough for modern GCC and CLang.
    • add include <sys/sysmacros.h> for modern GNU libc.
    • migrate to Circle-CI 2.0
    • update Project Status in the README.

    Fixes since 0.0.1 2017-08-12 (corresponds to LMDB v0.9.21):

    Fixes since 0.0.0 2017-07-04:

    • more for cursor_del() (ITS#8699, ITS#8622).
    • fix extra madvise(MADV_REMOVE).
    • fix mdbx_set_attr().
    Source code(tar.gz)
    Source code(zip)
  • v0.0.3(Aug 9, 2018)

    Release of the stable/0.0 branch, which contains legacy code that compatible to original LMDB API.

    Corresponds to LMDB v0.9.22, but NOT includes all fixes from libmdbx mainstream, for instance this fix for cursor state after a deletion.

    Changes since 0.0.2 2018-05-04:

    • add fallthrough for modern GCC and CLang.
    • add include <sys/sysmacros.h> for modern GNU libc.
    • migrate to Circle-CI 2.0
    • update Project Status in the README.

    Fixes since 0.0.1 2017-08-12 (corresponds to LMDB v0.9.21):

    Fixes since 0.0.0 2017-07-04:

    • more for cursor_del() (ITS#8699, ITS#8622).
    • fix extra madvise(MADV_REMOVE).
    • fix mdbx_set_attr().
    Source code(tar.gz)
    Source code(zip)
  • v0.1.5(Aug 9, 2018)

    New features and Compatibility breaking since stable0.0:

    1. Incompatible with v0.0.x (stable/0.0 branch) and with original/obsolete LMDB.
    2. Identical database format for 32- and 64-bit builds.
    3. Dynamically DB file size (growth/shrink) and mdbx_env_set_geometry().
    4. Support for Elbrus architecture.
    5. Support for Windows (2008 and later, MSVC 2013 and later).

    Fixes since 0.1.4 2018-05-04:

    • MAJOR: force steady-sync when shrinking DB.
    • windows: disable non-blocking DB-close.
    • minor: skip meta if usedbytes beyond EOF.
    • minor: return MDBX_CORRUPTED instead of crash if MDBX_DUPSORT mismatch.

    Fixes since 0.1.3 2018-04-03:

    • MAJOR: fix wrong freeDB search.
    • windows: fix lck_reader_alive_check().

    Fixes since 0.1.2 2018-03-22:

    • MAJOR: fix/rework rthc to avoid GNU libc ntpl bug.
    • minor: fix cursor tracking inside mdbx_rebalance().
    • minor: fix mdbx_cursor_put(MDBX_APPEND+MDBX_NOOVERWRITE) return MDBX_KEYEXIST instead of MDBX_EKEYMISMATCH.

    Fixes since 0.1.1 2018-03-14:

    • minor: fix/rework cache-line alignment.
    • minor: fix unaligned access to mp_ptrs[] on fake-page.
    • minor: lookup suitable txnid for rollback to avoid meta-pages clashes.
    • tool: rework/fix read-write mode inside mdbx_chk.
    • minor: fix minor memleak (Coverity).
    • minor: add workaround for Elbrus's libc bug.

    Fixes since 0.1.0 2018-03-07:

    • minor: fix missing MDBX_DEVEL=1.
    Source code(tar.gz)
    Source code(zip)
  • v0.1.4(Aug 9, 2018)

    New features and Compatibility breaking since stable0.0:

    1. Incompatible with v0.0.x (stable/0.0 branch) and with original/obsolete LMDB.
    2. Identical database format for 32- and 64-bit builds.
    3. Dynamically DB file size (growth/shrink) and mdbx_env_set_geometry().
    4. Support for Elbrus architecture.
    5. Support for Windows (2008 and later, MSVC 2013 and later).

    Fixes since 0.1.3 2018-04-03:

    • MAJOR: fix wrong freeDB search.
    • windows: fix lck_reader_alive_check().

    Fixes since 0.1.2 2018-03-22:

    • MAJOR: fix/rework rthc to avoid GNU libc ntpl bug.
    • minor: fix cursor tracking inside mdbx_rebalance().
    • minor: fix mdbx_cursor_put(MDBX_APPEND+MDBX_NOOVERWRITE) return MDBX_KEYEXIST instead of MDBX_EKEYMISMATCH.

    Fixes since 0.1.1 2018-03-14:

    • minor: fix/rework cache-line alignment.
    • minor: fix unaligned access to mp_ptrs[] on fake-page.
    • minor: lookup suitable txnid for rollback to avoid meta-pages clashes.
    • tool: rework/fix read-write mode inside mdbx_chk.
    • minor: fix minor memleak (Coverity).
    • minor: add workaround for Elbrus's libc bug.

    Fixes since 0.1.0 2018-03-07:

    • minor: fix missing MDBX_DEVEL=1.
    Source code(tar.gz)
    Source code(zip)
  • v0.0.2(Aug 9, 2018)

    Release of the stable/0.0 branch, which contains legacy code that compatible to original LMDB API.

    Corresponds to LMDB v0.9.22, but NOT includes all fixes from libmdbx mainstream, for instance this fix for cursor state after a deletion.

    Fixes since 0.0.1 2017-08-12 (corresponds to LMDB v0.9.21):

    Fixes since 0.0.0 2017-07-04:

    • more for cursor_del() (ITS#8699, ITS#8622).
    • fix extra madvise(MADV_REMOVE).
    • fix mdbx_set_attr().
    Source code(tar.gz)
    Source code(zip)
  • v0.1.3(Aug 9, 2018)

    New features and Compatibility breaking since stable0.0:

    1. Incompatible with v0.0.x (stable/0.0 branch) and with original/obsolete LMDB.
    2. Identical database format for 32- and 64-bit builds.
    3. Dynamically DB file size (growth/shrink) and mdbx_env_set_geometry().
    4. Support for Elbrus architecture.
    5. Support for Windows (2008 and later, MSVC 2013 and later).

    Fixes since 0.1.2 2018-03-22:

    • MAJOR: fix/rework rthc to avoid GNU libc ntpl bug.
    • minor: fix cursor tracking inside mdbx_rebalance().
    • minor: fix mdbx_cursor_put(MDBX_APPEND+MDBX_NOOVERWRITE) return MDBX_KEYEXIST instead of MDBX_EKEYMISMATCH.

    Fixes since 0.1.1 2018-03-14:

    • minor: fix/rework cache-line alignment.
    • minor: fix unaligned access to mp_ptrs[] on fake-page.
    • minor: lookup suitable txnid for rollback to avoid meta-pages clashes.
    • tool: rework/fix read-write mode inside mdbx_chk.
    • minor: fix minor memleak (Coverity).
    • minor: add workaround for Elbrus's libc bug.

    Fixes since 0.1.0 2018-03-07:

    • minor: fix missing MDBX_DEVEL=1.
    Source code(tar.gz)
    Source code(zip)
Owner
Леонид Юрьев (Leonid Yuriev)
Please don't use my work, if you are associated with Adolf Hitler, Stepan Bandera, George Soros, Michael Hodorkovsky, either support an actions of these felons.
Леонид Юрьев (Leonid Yuriev)
MySQL Server, the world's most popular open source database, and MySQL Cluster, a real-time, open source transactional database.

Copyright (c) 2000, 2021, Oracle and/or its affiliates. This is a release of MySQL, an SQL database server. License information can be found in the

MySQL 8.1k Aug 6, 2022
An Embedded NoSQL, Transactional Database Engine

UnQLite - Transactional Embedded Database Engine

PixLab | Symisc Systems 1.7k Aug 5, 2022
LevelDB is a fast key-value storage library written at Google that provides an ordered mapping from string keys to string values.

LevelDB is a fast key-value storage library written at Google that provides an ordered mapping from string keys to string values. Authors: Sanjay Ghem

Google 30.1k Aug 6, 2022
Simple constant key/value storage library, for read-heavy systems with infrequent large bulk inserts.

Sparkey is a simple constant key/value storage library. It is mostly suited for read heavy systems with infrequent large bulk inserts. It includes bot

Spotify 967 Jul 16, 2022
Kreon is a key-value store library optimized for flash-based storage

Kreon is a key-value store library optimized for flash-based storage, where CPU overhead and I/O amplification are more significant bottlenecks compared to I/O randomness.

Computer Architecture and VLSI Systems (CARV) Laboratory 24 Jul 14, 2022
BerylDB is a data structure data manager that can be used to store data as key-value entries.

BerylDB is a data structure data manager that can be used to store data as key-value entries. The server allows channel subscription and is optimized to be used as a cache repository. Supported structures include lists, sets, and keys.

BerylDB 194 Jul 27, 2022
A very fast lightweight embedded database engine with a built-in query language.

upscaledb 2.2.1 Fr 10. Mär 21:33:03 CET 2017 (C) Christoph Rupp, [email protected]; http://www.upscaledb.com This is t

Christoph Rupp 534 Jul 22, 2022
A mini database for learning database

A mini database for learning database

Chuckie Tan 4 Jul 21, 2022
ESE is an embedded / ISAM-based database engine, that provides rudimentary table and indexed access.

Extensible-Storage-Engine A Non-SQL Database Engine The Extensible Storage Engine (ESE) is one of those rare codebases having proven to have a more th

Microsoft 782 Jul 29, 2022
C++11 wrapper for the LMDB embedded B+ tree database library.

lmdb++: a C++11 wrapper for LMDB This is a comprehensive C++ wrapper for the LMDB embedded database library, offering both an error-checked procedural

D.R.Y. C++ 258 Jul 14, 2022
C++ embedded memory database

ShadowDB 一个C++嵌入式内存数据库 语法极简风 支持自定义索引、复合条件查询('<','<=','==','>=','>','!=',&&,||) 能够快速fork出一份数据副本 // ShadowDB简单示例 // ShadowDB是一个可以创建索引、能够快速fork出一份数据分支的C+

null 9 Jul 15, 2022
Nebula Graph is a distributed, fast open-source graph database featuring horizontal scalability and high availability

Nebula Graph is an open-source graph database capable of hosting super large scale graphs with dozens of billions of vertices (nodes) and trillions of edges, with milliseconds of latency.

vesoft inc. 817 Aug 4, 2022
GridDB is a next-generation open source database that makes time series IoT and big data fast,and easy.

Overview GridDB is Database for IoT with both NoSQL interface and SQL Interface. Please refer to GridDB Features Reference for functionality. This rep

GridDB 1.8k Jul 28, 2022
SiriDB is a highly-scalable, robust and super fast time series database

SiriDB is a highly-scalable, robust and super fast time series database. Build from the ground up SiriDB uses a unique mechanism to operate without a global index and allows server resources to be added on the fly. SiriDB's unique query language includes dynamic grouping of time series for easy analysis over large amounts of time series.

SiriDB 464 Jun 13, 2022
ObjectBox C and C++: super-fast database for objects and structs

ObjectBox Embedded Database for C and C++ ObjectBox is a superfast C and C++ database for embedded devices (mobile and IoT), desktop and server apps.

ObjectBox 137 Aug 7, 2022
DuckDB is an in-process SQL OLAP Database Management System

DuckDB is an in-process SQL OLAP Database Management System

DuckDB 5.7k Aug 7, 2022
YugabyteDB is a high-performance, cloud-native distributed SQL database that aims to support all PostgreSQL features

YugabyteDB is a high-performance, cloud-native distributed SQL database that aims to support all PostgreSQL features. It is best to fit for cloud-native OLTP (i.e. real-time, business-critical) applications that need absolute data correctness and require at least one of the following: scalability, high tolerance to failures, or globally-distributed deployments.

yugabyte 6.7k Aug 2, 2022
TimescaleDB is an open-source database designed to make SQL scalable for time-series data.

An open-source time-series SQL database optimized for fast ingest and complex queries. Packaged as a PostgreSQL extension.

Timescale 13.4k Aug 7, 2022
Beryl-cli is a client for the BerylDB database server

Beryl-cli is a client for the BerylDB database server. It offers multiple commands and is designed to be fast and user-friendly.

BerylDB 11 Apr 21, 2022