sst_file_reader_iterator.cc 8.8 KB

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