044a71e27e
Summary: As discussed in #2742 , this pull-requests brings the iterator's [SeekForPrev()](https://github.com/facebook/rocksdb/wiki/SeekForPrev) functionality to the java-api. It affects all locations in the code where previously only Seek() was supported. All code changes are essentially a copy & paste of the already existing implementations for Seek(). **Please Note**: the changes to the C++ code were applied without fully understanding its effect, so please take a closer look. However, since Seek() and SeekForPrev() provide exactly the same signature, I do not expect any mistake here. The java-tests are extended by new tests for the additional functionality. Compilation (`make rocksdbjavastatic`) and test (`java/make test`) run without errors. Closes https://github.com/facebook/rocksdb/pull/2747 Differential Revision: D5721011 Pulled By: sagar0 fbshipit-source-id: c1f951cddc321592c70dd2d32bc04892f3f119f8
606 lines
19 KiB
C++
606 lines
19 KiB
C++
// 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::WriteBatchWithIndex methods from Java side.
|
|
|
|
#include "include/org_rocksdb_WBWIRocksIterator.h"
|
|
#include "include/org_rocksdb_WriteBatchWithIndex.h"
|
|
#include "rocksdb/comparator.h"
|
|
#include "rocksdb/utilities/write_batch_with_index.h"
|
|
#include "rocksjni/portal.h"
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: newWriteBatchWithIndex
|
|
* Signature: ()J
|
|
*/
|
|
jlong Java_org_rocksdb_WriteBatchWithIndex_newWriteBatchWithIndex__(
|
|
JNIEnv* env, jclass jcls) {
|
|
auto* wbwi = new rocksdb::WriteBatchWithIndex();
|
|
return reinterpret_cast<jlong>(wbwi);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: newWriteBatchWithIndex
|
|
* Signature: (Z)J
|
|
*/
|
|
jlong Java_org_rocksdb_WriteBatchWithIndex_newWriteBatchWithIndex__Z(
|
|
JNIEnv* env, jclass jcls, jboolean joverwrite_key) {
|
|
auto* wbwi =
|
|
new rocksdb::WriteBatchWithIndex(rocksdb::BytewiseComparator(), 0,
|
|
static_cast<bool>(joverwrite_key));
|
|
return reinterpret_cast<jlong>(wbwi);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: newWriteBatchWithIndex
|
|
* Signature: (JIZ)J
|
|
*/
|
|
jlong Java_org_rocksdb_WriteBatchWithIndex_newWriteBatchWithIndex__JIZ(
|
|
JNIEnv* env, jclass jcls, jlong jfallback_index_comparator_handle,
|
|
jint jreserved_bytes, jboolean joverwrite_key) {
|
|
auto* wbwi =
|
|
new rocksdb::WriteBatchWithIndex(
|
|
reinterpret_cast<rocksdb::Comparator*>(jfallback_index_comparator_handle),
|
|
static_cast<size_t>(jreserved_bytes), static_cast<bool>(joverwrite_key));
|
|
return reinterpret_cast<jlong>(wbwi);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: count0
|
|
* Signature: (J)I
|
|
*/
|
|
jint Java_org_rocksdb_WriteBatchWithIndex_count0(
|
|
JNIEnv* env, jobject jobj, jlong jwbwi_handle) {
|
|
auto* wbwi = reinterpret_cast<rocksdb::WriteBatchWithIndex*>(jwbwi_handle);
|
|
assert(wbwi != nullptr);
|
|
|
|
return static_cast<jint>(wbwi->GetWriteBatch()->Count());
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: put
|
|
* Signature: (J[BI[BI)V
|
|
*/
|
|
void Java_org_rocksdb_WriteBatchWithIndex_put__J_3BI_3BI(
|
|
JNIEnv* env, jobject jobj, jlong jwbwi_handle, jbyteArray jkey,
|
|
jint jkey_len, jbyteArray jentry_value, jint jentry_value_len) {
|
|
auto* wbwi = reinterpret_cast<rocksdb::WriteBatchWithIndex*>(jwbwi_handle);
|
|
assert(wbwi != nullptr);
|
|
auto put = [&wbwi] (rocksdb::Slice key, rocksdb::Slice value) {
|
|
wbwi->Put(key, value);
|
|
};
|
|
rocksdb::JniUtil::kv_op(put, env, jobj, jkey, jkey_len, jentry_value,
|
|
jentry_value_len);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: put
|
|
* Signature: (J[BI[BIJ)V
|
|
*/
|
|
void Java_org_rocksdb_WriteBatchWithIndex_put__J_3BI_3BIJ(
|
|
JNIEnv* env, jobject jobj, jlong jwbwi_handle, jbyteArray jkey,
|
|
jint jkey_len, jbyteArray jentry_value, jint jentry_value_len,
|
|
jlong jcf_handle) {
|
|
auto* wbwi = reinterpret_cast<rocksdb::WriteBatchWithIndex*>(jwbwi_handle);
|
|
assert(wbwi != nullptr);
|
|
auto* cf_handle = reinterpret_cast<rocksdb::ColumnFamilyHandle*>(jcf_handle);
|
|
assert(cf_handle != nullptr);
|
|
auto put = [&wbwi, &cf_handle] (rocksdb::Slice key, rocksdb::Slice value) {
|
|
wbwi->Put(cf_handle, key, value);
|
|
};
|
|
rocksdb::JniUtil::kv_op(put, env, jobj, jkey, jkey_len, jentry_value,
|
|
jentry_value_len);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: merge
|
|
* Signature: (J[BI[BI)V
|
|
*/
|
|
void Java_org_rocksdb_WriteBatchWithIndex_merge__J_3BI_3BI(
|
|
JNIEnv* env, jobject jobj, jlong jwbwi_handle, jbyteArray jkey,
|
|
jint jkey_len, jbyteArray jentry_value, jint jentry_value_len) {
|
|
auto* wbwi = reinterpret_cast<rocksdb::WriteBatchWithIndex*>(jwbwi_handle);
|
|
assert(wbwi != nullptr);
|
|
auto merge = [&wbwi] (rocksdb::Slice key, rocksdb::Slice value) {
|
|
wbwi->Merge(key, value);
|
|
};
|
|
rocksdb::JniUtil::kv_op(merge, env, jobj, jkey, jkey_len, jentry_value,
|
|
jentry_value_len);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: merge
|
|
* Signature: (J[BI[BIJ)V
|
|
*/
|
|
void Java_org_rocksdb_WriteBatchWithIndex_merge__J_3BI_3BIJ(
|
|
JNIEnv* env, jobject jobj, jlong jwbwi_handle, jbyteArray jkey,
|
|
jint jkey_len, jbyteArray jentry_value, jint jentry_value_len,
|
|
jlong jcf_handle) {
|
|
auto* wbwi = reinterpret_cast<rocksdb::WriteBatchWithIndex*>(jwbwi_handle);
|
|
assert(wbwi != nullptr);
|
|
auto* cf_handle = reinterpret_cast<rocksdb::ColumnFamilyHandle*>(jcf_handle);
|
|
assert(cf_handle != nullptr);
|
|
auto merge = [&wbwi, &cf_handle] (rocksdb::Slice key, rocksdb::Slice value) {
|
|
wbwi->Merge(cf_handle, key, value);
|
|
};
|
|
rocksdb::JniUtil::kv_op(merge, env, jobj, jkey, jkey_len, jentry_value,
|
|
jentry_value_len);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: remove
|
|
* Signature: (J[BI)V
|
|
*/
|
|
void Java_org_rocksdb_WriteBatchWithIndex_remove__J_3BI(
|
|
JNIEnv* env, jobject jobj, jlong jwbwi_handle, jbyteArray jkey,
|
|
jint jkey_len) {
|
|
auto* wbwi = reinterpret_cast<rocksdb::WriteBatchWithIndex*>(jwbwi_handle);
|
|
assert(wbwi != nullptr);
|
|
auto remove = [&wbwi] (rocksdb::Slice key) {
|
|
wbwi->Delete(key);
|
|
};
|
|
rocksdb::JniUtil::k_op(remove, env, jobj, jkey, jkey_len);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: remove
|
|
* Signature: (J[BIJ)V
|
|
*/
|
|
void Java_org_rocksdb_WriteBatchWithIndex_remove__J_3BIJ(
|
|
JNIEnv* env, jobject jobj, jlong jwbwi_handle, jbyteArray jkey,
|
|
jint jkey_len, jlong jcf_handle) {
|
|
auto* wbwi = reinterpret_cast<rocksdb::WriteBatchWithIndex*>(jwbwi_handle);
|
|
assert(wbwi != nullptr);
|
|
auto* cf_handle = reinterpret_cast<rocksdb::ColumnFamilyHandle*>(jcf_handle);
|
|
assert(cf_handle != nullptr);
|
|
auto remove = [&wbwi, &cf_handle] (rocksdb::Slice key) {
|
|
wbwi->Delete(cf_handle, key);
|
|
};
|
|
rocksdb::JniUtil::k_op(remove, env, jobj, jkey, jkey_len);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: deleteRange
|
|
* Signature: (J[BI[BI)V
|
|
*/
|
|
void Java_org_rocksdb_WriteBatchWithIndex_deleteRange__J_3BI_3BI(
|
|
JNIEnv* env, jobject jobj, jlong jwbwi_handle, jbyteArray jbegin_key,
|
|
jint jbegin_key_len, jbyteArray jend_key, jint jend_key_len) {
|
|
auto* wbwi = reinterpret_cast<rocksdb::WriteBatchWithIndex*>(jwbwi_handle);
|
|
assert(wbwi != nullptr);
|
|
auto deleteRange = [&wbwi](rocksdb::Slice beginKey, rocksdb::Slice endKey) {
|
|
wbwi->DeleteRange(beginKey, endKey);
|
|
};
|
|
rocksdb::JniUtil::kv_op(deleteRange, env, jobj, jbegin_key, jbegin_key_len,
|
|
jend_key, jend_key_len);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: deleteRange
|
|
* Signature: (J[BI[BIJ)V
|
|
*/
|
|
void Java_org_rocksdb_WriteBatchWithIndex_deleteRange__J_3BI_3BIJ(
|
|
JNIEnv* env, jobject jobj, jlong jwbwi_handle, jbyteArray jbegin_key,
|
|
jint jbegin_key_len, jbyteArray jend_key, jint jend_key_len,
|
|
jlong jcf_handle) {
|
|
auto* wbwi = reinterpret_cast<rocksdb::WriteBatchWithIndex*>(jwbwi_handle);
|
|
assert(wbwi != nullptr);
|
|
auto* cf_handle = reinterpret_cast<rocksdb::ColumnFamilyHandle*>(jcf_handle);
|
|
assert(cf_handle != nullptr);
|
|
auto deleteRange = [&wbwi, &cf_handle](rocksdb::Slice beginKey,
|
|
rocksdb::Slice endKey) {
|
|
wbwi->DeleteRange(cf_handle, beginKey, endKey);
|
|
};
|
|
rocksdb::JniUtil::kv_op(deleteRange, env, jobj, jbegin_key, jbegin_key_len,
|
|
jend_key, jend_key_len);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: putLogData
|
|
* Signature: (J[BI)V
|
|
*/
|
|
void Java_org_rocksdb_WriteBatchWithIndex_putLogData(
|
|
JNIEnv* env, jobject jobj, jlong jwbwi_handle, jbyteArray jblob,
|
|
jint jblob_len) {
|
|
auto* wbwi = reinterpret_cast<rocksdb::WriteBatchWithIndex*>(jwbwi_handle);
|
|
assert(wbwi != nullptr);
|
|
auto putLogData = [&wbwi] (rocksdb::Slice blob) {
|
|
wbwi->PutLogData(blob);
|
|
};
|
|
rocksdb::JniUtil::k_op(putLogData, env, jobj, jblob, jblob_len);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: clear
|
|
* Signature: (J)V
|
|
*/
|
|
void Java_org_rocksdb_WriteBatchWithIndex_clear0(
|
|
JNIEnv* env, jobject jobj, jlong jwbwi_handle) {
|
|
auto* wbwi = reinterpret_cast<rocksdb::WriteBatchWithIndex*>(jwbwi_handle);
|
|
assert(wbwi != nullptr);
|
|
|
|
wbwi->Clear();
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: setSavePoint0
|
|
* Signature: (J)V
|
|
*/
|
|
void Java_org_rocksdb_WriteBatchWithIndex_setSavePoint0(
|
|
JNIEnv* env, jobject jobj, jlong jwbwi_handle) {
|
|
auto* wbwi = reinterpret_cast<rocksdb::WriteBatchWithIndex*>(jwbwi_handle);
|
|
assert(wbwi != nullptr);
|
|
|
|
wbwi->SetSavePoint();
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: rollbackToSavePoint0
|
|
* Signature: (J)V
|
|
*/
|
|
void Java_org_rocksdb_WriteBatchWithIndex_rollbackToSavePoint0(
|
|
JNIEnv* env, jobject jobj, jlong jwbwi_handle) {
|
|
auto* wbwi = reinterpret_cast<rocksdb::WriteBatchWithIndex*>(jwbwi_handle);
|
|
assert(wbwi != nullptr);
|
|
|
|
auto s = wbwi->RollbackToSavePoint();
|
|
|
|
if (s.ok()) {
|
|
return;
|
|
}
|
|
|
|
rocksdb::RocksDBExceptionJni::ThrowNew(env, s);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: iterator0
|
|
* Signature: (J)J
|
|
*/
|
|
jlong Java_org_rocksdb_WriteBatchWithIndex_iterator0(
|
|
JNIEnv* env, jobject jobj, jlong jwbwi_handle) {
|
|
auto* wbwi = reinterpret_cast<rocksdb::WriteBatchWithIndex*>(jwbwi_handle);
|
|
auto* wbwi_iterator = wbwi->NewIterator();
|
|
return reinterpret_cast<jlong>(wbwi_iterator);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: iterator1
|
|
* Signature: (JJ)J
|
|
*/
|
|
jlong Java_org_rocksdb_WriteBatchWithIndex_iterator1(
|
|
JNIEnv* env, jobject jobj, jlong jwbwi_handle, jlong jcf_handle) {
|
|
auto* wbwi = reinterpret_cast<rocksdb::WriteBatchWithIndex*>(jwbwi_handle);
|
|
auto* cf_handle = reinterpret_cast<rocksdb::ColumnFamilyHandle*>(jcf_handle);
|
|
auto* wbwi_iterator = wbwi->NewIterator(cf_handle);
|
|
return reinterpret_cast<jlong>(wbwi_iterator);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: iteratorWithBase
|
|
* Signature: (JJJ)J
|
|
*/
|
|
jlong Java_org_rocksdb_WriteBatchWithIndex_iteratorWithBase(
|
|
JNIEnv* env, jobject jobj, jlong jwbwi_handle, jlong jcf_handle,
|
|
jlong jbi_handle) {
|
|
auto* wbwi = reinterpret_cast<rocksdb::WriteBatchWithIndex*>(jwbwi_handle);
|
|
auto* cf_handle = reinterpret_cast<rocksdb::ColumnFamilyHandle*>(jcf_handle);
|
|
auto* base_iterator = reinterpret_cast<rocksdb::Iterator*>(jbi_handle);
|
|
auto* iterator = wbwi->NewIteratorWithBase(cf_handle, base_iterator);
|
|
return reinterpret_cast<jlong>(iterator);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: getFromBatch
|
|
* Signature: (JJ[BI)[B
|
|
*/
|
|
jbyteArray JNICALL Java_org_rocksdb_WriteBatchWithIndex_getFromBatch__JJ_3BI(
|
|
JNIEnv* env, jobject jobj, jlong jwbwi_handle, jlong jdbopt_handle,
|
|
jbyteArray jkey, jint jkey_len) {
|
|
auto* wbwi = reinterpret_cast<rocksdb::WriteBatchWithIndex*>(jwbwi_handle);
|
|
auto* dbopt = reinterpret_cast<rocksdb::DBOptions*>(jdbopt_handle);
|
|
|
|
auto getter = [&wbwi, &dbopt](const rocksdb::Slice& key, std::string* value) {
|
|
return wbwi->GetFromBatch(*dbopt, key, value);
|
|
};
|
|
|
|
return rocksdb::JniUtil::v_op(getter, env, jkey, jkey_len);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: getFromBatch
|
|
* Signature: (JJ[BIJ)[B
|
|
*/
|
|
jbyteArray Java_org_rocksdb_WriteBatchWithIndex_getFromBatch__JJ_3BIJ(
|
|
JNIEnv* env, jobject jobj, jlong jwbwi_handle, jlong jdbopt_handle,
|
|
jbyteArray jkey, jint jkey_len, jlong jcf_handle) {
|
|
auto* wbwi = reinterpret_cast<rocksdb::WriteBatchWithIndex*>(jwbwi_handle);
|
|
auto* dbopt = reinterpret_cast<rocksdb::DBOptions*>(jdbopt_handle);
|
|
auto* cf_handle = reinterpret_cast<rocksdb::ColumnFamilyHandle*>(jcf_handle);
|
|
|
|
auto getter =
|
|
[&wbwi, &cf_handle, &dbopt](const rocksdb::Slice& key,
|
|
std::string* value) {
|
|
return wbwi->GetFromBatch(cf_handle, *dbopt, key, value);
|
|
};
|
|
|
|
return rocksdb::JniUtil::v_op(getter, env, jkey, jkey_len);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: getFromBatchAndDB
|
|
* Signature: (JJJ[BI)[B
|
|
*/
|
|
jbyteArray Java_org_rocksdb_WriteBatchWithIndex_getFromBatchAndDB__JJJ_3BI(
|
|
JNIEnv* env, jobject jobj, jlong jwbwi_handle, jlong jdb_handle,
|
|
jlong jreadopt_handle, jbyteArray jkey, jint jkey_len) {
|
|
auto* wbwi = reinterpret_cast<rocksdb::WriteBatchWithIndex*>(jwbwi_handle);
|
|
auto* db = reinterpret_cast<rocksdb::DB*>(jdb_handle);
|
|
auto* readopt = reinterpret_cast<rocksdb::ReadOptions*>(jreadopt_handle);
|
|
|
|
auto getter =
|
|
[&wbwi, &db, &readopt](const rocksdb::Slice& key, std::string* value) {
|
|
return wbwi->GetFromBatchAndDB(db, *readopt, key, value);
|
|
};
|
|
|
|
return rocksdb::JniUtil::v_op(getter, env, jkey, jkey_len);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: getFromBatchAndDB
|
|
* Signature: (JJJ[BIJ)[B
|
|
*/
|
|
jbyteArray Java_org_rocksdb_WriteBatchWithIndex_getFromBatchAndDB__JJJ_3BIJ(
|
|
JNIEnv* env, jobject jobj, jlong jwbwi_handle, jlong jdb_handle,
|
|
jlong jreadopt_handle, jbyteArray jkey, jint jkey_len, jlong jcf_handle) {
|
|
auto* wbwi = reinterpret_cast<rocksdb::WriteBatchWithIndex*>(jwbwi_handle);
|
|
auto* db = reinterpret_cast<rocksdb::DB*>(jdb_handle);
|
|
auto* readopt = reinterpret_cast<rocksdb::ReadOptions*>(jreadopt_handle);
|
|
auto* cf_handle = reinterpret_cast<rocksdb::ColumnFamilyHandle*>(jcf_handle);
|
|
|
|
auto getter =
|
|
[&wbwi, &db, &cf_handle, &readopt](const rocksdb::Slice& key,
|
|
std::string* value) {
|
|
return wbwi->GetFromBatchAndDB(db, *readopt, cf_handle, key, value);
|
|
};
|
|
|
|
return rocksdb::JniUtil::v_op(getter, env, jkey, jkey_len);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WriteBatchWithIndex
|
|
* Method: disposeInternal
|
|
* Signature: (J)V
|
|
*/
|
|
void Java_org_rocksdb_WriteBatchWithIndex_disposeInternal(
|
|
JNIEnv* env, jobject jobj, jlong handle) {
|
|
auto* wbwi = reinterpret_cast<rocksdb::WriteBatchWithIndex*>(handle);
|
|
assert(wbwi != nullptr);
|
|
delete wbwi;
|
|
}
|
|
|
|
/* WBWIRocksIterator below */
|
|
|
|
/*
|
|
* Class: org_rocksdb_WBWIRocksIterator
|
|
* Method: disposeInternal
|
|
* Signature: (J)V
|
|
*/
|
|
void Java_org_rocksdb_WBWIRocksIterator_disposeInternal(
|
|
JNIEnv* env, jobject jobj, jlong handle) {
|
|
auto* it = reinterpret_cast<rocksdb::WBWIIterator*>(handle);
|
|
assert(it != nullptr);
|
|
delete it;
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WBWIRocksIterator
|
|
* Method: isValid0
|
|
* Signature: (J)Z
|
|
*/
|
|
jboolean Java_org_rocksdb_WBWIRocksIterator_isValid0(
|
|
JNIEnv* env, jobject jobj, jlong handle) {
|
|
return reinterpret_cast<rocksdb::WBWIIterator*>(handle)->Valid();
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WBWIRocksIterator
|
|
* Method: seekToFirst0
|
|
* Signature: (J)V
|
|
*/
|
|
void Java_org_rocksdb_WBWIRocksIterator_seekToFirst0(
|
|
JNIEnv* env, jobject jobj, jlong handle) {
|
|
reinterpret_cast<rocksdb::WBWIIterator*>(handle)->SeekToFirst();
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WBWIRocksIterator
|
|
* Method: seekToLast0
|
|
* Signature: (J)V
|
|
*/
|
|
void Java_org_rocksdb_WBWIRocksIterator_seekToLast0(
|
|
JNIEnv* env, jobject jobj, jlong handle) {
|
|
reinterpret_cast<rocksdb::WBWIIterator*>(handle)->SeekToLast();
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WBWIRocksIterator
|
|
* Method: next0
|
|
* Signature: (J)V
|
|
*/
|
|
void Java_org_rocksdb_WBWIRocksIterator_next0(
|
|
JNIEnv* env, jobject jobj, jlong handle) {
|
|
reinterpret_cast<rocksdb::WBWIIterator*>(handle)->Next();
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WBWIRocksIterator
|
|
* Method: prev0
|
|
* Signature: (J)V
|
|
*/
|
|
void Java_org_rocksdb_WBWIRocksIterator_prev0(
|
|
JNIEnv* env, jobject jobj, jlong handle) {
|
|
reinterpret_cast<rocksdb::WBWIIterator*>(handle)->Prev();
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WBWIRocksIterator
|
|
* Method: seek0
|
|
* Signature: (J[BI)V
|
|
*/
|
|
void Java_org_rocksdb_WBWIRocksIterator_seek0(
|
|
JNIEnv* env, jobject jobj, jlong handle, jbyteArray jtarget,
|
|
jint jtarget_len) {
|
|
auto* it = reinterpret_cast<rocksdb::WBWIIterator*>(handle);
|
|
jbyte* target = env->GetByteArrayElements(jtarget, nullptr);
|
|
if(target == nullptr) {
|
|
// exception thrown: OutOfMemoryError
|
|
return;
|
|
}
|
|
|
|
rocksdb::Slice target_slice(
|
|
reinterpret_cast<char*>(target), jtarget_len);
|
|
|
|
it->Seek(target_slice);
|
|
|
|
env->ReleaseByteArrayElements(jtarget, target, JNI_ABORT);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WBWIRocksIterator
|
|
* Method: seekForPrev0
|
|
* Signature: (J[BI)V
|
|
*/
|
|
void Java_org_rocksdb_WBWIRocksIterator_seekForPrev0(
|
|
JNIEnv* env, jobject jobj, jlong handle, jbyteArray jtarget,
|
|
jint jtarget_len) {
|
|
auto* it = reinterpret_cast<rocksdb::WBWIIterator*>(handle);
|
|
jbyte* target = env->GetByteArrayElements(jtarget, nullptr);
|
|
if(target == nullptr) {
|
|
// exception thrown: OutOfMemoryError
|
|
return;
|
|
}
|
|
|
|
rocksdb::Slice target_slice(
|
|
reinterpret_cast<char*>(target), jtarget_len);
|
|
|
|
it->SeekForPrev(target_slice);
|
|
|
|
env->ReleaseByteArrayElements(jtarget, target, JNI_ABORT);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WBWIRocksIterator
|
|
* Method: status0
|
|
* Signature: (J)V
|
|
*/
|
|
void Java_org_rocksdb_WBWIRocksIterator_status0(
|
|
JNIEnv* env, jobject jobj, jlong handle) {
|
|
auto* it = reinterpret_cast<rocksdb::WBWIIterator*>(handle);
|
|
rocksdb::Status s = it->status();
|
|
|
|
if (s.ok()) {
|
|
return;
|
|
}
|
|
|
|
rocksdb::RocksDBExceptionJni::ThrowNew(env, s);
|
|
}
|
|
|
|
/*
|
|
* Class: org_rocksdb_WBWIRocksIterator
|
|
* Method: entry1
|
|
* Signature: (J)[J
|
|
*/
|
|
jlongArray Java_org_rocksdb_WBWIRocksIterator_entry1(
|
|
JNIEnv* env, jobject jobj, jlong handle) {
|
|
auto* it = reinterpret_cast<rocksdb::WBWIIterator*>(handle);
|
|
const rocksdb::WriteEntry& we = it->Entry();
|
|
|
|
jlong results[3];
|
|
|
|
//set the type of the write entry
|
|
switch (we.type) {
|
|
case rocksdb::kPutRecord:
|
|
results[0] = 0x1;
|
|
break;
|
|
|
|
case rocksdb::kMergeRecord:
|
|
results[0] = 0x2;
|
|
break;
|
|
|
|
case rocksdb::kDeleteRecord:
|
|
results[0] = 0x4;
|
|
break;
|
|
|
|
case rocksdb::kLogDataRecord:
|
|
results[0] = 0x8;
|
|
break;
|
|
|
|
default:
|
|
results[0] = 0x0;
|
|
}
|
|
|
|
// key_slice and value_slice will be freed by org.rocksdb.DirectSlice#close
|
|
|
|
auto* key_slice = new rocksdb::Slice(we.key.data(), we.key.size());
|
|
results[1] = reinterpret_cast<jlong>(key_slice);
|
|
if (we.type == rocksdb::kDeleteRecord
|
|
|| we.type == rocksdb::kLogDataRecord) {
|
|
// set native handle of value slice to null if no value available
|
|
results[2] = 0;
|
|
} else {
|
|
auto* value_slice = new rocksdb::Slice(we.value.data(), we.value.size());
|
|
results[2] = reinterpret_cast<jlong>(value_slice);
|
|
}
|
|
|
|
jlongArray jresults = env->NewLongArray(3);
|
|
if(jresults == nullptr) {
|
|
// exception thrown: OutOfMemoryError
|
|
if(results[2] != 0) {
|
|
auto* value_slice = reinterpret_cast<rocksdb::Slice*>(results[2]);
|
|
delete value_slice;
|
|
}
|
|
delete key_slice;
|
|
return nullptr;
|
|
}
|
|
|
|
env->SetLongArrayRegion(jresults, 0, 3, results);
|
|
if(env->ExceptionCheck()) {
|
|
// exception thrown: ArrayIndexOutOfBoundsException
|
|
env->DeleteLocalRef(jresults);
|
|
if(results[2] != 0) {
|
|
auto* value_slice = reinterpret_cast<rocksdb::Slice*>(results[2]);
|
|
delete value_slice;
|
|
}
|
|
delete key_slice;
|
|
return nullptr;
|
|
}
|
|
|
|
return jresults;
|
|
}
|