sst_file_reader_iterator.cc 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  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_disposeInternalJni(JNIEnv* /*env*/,
  20. jclass /*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_isValid0Jni(JNIEnv* /*env*/,
  32. jclass /*cls*/,
  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_seekToFirst0Jni(JNIEnv* /*env*/,
  42. jclass /*cls*/,
  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_seekToLast0Jni(JNIEnv* /*env*/,
  52. jclass /*cls*/,
  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_next0Jni(JNIEnv* /*env*/,
  62. jclass /*cls*/,
  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_prev0Jni(JNIEnv* /*env*/,
  72. jclass /*cls*/,
  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_seek0Jni(JNIEnv* env,
  82. jclass /*cls*/,
  83. jlong handle,
  84. jbyteArray jtarget,
  85. jint jtarget_len) {
  86. jbyte* target = env->GetByteArrayElements(jtarget, nullptr);
  87. if (target == nullptr) {
  88. // exception thrown: OutOfMemoryError
  89. return;
  90. }
  91. ROCKSDB_NAMESPACE::Slice target_slice(reinterpret_cast<char*>(target),
  92. jtarget_len);
  93. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  94. it->Seek(target_slice);
  95. env->ReleaseByteArrayElements(jtarget, target, JNI_ABORT);
  96. }
  97. /*
  98. * Class: org_rocksdb_SstFileReaderIterator
  99. * Method: seekForPrev0
  100. * Signature: (J[BI)V
  101. */
  102. void Java_org_rocksdb_SstFileReaderIterator_seekForPrev0Jni(JNIEnv* env,
  103. jclass /*cls*/,
  104. jlong handle,
  105. jbyteArray jtarget,
  106. jint jtarget_len) {
  107. jbyte* target = env->GetByteArrayElements(jtarget, nullptr);
  108. if (target == nullptr) {
  109. // exception thrown: OutOfMemoryError
  110. return;
  111. }
  112. ROCKSDB_NAMESPACE::Slice target_slice(reinterpret_cast<char*>(target),
  113. jtarget_len);
  114. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  115. it->SeekForPrev(target_slice);
  116. env->ReleaseByteArrayElements(jtarget, target, JNI_ABORT);
  117. }
  118. /*
  119. * Class: org_rocksdb_SstFileReaderIterator
  120. * Method: status0
  121. * Signature: (J)V
  122. */
  123. void Java_org_rocksdb_SstFileReaderIterator_status0Jni(JNIEnv* env,
  124. jclass /*cls*/,
  125. jlong handle) {
  126. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  127. ROCKSDB_NAMESPACE::Status s = it->status();
  128. if (s.ok()) {
  129. return;
  130. }
  131. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  132. }
  133. /*
  134. * Class: org_rocksdb_SstFileReaderIterator
  135. * Method: key0
  136. * Signature: (J)[B
  137. */
  138. jbyteArray Java_org_rocksdb_SstFileReaderIterator_key0(JNIEnv* env,
  139. jclass /*jcls*/,
  140. jlong handle) {
  141. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  142. ROCKSDB_NAMESPACE::Slice key_slice = it->key();
  143. jbyteArray jkey = env->NewByteArray(static_cast<jsize>(key_slice.size()));
  144. if (jkey == nullptr) {
  145. // exception thrown: OutOfMemoryError
  146. return nullptr;
  147. }
  148. env->SetByteArrayRegion(
  149. jkey, 0, static_cast<jsize>(key_slice.size()),
  150. const_cast<jbyte*>(reinterpret_cast<const jbyte*>(key_slice.data())));
  151. return jkey;
  152. }
  153. /*
  154. * Class: org_rocksdb_SstFileReaderIterator
  155. * Method: value0
  156. * Signature: (J)[B
  157. */
  158. jbyteArray Java_org_rocksdb_SstFileReaderIterator_value0(JNIEnv* env,
  159. jclass /*jcls*/,
  160. jlong handle) {
  161. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  162. ROCKSDB_NAMESPACE::Slice value_slice = it->value();
  163. jbyteArray jkeyValue =
  164. env->NewByteArray(static_cast<jsize>(value_slice.size()));
  165. if (jkeyValue == nullptr) {
  166. // exception thrown: OutOfMemoryError
  167. return nullptr;
  168. }
  169. env->SetByteArrayRegion(
  170. jkeyValue, 0, static_cast<jsize>(value_slice.size()),
  171. const_cast<jbyte*>(reinterpret_cast<const jbyte*>(value_slice.data())));
  172. return jkeyValue;
  173. }
  174. /*
  175. * Class: org_rocksdb_SstFileReaderIterator
  176. * Method: keyDirect0
  177. * Signature: (JLjava/nio/ByteBuffer;II)I
  178. */
  179. jint Java_org_rocksdb_SstFileReaderIterator_keyDirect0(
  180. JNIEnv* env, jclass /*jcls*/, jlong handle, jobject jtarget,
  181. jint jtarget_off, jint jtarget_len) {
  182. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  183. ROCKSDB_NAMESPACE::Slice key_slice = it->key();
  184. return ROCKSDB_NAMESPACE::JniUtil::copyToDirect(env, key_slice, jtarget,
  185. jtarget_off, 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. *
  191. * Class: org_rocksdb_SstFileReaderIterator
  192. * Method: keyByteArray0
  193. * Signature: (J[BII)I
  194. */
  195. jint Java_org_rocksdb_SstFileReaderIterator_keyByteArray0(
  196. JNIEnv* env, jclass /*jcls*/, jlong handle, jbyteArray jkey, jint jkey_off,
  197. jint jkey_len) {
  198. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  199. ROCKSDB_NAMESPACE::Slice key_slice = it->key();
  200. auto slice_size = key_slice.size();
  201. jsize copy_size = std::min(static_cast<uint32_t>(slice_size),
  202. static_cast<uint32_t>(jkey_len));
  203. env->SetByteArrayRegion(
  204. jkey, jkey_off, copy_size,
  205. const_cast<jbyte*>(reinterpret_cast<const jbyte*>(key_slice.data())));
  206. return static_cast<jsize>(slice_size);
  207. }
  208. /*
  209. * Class: org_rocksdb_SstFileReaderIterator
  210. * Method: valueDirect0
  211. * Signature: (JLjava/nio/ByteBuffer;II)I
  212. */
  213. jint Java_org_rocksdb_SstFileReaderIterator_valueDirect0(
  214. JNIEnv* env, jclass /*jcls*/, jlong handle, jobject jtarget,
  215. jint jtarget_off, jint jtarget_len) {
  216. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  217. ROCKSDB_NAMESPACE::Slice value_slice = it->value();
  218. return ROCKSDB_NAMESPACE::JniUtil::copyToDirect(env, value_slice, jtarget,
  219. jtarget_off, jtarget_len);
  220. }
  221. /*
  222. * This method supports fetching into indirect byte buffers;
  223. * the Java wrapper extracts the byte[] and passes it here.
  224. *
  225. * Class: org_rocksdb_SstFileReaderIterator
  226. * Method: valueByteArray0
  227. * Signature: (J[BII)I
  228. */
  229. jint Java_org_rocksdb_SstFileReaderIterator_valueByteArray0(
  230. JNIEnv* env, jclass /*jcls*/, jlong handle, jbyteArray jvalue_target,
  231. jint jvalue_off, jint jvalue_len) {
  232. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  233. ROCKSDB_NAMESPACE::Slice value_slice = it->value();
  234. auto slice_size = value_slice.size();
  235. jsize copy_size = std::min(static_cast<uint32_t>(slice_size),
  236. static_cast<uint32_t>(jvalue_len));
  237. env->SetByteArrayRegion(
  238. jvalue_target, jvalue_off, copy_size,
  239. const_cast<jbyte*>(reinterpret_cast<const jbyte*>(value_slice.data())));
  240. return static_cast<jsize>(slice_size);
  241. }
  242. /*
  243. * Class: org_rocksdb_SstFileReaderIterator
  244. * Method: seekDirect0
  245. * Signature: (JLjava/nio/ByteBuffer;II)V
  246. */
  247. void Java_org_rocksdb_SstFileReaderIterator_seekDirect0Jni(
  248. JNIEnv* env, jclass /*cls*/, jlong handle, jobject jtarget,
  249. jint jtarget_off, jint jtarget_len) {
  250. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  251. auto seek = [&it](ROCKSDB_NAMESPACE::Slice& target_slice) {
  252. it->Seek(target_slice);
  253. };
  254. ROCKSDB_NAMESPACE::JniUtil::k_op_direct(seek, env, jtarget, jtarget_off,
  255. jtarget_len);
  256. }
  257. /*
  258. * Class: org_rocksdb_SstFileReaderIterator
  259. * Method: seekForPrevDirect0
  260. * Signature: (JLjava/nio/ByteBuffer;II)V
  261. */
  262. void Java_org_rocksdb_SstFileReaderIterator_seekForPrevDirect0Jni(
  263. JNIEnv* env, jclass /*cls*/, jlong handle, jobject jtarget,
  264. jint jtarget_off, jint jtarget_len) {
  265. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  266. auto seekPrev = [&it](ROCKSDB_NAMESPACE::Slice& target_slice) {
  267. it->SeekForPrev(target_slice);
  268. };
  269. ROCKSDB_NAMESPACE::JniUtil::k_op_direct(seekPrev, env, jtarget, jtarget_off,
  270. jtarget_len);
  271. }
  272. /*
  273. * This method supports fetching into indirect byte buffers;
  274. * the Java wrapper extracts the byte[] and passes it here.
  275. *
  276. * Class: org_rocksdb_SstFileReaderIterator
  277. * Method: seekByteArray0
  278. * Signature: (J[BII)V
  279. */
  280. void Java_org_rocksdb_SstFileReaderIterator_seekByteArray0Jni(
  281. JNIEnv* env, jclass /*cls*/, jlong handle, jbyteArray jtarget,
  282. jint jtarget_off, jint jtarget_len) {
  283. const std::unique_ptr<char[]> target(new char[jtarget_len]);
  284. if (target == nullptr) {
  285. jclass oom_class = env->FindClass("/lang/java/OutOfMemoryError");
  286. env->ThrowNew(oom_class,
  287. "Memory allocation failed in RocksDB JNI function");
  288. return;
  289. }
  290. env->GetByteArrayRegion(jtarget, jtarget_off, jtarget_len,
  291. reinterpret_cast<jbyte*>(target.get()));
  292. ROCKSDB_NAMESPACE::Slice target_slice(target.get(), jtarget_len);
  293. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  294. it->Seek(target_slice);
  295. }
  296. /*
  297. * This method supports fetching into indirect byte buffers;
  298. * the Java wrapper extracts the byte[] and passes it here.
  299. *
  300. * Class: org_rocksdb_SstFileReaderIterator
  301. * Method: seekForPrevByteArray0
  302. * Signature: (J[BII)V
  303. */
  304. void Java_org_rocksdb_SstFileReaderIterator_seekForPrevByteArray0Jni(
  305. JNIEnv* env, jclass /*cls*/, jlong handle, jbyteArray jtarget,
  306. jint jtarget_off, jint jtarget_len) {
  307. const std::unique_ptr<char[]> target(new char[jtarget_len]);
  308. if (target == nullptr) {
  309. jclass oom_class = env->FindClass("/lang/java/OutOfMemoryError");
  310. env->ThrowNew(oom_class,
  311. "Memory allocation failed in RocksDB JNI function");
  312. return;
  313. }
  314. env->GetByteArrayRegion(jtarget, jtarget_off, jtarget_len,
  315. reinterpret_cast<jbyte*>(target.get()));
  316. ROCKSDB_NAMESPACE::Slice target_slice(target.get(), jtarget_len);
  317. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  318. it->SeekForPrev(target_slice);
  319. }
  320. /*
  321. * Class: org_rocksdb_SstFileReaderIterator
  322. * Method: refresh0
  323. * Signature: (J)V
  324. */
  325. void Java_org_rocksdb_SstFileReaderIterator_refresh0Jni(JNIEnv* env,
  326. jclass /*cls*/,
  327. jlong handle) {
  328. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  329. ROCKSDB_NAMESPACE::Status s = it->Refresh();
  330. if (s.ok()) {
  331. return;
  332. }
  333. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  334. }
  335. /*
  336. * Class: org_rocksdb_SstFileReaderIterator
  337. * Method: refresh1
  338. * Signature: (JJ)V
  339. */
  340. void Java_org_rocksdb_SstFileReaderIterator_refresh1(JNIEnv* env,
  341. jobject /*jobj*/,
  342. jlong handle,
  343. jlong snapshot_handle) {
  344. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(handle);
  345. auto* snapshot =
  346. reinterpret_cast<ROCKSDB_NAMESPACE::Snapshot*>(snapshot_handle);
  347. ROCKSDB_NAMESPACE::Status s = it->Refresh(snapshot);
  348. if (s.ok()) {
  349. return;
  350. }
  351. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  352. }