iterator.cc 8.6 KB

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