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::WriteBatch methods from Java side.
8 #include <memory>
9 
10 #include "db/memtable.h"
11 #include "db/write_batch_internal.h"
12 #include "include/org_rocksdb_WriteBatch.h"
13 #include "include/org_rocksdb_WriteBatch_Handler.h"
14 #include "logging/logging.h"
15 #include "rocksdb/db.h"
16 #include "rocksdb/env.h"
17 #include "rocksdb/memtablerep.h"
18 #include "rocksdb/status.h"
19 #include "rocksdb/write_batch.h"
20 #include "rocksdb/write_buffer_manager.h"
21 #include "rocksjni/portal.h"
22 #include "rocksjni/writebatchhandlerjnicallback.h"
23 #include "table/scoped_arena_iterator.h"
24 
25 /*
26  * Class:     org_rocksdb_WriteBatch
27  * Method:    newWriteBatch
28  * Signature: (I)J
29  */
Java_org_rocksdb_WriteBatch_newWriteBatch__I(JNIEnv *,jclass,jint jreserved_bytes)30 jlong Java_org_rocksdb_WriteBatch_newWriteBatch__I(JNIEnv* /*env*/,
31                                                    jclass /*jcls*/,
32                                                    jint jreserved_bytes) {
33   auto* wb =
34       new ROCKSDB_NAMESPACE::WriteBatch(static_cast<size_t>(jreserved_bytes));
35   return reinterpret_cast<jlong>(wb);
36 }
37 
38 /*
39  * Class:     org_rocksdb_WriteBatch
40  * Method:    newWriteBatch
41  * Signature: ([BI)J
42  */
Java_org_rocksdb_WriteBatch_newWriteBatch___3BI(JNIEnv * env,jclass,jbyteArray jserialized,jint jserialized_length)43 jlong Java_org_rocksdb_WriteBatch_newWriteBatch___3BI(JNIEnv* env,
44                                                       jclass /*jcls*/,
45                                                       jbyteArray jserialized,
46                                                       jint jserialized_length) {
47   jboolean has_exception = JNI_FALSE;
48   std::string serialized = ROCKSDB_NAMESPACE::JniUtil::byteString<std::string>(
49       env, jserialized, jserialized_length,
50       [](const char* str, const size_t len) { return std::string(str, len); },
51       &has_exception);
52   if (has_exception == JNI_TRUE) {
53     // exception occurred
54     return 0;
55   }
56 
57   auto* wb = new ROCKSDB_NAMESPACE::WriteBatch(serialized);
58   return reinterpret_cast<jlong>(wb);
59 }
60 
61 /*
62  * Class:     org_rocksdb_WriteBatch
63  * Method:    count0
64  * Signature: (J)I
65  */
Java_org_rocksdb_WriteBatch_count0(JNIEnv *,jobject,jlong jwb_handle)66 jint Java_org_rocksdb_WriteBatch_count0(JNIEnv* /*env*/, jobject /*jobj*/,
67                                         jlong jwb_handle) {
68   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
69   assert(wb != nullptr);
70 
71   return static_cast<jint>(wb->Count());
72 }
73 
74 /*
75  * Class:     org_rocksdb_WriteBatch
76  * Method:    clear0
77  * Signature: (J)V
78  */
Java_org_rocksdb_WriteBatch_clear0(JNIEnv *,jobject,jlong jwb_handle)79 void Java_org_rocksdb_WriteBatch_clear0(JNIEnv* /*env*/, jobject /*jobj*/,
80                                         jlong jwb_handle) {
81   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
82   assert(wb != nullptr);
83 
84   wb->Clear();
85 }
86 
87 /*
88  * Class:     org_rocksdb_WriteBatch
89  * Method:    setSavePoint0
90  * Signature: (J)V
91  */
Java_org_rocksdb_WriteBatch_setSavePoint0(JNIEnv *,jobject,jlong jwb_handle)92 void Java_org_rocksdb_WriteBatch_setSavePoint0(JNIEnv* /*env*/,
93                                                jobject /*jobj*/,
94                                                jlong jwb_handle) {
95   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
96   assert(wb != nullptr);
97 
98   wb->SetSavePoint();
99 }
100 
101 /*
102  * Class:     org_rocksdb_WriteBatch
103  * Method:    rollbackToSavePoint0
104  * Signature: (J)V
105  */
Java_org_rocksdb_WriteBatch_rollbackToSavePoint0(JNIEnv * env,jobject,jlong jwb_handle)106 void Java_org_rocksdb_WriteBatch_rollbackToSavePoint0(JNIEnv* env,
107                                                       jobject /*jobj*/,
108                                                       jlong jwb_handle) {
109   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
110   assert(wb != nullptr);
111 
112   auto s = wb->RollbackToSavePoint();
113 
114   if (s.ok()) {
115     return;
116   }
117   ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
118 }
119 
120 /*
121  * Class:     org_rocksdb_WriteBatch
122  * Method:    popSavePoint
123  * Signature: (J)V
124  */
Java_org_rocksdb_WriteBatch_popSavePoint(JNIEnv * env,jobject,jlong jwb_handle)125 void Java_org_rocksdb_WriteBatch_popSavePoint(JNIEnv* env, jobject /*jobj*/,
126                                               jlong jwb_handle) {
127   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
128   assert(wb != nullptr);
129 
130   auto s = wb->PopSavePoint();
131 
132   if (s.ok()) {
133     return;
134   }
135   ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
136 }
137 
138 /*
139  * Class:     org_rocksdb_WriteBatch
140  * Method:    setMaxBytes
141  * Signature: (JJ)V
142  */
Java_org_rocksdb_WriteBatch_setMaxBytes(JNIEnv *,jobject,jlong jwb_handle,jlong jmax_bytes)143 void Java_org_rocksdb_WriteBatch_setMaxBytes(JNIEnv* /*env*/, jobject /*jobj*/,
144                                              jlong jwb_handle,
145                                              jlong jmax_bytes) {
146   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
147   assert(wb != nullptr);
148 
149   wb->SetMaxBytes(static_cast<size_t>(jmax_bytes));
150 }
151 
152 /*
153  * Class:     org_rocksdb_WriteBatch
154  * Method:    put
155  * Signature: (J[BI[BI)V
156  */
Java_org_rocksdb_WriteBatch_put__J_3BI_3BI(JNIEnv * env,jobject jobj,jlong jwb_handle,jbyteArray jkey,jint jkey_len,jbyteArray jentry_value,jint jentry_value_len)157 void Java_org_rocksdb_WriteBatch_put__J_3BI_3BI(JNIEnv* env, jobject jobj,
158                                                 jlong jwb_handle,
159                                                 jbyteArray jkey, jint jkey_len,
160                                                 jbyteArray jentry_value,
161                                                 jint jentry_value_len) {
162   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
163   assert(wb != nullptr);
164   auto put = [&wb](ROCKSDB_NAMESPACE::Slice key,
165                    ROCKSDB_NAMESPACE::Slice value) {
166     return wb->Put(key, value);
167   };
168   std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =
169       ROCKSDB_NAMESPACE::JniUtil::kv_op(put, env, jobj, jkey, jkey_len,
170                                         jentry_value, jentry_value_len);
171   if (status != nullptr && !status->ok()) {
172     ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);
173   }
174 }
175 
176 /*
177  * Class:     org_rocksdb_WriteBatch
178  * Method:    put
179  * Signature: (J[BI[BIJ)V
180  */
Java_org_rocksdb_WriteBatch_put__J_3BI_3BIJ(JNIEnv * env,jobject jobj,jlong jwb_handle,jbyteArray jkey,jint jkey_len,jbyteArray jentry_value,jint jentry_value_len,jlong jcf_handle)181 void Java_org_rocksdb_WriteBatch_put__J_3BI_3BIJ(
182     JNIEnv* env, jobject jobj, jlong jwb_handle, jbyteArray jkey, jint jkey_len,
183     jbyteArray jentry_value, jint jentry_value_len, jlong jcf_handle) {
184   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
185   assert(wb != nullptr);
186   auto* cf_handle =
187       reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
188   assert(cf_handle != nullptr);
189   auto put = [&wb, &cf_handle](ROCKSDB_NAMESPACE::Slice key,
190                                ROCKSDB_NAMESPACE::Slice value) {
191     return wb->Put(cf_handle, key, value);
192   };
193   std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =
194       ROCKSDB_NAMESPACE::JniUtil::kv_op(put, env, jobj, jkey, jkey_len,
195                                         jentry_value, jentry_value_len);
196   if (status != nullptr && !status->ok()) {
197     ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);
198   }
199 }
200 
201 /*
202  * Class:     org_rocksdb_WriteBatch
203  * Method:    putDirect
204  * Signature: (JLjava/nio/ByteBuffer;IILjava/nio/ByteBuffer;IIJ)V
205  */
Java_org_rocksdb_WriteBatch_putDirect(JNIEnv * env,jobject,jlong jwb_handle,jobject jkey,jint jkey_offset,jint jkey_len,jobject jval,jint jval_offset,jint jval_len,jlong jcf_handle)206 void Java_org_rocksdb_WriteBatch_putDirect(JNIEnv* env, jobject /*jobj*/,
207                                            jlong jwb_handle, jobject jkey,
208                                            jint jkey_offset, jint jkey_len,
209                                            jobject jval, jint jval_offset,
210                                            jint jval_len, jlong jcf_handle) {
211   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
212   assert(wb != nullptr);
213   auto* cf_handle =
214       reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
215   auto put = [&wb, &cf_handle](ROCKSDB_NAMESPACE::Slice& key,
216                                ROCKSDB_NAMESPACE::Slice& value) {
217     if (cf_handle == nullptr) {
218       wb->Put(key, value);
219     } else {
220       wb->Put(cf_handle, key, value);
221     }
222   };
223   ROCKSDB_NAMESPACE::JniUtil::kv_op_direct(
224       put, env, jkey, jkey_offset, jkey_len, jval, jval_offset, jval_len);
225 }
226 
227 /*
228  * Class:     org_rocksdb_WriteBatch
229  * Method:    merge
230  * Signature: (J[BI[BI)V
231  */
Java_org_rocksdb_WriteBatch_merge__J_3BI_3BI(JNIEnv * env,jobject jobj,jlong jwb_handle,jbyteArray jkey,jint jkey_len,jbyteArray jentry_value,jint jentry_value_len)232 void Java_org_rocksdb_WriteBatch_merge__J_3BI_3BI(
233     JNIEnv* env, jobject jobj, jlong jwb_handle, jbyteArray jkey, jint jkey_len,
234     jbyteArray jentry_value, jint jentry_value_len) {
235   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
236   assert(wb != nullptr);
237   auto merge = [&wb](ROCKSDB_NAMESPACE::Slice key,
238                      ROCKSDB_NAMESPACE::Slice value) {
239     return wb->Merge(key, value);
240   };
241   std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =
242       ROCKSDB_NAMESPACE::JniUtil::kv_op(merge, env, jobj, jkey, jkey_len,
243                                         jentry_value, jentry_value_len);
244   if (status != nullptr && !status->ok()) {
245     ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);
246   }
247 }
248 
249 /*
250  * Class:     org_rocksdb_WriteBatch
251  * Method:    merge
252  * Signature: (J[BI[BIJ)V
253  */
Java_org_rocksdb_WriteBatch_merge__J_3BI_3BIJ(JNIEnv * env,jobject jobj,jlong jwb_handle,jbyteArray jkey,jint jkey_len,jbyteArray jentry_value,jint jentry_value_len,jlong jcf_handle)254 void Java_org_rocksdb_WriteBatch_merge__J_3BI_3BIJ(
255     JNIEnv* env, jobject jobj, jlong jwb_handle, jbyteArray jkey, jint jkey_len,
256     jbyteArray jentry_value, jint jentry_value_len, jlong jcf_handle) {
257   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
258   assert(wb != nullptr);
259   auto* cf_handle =
260       reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
261   assert(cf_handle != nullptr);
262   auto merge = [&wb, &cf_handle](ROCKSDB_NAMESPACE::Slice key,
263                                  ROCKSDB_NAMESPACE::Slice value) {
264     return wb->Merge(cf_handle, key, value);
265   };
266   std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =
267       ROCKSDB_NAMESPACE::JniUtil::kv_op(merge, env, jobj, jkey, jkey_len,
268                                         jentry_value, jentry_value_len);
269   if (status != nullptr && !status->ok()) {
270     ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);
271   }
272 }
273 
274 /*
275  * Class:     org_rocksdb_WriteBatch
276  * Method:    delete
277  * Signature: (J[BI)V
278  */
Java_org_rocksdb_WriteBatch_delete__J_3BI(JNIEnv * env,jobject jobj,jlong jwb_handle,jbyteArray jkey,jint jkey_len)279 void Java_org_rocksdb_WriteBatch_delete__J_3BI(JNIEnv* env, jobject jobj,
280                                                jlong jwb_handle,
281                                                jbyteArray jkey, jint jkey_len) {
282   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
283   assert(wb != nullptr);
284   auto remove = [&wb](ROCKSDB_NAMESPACE::Slice key) { return wb->Delete(key); };
285   std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =
286       ROCKSDB_NAMESPACE::JniUtil::k_op(remove, env, jobj, jkey, jkey_len);
287   if (status != nullptr && !status->ok()) {
288     ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);
289   }
290 }
291 
292 /*
293  * Class:     org_rocksdb_WriteBatch
294  * Method:    delete
295  * Signature: (J[BIJ)V
296  */
Java_org_rocksdb_WriteBatch_delete__J_3BIJ(JNIEnv * env,jobject jobj,jlong jwb_handle,jbyteArray jkey,jint jkey_len,jlong jcf_handle)297 void Java_org_rocksdb_WriteBatch_delete__J_3BIJ(JNIEnv* env, jobject jobj,
298                                                 jlong jwb_handle,
299                                                 jbyteArray jkey, jint jkey_len,
300                                                 jlong jcf_handle) {
301   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
302   assert(wb != nullptr);
303   auto* cf_handle =
304       reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
305   assert(cf_handle != nullptr);
306   auto remove = [&wb, &cf_handle](ROCKSDB_NAMESPACE::Slice key) {
307     return wb->Delete(cf_handle, key);
308   };
309   std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =
310       ROCKSDB_NAMESPACE::JniUtil::k_op(remove, env, jobj, jkey, jkey_len);
311   if (status != nullptr && !status->ok()) {
312     ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);
313   }
314 }
315 
316 /*
317  * Class:     org_rocksdb_WriteBatch
318  * Method:    singleDelete
319  * Signature: (J[BI)V
320  */
Java_org_rocksdb_WriteBatch_singleDelete__J_3BI(JNIEnv * env,jobject jobj,jlong jwb_handle,jbyteArray jkey,jint jkey_len)321 void Java_org_rocksdb_WriteBatch_singleDelete__J_3BI(JNIEnv* env, jobject jobj,
322                                                      jlong jwb_handle,
323                                                      jbyteArray jkey,
324                                                      jint jkey_len) {
325   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
326   assert(wb != nullptr);
327   auto single_delete = [&wb](ROCKSDB_NAMESPACE::Slice key) {
328     return wb->SingleDelete(key);
329   };
330   std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =
331       ROCKSDB_NAMESPACE::JniUtil::k_op(single_delete, env, jobj, jkey,
332                                        jkey_len);
333   if (status != nullptr && !status->ok()) {
334     ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);
335   }
336 }
337 
338 /*
339  * Class:     org_rocksdb_WriteBatch
340  * Method:    singleDelete
341  * Signature: (J[BIJ)V
342  */
Java_org_rocksdb_WriteBatch_singleDelete__J_3BIJ(JNIEnv * env,jobject jobj,jlong jwb_handle,jbyteArray jkey,jint jkey_len,jlong jcf_handle)343 void Java_org_rocksdb_WriteBatch_singleDelete__J_3BIJ(JNIEnv* env, jobject jobj,
344                                                       jlong jwb_handle,
345                                                       jbyteArray jkey,
346                                                       jint jkey_len,
347                                                       jlong jcf_handle) {
348   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
349   assert(wb != nullptr);
350   auto* cf_handle =
351       reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
352   assert(cf_handle != nullptr);
353   auto single_delete = [&wb, &cf_handle](ROCKSDB_NAMESPACE::Slice key) {
354     return wb->SingleDelete(cf_handle, key);
355   };
356   std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =
357       ROCKSDB_NAMESPACE::JniUtil::k_op(single_delete, env, jobj, jkey,
358                                        jkey_len);
359   if (status != nullptr && !status->ok()) {
360     ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);
361   }
362 }
363 
364 /*
365  * Class:     org_rocksdb_WriteBatch
366  * Method:    removeDirect
367  * Signature: (JLjava/nio/ByteBuffer;IIJ)V
368  */
Java_org_rocksdb_WriteBatch_removeDirect(JNIEnv * env,jobject,jlong jwb_handle,jobject jkey,jint jkey_offset,jint jkey_len,jlong jcf_handle)369 void Java_org_rocksdb_WriteBatch_removeDirect(JNIEnv* env, jobject /*jobj*/,
370                                               jlong jwb_handle, jobject jkey,
371                                               jint jkey_offset, jint jkey_len,
372                                               jlong jcf_handle) {
373   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
374   assert(wb != nullptr);
375   auto* cf_handle =
376       reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
377   auto remove = [&wb, &cf_handle](ROCKSDB_NAMESPACE::Slice& key) {
378     if (cf_handle == nullptr) {
379       wb->Delete(key);
380     } else {
381       wb->Delete(cf_handle, key);
382     }
383   };
384   ROCKSDB_NAMESPACE::JniUtil::k_op_direct(remove, env, jkey, jkey_offset,
385                                           jkey_len);
386 }
387 
388 /*
389  * Class:     org_rocksdb_WriteBatch
390  * Method:    deleteRange
391  * Signature: (J[BI[BI)V
392  */
Java_org_rocksdb_WriteBatch_deleteRange__J_3BI_3BI(JNIEnv * env,jobject jobj,jlong jwb_handle,jbyteArray jbegin_key,jint jbegin_key_len,jbyteArray jend_key,jint jend_key_len)393 void Java_org_rocksdb_WriteBatch_deleteRange__J_3BI_3BI(
394     JNIEnv* env, jobject jobj, jlong jwb_handle, jbyteArray jbegin_key,
395     jint jbegin_key_len, jbyteArray jend_key, jint jend_key_len) {
396   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
397   assert(wb != nullptr);
398   auto deleteRange = [&wb](ROCKSDB_NAMESPACE::Slice beginKey,
399                            ROCKSDB_NAMESPACE::Slice endKey) {
400     return wb->DeleteRange(beginKey, endKey);
401   };
402   std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =
403       ROCKSDB_NAMESPACE::JniUtil::kv_op(deleteRange, env, jobj, jbegin_key,
404                                         jbegin_key_len, jend_key, jend_key_len);
405   if (status != nullptr && !status->ok()) {
406     ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);
407   }
408 }
409 
410 /*
411  * Class:     org_rocksdb_WriteBatch
412  * Method:    deleteRange
413  * Signature: (J[BI[BIJ)V
414  */
Java_org_rocksdb_WriteBatch_deleteRange__J_3BI_3BIJ(JNIEnv * env,jobject jobj,jlong jwb_handle,jbyteArray jbegin_key,jint jbegin_key_len,jbyteArray jend_key,jint jend_key_len,jlong jcf_handle)415 void Java_org_rocksdb_WriteBatch_deleteRange__J_3BI_3BIJ(
416     JNIEnv* env, jobject jobj, jlong jwb_handle, jbyteArray jbegin_key,
417     jint jbegin_key_len, jbyteArray jend_key, jint jend_key_len,
418     jlong jcf_handle) {
419   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
420   assert(wb != nullptr);
421   auto* cf_handle =
422       reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
423   assert(cf_handle != nullptr);
424   auto deleteRange = [&wb, &cf_handle](ROCKSDB_NAMESPACE::Slice beginKey,
425                                        ROCKSDB_NAMESPACE::Slice endKey) {
426     return wb->DeleteRange(cf_handle, beginKey, endKey);
427   };
428   std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =
429       ROCKSDB_NAMESPACE::JniUtil::kv_op(deleteRange, env, jobj, jbegin_key,
430                                         jbegin_key_len, jend_key, jend_key_len);
431   if (status != nullptr && !status->ok()) {
432     ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);
433   }
434 }
435 
436 /*
437  * Class:     org_rocksdb_WriteBatch
438  * Method:    putLogData
439  * Signature: (J[BI)V
440  */
Java_org_rocksdb_WriteBatch_putLogData(JNIEnv * env,jobject jobj,jlong jwb_handle,jbyteArray jblob,jint jblob_len)441 void Java_org_rocksdb_WriteBatch_putLogData(JNIEnv* env, jobject jobj,
442                                             jlong jwb_handle, jbyteArray jblob,
443                                             jint jblob_len) {
444   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
445   assert(wb != nullptr);
446   auto putLogData = [&wb](ROCKSDB_NAMESPACE::Slice blob) {
447     return wb->PutLogData(blob);
448   };
449   std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =
450       ROCKSDB_NAMESPACE::JniUtil::k_op(putLogData, env, jobj, jblob, jblob_len);
451   if (status != nullptr && !status->ok()) {
452     ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);
453   }
454 }
455 
456 /*
457  * Class:     org_rocksdb_WriteBatch
458  * Method:    iterate
459  * Signature: (JJ)V
460  */
Java_org_rocksdb_WriteBatch_iterate(JNIEnv * env,jobject,jlong jwb_handle,jlong handlerHandle)461 void Java_org_rocksdb_WriteBatch_iterate(JNIEnv* env, jobject /*jobj*/,
462                                          jlong jwb_handle,
463                                          jlong handlerHandle) {
464   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
465   assert(wb != nullptr);
466 
467   ROCKSDB_NAMESPACE::Status s = wb->Iterate(
468       reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchHandlerJniCallback*>(
469           handlerHandle));
470 
471   if (s.ok()) {
472     return;
473   }
474   ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
475 }
476 
477 /*
478  * Class:     org_rocksdb_WriteBatch
479  * Method:    data
480  * Signature: (J)[B
481  */
Java_org_rocksdb_WriteBatch_data(JNIEnv * env,jobject,jlong jwb_handle)482 jbyteArray Java_org_rocksdb_WriteBatch_data(JNIEnv* env, jobject /*jobj*/,
483                                             jlong jwb_handle) {
484   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
485   assert(wb != nullptr);
486 
487   auto data = wb->Data();
488   return ROCKSDB_NAMESPACE::JniUtil::copyBytes(env, data);
489 }
490 
491 /*
492  * Class:     org_rocksdb_WriteBatch
493  * Method:    getDataSize
494  * Signature: (J)J
495  */
Java_org_rocksdb_WriteBatch_getDataSize(JNIEnv *,jobject,jlong jwb_handle)496 jlong Java_org_rocksdb_WriteBatch_getDataSize(JNIEnv* /*env*/, jobject /*jobj*/,
497                                               jlong jwb_handle) {
498   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
499   assert(wb != nullptr);
500 
501   auto data_size = wb->GetDataSize();
502   return static_cast<jlong>(data_size);
503 }
504 
505 /*
506  * Class:     org_rocksdb_WriteBatch
507  * Method:    hasPut
508  * Signature: (J)Z
509  */
Java_org_rocksdb_WriteBatch_hasPut(JNIEnv *,jobject,jlong jwb_handle)510 jboolean Java_org_rocksdb_WriteBatch_hasPut(JNIEnv* /*env*/, jobject /*jobj*/,
511                                             jlong jwb_handle) {
512   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
513   assert(wb != nullptr);
514 
515   return wb->HasPut();
516 }
517 
518 /*
519  * Class:     org_rocksdb_WriteBatch
520  * Method:    hasDelete
521  * Signature: (J)Z
522  */
Java_org_rocksdb_WriteBatch_hasDelete(JNIEnv *,jobject,jlong jwb_handle)523 jboolean Java_org_rocksdb_WriteBatch_hasDelete(JNIEnv* /*env*/,
524                                                jobject /*jobj*/,
525                                                jlong jwb_handle) {
526   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
527   assert(wb != nullptr);
528 
529   return wb->HasDelete();
530 }
531 
532 /*
533  * Class:     org_rocksdb_WriteBatch
534  * Method:    hasSingleDelete
535  * Signature: (J)Z
536  */
Java_org_rocksdb_WriteBatch_hasSingleDelete(JNIEnv *,jobject,jlong jwb_handle)537 JNIEXPORT jboolean JNICALL Java_org_rocksdb_WriteBatch_hasSingleDelete(
538     JNIEnv* /*env*/, jobject /*jobj*/, jlong jwb_handle) {
539   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
540   assert(wb != nullptr);
541 
542   return wb->HasSingleDelete();
543 }
544 
545 /*
546  * Class:     org_rocksdb_WriteBatch
547  * Method:    hasDeleteRange
548  * Signature: (J)Z
549  */
Java_org_rocksdb_WriteBatch_hasDeleteRange(JNIEnv *,jobject,jlong jwb_handle)550 JNIEXPORT jboolean JNICALL Java_org_rocksdb_WriteBatch_hasDeleteRange(
551     JNIEnv* /*env*/, jobject /*jobj*/, jlong jwb_handle) {
552   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
553   assert(wb != nullptr);
554 
555   return wb->HasDeleteRange();
556 }
557 
558 /*
559  * Class:     org_rocksdb_WriteBatch
560  * Method:    hasMerge
561  * Signature: (J)Z
562  */
Java_org_rocksdb_WriteBatch_hasMerge(JNIEnv *,jobject,jlong jwb_handle)563 JNIEXPORT jboolean JNICALL Java_org_rocksdb_WriteBatch_hasMerge(
564     JNIEnv* /*env*/, jobject /*jobj*/, jlong jwb_handle) {
565   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
566   assert(wb != nullptr);
567 
568   return wb->HasMerge();
569 }
570 
571 /*
572  * Class:     org_rocksdb_WriteBatch
573  * Method:    hasBeginPrepare
574  * Signature: (J)Z
575  */
Java_org_rocksdb_WriteBatch_hasBeginPrepare(JNIEnv *,jobject,jlong jwb_handle)576 JNIEXPORT jboolean JNICALL Java_org_rocksdb_WriteBatch_hasBeginPrepare(
577     JNIEnv* /*env*/, jobject /*jobj*/, jlong jwb_handle) {
578   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
579   assert(wb != nullptr);
580 
581   return wb->HasBeginPrepare();
582 }
583 
584 /*
585  * Class:     org_rocksdb_WriteBatch
586  * Method:    hasEndPrepare
587  * Signature: (J)Z
588  */
Java_org_rocksdb_WriteBatch_hasEndPrepare(JNIEnv *,jobject,jlong jwb_handle)589 JNIEXPORT jboolean JNICALL Java_org_rocksdb_WriteBatch_hasEndPrepare(
590     JNIEnv* /*env*/, jobject /*jobj*/, jlong jwb_handle) {
591   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
592   assert(wb != nullptr);
593 
594   return wb->HasEndPrepare();
595 }
596 
597 /*
598  * Class:     org_rocksdb_WriteBatch
599  * Method:    hasCommit
600  * Signature: (J)Z
601  */
Java_org_rocksdb_WriteBatch_hasCommit(JNIEnv *,jobject,jlong jwb_handle)602 JNIEXPORT jboolean JNICALL Java_org_rocksdb_WriteBatch_hasCommit(
603     JNIEnv* /*env*/, jobject /*jobj*/, jlong jwb_handle) {
604   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
605   assert(wb != nullptr);
606 
607   return wb->HasCommit();
608 }
609 
610 /*
611  * Class:     org_rocksdb_WriteBatch
612  * Method:    hasRollback
613  * Signature: (J)Z
614  */
Java_org_rocksdb_WriteBatch_hasRollback(JNIEnv *,jobject,jlong jwb_handle)615 JNIEXPORT jboolean JNICALL Java_org_rocksdb_WriteBatch_hasRollback(
616     JNIEnv* /*env*/, jobject /*jobj*/, jlong jwb_handle) {
617   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
618   assert(wb != nullptr);
619 
620   return wb->HasRollback();
621 }
622 
623 /*
624  * Class:     org_rocksdb_WriteBatch
625  * Method:    markWalTerminationPoint
626  * Signature: (J)V
627  */
Java_org_rocksdb_WriteBatch_markWalTerminationPoint(JNIEnv *,jobject,jlong jwb_handle)628 void Java_org_rocksdb_WriteBatch_markWalTerminationPoint(JNIEnv* /*env*/,
629                                                          jobject /*jobj*/,
630                                                          jlong jwb_handle) {
631   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
632   assert(wb != nullptr);
633 
634   wb->MarkWalTerminationPoint();
635 }
636 
637 /*
638  * Class:     org_rocksdb_WriteBatch
639  * Method:    getWalTerminationPoint
640  * Signature: (J)Lorg/rocksdb/WriteBatch/SavePoint;
641  */
Java_org_rocksdb_WriteBatch_getWalTerminationPoint(JNIEnv * env,jobject,jlong jwb_handle)642 jobject Java_org_rocksdb_WriteBatch_getWalTerminationPoint(JNIEnv* env,
643                                                            jobject /*jobj*/,
644                                                            jlong jwb_handle) {
645   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
646   assert(wb != nullptr);
647 
648   auto save_point = wb->GetWalTerminationPoint();
649   return ROCKSDB_NAMESPACE::WriteBatchSavePointJni::construct(env, save_point);
650 }
651 
652 /*
653  * Class:     org_rocksdb_WriteBatch
654  * Method:    disposeInternal
655  * Signature: (J)V
656  */
Java_org_rocksdb_WriteBatch_disposeInternal(JNIEnv *,jobject,jlong handle)657 void Java_org_rocksdb_WriteBatch_disposeInternal(JNIEnv* /*env*/,
658                                                  jobject /*jobj*/,
659                                                  jlong handle) {
660   auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(handle);
661   assert(wb != nullptr);
662   delete wb;
663 }
664 
665 /*
666  * Class:     org_rocksdb_WriteBatch_Handler
667  * Method:    createNewHandler0
668  * Signature: ()J
669  */
Java_org_rocksdb_WriteBatch_00024Handler_createNewHandler0(JNIEnv * env,jobject jobj)670 jlong Java_org_rocksdb_WriteBatch_00024Handler_createNewHandler0(JNIEnv* env,
671                                                                  jobject jobj) {
672   auto* wbjnic = new ROCKSDB_NAMESPACE::WriteBatchHandlerJniCallback(env, jobj);
673   return reinterpret_cast<jlong>(wbjnic);
674 }
675