Skip to content

Commit fe85cc3

Browse files
committed
Switch to varargs for flags (avoid Set allocation)
1 parent 1b80053 commit fe85cc3

9 files changed

Lines changed: 76 additions & 105 deletions

File tree

src/main/java/org/lmdbjava/Database.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import static java.nio.ByteBuffer.allocateDirect;
55
import static java.nio.ByteOrder.LITTLE_ENDIAN;
66
import static java.util.Objects.requireNonNull;
7-
import java.util.Set;
87
import jnr.ffi.byref.IntByReference;
98
import jnr.ffi.byref.PointerByReference;
109
import org.lmdbjava.Library.MDB_val;
@@ -24,12 +23,11 @@ public final class Database {
2423
final int dbi;
2524
final Env env;
2625

27-
Database(Env env, Transaction tx, String name, Set<DatabaseFlags> flags)
26+
Database(Env env, Transaction tx, String name, DatabaseFlags... flags)
2827
throws
2928
AlreadyCommittedException, LmdbNativeException {
3029
requireNonNull(env);
3130
requireNonNull(tx);
32-
requireNonNull(flags);
3331
requireNonNull(name);
3432
if (name.isEmpty()) {
3533
throw new IllegalArgumentException("name is empty");

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

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package org.lmdbjava;
22

33
import java.io.File;
4-
import java.util.HashSet;
54
import static java.util.Objects.requireNonNull;
6-
import java.util.Set;
75
import jnr.ffi.Pointer;
86
import jnr.ffi.byref.PointerByReference;
97
import static org.lmdbjava.Library.lib;
@@ -16,13 +14,6 @@
1614
*/
1715
public final class Env {
1816

19-
private static final Set<TransactionFlags> TX_FLAGS_RO = new HashSet<>();
20-
private static final Set<TransactionFlags> TX_FLAGS_RW = new HashSet<>();
21-
22-
static {
23-
TX_FLAGS_RO.add(MDB_RDONLY);
24-
}
25-
2617
private boolean open;
2718
final Pointer ptr;
2819

@@ -95,17 +86,14 @@ public boolean isOpen() {
9586
* Opens the environment.
9687
*
9788
* @param path file system destination
98-
* @param flags the flags for this new environment
9989
* @param mode Unix permissions to set on created files and semaphores
90+
* @param flags the flags for this new environment
10091
* @throws AlreadyOpenException if already open
10192
* @throws LmdbNativeException if a native C error occurred
10293
*/
103-
public void open(final File path,
104-
final Set<EnvFlags> flags, final int mode) throws
105-
AlreadyOpenException,
106-
LmdbNativeException {
94+
public void open(final File path, final int mode, final EnvFlags... flags)
95+
throws AlreadyOpenException, LmdbNativeException {
10796
requireNonNull(path);
108-
requireNonNull(flags);
10997
if (open) {
11098
throw new AlreadyOpenException(Env.class.getSimpleName());
11199
}
@@ -123,7 +111,7 @@ public void open(final File path,
123111
*/
124112
public Transaction txnBeginReadOnly() throws NotOpenException,
125113
LmdbNativeException {
126-
return new Transaction(this, null, TX_FLAGS_RO);
114+
return new Transaction(this, null, MDB_RDONLY);
127115
}
128116

129117
/**
@@ -135,7 +123,7 @@ public Transaction txnBeginReadOnly() throws NotOpenException,
135123
*/
136124
public Transaction txnBeginReadWrite() throws NotOpenException,
137125
LmdbNativeException {
138-
return new Transaction(this, null, TX_FLAGS_RW);
126+
return new Transaction(this, null);
139127
}
140128

141129
}

src/main/java/org/lmdbjava/MaskedFlag.java

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package org.lmdbjava;
22

3-
import static java.util.Objects.requireNonNull;
4-
import java.util.Set;
3+
import static java.util.Objects.nonNull;
54

65
/**
76
* Indicates an enum that can provide integers for each of its values,
@@ -20,15 +19,31 @@ public interface MaskedFlag {
2019
/**
2120
* Fetch the integer mask for all presented flags.
2221
*
23-
* @param flags to mask
22+
* @param flags to mask (null or empty returns zero)
2423
* @return the integer mask for use in C
2524
*/
26-
static int mask(Set<? extends MaskedFlag> flags) {
27-
requireNonNull(flags);
25+
static int mask(final MaskedFlag... flags) {
26+
if (flags == null || flags.length == 0) {
27+
return 0;
28+
}
29+
2830
int result = 0;
2931
for (MaskedFlag flag : flags) {
3032
result |= flag.getMask();
3133
}
3234
return result;
3335
}
36+
37+
/**
38+
* Indicates whether the passed flag has the relevant masked flag high.
39+
*
40+
* @param flags to evaluate (usually produced by
41+
* {@link #mask(org.lmdbjava.MaskedFlag...)}
42+
* @param test the flag being sought (required)
43+
* @return
44+
*/
45+
static boolean isSet(final int flags, final MaskedFlag test) {
46+
nonNull(test);
47+
return (flags & test.getMask()) == test.getMask();
48+
}
3449
}

src/main/java/org/lmdbjava/Transaction.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import static java.util.Objects.requireNonNull;
44

55
import java.io.Closeable;
6-
import java.io.IOException;
76
import java.util.Set;
87

98
import static jnr.ffi.Memory.allocateDirect;
@@ -13,6 +12,7 @@
1312

1413
import static org.lmdbjava.Library.lib;
1514
import static org.lmdbjava.Library.runtime;
15+
import static org.lmdbjava.MaskedFlag.isSet;
1616
import static org.lmdbjava.MaskedFlag.mask;
1717
import static org.lmdbjava.ResultCodeMapper.checkRc;
1818
import static org.lmdbjava.TransactionFlags.MDB_RDONLY;
@@ -28,16 +28,15 @@ public final class Transaction implements Closeable {
2828
final Pointer ptr;
2929

3030
Transaction(final Env env, final Transaction parent,
31-
final Set<TransactionFlags> flags) throws NotOpenException,
31+
final TransactionFlags... flags) throws NotOpenException,
3232
LmdbNativeException {
3333
requireNonNull(env);
34-
requireNonNull(flags);
3534
if (!env.isOpen()) {
3635
throw new NotOpenException(Transaction.class.getSimpleName());
3736
}
3837
this.env = env;
39-
this.readOnly = flags.contains(MDB_RDONLY);
4038
final int flagsMask = mask(flags);
39+
this.readOnly = isSet(flagsMask, MDB_RDONLY);
4140
final Pointer txnPtr = allocateDirect(runtime, ADDRESS);
4241
final Pointer txnParentPtr = parent == null ? null : parent.ptr;
4342
checkRc(lib.mdb_txn_begin(env.ptr, txnParentPtr, flagsMask, txnPtr));
@@ -81,7 +80,7 @@ public void commit() throws AlreadyCommittedException, LmdbNativeException {
8180
* @throws AlreadyCommittedException if already committed
8281
* @throws LmdbNativeException if a native C error occurred
8382
*/
84-
public Database databaseOpen(final String name, final Set<DatabaseFlags> flags)
83+
public Database databaseOpen(final String name, final DatabaseFlags... flags)
8584
throws AlreadyCommittedException, LmdbNativeException {
8685
return new Database(env, this, name, flags);
8786
}

src/test/java/org/lmdbjava/CursorTest.java

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
import java.io.File;
44
import java.nio.ByteBuffer;
5-
import java.util.HashSet;
6-
import java.util.Set;
75

86
import static junit.framework.TestCase.fail;
97
import static org.hamcrest.CoreMatchers.is;
@@ -31,19 +29,12 @@ public class CursorTest {
3129
public void before() throws Exception {
3230
env = new Env();
3331
final File path = tmp.newFile();
34-
35-
final Set<EnvFlags> envFlags = new HashSet<>();
36-
envFlags.add(MDB_NOSUBDIR);
37-
3832
env.setMapSize(1_024 * 1_024);
3933
env.setMaxDbs(1);
4034
env.setMaxReaders(1);
41-
env.open(path, envFlags, POSIX_MODE);
35+
env.open(path, POSIX_MODE, MDB_NOSUBDIR);
4236
tx = env.txnBeginReadWrite();
43-
Set<DatabaseFlags> dbFlags = new HashSet<>();
44-
dbFlags.add(MDB_CREATE);
45-
dbFlags.add(MDB_DUPSORT);
46-
db = tx.databaseOpen(DB_1, dbFlags);
37+
db = tx.databaseOpen(DB_1, MDB_CREATE, MDB_DUPSORT);
4738
}
4839

4940
@Test
@@ -170,9 +161,7 @@ public void testCursorDelete() throws Exception {
170161

171162
@Test(expected = IllegalArgumentException.class)
172163
public void closeCursor() throws LmdbNativeException, AlreadyCommittedException {
173-
Set<DatabaseFlags> dbFlags = new HashSet<>();
174-
dbFlags.add(MDB_CREATE);
175-
Database db = tx.databaseOpen(DB_1, dbFlags);
164+
Database db = tx.databaseOpen(DB_1, MDB_CREATE);
176165
Cursor cursor = db.openCursor(tx);
177166
cursor.close();
178167
ByteBuffer k = createBb(1);

src/test/java/org/lmdbjava/DatabaseTest.java

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@
33
import java.io.File;
44
import java.nio.ByteBuffer;
55
import java.util.Collections;
6-
import java.util.HashSet;
76
import java.util.Random;
8-
import java.util.Set;
9-
import java.util.function.Consumer;
107

118
import static junit.framework.TestCase.fail;
129
import static org.hamcrest.CoreMatchers.is;
@@ -36,32 +33,23 @@ public void before() throws Exception {
3633
env = new Env();
3734
final File path = tmp.newFile();
3835

39-
final Set<EnvFlags> envFlags = new HashSet<>();
40-
envFlags.add(MDB_NOSUBDIR);
41-
4236
env.setMapSize(1_024 * 1_024 * 1_024);
4337
env.setMaxDbs(1);
4438
env.setMaxReaders(1);
45-
env.open(path, envFlags, POSIX_MODE);
39+
env.open(path, POSIX_MODE, MDB_NOSUBDIR);
4640

4741
tx = env.txnBeginReadWrite();
48-
Set<DatabaseFlags> dbFlags = new HashSet<>();
49-
dbFlags.add(MDB_CREATE);
50-
db = tx.databaseOpen(DB_1, dbFlags);
42+
db = tx.databaseOpen(DB_1, MDB_CREATE);
5143
}
5244

5345
@Test(expected = DatabasesFullException.class)
5446
public void dbOpenMaxDatabases() throws Exception {
55-
Set<DatabaseFlags> dbFlags = new HashSet<>();
56-
dbFlags.add(MDB_CREATE);
57-
tx.databaseOpen("another", dbFlags);
47+
tx.databaseOpen("another", MDB_CREATE);
5848
}
5949

6050
@Test
6151
public void putAndGetAndDeleteWithInternalTx() throws Exception {
62-
Set<DatabaseFlags> dbFlags = new HashSet<>();
63-
dbFlags.add(MDB_CREATE);
64-
Database db = tx.databaseOpen(DB_1, dbFlags);
52+
Database db = tx.databaseOpen(DB_1, MDB_CREATE);
6553
tx.commit();
6654
db.put(createBb(5), createBb(5));
6755
ByteBuffer val = db.get(createBb(5));
@@ -76,9 +64,7 @@ public void putAndGetAndDeleteWithInternalTx() throws Exception {
7664

7765
@Test
7866
public void putAbortGet() throws Exception {
79-
Set<DatabaseFlags> dbFlags = new HashSet<>();
80-
dbFlags.add(MDB_CREATE);
81-
Database db = tx.databaseOpen(DB_1, dbFlags);
67+
Database db = tx.databaseOpen(DB_1, MDB_CREATE);
8268

8369
db.put(tx, createBb(5), createBb(5));
8470
tx.abort();
@@ -95,9 +81,7 @@ public void putAbortGet() throws Exception {
9581

9682
@Test
9783
public void putCommitGet() throws Exception {
98-
Set<DatabaseFlags> dbFlags = new HashSet<>();
99-
dbFlags.add(MDB_CREATE);
100-
Database db = tx.databaseOpen(DB_1, dbFlags);
84+
Database db = tx.databaseOpen(DB_1, MDB_CREATE);
10185

10286
db.put(tx, createBb(5), createBb(5));
10387
tx.commit();
@@ -111,10 +95,7 @@ public void putCommitGet() throws Exception {
11195

11296
@Test
11397
public void putDelete() throws Exception {
114-
Set<DatabaseFlags> dbFlags = new HashSet<>();
115-
116-
dbFlags.add(MDB_CREATE);
117-
Database db = tx.databaseOpen(DB_1, dbFlags);
98+
Database db = tx.databaseOpen(DB_1, MDB_CREATE);
11899

119100
db.put(tx, createBb(5), createBb(5));
120101
db.delete(tx, createBb(5));

src/test/java/org/lmdbjava/EnvTest.java

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package org.lmdbjava;
22

33
import java.io.File;
4-
import java.util.HashSet;
5-
import java.util.Set;
64
import static org.hamcrest.CoreMatchers.is;
75
import static org.hamcrest.CoreMatchers.notNullValue;
86
import static org.hamcrest.MatcherAssert.assertThat;
@@ -21,10 +19,8 @@ public class EnvTest {
2119
public void cannotOpenTwice() throws Exception {
2220
final Env e = new Env();
2321
final File path = tmp.newFile();
24-
final Set<EnvFlags> flags = new HashSet<>();
25-
flags.add(MDB_NOSUBDIR);
26-
e.open(path, flags, POSIX_MODE);
27-
e.open(path, flags, POSIX_MODE); // error
22+
e.open(path, POSIX_MODE, MDB_NOSUBDIR);
23+
e.open(path, POSIX_MODE, MDB_NOSUBDIR); // error
2824
}
2925

3026
@Test
@@ -34,9 +30,7 @@ public void createAsDirectory() throws Exception {
3430
assertThat(env.isOpen(), is(false));
3531

3632
final File path = tmp.newFolder();
37-
final Set<EnvFlags> flags = new HashSet<>();
38-
39-
env.open(path, flags, POSIX_MODE);
33+
env.open(path, POSIX_MODE);
4034
assertThat(env.isOpen(), is(true));
4135
assertThat(path.isDirectory(), is(true));
4236
}
@@ -47,12 +41,10 @@ public void createAsFile() throws Exception {
4741
assertThat(env, is(notNullValue()));
4842
assertThat(env.isOpen(), is(false));
4943
final File path = tmp.newFile();
50-
final Set<EnvFlags> flags = new HashSet<>();
51-
flags.add(MDB_NOSUBDIR);
5244
env.setMapSize(1_024 * 1_024);
5345
env.setMaxDbs(1);
5446
env.setMaxReaders(1);
55-
env.open(path, flags, POSIX_MODE);
47+
env.open(path, POSIX_MODE, MDB_NOSUBDIR);
5648
assertThat(env.isOpen(), is(true));
5749
assertThat(path.isFile(), is(true));
5850
}
Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,47 @@
11
package org.lmdbjava;
22

3-
import java.util.HashSet;
4-
import java.util.Set;
53
import static org.hamcrest.CoreMatchers.is;
64
import static org.hamcrest.MatcherAssert.assertThat;
75
import org.junit.Test;
86
import static org.lmdbjava.EnvFlags.MDB_FIXEDMAP;
97
import static org.lmdbjava.EnvFlags.MDB_NOSYNC;
8+
import static org.lmdbjava.EnvFlags.MDB_RDONLY;
9+
import static org.lmdbjava.MaskedFlag.isSet;
1010
import static org.lmdbjava.MaskedFlag.mask;
1111

1212
public class MaskedFlagTest {
1313

14+
@Test
15+
public void isSetOperates() {
16+
assertThat(isSet(0, MDB_NOSYNC), is(false));
17+
assertThat(isSet(0, MDB_FIXEDMAP), is(false));
18+
assertThat(isSet(0, MDB_RDONLY), is(false));
19+
20+
assertThat(isSet(MDB_FIXEDMAP.getMask(), MDB_NOSYNC), is(false));
21+
assertThat(isSet(MDB_FIXEDMAP.getMask(), MDB_FIXEDMAP), is(true));
22+
assertThat(isSet(MDB_FIXEDMAP.getMask(), MDB_RDONLY), is(false));
23+
24+
assertThat(isSet(MDB_NOSYNC.getMask(), MDB_NOSYNC), is(true));
25+
assertThat(isSet(MDB_NOSYNC.getMask(), MDB_FIXEDMAP), is(false));
26+
assertThat(isSet(MDB_NOSYNC.getMask(), MDB_RDONLY), is(false));
27+
28+
final int syncFixed = mask(MDB_NOSYNC, MDB_FIXEDMAP);
29+
assertThat(isSet(syncFixed, MDB_NOSYNC), is(true));
30+
assertThat(isSet(syncFixed, MDB_FIXEDMAP), is(true));
31+
assertThat(isSet(syncFixed, MDB_RDONLY), is(false));
32+
}
33+
1434
@Test
1535
public void masking() {
16-
final Set<EnvFlags> flags = new HashSet<>();
17-
assertThat(mask(flags), is(0));
18-
flags.add(MDB_NOSYNC);
19-
assertThat(mask(flags), is(MDB_NOSYNC.getMask()));
20-
flags.add(MDB_FIXEDMAP);
36+
final EnvFlags[] nullFlags = null;
37+
assertThat(mask(nullFlags), is(0));
38+
39+
final EnvFlags[] emptyFlags = new EnvFlags[]{};
40+
assertThat(mask(emptyFlags), is(0));
41+
42+
assertThat(mask(MDB_NOSYNC), is(MDB_NOSYNC.getMask()));
43+
2144
final int expected = MDB_NOSYNC.getMask() + MDB_FIXEDMAP.getMask();
22-
assertThat(mask(flags), is(expected));
45+
assertThat(mask(MDB_NOSYNC, MDB_FIXEDMAP), is(expected));
2346
}
2447
}

0 commit comments

Comments
 (0)