42#if (UINTPTR_MAX == 0xffffffff)
44static const size_t LMDB_DB_SIZE = 2147483648;
45#elif (UINTPTR_MAX == 0xffffffffffffffff)
47static const size_t LMDB_DB_SIZE = 107374182400;
86 rc = mdb_txn_renew(ctx->
txn);
88 rc = mdb_txn_begin(ctx->
env, NULL, MDB_RDONLY, &ctx->
txn);
90 if (rc == MDB_SUCCESS)
97 ctx->
txn ?
"mdb_txn_renew" :
"mdb_txn_begin", mdb_strerror(rc));
118 mdb_txn_abort(ctx->
txn);
121 rc = mdb_txn_begin(ctx->
env, NULL, 0, &ctx->
txn);
122 if (rc == MDB_SUCCESS)
142 rc = mdb_env_create(&ctx->
env);
143 if (rc != MDB_SUCCESS)
150 mdb_env_set_mapsize(ctx->
env, LMDB_DB_SIZE);
152 rc = mdb_env_open(ctx->
env, path, MDB_NOSUBDIR, 0644);
153 if (rc != MDB_SUCCESS)
160 if (rc != MDB_SUCCESS)
166 rc = mdb_dbi_open(ctx->
txn, NULL, MDB_CREATE, &ctx->
db);
167 if (rc != MDB_SUCCESS)
173 mdb_txn_reset(ctx->
txn);
178 mdb_txn_abort(ctx->
txn);
183 mdb_env_close(ctx->
env);
201 dkey.mv_data = (
void *) key;
206 if (rc != MDB_SUCCESS)
212 rc = mdb_get(ctx->
txn, ctx->
db, &dkey, &data);
213 if (rc == MDB_NOTFOUND)
217 if (rc != MDB_SUCCESS)
223 *vlen = data.mv_size;
238static int store_lmdb_store(
void *store,
const char *key,
size_t klen,
void *value,
size_t vlen)
248 dkey.mv_data = (
void *) key;
250 databuf.mv_data = value;
251 databuf.mv_size = vlen;
253 if (rc != MDB_SUCCESS)
258 rc = mdb_put(ctx->
txn, ctx->
db, &dkey, &databuf, 0);
259 if (rc != MDB_SUCCESS)
262 mdb_txn_abort(ctx->
txn);
281 dkey.mv_data = (
void *) key;
284 if (rc != MDB_SUCCESS)
289 rc = mdb_del(ctx->
txn, ctx->
db, &dkey, NULL);
290 if ((rc != MDB_SUCCESS) && (rc != MDB_NOTFOUND))
293 mdb_txn_abort(ctx->
txn);
314 mdb_txn_commit(
db->txn);
316 mdb_txn_abort(
db->txn);
322 mdb_env_close(
db->env);
331 return "lmdb " MDB_VERSION_STRING;
#define mutt_debug(LEVEL,...)
static void store_lmdb_close(void **ptr)
Implements StoreOps::close() -.
static int store_lmdb_delete_record(void *store, const char *key, size_t klen)
Implements StoreOps::delete_record() -.
static void * store_lmdb_fetch(void *store, const char *key, size_t klen, size_t *vlen)
Implements StoreOps::fetch() -.
static void store_lmdb_free(void *store, void **ptr)
Implements StoreOps::free() -.
static void * store_lmdb_open(const char *path)
Implements StoreOps::open() -.
static int store_lmdb_store(void *store, const char *key, size_t klen, void *value, size_t vlen)
Implements StoreOps::store() -.
static const char * store_lmdb_version(void)
Implements StoreOps::version() -.
static int mdb_get_w_txn(struct StoreLmdbCtx *ctx)
Get an LMDB write transaction.
static int mdb_get_r_txn(struct StoreLmdbCtx *ctx)
Get an LMDB read transaction.
MdbTxnMode
The maximum size of the database file (2GiB).
@ TXN_READ
Read transaction in progress.
@ TXN_WRITE
Write transaction in progress.
@ TXN_UNINITIALIZED
Transaction is uninitialised.
@ LL_DEBUG2
Log at debug level 2.
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
Convenience wrapper for the library headers.
#define STORE_BACKEND_OPS(_name)