commit
bbb52b21f3
@ -0,0 +1,148 @@ |
||||
// Copyright (c) 2014, Facebook, Inc. All rights reserved.
|
||||
// This source code is licensed under the BSD-style license found in the
|
||||
// LICENSE file in the root directory of this source tree. An additional grant
|
||||
// of patent rights can be found in the PATENTS file in the same directory.
|
||||
//
|
||||
// This file implements the "bridge" between Java and C++ and enables
|
||||
// calling c++ rocksdb::WriteBatch methods testing from Java side.
|
||||
#include <memory> |
||||
|
||||
#include "db/memtable.h" |
||||
#include "db/write_batch_internal.h" |
||||
#include "db/writebuffer.h" |
||||
#include "include/org_rocksdb_WriteBatch.h" |
||||
#include "include/org_rocksdb_WriteBatch_Handler.h" |
||||
#include "include/org_rocksdb_WriteBatchTest.h" |
||||
#include "include/org_rocksdb_WriteBatchTestInternalHelper.h" |
||||
#include "rocksdb/db.h" |
||||
#include "rocksdb/env.h" |
||||
#include "rocksdb/immutable_options.h" |
||||
#include "rocksdb/memtablerep.h" |
||||
#include "rocksdb/status.h" |
||||
#include "rocksdb/write_batch.h" |
||||
#include "rocksjni/portal.h" |
||||
#include "util/logging.h" |
||||
#include "util/scoped_arena_iterator.h" |
||||
#include "util/testharness.h" |
||||
|
||||
/*
|
||||
* Class: org_rocksdb_WriteBatchTest |
||||
* Method: getContents |
||||
* Signature: (Lorg/rocksdb/WriteBatch;)[B |
||||
*/ |
||||
jbyteArray Java_org_rocksdb_WriteBatchTest_getContents( |
||||
JNIEnv* env, jclass jclazz, jobject jobj) { |
||||
rocksdb::WriteBatch* b = rocksdb::WriteBatchJni::getHandle(env, jobj); |
||||
assert(b != nullptr); |
||||
|
||||
// todo: Currently the following code is directly copied from
|
||||
// db/write_bench_test.cc. It could be implemented in java once
|
||||
// all the necessary components can be accessed via jni api.
|
||||
|
||||
rocksdb::InternalKeyComparator cmp(rocksdb::BytewiseComparator()); |
||||
auto factory = std::make_shared<rocksdb::SkipListFactory>(); |
||||
rocksdb::Options options; |
||||
rocksdb::WriteBuffer wb(options.db_write_buffer_size); |
||||
options.memtable_factory = factory; |
||||
rocksdb::MemTable* mem = new rocksdb::MemTable( |
||||
cmp, rocksdb::ImmutableCFOptions(options), |
||||
rocksdb::MutableCFOptions(options, rocksdb::ImmutableCFOptions(options)), |
||||
&wb); |
||||
mem->Ref(); |
||||
std::string state; |
||||
rocksdb::ColumnFamilyMemTablesDefault cf_mems_default(mem); |
||||
rocksdb::Status s = |
||||
rocksdb::WriteBatchInternal::InsertInto(b, &cf_mems_default); |
||||
int count = 0; |
||||
rocksdb::Arena arena; |
||||
rocksdb::ScopedArenaIterator iter(mem->NewIterator( |
||||
rocksdb::ReadOptions(), &arena)); |
||||
for (iter->SeekToFirst(); iter->Valid(); iter->Next()) { |
||||
rocksdb::ParsedInternalKey ikey; |
||||
memset(reinterpret_cast<void*>(&ikey), 0, sizeof(ikey)); |
||||
ASSERT_TRUE(rocksdb::ParseInternalKey(iter->key(), &ikey)); |
||||
switch (ikey.type) { |
||||
case rocksdb::kTypeValue: |
||||
state.append("Put("); |
||||
state.append(ikey.user_key.ToString()); |
||||
state.append(", "); |
||||
state.append(iter->value().ToString()); |
||||
state.append(")"); |
||||
count++; |
||||
break; |
||||
case rocksdb::kTypeMerge: |
||||
state.append("Merge("); |
||||
state.append(ikey.user_key.ToString()); |
||||
state.append(", "); |
||||
state.append(iter->value().ToString()); |
||||
state.append(")"); |
||||
count++; |
||||
break; |
||||
case rocksdb::kTypeDeletion: |
||||
state.append("Delete("); |
||||
state.append(ikey.user_key.ToString()); |
||||
state.append(")"); |
||||
count++; |
||||
break; |
||||
default: |
||||
assert(false); |
||||
break; |
||||
} |
||||
state.append("@"); |
||||
state.append(rocksdb::NumberToString(ikey.sequence)); |
||||
} |
||||
if (!s.ok()) { |
||||
state.append(s.ToString()); |
||||
} else if (count != rocksdb::WriteBatchInternal::Count(b)) { |
||||
state.append("CountMismatch()"); |
||||
} |
||||
delete mem->Unref(); |
||||
|
||||
jbyteArray jstate = env->NewByteArray(static_cast<jsize>(state.size())); |
||||
env->SetByteArrayRegion(jstate, 0, static_cast<jsize>(state.size()), |
||||
reinterpret_cast<const jbyte*>(state.c_str())); |
||||
|
||||
return jstate; |
||||
} |
||||
|
||||
/*
|
||||
* Class: org_rocksdb_WriteBatchTestInternalHelper |
||||
* Method: setSequence |
||||
* Signature: (Lorg/rocksdb/WriteBatch;J)V |
||||
*/ |
||||
void Java_org_rocksdb_WriteBatchTestInternalHelper_setSequence( |
||||
JNIEnv* env, jclass jclazz, jobject jobj, jlong jsn) { |
||||
rocksdb::WriteBatch* wb = rocksdb::WriteBatchJni::getHandle(env, jobj); |
||||
assert(wb != nullptr); |
||||
|
||||
rocksdb::WriteBatchInternal::SetSequence( |
||||
wb, static_cast<rocksdb::SequenceNumber>(jsn)); |
||||
} |
||||
|
||||
/*
|
||||
* Class: org_rocksdb_WriteBatchTestInternalHelper |
||||
* Method: sequence |
||||
* Signature: (Lorg/rocksdb/WriteBatch;)J |
||||
*/ |
||||
jlong Java_org_rocksdb_WriteBatchTestInternalHelper_sequence( |
||||
JNIEnv* env, jclass jclazz, jobject jobj) { |
||||
rocksdb::WriteBatch* wb = rocksdb::WriteBatchJni::getHandle(env, jobj); |
||||
assert(wb != nullptr); |
||||
|
||||
return static_cast<jlong>(rocksdb::WriteBatchInternal::Sequence(wb)); |
||||
} |
||||
|
||||
/*
|
||||
* Class: org_rocksdb_WriteBatchTestInternalHelper |
||||
* Method: append |
||||
* Signature: (Lorg/rocksdb/WriteBatch;Lorg/rocksdb/WriteBatch;)V |
||||
*/ |
||||
void Java_org_rocksdb_WriteBatchTestInternalHelper_append( |
||||
JNIEnv* env, jclass jclazz, jobject jwb1, jobject jwb2) { |
||||
rocksdb::WriteBatch* wb1 = rocksdb::WriteBatchJni::getHandle(env, jwb1); |
||||
assert(wb1 != nullptr); |
||||
rocksdb::WriteBatch* wb2 = rocksdb::WriteBatchJni::getHandle(env, jwb2); |
||||
assert(wb2 != nullptr); |
||||
|
||||
rocksdb::WriteBatchInternal::Append(wb1, wb2); |
||||
} |
@ -1,14 +1,10 @@ |
||||
package org.rocksdb.test; |
||||
package org.rocksdb; |
||||
|
||||
|
||||
import org.junit.ClassRule; |
||||
import org.junit.Rule; |
||||
import org.junit.Test; |
||||
import org.junit.rules.TemporaryFolder; |
||||
import org.rocksdb.Checkpoint; |
||||
import org.rocksdb.Options; |
||||
import org.rocksdb.RocksDB; |
||||
import org.rocksdb.RocksDBException; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
@ -1,10 +1,9 @@ |
||||
package org.rocksdb.test; |
||||
package org.rocksdb; |
||||
|
||||
import org.junit.ClassRule; |
||||
import org.junit.Rule; |
||||
import org.junit.Test; |
||||
import org.junit.rules.TemporaryFolder; |
||||
import org.rocksdb.*; |
||||
|
||||
import java.io.IOException; |
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue