// Copyright (c) 2011-present, Facebook, Inc. All rights reserved. // This source code is licensed under the BSD-style license found in the // LICENSE file in the root directory of this source tree. An additional grant // of patent rights can be found in the PATENTS file in the same directory. // // This file implements the "bridge" between Java and C++ and enables // calling c++ rocksdb::Iterator methods from Java side. #include #include #include #include "include/org_rocksdb_RocksIterator.h" #include "rocksjni/portal.h" #include "rocksdb/iterator.h" /* * Class: org_rocksdb_RocksIterator * Method: disposeInternal * Signature: (J)V */ void Java_org_rocksdb_RocksIterator_disposeInternal( JNIEnv* env, jobject jobj, jlong handle) { auto* it = reinterpret_cast(handle); assert(it != nullptr); delete it; } /* * Class: org_rocksdb_RocksIterator * Method: isValid0 * Signature: (J)Z */ jboolean Java_org_rocksdb_RocksIterator_isValid0( JNIEnv* env, jobject jobj, jlong handle) { return reinterpret_cast(handle)->Valid(); } /* * Class: org_rocksdb_RocksIterator * Method: seekToFirst0 * Signature: (J)V */ void Java_org_rocksdb_RocksIterator_seekToFirst0( JNIEnv* env, jobject jobj, jlong handle) { reinterpret_cast(handle)->SeekToFirst(); } /* * Class: org_rocksdb_RocksIterator * Method: seekToLast0 * Signature: (J)V */ void Java_org_rocksdb_RocksIterator_seekToLast0( JNIEnv* env, jobject jobj, jlong handle) { reinterpret_cast(handle)->SeekToLast(); } /* * Class: org_rocksdb_RocksIterator * Method: next0 * Signature: (J)V */ void Java_org_rocksdb_RocksIterator_next0( JNIEnv* env, jobject jobj, jlong handle) { reinterpret_cast(handle)->Next(); } /* * Class: org_rocksdb_RocksIterator * Method: prev0 * Signature: (J)V */ void Java_org_rocksdb_RocksIterator_prev0( JNIEnv* env, jobject jobj, jlong handle) { reinterpret_cast(handle)->Prev(); } /* * Class: org_rocksdb_RocksIterator * Method: seek0 * Signature: (J[BI)V */ void Java_org_rocksdb_RocksIterator_seek0( JNIEnv* env, jobject jobj, jlong handle, jbyteArray jtarget, jint jtarget_len) { jbyte* target = env->GetByteArrayElements(jtarget, nullptr); if(target == nullptr) { // exception thrown: OutOfMemoryError return; } rocksdb::Slice target_slice( reinterpret_cast(target), jtarget_len); auto* it = reinterpret_cast(handle); it->Seek(target_slice); env->ReleaseByteArrayElements(jtarget, target, JNI_ABORT); } /* * Class: org_rocksdb_RocksIterator * Method: status0 * Signature: (J)V */ void Java_org_rocksdb_RocksIterator_status0( JNIEnv* env, jobject jobj, jlong handle) { auto* it = reinterpret_cast(handle); rocksdb::Status s = it->status(); if (s.ok()) { return; } rocksdb::RocksDBExceptionJni::ThrowNew(env, s); } /* * Class: org_rocksdb_RocksIterator * Method: key0 * Signature: (J)[B */ jbyteArray Java_org_rocksdb_RocksIterator_key0( JNIEnv* env, jobject jobj, jlong handle) { auto* it = reinterpret_cast(handle); rocksdb::Slice key_slice = it->key(); jbyteArray jkey = env->NewByteArray(static_cast(key_slice.size())); if(jkey == nullptr) { // exception thrown: OutOfMemoryError return nullptr; } env->SetByteArrayRegion(jkey, 0, static_cast(key_slice.size()), const_cast(reinterpret_cast(key_slice.data()))); return jkey; } /* * Class: org_rocksdb_RocksIterator * Method: value0 * Signature: (J)[B */ jbyteArray Java_org_rocksdb_RocksIterator_value0( JNIEnv* env, jobject jobj, jlong handle) { auto* it = reinterpret_cast(handle); rocksdb::Slice value_slice = it->value(); jbyteArray jkeyValue = env->NewByteArray(static_cast(value_slice.size())); if(jkeyValue == nullptr) { // exception thrown: OutOfMemoryError return nullptr; } env->SetByteArrayRegion(jkeyValue, 0, static_cast(value_slice.size()), const_cast(reinterpret_cast(value_slice.data()))); return jkeyValue; }