|
53 | 53 | import static org.lmdbjava.SeekOp.MDB_LAST; |
54 | 54 | import static org.lmdbjava.SeekOp.MDB_NEXT; |
55 | 55 | import static org.lmdbjava.SeekOp.MDB_PREV; |
56 | | -import static org.lmdbjava.TestUtils.DB_1; |
57 | | -import static org.lmdbjava.TestUtils.POSIX_MODE; |
58 | | -import static org.lmdbjava.TestUtils.bb; |
59 | | -import static org.lmdbjava.TestUtils.mdb; |
60 | | -import static org.lmdbjava.TestUtils.nb; |
| 56 | +import static org.lmdbjava.TestUtils.*; |
| 57 | + |
61 | 58 | import org.lmdbjava.Txn.NotReadyException; |
62 | 59 | import org.lmdbjava.Txn.ReadOnlyRequiredException; |
63 | 60 |
|
@@ -248,6 +245,76 @@ public void cursorMutableDirectBuffer() { |
248 | 245 | } |
249 | 246 | } |
250 | 247 |
|
| 248 | + @Test |
| 249 | + @SuppressWarnings("checkstyle:executablestatementcount") |
| 250 | + public void cursorByteArray() { |
| 251 | + final Env<byte[]> env = makeEnv(new ByteArrayProxy()); |
| 252 | + final Dbi<byte[]> db = env.openDbi(DB_1, MDB_CREATE, MDB_DUPSORT); |
| 253 | + try (final Txn<byte[]> txn = env.txnWrite()) { |
| 254 | + // populate data |
| 255 | + final Cursor<byte[]> c = db.openCursor(txn); |
| 256 | + c.put(ba(1), ba(2), MDB_NOOVERWRITE); |
| 257 | + c.put(ba(3), ba(4)); |
| 258 | + c.put(ba(5), ba(6)); |
| 259 | + |
| 260 | + // check MDB_SET operations |
| 261 | + final byte[] key3 = ba(3); |
| 262 | + assertThat(c.get(key3, MDB_SET_KEY), is(true)); |
| 263 | + assertThat(new UnsafeBuffer(txn.key()).getInt(0), is(3)); |
| 264 | + assertThat(new UnsafeBuffer(txn.val()).getInt(0), is(4)); |
| 265 | + final byte[] key6 = ba(5); |
| 266 | + assertThat(c.get(key6, MDB_SET_RANGE), is(true)); |
| 267 | + assertThat(new UnsafeBuffer(txn.key()).getInt(0), is(5)); |
| 268 | + assertThat(new UnsafeBuffer(txn.val()).getInt(0), is(6)); |
| 269 | + final byte[] key999 = ba(999); |
| 270 | + assertThat(c.get(key999, MDB_SET_KEY), is(false)); |
| 271 | + |
| 272 | + // check MDB navigation operations |
| 273 | + assertThat(c.seek(MDB_LAST), is(true)); |
| 274 | + final MutableDirectBuffer mdb1 = mdb(0); |
| 275 | + final MutableDirectBuffer mdb2 = mdb(0); |
| 276 | + mdb1.wrap(txn.key()); |
| 277 | + mdb2.wrap(txn.val()); |
| 278 | + |
| 279 | + assertThat(c.seek(MDB_PREV), is(true)); |
| 280 | + final MutableDirectBuffer mdb3 = mdb(0); |
| 281 | + final MutableDirectBuffer mdb4 = mdb(0); |
| 282 | + mdb3.wrap(txn.key()); |
| 283 | + mdb4.wrap(txn.val()); |
| 284 | + |
| 285 | + assertThat(c.seek(MDB_NEXT), is(true)); |
| 286 | + final MutableDirectBuffer mdb5 = mdb(0); |
| 287 | + final MutableDirectBuffer mdb6 = mdb(0); |
| 288 | + mdb5.wrap(txn.key()); |
| 289 | + mdb6.wrap(txn.val()); |
| 290 | + |
| 291 | + assertThat(c.seek(MDB_FIRST), is(true)); |
| 292 | + final MutableDirectBuffer mdb7 = mdb(0); |
| 293 | + final MutableDirectBuffer mdb8 = mdb(0); |
| 294 | + mdb7.wrap(txn.key()); |
| 295 | + mdb8.wrap(txn.val()); |
| 296 | + |
| 297 | + // assert afterwards to ensure memory address from LMDB |
| 298 | + // are valid within same txn and across cursor movement |
| 299 | + // MDB_LAST |
| 300 | + assertThat(mdb1.getInt(0), is(5)); |
| 301 | + assertThat(mdb2.getInt(0), is(6)); |
| 302 | + |
| 303 | + // MDB_PREV |
| 304 | + assertThat(mdb3.getInt(0), is(3)); |
| 305 | + assertThat(mdb4.getInt(0), is(4)); |
| 306 | + |
| 307 | + // MDB_NEXT |
| 308 | + assertThat(mdb5.getInt(0), is(5)); |
| 309 | + assertThat(mdb6.getInt(0), is(6)); |
| 310 | + |
| 311 | + // MDB_FIRST |
| 312 | + assertThat(mdb7.getInt(0), is(1)); |
| 313 | + assertThat(mdb8.getInt(0), is(2)); |
| 314 | + } |
| 315 | + } |
| 316 | + |
| 317 | + |
251 | 318 | @Test |
252 | 319 | public void delete() { |
253 | 320 | final Env<ByteBuffer> env = makeEnv(PROXY_OPTIMAL); |
|
0 commit comments