Skip to content

Commit a02bc60

Browse files
committed
Add support for listing Dbi flags
1 parent aff67cf commit a02bc60

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

src/main/java/org/lmdbjava/Dbi.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,15 @@
2020

2121
package org.lmdbjava;
2222

23+
import java.util.ArrayList;
2324
import java.util.Arrays;
2425
import java.util.Comparator;
26+
import java.util.List;
27+
2528
import static java.util.Objects.requireNonNull;
2629
import static jnr.ffi.Memory.allocateDirect;
30+
31+
import jnr.ffi.NativeType;
2732
import static jnr.ffi.NativeType.ADDRESS;
2833
import jnr.ffi.Pointer;
2934
import jnr.ffi.byref.PointerByReference;
@@ -489,6 +494,29 @@ public Stat stat(final Txn<T> txn) {
489494
stat.f5_ms_entries.longValue());
490495
}
491496

497+
/*
498+
* Return DbiFlags for this Dbi.
499+
*
500+
* @param txn transaction handle (not null; not committed)
501+
* @return the list of flags this Dbi was created with
502+
*/
503+
public List<DbiFlags> listFlags(final Txn<T> txn) {
504+
final Pointer resultPtr = allocateDirect(RUNTIME, NativeType.UINT);
505+
checkRc(LIB.mdb_dbi_flags(txn.pointer(), ptr, resultPtr));
506+
507+
final int flags = resultPtr.getInt(0);
508+
509+
final List<DbiFlags> result = new ArrayList<>();
510+
511+
for (final DbiFlags flag : DbiFlags.values()) {
512+
if (MaskedFlag.isSet(flags, flag)) {
513+
result.add(flag);
514+
}
515+
}
516+
517+
return result;
518+
}
519+
492520
private void clean() {
493521
if (cleaned) {
494522
return;

src/main/java/org/lmdbjava/Library.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ int mdb_cursor_put(@In Pointer cursor, @In Pointer key, @In Pointer data,
222222

223223
void mdb_dbi_close(@In Pointer env, @In Pointer dbi);
224224

225-
int mdb_dbi_flags(@In Pointer txn, @In Pointer dbi, int flags);
225+
int mdb_dbi_flags(@In Pointer txn, @In Pointer dbi, @Out Pointer flags);
226226

227227
int mdb_dbi_open(@In Pointer txn, @In byte[] name, int flags,
228228
@In Pointer dbiPtr);

src/test/java/org/lmdbjava/DbiTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import static org.hamcrest.CoreMatchers.nullValue;
5050
import static org.hamcrest.MatcherAssert.assertThat;
5151
import org.hamcrest.Matchers;
52+
import static org.hamcrest.Matchers.containsInAnyOrder;
5253
import static org.hamcrest.Matchers.hasSize;
5354
import static org.hamcrest.collection.IsEmptyCollection.empty;
5455
import org.junit.After;
@@ -62,6 +63,7 @@
6263
import org.lmdbjava.Dbi.DbFullException;
6364
import static org.lmdbjava.DbiFlags.MDB_CREATE;
6465
import static org.lmdbjava.DbiFlags.MDB_DUPSORT;
66+
import static org.lmdbjava.DbiFlags.MDB_REVERSEKEY;
6567
import org.lmdbjava.Env.MapFullException;
6668
import static org.lmdbjava.Env.create;
6769
import static org.lmdbjava.EnvFlags.MDB_NOSUBDIR;
@@ -474,4 +476,14 @@ public void testParallelWritesStress() {
474476
}
475477
});
476478
}
479+
480+
@Test
481+
public void listsFlags() {
482+
final Dbi<ByteBuffer> dbi = env.openDbi(DB_1, MDB_CREATE, MDB_DUPSORT, MDB_REVERSEKEY);
483+
484+
try (Txn<ByteBuffer> txn = env.txnRead()) {
485+
final List<DbiFlags> flags = dbi.listFlags(txn);
486+
assertThat(flags, containsInAnyOrder(MDB_DUPSORT, MDB_REVERSEKEY));
487+
}
488+
}
477489
}

0 commit comments

Comments
 (0)