options_util.cc 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  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).
  5. //
  6. // This file implements the "bridge" between Java and C++ and enables
  7. // calling C++ ROCKSDB_NAMESPACE::OptionsUtil methods from Java side.
  8. #include "rocksdb/utilities/options_util.h"
  9. #include <jni.h>
  10. #include <string>
  11. #include "include/org_rocksdb_OptionsUtil.h"
  12. #include "rocksdb/db.h"
  13. #include "rocksdb/env.h"
  14. #include "rocksjni/portal.h"
  15. void build_column_family_descriptor_list(
  16. JNIEnv* env, jobject jcfds,
  17. std::vector<ROCKSDB_NAMESPACE::ColumnFamilyDescriptor>& cf_descs) {
  18. jmethodID add_mid = ROCKSDB_NAMESPACE::ListJni::getListAddMethodId(env);
  19. if (add_mid == nullptr) {
  20. // exception occurred accessing method
  21. return;
  22. }
  23. // Column family descriptor
  24. for (ROCKSDB_NAMESPACE::ColumnFamilyDescriptor& cfd : cf_descs) {
  25. // Construct a ColumnFamilyDescriptor java object
  26. jobject jcfd =
  27. ROCKSDB_NAMESPACE::ColumnFamilyDescriptorJni::construct(env, &cfd);
  28. if (env->ExceptionCheck()) {
  29. // exception occurred constructing object
  30. if (jcfd != nullptr) {
  31. env->DeleteLocalRef(jcfd);
  32. }
  33. return;
  34. }
  35. // Add the object to java list.
  36. jboolean rs = env->CallBooleanMethod(jcfds, add_mid, jcfd);
  37. if (env->ExceptionCheck() || rs == JNI_FALSE) {
  38. // exception occurred calling method, or could not add
  39. if (jcfd != nullptr) {
  40. env->DeleteLocalRef(jcfd);
  41. }
  42. return;
  43. }
  44. }
  45. }
  46. /*
  47. * Class: org_rocksdb_OptionsUtil
  48. * Method: loadLatestOptions
  49. * Signature: (JLjava/lang/String;JLjava/util/List;)V
  50. */
  51. void Java_org_rocksdb_OptionsUtil_loadLatestOptions(
  52. JNIEnv* env, jclass /*jcls*/, jlong cfg_handle, jstring jdbpath,
  53. jlong jdb_opts_handle, jobject jcfds) {
  54. jboolean has_exception = JNI_FALSE;
  55. auto db_path =
  56. ROCKSDB_NAMESPACE::JniUtil::copyStdString(env, jdbpath, &has_exception);
  57. if (has_exception == JNI_TRUE) {
  58. // exception occurred
  59. return;
  60. }
  61. std::vector<ROCKSDB_NAMESPACE::ColumnFamilyDescriptor> cf_descs;
  62. auto* config_options =
  63. reinterpret_cast<ROCKSDB_NAMESPACE::ConfigOptions*>(cfg_handle);
  64. auto* db_options =
  65. reinterpret_cast<ROCKSDB_NAMESPACE::DBOptions*>(jdb_opts_handle);
  66. ROCKSDB_NAMESPACE::Status s = ROCKSDB_NAMESPACE::LoadLatestOptions(
  67. *config_options, db_path, db_options, &cf_descs);
  68. if (!s.ok()) {
  69. // error, raise an exception
  70. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  71. } else {
  72. build_column_family_descriptor_list(env, jcfds, cf_descs);
  73. }
  74. }
  75. /*
  76. * Class: org_rocksdb_OptionsUtil
  77. * Method: loadOptionsFromFile
  78. * Signature: (JLjava/lang/String;JLjava/util/List;)V
  79. */
  80. void Java_org_rocksdb_OptionsUtil_loadOptionsFromFile(
  81. JNIEnv* env, jclass /*jcls*/, jlong cfg_handle, jstring jopts_file_name,
  82. jlong jdb_opts_handle, jobject jcfds) {
  83. jboolean has_exception = JNI_FALSE;
  84. auto opts_file_name = ROCKSDB_NAMESPACE::JniUtil::copyStdString(
  85. env, jopts_file_name, &has_exception);
  86. if (has_exception == JNI_TRUE) {
  87. // exception occurred
  88. return;
  89. }
  90. std::vector<ROCKSDB_NAMESPACE::ColumnFamilyDescriptor> cf_descs;
  91. auto* config_options =
  92. reinterpret_cast<ROCKSDB_NAMESPACE::ConfigOptions*>(cfg_handle);
  93. auto* db_options =
  94. reinterpret_cast<ROCKSDB_NAMESPACE::DBOptions*>(jdb_opts_handle);
  95. ROCKSDB_NAMESPACE::Status s = ROCKSDB_NAMESPACE::LoadOptionsFromFile(
  96. *config_options, opts_file_name, db_options, &cf_descs);
  97. if (!s.ok()) {
  98. // error, raise an exception
  99. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  100. } else {
  101. build_column_family_descriptor_list(env, jcfds, cf_descs);
  102. }
  103. }
  104. /*
  105. * Class: org_rocksdb_OptionsUtil
  106. * Method: getLatestOptionsFileName
  107. * Signature: (Ljava/lang/String;J)Ljava/lang/String;
  108. */
  109. jstring Java_org_rocksdb_OptionsUtil_getLatestOptionsFileName(
  110. JNIEnv* env, jclass /*jcls*/, jstring jdbpath, jlong jenv_handle) {
  111. jboolean has_exception = JNI_FALSE;
  112. auto db_path =
  113. ROCKSDB_NAMESPACE::JniUtil::copyStdString(env, jdbpath, &has_exception);
  114. if (has_exception == JNI_TRUE) {
  115. // exception occurred
  116. return nullptr;
  117. }
  118. std::string options_file_name;
  119. ROCKSDB_NAMESPACE::Status s = ROCKSDB_NAMESPACE::GetLatestOptionsFileName(
  120. db_path, reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jenv_handle),
  121. &options_file_name);
  122. if (!s.ok()) {
  123. // error, raise an exception
  124. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  125. return nullptr;
  126. } else {
  127. return env->NewStringUTF(options_file_name.c_str());
  128. }
  129. }
  130. /*
  131. * Class: org_rocksdb_OptionsUtil
  132. * Method: readTableFormatConfig
  133. * Signature: (J)Lorg/rocksdb/TableFormatConfig;
  134. */
  135. jobject Java_org_rocksdb_OptionsUtil_readTableFormatConfig(JNIEnv* env, jclass,
  136. jlong jcf_options) {
  137. if (jcf_options == 0) {
  138. env->ThrowNew(
  139. ROCKSDB_NAMESPACE::IllegalArgumentExceptionJni::getJClass(env),
  140. "Null column family options handle supplied to "
  141. "readNewTableFormatConfig");
  142. return nullptr;
  143. }
  144. auto* cf_options =
  145. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyOptions*>(jcf_options);
  146. auto* table_factory = cf_options->table_factory.get();
  147. if (table_factory == nullptr) {
  148. env->ThrowNew(
  149. ROCKSDB_NAMESPACE::IllegalArgumentExceptionJni::getJClass(env),
  150. "Column family options supplied to readNewTableFormatConfig has no "
  151. "table options");
  152. return nullptr;
  153. }
  154. if (strcmp(ROCKSDB_NAMESPACE::TableFactory::kBlockBasedTableName(),
  155. table_factory->Name()) == 0) {
  156. auto* table_factory_options =
  157. table_factory->GetOptions<ROCKSDB_NAMESPACE::BlockBasedTableOptions>();
  158. if (table_factory_options == nullptr) {
  159. ROCKSDB_NAMESPACE::IllegalArgumentExceptionJni::ThrowNew(
  160. env, std::string("Null table format options supplied to "
  161. "readNewTableFormatConfig() ") +
  162. table_factory->Name());
  163. return nullptr;
  164. }
  165. return ROCKSDB_NAMESPACE::BlockBasedTableOptionsJni::construct(
  166. env, table_factory_options);
  167. } else {
  168. ROCKSDB_NAMESPACE::IllegalArgumentExceptionJni::ThrowNew(
  169. env, std::string("readNewTableFormatConfig() is not implemented for "
  170. "this table format: ") +
  171. table_factory->Name());
  172. return nullptr;
  173. }
  174. }