diff --git a/java/RocksDBSample.java b/java/RocksDBSample.java index 7a5eb7093..aa05b7887 100644 --- a/java/RocksDBSample.java +++ b/java/RocksDBSample.java @@ -141,9 +141,9 @@ public class RocksDBSample { System.out.println("Failed in call to geHistogramData()"); assert(false); //Should never reach here. } - + Iterator iterator = db.iterator(); - + boolean seekToFirstPassed = false; for (iterator.seekToFirst(); iterator.isValid(); iterator.next()) { iterator.status(); @@ -154,7 +154,7 @@ public class RocksDBSample { if(seekToFirstPassed) { System.out.println("iterator seekToFirst tests passed."); } - + boolean seekToLastPassed = false; for (iterator.seekToLast(); iterator.isValid(); iterator.prev()) { iterator.status(); @@ -162,18 +162,18 @@ public class RocksDBSample { assert(iterator.value() != null); seekToLastPassed = true; } - + if(seekToLastPassed) { System.out.println("iterator seekToLastPassed tests passed."); } - + iterator.seekToFirst(); 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) { diff --git a/java/org/rocksdb/Iterator.java b/java/org/rocksdb/Iterator.java index 099c5f7df..6069f27b0 100644 --- a/java/org/rocksdb/Iterator.java +++ b/java/org/rocksdb/Iterator.java @@ -7,70 +7,70 @@ package org.rocksdb; public class Iterator { private long nativeHandle_; - + public Iterator(long nativeHandle) { nativeHandle_ = nativeHandle; } - + public boolean isValid() { assert(isInitialized()); return isValid0(nativeHandle_); } - + public void seekToFirst() { assert(isInitialized()); seekToFirst0(nativeHandle_); } - + public void seekToLast() { assert(isInitialized()); seekToLast0(nativeHandle_); } - + public void next() { assert(isInitialized()); next0(nativeHandle_); } - + public void prev() { assert(isInitialized()); 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_); } } - + @Override protected void finalize() { close(); } - + private boolean isInitialized() { return (nativeHandle_ != 0); } - + private native boolean isValid0(long handle); private native void close0(long handle); private native void seekToFirst0(long handle); @@ -81,4 +81,4 @@ public class Iterator { 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/org/rocksdb/Options.java b/java/org/rocksdb/Options.java index 64b56b87c..13b35e434 100644 --- a/java/org/rocksdb/Options.java +++ b/java/org/rocksdb/Options.java @@ -508,7 +508,7 @@ public class Options { return maxBackgroundCompactions(nativeHandle_); } - /** + /** * Creates statistics object which collects metrics about database operations. Statistics objects should not be shared between DB instances as it does not use any locks to prevent concurrent updates. diff --git a/java/org/rocksdb/RocksDB.java b/java/org/rocksdb/RocksDB.java index 586331e04..bbfc18f4c 100644 --- a/java/org/rocksdb/RocksDB.java +++ b/java/org/rocksdb/RocksDB.java @@ -135,7 +135,7 @@ public class RocksDB { throws RocksDBException { remove(nativeHandle_, writeOpt.nativeHandle_, key, key.length); } - + public Iterator iterator() { return new Iterator(iterator0(nativeHandle_)); } diff --git a/java/rocksjni/iterator.cc b/java/rocksjni/iterator.cc index be8bb10d5..378e013e0 100644 --- a/java/rocksjni/iterator.cc +++ b/java/rocksjni/iterator.cc @@ -14,53 +14,71 @@ #include "rocksjni/portal.h" #include "rocksdb/iterator.h" +/* + * Class: org_rocksdb_Iterator + * Method: isValid0 + * Signature: (J)Z + */ jboolean Java_org_rocksdb_Iterator_isValid0( JNIEnv* env, jobject jobj, jlong handle) { - auto st = reinterpret_cast(handle); - assert(st != nullptr); - - return st->Valid(); + auto it = rocksdb::IteratorJni::getIterator(handle); + return it->Valid(); } +/* + * Class: org_rocksdb_Iterator + * Method: close0 + * Signature: (J)V + */ void Java_org_rocksdb_Iterator_seekToFirst0( JNIEnv* env, jobject jobj, jlong handle) { - auto st = reinterpret_cast(handle); - assert(st != nullptr); - - st->SeekToFirst(); + auto it = rocksdb::IteratorJni::getIterator(handle); + it->SeekToFirst(); } +/* + * Class: org_rocksdb_Iterator + * Method: seekToFirst0 + * Signature: (J)V + */ void Java_org_rocksdb_Iterator_seekToLast0( JNIEnv* env, jobject jobj, jlong handle) { - auto st = reinterpret_cast(handle); - assert(st != nullptr); - - st->SeekToLast(); + auto it = rocksdb::IteratorJni::getIterator(handle); + it->SeekToLast(); } +/* + * Class: org_rocksdb_Iterator + * Method: seekToLast0 + * Signature: (J)V + */ void Java_org_rocksdb_Iterator_next0( JNIEnv* env, jobject jobj, jlong handle) { - auto st = reinterpret_cast(handle); - assert(st != nullptr); - - st->Next(); + auto it = rocksdb::IteratorJni::getIterator(handle); + it->Next(); } +/* + * Class: org_rocksdb_Iterator + * Method: next0 + * Signature: (J)V + */ void Java_org_rocksdb_Iterator_prev0( JNIEnv* env, jobject jobj, jlong handle) { - auto st = reinterpret_cast(handle); - assert(st != nullptr); - - st->Prev(); + auto it = rocksdb::IteratorJni::getIterator(handle); + it->Prev(); } +/* + * Class: org_rocksdb_Iterator + * Method: prev0 + * Signature: (J)V + */ 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(); - + auto it = rocksdb::IteratorJni::getIterator(handle); + rocksdb::Slice key_slice = it->key(); + jbyteArray jkey = env->NewByteArray(key_slice.size()); env->SetByteArrayRegion( jkey, 0, key_slice.size(), @@ -68,13 +86,16 @@ jbyteArray Java_org_rocksdb_Iterator_key0( return jkey; } +/* + * Class: org_rocksdb_Iterator + * Method: key0 + * Signature: (J)[B + */ 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(); - + auto it = rocksdb::IteratorJni::getIterator(handle); + rocksdb::Slice value_slice = it->value(); + jbyteArray jvalue = env->NewByteArray(value_slice.size()); env->SetByteArrayRegion( jvalue, 0, value_slice.size(), @@ -82,41 +103,50 @@ jbyteArray Java_org_rocksdb_Iterator_value0( return jvalue; } +/* + * Class: org_rocksdb_Iterator + * Method: value0 + * Signature: (J)[B + */ 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); - + auto it = rocksdb::IteratorJni::getIterator(handle); jbyte* target = env->GetByteArrayElements(jtarget, 0); rocksdb::Slice target_slice( reinterpret_cast(target), jtarget_len); - - st->Seek(target_slice); - + + it->Seek(target_slice); + env->ReleaseByteArrayElements(jtarget, target, JNI_ABORT); } +/* + * Class: org_rocksdb_Iterator + * Method: seek0 + * Signature: (J[BI)V + */ 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(); - + auto it = rocksdb::IteratorJni::getIterator(handle); + rocksdb::Status s = it->status(); + if (s.ok()) { return; } - + rocksdb::RocksDBExceptionJni::ThrowNew(env, s); } +/* + * Class: org_rocksdb_Iterator + * Method: status0 + * Signature: (J)V + */ void Java_org_rocksdb_Iterator_close0( JNIEnv* env, jobject jobj, jlong handle) { - auto st = reinterpret_cast(handle); - assert(st != nullptr); - - delete st; - + auto it = rocksdb::IteratorJni::getIterator(handle); + delete it; + rocksdb::IteratorJni::setHandle(env, jobj, nullptr); -} \ No newline at end of file +} diff --git a/java/rocksjni/portal.h b/java/rocksjni/portal.h index 32e033aaf..f6eabe2f1 100644 --- a/java/rocksjni/portal.h +++ b/java/rocksjni/portal.h @@ -245,6 +245,14 @@ class IteratorJni { jobj, getHandleFieldID(env), reinterpret_cast(op)); } + + // Cast long to rocksdb::Iterator pointer. + static rocksdb::Iterator* getIterator(jlong handle) { + auto it = reinterpret_cast(handle); + assert(it != nullptr); + + return it; + } }; } // namespace rocksdb #endif // JAVA_ROCKSJNI_PORTAL_H_ diff --git a/java/rocksjni/rocksjni.cc b/java/rocksjni/rocksjni.cc index 4e4093294..877ba063b 100644 --- a/java/rocksjni/rocksjni.cc +++ b/java/rocksjni/rocksjni.cc @@ -302,4 +302,4 @@ jlong Java_org_rocksdb_RocksDB_iterator0( auto db = reinterpret_cast(db_handle); rocksdb::Iterator* iterator = db->NewIterator(rocksdb::ReadOptions()); return reinterpret_cast(iterator); -} \ No newline at end of file +}