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).
5 //
6 // This file implements the "bridge" between Java and C++ and enables
7 // calling c++ ROCKSDB_NAMESPACE::Iterator methods from Java side.
8
9 #include <jni.h>
10 #include <stdio.h>
11 #include <stdlib.h>
12
13 #include "include/org_rocksdb_SstFileReaderIterator.h"
14 #include "rocksdb/iterator.h"
15 #include "rocksjni/portal.h"
16
17 /*
18 * Class: org_rocksdb_SstFileReaderIterator
19 * Method: disposeInternal
20 * Signature: (J)V
21 */
Java_org_rocksdb_SstFileReaderIterator_disposeInternal(JNIEnv *,jobject,jlong handle)22 void Java_org_rocksdb_SstFileReaderIterator_disposeInternal(JNIEnv* /*env*/,
23 jobject /*jobj*/,
24 jlong handle) {
25 auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
26 assert(it != nullptr);
27 delete it;
28 }
29
30 /*
31 * Class: org_rocksdb_SstFileReaderIterator
32 * Method: isValid0
33 * Signature: (J)Z
34 */
Java_org_rocksdb_SstFileReaderIterator_isValid0(JNIEnv *,jobject,jlong handle)35 jboolean Java_org_rocksdb_SstFileReaderIterator_isValid0(JNIEnv* /*env*/,
36 jobject /*jobj*/,
37 jlong handle) {
38 return reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle)->Valid();
39 }
40
41 /*
42 * Class: org_rocksdb_SstFileReaderIterator
43 * Method: seekToFirst0
44 * Signature: (J)V
45 */
Java_org_rocksdb_SstFileReaderIterator_seekToFirst0(JNIEnv *,jobject,jlong handle)46 void Java_org_rocksdb_SstFileReaderIterator_seekToFirst0(JNIEnv* /*env*/,
47 jobject /*jobj*/,
48 jlong handle) {
49 reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle)->SeekToFirst();
50 }
51
52 /*
53 * Class: org_rocksdb_SstFileReaderIterator
54 * Method: seekToLast0
55 * Signature: (J)V
56 */
Java_org_rocksdb_SstFileReaderIterator_seekToLast0(JNIEnv *,jobject,jlong handle)57 void Java_org_rocksdb_SstFileReaderIterator_seekToLast0(JNIEnv* /*env*/,
58 jobject /*jobj*/,
59 jlong handle) {
60 reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle)->SeekToLast();
61 }
62
63 /*
64 * Class: org_rocksdb_SstFileReaderIterator
65 * Method: next0
66 * Signature: (J)V
67 */
Java_org_rocksdb_SstFileReaderIterator_next0(JNIEnv *,jobject,jlong handle)68 void Java_org_rocksdb_SstFileReaderIterator_next0(JNIEnv* /*env*/,
69 jobject /*jobj*/,
70 jlong handle) {
71 reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle)->Next();
72 }
73
74 /*
75 * Class: org_rocksdb_SstFileReaderIterator
76 * Method: prev0
77 * Signature: (J)V
78 */
Java_org_rocksdb_SstFileReaderIterator_prev0(JNIEnv *,jobject,jlong handle)79 void Java_org_rocksdb_SstFileReaderIterator_prev0(JNIEnv* /*env*/,
80 jobject /*jobj*/,
81 jlong handle) {
82 reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle)->Prev();
83 }
84
85 /*
86 * Class: org_rocksdb_SstFileReaderIterator
87 * Method: seek0
88 * Signature: (J[BI)V
89 */
Java_org_rocksdb_SstFileReaderIterator_seek0(JNIEnv * env,jobject,jlong handle,jbyteArray jtarget,jint jtarget_len)90 void Java_org_rocksdb_SstFileReaderIterator_seek0(JNIEnv* env, jobject /*jobj*/,
91 jlong handle,
92 jbyteArray jtarget,
93 jint jtarget_len) {
94 jbyte* target = env->GetByteArrayElements(jtarget, nullptr);
95 if (target == nullptr) {
96 // exception thrown: OutOfMemoryError
97 return;
98 }
99
100 ROCKSDB_NAMESPACE::Slice target_slice(reinterpret_cast<char*>(target),
101 jtarget_len);
102
103 auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
104 it->Seek(target_slice);
105
106 env->ReleaseByteArrayElements(jtarget, target, JNI_ABORT);
107 }
108
109 /*
110 * Class: org_rocksdb_SstFileReaderIterator
111 * Method: seekForPrev0
112 * Signature: (J[BI)V
113 */
Java_org_rocksdb_SstFileReaderIterator_seekForPrev0(JNIEnv * env,jobject,jlong handle,jbyteArray jtarget,jint jtarget_len)114 void Java_org_rocksdb_SstFileReaderIterator_seekForPrev0(JNIEnv* env,
115 jobject /*jobj*/,
116 jlong handle,
117 jbyteArray jtarget,
118 jint jtarget_len) {
119 jbyte* target = env->GetByteArrayElements(jtarget, nullptr);
120 if (target == nullptr) {
121 // exception thrown: OutOfMemoryError
122 return;
123 }
124
125 ROCKSDB_NAMESPACE::Slice target_slice(reinterpret_cast<char*>(target),
126 jtarget_len);
127
128 auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
129 it->SeekForPrev(target_slice);
130
131 env->ReleaseByteArrayElements(jtarget, target, JNI_ABORT);
132 }
133
134 /*
135 * Class: org_rocksdb_SstFileReaderIterator
136 * Method: status0
137 * Signature: (J)V
138 */
Java_org_rocksdb_SstFileReaderIterator_status0(JNIEnv * env,jobject,jlong handle)139 void Java_org_rocksdb_SstFileReaderIterator_status0(JNIEnv* env,
140 jobject /*jobj*/,
141 jlong handle) {
142 auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
143 ROCKSDB_NAMESPACE::Status s = it->status();
144
145 if (s.ok()) {
146 return;
147 }
148
149 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
150 }
151
152 /*
153 * Class: org_rocksdb_SstFileReaderIterator
154 * Method: key0
155 * Signature: (J)[B
156 */
Java_org_rocksdb_SstFileReaderIterator_key0(JNIEnv * env,jobject,jlong handle)157 jbyteArray Java_org_rocksdb_SstFileReaderIterator_key0(JNIEnv* env,
158 jobject /*jobj*/,
159 jlong handle) {
160 auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
161 ROCKSDB_NAMESPACE::Slice key_slice = it->key();
162
163 jbyteArray jkey = env->NewByteArray(static_cast<jsize>(key_slice.size()));
164 if (jkey == nullptr) {
165 // exception thrown: OutOfMemoryError
166 return nullptr;
167 }
168 env->SetByteArrayRegion(
169 jkey, 0, static_cast<jsize>(key_slice.size()),
170 const_cast<jbyte*>(reinterpret_cast<const jbyte*>(key_slice.data())));
171 return jkey;
172 }
173
174 /*
175 * Class: org_rocksdb_SstFileReaderIterator
176 * Method: value0
177 * Signature: (J)[B
178 */
Java_org_rocksdb_SstFileReaderIterator_value0(JNIEnv * env,jobject,jlong handle)179 jbyteArray Java_org_rocksdb_SstFileReaderIterator_value0(JNIEnv* env, jobject /*jobj*/,
180 jlong handle) {
181 auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
182 ROCKSDB_NAMESPACE::Slice value_slice = it->value();
183
184 jbyteArray jkeyValue =
185 env->NewByteArray(static_cast<jsize>(value_slice.size()));
186 if (jkeyValue == nullptr) {
187 // exception thrown: OutOfMemoryError
188 return nullptr;
189 }
190 env->SetByteArrayRegion(jkeyValue, 0, static_cast<jsize>(value_slice.size()),
191 const_cast<jbyte*>(reinterpret_cast<const jbyte*>(value_slice.data())));
192 return jkeyValue;
193 }
194
195 /*
196 * Class: org_rocksdb_SstFileReaderIterator
197 * Method: keyDirect0
198 * Signature: (JLjava/nio/ByteBuffer;II)I
199 */
Java_org_rocksdb_SstFileReaderIterator_keyDirect0(JNIEnv * env,jobject,jlong handle,jobject jtarget,jint jtarget_off,jint jtarget_len)200 jint Java_org_rocksdb_SstFileReaderIterator_keyDirect0(
201 JNIEnv* env, jobject /*jobj*/, jlong handle, jobject jtarget,
202 jint jtarget_off, jint jtarget_len) {
203 auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
204 ROCKSDB_NAMESPACE::Slice key_slice = it->key();
205 return ROCKSDB_NAMESPACE::JniUtil::copyToDirect(env, key_slice, jtarget,
206 jtarget_off, jtarget_len);
207 }
208
209 /*
210 * Class: org_rocksdb_SstFileReaderIterator
211 * Method: valueDirect0
212 * Signature: (JLjava/nio/ByteBuffer;II)I
213 */
Java_org_rocksdb_SstFileReaderIterator_valueDirect0(JNIEnv * env,jobject,jlong handle,jobject jtarget,jint jtarget_off,jint jtarget_len)214 jint Java_org_rocksdb_SstFileReaderIterator_valueDirect0(
215 JNIEnv* env, jobject /*jobj*/, jlong handle, jobject jtarget,
216 jint jtarget_off, jint jtarget_len) {
217 auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
218 ROCKSDB_NAMESPACE::Slice value_slice = it->value();
219 return ROCKSDB_NAMESPACE::JniUtil::copyToDirect(env, value_slice, jtarget,
220 jtarget_off, jtarget_len);
221 }
222
223 /*
224 * Class: org_rocksdb_SstFileReaderIterator
225 * Method: seekDirect0
226 * Signature: (JLjava/nio/ByteBuffer;II)V
227 */
Java_org_rocksdb_SstFileReaderIterator_seekDirect0(JNIEnv * env,jobject,jlong handle,jobject jtarget,jint jtarget_off,jint jtarget_len)228 void Java_org_rocksdb_SstFileReaderIterator_seekDirect0(
229 JNIEnv* env, jobject /*jobj*/, jlong handle, jobject jtarget,
230 jint jtarget_off, jint jtarget_len) {
231 auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
232 auto seek = [&it](ROCKSDB_NAMESPACE::Slice& target_slice) {
233 it->Seek(target_slice);
234 };
235 ROCKSDB_NAMESPACE::JniUtil::k_op_direct(seek, env, jtarget, jtarget_off,
236 jtarget_len);
237 }
238
239 /*
240 * Class: org_rocksdb_SstFileReaderIterator
241 * Method: seekForPrevDirect0
242 * Signature: (JLjava/nio/ByteBuffer;II)V
243 */
Java_org_rocksdb_SstFileReaderIterator_seekForPrevDirect0(JNIEnv * env,jobject,jlong handle,jobject jtarget,jint jtarget_off,jint jtarget_len)244 void Java_org_rocksdb_SstFileReaderIterator_seekForPrevDirect0(
245 JNIEnv* env, jobject /*jobj*/, jlong handle, jobject jtarget,
246 jint jtarget_off, jint jtarget_len) {
247 auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
248 auto seekPrev = [&it](ROCKSDB_NAMESPACE::Slice& target_slice) {
249 it->SeekForPrev(target_slice);
250 };
251 ROCKSDB_NAMESPACE::JniUtil::k_op_direct(seekPrev, env, jtarget, jtarget_off,
252 jtarget_len);
253 }
254