Skip to content

Commit 4ff5660

Browse files
committed
Use byte[] (not String) for Dbi name (lmdbjava#37)
Includes overloaded method that accepts String and uses UTF-8.
1 parent 6285189 commit 4ff5660

File tree

4 files changed

+24
-9
lines changed

4 files changed

+24
-9
lines changed

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
package org.lmdbjava;
2222

23+
import java.util.Arrays;
2324
import static java.util.Objects.requireNonNull;
2425
import static jnr.ffi.Memory.allocateDirect;
2526
import static jnr.ffi.NativeType.ADDRESS;
@@ -48,13 +49,13 @@
4849
public final class Dbi<T> {
4950

5051
private final Env<T> env;
51-
private final String name;
52+
private final byte[] name;
5253
private final Pointer ptr;
5354

54-
Dbi(final Env<T> env, final Txn<T> txn, final String name,
55+
Dbi(final Env<T> env, final Txn<T> txn, final byte[] name,
5556
final DbiFlags... flags) {
5657
this.env = env;
57-
this.name = name;
58+
this.name = name == null ? null : Arrays.copyOf(name, name.length);
5859
final int flagsMask = mask(flags);
5960
final Pointer dbiPtr = allocateDirect(RUNTIME, ADDRESS);
6061
checkRc(LIB.mdb_dbi_open(txn.pointer(), name, flagsMask, dbiPtr));
@@ -191,10 +192,10 @@ public T get(final Txn<T> txn, final T key) {
191192
/**
192193
* Obtains the name of this database.
193194
*
194-
* @return the name (may be null or empty)
195+
* @return the name (may be null)
195196
*/
196-
public String getName() {
197-
return name;
197+
public byte[] getName() {
198+
return name == null ? null : Arrays.copyOf(name, name.length);
198199
}
199200

200201
/**

src/main/java/org/lmdbjava/Env.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.io.File;
2424
import static java.lang.Boolean.getBoolean;
2525
import java.nio.ByteBuffer;
26+
import static java.nio.charset.StandardCharsets.UTF_8;
2627
import static java.util.Objects.requireNonNull;
2728
import jnr.ffi.Pointer;
2829
import jnr.ffi.byref.PointerByReference;
@@ -211,13 +212,25 @@ public boolean isReadOnly() {
211212
}
212213

213214
/**
214-
* Open the {@link Dbi}.
215+
* Convenience method that opens a {@link Dbi} with a UTF-8 database name.
215216
*
216217
* @param name name of the database (or null if no name is required)
217218
* @param flags to open the database with
218219
* @return a database that is ready to use
219220
*/
220221
public Dbi<T> openDbi(final String name, final DbiFlags... flags) {
222+
final byte[] nameBytes = name == null ? null : name.getBytes(UTF_8);
223+
return openDbi(nameBytes, flags);
224+
}
225+
226+
/**
227+
* Open the {@link Dbi}.
228+
*
229+
* @param name name of the database (or null if no name is required)
230+
* @param flags to open the database with
231+
* @return a database that is ready to use
232+
*/
233+
public Dbi<T> openDbi(final byte[] name, final DbiFlags... flags) {
221234
try (Txn<T> txn = readOnly ? txnRead() : txnWrite()) {
222235
final Dbi<T> dbi = new Dbi<>(this, txn, name, flags);
223236
txn.commit(); // even RO Txns require a commit to retain Dbi in Env

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

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

200200
int mdb_dbi_flags(@In Pointer txn, @In Pointer dbi, int flags);
201201

202-
int mdb_dbi_open(@In Pointer txn, @In String name, int flags,
202+
int mdb_dbi_open(@In Pointer txn, @In byte[] name, int flags,
203203
@In Pointer dbiPtr);
204204

205205
int mdb_del(@In Pointer txn, @In Pointer dbi, @In Pointer key,

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import static java.lang.System.getProperty;
2828
import java.nio.ByteBuffer;
2929
import static java.nio.ByteBuffer.allocateDirect;
30+
import static java.nio.charset.StandardCharsets.UTF_8;
3031
import static java.util.Collections.nCopies;
3132
import java.util.Random;
3233
import org.agrona.concurrent.UnsafeBuffer;
@@ -117,7 +118,7 @@ public void drop() {
117118
@Test
118119
public void getName() {
119120
final Dbi<ByteBuffer> db = env.openDbi(DB_1, MDB_CREATE);
120-
assertThat(db.getName(), is(DB_1));
121+
assertThat(db.getName(), is(DB_1.getBytes(UTF_8)));
121122
}
122123

123124
@Test

0 commit comments

Comments
 (0)