From 1d6c1e018fe5e7048af92433094716bd00b8c61a Mon Sep 17 00:00:00 2001 From: Ankit Gupta Date: Sat, 19 Apr 2014 12:55:28 -0700 Subject: [PATCH] Add more iterator JNI bindings --- java/Makefile | 2 +- java/RocksDBSample.java | 37 +++++++++++++++++++--- java/org/rocksdb/Iterator.java | 24 ++++++++++++++ java/rocksjni/iterator.cc | 57 ++++++++++++++++++++++++++++++++++ 4 files changed, 114 insertions(+), 6 deletions(-) diff --git a/java/Makefile b/java/Makefile index c9e65808a..81b5afc79 100644 --- a/java/Makefile +++ b/java/Makefile @@ -1,4 +1,4 @@ -NATIVE_JAVA_CLASSES = org.rocksdb.RocksDB org.rocksdb.Options org.rocksdb.WriteBatch org.rocksdb.WriteBatchInternal org.rocksdb.WriteBatchTest org.rocksdb.WriteOptions org.rocksdb.BackupableDB org.rocksdb.BackupableDBOptions org.rocksdb.Statistics +NATIVE_JAVA_CLASSES = org.rocksdb.RocksDB org.rocksdb.Options org.rocksdb.WriteBatch org.rocksdb.WriteBatchInternal org.rocksdb.WriteBatchTest org.rocksdb.WriteOptions org.rocksdb.BackupableDB org.rocksdb.BackupableDBOptions org.rocksdb.Statistics org.rocksdb.Iterator NATIVE_INCLUDE = ./include ROCKSDB_JAR = rocksdbjni.jar diff --git a/java/RocksDBSample.java b/java/RocksDBSample.java index 018d86815..7a5eb7093 100644 --- a/java/RocksDBSample.java +++ b/java/RocksDBSample.java @@ -143,12 +143,39 @@ public class RocksDBSample { } Iterator iterator = db.iterator(); + + boolean seekToFirstPassed = false; + for (iterator.seekToFirst(); iterator.isValid(); iterator.next()) { + iterator.status(); + assert(iterator.key() != null); + assert(iterator.value() != null); + seekToFirstPassed = true; + } + if(seekToFirstPassed) { + System.out.println("iterator seekToFirst tests passed."); + } + + boolean seekToLastPassed = false; + for (iterator.seekToLast(); iterator.isValid(); iterator.prev()) { + iterator.status(); + assert(iterator.key() != null); + assert(iterator.value() != null); + seekToLastPassed = true; + } + + if(seekToLastPassed) { + System.out.println("iterator seekToLastPassed tests passed."); + } + iterator.seekToFirst(); - assert(iterator.isValid()); - iterator.next(); - iterator.seekToLast(); - iterator.prev(); - iterator.close(); + iterator.seek(iterator.key()); + assert(iterator.key() != null); + assert(iterator.value() != null); + + System.out.println("iterator seek test passed."); + + iterator.close(); + System.out.println("iterator tests passed."); } catch (RocksDBException e) { System.err.println(e); } diff --git a/java/org/rocksdb/Iterator.java b/java/org/rocksdb/Iterator.java index dbd11015b..099c5f7df 100644 --- a/java/org/rocksdb/Iterator.java +++ b/java/org/rocksdb/Iterator.java @@ -37,6 +37,26 @@ public class Iterator { prev0(nativeHandle_); } + public byte[] key() { + assert(isInitialized()); + return key0(nativeHandle_); + } + + public byte[] value() { + assert(isInitialized()); + return value0(nativeHandle_); + } + + public void seek(byte[] target) { + assert(isInitialized()); + seek0(nativeHandle_, target, target.length); + } + + public void status(){ + assert(isInitialized()); + status0(nativeHandle_); + } + public synchronized void close() { if(nativeHandle_ != 0) { close0(nativeHandle_); @@ -57,4 +77,8 @@ public class Iterator { private native void seekToLast0(long handle); private native void next0(long handle); private native void prev0(long handle); + private native byte[] key0(long handle); + private native byte[] value0(long handle); + private native void seek0(long handle, byte[] target, int targetLen); + private native void status0(long handle); } \ No newline at end of file diff --git a/java/rocksjni/iterator.cc b/java/rocksjni/iterator.cc index 2f6d0a6b3..be8bb10d5 100644 --- a/java/rocksjni/iterator.cc +++ b/java/rocksjni/iterator.cc @@ -54,6 +54,63 @@ void Java_org_rocksdb_Iterator_prev0( st->Prev(); } +jbyteArray Java_org_rocksdb_Iterator_key0( + JNIEnv* env, jobject jobj, jlong handle) { + auto st = reinterpret_cast(handle); + assert(st != nullptr); + + rocksdb::Slice key_slice = st->key(); + + jbyteArray jkey = env->NewByteArray(key_slice.size()); + env->SetByteArrayRegion( + jkey, 0, key_slice.size(), + reinterpret_cast(key_slice.data())); + return jkey; +} + +jbyteArray Java_org_rocksdb_Iterator_value0( + JNIEnv* env, jobject jobj, jlong handle) { + auto st = reinterpret_cast(handle); + assert(st != nullptr); + + rocksdb::Slice value_slice = st->value(); + + jbyteArray jvalue = env->NewByteArray(value_slice.size()); + env->SetByteArrayRegion( + jvalue, 0, value_slice.size(), + reinterpret_cast(value_slice.data())); + return jvalue; +} + +void Java_org_rocksdb_Iterator_seek0( + JNIEnv* env, jobject jobj, jlong handle, + jbyteArray jtarget, jint jtarget_len) { + auto st = reinterpret_cast(handle); + assert(st != nullptr); + + jbyte* target = env->GetByteArrayElements(jtarget, 0); + rocksdb::Slice target_slice( + reinterpret_cast(target), jtarget_len); + + st->Seek(target_slice); + + env->ReleaseByteArrayElements(jtarget, target, JNI_ABORT); +} + +void Java_org_rocksdb_Iterator_status0( + JNIEnv* env, jobject jobj, jlong handle) { + auto st = reinterpret_cast(handle); + assert(st != nullptr); + + rocksdb::Status s = st->status(); + + if (s.ok()) { + return; + } + + rocksdb::RocksDBExceptionJni::ThrowNew(env, s); +} + void Java_org_rocksdb_Iterator_close0( JNIEnv* env, jobject jobj, jlong handle) { auto st = reinterpret_cast(handle);