Skip to content

Commit bfbf223

Browse files
committed
Add FlagSet, DbiFlagSet, PutFlagSet
Refactor DbiBuilder and Dbi ctor to use DbiFlagSet.
1 parent 47b4c4f commit bfbf223

File tree

9 files changed

+531
-38
lines changed

9 files changed

+531
-38
lines changed

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

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import static org.lmdbjava.PutFlags.MDB_RESERVE;
3232
import static org.lmdbjava.ResultCodeMapper.checkRc;
3333

34+
import java.nio.charset.StandardCharsets;
3435
import java.util.ArrayList;
3536
import java.util.Arrays;
3637
import java.util.Comparator;
@@ -55,6 +56,7 @@ public final class Dbi<T> {
5556
private final byte[] name;
5657
private final Pointer ptr;
5758
private final BufferProxy<T> proxy;
59+
private final DbiFlagSet dbiFlagSet;
5860

5961
Dbi(
6062
final Env<T> env,
@@ -63,7 +65,7 @@ public final class Dbi<T> {
6365
final Comparator<T> comparator,
6466
final boolean nativeCb,
6567
final BufferProxy<T> proxy,
66-
final DbiFlags... flags) {
68+
final DbiFlagSet dbiFlagSet) {
6769
if (SHOULD_CHECK) {
6870
requireNonNull(txn);
6971
txn.checkReady();
@@ -72,9 +74,9 @@ public final class Dbi<T> {
7274
this.name = name == null ? null : Arrays.copyOf(name, name.length);
7375
this.proxy = proxy;
7476
this.comparator = comparator;
75-
final int flagsMask = mask(flags);
77+
this.dbiFlagSet = dbiFlagSet;
7678
final Pointer dbiPtr = allocateDirect(RUNTIME, ADDRESS);
77-
checkRc(LIB.mdb_dbi_open(txn.pointer(), name, flagsMask, dbiPtr));
79+
checkRc(LIB.mdb_dbi_open(txn.pointer(), name, dbiFlagSet.getMask(), dbiPtr));
7880
ptr = dbiPtr.getPointer(0);
7981
if (nativeCb) {
8082
requireNonNull(comparator, "comparator cannot be null if nativeCb is set");
@@ -291,6 +293,7 @@ public CursorIterable<T> iterate(final Txn<T> txn, final KeyRange<T> range) {
291293
* @return the list of flags this Dbi was created with
292294
*/
293295
public List<DbiFlags> listFlags(final Txn<T> txn) {
296+
// TODO we could just return what is in dbiFlagSet, rather than hitting LMDB.
294297
if (SHOULD_CHECK) {
295298
env.checkNotClosed();
296299
}
@@ -457,6 +460,26 @@ private void clean() {
457460
cleaned = true;
458461
}
459462

463+
private String getNameAsString() {
464+
if (name == null) {
465+
return "";
466+
} else {
467+
try {
468+
return new String(name, StandardCharsets.UTF_8);
469+
} catch (Exception e) {
470+
return "?";
471+
}
472+
}
473+
}
474+
475+
@Override
476+
public String toString() {
477+
return "Dbi{" +
478+
"name=" + getNameAsString() +
479+
", dbiFlagSet=" + dbiFlagSet +
480+
'}';
481+
}
482+
460483
/** The specified DBI was changed unexpectedly. */
461484
public static final class BadDbiException extends LmdbNativeException {
462485

src/main/java/org/lmdbjava/DbiBuilder.java

Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@
1919
import java.util.Arrays;
2020
import java.util.Collection;
2121
import java.util.Comparator;
22-
import java.util.EnumSet;
2322
import java.util.Objects;
24-
import java.util.Set;
2523

2624
/**
2725
* Staged builder for building a {@link Dbi}
@@ -224,35 +222,28 @@ public DbiBuilderStage3<T> withIteratorComparator(final Comparator<T> comparator
224222
public static class DbiBuilderStage3<T> {
225223

226224
private final DbiBuilderStage2<T> dbiBuilderStage2;
227-
private Set<DbiFlags> dbiFlags = null;
225+
private final FlagSet.Builder<DbiFlags, DbiFlagSet> flagSetBuilder = DbiFlagSet.builder();
228226
private Txn<T> txn = null;
229227

230228
private DbiBuilderStage3(DbiBuilderStage2<T> dbiBuilderStage2) {
231229
this.dbiBuilderStage2 = dbiBuilderStage2;
232230
}
233231

234-
private void initDbiFlags() {
235-
if (dbiFlags == null) {
236-
dbiFlags = EnumSet.noneOf(DbiFlags.class);
237-
}
238-
}
239-
240232
/**
241233
* <p>
242234
* Apply all the dbi flags supplied in dbiFlags.
243235
* </p>
244236
* <p>
245237
* Replaces any flags applies in previous calls to
246238
* {@link DbiBuilderStage3#withDbiFlags(Collection)}, {@link DbiBuilderStage3#withDbiFlags(DbiFlags...)}
247-
* or {@link DbiBuilderStage3#addDbiFlag(DbiFlags)}.
239+
* or {@link DbiBuilderStage3#setDbiFlag(DbiFlags)}.
248240
* </p>
249241
*
250242
* @param dbiFlags to open the database with.
251243
*/
252244
public DbiBuilderStage3<T> withDbiFlags(final Collection<DbiFlags> dbiFlags) {
253-
initDbiFlags();
254245
if (dbiFlags != null) {
255-
this.dbiFlags.stream()
246+
dbiFlags.stream()
256247
.filter(Objects::nonNull)
257248
.forEach(dbiFlags::add);
258249
}
@@ -265,36 +256,35 @@ public DbiBuilderStage3<T> withDbiFlags(final Collection<DbiFlags> dbiFlags) {
265256
* </p>
266257
* <p>
267258
* Replaces any flags applies in previous calls to
268-
* {@link DbiBuilderStage3#withDbiFlags(Collection)}, {@link DbiBuilderStage3#withDbiFlags(DbiFlags...)}
269-
* or {@link DbiBuilderStage3#addDbiFlag(DbiFlags)}.
259+
* {@link DbiBuilderStage3#withDbiFlags(Collection)},
260+
* {@link DbiBuilderStage3#withDbiFlags(DbiFlags...)}
261+
* or {@link DbiBuilderStage3#setDbiFlag(DbiFlags)}.
270262
* </p>
271263
*
272264
* @param dbiFlags to open the database with.
273265
* A null array is a no-op. Null items are ignored.
274266
*/
275267
public DbiBuilderStage3<T> withDbiFlags(final DbiFlags... dbiFlags) {
276-
initDbiFlags();
268+
flagSetBuilder.clear();
277269
if (dbiFlags != null) {
278270
Arrays.stream(dbiFlags)
279271
.filter(Objects::nonNull)
280-
.forEach(this.dbiFlags::add);
272+
.forEach(this.flagSetBuilder::setFlag);
281273
}
282274
return this;
283275
}
284276

285277
/**
286278
* Adds dbiFlag to those flags already added to this builder by
287-
* {@link DbiBuilderStage3#withDbiFlags(DbiFlags...)}, {@link DbiBuilderStage3#withDbiFlags(Collection)}
288-
* or {@link DbiBuilderStage3#addDbiFlag(DbiFlags)}.
279+
* {@link DbiBuilderStage3#withDbiFlags(DbiFlags...)},
280+
* {@link DbiBuilderStage3#withDbiFlags(Collection)}
281+
* or {@link DbiBuilderStage3#setDbiFlag(DbiFlags)}.
289282
*
290283
* @param dbiFlag to open the database with. A null value is a no-op.
291284
* @return this builder instance.
292285
*/
293-
public DbiBuilderStage3<T> addDbiFlag(final DbiFlags dbiFlag) {
294-
initDbiFlags();
295-
if (dbiFlags != null) {
296-
this.dbiFlags.add(dbiFlag);
297-
}
286+
public DbiBuilderStage3<T> setDbiFlag(final DbiFlags dbiFlag) {
287+
this.flagSetBuilder.setFlag(dbiFlag);
298288
return this;
299289
}
300290

@@ -341,9 +331,7 @@ private Txn<T> getTxn(final DbiBuilder<T> dbiBuilder) {
341331

342332
private Dbi<T> open(final Txn<T> txn,
343333
final DbiBuilder<T> dbiBuilder) {
344-
final DbiFlags[] dbiFlagsArr = dbiFlags != null && !dbiFlags.isEmpty()
345-
? this.dbiFlags.toArray(new DbiFlags[0])
346-
: null;
334+
final DbiFlagSet dbiFlagSet = flagSetBuilder.build();
347335

348336
return new Dbi<>(
349337
dbiBuilder.env,
@@ -352,7 +340,7 @@ private Dbi<T> open(final Txn<T> txn,
352340
dbiBuilderStage2.comparator,
353341
dbiBuilderStage2.useNativeCallback,
354342
dbiBuilder.proxy,
355-
dbiFlagsArr);
343+
dbiFlagSet);
356344
}
357345
}
358346
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.lmdbjava;
2+
3+
import java.util.EnumSet;
4+
import java.util.Objects;
5+
6+
public class DbiFlagSet extends FlagSet<DbiFlags> {
7+
8+
public static final DbiFlagSet EMPTY = new DbiFlagSet(EnumSet.noneOf(DbiFlags.class));
9+
10+
private DbiFlagSet(final EnumSet<DbiFlags> flags) {
11+
super(flags);
12+
}
13+
14+
public static DbiFlagSet empty() {
15+
return EMPTY;
16+
}
17+
18+
public static DbiFlagSet of(final DbiFlags putFlag) {
19+
Objects.requireNonNull(putFlag);
20+
return new DbiFlagSet(EnumSet.of(putFlag));
21+
}
22+
23+
public static DbiFlagSet of(final DbiFlags... DbiFlags) {
24+
return builder()
25+
.withFlags(DbiFlags)
26+
.build();
27+
}
28+
29+
public static Builder<DbiFlags, DbiFlagSet> builder() {
30+
return new Builder<>(DbiFlags.class, DbiFlagSet::new);
31+
}
32+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,7 @@ public Dbi<T> openDbi(
405405
final Comparator<T> comparator,
406406
final boolean nativeCb,
407407
final DbiFlags... flags) {
408-
return new Dbi<>(this, txn, name, comparator, nativeCb, proxy, flags);
408+
return new Dbi<>(this, txn, name, comparator, nativeCb, proxy, DbiFlagSet.of(flags));
409409
}
410410

411411
/**

0 commit comments

Comments
 (0)