options_util.cc 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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 <jni.h>
  9. #include <string>
  10. #include "include/org_rocksdb_OptionsUtil.h"
  11. #include "rocksdb/db.h"
  12. #include "rocksdb/env.h"
  13. #include "rocksdb/utilities/options_util.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: (Ljava/lang/String;JLjava/util/List;Z)V
  50. */
  51. void Java_org_rocksdb_OptionsUtil_loadLatestOptions(
  52. JNIEnv* env, jclass /*jcls*/, jstring jdbpath, jlong jenv_handle,
  53. jlong jdb_opts_handle, jobject jcfds, jboolean ignore_unknown_options) {
  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. ROCKSDB_NAMESPACE::Status s = ROCKSDB_NAMESPACE::LoadLatestOptions(
  63. db_path, reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jenv_handle),
  64. reinterpret_cast<ROCKSDB_NAMESPACE::DBOptions*>(jdb_opts_handle),
  65. &cf_descs, ignore_unknown_options);
  66. if (!s.ok()) {
  67. // error, raise an exception
  68. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  69. } else {
  70. build_column_family_descriptor_list(env, jcfds, cf_descs);
  71. }
  72. }
  73. /*
  74. * Class: org_rocksdb_OptionsUtil
  75. * Method: loadOptionsFromFile
  76. * Signature: (Ljava/lang/String;JJLjava/util/List;Z)V
  77. */
  78. void Java_org_rocksdb_OptionsUtil_loadOptionsFromFile(
  79. JNIEnv* env, jclass /*jcls*/, jstring jopts_file_name, jlong jenv_handle,
  80. jlong jdb_opts_handle, jobject jcfds, jboolean ignore_unknown_options) {
  81. jboolean has_exception = JNI_FALSE;
  82. auto opts_file_name = ROCKSDB_NAMESPACE::JniUtil::copyStdString(
  83. env, jopts_file_name, &has_exception);
  84. if (has_exception == JNI_TRUE) {
  85. // exception occurred
  86. return;
  87. }
  88. std::vector<ROCKSDB_NAMESPACE::ColumnFamilyDescriptor> cf_descs;
  89. ROCKSDB_NAMESPACE::Status s = ROCKSDB_NAMESPACE::LoadOptionsFromFile(
  90. opts_file_name, reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jenv_handle),
  91. reinterpret_cast<ROCKSDB_NAMESPACE::DBOptions*>(jdb_opts_handle),
  92. &cf_descs, ignore_unknown_options);
  93. if (!s.ok()) {
  94. // error, raise an exception
  95. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  96. } else {
  97. build_column_family_descriptor_list(env, jcfds, cf_descs);
  98. }
  99. }
  100. /*
  101. * Class: org_rocksdb_OptionsUtil
  102. * Method: getLatestOptionsFileName
  103. * Signature: (Ljava/lang/String;J)Ljava/lang/String;
  104. */
  105. jstring Java_org_rocksdb_OptionsUtil_getLatestOptionsFileName(
  106. JNIEnv* env, jclass /*jcls*/, jstring jdbpath, jlong jenv_handle) {
  107. jboolean has_exception = JNI_FALSE;
  108. auto db_path =
  109. ROCKSDB_NAMESPACE::JniUtil::copyStdString(env, jdbpath, &has_exception);
  110. if (has_exception == JNI_TRUE) {
  111. // exception occurred
  112. return nullptr;
  113. }
  114. std::string options_file_name;
  115. ROCKSDB_NAMESPACE::Status s = ROCKSDB_NAMESPACE::GetLatestOptionsFileName(
  116. db_path, reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jenv_handle),
  117. &options_file_name);
  118. if (!s.ok()) {
  119. // error, raise an exception
  120. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  121. return nullptr;
  122. } else {
  123. return env->NewStringUTF(options_file_name.c_str());
  124. }
  125. }