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).
6 // This file implements the "bridge" between Java and C++ and enables
7 // calling c++ ROCKSDB_NAMESPACE::WriteBatchWithIndex methods from Java side.
9 #include "rocksdb/utilities/write_batch_with_index.h"
10 #include "include/org_rocksdb_WBWIRocksIterator.h"
11 #include "include/org_rocksdb_WriteBatchWithIndex.h"
12 #include "rocksdb/comparator.h"
13 #include "rocksjni/portal.h"
16 * Class: org_rocksdb_WriteBatchWithIndex
17 * Method: newWriteBatchWithIndex
20 jlong
Java_org_rocksdb_WriteBatchWithIndex_newWriteBatchWithIndex__(
21 JNIEnv
* /*env*/, jclass
/*jcls*/) {
22 auto* wbwi
= new ROCKSDB_NAMESPACE::WriteBatchWithIndex();
23 return reinterpret_cast<jlong
>(wbwi
);
27 * Class: org_rocksdb_WriteBatchWithIndex
28 * Method: newWriteBatchWithIndex
31 jlong
Java_org_rocksdb_WriteBatchWithIndex_newWriteBatchWithIndex__Z(
32 JNIEnv
* /*env*/, jclass
/*jcls*/, jboolean joverwrite_key
) {
33 auto* wbwi
= new ROCKSDB_NAMESPACE::WriteBatchWithIndex(
34 ROCKSDB_NAMESPACE::BytewiseComparator(), 0,
35 static_cast<bool>(joverwrite_key
));
36 return reinterpret_cast<jlong
>(wbwi
);
40 * Class: org_rocksdb_WriteBatchWithIndex
41 * Method: newWriteBatchWithIndex
44 jlong
Java_org_rocksdb_WriteBatchWithIndex_newWriteBatchWithIndex__JBIZ(
45 JNIEnv
* /*env*/, jclass
/*jcls*/, jlong jfallback_index_comparator_handle
,
46 jbyte jcomparator_type
, jint jreserved_bytes
, jboolean joverwrite_key
) {
47 ROCKSDB_NAMESPACE::Comparator
* fallback_comparator
= nullptr;
48 switch (jcomparator_type
) {
52 reinterpret_cast<ROCKSDB_NAMESPACE::ComparatorJniCallback
*>(
53 jfallback_index_comparator_handle
);
56 // JAVA_NATIVE_COMPARATOR_WRAPPER
58 fallback_comparator
= reinterpret_cast<ROCKSDB_NAMESPACE::Comparator
*>(
59 jfallback_index_comparator_handle
);
62 auto* wbwi
= new ROCKSDB_NAMESPACE::WriteBatchWithIndex(
63 fallback_comparator
, static_cast<size_t>(jreserved_bytes
),
64 static_cast<bool>(joverwrite_key
));
65 return reinterpret_cast<jlong
>(wbwi
);
69 * Class: org_rocksdb_WriteBatchWithIndex
73 jint
Java_org_rocksdb_WriteBatchWithIndex_count0(JNIEnv
* /*env*/,
77 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
78 assert(wbwi
!= nullptr);
80 return static_cast<jint
>(wbwi
->GetWriteBatch()->Count());
84 * Class: org_rocksdb_WriteBatchWithIndex
86 * Signature: (J[BI[BI)V
88 void Java_org_rocksdb_WriteBatchWithIndex_put__J_3BI_3BI(
89 JNIEnv
* env
, jobject jobj
, jlong jwbwi_handle
, jbyteArray jkey
,
90 jint jkey_len
, jbyteArray jentry_value
, jint jentry_value_len
) {
92 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
93 assert(wbwi
!= nullptr);
94 auto put
= [&wbwi
](ROCKSDB_NAMESPACE::Slice key
,
95 ROCKSDB_NAMESPACE::Slice value
) {
96 return wbwi
->Put(key
, value
);
98 std::unique_ptr
<ROCKSDB_NAMESPACE::Status
> status
=
99 ROCKSDB_NAMESPACE::JniUtil::kv_op(put
, env
, jobj
, jkey
, jkey_len
,
100 jentry_value
, jentry_value_len
);
101 if (status
!= nullptr && !status
->ok()) {
102 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, status
);
107 * Class: org_rocksdb_WriteBatchWithIndex
109 * Signature: (J[BI[BIJ)V
111 void Java_org_rocksdb_WriteBatchWithIndex_put__J_3BI_3BIJ(
112 JNIEnv
* env
, jobject jobj
, jlong jwbwi_handle
, jbyteArray jkey
,
113 jint jkey_len
, jbyteArray jentry_value
, jint jentry_value_len
,
116 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
117 assert(wbwi
!= nullptr);
119 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle
*>(jcf_handle
);
120 assert(cf_handle
!= nullptr);
121 auto put
= [&wbwi
, &cf_handle
](ROCKSDB_NAMESPACE::Slice key
,
122 ROCKSDB_NAMESPACE::Slice value
) {
123 return wbwi
->Put(cf_handle
, key
, value
);
125 std::unique_ptr
<ROCKSDB_NAMESPACE::Status
> status
=
126 ROCKSDB_NAMESPACE::JniUtil::kv_op(put
, env
, jobj
, jkey
, jkey_len
,
127 jentry_value
, jentry_value_len
);
128 if (status
!= nullptr && !status
->ok()) {
129 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, status
);
134 * Class: org_rocksdb_WriteBatchWithIndex
136 * Signature: (JLjava/nio/ByteBuffer;IILjava/nio/ByteBuffer;IIJ)V
138 void Java_org_rocksdb_WriteBatchWithIndex_putDirect(
139 JNIEnv
* env
, jobject
/*jobj*/, jlong jwb_handle
, jobject jkey
,
140 jint jkey_offset
, jint jkey_len
, jobject jval
, jint jval_offset
,
141 jint jval_len
, jlong jcf_handle
) {
142 auto* wb
= reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch
*>(jwb_handle
);
143 assert(wb
!= nullptr);
145 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle
*>(jcf_handle
);
146 auto put
= [&wb
, &cf_handle
](ROCKSDB_NAMESPACE::Slice
& key
,
147 ROCKSDB_NAMESPACE::Slice
& value
) {
148 if (cf_handle
== nullptr) {
151 wb
->Put(cf_handle
, key
, value
);
154 ROCKSDB_NAMESPACE::JniUtil::kv_op_direct(
155 put
, env
, jkey
, jkey_offset
, jkey_len
, jval
, jval_offset
, jval_len
);
159 * Class: org_rocksdb_WriteBatchWithIndex
161 * Signature: (J[BI[BI)V
163 void Java_org_rocksdb_WriteBatchWithIndex_merge__J_3BI_3BI(
164 JNIEnv
* env
, jobject jobj
, jlong jwbwi_handle
, jbyteArray jkey
,
165 jint jkey_len
, jbyteArray jentry_value
, jint jentry_value_len
) {
167 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
168 assert(wbwi
!= nullptr);
169 auto merge
= [&wbwi
](ROCKSDB_NAMESPACE::Slice key
,
170 ROCKSDB_NAMESPACE::Slice value
) {
171 return wbwi
->Merge(key
, value
);
173 std::unique_ptr
<ROCKSDB_NAMESPACE::Status
> status
=
174 ROCKSDB_NAMESPACE::JniUtil::kv_op(merge
, env
, jobj
, jkey
, jkey_len
,
175 jentry_value
, jentry_value_len
);
176 if (status
!= nullptr && !status
->ok()) {
177 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, status
);
182 * Class: org_rocksdb_WriteBatchWithIndex
184 * Signature: (J[BI[BIJ)V
186 void Java_org_rocksdb_WriteBatchWithIndex_merge__J_3BI_3BIJ(
187 JNIEnv
* env
, jobject jobj
, jlong jwbwi_handle
, jbyteArray jkey
,
188 jint jkey_len
, jbyteArray jentry_value
, jint jentry_value_len
,
191 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
192 assert(wbwi
!= nullptr);
194 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle
*>(jcf_handle
);
195 assert(cf_handle
!= nullptr);
196 auto merge
= [&wbwi
, &cf_handle
](ROCKSDB_NAMESPACE::Slice key
,
197 ROCKSDB_NAMESPACE::Slice value
) {
198 return wbwi
->Merge(cf_handle
, key
, value
);
200 std::unique_ptr
<ROCKSDB_NAMESPACE::Status
> status
=
201 ROCKSDB_NAMESPACE::JniUtil::kv_op(merge
, env
, jobj
, jkey
, jkey_len
,
202 jentry_value
, jentry_value_len
);
203 if (status
!= nullptr && !status
->ok()) {
204 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, status
);
209 * Class: org_rocksdb_WriteBatchWithIndex
213 void Java_org_rocksdb_WriteBatchWithIndex_delete__J_3BI(JNIEnv
* env
,
219 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
220 assert(wbwi
!= nullptr);
221 auto remove
= [&wbwi
](ROCKSDB_NAMESPACE::Slice key
) {
222 return wbwi
->Delete(key
);
224 std::unique_ptr
<ROCKSDB_NAMESPACE::Status
> status
=
225 ROCKSDB_NAMESPACE::JniUtil::k_op(remove
, env
, jobj
, jkey
, jkey_len
);
226 if (status
!= nullptr && !status
->ok()) {
227 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, status
);
232 * Class: org_rocksdb_WriteBatchWithIndex
234 * Signature: (J[BIJ)V
236 void Java_org_rocksdb_WriteBatchWithIndex_delete__J_3BIJ(
237 JNIEnv
* env
, jobject jobj
, jlong jwbwi_handle
, jbyteArray jkey
,
238 jint jkey_len
, jlong jcf_handle
) {
240 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
241 assert(wbwi
!= nullptr);
243 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle
*>(jcf_handle
);
244 assert(cf_handle
!= nullptr);
245 auto remove
= [&wbwi
, &cf_handle
](ROCKSDB_NAMESPACE::Slice key
) {
246 return wbwi
->Delete(cf_handle
, key
);
248 std::unique_ptr
<ROCKSDB_NAMESPACE::Status
> status
=
249 ROCKSDB_NAMESPACE::JniUtil::k_op(remove
, env
, jobj
, jkey
, jkey_len
);
250 if (status
!= nullptr && !status
->ok()) {
251 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, status
);
256 * Class: org_rocksdb_WriteBatchWithIndex
257 * Method: singleDelete
260 void Java_org_rocksdb_WriteBatchWithIndex_singleDelete__J_3BI(
261 JNIEnv
* env
, jobject jobj
, jlong jwbwi_handle
, jbyteArray jkey
,
264 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
265 assert(wbwi
!= nullptr);
266 auto single_delete
= [&wbwi
](ROCKSDB_NAMESPACE::Slice key
) {
267 return wbwi
->SingleDelete(key
);
269 std::unique_ptr
<ROCKSDB_NAMESPACE::Status
> status
=
270 ROCKSDB_NAMESPACE::JniUtil::k_op(single_delete
, env
, jobj
, jkey
,
272 if (status
!= nullptr && !status
->ok()) {
273 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, status
);
278 * Class: org_rocksdb_WriteBatchWithIndex
279 * Method: singleDelete
280 * Signature: (J[BIJ)V
282 void Java_org_rocksdb_WriteBatchWithIndex_singleDelete__J_3BIJ(
283 JNIEnv
* env
, jobject jobj
, jlong jwbwi_handle
, jbyteArray jkey
,
284 jint jkey_len
, jlong jcf_handle
) {
286 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
287 assert(wbwi
!= nullptr);
289 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle
*>(jcf_handle
);
290 assert(cf_handle
!= nullptr);
291 auto single_delete
= [&wbwi
, &cf_handle
](ROCKSDB_NAMESPACE::Slice key
) {
292 return wbwi
->SingleDelete(cf_handle
, key
);
294 std::unique_ptr
<ROCKSDB_NAMESPACE::Status
> status
=
295 ROCKSDB_NAMESPACE::JniUtil::k_op(single_delete
, env
, jobj
, jkey
,
297 if (status
!= nullptr && !status
->ok()) {
298 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, status
);
303 * Class: org_rocksdb_WriteBatchWithIndex
304 * Method: removeDirect
305 * Signature: (JLjava/nio/ByteBuffer;IIJ)V
307 void Java_org_rocksdb_WriteBatchWithIndex_removeDirect(
308 JNIEnv
* env
, jobject
/*jobj*/, jlong jwb_handle
, jobject jkey
,
309 jint jkey_offset
, jint jkey_len
, jlong jcf_handle
) {
310 auto* wb
= reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch
*>(jwb_handle
);
311 assert(wb
!= nullptr);
313 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle
*>(jcf_handle
);
314 auto remove
= [&wb
, &cf_handle
](ROCKSDB_NAMESPACE::Slice
& key
) {
315 if (cf_handle
== nullptr) {
318 wb
->Delete(cf_handle
, key
);
321 ROCKSDB_NAMESPACE::JniUtil::k_op_direct(remove
, env
, jkey
, jkey_offset
,
326 * Class: org_rocksdb_WriteBatchWithIndex
327 * Method: deleteRange
328 * Signature: (J[BI[BI)V
330 void Java_org_rocksdb_WriteBatchWithIndex_deleteRange__J_3BI_3BI(
331 JNIEnv
* env
, jobject jobj
, jlong jwbwi_handle
, jbyteArray jbegin_key
,
332 jint jbegin_key_len
, jbyteArray jend_key
, jint jend_key_len
) {
334 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
335 assert(wbwi
!= nullptr);
336 auto deleteRange
= [&wbwi
](ROCKSDB_NAMESPACE::Slice beginKey
,
337 ROCKSDB_NAMESPACE::Slice endKey
) {
338 return wbwi
->DeleteRange(beginKey
, endKey
);
340 std::unique_ptr
<ROCKSDB_NAMESPACE::Status
> status
=
341 ROCKSDB_NAMESPACE::JniUtil::kv_op(deleteRange
, env
, jobj
, jbegin_key
,
342 jbegin_key_len
, jend_key
, jend_key_len
);
343 if (status
!= nullptr && !status
->ok()) {
344 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, status
);
349 * Class: org_rocksdb_WriteBatchWithIndex
350 * Method: deleteRange
351 * Signature: (J[BI[BIJ)V
353 void Java_org_rocksdb_WriteBatchWithIndex_deleteRange__J_3BI_3BIJ(
354 JNIEnv
* env
, jobject jobj
, jlong jwbwi_handle
, jbyteArray jbegin_key
,
355 jint jbegin_key_len
, jbyteArray jend_key
, jint jend_key_len
,
358 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
359 assert(wbwi
!= nullptr);
361 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle
*>(jcf_handle
);
362 assert(cf_handle
!= nullptr);
363 auto deleteRange
= [&wbwi
, &cf_handle
](ROCKSDB_NAMESPACE::Slice beginKey
,
364 ROCKSDB_NAMESPACE::Slice endKey
) {
365 return wbwi
->DeleteRange(cf_handle
, beginKey
, endKey
);
367 std::unique_ptr
<ROCKSDB_NAMESPACE::Status
> status
=
368 ROCKSDB_NAMESPACE::JniUtil::kv_op(deleteRange
, env
, jobj
, jbegin_key
,
369 jbegin_key_len
, jend_key
, jend_key_len
);
370 if (status
!= nullptr && !status
->ok()) {
371 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, status
);
376 * Class: org_rocksdb_WriteBatchWithIndex
380 void Java_org_rocksdb_WriteBatchWithIndex_putLogData(JNIEnv
* env
, jobject jobj
,
385 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
386 assert(wbwi
!= nullptr);
387 auto putLogData
= [&wbwi
](ROCKSDB_NAMESPACE::Slice blob
) {
388 return wbwi
->PutLogData(blob
);
390 std::unique_ptr
<ROCKSDB_NAMESPACE::Status
> status
=
391 ROCKSDB_NAMESPACE::JniUtil::k_op(putLogData
, env
, jobj
, jblob
, jblob_len
);
392 if (status
!= nullptr && !status
->ok()) {
393 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, status
);
398 * Class: org_rocksdb_WriteBatchWithIndex
402 void Java_org_rocksdb_WriteBatchWithIndex_clear0(JNIEnv
* /*env*/,
404 jlong jwbwi_handle
) {
406 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
407 assert(wbwi
!= nullptr);
413 * Class: org_rocksdb_WriteBatchWithIndex
414 * Method: setSavePoint0
417 void Java_org_rocksdb_WriteBatchWithIndex_setSavePoint0(JNIEnv
* /*env*/,
419 jlong jwbwi_handle
) {
421 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
422 assert(wbwi
!= nullptr);
424 wbwi
->SetSavePoint();
428 * Class: org_rocksdb_WriteBatchWithIndex
429 * Method: rollbackToSavePoint0
432 void Java_org_rocksdb_WriteBatchWithIndex_rollbackToSavePoint0(
433 JNIEnv
* env
, jobject
/*jobj*/, jlong jwbwi_handle
) {
435 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
436 assert(wbwi
!= nullptr);
438 auto s
= wbwi
->RollbackToSavePoint();
444 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, s
);
448 * Class: org_rocksdb_WriteBatchWithIndex
449 * Method: popSavePoint
452 void Java_org_rocksdb_WriteBatchWithIndex_popSavePoint(JNIEnv
* env
,
454 jlong jwbwi_handle
) {
456 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
457 assert(wbwi
!= nullptr);
459 auto s
= wbwi
->PopSavePoint();
465 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, s
);
469 * Class: org_rocksdb_WriteBatchWithIndex
470 * Method: setMaxBytes
473 void Java_org_rocksdb_WriteBatchWithIndex_setMaxBytes(JNIEnv
* /*env*/,
478 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
479 assert(wbwi
!= nullptr);
481 wbwi
->SetMaxBytes(static_cast<size_t>(jmax_bytes
));
485 * Class: org_rocksdb_WriteBatchWithIndex
486 * Method: getWriteBatch
487 * Signature: (J)Lorg/rocksdb/WriteBatch;
489 jobject
Java_org_rocksdb_WriteBatchWithIndex_getWriteBatch(JNIEnv
* env
,
491 jlong jwbwi_handle
) {
493 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
494 assert(wbwi
!= nullptr);
496 auto* wb
= wbwi
->GetWriteBatch();
498 // TODO(AR) is the `wb` object owned by us?
499 return ROCKSDB_NAMESPACE::WriteBatchJni::construct(env
, wb
);
503 * Class: org_rocksdb_WriteBatchWithIndex
507 jlong
Java_org_rocksdb_WriteBatchWithIndex_iterator0(JNIEnv
* /*env*/,
509 jlong jwbwi_handle
) {
511 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
512 auto* wbwi_iterator
= wbwi
->NewIterator();
513 return reinterpret_cast<jlong
>(wbwi_iterator
);
517 * Class: org_rocksdb_WriteBatchWithIndex
521 jlong
Java_org_rocksdb_WriteBatchWithIndex_iterator1(JNIEnv
* /*env*/,
526 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
528 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle
*>(jcf_handle
);
529 auto* wbwi_iterator
= wbwi
->NewIterator(cf_handle
);
530 return reinterpret_cast<jlong
>(wbwi_iterator
);
534 * Class: org_rocksdb_WriteBatchWithIndex
535 * Method: iteratorWithBase
538 jlong
Java_org_rocksdb_WriteBatchWithIndex_iteratorWithBase(JNIEnv
* /*env*/,
544 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
546 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle
*>(jcf_handle
);
547 auto* base_iterator
=
548 reinterpret_cast<ROCKSDB_NAMESPACE::Iterator
*>(jbi_handle
);
549 auto* iterator
= wbwi
->NewIteratorWithBase(cf_handle
, base_iterator
);
550 return reinterpret_cast<jlong
>(iterator
);
554 * Class: org_rocksdb_WriteBatchWithIndex
555 * Method: getFromBatch
556 * Signature: (JJ[BI)[B
558 jbyteArray JNICALL
Java_org_rocksdb_WriteBatchWithIndex_getFromBatch__JJ_3BI(
559 JNIEnv
* env
, jobject
/*jobj*/, jlong jwbwi_handle
, jlong jdbopt_handle
,
560 jbyteArray jkey
, jint jkey_len
) {
562 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
563 auto* dbopt
= reinterpret_cast<ROCKSDB_NAMESPACE::DBOptions
*>(jdbopt_handle
);
565 auto getter
= [&wbwi
, &dbopt
](const ROCKSDB_NAMESPACE::Slice
& key
,
566 std::string
* value
) {
567 return wbwi
->GetFromBatch(*dbopt
, key
, value
);
570 return ROCKSDB_NAMESPACE::JniUtil::v_op(getter
, env
, jkey
, jkey_len
);
574 * Class: org_rocksdb_WriteBatchWithIndex
575 * Method: getFromBatch
576 * Signature: (JJ[BIJ)[B
578 jbyteArray
Java_org_rocksdb_WriteBatchWithIndex_getFromBatch__JJ_3BIJ(
579 JNIEnv
* env
, jobject
/*jobj*/, jlong jwbwi_handle
, jlong jdbopt_handle
,
580 jbyteArray jkey
, jint jkey_len
, jlong jcf_handle
) {
582 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
583 auto* dbopt
= reinterpret_cast<ROCKSDB_NAMESPACE::DBOptions
*>(jdbopt_handle
);
585 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle
*>(jcf_handle
);
587 auto getter
= [&wbwi
, &cf_handle
, &dbopt
](const ROCKSDB_NAMESPACE::Slice
& key
,
588 std::string
* value
) {
589 return wbwi
->GetFromBatch(cf_handle
, *dbopt
, key
, value
);
592 return ROCKSDB_NAMESPACE::JniUtil::v_op(getter
, env
, jkey
, jkey_len
);
596 * Class: org_rocksdb_WriteBatchWithIndex
597 * Method: getFromBatchAndDB
598 * Signature: (JJJ[BI)[B
600 jbyteArray
Java_org_rocksdb_WriteBatchWithIndex_getFromBatchAndDB__JJJ_3BI(
601 JNIEnv
* env
, jobject
/*jobj*/, jlong jwbwi_handle
, jlong jdb_handle
,
602 jlong jreadopt_handle
, jbyteArray jkey
, jint jkey_len
) {
604 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
605 auto* db
= reinterpret_cast<ROCKSDB_NAMESPACE::DB
*>(jdb_handle
);
607 reinterpret_cast<ROCKSDB_NAMESPACE::ReadOptions
*>(jreadopt_handle
);
609 auto getter
= [&wbwi
, &db
, &readopt
](const ROCKSDB_NAMESPACE::Slice
& key
,
610 std::string
* value
) {
611 return wbwi
->GetFromBatchAndDB(db
, *readopt
, key
, value
);
614 return ROCKSDB_NAMESPACE::JniUtil::v_op(getter
, env
, jkey
, jkey_len
);
618 * Class: org_rocksdb_WriteBatchWithIndex
619 * Method: getFromBatchAndDB
620 * Signature: (JJJ[BIJ)[B
622 jbyteArray
Java_org_rocksdb_WriteBatchWithIndex_getFromBatchAndDB__JJJ_3BIJ(
623 JNIEnv
* env
, jobject
/*jobj*/, jlong jwbwi_handle
, jlong jdb_handle
,
624 jlong jreadopt_handle
, jbyteArray jkey
, jint jkey_len
, jlong jcf_handle
) {
626 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(jwbwi_handle
);
627 auto* db
= reinterpret_cast<ROCKSDB_NAMESPACE::DB
*>(jdb_handle
);
629 reinterpret_cast<ROCKSDB_NAMESPACE::ReadOptions
*>(jreadopt_handle
);
631 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle
*>(jcf_handle
);
633 auto getter
= [&wbwi
, &db
, &cf_handle
, &readopt
](
634 const ROCKSDB_NAMESPACE::Slice
& key
, std::string
* value
) {
635 return wbwi
->GetFromBatchAndDB(db
, *readopt
, cf_handle
, key
, value
);
638 return ROCKSDB_NAMESPACE::JniUtil::v_op(getter
, env
, jkey
, jkey_len
);
642 * Class: org_rocksdb_WriteBatchWithIndex
643 * Method: disposeInternal
646 void Java_org_rocksdb_WriteBatchWithIndex_disposeInternal(JNIEnv
* /*env*/,
650 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex
*>(handle
);
651 assert(wbwi
!= nullptr);
655 /* WBWIRocksIterator below */
658 * Class: org_rocksdb_WBWIRocksIterator
659 * Method: disposeInternal
662 void Java_org_rocksdb_WBWIRocksIterator_disposeInternal(JNIEnv
* /*env*/,
665 auto* it
= reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator
*>(handle
);
666 assert(it
!= nullptr);
671 * Class: org_rocksdb_WBWIRocksIterator
675 jboolean
Java_org_rocksdb_WBWIRocksIterator_isValid0(JNIEnv
* /*env*/,
678 return reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator
*>(handle
)->Valid();
682 * Class: org_rocksdb_WBWIRocksIterator
683 * Method: seekToFirst0
686 void Java_org_rocksdb_WBWIRocksIterator_seekToFirst0(JNIEnv
* /*env*/,
689 reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator
*>(handle
)->SeekToFirst();
693 * Class: org_rocksdb_WBWIRocksIterator
694 * Method: seekToLast0
697 void Java_org_rocksdb_WBWIRocksIterator_seekToLast0(JNIEnv
* /*env*/,
700 reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator
*>(handle
)->SeekToLast();
704 * Class: org_rocksdb_WBWIRocksIterator
708 void Java_org_rocksdb_WBWIRocksIterator_next0(JNIEnv
* /*env*/, jobject
/*jobj*/,
710 reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator
*>(handle
)->Next();
714 * Class: org_rocksdb_WBWIRocksIterator
718 void Java_org_rocksdb_WBWIRocksIterator_prev0(JNIEnv
* /*env*/, jobject
/*jobj*/,
720 reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator
*>(handle
)->Prev();
724 * Class: org_rocksdb_WBWIRocksIterator
728 void Java_org_rocksdb_WBWIRocksIterator_seek0(JNIEnv
* env
, jobject
/*jobj*/,
729 jlong handle
, jbyteArray jtarget
,
731 auto* it
= reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator
*>(handle
);
732 jbyte
* target
= env
->GetByteArrayElements(jtarget
, nullptr);
733 if (target
== nullptr) {
734 // exception thrown: OutOfMemoryError
738 ROCKSDB_NAMESPACE::Slice
target_slice(reinterpret_cast<char*>(target
),
741 it
->Seek(target_slice
);
743 env
->ReleaseByteArrayElements(jtarget
, target
, JNI_ABORT
);
747 * Class: org_rocksdb_WBWIRocksIterator
748 * Method: seekDirect0
749 * Signature: (JLjava/nio/ByteBuffer;II)V
751 void Java_org_rocksdb_WBWIRocksIterator_seekDirect0(
752 JNIEnv
* env
, jobject
/*jobj*/, jlong handle
, jobject jtarget
,
753 jint jtarget_off
, jint jtarget_len
) {
754 auto* it
= reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator
*>(handle
);
755 auto seek
= [&it
](ROCKSDB_NAMESPACE::Slice
& target_slice
) {
756 it
->Seek(target_slice
);
758 ROCKSDB_NAMESPACE::JniUtil::k_op_direct(seek
, env
, jtarget
, jtarget_off
,
763 * Class: org_rocksdb_WBWIRocksIterator
764 * Method: seekForPrev0
767 void Java_org_rocksdb_WBWIRocksIterator_seekForPrev0(JNIEnv
* env
,
772 auto* it
= reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator
*>(handle
);
773 jbyte
* target
= env
->GetByteArrayElements(jtarget
, nullptr);
774 if (target
== nullptr) {
775 // exception thrown: OutOfMemoryError
779 ROCKSDB_NAMESPACE::Slice
target_slice(reinterpret_cast<char*>(target
),
782 it
->SeekForPrev(target_slice
);
784 env
->ReleaseByteArrayElements(jtarget
, target
, JNI_ABORT
);
788 * Class: org_rocksdb_WBWIRocksIterator
792 void Java_org_rocksdb_WBWIRocksIterator_status0(JNIEnv
* env
, jobject
/*jobj*/,
794 auto* it
= reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator
*>(handle
);
795 ROCKSDB_NAMESPACE::Status s
= it
->status();
801 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, s
);
805 * Class: org_rocksdb_WBWIRocksIterator
809 jlongArray
Java_org_rocksdb_WBWIRocksIterator_entry1(JNIEnv
* env
,
812 auto* it
= reinterpret_cast<ROCKSDB_NAMESPACE::WBWIIterator
*>(handle
);
813 const ROCKSDB_NAMESPACE::WriteEntry
& we
= it
->Entry();
817 // set the type of the write entry
818 results
[0] = ROCKSDB_NAMESPACE::WriteTypeJni::toJavaWriteType(we
.type
);
820 // NOTE: key_slice and value_slice will be freed by
821 // org.rocksdb.DirectSlice#close
823 auto* key_slice
= new ROCKSDB_NAMESPACE::Slice(we
.key
.data(), we
.key
.size());
824 results
[1] = reinterpret_cast<jlong
>(key_slice
);
825 if (we
.type
== ROCKSDB_NAMESPACE::kDeleteRecord
||
826 we
.type
== ROCKSDB_NAMESPACE::kSingleDeleteRecord
||
827 we
.type
== ROCKSDB_NAMESPACE::kLogDataRecord
) {
828 // set native handle of value slice to null if no value available
832 new ROCKSDB_NAMESPACE::Slice(we
.value
.data(), we
.value
.size());
833 results
[2] = reinterpret_cast<jlong
>(value_slice
);
836 jlongArray jresults
= env
->NewLongArray(3);
837 if (jresults
== nullptr) {
838 // exception thrown: OutOfMemoryError
839 if (results
[2] != 0) {
841 reinterpret_cast<ROCKSDB_NAMESPACE::Slice
*>(results
[2]);
848 env
->SetLongArrayRegion(jresults
, 0, 3, results
);
849 if (env
->ExceptionCheck()) {
850 // exception thrown: ArrayIndexOutOfBoundsException
851 env
->DeleteLocalRef(jresults
);
852 if (results
[2] != 0) {
854 reinterpret_cast<ROCKSDB_NAMESPACE::Slice
*>(results
[2]);