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