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::SstFileReader methods
8 // from Java side.
9 
10 #include <jni.h>
11 #include <string>
12 
13 #include "include/org_rocksdb_SstFileReader.h"
14 #include "rocksdb/comparator.h"
15 #include "rocksdb/env.h"
16 #include "rocksdb/options.h"
17 #include "rocksdb/sst_file_reader.h"
18 #include "rocksjni/portal.h"
19 
20 /*
21  * Class:     org_rocksdb_SstFileReader
22  * Method:    newSstFileReader
23  * Signature: (J)J
24  */
Java_org_rocksdb_SstFileReader_newSstFileReader(JNIEnv *,jclass,jlong joptions)25 jlong Java_org_rocksdb_SstFileReader_newSstFileReader(JNIEnv * /*env*/,
26                                                       jclass /*jcls*/,
27                                                       jlong joptions) {
28   auto *options =
29       reinterpret_cast<const ROCKSDB_NAMESPACE::Options *>(joptions);
30   ROCKSDB_NAMESPACE::SstFileReader *sst_file_reader =
31       new ROCKSDB_NAMESPACE::SstFileReader(*options);
32   return reinterpret_cast<jlong>(sst_file_reader);
33 }
34 
35 /*
36  * Class:     org_rocksdb_SstFileReader
37  * Method:    open
38  * Signature: (JLjava/lang/String;)V
39  */
Java_org_rocksdb_SstFileReader_open(JNIEnv * env,jobject,jlong jhandle,jstring jfile_path)40 void Java_org_rocksdb_SstFileReader_open(JNIEnv *env, jobject /*jobj*/,
41                                          jlong jhandle, jstring jfile_path) {
42   const char *file_path = env->GetStringUTFChars(jfile_path, nullptr);
43   if (file_path == nullptr) {
44     // exception thrown: OutOfMemoryError
45     return;
46   }
47   ROCKSDB_NAMESPACE::Status s =
48       reinterpret_cast<ROCKSDB_NAMESPACE::SstFileReader *>(jhandle)->Open(
49           file_path);
50   env->ReleaseStringUTFChars(jfile_path, file_path);
51 
52   if (!s.ok()) {
53     ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
54   }
55 }
56 
57 /*
58  * Class:     org_rocksdb_SstFileReader
59  * Method:    newIterator
60  * Signature: (JJ)J
61  */
Java_org_rocksdb_SstFileReader_newIterator(JNIEnv *,jobject,jlong jhandle,jlong jread_options_handle)62 jlong Java_org_rocksdb_SstFileReader_newIterator(JNIEnv * /*env*/,
63                                                  jobject /*jobj*/,
64                                                  jlong jhandle,
65                                                  jlong jread_options_handle) {
66   auto *sst_file_reader =
67       reinterpret_cast<ROCKSDB_NAMESPACE::SstFileReader *>(jhandle);
68   auto *read_options =
69       reinterpret_cast<ROCKSDB_NAMESPACE::ReadOptions *>(jread_options_handle);
70   return reinterpret_cast<jlong>(sst_file_reader->NewIterator(*read_options));
71 }
72 
73 /*
74  * Class:     org_rocksdb_SstFileReader
75  * Method:    disposeInternal
76  * Signature: (J)V
77  */
Java_org_rocksdb_SstFileReader_disposeInternal(JNIEnv *,jobject,jlong jhandle)78 void Java_org_rocksdb_SstFileReader_disposeInternal(JNIEnv * /*env*/,
79                                                     jobject /*jobj*/,
80                                                     jlong jhandle) {
81   delete reinterpret_cast<ROCKSDB_NAMESPACE::SstFileReader *>(jhandle);
82 }
83 
84 /*
85  * Class:     org_rocksdb_SstFileReader
86  * Method:    verifyChecksum
87  * Signature: (J)V
88  */
Java_org_rocksdb_SstFileReader_verifyChecksum(JNIEnv * env,jobject,jlong jhandle)89 void Java_org_rocksdb_SstFileReader_verifyChecksum(JNIEnv *env,
90                                                    jobject /*jobj*/,
91                                                    jlong jhandle) {
92   auto *sst_file_reader =
93       reinterpret_cast<ROCKSDB_NAMESPACE::SstFileReader *>(jhandle);
94   auto s = sst_file_reader->VerifyChecksum();
95   if (!s.ok()) {
96     ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
97   }
98 }
99 
100 /*
101  * Class:     org_rocksdb_SstFileReader
102  * Method:    getTableProperties
103  * Signature: (J)J
104  */
Java_org_rocksdb_SstFileReader_getTableProperties(JNIEnv * env,jobject,jlong jhandle)105 jobject Java_org_rocksdb_SstFileReader_getTableProperties(JNIEnv *env,
106                                                           jobject /*jobj*/,
107                                                           jlong jhandle) {
108   auto *sst_file_reader =
109       reinterpret_cast<ROCKSDB_NAMESPACE::SstFileReader *>(jhandle);
110   std::shared_ptr<const ROCKSDB_NAMESPACE::TableProperties> tp =
111       sst_file_reader->GetTableProperties();
112   jobject jtable_properties =
113       ROCKSDB_NAMESPACE::TablePropertiesJni::fromCppTableProperties(
114           env, *(tp.get()));
115   return jtable_properties;
116 }
117