]>
git.proxmox.com Git - ceph.git/blob - ceph/src/rocksdb/java/rocksjni/iterator.cc
1 // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
2 // This source code is licensed under both the GPLv2 (found in the
3 // COPYING file in the root directory) and Apache 2.0 License
4 // (found in the LICENSE.Apache file in the root directory).
6 // This file implements the "bridge" between Java and C++ and enables
7 // calling c++ ROCKSDB_NAMESPACE::Iterator methods from Java side.
14 #include "include/org_rocksdb_RocksIterator.h"
15 #include "rocksdb/iterator.h"
16 #include "rocksjni/portal.h"
19 * Class: org_rocksdb_RocksIterator
20 * Method: disposeInternal
23 void Java_org_rocksdb_RocksIterator_disposeInternal(JNIEnv
* /*env*/,
26 auto* it
= reinterpret_cast<ROCKSDB_NAMESPACE::Iterator
*>(handle
);
27 assert(it
!= nullptr);
32 * Class: org_rocksdb_RocksIterator
36 jboolean
Java_org_rocksdb_RocksIterator_isValid0(JNIEnv
* /*env*/,
39 return reinterpret_cast<ROCKSDB_NAMESPACE::Iterator
*>(handle
)->Valid();
43 * Class: org_rocksdb_RocksIterator
44 * Method: seekToFirst0
47 void Java_org_rocksdb_RocksIterator_seekToFirst0(JNIEnv
* /*env*/,
50 reinterpret_cast<ROCKSDB_NAMESPACE::Iterator
*>(handle
)->SeekToFirst();
54 * Class: org_rocksdb_RocksIterator
58 void Java_org_rocksdb_RocksIterator_seekToLast0(JNIEnv
* /*env*/,
61 reinterpret_cast<ROCKSDB_NAMESPACE::Iterator
*>(handle
)->SeekToLast();
65 * Class: org_rocksdb_RocksIterator
69 void Java_org_rocksdb_RocksIterator_next0(JNIEnv
* /*env*/, jobject
/*jobj*/,
71 reinterpret_cast<ROCKSDB_NAMESPACE::Iterator
*>(handle
)->Next();
75 * Class: org_rocksdb_RocksIterator
79 void Java_org_rocksdb_RocksIterator_prev0(JNIEnv
* /*env*/, jobject
/*jobj*/,
81 reinterpret_cast<ROCKSDB_NAMESPACE::Iterator
*>(handle
)->Prev();
85 * Class: org_rocksdb_RocksIterator
89 void Java_org_rocksdb_RocksIterator_seek0(JNIEnv
* env
, jobject
/*jobj*/,
90 jlong handle
, jbyteArray jtarget
,
92 jbyte
* target
= env
->GetByteArrayElements(jtarget
, nullptr);
93 if (target
== nullptr) {
94 // exception thrown: OutOfMemoryError
98 ROCKSDB_NAMESPACE::Slice
target_slice(reinterpret_cast<char*>(target
),
101 auto* it
= reinterpret_cast<ROCKSDB_NAMESPACE::Iterator
*>(handle
);
102 it
->Seek(target_slice
);
104 env
->ReleaseByteArrayElements(jtarget
, target
, JNI_ABORT
);
108 * Class: org_rocksdb_RocksIterator
109 * Method: seekDirect0
110 * Signature: (JLjava/nio/ByteBuffer;II)V
112 void Java_org_rocksdb_RocksIterator_seekDirect0(JNIEnv
* env
, jobject
/*jobj*/,
113 jlong handle
, jobject jtarget
,
116 auto* it
= reinterpret_cast<ROCKSDB_NAMESPACE::Iterator
*>(handle
);
117 auto seek
= [&it
](ROCKSDB_NAMESPACE::Slice
& target_slice
) {
118 it
->Seek(target_slice
);
120 ROCKSDB_NAMESPACE::JniUtil::k_op_direct(seek
, env
, jtarget
, jtarget_off
,
125 * Class: org_rocksdb_RocksIterator
126 * Method: seekForPrevDirect0
127 * Signature: (JLjava/nio/ByteBuffer;II)V
129 void Java_org_rocksdb_RocksIterator_seekForPrevDirect0(
130 JNIEnv
* env
, jobject
/*jobj*/, jlong handle
, jobject jtarget
,
131 jint jtarget_off
, jint jtarget_len
) {
132 auto* it
= reinterpret_cast<ROCKSDB_NAMESPACE::Iterator
*>(handle
);
133 auto seekPrev
= [&it
](ROCKSDB_NAMESPACE::Slice
& target_slice
) {
134 it
->SeekForPrev(target_slice
);
136 ROCKSDB_NAMESPACE::JniUtil::k_op_direct(seekPrev
, env
, jtarget
, jtarget_off
,
141 * Class: org_rocksdb_RocksIterator
142 * Method: seekForPrev0
145 void Java_org_rocksdb_RocksIterator_seekForPrev0(JNIEnv
* env
, jobject
/*jobj*/,
149 jbyte
* target
= env
->GetByteArrayElements(jtarget
, nullptr);
150 if (target
== nullptr) {
151 // exception thrown: OutOfMemoryError
155 ROCKSDB_NAMESPACE::Slice
target_slice(reinterpret_cast<char*>(target
),
158 auto* it
= reinterpret_cast<ROCKSDB_NAMESPACE::Iterator
*>(handle
);
159 it
->SeekForPrev(target_slice
);
161 env
->ReleaseByteArrayElements(jtarget
, target
, JNI_ABORT
);
165 * Class: org_rocksdb_RocksIterator
169 void Java_org_rocksdb_RocksIterator_status0(JNIEnv
* env
, jobject
/*jobj*/,
171 auto* it
= reinterpret_cast<ROCKSDB_NAMESPACE::Iterator
*>(handle
);
172 ROCKSDB_NAMESPACE::Status s
= it
->status();
178 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, s
);
182 * Class: org_rocksdb_RocksIterator
186 jbyteArray
Java_org_rocksdb_RocksIterator_key0(JNIEnv
* env
, jobject
/*jobj*/,
188 auto* it
= reinterpret_cast<ROCKSDB_NAMESPACE::Iterator
*>(handle
);
189 ROCKSDB_NAMESPACE::Slice key_slice
= it
->key();
191 jbyteArray jkey
= env
->NewByteArray(static_cast<jsize
>(key_slice
.size()));
192 if (jkey
== nullptr) {
193 // exception thrown: OutOfMemoryError
196 env
->SetByteArrayRegion(
197 jkey
, 0, static_cast<jsize
>(key_slice
.size()),
198 const_cast<jbyte
*>(reinterpret_cast<const jbyte
*>(key_slice
.data())));
203 * Class: org_rocksdb_RocksIterator
205 * Signature: (JLjava/nio/ByteBuffer;II)I
207 jint
Java_org_rocksdb_RocksIterator_keyDirect0(JNIEnv
* env
, jobject
/*jobj*/,
208 jlong handle
, jobject jtarget
,
211 auto* it
= reinterpret_cast<ROCKSDB_NAMESPACE::Iterator
*>(handle
);
212 ROCKSDB_NAMESPACE::Slice key_slice
= it
->key();
213 return ROCKSDB_NAMESPACE::JniUtil::copyToDirect(env
, key_slice
, jtarget
,
214 jtarget_off
, jtarget_len
);
218 * Class: org_rocksdb_RocksIterator
222 jbyteArray
Java_org_rocksdb_RocksIterator_value0(JNIEnv
* env
, jobject
/*jobj*/,
224 auto* it
= reinterpret_cast<ROCKSDB_NAMESPACE::Iterator
*>(handle
);
225 ROCKSDB_NAMESPACE::Slice value_slice
= it
->value();
227 jbyteArray jkeyValue
=
228 env
->NewByteArray(static_cast<jsize
>(value_slice
.size()));
229 if (jkeyValue
== nullptr) {
230 // exception thrown: OutOfMemoryError
233 env
->SetByteArrayRegion(
234 jkeyValue
, 0, static_cast<jsize
>(value_slice
.size()),
235 const_cast<jbyte
*>(reinterpret_cast<const jbyte
*>(value_slice
.data())));
240 * Class: org_rocksdb_RocksIterator
241 * Method: valueDirect0
242 * Signature: (JLjava/nio/ByteBuffer;II)I
244 jint
Java_org_rocksdb_RocksIterator_valueDirect0(JNIEnv
* env
, jobject
/*jobj*/,
245 jlong handle
, jobject jtarget
,
248 auto* it
= reinterpret_cast<ROCKSDB_NAMESPACE::Iterator
*>(handle
);
249 ROCKSDB_NAMESPACE::Slice value_slice
= it
->value();
250 return ROCKSDB_NAMESPACE::JniUtil::copyToDirect(env
, value_slice
, jtarget
,
251 jtarget_off
, jtarget_len
);