From a02bc60b31b36b42dc86344bec5719d11183f571 Mon Sep 17 00:00:00 2001 From: Justin Heister Date: Tue, 10 Mar 2020 09:47:04 +0000 Subject: [PATCH] Add support for listing Dbi flags --- src/main/java/org/lmdbjava/Dbi.java | 28 +++++++++++++++++++++++++ src/main/java/org/lmdbjava/Library.java | 2 +- src/test/java/org/lmdbjava/DbiTest.java | 12 +++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/lmdbjava/Dbi.java b/src/main/java/org/lmdbjava/Dbi.java index d402a282..eccefd5f 100644 --- a/src/main/java/org/lmdbjava/Dbi.java +++ b/src/main/java/org/lmdbjava/Dbi.java @@ -20,10 +20,15 @@ package org.lmdbjava; +import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; +import java.util.List; + import static java.util.Objects.requireNonNull; import static jnr.ffi.Memory.allocateDirect; + +import jnr.ffi.NativeType; import static jnr.ffi.NativeType.ADDRESS; import jnr.ffi.Pointer; import jnr.ffi.byref.PointerByReference; @@ -489,6 +494,29 @@ public Stat stat(final Txn txn) { stat.f5_ms_entries.longValue()); } + /* + * Return DbiFlags for this Dbi. + * + * @param txn transaction handle (not null; not committed) + * @return the list of flags this Dbi was created with + */ + public List listFlags(final Txn txn) { + final Pointer resultPtr = allocateDirect(RUNTIME, NativeType.UINT); + checkRc(LIB.mdb_dbi_flags(txn.pointer(), ptr, resultPtr)); + + final int flags = resultPtr.getInt(0); + + final List result = new ArrayList<>(); + + for (final DbiFlags flag : DbiFlags.values()) { + if (MaskedFlag.isSet(flags, flag)) { + result.add(flag); + } + } + + return result; + } + private void clean() { if (cleaned) { return; diff --git a/src/main/java/org/lmdbjava/Library.java b/src/main/java/org/lmdbjava/Library.java index 3cb44fae..60ac2fbc 100644 --- a/src/main/java/org/lmdbjava/Library.java +++ b/src/main/java/org/lmdbjava/Library.java @@ -222,7 +222,7 @@ int mdb_cursor_put(@In Pointer cursor, @In Pointer key, @In Pointer data, void mdb_dbi_close(@In Pointer env, @In Pointer dbi); - int mdb_dbi_flags(@In Pointer txn, @In Pointer dbi, int flags); + int mdb_dbi_flags(@In Pointer txn, @In Pointer dbi, @Out Pointer flags); int mdb_dbi_open(@In Pointer txn, @In byte[] name, int flags, @In Pointer dbiPtr); diff --git a/src/test/java/org/lmdbjava/DbiTest.java b/src/test/java/org/lmdbjava/DbiTest.java index 5d454cb8..c36be6bf 100644 --- a/src/test/java/org/lmdbjava/DbiTest.java +++ b/src/test/java/org/lmdbjava/DbiTest.java @@ -49,6 +49,7 @@ import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import org.hamcrest.Matchers; +import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.collection.IsEmptyCollection.empty; import org.junit.After; @@ -62,6 +63,7 @@ import org.lmdbjava.Dbi.DbFullException; import static org.lmdbjava.DbiFlags.MDB_CREATE; import static org.lmdbjava.DbiFlags.MDB_DUPSORT; +import static org.lmdbjava.DbiFlags.MDB_REVERSEKEY; import org.lmdbjava.Env.MapFullException; import static org.lmdbjava.Env.create; import static org.lmdbjava.EnvFlags.MDB_NOSUBDIR; @@ -474,4 +476,14 @@ public void testParallelWritesStress() { } }); } + + @Test + public void listsFlags() { + final Dbi dbi = env.openDbi(DB_1, MDB_CREATE, MDB_DUPSORT, MDB_REVERSEKEY); + + try (Txn txn = env.txnRead()) { + final List flags = dbi.listFlags(txn); + assertThat(flags, containsInAnyOrder(MDB_DUPSORT, MDB_REVERSEKEY)); + } + } }