| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674 | // Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.//  This source code is licensed under both the GPLv2 (found in the//  COPYING file in the root directory) and Apache 2.0 License//  (found in the LICENSE.Apache file in the root directory).//// This file implements the "bridge" between Java and C++ and enables// calling c++ ROCKSDB_NAMESPACE::WriteBatch methods from Java side.#include <memory>#include "db/memtable.h"#include "db/write_batch_internal.h"#include "include/org_rocksdb_WriteBatch.h"#include "include/org_rocksdb_WriteBatch_Handler.h"#include "logging/logging.h"#include "rocksdb/db.h"#include "rocksdb/env.h"#include "rocksdb/memtablerep.h"#include "rocksdb/status.h"#include "rocksdb/write_batch.h"#include "rocksdb/write_buffer_manager.h"#include "rocksjni/portal.h"#include "rocksjni/writebatchhandlerjnicallback.h"#include "table/scoped_arena_iterator.h"/* * Class:     org_rocksdb_WriteBatch * Method:    newWriteBatch * Signature: (I)J */jlong Java_org_rocksdb_WriteBatch_newWriteBatch__I(JNIEnv* /*env*/,                                                   jclass /*jcls*/,                                                   jint jreserved_bytes) {  auto* wb =      new ROCKSDB_NAMESPACE::WriteBatch(static_cast<size_t>(jreserved_bytes));  return reinterpret_cast<jlong>(wb);}/* * Class:     org_rocksdb_WriteBatch * Method:    newWriteBatch * Signature: ([BI)J */jlong Java_org_rocksdb_WriteBatch_newWriteBatch___3BI(JNIEnv* env,                                                      jclass /*jcls*/,                                                      jbyteArray jserialized,                                                      jint jserialized_length) {  jboolean has_exception = JNI_FALSE;  std::string serialized = ROCKSDB_NAMESPACE::JniUtil::byteString<std::string>(      env, jserialized, jserialized_length,      [](const char* str, const size_t len) { return std::string(str, len); },      &has_exception);  if (has_exception == JNI_TRUE) {    // exception occurred    return 0;  }  auto* wb = new ROCKSDB_NAMESPACE::WriteBatch(serialized);  return reinterpret_cast<jlong>(wb);}/* * Class:     org_rocksdb_WriteBatch * Method:    count0 * Signature: (J)I */jint Java_org_rocksdb_WriteBatch_count0(JNIEnv* /*env*/, jobject /*jobj*/,                                        jlong jwb_handle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  return static_cast<jint>(wb->Count());}/* * Class:     org_rocksdb_WriteBatch * Method:    clear0 * Signature: (J)V */void Java_org_rocksdb_WriteBatch_clear0(JNIEnv* /*env*/, jobject /*jobj*/,                                        jlong jwb_handle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  wb->Clear();}/* * Class:     org_rocksdb_WriteBatch * Method:    setSavePoint0 * Signature: (J)V */void Java_org_rocksdb_WriteBatch_setSavePoint0(JNIEnv* /*env*/,                                               jobject /*jobj*/,                                               jlong jwb_handle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  wb->SetSavePoint();}/* * Class:     org_rocksdb_WriteBatch * Method:    rollbackToSavePoint0 * Signature: (J)V */void Java_org_rocksdb_WriteBatch_rollbackToSavePoint0(JNIEnv* env,                                                      jobject /*jobj*/,                                                      jlong jwb_handle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  auto s = wb->RollbackToSavePoint();  if (s.ok()) {    return;  }  ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);}/* * Class:     org_rocksdb_WriteBatch * Method:    popSavePoint * Signature: (J)V */void Java_org_rocksdb_WriteBatch_popSavePoint(JNIEnv* env, jobject /*jobj*/,                                              jlong jwb_handle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  auto s = wb->PopSavePoint();  if (s.ok()) {    return;  }  ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);}/* * Class:     org_rocksdb_WriteBatch * Method:    setMaxBytes * Signature: (JJ)V */void Java_org_rocksdb_WriteBatch_setMaxBytes(JNIEnv* /*env*/, jobject /*jobj*/,                                             jlong jwb_handle,                                             jlong jmax_bytes) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  wb->SetMaxBytes(static_cast<size_t>(jmax_bytes));}/* * Class:     org_rocksdb_WriteBatch * Method:    put * Signature: (J[BI[BI)V */void 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) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  auto put = [&wb](ROCKSDB_NAMESPACE::Slice key,                   ROCKSDB_NAMESPACE::Slice value) {    return wb->Put(key, value);  };  std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =      ROCKSDB_NAMESPACE::JniUtil::kv_op(put, env, jobj, jkey, jkey_len,                                        jentry_value, jentry_value_len);  if (status != nullptr && !status->ok()) {    ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);  }}/* * Class:     org_rocksdb_WriteBatch * Method:    put * Signature: (J[BI[BIJ)V */void 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) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  auto* cf_handle =      reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);  assert(cf_handle != nullptr);  auto put = [&wb, &cf_handle](ROCKSDB_NAMESPACE::Slice key,                               ROCKSDB_NAMESPACE::Slice value) {    return wb->Put(cf_handle, key, value);  };  std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =      ROCKSDB_NAMESPACE::JniUtil::kv_op(put, env, jobj, jkey, jkey_len,                                        jentry_value, jentry_value_len);  if (status != nullptr && !status->ok()) {    ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);  }}/* * Class:     org_rocksdb_WriteBatch * Method:    putDirect * Signature: (JLjava/nio/ByteBuffer;IILjava/nio/ByteBuffer;IIJ)V */void Java_org_rocksdb_WriteBatch_putDirect(JNIEnv* env, jobject /*jobj*/,                                           jlong jwb_handle, jobject jkey,                                           jint jkey_offset, jint jkey_len,                                           jobject jval, jint jval_offset,                                           jint jval_len, jlong jcf_handle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  auto* cf_handle =      reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);  auto put = [&wb, &cf_handle](ROCKSDB_NAMESPACE::Slice& key,                               ROCKSDB_NAMESPACE::Slice& value) {    if (cf_handle == nullptr) {      wb->Put(key, value);    } else {      wb->Put(cf_handle, key, value);    }  };  ROCKSDB_NAMESPACE::JniUtil::kv_op_direct(      put, env, jkey, jkey_offset, jkey_len, jval, jval_offset, jval_len);}/* * Class:     org_rocksdb_WriteBatch * Method:    merge * Signature: (J[BI[BI)V */void 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) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  auto merge = [&wb](ROCKSDB_NAMESPACE::Slice key,                     ROCKSDB_NAMESPACE::Slice value) {    return wb->Merge(key, value);  };  std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =      ROCKSDB_NAMESPACE::JniUtil::kv_op(merge, env, jobj, jkey, jkey_len,                                        jentry_value, jentry_value_len);  if (status != nullptr && !status->ok()) {    ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);  }}/* * Class:     org_rocksdb_WriteBatch * Method:    merge * Signature: (J[BI[BIJ)V */void 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) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  auto* cf_handle =      reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);  assert(cf_handle != nullptr);  auto merge = [&wb, &cf_handle](ROCKSDB_NAMESPACE::Slice key,                                 ROCKSDB_NAMESPACE::Slice value) {    return wb->Merge(cf_handle, key, value);  };  std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =      ROCKSDB_NAMESPACE::JniUtil::kv_op(merge, env, jobj, jkey, jkey_len,                                        jentry_value, jentry_value_len);  if (status != nullptr && !status->ok()) {    ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);  }}/* * Class:     org_rocksdb_WriteBatch * Method:    delete * Signature: (J[BI)V */void Java_org_rocksdb_WriteBatch_delete__J_3BI(JNIEnv* env, jobject jobj,                                               jlong jwb_handle,                                               jbyteArray jkey, jint jkey_len) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  auto remove = [&wb](ROCKSDB_NAMESPACE::Slice key) { return wb->Delete(key); };  std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =      ROCKSDB_NAMESPACE::JniUtil::k_op(remove, env, jobj, jkey, jkey_len);  if (status != nullptr && !status->ok()) {    ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);  }}/* * Class:     org_rocksdb_WriteBatch * Method:    delete * Signature: (J[BIJ)V */void Java_org_rocksdb_WriteBatch_delete__J_3BIJ(JNIEnv* env, jobject jobj,                                                jlong jwb_handle,                                                jbyteArray jkey, jint jkey_len,                                                jlong jcf_handle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  auto* cf_handle =      reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);  assert(cf_handle != nullptr);  auto remove = [&wb, &cf_handle](ROCKSDB_NAMESPACE::Slice key) {    return wb->Delete(cf_handle, key);  };  std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =      ROCKSDB_NAMESPACE::JniUtil::k_op(remove, env, jobj, jkey, jkey_len);  if (status != nullptr && !status->ok()) {    ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);  }}/* * Class:     org_rocksdb_WriteBatch * Method:    singleDelete * Signature: (J[BI)V */void Java_org_rocksdb_WriteBatch_singleDelete__J_3BI(JNIEnv* env, jobject jobj,                                                     jlong jwb_handle,                                                     jbyteArray jkey,                                                     jint jkey_len) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  auto single_delete = [&wb](ROCKSDB_NAMESPACE::Slice key) {    return wb->SingleDelete(key);  };  std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =      ROCKSDB_NAMESPACE::JniUtil::k_op(single_delete, env, jobj, jkey,                                       jkey_len);  if (status != nullptr && !status->ok()) {    ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);  }}/* * Class:     org_rocksdb_WriteBatch * Method:    singleDelete * Signature: (J[BIJ)V */void Java_org_rocksdb_WriteBatch_singleDelete__J_3BIJ(JNIEnv* env, jobject jobj,                                                      jlong jwb_handle,                                                      jbyteArray jkey,                                                      jint jkey_len,                                                      jlong jcf_handle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  auto* cf_handle =      reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);  assert(cf_handle != nullptr);  auto single_delete = [&wb, &cf_handle](ROCKSDB_NAMESPACE::Slice key) {    return wb->SingleDelete(cf_handle, key);  };  std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =      ROCKSDB_NAMESPACE::JniUtil::k_op(single_delete, env, jobj, jkey,                                       jkey_len);  if (status != nullptr && !status->ok()) {    ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);  }}/* * Class:     org_rocksdb_WriteBatch * Method:    removeDirect * Signature: (JLjava/nio/ByteBuffer;IIJ)V */void Java_org_rocksdb_WriteBatch_removeDirect(JNIEnv* env, jobject /*jobj*/,                                              jlong jwb_handle, jobject jkey,                                              jint jkey_offset, jint jkey_len,                                              jlong jcf_handle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  auto* cf_handle =      reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);  auto remove = [&wb, &cf_handle](ROCKSDB_NAMESPACE::Slice& key) {    if (cf_handle == nullptr) {      wb->Delete(key);    } else {      wb->Delete(cf_handle, key);    }  };  ROCKSDB_NAMESPACE::JniUtil::k_op_direct(remove, env, jkey, jkey_offset,                                          jkey_len);}/* * Class:     org_rocksdb_WriteBatch * Method:    deleteRange * Signature: (J[BI[BI)V */void 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) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  auto deleteRange = [&wb](ROCKSDB_NAMESPACE::Slice beginKey,                           ROCKSDB_NAMESPACE::Slice endKey) {    return wb->DeleteRange(beginKey, endKey);  };  std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =      ROCKSDB_NAMESPACE::JniUtil::kv_op(deleteRange, env, jobj, jbegin_key,                                        jbegin_key_len, jend_key, jend_key_len);  if (status != nullptr && !status->ok()) {    ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);  }}/* * Class:     org_rocksdb_WriteBatch * Method:    deleteRange * Signature: (J[BI[BIJ)V */void 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) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  auto* cf_handle =      reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);  assert(cf_handle != nullptr);  auto deleteRange = [&wb, &cf_handle](ROCKSDB_NAMESPACE::Slice beginKey,                                       ROCKSDB_NAMESPACE::Slice endKey) {    return wb->DeleteRange(cf_handle, beginKey, endKey);  };  std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =      ROCKSDB_NAMESPACE::JniUtil::kv_op(deleteRange, env, jobj, jbegin_key,                                        jbegin_key_len, jend_key, jend_key_len);  if (status != nullptr && !status->ok()) {    ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);  }}/* * Class:     org_rocksdb_WriteBatch * Method:    putLogData * Signature: (J[BI)V */void Java_org_rocksdb_WriteBatch_putLogData(JNIEnv* env, jobject jobj,                                            jlong jwb_handle, jbyteArray jblob,                                            jint jblob_len) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  auto putLogData = [&wb](ROCKSDB_NAMESPACE::Slice blob) {    return wb->PutLogData(blob);  };  std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =      ROCKSDB_NAMESPACE::JniUtil::k_op(putLogData, env, jobj, jblob, jblob_len);  if (status != nullptr && !status->ok()) {    ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, status);  }}/* * Class:     org_rocksdb_WriteBatch * Method:    iterate * Signature: (JJ)V */void Java_org_rocksdb_WriteBatch_iterate(JNIEnv* env, jobject /*jobj*/,                                         jlong jwb_handle,                                         jlong handlerHandle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  ROCKSDB_NAMESPACE::Status s = wb->Iterate(      reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchHandlerJniCallback*>(          handlerHandle));  if (s.ok()) {    return;  }  ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);}/* * Class:     org_rocksdb_WriteBatch * Method:    data * Signature: (J)[B */jbyteArray Java_org_rocksdb_WriteBatch_data(JNIEnv* env, jobject /*jobj*/,                                            jlong jwb_handle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  auto data = wb->Data();  return ROCKSDB_NAMESPACE::JniUtil::copyBytes(env, data);}/* * Class:     org_rocksdb_WriteBatch * Method:    getDataSize * Signature: (J)J */jlong Java_org_rocksdb_WriteBatch_getDataSize(JNIEnv* /*env*/, jobject /*jobj*/,                                              jlong jwb_handle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  auto data_size = wb->GetDataSize();  return static_cast<jlong>(data_size);}/* * Class:     org_rocksdb_WriteBatch * Method:    hasPut * Signature: (J)Z */jboolean Java_org_rocksdb_WriteBatch_hasPut(JNIEnv* /*env*/, jobject /*jobj*/,                                            jlong jwb_handle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  return wb->HasPut();}/* * Class:     org_rocksdb_WriteBatch * Method:    hasDelete * Signature: (J)Z */jboolean Java_org_rocksdb_WriteBatch_hasDelete(JNIEnv* /*env*/,                                               jobject /*jobj*/,                                               jlong jwb_handle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  return wb->HasDelete();}/* * Class:     org_rocksdb_WriteBatch * Method:    hasSingleDelete * Signature: (J)Z */JNIEXPORT jboolean JNICALL Java_org_rocksdb_WriteBatch_hasSingleDelete(    JNIEnv* /*env*/, jobject /*jobj*/, jlong jwb_handle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  return wb->HasSingleDelete();}/* * Class:     org_rocksdb_WriteBatch * Method:    hasDeleteRange * Signature: (J)Z */JNIEXPORT jboolean JNICALL Java_org_rocksdb_WriteBatch_hasDeleteRange(    JNIEnv* /*env*/, jobject /*jobj*/, jlong jwb_handle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  return wb->HasDeleteRange();}/* * Class:     org_rocksdb_WriteBatch * Method:    hasMerge * Signature: (J)Z */JNIEXPORT jboolean JNICALL Java_org_rocksdb_WriteBatch_hasMerge(    JNIEnv* /*env*/, jobject /*jobj*/, jlong jwb_handle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  return wb->HasMerge();}/* * Class:     org_rocksdb_WriteBatch * Method:    hasBeginPrepare * Signature: (J)Z */JNIEXPORT jboolean JNICALL Java_org_rocksdb_WriteBatch_hasBeginPrepare(    JNIEnv* /*env*/, jobject /*jobj*/, jlong jwb_handle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  return wb->HasBeginPrepare();}/* * Class:     org_rocksdb_WriteBatch * Method:    hasEndPrepare * Signature: (J)Z */JNIEXPORT jboolean JNICALL Java_org_rocksdb_WriteBatch_hasEndPrepare(    JNIEnv* /*env*/, jobject /*jobj*/, jlong jwb_handle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  return wb->HasEndPrepare();}/* * Class:     org_rocksdb_WriteBatch * Method:    hasCommit * Signature: (J)Z */JNIEXPORT jboolean JNICALL Java_org_rocksdb_WriteBatch_hasCommit(    JNIEnv* /*env*/, jobject /*jobj*/, jlong jwb_handle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  return wb->HasCommit();}/* * Class:     org_rocksdb_WriteBatch * Method:    hasRollback * Signature: (J)Z */JNIEXPORT jboolean JNICALL Java_org_rocksdb_WriteBatch_hasRollback(    JNIEnv* /*env*/, jobject /*jobj*/, jlong jwb_handle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  return wb->HasRollback();}/* * Class:     org_rocksdb_WriteBatch * Method:    markWalTerminationPoint * Signature: (J)V */void Java_org_rocksdb_WriteBatch_markWalTerminationPoint(JNIEnv* /*env*/,                                                         jobject /*jobj*/,                                                         jlong jwb_handle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  wb->MarkWalTerminationPoint();}/* * Class:     org_rocksdb_WriteBatch * Method:    getWalTerminationPoint * Signature: (J)Lorg/rocksdb/WriteBatch/SavePoint; */jobject Java_org_rocksdb_WriteBatch_getWalTerminationPoint(JNIEnv* env,                                                           jobject /*jobj*/,                                                           jlong jwb_handle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);  assert(wb != nullptr);  auto save_point = wb->GetWalTerminationPoint();  return ROCKSDB_NAMESPACE::WriteBatchSavePointJni::construct(env, save_point);}/* * Class:     org_rocksdb_WriteBatch * Method:    disposeInternal * Signature: (J)V */void Java_org_rocksdb_WriteBatch_disposeInternal(JNIEnv* /*env*/,                                                 jobject /*jobj*/,                                                 jlong handle) {  auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(handle);  assert(wb != nullptr);  delete wb;}/* * Class:     org_rocksdb_WriteBatch_Handler * Method:    createNewHandler0 * Signature: ()J */jlong Java_org_rocksdb_WriteBatch_00024Handler_createNewHandler0(JNIEnv* env,                                                                 jobject jobj) {  auto* wbjnic = new ROCKSDB_NAMESPACE::WriteBatchHandlerJniCallback(env, jobj);  return reinterpret_cast<jlong>(wbjnic);}
 |