// Copyright (c) 2011-present, Facebook, Inc. All rights reserved. // This source code is licensed under both the GPLv2 (found in the // COPYING file in the root directory) and Apache 2.0 License // (found in the LICENSE.Apache file in the root 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_SstFileReaderIterator.h" #include "rocksdb/iterator.h" #include "rocksjni/portal.h" /* * Class: org_rocksdb_SstFileReaderIterator * Method: disposeInternal * Signature: (J)V */ void Java_org_rocksdb_SstFileReaderIterator_disposeInternal(JNIEnv* /*env*/, jobject /*jobj*/, jlong handle) { auto* it = reinterpret_cast(handle); assert(it != nullptr); delete it; } /* * Class: org_rocksdb_SstFileReaderIterator * Method: isValid0 * Signature: (J)Z */ jboolean Java_org_rocksdb_SstFileReaderIterator_isValid0(JNIEnv* /*env*/, jobject /*jobj*/, jlong handle) { return reinterpret_cast(handle)->Valid(); } /* * Class: org_rocksdb_SstFileReaderIterator * Method: seekToFirst0 * Signature: (J)V */ void Java_org_rocksdb_SstFileReaderIterator_seekToFirst0(JNIEnv* /*env*/, jobject /*jobj*/, jlong handle) { reinterpret_cast(handle)->SeekToFirst(); } /* * Class: org_rocksdb_SstFileReaderIterator * Method: seekToLast0 * Signature: (J)V */ void Java_org_rocksdb_SstFileReaderIterator_seekToLast0(JNIEnv* /*env*/, jobject /*jobj*/, jlong handle) { reinterpret_cast(handle)->SeekToLast(); } /* * Class: org_rocksdb_SstFileReaderIterator * Method: next0 * Signature: (J)V */ void Java_org_rocksdb_SstFileReaderIterator_next0(JNIEnv* /*env*/, jobject /*jobj*/, jlong handle) { reinterpret_cast(handle)->Next(); } /* * Class: org_rocksdb_SstFileReaderIterator * Method: prev0 * Signature: (J)V */ void Java_org_rocksdb_SstFileReaderIterator_prev0(JNIEnv* /*env*/, jobject /*jobj*/, jlong handle) { reinterpret_cast(handle)->Prev(); } /* * Class: org_rocksdb_SstFileReaderIterator * Method: seek0 * Signature: (J[BI)V */ void Java_org_rocksdb_SstFileReaderIterator_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_SstFileReaderIterator * Method: seekForPrev0 * Signature: (J[BI)V */ void Java_org_rocksdb_SstFileReaderIterator_seekForPrev0(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->SeekForPrev(target_slice); env->ReleaseByteArrayElements(jtarget, target, JNI_ABORT); } /* * Class: org_rocksdb_SstFileReaderIterator * Method: status0 * Signature: (J)V */ void Java_org_rocksdb_SstFileReaderIterator_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_SstFileReaderIterator * Method: key0 * Signature: (J)[B */ jbyteArray Java_org_rocksdb_SstFileReaderIterator_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_SstFileReaderIterator * Method: value0 * Signature: (J)[B */ jbyteArray Java_org_rocksdb_SstFileReaderIterator_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; } /* * Class: org_rocksdb_SstFileReaderIterator * Method: keyDirect0 * Signature: (JLjava/nio/ByteBuffer;II)I */ jint Java_org_rocksdb_SstFileReaderIterator_keyDirect0( JNIEnv* env, jobject /*jobj*/, jlong handle, jobject jtarget, jint jtarget_off, jint jtarget_len) { auto* it = reinterpret_cast(handle); rocksdb::Slice key_slice = it->key(); return rocksdb::JniUtil::copyToDirect(env, key_slice, jtarget, jtarget_off, jtarget_len); } /* * Class: org_rocksdb_SstFileReaderIterator * Method: valueDirect0 * Signature: (JLjava/nio/ByteBuffer;II)I */ jint Java_org_rocksdb_SstFileReaderIterator_valueDirect0( JNIEnv* env, jobject /*jobj*/, jlong handle, jobject jtarget, jint jtarget_off, jint jtarget_len) { auto* it = reinterpret_cast(handle); rocksdb::Slice value_slice = it->value(); return rocksdb::JniUtil::copyToDirect(env, value_slice, jtarget, jtarget_off, jtarget_len); } /* * Class: org_rocksdb_SstFileReaderIterator * Method: seekDirect0 * Signature: (JLjava/nio/ByteBuffer;II)V */ void Java_org_rocksdb_SstFileReaderIterator_seekDirect0( JNIEnv* env, jobject /*jobj*/, jlong handle, jobject jtarget, jint jtarget_off, jint jtarget_len) { auto* it = reinterpret_cast(handle); auto seek = [&it](rocksdb::Slice& target_slice) { it->Seek(target_slice); }; rocksdb::JniUtil::k_op_direct(seek, env, jtarget, jtarget_off, jtarget_len); } /* * Class: org_rocksdb_SstFileReaderIterator * Method: seekForPrevDirect0 * Signature: (JLjava/nio/ByteBuffer;II)V */ void Java_org_rocksdb_SstFileReaderIterator_seekForPrevDirect0( JNIEnv* env, jobject /*jobj*/, jlong handle, jobject jtarget, jint jtarget_off, jint jtarget_len) { auto* it = reinterpret_cast(handle); auto seekPrev = [&it](rocksdb::Slice& target_slice) { it->SeekForPrev(target_slice); }; rocksdb::JniUtil::k_op_direct(seekPrev, env, jtarget, jtarget_off, jtarget_len); }