Skip to content

Commit

Permalink
LMDB_0.9.18
Browse files Browse the repository at this point in the history
  • Loading branch information
krisskross committed Feb 9, 2016
1 parent dbc2fca commit 5acec4e
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 30 deletions.
18 changes: 12 additions & 6 deletions lmdbjni/src/main/native-package/src/lmdb.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@
* corrupt the database. Of course if your application code is known to
* be bug-free (...) then this is not an issue.
*
* If this is your first time using a transactional embedded key/value
* store, you may find the \ref starting page to be helpful.
*
* @section caveats_sec Caveats
* Troubleshooting the lock file, plus semaphores on BSD systems:
*
Expand Down Expand Up @@ -126,7 +129,7 @@
*
* @author Howard Chu, Symas Corporation.
*
* @copyright Copyright 2011-2015 Howard Chu, Symas Corp. All rights reserved.
* @copyright Copyright 2011-2016 Howard Chu, Symas Corp. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted only as authorized by the OpenLDAP
Expand Down Expand Up @@ -191,7 +194,7 @@ typedef int mdb_filehandle_t;
/** Library minor version */
#define MDB_VERSION_MINOR 9
/** Library patch version */
#define MDB_VERSION_PATCH 17
#define MDB_VERSION_PATCH 18

/** Combine args a,b,c into a single integer for easy version comparisons */
#define MDB_VERINT(a,b,c) (((a) << 24) | ((b) << 16) | (c))
Expand All @@ -201,7 +204,7 @@ typedef int mdb_filehandle_t;
MDB_VERINT(MDB_VERSION_MAJOR,MDB_VERSION_MINOR,MDB_VERSION_PATCH)

/** The release date of this library version */
#define MDB_VERSION_DATE "November 30, 2015"
#define MDB_VERSION_DATE "February 5, 2016"

/** A stringifier for the version info */
#define MDB_VERSTR(a,b,c,d) "LMDB " #a "." #b "." #c ": (" d ")"
Expand Down Expand Up @@ -526,9 +529,11 @@ int mdb_env_create(MDB_env **env);
* allowed. LMDB will still modify the lock file - except on read-only
* filesystems, where LMDB does not use locks.
* <li>#MDB_WRITEMAP
* Use a writeable memory map unless MDB_RDONLY is set. This is faster
* and uses fewer mallocs, but loses protection from application bugs
* Use a writeable memory map unless MDB_RDONLY is set. This uses
* fewer mallocs but loses protection from application bugs
* like wild pointer writes and other bad updates into the database.
* This may be slightly faster for DBs that fit entirely in RAM, but
* is slower for DBs larger than RAM.
* Incompatible with nested transactions.
* Do not mix processes with and without MDB_WRITEMAP on the same
* environment. This can defeat durability (#mdb_env_sync etc).
Expand Down Expand Up @@ -1455,7 +1460,8 @@ int mdb_cursor_get(MDB_cursor *cursor, MDB_val *key, MDB_val *data,
* the database supports duplicates (#MDB_DUPSORT).
* <li>#MDB_RESERVE - reserve space for data of the given size, but
* don't copy the given data. Instead, return a pointer to the
* reserved space, which the caller can fill in later. This saves
* reserved space, which the caller can fill in later - before
* the next update operation or the transaction ends. This saves
* an extra memcpy if the data is being generated later. This flag
* must not be specified if the database was opened with #MDB_DUPSORT.
* <li>#MDB_APPEND - append the given key/data pair to the end of the
Expand Down
75 changes: 51 additions & 24 deletions lmdbjni/src/main/native-package/src/mdb.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* BerkeleyDB API, but much simplified.
*/
/*
* Copyright 2011-2015 Howard Chu, Symas Corp.
* Copyright 2011-2016 Howard Chu, Symas Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
Expand Down Expand Up @@ -198,7 +198,7 @@ typedef SSIZE_T ssize_t;
#define ESECT
#endif

#ifdef _MSC_VER
#ifdef _WIN32
#define CALL_CONV WINAPI
#else
#define CALL_CONV
Expand Down Expand Up @@ -256,8 +256,8 @@ typedef SSIZE_T ssize_t;
# define MDB_USE_ROBUST 0
# else
# define MDB_USE_ROBUST 1
/* glibc < 2.10 only provided _np API */
# if defined(__GLIBC__) && GLIBC_VER < 0x02000a
/* glibc < 2.12 only provided _np API */
# if defined(__GLIBC__) && GLIBC_VER < 0x02000c
# define PTHREAD_MUTEX_ROBUST PTHREAD_MUTEX_ROBUST_NP
# define pthread_mutexattr_setrobust(attr, flag) pthread_mutexattr_setrobust_np(attr, flag)
# define pthread_mutex_consistent(mutex) pthread_mutex_consistent_np(mutex)
Expand Down Expand Up @@ -1271,7 +1271,7 @@ typedef struct MDB_ntxn {
#endif

/** max bytes to write in one call */
#define MAX_WRITE (0x80000000U >> (sizeof(ssize_t) == 4))
#define MAX_WRITE (0x40000000U >> (sizeof(ssize_t) == 4))

/** Check \b txn and \b dbi arguments to a function */
#define TXN_DBI_EXIST(txn, dbi, validity) \
Expand Down Expand Up @@ -4470,7 +4470,9 @@ mdb_env_setup_locks(MDB_env *env, char *lpath, int mode, int *excl)

#ifdef _WIN32
wchar_t *wlpath;
utf8_to_utf16(lpath, -1, &wlpath, NULL);
rc = utf8_to_utf16(lpath, -1, &wlpath, NULL);
if (rc)
return rc;
env->me_lfd = CreateFileW(wlpath, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
Expand Down Expand Up @@ -4758,7 +4760,9 @@ mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode
len = OPEN_ALWAYS;
}
mode = FILE_ATTRIBUTE_NORMAL;
utf8_to_utf16(dpath, -1, &wpath, NULL);
rc = utf8_to_utf16(dpath, -1, &wpath, NULL);
if (rc)
goto leave;
env->me_fd = CreateFileW(wpath, oflags, FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, len, mode, NULL);
free(wpath);
Expand Down Expand Up @@ -4790,7 +4794,9 @@ mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode
*/
#ifdef _WIN32
len = OPEN_EXISTING;
utf8_to_utf16(dpath, -1, &wpath, NULL);
rc = utf8_to_utf16(dpath, -1, &wpath, NULL);
if (rc)
goto leave;
env->me_mfd = CreateFileW(wpath, oflags,
FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, len,
mode | FILE_FLAG_WRITE_THROUGH, NULL);
Expand Down Expand Up @@ -5273,7 +5279,11 @@ mdb_page_search_root(MDB_cursor *mc, MDB_val *key, int flags)
indx_t i;

DPRINTF(("branch page %"Z"u has %u keys", mp->mp_pgno, NUMKEYS(mp)));
mdb_cassert(mc, NUMKEYS(mp) > 1);
/* Don't assert on branch pages in the FreeDB. We can get here
* while in the process of rebalancing a FreeDB branch page; we must
* let that proceed. ITS#8336
*/
mdb_cassert(mc, !mc->mc_dbi || NUMKEYS(mp) > 1);
DPRINTF(("found index 0 to page %"Z"u", NODEPGNO(NODEPTR(mp, 0))));

if (flags & (MDB_PS_FIRST|MDB_PS_LAST)) {
Expand Down Expand Up @@ -5658,8 +5668,10 @@ mdb_cursor_next(MDB_cursor *mc, MDB_val *key, MDB_val *data, MDB_cursor_op op)

DPRINTF(("cursor_next: top page is %"Z"u in cursor %p",
mdb_dbg_pgno(mp), (void *) mc));
if (mc->mc_flags & C_DEL)
if (mc->mc_flags & C_DEL) {
mc->mc_flags ^= C_DEL;
goto skip;
}

if (mc->mc_ki[mc->mc_top] + 1u >= NUMKEYS(mp)) {
DPUTS("=====> move to next sibling page");
Expand Down Expand Up @@ -5738,6 +5750,8 @@ mdb_cursor_prev(MDB_cursor *mc, MDB_val *key, MDB_val *data, MDB_cursor_op op)
DPRINTF(("cursor_prev: top page is %"Z"u in cursor %p",
mdb_dbg_pgno(mp), (void *) mc));

mc->mc_flags &= ~(C_EOF|C_DEL);

if (mc->mc_ki[mc->mc_top] == 0) {
DPUTS("=====> move to prev sibling page");
if ((rc = mdb_cursor_sibling(mc, 0)) != MDB_SUCCESS) {
Expand All @@ -5749,8 +5763,6 @@ mdb_cursor_prev(MDB_cursor *mc, MDB_val *key, MDB_val *data, MDB_cursor_op op)
} else
mc->mc_ki[mc->mc_top]--;

mc->mc_flags &= ~C_EOF;

DPRINTF(("==> cursor points to page %"Z"u with %u keys, key index %u",
mdb_dbg_pgno(mp), NUMKEYS(mp), mc->mc_ki[mc->mc_top]));

Expand Down Expand Up @@ -6481,7 +6493,7 @@ mdb_cursor_put(MDB_cursor *mc, MDB_val *key, MDB_val *data,
#endif
/* does data match? */
if (!dcmp(data, &olddata)) {
if (flags & MDB_NODUPDATA)
if (flags & (MDB_NODUPDATA|MDB_APPENDDUP))
return MDB_KEYEXIST;
/* overwrite it */
goto current;
Expand Down Expand Up @@ -9147,7 +9159,7 @@ mdb_env_copyfd0(MDB_env *env, HANDLE fd)
MDB_txn *txn = NULL;
mdb_mutexref_t wmutex = NULL;
int rc;
size_t wsize;
size_t wsize, w3;
char *ptr;
#ifdef _WIN32
DWORD len, w2;
Expand Down Expand Up @@ -9206,15 +9218,15 @@ mdb_env_copyfd0(MDB_env *env, HANDLE fd)
if (rc)
goto leave;

w2 = txn->mt_next_pgno * env->me_psize;
w3 = txn->mt_next_pgno * env->me_psize;
{
size_t fsize = 0;
if ((rc = mdb_fsize(env->me_fd, &fsize)))
goto leave;
if (w2 > fsize)
w2 = fsize;
if (w3 > fsize)
w3 = fsize;
}
wsize = w2 - wsize;
wsize = w3 - wsize;
while (wsize > 0) {
if (wsize > MAX_WRITE)
w2 = MAX_WRITE;
Expand Down Expand Up @@ -9281,7 +9293,9 @@ mdb_env_copy2(MDB_env *env, const char *path, unsigned int flags)
* already in the OS cache.
*/
#ifdef _WIN32
utf8_to_utf16(lpath, -1, &wpath, NULL);
rc = utf8_to_utf16(lpath, -1, &wpath, NULL);
if (rc)
goto leave;
newfd = CreateFileW(wpath, GENERIC_WRITE, 0, NULL, CREATE_NEW,
FILE_FLAG_NO_BUFFERING|FILE_FLAG_WRITE_THROUGH, NULL);
free(wpath);
Expand Down Expand Up @@ -9476,6 +9490,7 @@ int mdb_dbi_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *db
MDB_db dummy;
int rc, dbflag, exact;
unsigned int unused = 0, seq;
char *namedup;
size_t len;

if (flags & ~VALID_FLAGS)
Expand Down Expand Up @@ -9537,8 +9552,16 @@ int mdb_dbi_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *db
MDB_node *node = NODEPTR(mc.mc_pg[mc.mc_top], mc.mc_ki[mc.mc_top]);
if ((node->mn_flags & (F_DUPDATA|F_SUBDATA)) != F_SUBDATA)
return MDB_INCOMPATIBLE;
} else if (rc == MDB_NOTFOUND && (flags & MDB_CREATE)) {
/* Create if requested */
} else if (! (rc == MDB_NOTFOUND && (flags & MDB_CREATE))) {
return rc;
}

/* Done here so we cannot fail after creating a new DB */
if ((namedup = strdup(name)) == NULL)
return ENOMEM;

if (rc) {
/* MDB_NOTFOUND and MDB_CREATE: Create new DB */
data.mv_size = sizeof(MDB_db);
data.mv_data = &dummy;
memset(&dummy, 0, sizeof(dummy));
Expand All @@ -9548,10 +9571,12 @@ int mdb_dbi_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *db
dbflag |= DB_DIRTY;
}

/* OK, got info, add to table */
if (rc == MDB_SUCCESS) {
if (rc) {
free(namedup);
} else {
/* Got info, register DBI in this txn */
unsigned int slot = unused ? unused : txn->mt_numdbs;
txn->mt_dbxs[slot].md_name.mv_data = strdup(name);
txn->mt_dbxs[slot].md_name.mv_data = namedup;
txn->mt_dbxs[slot].md_name.mv_size = len;
txn->mt_dbxs[slot].md_rel = NULL;
txn->mt_dbflags[slot] = dbflag;
Expand Down Expand Up @@ -10002,6 +10027,8 @@ static int utf8_to_utf16(const char *src, int srcsize, wchar_t **dst, int *dstsi
if (need == 0)
return EINVAL;
result = malloc(sizeof(wchar_t) * need);
if (!result)
return ENOMEM;
MultiByteToWideChar(CP_UTF8, 0, src, srcsize, result, need);
if (dstsize)
*dstsize = need;
Expand Down

0 comments on commit 5acec4e

Please sign in to comment.