26#ifdef LMDB_INCLUDE_FILE
27#include LMDB_INCLUDE_FILE
37#define LMDB_IT(it) (((struct php_lmdb_info *)info->dbf)->it)
44 int mode = info->file_permission;
50 int flags = MDB_NOSUBDIR;
52 if (info->driver_flags != DBA_DEFAULT_DRIVER_FLAGS) {
54 switch (info->driver_flags) {
57 flags = info->driver_flags;
66 if (info->mode == DBA_READER) {
70 rc = mdb_env_create(&env);
72 *
error = mdb_strerror(rc);
77 rc = mdb_env_set_mapsize(env, (
size_t) map_size);
79 *
error = mdb_strerror(rc);
89 *
error = mdb_strerror(rc);
93 rc = mdb_txn_begin(env,
NULL, MDB_RDONLY, &txn);
96 *
error = mdb_strerror(rc);
100 info->dbf =
pemalloc(
sizeof(
struct php_lmdb_info), info->flags & DBA_PERSISTENT);
102 *
error =
"Failed to allocate php_lmdb_info.";
105 memset(info->dbf, 0,
sizeof(
struct php_lmdb_info));
107 rc = mdb_dbi_open(txn,
NULL, 0, &LMDB_IT(dbi));
110 pefree(info->dbf, info->flags & DBA_PERSISTENT);
111 *
error = mdb_strerror(rc);
118 mdb_txn_abort(LMDB_IT(txn));
125 mdb_dbi_close(LMDB_IT(env), LMDB_IT(dbi));
126 mdb_env_close(LMDB_IT(env));
128 pefree(info->dbf, info->flags & DBA_PERSISTENT);
138 rc = mdb_txn_renew(LMDB_IT(txn));
140 rc = mdb_txn_begin(LMDB_IT(env),
NULL, MDB_RDONLY, &LMDB_IT(txn));
150 rc = mdb_get(LMDB_IT(txn), LMDB_IT(dbi), &k, &
v);
152 if (MDB_NOTFOUND != rc) {
155 mdb_txn_abort(LMDB_IT(txn));
160 ret = zend_string_init(
v.mv_data,
v.mv_size,
false);
164 mdb_txn_reset(LMDB_IT(txn));
166 mdb_txn_abort(LMDB_IT(txn));
177 rc = mdb_txn_begin(LMDB_IT(env),
NULL, 0, &LMDB_IT(txn));
188 rc = mdb_put(LMDB_IT(txn), LMDB_IT(dbi), &k, &
v,
mode == 1 ? MDB_NOOVERWRITE : 0);
190 if (MDB_KEYEXIST != rc) {
193 mdb_txn_abort(LMDB_IT(txn));
197 rc = mdb_txn_commit(LMDB_IT(txn));
200 mdb_txn_abort(LMDB_IT(txn));
213 rc = mdb_txn_renew(LMDB_IT(txn));
215 rc = mdb_txn_begin(LMDB_IT(env),
NULL, MDB_RDONLY, &LMDB_IT(txn));
225 rc = mdb_get(LMDB_IT(txn), LMDB_IT(dbi), &k, &
v);
227 if (MDB_NOTFOUND != rc) {
230 mdb_txn_abort(LMDB_IT(txn));
235 mdb_txn_reset(LMDB_IT(txn));
237 mdb_txn_abort(LMDB_IT(txn));
248 rc = mdb_txn_begin(LMDB_IT(env),
NULL, 0, &LMDB_IT(txn));
257 rc = mdb_del(LMDB_IT(txn), LMDB_IT(dbi), &k,
NULL);
259 rc = mdb_txn_commit(LMDB_IT(txn));
262 mdb_txn_abort(LMDB_IT(txn));
270 mdb_txn_abort(LMDB_IT(txn));
274DBA_FIRSTKEY_FUNC(lmdb)
280 rc = mdb_txn_begin(LMDB_IT(env),
NULL, MDB_RDONLY, &LMDB_IT(txn));
286 rc = mdb_cursor_open(LMDB_IT(txn), LMDB_IT(dbi), &LMDB_IT(cur));
288 mdb_txn_abort(LMDB_IT(txn));
293 rc = mdb_cursor_get(LMDB_IT(cur), &k, &
v, MDB_FIRST);
295 mdb_txn_abort(LMDB_IT(txn));
296 mdb_cursor_close(LMDB_IT(cur));
298 if (MDB_NOTFOUND != rc) {
305 ret = zend_string_init(k.mv_data, k.mv_size,
false);
308 mdb_txn_reset(LMDB_IT(txn));
313DBA_NEXTKEY_FUNC(lmdb)
319 rc = mdb_txn_renew(LMDB_IT(txn));
325 rc = mdb_cursor_get(LMDB_IT(cur), &k, &
v, MDB_NEXT);
327 mdb_txn_abort(LMDB_IT(txn));
328 mdb_cursor_close(LMDB_IT(cur));
330 if (MDB_NOTFOUND != rc) {
337 ret = zend_string_init(k.mv_data, k.mv_size,
false);
340 mdb_txn_reset(LMDB_IT(txn));
345DBA_OPTIMIZE_FUNC(lmdb)
354 rc = mdb_env_sync(LMDB_IT(env), 1);
365 return estrdup(MDB_VERSION_STRING);
memset(ptr, 0, type->size)
PHPAPI ZEND_COLD void php_error_docref(const char *docref, int type, const char *format,...)
unsigned char key[REFLECTION_KEY_LEN]
ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *format,...)
#define pefree(ptr, persistent)
#define pemalloc(size, persistent)
struct _zend_string zend_string