#include "rocksdb/sst_file_manager.h"
#include <jni.h>
#include <memory>
#include "include/org_rocksdb_SstFileManager.h"
#include "rocksjni/cplusplus_to_java_convert.h"
#include "rocksjni/portal.h"
jlong Java_org_rocksdb_SstFileManager_newSstFileManager(
JNIEnv* jnienv, jclass , jlong jenv_handle, jlong jlogger_handle,
jlong jrate_bytes, jdouble jmax_trash_db_ratio,
jlong jmax_delete_chunk_bytes) {
auto* env = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jenv_handle);
ROCKSDB_NAMESPACE::Status s;
ROCKSDB_NAMESPACE::SstFileManager* sst_file_manager = nullptr;
if (jlogger_handle != 0) {
auto* sptr_logger =
reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::Logger>*>(
jlogger_handle);
sst_file_manager = ROCKSDB_NAMESPACE::NewSstFileManager(
env, *sptr_logger, "", jrate_bytes, true, &s, jmax_trash_db_ratio,
jmax_delete_chunk_bytes);
} else {
sst_file_manager = ROCKSDB_NAMESPACE::NewSstFileManager(
env, nullptr, "", jrate_bytes, true, &s, jmax_trash_db_ratio,
jmax_delete_chunk_bytes);
}
if (!s.ok()) {
if (sst_file_manager != nullptr) {
delete sst_file_manager;
}
ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(jnienv, s);
}
auto* sptr_sst_file_manager =
new std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>(sst_file_manager);
return GET_CPLUSPLUS_POINTER(sptr_sst_file_manager);
}
void Java_org_rocksdb_SstFileManager_setMaxAllowedSpaceUsage(
JNIEnv* , jclass , jlong jhandle, jlong jmax_allowed_space) {
auto* sptr_sst_file_manager =
reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>*>(
jhandle);
sptr_sst_file_manager->get()->SetMaxAllowedSpaceUsage(jmax_allowed_space);
}
void Java_org_rocksdb_SstFileManager_setCompactionBufferSize(
JNIEnv* , jclass , jlong jhandle,
jlong jcompaction_buffer_size) {
auto* sptr_sst_file_manager =
reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>*>(
jhandle);
sptr_sst_file_manager->get()->SetCompactionBufferSize(
jcompaction_buffer_size);
}
jboolean Java_org_rocksdb_SstFileManager_isMaxAllowedSpaceReached(
JNIEnv* , jclass , jlong jhandle) {
auto* sptr_sst_file_manager =
reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>*>(
jhandle);
return sptr_sst_file_manager->get()->IsMaxAllowedSpaceReached();
}
jboolean
Java_org_rocksdb_SstFileManager_isMaxAllowedSpaceReachedIncludingCompactions(
JNIEnv* , jclass , jlong jhandle) {
auto* sptr_sst_file_manager =
reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>*>(
jhandle);
return sptr_sst_file_manager->get()
->IsMaxAllowedSpaceReachedIncludingCompactions();
}
jlong Java_org_rocksdb_SstFileManager_getTotalSize(JNIEnv* ,
jclass ,
jlong jhandle) {
auto* sptr_sst_file_manager =
reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>*>(
jhandle);
return sptr_sst_file_manager->get()->GetTotalSize();
}
jobject Java_org_rocksdb_SstFileManager_getTrackedFiles(JNIEnv* env,
jclass ,
jlong jhandle) {
auto* sptr_sst_file_manager =
reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>*>(
jhandle);
auto tracked_files = sptr_sst_file_manager->get()->GetTrackedFiles();
const jobject jtracked_files = ROCKSDB_NAMESPACE::HashMapJni::construct(
env, static_cast<uint32_t>(tracked_files.size()));
if (jtracked_files == nullptr) {
return nullptr;
}
const ROCKSDB_NAMESPACE::HashMapJni::FnMapKV<const std::string,
const uint64_t, jobject, jobject>
fn_map_kv =
[env](const std::pair<const std::string, const uint64_t>& pair) {
const jstring jtracked_file_path =
env->NewStringUTF(pair.first.c_str());
if (jtracked_file_path == nullptr) {
return std::unique_ptr<std::pair<jobject, jobject>>(nullptr);
}
const jobject jtracked_file_size =
ROCKSDB_NAMESPACE::LongJni::valueOf(env, pair.second);
if (jtracked_file_size == nullptr) {
return std::unique_ptr<std::pair<jobject, jobject>>(nullptr);
}
return std::unique_ptr<std::pair<jobject, jobject>>(
new std::pair<jobject, jobject>(jtracked_file_path,
jtracked_file_size));
};
if (!ROCKSDB_NAMESPACE::HashMapJni::putAll(env, jtracked_files,
tracked_files.begin(),
tracked_files.end(), fn_map_kv)) {
return nullptr;
}
return jtracked_files;
}
jlong Java_org_rocksdb_SstFileManager_getDeleteRateBytesPerSecond(
JNIEnv* , jclass , jlong jhandle) {
auto* sptr_sst_file_manager =
reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>*>(
jhandle);
return sptr_sst_file_manager->get()->GetDeleteRateBytesPerSecond();
}
void Java_org_rocksdb_SstFileManager_setDeleteRateBytesPerSecond(
JNIEnv* , jclass , jlong jhandle, jlong jdelete_rate) {
auto* sptr_sst_file_manager =
reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>*>(
jhandle);
sptr_sst_file_manager->get()->SetDeleteRateBytesPerSecond(jdelete_rate);
}
jdouble Java_org_rocksdb_SstFileManager_getMaxTrashDBRatio(JNIEnv* ,
jclass ,
jlong jhandle) {
auto* sptr_sst_file_manager =
reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>*>(
jhandle);
return sptr_sst_file_manager->get()->GetMaxTrashDBRatio();
}
void Java_org_rocksdb_SstFileManager_setMaxTrashDBRatio(JNIEnv* ,
jclass ,
jlong jhandle,
jdouble jratio) {
auto* sptr_sst_file_manager =
reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>*>(
jhandle);
sptr_sst_file_manager->get()->SetMaxTrashDBRatio(jratio);
}
void Java_org_rocksdb_SstFileManager_disposeInternalJni(JNIEnv* ,
jclass ,
jlong jhandle) {
auto* sptr_sst_file_manager =
reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::SstFileManager>*>(
jhandle);
delete sptr_sst_file_manager;
}