iterator.cc 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  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 "rocksdb/iterator.h"
  9. #include <jni.h>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <algorithm>
  13. #include "include/org_rocksdb_RocksIterator.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_disposeInternalJni(JNIEnv* /*env*/,
  21. jclass /*cls*/,
  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_isValid0Jni(JNIEnv* /*env*/,
  33. jclass /*jcls*/,
  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_seekToFirst0Jni(JNIEnv* /*env*/,
  43. jclass /*jcls*/,
  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_seekToLast0Jni(JNIEnv* /*env*/,
  53. jclass /*jcls*/,
  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_next0Jni(JNIEnv* /*env*/, jclass /*jcls*/,
  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_prev0Jni(JNIEnv* /*env*/, jclass /*jobj*/,
  72. jlong handle) {
  73. reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle)->Prev();
  74. }
  75. /*
  76. * Class: org_rocksdb_RocksIterator
  77. * Method: refresh0
  78. * Signature: (J)V
  79. */
  80. void Java_org_rocksdb_RocksIterator_refresh0Jni(JNIEnv* env, jclass /*jcls*/,
  81. jlong handle) {
  82. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  83. ROCKSDB_NAMESPACE::Status s = it->Refresh();
  84. if (s.ok()) {
  85. return;
  86. }
  87. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  88. }
  89. /*
  90. * Class: org_rocksdb_RocksIterator
  91. * Method: refresh1
  92. * Signature: (JJ)V
  93. */
  94. void Java_org_rocksdb_RocksIterator_refresh1(JNIEnv* env, jobject /*jobj*/,
  95. jlong handle,
  96. jlong snapshot_handle) {
  97. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  98. auto* snapshot =
  99. reinterpret_cast<ROCKSDB_NAMESPACE::Snapshot*>(snapshot_handle);
  100. ROCKSDB_NAMESPACE::Status s = it->Refresh(snapshot);
  101. if (s.ok()) {
  102. return;
  103. }
  104. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  105. }
  106. /*
  107. * Class: org_rocksdb_RocksIterator
  108. * Method: seek0
  109. * Signature: (J[BI)V
  110. */
  111. void Java_org_rocksdb_RocksIterator_seek0Jni(JNIEnv* env, jclass /*jcls*/,
  112. jlong handle, jbyteArray jtarget,
  113. jint jtarget_len) {
  114. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  115. auto seek = [&it](ROCKSDB_NAMESPACE::Slice& target_slice) {
  116. it->Seek(target_slice);
  117. };
  118. ROCKSDB_NAMESPACE::JniUtil::k_op_region(seek, env, jtarget, 0, jtarget_len);
  119. }
  120. /*
  121. * This method supports fetching into indirect byte buffers;
  122. * the Java wrapper extracts the byte[] and passes it here.
  123. * In this case, the buffer offset of the key may be non-zero.
  124. *
  125. * Class: org_rocksdb_RocksIterator
  126. * Method: seek0
  127. * Signature: (J[BII)V
  128. */
  129. void Java_org_rocksdb_RocksIterator_seekByteArray0Jni(
  130. JNIEnv* env, jclass /*jcls*/, jlong handle, jbyteArray jtarget,
  131. jint jtarget_off, jint jtarget_len) {
  132. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  133. auto seek = [&it](ROCKSDB_NAMESPACE::Slice& target_slice) {
  134. it->Seek(target_slice);
  135. };
  136. ROCKSDB_NAMESPACE::JniUtil::k_op_region(seek, env, jtarget, jtarget_off,
  137. jtarget_len);
  138. }
  139. /*
  140. * Class: org_rocksdb_RocksIterator
  141. * Method: seekDirect0
  142. * Signature: (JLjava/nio/ByteBuffer;II)V
  143. */
  144. void Java_org_rocksdb_RocksIterator_seekDirect0Jni(JNIEnv* env, jclass /*jobj*/,
  145. jlong handle,
  146. jobject jtarget,
  147. jint jtarget_off,
  148. jint jtarget_len) {
  149. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  150. auto seek = [&it](ROCKSDB_NAMESPACE::Slice& target_slice) {
  151. it->Seek(target_slice);
  152. };
  153. ROCKSDB_NAMESPACE::JniUtil::k_op_direct(seek, env, jtarget, jtarget_off,
  154. jtarget_len);
  155. }
  156. /*
  157. * Class: org_rocksdb_RocksIterator
  158. * Method: seekForPrevDirect0
  159. * Signature: (JLjava/nio/ByteBuffer;II)V
  160. */
  161. void Java_org_rocksdb_RocksIterator_seekForPrevDirect0Jni(
  162. JNIEnv* env, jclass /*jcls*/, jlong handle, jobject jtarget,
  163. jint jtarget_off, jint jtarget_len) {
  164. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  165. auto seekPrev = [&it](ROCKSDB_NAMESPACE::Slice& target_slice) {
  166. it->SeekForPrev(target_slice);
  167. };
  168. ROCKSDB_NAMESPACE::JniUtil::k_op_direct(seekPrev, env, jtarget, jtarget_off,
  169. jtarget_len);
  170. }
  171. /*
  172. * Class: org_rocksdb_RocksIterator
  173. * Method: seekForPrev0
  174. * Signature: (J[BI)V
  175. */
  176. void Java_org_rocksdb_RocksIterator_seekForPrev0Jni(JNIEnv* env,
  177. jclass /*jcls*/,
  178. jlong handle,
  179. jbyteArray jtarget,
  180. jint jtarget_len) {
  181. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  182. auto seek = [&it](ROCKSDB_NAMESPACE::Slice& target_slice) {
  183. it->SeekForPrev(target_slice);
  184. };
  185. ROCKSDB_NAMESPACE::JniUtil::k_op_region(seek, env, jtarget, 0, jtarget_len);
  186. }
  187. /*
  188. * This method supports fetching into indirect byte buffers;
  189. * the Java wrapper extracts the byte[] and passes it here.
  190. * In this case, the buffer offset of the key may be non-zero.
  191. *
  192. * Class: org_rocksdb_RocksIterator
  193. * Method: seek0
  194. * Signature: (J[BII)V
  195. */
  196. void Java_org_rocksdb_RocksIterator_seekForPrevByteArray0Jni(
  197. JNIEnv* env, jclass /*jcls*/, jlong handle, jbyteArray jtarget,
  198. jint jtarget_off, jint jtarget_len) {
  199. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  200. auto seek = [&it](ROCKSDB_NAMESPACE::Slice& target_slice) {
  201. it->SeekForPrev(target_slice);
  202. };
  203. ROCKSDB_NAMESPACE::JniUtil::k_op_region(seek, env, jtarget, jtarget_off,
  204. jtarget_len);
  205. }
  206. /*
  207. * Class: org_rocksdb_RocksIterator
  208. * Method: status0
  209. * Signature: (J)V
  210. */
  211. void Java_org_rocksdb_RocksIterator_status0Jni(JNIEnv* env, jclass /*jcls*/,
  212. jlong handle) {
  213. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  214. ROCKSDB_NAMESPACE::Status s = it->status();
  215. if (s.ok()) {
  216. return;
  217. }
  218. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  219. }
  220. /*
  221. * Class: org_rocksdb_RocksIterator
  222. * Method: key0
  223. * Signature: (J)[B
  224. */
  225. jbyteArray Java_org_rocksdb_RocksIterator_key0(JNIEnv* env, jclass /*jcls*/,
  226. jlong handle) {
  227. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  228. ROCKSDB_NAMESPACE::Slice key_slice = it->key();
  229. jbyteArray jkey = env->NewByteArray(static_cast<jsize>(key_slice.size()));
  230. if (jkey == nullptr) {
  231. // exception thrown: OutOfMemoryError
  232. return nullptr;
  233. }
  234. env->SetByteArrayRegion(
  235. jkey, 0, static_cast<jsize>(key_slice.size()),
  236. const_cast<jbyte*>(reinterpret_cast<const jbyte*>(key_slice.data())));
  237. return jkey;
  238. }
  239. /*
  240. * Class: org_rocksdb_RocksIterator
  241. * Method: keyDirect0
  242. * Signature: (JLjava/nio/ByteBuffer;II)I
  243. */
  244. jint Java_org_rocksdb_RocksIterator_keyDirect0(JNIEnv* env, jclass /*jcls*/,
  245. jlong handle, jobject jtarget,
  246. jint jtarget_off,
  247. jint jtarget_len) {
  248. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  249. ROCKSDB_NAMESPACE::Slice key_slice = it->key();
  250. return ROCKSDB_NAMESPACE::JniUtil::copyToDirect(env, key_slice, jtarget,
  251. jtarget_off, jtarget_len);
  252. }
  253. /*
  254. * This method supports fetching into indirect byte buffers;
  255. * the Java wrapper extracts the byte[] and passes it here.
  256. *
  257. * Class: org_rocksdb_RocksIterator
  258. * Method: keyByteArray0
  259. * Signature: (J[BII)I
  260. */
  261. jint Java_org_rocksdb_RocksIterator_keyByteArray0(JNIEnv* env, jclass /*jcls*/,
  262. jlong handle, jbyteArray jkey,
  263. jint jkey_off,
  264. jint jkey_len) {
  265. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  266. ROCKSDB_NAMESPACE::Slice key_slice = it->key();
  267. jsize copy_size = std::min(static_cast<uint32_t>(key_slice.size()),
  268. static_cast<uint32_t>(jkey_len));
  269. env->SetByteArrayRegion(
  270. jkey, jkey_off, copy_size,
  271. const_cast<jbyte*>(reinterpret_cast<const jbyte*>(key_slice.data())));
  272. return static_cast<jsize>(key_slice.size());
  273. }
  274. /*
  275. * Class: org_rocksdb_RocksIterator
  276. * Method: value0
  277. * Signature: (J)[B
  278. */
  279. jbyteArray Java_org_rocksdb_RocksIterator_value0(JNIEnv* env, jclass /*jcls*/,
  280. jlong handle) {
  281. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  282. ROCKSDB_NAMESPACE::Slice value_slice = it->value();
  283. jbyteArray jkeyValue =
  284. env->NewByteArray(static_cast<jsize>(value_slice.size()));
  285. if (jkeyValue == nullptr) {
  286. // exception thrown: OutOfMemoryError
  287. return nullptr;
  288. }
  289. env->SetByteArrayRegion(
  290. jkeyValue, 0, static_cast<jsize>(value_slice.size()),
  291. const_cast<jbyte*>(reinterpret_cast<const jbyte*>(value_slice.data())));
  292. return jkeyValue;
  293. }
  294. /*
  295. * Class: org_rocksdb_RocksIterator
  296. * Method: valueDirect0
  297. * Signature: (JLjava/nio/ByteBuffer;II)I
  298. */
  299. jint Java_org_rocksdb_RocksIterator_valueDirect0(JNIEnv* env, jclass /*jcls*/,
  300. jlong handle, jobject jtarget,
  301. jint jtarget_off,
  302. jint jtarget_len) {
  303. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  304. ROCKSDB_NAMESPACE::Slice value_slice = it->value();
  305. return ROCKSDB_NAMESPACE::JniUtil::copyToDirect(env, value_slice, jtarget,
  306. jtarget_off, jtarget_len);
  307. }
  308. /*
  309. * This method supports fetching into indirect byte buffers;
  310. * the Java wrapper extracts the byte[] and passes it here.
  311. *
  312. * Class: org_rocksdb_RocksIterator
  313. * Method: valueByteArray0
  314. * Signature: (J[BII)I
  315. */
  316. jint Java_org_rocksdb_RocksIterator_valueByteArray0(
  317. JNIEnv* env, jclass /*jcls*/, jlong handle, jbyteArray jvalue_target,
  318. jint jvalue_off, jint jvalue_len) {
  319. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  320. ROCKSDB_NAMESPACE::Slice value_slice = it->value();
  321. jsize copy_size = std::min(static_cast<uint32_t>(value_slice.size()),
  322. static_cast<uint32_t>(jvalue_len));
  323. env->SetByteArrayRegion(
  324. jvalue_target, jvalue_off, copy_size,
  325. const_cast<jbyte*>(reinterpret_cast<const jbyte*>(value_slice.data())));
  326. return static_cast<jsize>(value_slice.size());
  327. }