2020
2121package org .lmdbjava ;
2222
23+ import jnr .ffi .Pointer ;
24+ import jnr .ffi .byref .IntByReference ;
25+ import jnr .ffi .byref .PointerByReference ;
26+ import org .lmdbjava .Library .ComparatorCallback ;
27+ import org .lmdbjava .Library .MDB_stat ;
28+
29+ import java .util .ArrayList ;
30+ import java .util .Arrays ;
31+ import java .util .Comparator ;
32+ import java .util .List ;
33+
2334import static java .util .Objects .requireNonNull ;
2435import static jnr .ffi .Memory .allocateDirect ;
2536import static jnr .ffi .NativeType .ADDRESS ;
3647import static org .lmdbjava .PutFlags .MDB_RESERVE ;
3748import static org .lmdbjava .ResultCodeMapper .checkRc ;
3849
39- import java .util .ArrayList ;
40- import java .util .Arrays ;
41- import java .util .Comparator ;
42- import java .util .List ;
43-
44- import jnr .ffi .Pointer ;
45- import jnr .ffi .byref .IntByReference ;
46- import jnr .ffi .byref .PointerByReference ;
47- import org .lmdbjava .Library .ComparatorCallback ;
48- import org .lmdbjava .Library .MDB_stat ;
49-
5050/**
5151 * LMDB Database.
5252 *
@@ -64,10 +64,18 @@ public final class Dbi<T> {
6464 Dbi (final Env <T > env , final Txn <T > txn , final byte [] name ,
6565 final Comparator <T > comparator , final boolean nativeCb ,
6666 final BufferProxy <T > proxy , final DbiFlags ... flags ) {
67+ if (SHOULD_CHECK ) {
68+ requireNonNull (txn );
69+ txn .checkReady ();
70+ }
6771 this .env = env ;
6872 this .name = name == null ? null : Arrays .copyOf (name , name .length );
69- this .comparator = comparator ;
70- final int flagsMask = mask (flags );
73+ if (comparator == null ) {
74+ this .comparator = proxy .getComparator (flags );
75+ } else {
76+ this .comparator = comparator ;
77+ }
78+ final int flagsMask = mask (true , flags );
7179 final Pointer dbiPtr = allocateDirect (RUNTIME , ADDRESS );
7280 checkRc (LIB .mdb_dbi_open (txn .pointer (), name , flagsMask , dbiPtr ));
7381 ptr = dbiPtr .getPointer (0 );
@@ -377,7 +385,7 @@ public boolean put(final Txn<T> txn, final T key, final T val,
377385 }
378386 txn .kv ().keyIn (key );
379387 txn .kv ().valIn (val );
380- final int mask = mask (flags );
388+ final int mask = mask (true , flags );
381389 final int rc = LIB .mdb_put (txn .pointer (), ptr , txn .kv ().pointerKey (), txn
382390 .kv ().pointerVal (), mask );
383391 if (rc == MDB_KEYEXIST ) {
@@ -422,7 +430,7 @@ public T reserve(final Txn<T> txn, final T key, final int size,
422430 }
423431 txn .kv ().keyIn (key );
424432 txn .kv ().valIn (size );
425- final int flags = mask (op ) | MDB_RESERVE .getMask ();
433+ final int flags = mask (true , op ) | MDB_RESERVE .getMask ();
426434 checkRc (LIB .mdb_put (txn .pointer (), ptr , txn .kv ().pointerKey (), txn .kv ()
427435 .pointerVal (), flags ));
428436 txn .kv ().valOut (); // marked as in,out in LMDB C docs
0 commit comments