1 // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
2 // This source code is licensed under both the GPLv2 (found in the
3 // COPYING file in the root directory) and Apache 2.0 License
4 // (found in the LICENSE.Apache file in the root directory).
6 // This file implements the "bridge" between Java and C++ and enables
7 // calling C++ ROCKSDB_NAMESPACE::OptionsUtil methods from Java side.
12 #include "include/org_rocksdb_OptionsUtil.h"
14 #include "rocksdb/db.h"
15 #include "rocksdb/env.h"
16 #include "rocksdb/utilities/options_util.h"
17 #include "rocksjni/portal.h"
19 void build_column_family_descriptor_list(
20 JNIEnv
* env
, jobject jcfds
,
21 std::vector
<ROCKSDB_NAMESPACE::ColumnFamilyDescriptor
>& cf_descs
) {
22 jmethodID add_mid
= ROCKSDB_NAMESPACE::ListJni::getListAddMethodId(env
);
23 if (add_mid
== nullptr) {
24 // exception occurred accessing method
28 // Column family descriptor
29 for (ROCKSDB_NAMESPACE::ColumnFamilyDescriptor
& cfd
: cf_descs
) {
30 // Construct a ColumnFamilyDescriptor java object
32 ROCKSDB_NAMESPACE::ColumnFamilyDescriptorJni::construct(env
, &cfd
);
33 if (env
->ExceptionCheck()) {
34 // exception occurred constructing object
35 if (jcfd
!= nullptr) {
36 env
->DeleteLocalRef(jcfd
);
41 // Add the object to java list.
42 jboolean rs
= env
->CallBooleanMethod(jcfds
, add_mid
, jcfd
);
43 if (env
->ExceptionCheck() || rs
== JNI_FALSE
) {
44 // exception occurred calling method, or could not add
45 if (jcfd
!= nullptr) {
46 env
->DeleteLocalRef(jcfd
);
54 * Class: org_rocksdb_OptionsUtil
55 * Method: loadLatestOptions
56 * Signature: (Ljava/lang/String;JLjava/util/List;Z)V
58 void Java_org_rocksdb_OptionsUtil_loadLatestOptions(
59 JNIEnv
* env
, jclass
/*jcls*/, jstring jdbpath
, jlong jenv_handle
,
60 jlong jdb_opts_handle
, jobject jcfds
, jboolean ignore_unknown_options
) {
61 jboolean has_exception
= JNI_FALSE
;
63 ROCKSDB_NAMESPACE::JniUtil::copyStdString(env
, jdbpath
, &has_exception
);
64 if (has_exception
== JNI_TRUE
) {
68 std::vector
<ROCKSDB_NAMESPACE::ColumnFamilyDescriptor
> cf_descs
;
69 ROCKSDB_NAMESPACE::Status s
= ROCKSDB_NAMESPACE::LoadLatestOptions(
70 db_path
, reinterpret_cast<ROCKSDB_NAMESPACE::Env
*>(jenv_handle
),
71 reinterpret_cast<ROCKSDB_NAMESPACE::DBOptions
*>(jdb_opts_handle
),
72 &cf_descs
, ignore_unknown_options
);
74 // error, raise an exception
75 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, s
);
77 build_column_family_descriptor_list(env
, jcfds
, cf_descs
);
82 * Class: org_rocksdb_OptionsUtil
83 * Method: loadOptionsFromFile
84 * Signature: (Ljava/lang/String;JJLjava/util/List;Z)V
86 void Java_org_rocksdb_OptionsUtil_loadOptionsFromFile(
87 JNIEnv
* env
, jclass
/*jcls*/, jstring jopts_file_name
, jlong jenv_handle
,
88 jlong jdb_opts_handle
, jobject jcfds
, jboolean ignore_unknown_options
) {
89 jboolean has_exception
= JNI_FALSE
;
90 auto opts_file_name
= ROCKSDB_NAMESPACE::JniUtil::copyStdString(
91 env
, jopts_file_name
, &has_exception
);
92 if (has_exception
== JNI_TRUE
) {
96 std::vector
<ROCKSDB_NAMESPACE::ColumnFamilyDescriptor
> cf_descs
;
97 ROCKSDB_NAMESPACE::Status s
= ROCKSDB_NAMESPACE::LoadOptionsFromFile(
98 opts_file_name
, reinterpret_cast<ROCKSDB_NAMESPACE::Env
*>(jenv_handle
),
99 reinterpret_cast<ROCKSDB_NAMESPACE::DBOptions
*>(jdb_opts_handle
),
100 &cf_descs
, ignore_unknown_options
);
102 // error, raise an exception
103 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, s
);
105 build_column_family_descriptor_list(env
, jcfds
, cf_descs
);
110 * Class: org_rocksdb_OptionsUtil
111 * Method: getLatestOptionsFileName
112 * Signature: (Ljava/lang/String;J)Ljava/lang/String;
114 jstring
Java_org_rocksdb_OptionsUtil_getLatestOptionsFileName(
115 JNIEnv
* env
, jclass
/*jcls*/, jstring jdbpath
, jlong jenv_handle
) {
116 jboolean has_exception
= JNI_FALSE
;
118 ROCKSDB_NAMESPACE::JniUtil::copyStdString(env
, jdbpath
, &has_exception
);
119 if (has_exception
== JNI_TRUE
) {
120 // exception occurred
123 std::string options_file_name
;
124 ROCKSDB_NAMESPACE::Status s
= ROCKSDB_NAMESPACE::GetLatestOptionsFileName(
125 db_path
, reinterpret_cast<ROCKSDB_NAMESPACE::Env
*>(jenv_handle
),
128 // error, raise an exception
129 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env
, s
);
132 return env
->NewStringUTF(options_file_name
.c_str());