write_batch_with_index.cc 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966
  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::WriteBatchWithIndex methods from Java side.
  8. #include "rocksdb/utilities/write_batch_with_index.h"
  9. #include "include/org_rocksdb_WBWIRocksIterator.h"
  10. #include "include/org_rocksdb_WriteBatchWithIndex.h"
  11. #include "rocksdb/comparator.h"
  12. #include "rocksjni/cplusplus_to_java_convert.h"
  13. #include "rocksjni/portal.h"
  14. /*
  15. * Class: org_rocksdb_WriteBatchWithIndex
  16. * Method: newWriteBatchWithIndex
  17. * Signature: ()J
  18. */
  19. jlong Java_org_rocksdb_WriteBatchWithIndex_newWriteBatchWithIndex__(
  20. JNIEnv* /*env*/, jclass /*jcls*/) {
  21. auto* wbwi = new ROCKSDB_NAMESPACE::WriteBatchWithIndex();
  22. return GET_CPLUSPLUS_POINTER(wbwi);
  23. }
  24. /*
  25. * Class: org_rocksdb_WriteBatchWithIndex
  26. * Method: newWriteBatchWithIndex
  27. * Signature: (Z)J
  28. */
  29. jlong Java_org_rocksdb_WriteBatchWithIndex_newWriteBatchWithIndex__Z(
  30. JNIEnv* /*env*/, jclass /*jcls*/, jboolean joverwrite_key) {
  31. auto* wbwi = new ROCKSDB_NAMESPACE::WriteBatchWithIndex(
  32. ROCKSDB_NAMESPACE::BytewiseComparator(), 0,
  33. static_cast<bool>(joverwrite_key));
  34. return GET_CPLUSPLUS_POINTER(wbwi);
  35. }
  36. /*
  37. * Class: org_rocksdb_WriteBatchWithIndex
  38. * Method: newWriteBatchWithIndex
  39. * Signature: (JBIZ)J
  40. */
  41. jlong Java_org_rocksdb_WriteBatchWithIndex_newWriteBatchWithIndex__JBIZ(
  42. JNIEnv* /*env*/, jclass /*jcls*/, jlong jfallback_index_comparator_handle,
  43. jbyte jcomparator_type, jint jreserved_bytes, jboolean joverwrite_key) {
  44. ROCKSDB_NAMESPACE::Comparator* fallback_comparator = nullptr;
  45. switch (jcomparator_type) {
  46. // JAVA_COMPARATOR
  47. case 0x0:
  48. fallback_comparator =
  49. reinterpret_cast<ROCKSDB_NAMESPACE::ComparatorJniCallback*>(
  50. jfallback_index_comparator_handle);
  51. break;
  52. // JAVA_NATIVE_COMPARATOR_WRAPPER
  53. case 0x1:
  54. fallback_comparator = reinterpret_cast<ROCKSDB_NAMESPACE::Comparator*>(
  55. jfallback_index_comparator_handle);
  56. break;
  57. }
  58. auto* wbwi = new ROCKSDB_NAMESPACE::WriteBatchWithIndex(
  59. fallback_comparator, static_cast<size_t>(jreserved_bytes),
  60. static_cast<bool>(joverwrite_key));
  61. return GET_CPLUSPLUS_POINTER(wbwi);
  62. }
  63. /*
  64. * Class: org_rocksdb_WriteBatchWithIndex
  65. * Method: count0
  66. * Signature: (J)I
  67. */
  68. jint Java_org_rocksdb_WriteBatchWithIndex_count0Jni(JNIEnv* /*env*/,
  69. jclass /*jcls*/,
  70. jlong jwbwi_handle) {
  71. auto* wbwi =
  72. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  73. assert(wbwi != nullptr);
  74. return static_cast<jint>(wbwi->GetWriteBatch()->Count());
  75. }
  76. /*
  77. * Class: org_rocksdb_WriteBatchWithIndex
  78. * Method: put
  79. * Signature: (J[BI[BI)V
  80. */
  81. void Java_org_rocksdb_WriteBatchWithIndex_putJni__J_3BI_3BI(
  82. JNIEnv* env, jclass, jlong jwbwi_handle, jbyteArray jkey, jint jkey_len,
  83. jbyteArray jentry_value, jint jentry_value_len) {
  84. auto* wbwi =
  85. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  86. assert(wbwi != nullptr);
  87. auto put = [&wbwi](ROCKSDB_NAMESPACE::Slice key,
  88. ROCKSDB_NAMESPACE::Slice value) {
  89. return wbwi->Put(key, value);
  90. };
  91. std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =
  92. ROCKSDB_NAMESPACE::JniUtil::kv_op(put, env, jkey, jkey_len, jentry_value,
  93. jentry_value_len);
  94. if (status != nullptr && !status->ok()) {
  95. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);
  96. }
  97. }
  98. /*
  99. * Class: org_rocksdb_WriteBatchWithIndex
  100. * Method: put
  101. * Signature: (J[BI[BIJ)V
  102. */
  103. void Java_org_rocksdb_WriteBatchWithIndex_putJni__J_3BI_3BIJ(
  104. JNIEnv* env, jclass, jlong jwbwi_handle, jbyteArray jkey, jint jkey_len,
  105. jbyteArray jentry_value, jint jentry_value_len, jlong jcf_handle) {
  106. auto* wbwi =
  107. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  108. assert(wbwi != nullptr);
  109. auto* cf_handle =
  110. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  111. assert(cf_handle != nullptr);
  112. auto put = [&wbwi, &cf_handle](ROCKSDB_NAMESPACE::Slice key,
  113. ROCKSDB_NAMESPACE::Slice value) {
  114. return wbwi->Put(cf_handle, key, value);
  115. };
  116. std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =
  117. ROCKSDB_NAMESPACE::JniUtil::kv_op(put, env, jkey, jkey_len, jentry_value,
  118. jentry_value_len);
  119. if (status != nullptr && !status->ok()) {
  120. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);
  121. }
  122. }
  123. /*
  124. * Class: org_rocksdb_WriteBatchWithIndex
  125. * Method: putDirect
  126. * Signature: (JLjava/nio/ByteBuffer;IILjava/nio/ByteBuffer;IIJ)V
  127. */
  128. void Java_org_rocksdb_WriteBatchWithIndex_putDirectJni(
  129. JNIEnv* env, jclass /*jobj*/, jlong jwb_handle, jobject jkey,
  130. jint jkey_offset, jint jkey_len, jobject jval, jint jval_offset,
  131. jint jval_len, jlong jcf_handle) {
  132. auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
  133. assert(wb != nullptr);
  134. auto* cf_handle =
  135. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  136. auto put = [&wb, &cf_handle](ROCKSDB_NAMESPACE::Slice& key,
  137. ROCKSDB_NAMESPACE::Slice& value) {
  138. if (cf_handle == nullptr) {
  139. wb->Put(key, value);
  140. } else {
  141. wb->Put(cf_handle, key, value);
  142. }
  143. };
  144. ROCKSDB_NAMESPACE::JniUtil::kv_op_direct(
  145. put, env, jkey, jkey_offset, jkey_len, jval, jval_offset, jval_len);
  146. }
  147. /*
  148. * Class: org_rocksdb_WriteBatchWithIndex
  149. * Method: merge
  150. * Signature: (J[BI[BI)V
  151. */
  152. void Java_org_rocksdb_WriteBatchWithIndex_mergeJni__J_3BI_3BI(
  153. JNIEnv* env, jclass, jlong jwbwi_handle, jbyteArray jkey, jint jkey_len,
  154. jbyteArray jentry_value, jint jentry_value_len) {
  155. auto* wbwi =
  156. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  157. assert(wbwi != nullptr);
  158. auto merge = [&wbwi](ROCKSDB_NAMESPACE::Slice key,
  159. ROCKSDB_NAMESPACE::Slice value) {
  160. return wbwi->Merge(key, value);
  161. };
  162. std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =
  163. ROCKSDB_NAMESPACE::JniUtil::kv_op(merge, env, jkey, jkey_len,
  164. jentry_value, jentry_value_len);
  165. if (status != nullptr && !status->ok()) {
  166. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);
  167. }
  168. }
  169. /*
  170. * Class: org_rocksdb_WriteBatchWithIndex
  171. * Method: merge
  172. * Signature: (J[BI[BIJ)V
  173. */
  174. void Java_org_rocksdb_WriteBatchWithIndex_mergeJni__J_3BI_3BIJ(
  175. JNIEnv* env, jclass, jlong jwbwi_handle, jbyteArray jkey, jint jkey_len,
  176. jbyteArray jentry_value, jint jentry_value_len, jlong jcf_handle) {
  177. auto* wbwi =
  178. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  179. assert(wbwi != nullptr);
  180. auto* cf_handle =
  181. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  182. assert(cf_handle != nullptr);
  183. auto merge = [&wbwi, &cf_handle](ROCKSDB_NAMESPACE::Slice key,
  184. ROCKSDB_NAMESPACE::Slice value) {
  185. return wbwi->Merge(cf_handle, key, value);
  186. };
  187. std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =
  188. ROCKSDB_NAMESPACE::JniUtil::kv_op(merge, env, jkey, jkey_len,
  189. jentry_value, jentry_value_len);
  190. if (status != nullptr && !status->ok()) {
  191. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);
  192. }
  193. }
  194. /*
  195. * Class: org_rocksdb_WriteBatchWithIndex
  196. * Method: delete
  197. * Signature: (J[BI)V
  198. */
  199. void Java_org_rocksdb_WriteBatchWithIndex_deleteJni__J_3BI(JNIEnv* env, jclass,
  200. jlong jwbwi_handle,
  201. jbyteArray jkey,
  202. jint jkey_len) {
  203. auto* wbwi =
  204. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  205. assert(wbwi != nullptr);
  206. auto remove = [&wbwi](ROCKSDB_NAMESPACE::Slice key) {
  207. return wbwi->Delete(key);
  208. };
  209. std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =
  210. ROCKSDB_NAMESPACE::JniUtil::k_op(remove, env, jkey, jkey_len);
  211. if (status != nullptr && !status->ok()) {
  212. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);
  213. }
  214. }
  215. /*
  216. * Class: org_rocksdb_WriteBatchWithIndex
  217. * Method: delete
  218. * Signature: (J[BIJ)V
  219. */
  220. void Java_org_rocksdb_WriteBatchWithIndex_deleteJni__J_3BIJ(JNIEnv* env, jclass,
  221. jlong jwbwi_handle,
  222. jbyteArray jkey,
  223. jint jkey_len,
  224. jlong jcf_handle) {
  225. auto* wbwi =
  226. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  227. assert(wbwi != nullptr);
  228. auto* cf_handle =
  229. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  230. assert(cf_handle != nullptr);
  231. auto remove = [&wbwi, &cf_handle](ROCKSDB_NAMESPACE::Slice key) {
  232. return wbwi->Delete(cf_handle, key);
  233. };
  234. std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =
  235. ROCKSDB_NAMESPACE::JniUtil::k_op(remove, env, jkey, jkey_len);
  236. if (status != nullptr && !status->ok()) {
  237. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);
  238. }
  239. }
  240. /*
  241. * Class: org_rocksdb_WriteBatchWithIndex
  242. * Method: singleDelete
  243. * Signature: (J[BI)V
  244. */
  245. void Java_org_rocksdb_WriteBatchWithIndex_singleDeleteJni__J_3BI(
  246. JNIEnv* env, jclass, jlong jwbwi_handle, jbyteArray jkey, jint jkey_len) {
  247. auto* wbwi =
  248. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  249. assert(wbwi != nullptr);
  250. auto single_delete = [&wbwi](ROCKSDB_NAMESPACE::Slice key) {
  251. return wbwi->SingleDelete(key);
  252. };
  253. std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =
  254. ROCKSDB_NAMESPACE::JniUtil::k_op(single_delete, env, jkey, jkey_len);
  255. if (status != nullptr && !status->ok()) {
  256. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);
  257. }
  258. }
  259. /*
  260. * Class: org_rocksdb_WriteBatchWithIndex
  261. * Method: singleDelete
  262. * Signature: (J[BIJ)V
  263. */
  264. void Java_org_rocksdb_WriteBatchWithIndex_singleDeleteJni__J_3BIJ(
  265. JNIEnv* env, jclass, jlong jwbwi_handle, jbyteArray jkey, jint jkey_len,
  266. jlong jcf_handle) {
  267. auto* wbwi =
  268. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  269. assert(wbwi != nullptr);
  270. auto* cf_handle =
  271. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  272. assert(cf_handle != nullptr);
  273. auto single_delete = [&wbwi, &cf_handle](ROCKSDB_NAMESPACE::Slice key) {
  274. return wbwi->SingleDelete(cf_handle, key);
  275. };
  276. std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =
  277. ROCKSDB_NAMESPACE::JniUtil::k_op(single_delete, env, jkey, jkey_len);
  278. if (status != nullptr && !status->ok()) {
  279. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);
  280. }
  281. }
  282. /*
  283. * Class: org_rocksdb_WriteBatchWithIndex
  284. * Method: deleteDirect
  285. * Signature: (JLjava/nio/ByteBuffer;IIJ)V
  286. */
  287. void Java_org_rocksdb_WriteBatchWithIndex_deleteDirectJni(
  288. JNIEnv* env, jclass /*jobj*/, jlong jwb_handle, jobject jkey,
  289. jint jkey_offset, jint jkey_len, jlong jcf_handle) {
  290. auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
  291. assert(wb != nullptr);
  292. auto* cf_handle =
  293. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  294. auto remove = [&wb, &cf_handle](ROCKSDB_NAMESPACE::Slice& key) {
  295. if (cf_handle == nullptr) {
  296. wb->Delete(key);
  297. } else {
  298. wb->Delete(cf_handle, key);
  299. }
  300. };
  301. ROCKSDB_NAMESPACE::JniUtil::k_op_direct(remove, env, jkey, jkey_offset,
  302. jkey_len);
  303. }
  304. /*
  305. * Class: org_rocksdb_WriteBatchWithIndex
  306. * Method: deleteRange
  307. * Signature: (J[BI[BI)V
  308. */
  309. void Java_org_rocksdb_WriteBatchWithIndex_deleteRangeJni__J_3BI_3BI(
  310. JNIEnv* env, jclass, jlong jwbwi_handle, jbyteArray jbegin_key,
  311. jint jbegin_key_len, jbyteArray jend_key, jint jend_key_len) {
  312. auto* wbwi =
  313. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  314. assert(wbwi != nullptr);
  315. auto deleteRange = [&wbwi](ROCKSDB_NAMESPACE::Slice beginKey,
  316. ROCKSDB_NAMESPACE::Slice endKey) {
  317. return wbwi->DeleteRange(beginKey, endKey);
  318. };
  319. std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =
  320. ROCKSDB_NAMESPACE::JniUtil::kv_op(deleteRange, env, jbegin_key,
  321. jbegin_key_len, jend_key, jend_key_len);
  322. if (status != nullptr && !status->ok()) {
  323. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);
  324. }
  325. }
  326. /*
  327. * Class: org_rocksdb_WriteBatchWithIndex
  328. * Method: deleteRange
  329. * Signature: (J[BI[BIJ)V
  330. */
  331. void Java_org_rocksdb_WriteBatchWithIndex_deleteRangeJni__J_3BI_3BIJ(
  332. JNIEnv* env, jclass, jlong jwbwi_handle, jbyteArray jbegin_key,
  333. jint jbegin_key_len, jbyteArray jend_key, jint jend_key_len,
  334. jlong jcf_handle) {
  335. auto* wbwi =
  336. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  337. assert(wbwi != nullptr);
  338. auto* cf_handle =
  339. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  340. assert(cf_handle != nullptr);
  341. auto deleteRange = [&wbwi, &cf_handle](ROCKSDB_NAMESPACE::Slice beginKey,
  342. ROCKSDB_NAMESPACE::Slice endKey) {
  343. return wbwi->DeleteRange(cf_handle, beginKey, endKey);
  344. };
  345. std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =
  346. ROCKSDB_NAMESPACE::JniUtil::kv_op(deleteRange, env, jbegin_key,
  347. jbegin_key_len, jend_key, jend_key_len);
  348. if (status != nullptr && !status->ok()) {
  349. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);
  350. }
  351. }
  352. /*
  353. * Class: org_rocksdb_WriteBatchWithIndex
  354. * Method: putLogData
  355. * Signature: (J[BI)V
  356. */
  357. void Java_org_rocksdb_WriteBatchWithIndex_putLogDataJni(JNIEnv* env, jclass,
  358. jlong jwbwi_handle,
  359. jbyteArray jblob,
  360. jint jblob_len) {
  361. auto* wbwi =
  362. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  363. assert(wbwi != nullptr);
  364. auto putLogData = [&wbwi](ROCKSDB_NAMESPACE::Slice blob) {
  365. return wbwi->PutLogData(blob);
  366. };
  367. std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =
  368. ROCKSDB_NAMESPACE::JniUtil::k_op(putLogData, env, jblob, jblob_len);
  369. if (status != nullptr && !status->ok()) {
  370. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);
  371. }
  372. }
  373. /*
  374. * Class: org_rocksdb_WriteBatchWithIndex
  375. * Method: clear
  376. * Signature: (J)V
  377. */
  378. void Java_org_rocksdb_WriteBatchWithIndex_clear0Jni(JNIEnv* /*env*/,
  379. jclass /*jobj*/,
  380. jlong jwbwi_handle) {
  381. auto* wbwi =
  382. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  383. assert(wbwi != nullptr);
  384. wbwi->Clear();
  385. }
  386. /*
  387. * Class: org_rocksdb_WriteBatchWithIndex
  388. * Method: setSavePoint0
  389. * Signature: (J)V
  390. */
  391. void Java_org_rocksdb_WriteBatchWithIndex_setSavePoint0Jni(JNIEnv* /*env*/,
  392. jclass /*jcls*/,
  393. jlong jwbwi_handle) {
  394. auto* wbwi =
  395. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  396. assert(wbwi != nullptr);
  397. wbwi->SetSavePoint();
  398. }
  399. /*
  400. * Class: org_rocksdb_WriteBatchWithIndex
  401. * Method: rollbackToSavePoint0
  402. * Signature: (J)V
  403. */
  404. void Java_org_rocksdb_WriteBatchWithIndex_rollbackToSavePoint0Jni(
  405. JNIEnv* env, jclass /*jobj*/, jlong jwbwi_handle) {
  406. auto* wbwi =
  407. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  408. assert(wbwi != nullptr);
  409. auto s = wbwi->RollbackToSavePoint();
  410. if (s.ok()) {
  411. return;
  412. }
  413. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  414. }
  415. /*
  416. * Class: org_rocksdb_WriteBatchWithIndex
  417. * Method: popSavePoint
  418. * Signature: (J)V
  419. */
  420. void Java_org_rocksdb_WriteBatchWithIndex_popSavePointJni(JNIEnv* env,
  421. jclass /*jobj*/,
  422. jlong jwbwi_handle) {
  423. auto* wbwi =
  424. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  425. assert(wbwi != nullptr);
  426. auto s = wbwi->PopSavePoint();
  427. if (s.ok()) {
  428. return;
  429. }
  430. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  431. }
  432. /*
  433. * Class: org_rocksdb_WriteBatchWithIndex
  434. * Method: setMaxBytes
  435. * Signature: (JJ)V
  436. */
  437. void Java_org_rocksdb_WriteBatchWithIndex_setMaxBytesJni(JNIEnv* /*env*/,
  438. jclass /*cls*/,
  439. jlong jwbwi_handle,
  440. jlong jmax_bytes) {
  441. auto* wbwi =
  442. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  443. assert(wbwi != nullptr);
  444. wbwi->SetMaxBytes(static_cast<size_t>(jmax_bytes));
  445. }
  446. /*
  447. * Class: org_rocksdb_WriteBatchWithIndex
  448. * Method: getWriteBatch
  449. * Signature: (J)Lorg/rocksdb/WriteBatch;
  450. */
  451. jobject Java_org_rocksdb_WriteBatchWithIndex_getWriteBatchJni(
  452. JNIEnv* env, jclass /*jobj*/, jlong jwbwi_handle) {
  453. auto* wbwi =
  454. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  455. assert(wbwi != nullptr);
  456. auto* wb = wbwi->GetWriteBatch();
  457. // TODO(AR) is the `wb` object owned by us?
  458. return ROCKSDB_NAMESPACE::WriteBatchJni::construct(env, wb);
  459. }
  460. /*
  461. * Class: org_rocksdb_WriteBatchWithIndex
  462. * Method: iterator0
  463. * Signature: (J)J
  464. */
  465. jlong Java_org_rocksdb_WriteBatchWithIndex_iterator0(JNIEnv* /*env*/,
  466. jclass /*jcls*/,
  467. jlong jwbwi_handle) {
  468. auto* wbwi =
  469. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  470. auto* wbwi_iterator = wbwi->NewIterator();
  471. return GET_CPLUSPLUS_POINTER(wbwi_iterator);
  472. }
  473. /*
  474. * Class: org_rocksdb_WriteBatchWithIndex
  475. * Method: iterator1
  476. * Signature: (JJ)J
  477. */
  478. jlong Java_org_rocksdb_WriteBatchWithIndex_iterator1(JNIEnv* /*env*/,
  479. jclass /*jcls*/,
  480. jlong jwbwi_handle,
  481. jlong jcf_handle) {
  482. auto* wbwi =
  483. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  484. auto* cf_handle =
  485. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  486. auto* wbwi_iterator = wbwi->NewIterator(cf_handle);
  487. return GET_CPLUSPLUS_POINTER(wbwi_iterator);
  488. }
  489. /*
  490. * Class: org_rocksdb_WriteBatchWithIndex
  491. * Method: iteratorWithBase
  492. * Signature: (JJJJ)J
  493. */
  494. jlong Java_org_rocksdb_WriteBatchWithIndex_iteratorWithBase(
  495. JNIEnv*, jclass, jlong jwbwi_handle, jlong jcf_handle,
  496. jlong jbase_iterator_handle, jlong jread_opts_handle) {
  497. auto* wbwi =
  498. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  499. auto* cf_handle =
  500. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  501. auto* base_iterator =
  502. reinterpret_cast<ROCKSDB_NAMESPACE::Iterator*>(jbase_iterator_handle);
  503. ROCKSDB_NAMESPACE::ReadOptions* read_opts =
  504. jread_opts_handle == 0
  505. ? nullptr
  506. : reinterpret_cast<ROCKSDB_NAMESPACE::ReadOptions*>(
  507. jread_opts_handle);
  508. auto* iterator =
  509. wbwi->NewIteratorWithBase(cf_handle, base_iterator, read_opts);
  510. return GET_CPLUSPLUS_POINTER(iterator);
  511. }
  512. /*
  513. * Class: org_rocksdb_WriteBatchWithIndex
  514. * Method: getFromBatch
  515. * Signature: (JJ[BI)[B
  516. */
  517. jbyteArray JNICALL Java_org_rocksdb_WriteBatchWithIndex_getFromBatch__JJ_3BI(
  518. JNIEnv* env, jclass /*jcls*/, jlong jwbwi_handle, jlong jdbopt_handle,
  519. jbyteArray jkey, jint jkey_len) {
  520. auto* wbwi =
  521. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  522. auto* dbopt = reinterpret_cast<ROCKSDB_NAMESPACE::DBOptions*>(jdbopt_handle);
  523. auto getter = [&wbwi, &dbopt](const ROCKSDB_NAMESPACE::Slice& key,
  524. std::string* value) {
  525. return wbwi->GetFromBatch(*dbopt, key, value);
  526. };
  527. return ROCKSDB_NAMESPACE::JniUtil::v_op(getter, env, jkey, jkey_len);
  528. }
  529. /*
  530. * Class: org_rocksdb_WriteBatchWithIndex
  531. * Method: getFromBatch
  532. * Signature: (JJ[BIJ)[B
  533. */
  534. jbyteArray Java_org_rocksdb_WriteBatchWithIndex_getFromBatch__JJ_3BIJ(
  535. JNIEnv* env, jclass /*jcls*/, jlong jwbwi_handle, jlong jdbopt_handle,
  536. jbyteArray jkey, jint jkey_len, jlong jcf_handle) {
  537. auto* wbwi =
  538. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  539. auto* dbopt = reinterpret_cast<ROCKSDB_NAMESPACE::DBOptions*>(jdbopt_handle);
  540. auto* cf_handle =
  541. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  542. auto getter = [&wbwi, &cf_handle, &dbopt](const ROCKSDB_NAMESPACE::Slice& key,
  543. std::string* value) {
  544. return wbwi->GetFromBatch(cf_handle, *dbopt, key, value);
  545. };
  546. return ROCKSDB_NAMESPACE::JniUtil::v_op(getter, env, jkey, jkey_len);
  547. }
  548. /*
  549. * Class: org_rocksdb_WriteBatchWithIndex
  550. * Method: getFromBatchAndDB
  551. * Signature: (JJJ[BI)[B
  552. */
  553. jbyteArray Java_org_rocksdb_WriteBatchWithIndex_getFromBatchAndDB__JJJ_3BI(
  554. JNIEnv* env, jclass /*jcls*/, jlong jwbwi_handle, jlong jdb_handle,
  555. jlong jreadopt_handle, jbyteArray jkey, jint jkey_len) {
  556. auto* wbwi =
  557. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  558. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  559. auto* readopt =
  560. reinterpret_cast<ROCKSDB_NAMESPACE::ReadOptions*>(jreadopt_handle);
  561. auto getter = [&wbwi, &db, &readopt](const ROCKSDB_NAMESPACE::Slice& key,
  562. std::string* value) {
  563. return wbwi->GetFromBatchAndDB(db, *readopt, key, value);
  564. };
  565. return ROCKSDB_NAMESPACE::JniUtil::v_op(getter, env, jkey, jkey_len);
  566. }
  567. /*
  568. * Class: org_rocksdb_WriteBatchWithIndex
  569. * Method: getFromBatchAndDB
  570. * Signature: (JJJ[BIJ)[B
  571. */
  572. jbyteArray Java_org_rocksdb_WriteBatchWithIndex_getFromBatchAndDB__JJJ_3BIJ(
  573. JNIEnv* env, jclass /*jcls*/, jlong jwbwi_handle, jlong jdb_handle,
  574. jlong jreadopt_handle, jbyteArray jkey, jint jkey_len, jlong jcf_handle) {
  575. auto* wbwi =
  576. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  577. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  578. auto* readopt =
  579. reinterpret_cast<ROCKSDB_NAMESPACE::ReadOptions*>(jreadopt_handle);
  580. auto* cf_handle =
  581. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  582. auto getter = [&wbwi, &db, &cf_handle, &readopt](
  583. const ROCKSDB_NAMESPACE::Slice& key, std::string* value) {
  584. return wbwi->GetFromBatchAndDB(db, *readopt, cf_handle, key, value);
  585. };
  586. return ROCKSDB_NAMESPACE::JniUtil::v_op(getter, env, jkey, jkey_len);
  587. }
  588. /*
  589. * Class: org_rocksdb_WriteBatchWithIndex
  590. * Method: disposeInternal
  591. * Signature: (J)V
  592. */
  593. void Java_org_rocksdb_WriteBatchWithIndex_disposeInternalJni(JNIEnv* /*env*/,
  594. jclass /*jcls*/,
  595. jlong handle) {
  596. auto* wbwi =
  597. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(handle);
  598. assert(wbwi != nullptr);
  599. delete wbwi;
  600. }
  601. /* WBWIRocksIterator below */
  602. /*
  603. * Class: org_rocksdb_WBWIRocksIterator
  604. * Method: disposeInternal
  605. * Signature: (J)V
  606. */
  607. void Java_org_rocksdb_WBWIRocksIterator_disposeInternalJni(JNIEnv* /*env*/,
  608. jclass /*jobj*/,
  609. jlong handle) {
  610. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator*>(handle);
  611. assert(it != nullptr);
  612. delete it;
  613. }
  614. /*
  615. * Class: org_rocksdb_WBWIRocksIterator
  616. * Method: isValid0
  617. * Signature: (J)Z
  618. */
  619. jboolean Java_org_rocksdb_WBWIRocksIterator_isValid0Jni(JNIEnv* /*env*/,
  620. jclass /*jcls*/,
  621. jlong handle) {
  622. return reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator*>(handle)->Valid();
  623. }
  624. /*
  625. * Class: org_rocksdb_WBWIRocksIterator
  626. * Method: seekToFirst0
  627. * Signature: (J)V
  628. */
  629. void Java_org_rocksdb_WBWIRocksIterator_seekToFirst0Jni(JNIEnv* /*env*/,
  630. jclass /*jcls*/,
  631. jlong handle) {
  632. reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator*>(handle)->SeekToFirst();
  633. }
  634. /*
  635. * Class: org_rocksdb_WBWIRocksIterator
  636. * Method: seekToLast0
  637. * Signature: (J)V
  638. */
  639. void Java_org_rocksdb_WBWIRocksIterator_seekToLast0Jni(JNIEnv* /*env*/,
  640. jclass /*jcls*/,
  641. jlong handle) {
  642. reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator*>(handle)->SeekToLast();
  643. }
  644. /*
  645. * Class: org_rocksdb_WBWIRocksIterator
  646. * Method: next0
  647. * Signature: (J)V
  648. */
  649. void Java_org_rocksdb_WBWIRocksIterator_next0Jni(JNIEnv* /*env*/,
  650. jclass /*jcls*/,
  651. jlong handle) {
  652. reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator*>(handle)->Next();
  653. }
  654. /*
  655. * Class: org_rocksdb_WBWIRocksIterator
  656. * Method: prev0
  657. * Signature: (J)V
  658. */
  659. void Java_org_rocksdb_WBWIRocksIterator_prev0Jni(JNIEnv* /*env*/,
  660. jclass /*jcls*/,
  661. jlong handle) {
  662. reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator*>(handle)->Prev();
  663. }
  664. /*
  665. * Class: org_rocksdb_WBWIRocksIterator
  666. * Method: seek0
  667. * Signature: (J[BI)V
  668. */
  669. void Java_org_rocksdb_WBWIRocksIterator_seek0Jni(JNIEnv* env, jclass /*jcls*/,
  670. jlong handle,
  671. jbyteArray jtarget,
  672. jint jtarget_len) {
  673. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator*>(handle);
  674. jbyte* target = new jbyte[jtarget_len];
  675. env->GetByteArrayRegion(jtarget, 0, jtarget_len, target);
  676. if (env->ExceptionCheck()) {
  677. // exception thrown: ArrayIndexOutOfBoundsException
  678. delete[] target;
  679. return;
  680. }
  681. ROCKSDB_NAMESPACE::Slice target_slice(reinterpret_cast<char*>(target),
  682. jtarget_len);
  683. it->Seek(target_slice);
  684. delete[] target;
  685. }
  686. /*
  687. * Class: org_rocksdb_WBWIRocksIterator
  688. * Method: seekDirect0
  689. * Signature: (JLjava/nio/ByteBuffer;II)V
  690. */
  691. void Java_org_rocksdb_WBWIRocksIterator_seekDirect0Jni(
  692. JNIEnv* env, jclass /*jcls*/, jlong handle, jobject jtarget,
  693. jint jtarget_off, jint jtarget_len) {
  694. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator*>(handle);
  695. auto seek = [&it](ROCKSDB_NAMESPACE::Slice& target_slice) {
  696. it->Seek(target_slice);
  697. };
  698. ROCKSDB_NAMESPACE::JniUtil::k_op_direct(seek, env, jtarget, jtarget_off,
  699. jtarget_len);
  700. }
  701. /*
  702. * This method supports fetching into indirect byte buffers;
  703. * the Java wrapper extracts the byte[] and passes it here.
  704. *
  705. * Class: org_rocksdb_WBWIRocksIterator
  706. * Method: seekByteArray0
  707. * Signature: (J[BII)V
  708. */
  709. void Java_org_rocksdb_WBWIRocksIterator_seekByteArray0Jni(
  710. JNIEnv* env, jclass /*jcls*/, jlong handle, jbyteArray jtarget,
  711. jint jtarget_off, jint jtarget_len) {
  712. const std::unique_ptr<char[]> target(new char[jtarget_len]);
  713. if (target == nullptr) {
  714. jclass oom_class = env->FindClass("/lang/java/OutOfMemoryError");
  715. env->ThrowNew(oom_class,
  716. "Memory allocation failed in RocksDB JNI function");
  717. return;
  718. }
  719. env->GetByteArrayRegion(jtarget, jtarget_off, jtarget_len,
  720. reinterpret_cast<jbyte*>(target.get()));
  721. ROCKSDB_NAMESPACE::Slice target_slice(target.get(), jtarget_len);
  722. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator*>(handle);
  723. it->Seek(target_slice);
  724. }
  725. /*
  726. * Class: org_rocksdb_WBWIRocksIterator
  727. * Method: seekForPrev0
  728. * Signature: (J[BI)V
  729. */
  730. void Java_org_rocksdb_WBWIRocksIterator_seekForPrev0Jni(JNIEnv* env,
  731. jclass /*jcls*/,
  732. jlong handle,
  733. jbyteArray jtarget,
  734. jint jtarget_len) {
  735. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator*>(handle);
  736. jbyte* target = new jbyte[jtarget_len];
  737. env->GetByteArrayRegion(jtarget, 0, jtarget_len, target);
  738. if (env->ExceptionCheck()) {
  739. // exception thrown: ArrayIndexOutOfBoundsException
  740. delete[] target;
  741. return;
  742. }
  743. ROCKSDB_NAMESPACE::Slice target_slice(reinterpret_cast<char*>(target),
  744. jtarget_len);
  745. it->SeekForPrev(target_slice);
  746. delete[] target;
  747. }
  748. /*
  749. * Class: org_rocksdb_WBWIRocksIterator
  750. * Method: seekForPrevDirect0
  751. * Signature: (JLjava/nio/ByteBuffer;II)V
  752. */
  753. void Java_org_rocksdb_WBWIRocksIterator_seekForPrevDirect0Jni(
  754. JNIEnv* env, jclass /*jcls*/, jlong handle, jobject jtarget,
  755. jint jtarget_off, jint jtarget_len) {
  756. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator*>(handle);
  757. auto seek_for_prev = [&it](ROCKSDB_NAMESPACE::Slice& target_slice) {
  758. it->SeekForPrev(target_slice);
  759. };
  760. ROCKSDB_NAMESPACE::JniUtil::k_op_direct(seek_for_prev, env, jtarget,
  761. jtarget_off, jtarget_len);
  762. }
  763. /*
  764. * This method supports fetching into indirect byte buffers;
  765. * the Java wrapper extracts the byte[] and passes it here.
  766. *
  767. * Class: org_rocksdb_WBWIRocksIterator
  768. * Method: seekForPrevByteArray0
  769. * Signature: (J[BII)V
  770. */
  771. void Java_org_rocksdb_WBWIRocksIterator_seekForPrevByteArray0Jni(
  772. JNIEnv* env, jclass /*jcls*/, jlong handle, jbyteArray jtarget,
  773. jint jtarget_off, jint jtarget_len) {
  774. const std::unique_ptr<char[]> target(new char[jtarget_len]);
  775. if (target == nullptr) {
  776. jclass oom_class = env->FindClass("/lang/java/OutOfMemoryError");
  777. env->ThrowNew(oom_class,
  778. "Memory allocation failed in RocksDB JNI function");
  779. return;
  780. }
  781. env->GetByteArrayRegion(jtarget, jtarget_off, jtarget_len,
  782. reinterpret_cast<jbyte*>(target.get()));
  783. ROCKSDB_NAMESPACE::Slice target_slice(target.get(), jtarget_len);
  784. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator*>(handle);
  785. it->SeekForPrev(target_slice);
  786. }
  787. /*
  788. * Class: org_rocksdb_WBWIRocksIterator
  789. * Method: status0
  790. * Signature: (J)V
  791. */
  792. void Java_org_rocksdb_WBWIRocksIterator_status0Jni(JNIEnv* env, jclass /*jcls*/,
  793. jlong handle) {
  794. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator*>(handle);
  795. ROCKSDB_NAMESPACE::Status s = it->status();
  796. if (s.ok()) {
  797. return;
  798. }
  799. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  800. }
  801. /*
  802. * Class: org_rocksdb_WBWIRocksIterator
  803. * Method: entry1
  804. * Signature: (J)[J
  805. */
  806. jlongArray Java_org_rocksdb_WBWIRocksIterator_entry1(JNIEnv* env,
  807. jclass /*jobj*/,
  808. jlong handle) {
  809. auto* it = reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator*>(handle);
  810. const ROCKSDB_NAMESPACE::WriteEntry& we = it->Entry();
  811. jlong results[3];
  812. // set the type of the write entry
  813. results[0] = ROCKSDB_NAMESPACE::WriteTypeJni::toJavaWriteType(we.type);
  814. // NOTE: key_slice and value_slice will be freed by
  815. // org.rocksdb.DirectSlice#close
  816. auto* key_slice = new ROCKSDB_NAMESPACE::Slice(we.key.data(), we.key.size());
  817. results[1] = GET_CPLUSPLUS_POINTER(key_slice);
  818. if (we.type == ROCKSDB_NAMESPACE::kDeleteRecord ||
  819. we.type == ROCKSDB_NAMESPACE::kSingleDeleteRecord ||
  820. we.type == ROCKSDB_NAMESPACE::kLogDataRecord) {
  821. // set native handle of value slice to null if no value available
  822. results[2] = 0;
  823. } else {
  824. auto* value_slice =
  825. new ROCKSDB_NAMESPACE::Slice(we.value.data(), we.value.size());
  826. results[2] = GET_CPLUSPLUS_POINTER(value_slice);
  827. }
  828. jlongArray jresults = env->NewLongArray(3);
  829. if (jresults == nullptr) {
  830. // exception thrown: OutOfMemoryError
  831. if (results[2] != 0) {
  832. auto* value_slice =
  833. reinterpret_cast<ROCKSDB_NAMESPACE::Slice*>(results[2]);
  834. delete value_slice;
  835. }
  836. delete key_slice;
  837. return nullptr;
  838. }
  839. env->SetLongArrayRegion(jresults, 0, 3, results);
  840. if (env->ExceptionCheck()) {
  841. // exception thrown: ArrayIndexOutOfBoundsException
  842. env->DeleteLocalRef(jresults);
  843. if (results[2] != 0) {
  844. auto* value_slice =
  845. reinterpret_cast<ROCKSDB_NAMESPACE::Slice*>(results[2]);
  846. delete value_slice;
  847. }
  848. delete key_slice;
  849. return nullptr;
  850. }
  851. return jresults;
  852. }
  853. /*
  854. * Class: org_rocksdb_WBWIRocksIterator
  855. * Method: refresh0
  856. * Signature: (J)V
  857. */
  858. void Java_org_rocksdb_WBWIRocksIterator_refresh0Jni(JNIEnv* env,
  859. jobject /*jobj*/,
  860. jlong /*handle*/) {
  861. ROCKSDB_NAMESPACE::Status s =
  862. ROCKSDB_NAMESPACE::Status::NotSupported("Refresh() is not supported");
  863. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  864. }
  865. /*
  866. * Class: org_rocksdb_WBWIRocksIterator
  867. * Method: refresh1
  868. * Signature: (JJ)V
  869. */
  870. void Java_org_rocksdb_WBWIRocksIterator_refresh1(JNIEnv* env, jobject /*jobj*/,
  871. jlong /*handle*/,
  872. jlong /*snapshot_handle*/) {
  873. ROCKSDB_NAMESPACE::Status s = ROCKSDB_NAMESPACE::Status::NotSupported(
  874. "Refresh(Snapshot*) is not supported");
  875. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  876. }