// This file implements the "bridge" between Java and C++
// for ROCKSDB_NAMESPACE::Transaction.
+#include "rocksdb/utilities/transaction.h"
+
#include <jni.h>
+
#include <functional>
#include "include/org_rocksdb_Transaction.h"
-
-#include "rocksdb/utilities/transaction.h"
+#include "rocksjni/cplusplus_to_java_convert.h"
#include "rocksjni/portal.h"
-using namespace std::placeholders;
-
#if defined(_MSC_VER)
#pragma warning(push)
#pragma warning(disable : 4503) // identifier' : decorated name length
jlong jhandle) {
auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
const ROCKSDB_NAMESPACE::Snapshot* snapshot = txn->GetSnapshot();
- return reinterpret_cast<jlong>(snapshot);
+ return GET_CPLUSPLUS_POINTER(snapshot);
}
/*
// exception thrown: OutOfMemoryError
return nullptr;
}
- env->SetByteArrayRegion(jret_value, 0, static_cast<jsize>(value.size()),
- const_cast<jbyte*>(reinterpret_cast<const jbyte*>(value.c_str())));
+ env->SetByteArrayRegion(
+ jret_value, 0, static_cast<jsize>(value.size()),
+ const_cast<jbyte*>(reinterpret_cast<const jbyte*>(value.c_str())));
if (env->ExceptionCheck()) {
// exception thrown: ArrayIndexOutOfBoundsException
return nullptr;
const ROCKSDB_NAMESPACE::ReadOptions&,
ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
const ROCKSDB_NAMESPACE::Slice&, std::string*)>(
- &ROCKSDB_NAMESPACE::Transaction::Get, txn, _1, column_family_handle,
- _2, _3);
+ &ROCKSDB_NAMESPACE::Transaction::Get, txn, std::placeholders::_1,
+ column_family_handle, std::placeholders::_2, std::placeholders::_3);
return txn_get_helper(env, fn_get, jread_options_handle, jkey, jkey_part_len);
}
std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
const ROCKSDB_NAMESPACE::ReadOptions&,
const ROCKSDB_NAMESPACE::Slice&, std::string*)>(
- &ROCKSDB_NAMESPACE::Transaction::Get, txn, _1, _2, _3);
+ &ROCKSDB_NAMESPACE::Transaction::Get, txn, std::placeholders::_1,
+ std::placeholders::_2, std::placeholders::_3);
return txn_get_helper(env, fn_get, jread_options_handle, jkey, jkey_part_len);
}
if (jcolumn_family_handles != nullptr) {
const jsize len_cols = env->GetArrayLength(jcolumn_family_handles);
if (len_cols > 0) {
- if (env->EnsureLocalCapacity(len_cols) != 0) {
- // out of memory
- *has_exception = JNI_TRUE;
- return std::vector<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>();
- }
-
jlong* jcfh = env->GetLongArrayElements(jcolumn_family_handles, nullptr);
if (jcfh == nullptr) {
// exception thrown: OutOfMemoryError
}
}
+void free_key_values(std::vector<jbyte*>& keys_to_free) {
+ for (auto& key : keys_to_free) {
+ delete[] key;
+ }
+}
+
// TODO(AR) consider refactoring to share this between here and rocksjni.cc
// cf multi get
jobjectArray txn_multi_get_helper(JNIEnv* env, const FnMultiGet& fn_multi_get,
const jlong& jread_options_handle,
const jobjectArray& jkey_parts) {
const jsize len_key_parts = env->GetArrayLength(jkey_parts);
- if (env->EnsureLocalCapacity(len_key_parts) != 0) {
- // out of memory
- return nullptr;
- }
std::vector<ROCKSDB_NAMESPACE::Slice> key_parts;
- std::vector<std::tuple<jbyteArray, jbyte*, jobject>> key_parts_to_free;
+ std::vector<jbyte*> keys_to_free;
for (int i = 0; i < len_key_parts; i++) {
const jobject jk = env->GetObjectArrayElement(jkey_parts, i);
if (env->ExceptionCheck()) {
// exception thrown: ArrayIndexOutOfBoundsException
- free_parts(env, key_parts_to_free);
+ free_key_values(keys_to_free);
return nullptr;
}
jbyteArray jk_ba = reinterpret_cast<jbyteArray>(jk);
const jsize len_key = env->GetArrayLength(jk_ba);
- if (env->EnsureLocalCapacity(len_key) != 0) {
- // out of memory
- env->DeleteLocalRef(jk);
- free_parts(env, key_parts_to_free);
- return nullptr;
- }
- jbyte* jk_val = env->GetByteArrayElements(jk_ba, nullptr);
+ jbyte* jk_val = new jbyte[len_key];
if (jk_val == nullptr) {
// exception thrown: OutOfMemoryError
env->DeleteLocalRef(jk);
- free_parts(env, key_parts_to_free);
+ free_key_values(keys_to_free);
+
+ jclass exception_cls = (env)->FindClass("java/lang/OutOfMemoryError");
+ (env)->ThrowNew(exception_cls,
+ "Insufficient Memory for CF handle array.");
return nullptr;
}
+ env->GetByteArrayRegion(jk_ba, 0, len_key, jk_val);
ROCKSDB_NAMESPACE::Slice key_slice(reinterpret_cast<char*>(jk_val),
len_key);
key_parts.push_back(key_slice);
-
- key_parts_to_free.push_back(std::make_tuple(jk_ba, jk_val, jk));
+ keys_to_free.push_back(jk_val);
+ env->DeleteLocalRef(jk);
}
auto* read_options =
fn_multi_get(*read_options, key_parts, &value_parts);
// free up allocated byte arrays
- free_parts(env, key_parts_to_free);
+ free_key_values(keys_to_free);
// prepare the results
const jclass jcls_ba = env->FindClass("[B");
env->SetByteArrayRegion(
jentry_value, 0, static_cast<jsize>(value_parts[i].size()),
- const_cast<jbyte*>(reinterpret_cast<const jbyte*>(value_parts[i].c_str())));
+ const_cast<jbyte*>(
+ reinterpret_cast<const jbyte*>(value_parts[i].c_str())));
if (env->ExceptionCheck()) {
// exception thrown: ArrayIndexOutOfBoundsException
env->DeleteLocalRef(jentry_value);
const ROCKSDB_NAMESPACE::ReadOptions&,
const std::vector<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>&,
const std::vector<ROCKSDB_NAMESPACE::Slice>&, std::vector<std::string>*)>(
- &ROCKSDB_NAMESPACE::Transaction::MultiGet, txn, _1, column_family_handles,
- _2, _3);
+ &ROCKSDB_NAMESPACE::Transaction::MultiGet, txn, std::placeholders::_1,
+ column_family_handles, std::placeholders::_2, std::placeholders::_3);
return txn_multi_get_helper(env, fn_multi_get, jread_options_handle,
jkey_parts);
}
ROCKSDB_NAMESPACE::Transaction::*)(
const ROCKSDB_NAMESPACE::ReadOptions&,
const std::vector<ROCKSDB_NAMESPACE::Slice>&, std::vector<std::string>*)>(
- &ROCKSDB_NAMESPACE::Transaction::MultiGet, txn, _1, _2, _3);
+ &ROCKSDB_NAMESPACE::Transaction::MultiGet, txn, std::placeholders::_1,
+ std::placeholders::_2, std::placeholders::_3);
return txn_multi_get_helper(env, fn_multi_get, jread_options_handle,
jkey_parts);
}
const ROCKSDB_NAMESPACE::ReadOptions&,
ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
const ROCKSDB_NAMESPACE::Slice&, std::string*, bool, bool)>(
- &ROCKSDB_NAMESPACE::Transaction::GetForUpdate, txn, _1,
- column_family_handle, _2, _3, jexclusive, jdo_validate);
+ &ROCKSDB_NAMESPACE::Transaction::GetForUpdate, txn,
+ std::placeholders::_1, column_family_handle, std::placeholders::_2,
+ std::placeholders::_3, jexclusive, jdo_validate);
return txn_get_helper(env, fn_get_for_update, jread_options_handle, jkey,
jkey_part_len);
}
std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
const ROCKSDB_NAMESPACE::ReadOptions&,
const ROCKSDB_NAMESPACE::Slice&, std::string*, bool, bool)>(
- &ROCKSDB_NAMESPACE::Transaction::GetForUpdate, txn, _1, _2, _3,
+ &ROCKSDB_NAMESPACE::Transaction::GetForUpdate, txn,
+ std::placeholders::_1, std::placeholders::_2, std::placeholders::_3,
jexclusive, jdo_validate);
return txn_get_helper(env, fn_get_for_update, jread_options_handle, jkey,
jkey_part_len);
const ROCKSDB_NAMESPACE::ReadOptions&,
const std::vector<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>&,
const std::vector<ROCKSDB_NAMESPACE::Slice>&, std::vector<std::string>*)>(
- &ROCKSDB_NAMESPACE::Transaction::MultiGetForUpdate, txn, _1,
- column_family_handles, _2, _3);
+ &ROCKSDB_NAMESPACE::Transaction::MultiGetForUpdate, txn,
+ std::placeholders::_1, column_family_handles, std::placeholders::_2,
+ std::placeholders::_3);
return txn_multi_get_helper(env, fn_multi_get_for_update,
jread_options_handle, jkey_parts);
}
ROCKSDB_NAMESPACE::Status> (ROCKSDB_NAMESPACE::Transaction::*)(
const ROCKSDB_NAMESPACE::ReadOptions&,
const std::vector<ROCKSDB_NAMESPACE::Slice>&, std::vector<std::string>*)>(
- &ROCKSDB_NAMESPACE::Transaction::MultiGetForUpdate, txn, _1, _2, _3);
+ &ROCKSDB_NAMESPACE::Transaction::MultiGetForUpdate, txn,
+ std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
return txn_multi_get_helper(env, fn_multi_get_for_update,
jread_options_handle, jkey_parts);
}
auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
auto* read_options =
reinterpret_cast<ROCKSDB_NAMESPACE::ReadOptions*>(jread_options_handle);
- return reinterpret_cast<jlong>(txn->GetIterator(*read_options));
+ return GET_CPLUSPLUS_POINTER(txn->GetIterator(*read_options));
}
/*
auto* column_family_handle =
reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(
jcolumn_family_handle);
- return reinterpret_cast<jlong>(
+ return GET_CPLUSPLUS_POINTER(
txn->GetIterator(*read_options, column_family_handle));
}
ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
const ROCKSDB_NAMESPACE::Slice&, const ROCKSDB_NAMESPACE::Slice&,
bool)>(&ROCKSDB_NAMESPACE::Transaction::Put, txn,
- column_family_handle, _1, _2, jassume_tracked);
+ column_family_handle, std::placeholders::_1,
+ std::placeholders::_2, jassume_tracked);
txn_write_kv_helper(env, fn_put, jkey, jkey_part_len, jval, jval_len);
}
FnWriteKV fn_put =
std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
const ROCKSDB_NAMESPACE::Slice&, const ROCKSDB_NAMESPACE::Slice&)>(
- &ROCKSDB_NAMESPACE::Transaction::Put, txn, _1, _2);
+ &ROCKSDB_NAMESPACE::Transaction::Put, txn, std::placeholders::_1,
+ std::placeholders::_2);
txn_write_kv_helper(env, fn_put, jkey, jkey_part_len, jval, jval_len);
}
const jobjectArray& jvalue_parts,
const jint& jvalue_parts_len) {
#ifndef DEBUG
- (void) jvalue_parts_len;
+ (void)jvalue_parts_len;
#else
assert(jkey_parts_len == jvalue_parts_len);
#endif
auto value_parts = std::vector<ROCKSDB_NAMESPACE::Slice>();
auto jparts_to_free = std::vector<std::tuple<jbyteArray, jbyte*, jobject>>();
+ // Since this is fundamentally a gather write at the RocksDB level,
+ // it seems wrong to refactor it by copying (gathering) keys and data here,
+ // in order to avoid the local reference limit.
+ // The user needs to be a aware that there is a limit to the number of parts
+ // which can be gathered.
+ if (env->EnsureLocalCapacity(jkey_parts_len + jvalue_parts_len) != 0) {
+ // no space for all the jobjects we store up
+ env->ExceptionClear();
+ ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
+ env, "Insufficient JNI local references for " +
+ std::to_string(jkey_parts_len) + " key/value parts");
+ return;
+ }
+
// convert java key_parts/value_parts byte[][] to Slice(s)
for (jsize i = 0; i < jkey_parts_len; ++i) {
const jobject jobj_key_part = env->GetObjectArrayElement(jkey_parts, i);
const jbyteArray jba_key_part = reinterpret_cast<jbyteArray>(jobj_key_part);
const jsize jkey_part_len = env->GetArrayLength(jba_key_part);
- if (env->EnsureLocalCapacity(jkey_part_len) != 0) {
- // out of memory
- env->DeleteLocalRef(jobj_value_part);
- env->DeleteLocalRef(jobj_key_part);
- free_parts(env, jparts_to_free);
- return;
- }
jbyte* jkey_part = env->GetByteArrayElements(jba_key_part, nullptr);
if (jkey_part == nullptr) {
// exception thrown: OutOfMemoryError
const jbyteArray jba_value_part =
reinterpret_cast<jbyteArray>(jobj_value_part);
const jsize jvalue_part_len = env->GetArrayLength(jba_value_part);
- if (env->EnsureLocalCapacity(jvalue_part_len) != 0) {
- // out of memory
- env->DeleteLocalRef(jobj_value_part);
- env->DeleteLocalRef(jobj_key_part);
- env->ReleaseByteArrayElements(jba_key_part, jkey_part, JNI_ABORT);
- free_parts(env, jparts_to_free);
- return;
- }
jbyte* jvalue_part = env->GetByteArrayElements(jba_value_part, nullptr);
if (jvalue_part == nullptr) {
// exception thrown: OutOfMemoryError
- env->ReleaseByteArrayElements(jba_value_part, jvalue_part, JNI_ABORT);
env->DeleteLocalRef(jobj_value_part);
env->DeleteLocalRef(jobj_key_part);
env->ReleaseByteArrayElements(jba_key_part, jkey_part, JNI_ABORT);
ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
const ROCKSDB_NAMESPACE::SliceParts&,
const ROCKSDB_NAMESPACE::SliceParts&, bool)>(
- &ROCKSDB_NAMESPACE::Transaction::Put, txn, column_family_handle, _1,
- _2, jassume_tracked);
+ &ROCKSDB_NAMESPACE::Transaction::Put, txn, column_family_handle,
+ std::placeholders::_1, std::placeholders::_2, jassume_tracked);
txn_write_kv_parts_helper(env, fn_put_parts, jkey_parts, jkey_parts_len,
jvalue_parts, jvalue_parts_len);
}
FnWriteKVParts fn_put_parts = std::bind<ROCKSDB_NAMESPACE::Status (
ROCKSDB_NAMESPACE::Transaction::*)(const ROCKSDB_NAMESPACE::SliceParts&,
const ROCKSDB_NAMESPACE::SliceParts&)>(
- &ROCKSDB_NAMESPACE::Transaction::Put, txn, _1, _2);
+ &ROCKSDB_NAMESPACE::Transaction::Put, txn, std::placeholders::_1,
+ std::placeholders::_2);
txn_write_kv_parts_helper(env, fn_put_parts, jkey_parts, jkey_parts_len,
jvalue_parts, jvalue_parts_len);
}
ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
const ROCKSDB_NAMESPACE::Slice&, const ROCKSDB_NAMESPACE::Slice&,
bool)>(&ROCKSDB_NAMESPACE::Transaction::Merge, txn,
- column_family_handle, _1, _2, jassume_tracked);
+ column_family_handle, std::placeholders::_1,
+ std::placeholders::_2, jassume_tracked);
txn_write_kv_helper(env, fn_merge, jkey, jkey_part_len, jval, jval_len);
}
FnWriteKV fn_merge =
std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
const ROCKSDB_NAMESPACE::Slice&, const ROCKSDB_NAMESPACE::Slice&)>(
- &ROCKSDB_NAMESPACE::Transaction::Merge, txn, _1, _2);
+ &ROCKSDB_NAMESPACE::Transaction::Merge, txn, std::placeholders::_1,
+ std::placeholders::_2);
txn_write_kv_helper(env, fn_merge, jkey, jkey_part_len, jval, jval_len);
}
ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
const ROCKSDB_NAMESPACE::Slice&, bool)>(
&ROCKSDB_NAMESPACE::Transaction::Delete, txn, column_family_handle,
- _1, jassume_tracked);
+ std::placeholders::_1, jassume_tracked);
txn_write_k_helper(env, fn_delete, jkey, jkey_part_len);
}
auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
FnWriteK fn_delete = std::bind<ROCKSDB_NAMESPACE::Status (
ROCKSDB_NAMESPACE::Transaction::*)(const ROCKSDB_NAMESPACE::Slice&)>(
- &ROCKSDB_NAMESPACE::Transaction::Delete, txn, _1);
+ &ROCKSDB_NAMESPACE::Transaction::Delete, txn, std::placeholders::_1);
txn_write_k_helper(env, fn_delete, jkey, jkey_part_len);
}
const jbyteArray jba_key_part = reinterpret_cast<jbyteArray>(jobj_key_part);
const jsize jkey_part_len = env->GetArrayLength(jba_key_part);
- if (env->EnsureLocalCapacity(jkey_part_len) != 0) {
- // out of memory
- env->DeleteLocalRef(jobj_key_part);
- free_parts(env, jkey_parts_to_free);
- return;
- }
jbyte* jkey_part = env->GetByteArrayElements(jba_key_part, nullptr);
if (jkey_part == nullptr) {
// exception thrown: OutOfMemoryError
ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
const ROCKSDB_NAMESPACE::SliceParts&, bool)>(
&ROCKSDB_NAMESPACE::Transaction::Delete, txn, column_family_handle,
- _1, jassume_tracked);
+ std::placeholders::_1, jassume_tracked);
txn_write_k_parts_helper(env, fn_delete_parts, jkey_parts, jkey_parts_len);
}
auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
FnWriteKParts fn_delete_parts = std::bind<ROCKSDB_NAMESPACE::Status (
ROCKSDB_NAMESPACE::Transaction::*)(const ROCKSDB_NAMESPACE::SliceParts&)>(
- &ROCKSDB_NAMESPACE::Transaction::Delete, txn, _1);
+ &ROCKSDB_NAMESPACE::Transaction::Delete, txn, std::placeholders::_1);
txn_write_k_parts_helper(env, fn_delete_parts, jkey_parts, jkey_parts_len);
}
ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
const ROCKSDB_NAMESPACE::Slice&, bool)>(
&ROCKSDB_NAMESPACE::Transaction::SingleDelete, txn,
- column_family_handle, _1, jassume_tracked);
+ column_family_handle, std::placeholders::_1, jassume_tracked);
txn_write_k_helper(env, fn_single_delete, jkey, jkey_part_len);
}
auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
FnWriteK fn_single_delete = std::bind<ROCKSDB_NAMESPACE::Status (
ROCKSDB_NAMESPACE::Transaction::*)(const ROCKSDB_NAMESPACE::Slice&)>(
- &ROCKSDB_NAMESPACE::Transaction::SingleDelete, txn, _1);
+ &ROCKSDB_NAMESPACE::Transaction::SingleDelete, txn,
+ std::placeholders::_1);
txn_write_k_helper(env, fn_single_delete, jkey, jkey_part_len);
}
ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
const ROCKSDB_NAMESPACE::SliceParts&, bool)>(
&ROCKSDB_NAMESPACE::Transaction::SingleDelete, txn,
- column_family_handle, _1, jassume_tracked);
+ column_family_handle, std::placeholders::_1, jassume_tracked);
txn_write_k_parts_helper(env, fn_single_delete_parts, jkey_parts,
jkey_parts_len);
}
auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
FnWriteKParts fn_single_delete_parts = std::bind<ROCKSDB_NAMESPACE::Status (
ROCKSDB_NAMESPACE::Transaction::*)(const ROCKSDB_NAMESPACE::SliceParts&)>(
- &ROCKSDB_NAMESPACE::Transaction::SingleDelete, txn, _1);
+ &ROCKSDB_NAMESPACE::Transaction::SingleDelete, txn,
+ std::placeholders::_1);
txn_write_k_parts_helper(env, fn_single_delete_parts, jkey_parts,
jkey_parts_len);
}
ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
const ROCKSDB_NAMESPACE::Slice&, const ROCKSDB_NAMESPACE::Slice&)>(
&ROCKSDB_NAMESPACE::Transaction::PutUntracked, txn,
- column_family_handle, _1, _2);
+ column_family_handle, std::placeholders::_1, std::placeholders::_2);
txn_write_kv_helper(env, fn_put_untracked, jkey, jkey_part_len, jval,
jval_len);
}
FnWriteKV fn_put_untracked =
std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
const ROCKSDB_NAMESPACE::Slice&, const ROCKSDB_NAMESPACE::Slice&)>(
- &ROCKSDB_NAMESPACE::Transaction::PutUntracked, txn, _1, _2);
+ &ROCKSDB_NAMESPACE::Transaction::PutUntracked, txn,
+ std::placeholders::_1, std::placeholders::_2);
txn_write_kv_helper(env, fn_put_untracked, jkey, jkey_part_len, jval,
jval_len);
}
const ROCKSDB_NAMESPACE::SliceParts&,
const ROCKSDB_NAMESPACE::SliceParts&)>(
&ROCKSDB_NAMESPACE::Transaction::PutUntracked, txn, column_family_handle,
- _1, _2);
+ std::placeholders::_1, std::placeholders::_2);
txn_write_kv_parts_helper(env, fn_put_parts_untracked, jkey_parts,
jkey_parts_len, jvalue_parts, jvalue_parts_len);
}
FnWriteKVParts fn_put_parts_untracked = std::bind<ROCKSDB_NAMESPACE::Status (
ROCKSDB_NAMESPACE::Transaction::*)(const ROCKSDB_NAMESPACE::SliceParts&,
const ROCKSDB_NAMESPACE::SliceParts&)>(
- &ROCKSDB_NAMESPACE::Transaction::PutUntracked, txn, _1, _2);
+ &ROCKSDB_NAMESPACE::Transaction::PutUntracked, txn, std::placeholders::_1,
+ std::placeholders::_2);
txn_write_kv_parts_helper(env, fn_put_parts_untracked, jkey_parts,
jkey_parts_len, jvalue_parts, jvalue_parts_len);
}
ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
const ROCKSDB_NAMESPACE::Slice&, const ROCKSDB_NAMESPACE::Slice&)>(
&ROCKSDB_NAMESPACE::Transaction::MergeUntracked, txn,
- column_family_handle, _1, _2);
+ column_family_handle, std::placeholders::_1, std::placeholders::_2);
txn_write_kv_helper(env, fn_merge_untracked, jkey, jkey_part_len, jval,
jval_len);
}
FnWriteKV fn_merge_untracked =
std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
const ROCKSDB_NAMESPACE::Slice&, const ROCKSDB_NAMESPACE::Slice&)>(
- &ROCKSDB_NAMESPACE::Transaction::MergeUntracked, txn, _1, _2);
+ &ROCKSDB_NAMESPACE::Transaction::MergeUntracked, txn,
+ std::placeholders::_1, std::placeholders::_2);
txn_write_kv_helper(env, fn_merge_untracked, jkey, jkey_part_len, jval,
jval_len);
}
ROCKSDB_NAMESPACE::Transaction::*)(ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
const ROCKSDB_NAMESPACE::Slice&)>(
&ROCKSDB_NAMESPACE::Transaction::DeleteUntracked, txn,
- column_family_handle, _1);
+ column_family_handle, std::placeholders::_1);
txn_write_k_helper(env, fn_delete_untracked, jkey, jkey_part_len);
}
auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
FnWriteK fn_delete_untracked = std::bind<ROCKSDB_NAMESPACE::Status (
ROCKSDB_NAMESPACE::Transaction::*)(const ROCKSDB_NAMESPACE::Slice&)>(
- &ROCKSDB_NAMESPACE::Transaction::DeleteUntracked, txn, _1);
+ &ROCKSDB_NAMESPACE::Transaction::DeleteUntracked, txn,
+ std::placeholders::_1);
txn_write_k_helper(env, fn_delete_untracked, jkey, jkey_part_len);
}
ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
const ROCKSDB_NAMESPACE::SliceParts&)>(
&ROCKSDB_NAMESPACE::Transaction::DeleteUntracked, txn,
- column_family_handle, _1);
+ column_family_handle, std::placeholders::_1);
txn_write_k_parts_helper(env, fn_delete_untracked_parts, jkey_parts,
jkey_parts_len);
}
FnWriteKParts fn_delete_untracked_parts =
std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
const ROCKSDB_NAMESPACE::SliceParts&)>(
- &ROCKSDB_NAMESPACE::Transaction::DeleteUntracked, txn, _1);
+ &ROCKSDB_NAMESPACE::Transaction::DeleteUntracked, txn,
+ std::placeholders::_1);
txn_write_k_parts_helper(env, fn_delete_untracked_parts, jkey_parts,
jkey_parts_len);
}
jobject /*jobj*/,
jlong jhandle) {
auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
- return reinterpret_cast<jlong>(txn->GetWriteBatch());
+ return GET_CPLUSPLUS_POINTER(txn->GetWriteBatch());
}
/*
jobject /*jobj*/,
jlong jhandle) {
auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
- return reinterpret_cast<jlong>(txn->GetWriteOptions());
+ return GET_CPLUSPLUS_POINTER(txn->GetWriteOptions());
}
/*
jobject /*jobj*/,
jlong jhandle) {
auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
- return reinterpret_cast<jlong>(txn->GetCommitTimeWriteBatch());
+ return GET_CPLUSPLUS_POINTER(txn->GetCommitTimeWriteBatch());
}
/*