]> git.proxmox.com Git - ceph.git/blame - ceph/src/rocksdb/java/rocksjni/portal.h
import quincy beta 17.1.0
[ceph.git] / ceph / src / rocksdb / java / rocksjni / portal.h
CommitLineData
7c673cae 1// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
11fdf7f2
TL
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).
7c673cae
FG
5
6// This file is designed for caching those frequently used IDs and provide
7// efficient portal (i.e, a set of static functions) to access java code
8// from c++.
9
10#ifndef JAVA_ROCKSJNI_PORTAL_H_
11#define JAVA_ROCKSJNI_PORTAL_H_
12
20effc67
TL
13#include <jni.h>
14
494da23a 15#include <algorithm>
11fdf7f2 16#include <cstring>
7c673cae
FG
17#include <functional>
18#include <iostream>
11fdf7f2 19#include <iterator>
7c673cae 20#include <limits>
11fdf7f2 21#include <memory>
20effc67 22#include <set>
7c673cae 23#include <string>
11fdf7f2 24#include <type_traits>
7c673cae
FG
25#include <vector>
26
20effc67 27#include "rocksdb/convenience.h"
7c673cae
FG
28#include "rocksdb/db.h"
29#include "rocksdb/filter_policy.h"
11fdf7f2 30#include "rocksdb/rate_limiter.h"
7c673cae 31#include "rocksdb/status.h"
494da23a 32#include "rocksdb/table.h"
7c673cae 33#include "rocksdb/utilities/backupable_db.h"
494da23a 34#include "rocksdb/utilities/memory_util.h"
11fdf7f2 35#include "rocksdb/utilities/transaction_db.h"
7c673cae 36#include "rocksdb/utilities/write_batch_with_index.h"
11fdf7f2 37#include "rocksjni/compaction_filter_factory_jnicallback.h"
7c673cae 38#include "rocksjni/comparatorjnicallback.h"
20effc67 39#include "rocksjni/event_listener_jnicallback.h"
7c673cae 40#include "rocksjni/loggerjnicallback.h"
494da23a
TL
41#include "rocksjni/table_filter_jnicallback.h"
42#include "rocksjni/trace_writer_jnicallback.h"
11fdf7f2 43#include "rocksjni/transaction_notifier_jnicallback.h"
494da23a 44#include "rocksjni/wal_filter_jnicallback.h"
7c673cae
FG
45#include "rocksjni/writebatchhandlerjnicallback.h"
46
47// Remove macro on windows
48#ifdef DELETE
49#undef DELETE
50#endif
51
f67539c2 52namespace ROCKSDB_NAMESPACE {
7c673cae 53
7c673cae
FG
54class JavaClass {
55 public:
56 /**
57 * Gets and initializes a Java Class
58 *
59 * @param env A pointer to the Java environment
60 * @param jclazz_name The fully qualified JNI name of the Java Class
61 * e.g. "java/lang/String"
62 *
63 * @return The Java Class or nullptr if one of the
64 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
65 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
66 */
67 static jclass getJClass(JNIEnv* env, const char* jclazz_name) {
68 jclass jclazz = env->FindClass(jclazz_name);
69 assert(jclazz != nullptr);
70 return jclazz;
71 }
72};
73
74// Native class template
75template<class PTR, class DERIVED> class RocksDBNativeClass : public JavaClass {
76};
77
78// Native class template for sub-classes of RocksMutableObject
79template<class PTR, class DERIVED> class NativeRocksMutableObject
80 : public RocksDBNativeClass<PTR, DERIVED> {
81 public:
82
83 /**
84 * Gets the Java Method ID for the
85 * RocksMutableObject#setNativeHandle(long, boolean) method
86 *
87 * @param env A pointer to the Java environment
88 * @return The Java Method ID or nullptr the RocksMutableObject class cannot
89 * be accessed, or if one of the NoSuchMethodError,
90 * ExceptionInInitializerError or OutOfMemoryError exceptions is thrown
91 */
92 static jmethodID getSetNativeHandleMethod(JNIEnv* env) {
93 static jclass jclazz = DERIVED::getJClass(env);
94 if(jclazz == nullptr) {
95 return nullptr;
96 }
97
98 static jmethodID mid = env->GetMethodID(
99 jclazz, "setNativeHandle", "(JZ)V");
100 assert(mid != nullptr);
101 return mid;
102 }
103
104 /**
105 * Sets the C++ object pointer handle in the Java object
106 *
107 * @param env A pointer to the Java environment
108 * @param jobj The Java object on which to set the pointer handle
109 * @param ptr The C++ object pointer
110 * @param java_owns_handle JNI_TRUE if ownership of the C++ object is
111 * managed by the Java object
112 *
113 * @return true if a Java exception is pending, false otherwise
114 */
115 static bool setHandle(JNIEnv* env, jobject jobj, PTR ptr,
116 jboolean java_owns_handle) {
117 assert(jobj != nullptr);
118 static jmethodID mid = getSetNativeHandleMethod(env);
119 if(mid == nullptr) {
120 return true; // signal exception
121 }
122
123 env->CallVoidMethod(jobj, mid, reinterpret_cast<jlong>(ptr), java_owns_handle);
124 if(env->ExceptionCheck()) {
125 return true; // signal exception
126 }
127
128 return false;
129 }
130};
131
132// Java Exception template
133template<class DERIVED> class JavaException : public JavaClass {
134 public:
135 /**
136 * Create and throw a java exception with the provided message
137 *
138 * @param env A pointer to the Java environment
139 * @param msg The message for the exception
140 *
141 * @return true if an exception was thrown, false otherwise
142 */
143 static bool ThrowNew(JNIEnv* env, const std::string& msg) {
144 jclass jclazz = DERIVED::getJClass(env);
145 if(jclazz == nullptr) {
146 // exception occurred accessing class
147 std::cerr << "JavaException::ThrowNew - Error: unexpected exception!" << std::endl;
148 return env->ExceptionCheck();
149 }
150
151 const jint rs = env->ThrowNew(jclazz, msg.c_str());
152 if(rs != JNI_OK) {
153 // exception could not be thrown
154 std::cerr << "JavaException::ThrowNew - Fatal: could not throw exception!" << std::endl;
155 return env->ExceptionCheck();
156 }
157
158 return true;
159 }
160};
161
494da23a
TL
162// The portal class for java.lang.IllegalArgumentException
163class IllegalArgumentExceptionJni :
164 public JavaException<IllegalArgumentExceptionJni> {
7c673cae
FG
165 public:
166 /**
494da23a 167 * Get the Java Class java.lang.IllegalArgumentException
7c673cae
FG
168 *
169 * @param env A pointer to the Java environment
170 *
171 * @return The Java Class or nullptr if one of the
172 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
173 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
174 */
175 static jclass getJClass(JNIEnv* env) {
494da23a
TL
176 return JavaException::getJClass(env, "java/lang/IllegalArgumentException");
177 }
178
179 /**
180 * Create and throw a Java IllegalArgumentException with the provided status
181 *
182 * If s.ok() == true, then this function will not throw any exception.
183 *
184 * @param env A pointer to the Java environment
185 * @param s The status for the exception
186 *
187 * @return true if an exception was thrown, false otherwise
188 */
189 static bool ThrowNew(JNIEnv* env, const Status& s) {
190 assert(!s.ok());
191 if (s.ok()) {
192 return false;
193 }
194
195 // get the IllegalArgumentException class
196 jclass jclazz = getJClass(env);
197 if(jclazz == nullptr) {
198 // exception occurred accessing class
199 std::cerr << "IllegalArgumentExceptionJni::ThrowNew/class - Error: unexpected exception!" << std::endl;
200 return env->ExceptionCheck();
201 }
202
203 return JavaException::ThrowNew(env, s.ToString());
7c673cae
FG
204 }
205};
206
11fdf7f2
TL
207// The portal class for org.rocksdb.Status.Code
208class CodeJni : public JavaClass {
209 public:
210 /**
211 * Get the Java Class org.rocksdb.Status.Code
212 *
213 * @param env A pointer to the Java environment
214 *
215 * @return The Java Class or nullptr if one of the
216 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
217 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
218 */
219 static jclass getJClass(JNIEnv* env) {
220 return JavaClass::getJClass(env, "org/rocksdb/Status$Code");
221 }
222
223 /**
224 * Get the Java Method: Status.Code#getValue
225 *
226 * @param env A pointer to the Java environment
227 *
228 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 229 * be retrieved
11fdf7f2
TL
230 */
231 static jmethodID getValueMethod(JNIEnv* env) {
232 jclass jclazz = getJClass(env);
233 if(jclazz == nullptr) {
234 // exception occurred accessing class
235 return nullptr;
236 }
237
238 static jmethodID mid =
239 env->GetMethodID(jclazz, "getValue", "()b");
240 assert(mid != nullptr);
241 return mid;
242 }
243};
244
245// The portal class for org.rocksdb.Status.SubCode
246class SubCodeJni : public JavaClass {
247 public:
248 /**
249 * Get the Java Class org.rocksdb.Status.SubCode
250 *
251 * @param env A pointer to the Java environment
252 *
253 * @return The Java Class or nullptr if one of the
254 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
255 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
256 */
257 static jclass getJClass(JNIEnv* env) {
258 return JavaClass::getJClass(env, "org/rocksdb/Status$SubCode");
259 }
260
261 /**
262 * Get the Java Method: Status.SubCode#getValue
263 *
264 * @param env A pointer to the Java environment
265 *
266 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 267 * be retrieved
11fdf7f2
TL
268 */
269 static jmethodID getValueMethod(JNIEnv* env) {
270 jclass jclazz = getJClass(env);
271 if(jclazz == nullptr) {
272 // exception occurred accessing class
273 return nullptr;
274 }
275
276 static jmethodID mid =
277 env->GetMethodID(jclazz, "getValue", "()b");
278 assert(mid != nullptr);
279 return mid;
280 }
281
f67539c2
TL
282 static ROCKSDB_NAMESPACE::Status::SubCode toCppSubCode(
283 const jbyte jsub_code) {
11fdf7f2
TL
284 switch (jsub_code) {
285 case 0x0:
f67539c2 286 return ROCKSDB_NAMESPACE::Status::SubCode::kNone;
11fdf7f2 287 case 0x1:
f67539c2 288 return ROCKSDB_NAMESPACE::Status::SubCode::kMutexTimeout;
11fdf7f2 289 case 0x2:
f67539c2 290 return ROCKSDB_NAMESPACE::Status::SubCode::kLockTimeout;
11fdf7f2 291 case 0x3:
f67539c2 292 return ROCKSDB_NAMESPACE::Status::SubCode::kLockLimit;
11fdf7f2 293 case 0x4:
f67539c2 294 return ROCKSDB_NAMESPACE::Status::SubCode::kNoSpace;
11fdf7f2 295 case 0x5:
f67539c2 296 return ROCKSDB_NAMESPACE::Status::SubCode::kDeadlock;
11fdf7f2 297 case 0x6:
f67539c2 298 return ROCKSDB_NAMESPACE::Status::SubCode::kStaleFile;
11fdf7f2 299 case 0x7:
f67539c2 300 return ROCKSDB_NAMESPACE::Status::SubCode::kMemoryLimit;
11fdf7f2
TL
301
302 case 0x7F:
303 default:
f67539c2 304 return ROCKSDB_NAMESPACE::Status::SubCode::kNone;
11fdf7f2
TL
305 }
306 }
307};
308
7c673cae 309// The portal class for org.rocksdb.Status
f67539c2
TL
310class StatusJni
311 : public RocksDBNativeClass<ROCKSDB_NAMESPACE::Status*, StatusJni> {
7c673cae
FG
312 public:
313 /**
314 * Get the Java Class org.rocksdb.Status
315 *
316 * @param env A pointer to the Java environment
317 *
318 * @return The Java Class or nullptr if one of the
319 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
320 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
321 */
322 static jclass getJClass(JNIEnv* env) {
323 return RocksDBNativeClass::getJClass(env, "org/rocksdb/Status");
324 }
325
11fdf7f2
TL
326 /**
327 * Get the Java Method: Status#getCode
328 *
329 * @param env A pointer to the Java environment
330 *
331 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 332 * be retrieved
11fdf7f2
TL
333 */
334 static jmethodID getCodeMethod(JNIEnv* env) {
335 jclass jclazz = getJClass(env);
336 if(jclazz == nullptr) {
337 // exception occurred accessing class
338 return nullptr;
339 }
340
341 static jmethodID mid =
342 env->GetMethodID(jclazz, "getCode", "()Lorg/rocksdb/Status$Code;");
343 assert(mid != nullptr);
344 return mid;
345 }
346
347 /**
348 * Get the Java Method: Status#getSubCode
349 *
350 * @param env A pointer to the Java environment
351 *
352 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 353 * be retrieved
11fdf7f2
TL
354 */
355 static jmethodID getSubCodeMethod(JNIEnv* env) {
356 jclass jclazz = getJClass(env);
357 if(jclazz == nullptr) {
358 // exception occurred accessing class
359 return nullptr;
360 }
361
362 static jmethodID mid =
363 env->GetMethodID(jclazz, "getSubCode", "()Lorg/rocksdb/Status$SubCode;");
364 assert(mid != nullptr);
365 return mid;
366 }
367
368 /**
369 * Get the Java Method: Status#getState
370 *
371 * @param env A pointer to the Java environment
372 *
373 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 374 * be retrieved
11fdf7f2
TL
375 */
376 static jmethodID getStateMethod(JNIEnv* env) {
377 jclass jclazz = getJClass(env);
378 if(jclazz == nullptr) {
379 // exception occurred accessing class
380 return nullptr;
381 }
382
383 static jmethodID mid =
384 env->GetMethodID(jclazz, "getState", "()Ljava/lang/String;");
385 assert(mid != nullptr);
386 return mid;
387 }
388
7c673cae
FG
389 /**
390 * Create a new Java org.rocksdb.Status object with the same properties as
f67539c2 391 * the provided C++ ROCKSDB_NAMESPACE::Status object
7c673cae
FG
392 *
393 * @param env A pointer to the Java environment
f67539c2 394 * @param status The ROCKSDB_NAMESPACE::Status object
7c673cae
FG
395 *
396 * @return A reference to a Java org.rocksdb.Status object, or nullptr
397 * if an an exception occurs
398 */
399 static jobject construct(JNIEnv* env, const Status& status) {
400 jclass jclazz = getJClass(env);
401 if(jclazz == nullptr) {
402 // exception occurred accessing class
403 return nullptr;
404 }
405
406 jmethodID mid =
407 env->GetMethodID(jclazz, "<init>", "(BBLjava/lang/String;)V");
408 if(mid == nullptr) {
409 // exception thrown: NoSuchMethodException or OutOfMemoryError
410 return nullptr;
411 }
412
413 // convert the Status state for Java
414 jstring jstate = nullptr;
415 if (status.getState() != nullptr) {
416 const char* const state = status.getState();
417 jstate = env->NewStringUTF(state);
418 if(env->ExceptionCheck()) {
419 if(jstate != nullptr) {
420 env->DeleteLocalRef(jstate);
421 }
422 return nullptr;
423 }
424 }
425
426 jobject jstatus =
427 env->NewObject(jclazz, mid, toJavaStatusCode(status.code()),
428 toJavaStatusSubCode(status.subcode()), jstate);
429 if(env->ExceptionCheck()) {
430 // exception occurred
431 if(jstate != nullptr) {
432 env->DeleteLocalRef(jstate);
433 }
434 return nullptr;
435 }
436
437 if(jstate != nullptr) {
438 env->DeleteLocalRef(jstate);
439 }
440
441 return jstatus;
442 }
443
20effc67
TL
444 static jobject construct(JNIEnv* env, const Status* status) {
445 return construct(env, *status);
446 }
447
7c673cae 448 // Returns the equivalent org.rocksdb.Status.Code for the provided
f67539c2
TL
449 // C++ ROCKSDB_NAMESPACE::Status::Code enum
450 static jbyte toJavaStatusCode(const ROCKSDB_NAMESPACE::Status::Code& code) {
7c673cae 451 switch (code) {
f67539c2 452 case ROCKSDB_NAMESPACE::Status::Code::kOk:
7c673cae 453 return 0x0;
f67539c2 454 case ROCKSDB_NAMESPACE::Status::Code::kNotFound:
7c673cae 455 return 0x1;
f67539c2 456 case ROCKSDB_NAMESPACE::Status::Code::kCorruption:
7c673cae 457 return 0x2;
f67539c2 458 case ROCKSDB_NAMESPACE::Status::Code::kNotSupported:
7c673cae 459 return 0x3;
f67539c2 460 case ROCKSDB_NAMESPACE::Status::Code::kInvalidArgument:
7c673cae 461 return 0x4;
f67539c2 462 case ROCKSDB_NAMESPACE::Status::Code::kIOError:
7c673cae 463 return 0x5;
f67539c2 464 case ROCKSDB_NAMESPACE::Status::Code::kMergeInProgress:
7c673cae 465 return 0x6;
f67539c2 466 case ROCKSDB_NAMESPACE::Status::Code::kIncomplete:
7c673cae 467 return 0x7;
f67539c2 468 case ROCKSDB_NAMESPACE::Status::Code::kShutdownInProgress:
7c673cae 469 return 0x8;
f67539c2 470 case ROCKSDB_NAMESPACE::Status::Code::kTimedOut:
7c673cae 471 return 0x9;
f67539c2 472 case ROCKSDB_NAMESPACE::Status::Code::kAborted:
7c673cae 473 return 0xA;
f67539c2 474 case ROCKSDB_NAMESPACE::Status::Code::kBusy:
7c673cae 475 return 0xB;
f67539c2 476 case ROCKSDB_NAMESPACE::Status::Code::kExpired:
7c673cae 477 return 0xC;
f67539c2 478 case ROCKSDB_NAMESPACE::Status::Code::kTryAgain:
7c673cae 479 return 0xD;
f67539c2
TL
480 case ROCKSDB_NAMESPACE::Status::Code::kColumnFamilyDropped:
481 return 0xE;
7c673cae
FG
482 default:
483 return 0x7F; // undefined
484 }
485 }
486
487 // Returns the equivalent org.rocksdb.Status.SubCode for the provided
f67539c2
TL
488 // C++ ROCKSDB_NAMESPACE::Status::SubCode enum
489 static jbyte toJavaStatusSubCode(
490 const ROCKSDB_NAMESPACE::Status::SubCode& subCode) {
7c673cae 491 switch (subCode) {
f67539c2 492 case ROCKSDB_NAMESPACE::Status::SubCode::kNone:
7c673cae 493 return 0x0;
f67539c2 494 case ROCKSDB_NAMESPACE::Status::SubCode::kMutexTimeout:
7c673cae 495 return 0x1;
f67539c2 496 case ROCKSDB_NAMESPACE::Status::SubCode::kLockTimeout:
7c673cae 497 return 0x2;
f67539c2 498 case ROCKSDB_NAMESPACE::Status::SubCode::kLockLimit:
7c673cae 499 return 0x3;
f67539c2 500 case ROCKSDB_NAMESPACE::Status::SubCode::kNoSpace:
11fdf7f2 501 return 0x4;
f67539c2 502 case ROCKSDB_NAMESPACE::Status::SubCode::kDeadlock:
11fdf7f2 503 return 0x5;
f67539c2 504 case ROCKSDB_NAMESPACE::Status::SubCode::kStaleFile:
11fdf7f2 505 return 0x6;
f67539c2 506 case ROCKSDB_NAMESPACE::Status::SubCode::kMemoryLimit:
11fdf7f2 507 return 0x7;
7c673cae
FG
508 default:
509 return 0x7F; // undefined
510 }
511 }
11fdf7f2 512
f67539c2 513 static std::unique_ptr<ROCKSDB_NAMESPACE::Status> toCppStatus(
494da23a 514 const jbyte jcode_value, const jbyte jsub_code_value) {
f67539c2 515 std::unique_ptr<ROCKSDB_NAMESPACE::Status> status;
494da23a
TL
516 switch (jcode_value) {
517 case 0x0:
518 //Ok
f67539c2
TL
519 status = std::unique_ptr<ROCKSDB_NAMESPACE::Status>(
520 new ROCKSDB_NAMESPACE::Status(ROCKSDB_NAMESPACE::Status::OK()));
494da23a
TL
521 break;
522 case 0x1:
523 //NotFound
f67539c2
TL
524 status = std::unique_ptr<ROCKSDB_NAMESPACE::Status>(
525 new ROCKSDB_NAMESPACE::Status(ROCKSDB_NAMESPACE::Status::NotFound(
526 ROCKSDB_NAMESPACE::SubCodeJni::toCppSubCode(jsub_code_value))));
494da23a
TL
527 break;
528 case 0x2:
529 //Corruption
f67539c2
TL
530 status = std::unique_ptr<ROCKSDB_NAMESPACE::Status>(
531 new ROCKSDB_NAMESPACE::Status(ROCKSDB_NAMESPACE::Status::Corruption(
532 ROCKSDB_NAMESPACE::SubCodeJni::toCppSubCode(jsub_code_value))));
494da23a
TL
533 break;
534 case 0x3:
535 //NotSupported
f67539c2
TL
536 status = std::unique_ptr<ROCKSDB_NAMESPACE::Status>(
537 new ROCKSDB_NAMESPACE::Status(
538 ROCKSDB_NAMESPACE::Status::NotSupported(
539 ROCKSDB_NAMESPACE::SubCodeJni::toCppSubCode(
540 jsub_code_value))));
494da23a
TL
541 break;
542 case 0x4:
543 //InvalidArgument
f67539c2
TL
544 status = std::unique_ptr<ROCKSDB_NAMESPACE::Status>(
545 new ROCKSDB_NAMESPACE::Status(
546 ROCKSDB_NAMESPACE::Status::InvalidArgument(
547 ROCKSDB_NAMESPACE::SubCodeJni::toCppSubCode(
548 jsub_code_value))));
494da23a
TL
549 break;
550 case 0x5:
551 //IOError
f67539c2
TL
552 status = std::unique_ptr<ROCKSDB_NAMESPACE::Status>(
553 new ROCKSDB_NAMESPACE::Status(ROCKSDB_NAMESPACE::Status::IOError(
554 ROCKSDB_NAMESPACE::SubCodeJni::toCppSubCode(jsub_code_value))));
494da23a
TL
555 break;
556 case 0x6:
557 //MergeInProgress
f67539c2
TL
558 status = std::unique_ptr<ROCKSDB_NAMESPACE::Status>(
559 new ROCKSDB_NAMESPACE::Status(
560 ROCKSDB_NAMESPACE::Status::MergeInProgress(
561 ROCKSDB_NAMESPACE::SubCodeJni::toCppSubCode(
562 jsub_code_value))));
494da23a
TL
563 break;
564 case 0x7:
565 //Incomplete
f67539c2
TL
566 status = std::unique_ptr<ROCKSDB_NAMESPACE::Status>(
567 new ROCKSDB_NAMESPACE::Status(ROCKSDB_NAMESPACE::Status::Incomplete(
568 ROCKSDB_NAMESPACE::SubCodeJni::toCppSubCode(jsub_code_value))));
494da23a
TL
569 break;
570 case 0x8:
571 //ShutdownInProgress
f67539c2
TL
572 status = std::unique_ptr<ROCKSDB_NAMESPACE::Status>(
573 new ROCKSDB_NAMESPACE::Status(
574 ROCKSDB_NAMESPACE::Status::ShutdownInProgress(
575 ROCKSDB_NAMESPACE::SubCodeJni::toCppSubCode(
576 jsub_code_value))));
494da23a
TL
577 break;
578 case 0x9:
579 //TimedOut
f67539c2
TL
580 status = std::unique_ptr<ROCKSDB_NAMESPACE::Status>(
581 new ROCKSDB_NAMESPACE::Status(ROCKSDB_NAMESPACE::Status::TimedOut(
582 ROCKSDB_NAMESPACE::SubCodeJni::toCppSubCode(jsub_code_value))));
494da23a
TL
583 break;
584 case 0xA:
585 //Aborted
f67539c2
TL
586 status = std::unique_ptr<ROCKSDB_NAMESPACE::Status>(
587 new ROCKSDB_NAMESPACE::Status(ROCKSDB_NAMESPACE::Status::Aborted(
588 ROCKSDB_NAMESPACE::SubCodeJni::toCppSubCode(jsub_code_value))));
494da23a
TL
589 break;
590 case 0xB:
591 //Busy
f67539c2
TL
592 status = std::unique_ptr<ROCKSDB_NAMESPACE::Status>(
593 new ROCKSDB_NAMESPACE::Status(ROCKSDB_NAMESPACE::Status::Busy(
594 ROCKSDB_NAMESPACE::SubCodeJni::toCppSubCode(jsub_code_value))));
494da23a
TL
595 break;
596 case 0xC:
597 //Expired
f67539c2
TL
598 status = std::unique_ptr<ROCKSDB_NAMESPACE::Status>(
599 new ROCKSDB_NAMESPACE::Status(ROCKSDB_NAMESPACE::Status::Expired(
600 ROCKSDB_NAMESPACE::SubCodeJni::toCppSubCode(jsub_code_value))));
494da23a
TL
601 break;
602 case 0xD:
603 //TryAgain
f67539c2
TL
604 status = std::unique_ptr<ROCKSDB_NAMESPACE::Status>(
605 new ROCKSDB_NAMESPACE::Status(ROCKSDB_NAMESPACE::Status::TryAgain(
606 ROCKSDB_NAMESPACE::SubCodeJni::toCppSubCode(jsub_code_value))));
607 break;
608 case 0xE:
609 // ColumnFamilyDropped
610 status = std::unique_ptr<ROCKSDB_NAMESPACE::Status>(
611 new ROCKSDB_NAMESPACE::Status(
612 ROCKSDB_NAMESPACE::Status::ColumnFamilyDropped(
613 ROCKSDB_NAMESPACE::SubCodeJni::toCppSubCode(
614 jsub_code_value))));
494da23a
TL
615 break;
616 case 0x7F:
617 default:
618 return nullptr;
619 }
620 return status;
621 }
622
f67539c2
TL
623 // Returns the equivalent ROCKSDB_NAMESPACE::Status for the Java
624 // org.rocksdb.Status
625 static std::unique_ptr<ROCKSDB_NAMESPACE::Status> toCppStatus(
626 JNIEnv* env, const jobject jstatus) {
11fdf7f2
TL
627 jmethodID mid_code = getCodeMethod(env);
628 if (mid_code == nullptr) {
629 // exception occurred
630 return nullptr;
631 }
632 jobject jcode = env->CallObjectMethod(jstatus, mid_code);
633 if (env->ExceptionCheck()) {
634 // exception occurred
635 return nullptr;
636 }
637
f67539c2 638 jmethodID mid_code_value = ROCKSDB_NAMESPACE::CodeJni::getValueMethod(env);
11fdf7f2
TL
639 if (mid_code_value == nullptr) {
640 // exception occurred
641 return nullptr;
642 }
643 jbyte jcode_value = env->CallByteMethod(jcode, mid_code_value);
644 if (env->ExceptionCheck()) {
645 // exception occurred
646 if (jcode != nullptr) {
647 env->DeleteLocalRef(jcode);
648 }
649 return nullptr;
650 }
651
652 jmethodID mid_subCode = getSubCodeMethod(env);
653 if (mid_subCode == nullptr) {
654 // exception occurred
655 return nullptr;
656 }
657 jobject jsubCode = env->CallObjectMethod(jstatus, mid_subCode);
658 if (env->ExceptionCheck()) {
659 // exception occurred
660 if (jcode != nullptr) {
661 env->DeleteLocalRef(jcode);
662 }
663 return nullptr;
664 }
665
494da23a 666 jbyte jsub_code_value = 0x0; // None
11fdf7f2 667 if (jsubCode != nullptr) {
f67539c2
TL
668 jmethodID mid_subCode_value =
669 ROCKSDB_NAMESPACE::SubCodeJni::getValueMethod(env);
11fdf7f2
TL
670 if (mid_subCode_value == nullptr) {
671 // exception occurred
672 return nullptr;
673 }
494da23a 674 jsub_code_value = env->CallByteMethod(jsubCode, mid_subCode_value);
11fdf7f2
TL
675 if (env->ExceptionCheck()) {
676 // exception occurred
677 if (jcode != nullptr) {
678 env->DeleteLocalRef(jcode);
679 }
680 return nullptr;
681 }
682 }
683
684 jmethodID mid_state = getStateMethod(env);
685 if (mid_state == nullptr) {
686 // exception occurred
687 return nullptr;
688 }
689 jobject jstate = env->CallObjectMethod(jstatus, mid_state);
690 if (env->ExceptionCheck()) {
691 // exception occurred
692 if (jsubCode != nullptr) {
693 env->DeleteLocalRef(jsubCode);
694 }
695 if (jcode != nullptr) {
696 env->DeleteLocalRef(jcode);
697 }
698 return nullptr;
699 }
700
f67539c2 701 std::unique_ptr<ROCKSDB_NAMESPACE::Status> status =
494da23a 702 toCppStatus(jcode_value, jsub_code_value);
11fdf7f2
TL
703
704 // delete all local refs
705 if (jstate != nullptr) {
706 env->DeleteLocalRef(jstate);
707 }
708 if (jsubCode != nullptr) {
709 env->DeleteLocalRef(jsubCode);
710 }
711 if (jcode != nullptr) {
712 env->DeleteLocalRef(jcode);
713 }
714
715 return status;
716 }
7c673cae
FG
717};
718
719// The portal class for org.rocksdb.RocksDBException
720class RocksDBExceptionJni :
721 public JavaException<RocksDBExceptionJni> {
722 public:
723 /**
724 * Get the Java Class org.rocksdb.RocksDBException
725 *
726 * @param env A pointer to the Java environment
727 *
728 * @return The Java Class or nullptr if one of the
729 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
730 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
731 */
732 static jclass getJClass(JNIEnv* env) {
733 return JavaException::getJClass(env, "org/rocksdb/RocksDBException");
734 }
735
736 /**
737 * Create and throw a Java RocksDBException with the provided message
738 *
739 * @param env A pointer to the Java environment
740 * @param msg The message for the exception
741 *
742 * @return true if an exception was thrown, false otherwise
743 */
744 static bool ThrowNew(JNIEnv* env, const std::string& msg) {
745 return JavaException::ThrowNew(env, msg);
746 }
747
11fdf7f2
TL
748 /**
749 * Create and throw a Java RocksDBException with the provided status
750 *
751 * If s->ok() == true, then this function will not throw any exception.
752 *
753 * @param env A pointer to the Java environment
754 * @param s The status for the exception
755 *
756 * @return true if an exception was thrown, false otherwise
757 */
758 static bool ThrowNew(JNIEnv* env, std::unique_ptr<Status>& s) {
f67539c2 759 return ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, *(s.get()));
11fdf7f2
TL
760 }
761
7c673cae
FG
762 /**
763 * Create and throw a Java RocksDBException with the provided status
764 *
765 * If s.ok() == true, then this function will not throw any exception.
766 *
767 * @param env A pointer to the Java environment
768 * @param s The status for the exception
769 *
770 * @return true if an exception was thrown, false otherwise
771 */
772 static bool ThrowNew(JNIEnv* env, const Status& s) {
7c673cae
FG
773 if (s.ok()) {
774 return false;
775 }
776
777 // get the RocksDBException class
778 jclass jclazz = getJClass(env);
779 if(jclazz == nullptr) {
780 // exception occurred accessing class
781 std::cerr << "RocksDBExceptionJni::ThrowNew/class - Error: unexpected exception!" << std::endl;
782 return env->ExceptionCheck();
783 }
784
785 // get the constructor of org.rocksdb.RocksDBException
786 jmethodID mid =
787 env->GetMethodID(jclazz, "<init>", "(Lorg/rocksdb/Status;)V");
788 if(mid == nullptr) {
789 // exception thrown: NoSuchMethodException or OutOfMemoryError
790 std::cerr << "RocksDBExceptionJni::ThrowNew/cstr - Error: unexpected exception!" << std::endl;
791 return env->ExceptionCheck();
792 }
793
794 // get the Java status object
795 jobject jstatus = StatusJni::construct(env, s);
796 if(jstatus == nullptr) {
797 // exception occcurred
798 std::cerr << "RocksDBExceptionJni::ThrowNew/StatusJni - Error: unexpected exception!" << std::endl;
799 return env->ExceptionCheck();
800 }
801
802 // construct the RocksDBException
803 jthrowable rocksdb_exception = reinterpret_cast<jthrowable>(env->NewObject(jclazz, mid, jstatus));
804 if(env->ExceptionCheck()) {
805 if(jstatus != nullptr) {
806 env->DeleteLocalRef(jstatus);
807 }
808 if(rocksdb_exception != nullptr) {
809 env->DeleteLocalRef(rocksdb_exception);
810 }
811 std::cerr << "RocksDBExceptionJni::ThrowNew/NewObject - Error: unexpected exception!" << std::endl;
812 return true;
813 }
814
815 // throw the RocksDBException
816 const jint rs = env->Throw(rocksdb_exception);
817 if(rs != JNI_OK) {
818 // exception could not be thrown
819 std::cerr << "RocksDBExceptionJni::ThrowNew - Fatal: could not throw exception!" << std::endl;
820 if(jstatus != nullptr) {
821 env->DeleteLocalRef(jstatus);
822 }
823 if(rocksdb_exception != nullptr) {
824 env->DeleteLocalRef(rocksdb_exception);
825 }
826 return env->ExceptionCheck();
827 }
828
829 if(jstatus != nullptr) {
830 env->DeleteLocalRef(jstatus);
831 }
832 if(rocksdb_exception != nullptr) {
833 env->DeleteLocalRef(rocksdb_exception);
834 }
835
836 return true;
837 }
838
839 /**
840 * Create and throw a Java RocksDBException with the provided message
841 * and status
842 *
843 * If s.ok() == true, then this function will not throw any exception.
844 *
845 * @param env A pointer to the Java environment
846 * @param msg The message for the exception
847 * @param s The status for the exception
848 *
849 * @return true if an exception was thrown, false otherwise
850 */
851 static bool ThrowNew(JNIEnv* env, const std::string& msg, const Status& s) {
852 assert(!s.ok());
853 if (s.ok()) {
854 return false;
855 }
856
857 // get the RocksDBException class
858 jclass jclazz = getJClass(env);
859 if(jclazz == nullptr) {
860 // exception occurred accessing class
861 std::cerr << "RocksDBExceptionJni::ThrowNew/class - Error: unexpected exception!" << std::endl;
862 return env->ExceptionCheck();
863 }
864
865 // get the constructor of org.rocksdb.RocksDBException
866 jmethodID mid =
867 env->GetMethodID(jclazz, "<init>", "(Ljava/lang/String;Lorg/rocksdb/Status;)V");
868 if(mid == nullptr) {
869 // exception thrown: NoSuchMethodException or OutOfMemoryError
870 std::cerr << "RocksDBExceptionJni::ThrowNew/cstr - Error: unexpected exception!" << std::endl;
871 return env->ExceptionCheck();
872 }
873
874 jstring jmsg = env->NewStringUTF(msg.c_str());
875 if(jmsg == nullptr) {
876 // exception thrown: OutOfMemoryError
877 std::cerr << "RocksDBExceptionJni::ThrowNew/msg - Error: unexpected exception!" << std::endl;
878 return env->ExceptionCheck();
879 }
880
881 // get the Java status object
882 jobject jstatus = StatusJni::construct(env, s);
883 if(jstatus == nullptr) {
884 // exception occcurred
885 std::cerr << "RocksDBExceptionJni::ThrowNew/StatusJni - Error: unexpected exception!" << std::endl;
886 if(jmsg != nullptr) {
887 env->DeleteLocalRef(jmsg);
888 }
889 return env->ExceptionCheck();
890 }
891
892 // construct the RocksDBException
893 jthrowable rocksdb_exception = reinterpret_cast<jthrowable>(env->NewObject(jclazz, mid, jmsg, jstatus));
894 if(env->ExceptionCheck()) {
895 if(jstatus != nullptr) {
896 env->DeleteLocalRef(jstatus);
897 }
898 if(jmsg != nullptr) {
899 env->DeleteLocalRef(jmsg);
900 }
901 if(rocksdb_exception != nullptr) {
902 env->DeleteLocalRef(rocksdb_exception);
903 }
904 std::cerr << "RocksDBExceptionJni::ThrowNew/NewObject - Error: unexpected exception!" << std::endl;
905 return true;
906 }
907
908 // throw the RocksDBException
909 const jint rs = env->Throw(rocksdb_exception);
910 if(rs != JNI_OK) {
911 // exception could not be thrown
912 std::cerr << "RocksDBExceptionJni::ThrowNew - Fatal: could not throw exception!" << std::endl;
913 if(jstatus != nullptr) {
914 env->DeleteLocalRef(jstatus);
915 }
916 if(jmsg != nullptr) {
917 env->DeleteLocalRef(jmsg);
918 }
919 if(rocksdb_exception != nullptr) {
920 env->DeleteLocalRef(rocksdb_exception);
921 }
922 return env->ExceptionCheck();
923 }
924
925 if(jstatus != nullptr) {
926 env->DeleteLocalRef(jstatus);
927 }
928 if(jmsg != nullptr) {
929 env->DeleteLocalRef(jmsg);
930 }
931 if(rocksdb_exception != nullptr) {
932 env->DeleteLocalRef(rocksdb_exception);
933 }
934
935 return true;
936 }
11fdf7f2
TL
937
938 /**
939 * Get the Java Method: RocksDBException#getStatus
940 *
941 * @param env A pointer to the Java environment
942 *
943 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 944 * be retrieved
11fdf7f2
TL
945 */
946 static jmethodID getStatusMethod(JNIEnv* env) {
947 jclass jclazz = getJClass(env);
948 if(jclazz == nullptr) {
949 // exception occurred accessing class
950 return nullptr;
951 }
952
953 static jmethodID mid =
954 env->GetMethodID(jclazz, "getStatus", "()Lorg/rocksdb/Status;");
955 assert(mid != nullptr);
956 return mid;
957 }
958
f67539c2 959 static std::unique_ptr<ROCKSDB_NAMESPACE::Status> toCppStatus(
11fdf7f2
TL
960 JNIEnv* env, jthrowable jrocksdb_exception) {
961 if(!env->IsInstanceOf(jrocksdb_exception, getJClass(env))) {
962 // not an instance of RocksDBException
963 return nullptr;
964 }
965
966 // get the java status object
967 jmethodID mid = getStatusMethod(env);
968 if(mid == nullptr) {
969 // exception occurred accessing class or method
970 return nullptr;
971 }
972
973 jobject jstatus = env->CallObjectMethod(jrocksdb_exception, mid);
974 if(env->ExceptionCheck()) {
975 // exception occurred
976 return nullptr;
977 }
978
979 if(jstatus == nullptr) {
980 return nullptr; // no status available
981 }
982
f67539c2 983 return ROCKSDB_NAMESPACE::StatusJni::toCppStatus(env, jstatus);
11fdf7f2 984 }
7c673cae
FG
985};
986
494da23a
TL
987// The portal class for java.util.List
988class ListJni : public JavaClass {
7c673cae
FG
989 public:
990 /**
494da23a 991 * Get the Java Class java.util.List
7c673cae
FG
992 *
993 * @param env A pointer to the Java environment
994 *
995 * @return The Java Class or nullptr if one of the
996 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
997 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
998 */
494da23a
TL
999 static jclass getListClass(JNIEnv* env) {
1000 return JavaClass::getJClass(env, "java/util/List");
7c673cae
FG
1001 }
1002
1003 /**
494da23a 1004 * Get the Java Class java.util.ArrayList
7c673cae
FG
1005 *
1006 * @param env A pointer to the Java environment
7c673cae 1007 *
494da23a
TL
1008 * @return The Java Class or nullptr if one of the
1009 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
1010 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
7c673cae 1011 */
494da23a
TL
1012 static jclass getArrayListClass(JNIEnv* env) {
1013 return JavaClass::getJClass(env, "java/util/ArrayList");
7c673cae 1014 }
7c673cae 1015
7c673cae 1016 /**
494da23a 1017 * Get the Java Class java.util.Iterator
7c673cae
FG
1018 *
1019 * @param env A pointer to the Java environment
1020 *
1021 * @return The Java Class or nullptr if one of the
1022 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
1023 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
1024 */
494da23a
TL
1025 static jclass getIteratorClass(JNIEnv* env) {
1026 return JavaClass::getJClass(env, "java/util/Iterator");
7c673cae 1027 }
7c673cae 1028
7c673cae 1029 /**
494da23a 1030 * Get the Java Method: List#iterator
7c673cae
FG
1031 *
1032 * @param env A pointer to the Java environment
1033 *
494da23a 1034 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 1035 * be retrieved
7c673cae 1036 */
494da23a
TL
1037 static jmethodID getIteratorMethod(JNIEnv* env) {
1038 jclass jlist_clazz = getListClass(env);
1039 if(jlist_clazz == nullptr) {
1040 // exception occurred accessing class
1041 return nullptr;
1042 }
1043
1044 static jmethodID mid =
1045 env->GetMethodID(jlist_clazz, "iterator", "()Ljava/util/Iterator;");
1046 assert(mid != nullptr);
1047 return mid;
7c673cae 1048 }
7c673cae 1049
7c673cae 1050 /**
494da23a 1051 * Get the Java Method: Iterator#hasNext
7c673cae
FG
1052 *
1053 * @param env A pointer to the Java environment
1054 *
494da23a 1055 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 1056 * be retrieved
7c673cae 1057 */
494da23a
TL
1058 static jmethodID getHasNextMethod(JNIEnv* env) {
1059 jclass jiterator_clazz = getIteratorClass(env);
1060 if(jiterator_clazz == nullptr) {
1061 // exception occurred accessing class
1062 return nullptr;
1063 }
1064
1065 static jmethodID mid = env->GetMethodID(jiterator_clazz, "hasNext", "()Z");
1066 assert(mid != nullptr);
1067 return mid;
7c673cae
FG
1068 }
1069
1070 /**
494da23a 1071 * Get the Java Method: Iterator#next
7c673cae
FG
1072 *
1073 * @param env A pointer to the Java environment
1074 *
494da23a 1075 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 1076 * be retrieved
7c673cae 1077 */
494da23a
TL
1078 static jmethodID getNextMethod(JNIEnv* env) {
1079 jclass jiterator_clazz = getIteratorClass(env);
1080 if(jiterator_clazz == nullptr) {
7c673cae
FG
1081 // exception occurred accessing class
1082 return nullptr;
1083 }
1084
494da23a
TL
1085 static jmethodID mid =
1086 env->GetMethodID(jiterator_clazz, "next", "()Ljava/lang/Object;");
1087 assert(mid != nullptr);
1088 return mid;
1089 }
1090
1091 /**
1092 * Get the Java Method: ArrayList constructor
1093 *
1094 * @param env A pointer to the Java environment
1095 *
1096 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 1097 * be retrieved
494da23a
TL
1098 */
1099 static jmethodID getArrayListConstructorMethodId(JNIEnv* env) {
1100 jclass jarray_list_clazz = getArrayListClass(env);
1101 if(jarray_list_clazz == nullptr) {
1102 // exception occurred accessing class
7c673cae
FG
1103 return nullptr;
1104 }
494da23a
TL
1105 static jmethodID mid =
1106 env->GetMethodID(jarray_list_clazz, "<init>", "(I)V");
1107 assert(mid != nullptr);
1108 return mid;
1109 }
7c673cae 1110
494da23a
TL
1111 /**
1112 * Get the Java Method: List#add
1113 *
1114 * @param env A pointer to the Java environment
1115 *
1116 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 1117 * be retrieved
494da23a
TL
1118 */
1119 static jmethodID getListAddMethodId(JNIEnv* env) {
1120 jclass jlist_clazz = getListClass(env);
1121 if(jlist_clazz == nullptr) {
1122 // exception occurred accessing class
11fdf7f2
TL
1123 return nullptr;
1124 }
7c673cae 1125
494da23a
TL
1126 static jmethodID mid =
1127 env->GetMethodID(jlist_clazz, "add", "(Ljava/lang/Object;)Z");
1128 assert(mid != nullptr);
1129 return mid;
7c673cae
FG
1130 }
1131};
1132
494da23a
TL
1133// The portal class for java.lang.Byte
1134class ByteJni : public JavaClass {
7c673cae
FG
1135 public:
1136 /**
494da23a 1137 * Get the Java Class java.lang.Byte
7c673cae
FG
1138 *
1139 * @param env A pointer to the Java environment
1140 *
1141 * @return The Java Class or nullptr if one of the
1142 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
1143 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
1144 */
1145 static jclass getJClass(JNIEnv* env) {
494da23a 1146 return JavaClass::getJClass(env, "java/lang/Byte");
7c673cae 1147 }
7c673cae 1148
7c673cae 1149 /**
494da23a 1150 * Get the Java Class byte[]
7c673cae
FG
1151 *
1152 * @param env A pointer to the Java environment
1153 *
1154 * @return The Java Class or nullptr if one of the
1155 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
1156 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
1157 */
494da23a
TL
1158 static jclass getArrayJClass(JNIEnv* env) {
1159 return JavaClass::getJClass(env, "[B");
7c673cae 1160 }
7c673cae 1161
7c673cae 1162 /**
494da23a 1163 * Creates a new 2-dimensional Java Byte Array byte[][]
7c673cae
FG
1164 *
1165 * @param env A pointer to the Java environment
494da23a 1166 * @param len The size of the first dimension
7c673cae 1167 *
494da23a 1168 * @return A reference to the Java byte[][] or nullptr if an exception occurs
7c673cae 1169 */
494da23a
TL
1170 static jobjectArray new2dByteArray(JNIEnv* env, const jsize len) {
1171 jclass clazz = getArrayJClass(env);
1172 if(clazz == nullptr) {
1173 // exception occurred accessing class
1174 return nullptr;
1175 }
1176
1177 return env->NewObjectArray(len, clazz, nullptr);
7c673cae 1178 }
11fdf7f2
TL
1179
1180 /**
494da23a 1181 * Get the Java Method: Byte#byteValue
11fdf7f2
TL
1182 *
1183 * @param env A pointer to the Java environment
11fdf7f2 1184 *
494da23a
TL
1185 * @return The Java Method ID or nullptr if the class or method id could not
1186 * be retrieved
11fdf7f2 1187 */
494da23a
TL
1188 static jmethodID getByteValueMethod(JNIEnv* env) {
1189 jclass clazz = getJClass(env);
1190 if(clazz == nullptr) {
11fdf7f2
TL
1191 // exception occurred accessing class
1192 return nullptr;
1193 }
1194
494da23a
TL
1195 static jmethodID mid = env->GetMethodID(clazz, "byteValue", "()B");
1196 assert(mid != nullptr);
1197 return mid;
1198 }
1199
1200 /**
1201 * Calls the Java Method: Byte#valueOf, returning a constructed Byte jobject
1202 *
1203 * @param env A pointer to the Java environment
1204 *
1205 * @return A constructing Byte object or nullptr if the class or method id could not
1206 * be retrieved, or an exception occurred
1207 */
1208 static jobject valueOf(JNIEnv* env, jbyte jprimitive_byte) {
1209 jclass clazz = getJClass(env);
1210 if (clazz == nullptr) {
1211 // exception occurred accessing class
1212 return nullptr;
1213 }
1214
1215 static jmethodID mid =
1216 env->GetStaticMethodID(clazz, "valueOf", "(B)Ljava/lang/Byte;");
11fdf7f2
TL
1217 if (mid == nullptr) {
1218 // exception thrown: NoSuchMethodException or OutOfMemoryError
1219 return nullptr;
1220 }
1221
494da23a
TL
1222 const jobject jbyte_obj =
1223 env->CallStaticObjectMethod(clazz, mid, jprimitive_byte);
11fdf7f2 1224 if (env->ExceptionCheck()) {
494da23a 1225 // exception occurred
11fdf7f2
TL
1226 return nullptr;
1227 }
1228
494da23a 1229 return jbyte_obj;
11fdf7f2 1230 }
494da23a 1231
7c673cae
FG
1232};
1233
f67539c2
TL
1234// The portal class for java.nio.ByteBuffer
1235class ByteBufferJni : public JavaClass {
1236 public:
1237 /**
1238 * Get the Java Class java.nio.ByteBuffer
1239 *
1240 * @param env A pointer to the Java environment
1241 *
1242 * @return The Java Class or nullptr if one of the
1243 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
1244 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
1245 */
1246 static jclass getJClass(JNIEnv* env) {
1247 return JavaClass::getJClass(env, "java/nio/ByteBuffer");
1248 }
1249
1250 /**
1251 * Get the Java Method: ByteBuffer#allocate
1252 *
1253 * @param env A pointer to the Java environment
20effc67
TL
1254 * @param jbytebuffer_clazz if you have a reference to a ByteBuffer class, or
1255 * nullptr
f67539c2
TL
1256 *
1257 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 1258 * be retrieved
f67539c2
TL
1259 */
1260 static jmethodID getAllocateMethodId(JNIEnv* env,
1261 jclass jbytebuffer_clazz = nullptr) {
1262 const jclass jclazz =
1263 jbytebuffer_clazz == nullptr ? getJClass(env) : jbytebuffer_clazz;
1264 if (jclazz == nullptr) {
1265 // exception occurred accessing class
1266 return nullptr;
1267 }
1268
1269 static jmethodID mid = env->GetStaticMethodID(
1270 jclazz, "allocate", "(I)Ljava/nio/ByteBuffer;");
1271 assert(mid != nullptr);
1272 return mid;
1273 }
1274
1275 /**
1276 * Get the Java Method: ByteBuffer#array
1277 *
1278 * @param env A pointer to the Java environment
1279 *
1280 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 1281 * be retrieved
f67539c2
TL
1282 */
1283 static jmethodID getArrayMethodId(JNIEnv* env,
1284 jclass jbytebuffer_clazz = nullptr) {
1285 const jclass jclazz =
1286 jbytebuffer_clazz == nullptr ? getJClass(env) : jbytebuffer_clazz;
1287 if(jclazz == nullptr) {
1288 // exception occurred accessing class
1289 return nullptr;
1290 }
1291
1292 static jmethodID mid = env->GetMethodID(jclazz, "array", "()[B");
1293 assert(mid != nullptr);
1294 return mid;
1295 }
1296
1297 static jobject construct(
1298 JNIEnv* env, const bool direct, const size_t capacity,
1299 jclass jbytebuffer_clazz = nullptr) {
1300 return constructWith(env, direct, nullptr, capacity, jbytebuffer_clazz);
1301 }
1302
20effc67
TL
1303 static jobject constructWith(JNIEnv* env, const bool direct, const char* buf,
1304 const size_t capacity,
1305 jclass jbytebuffer_clazz = nullptr) {
f67539c2
TL
1306 if (direct) {
1307 bool allocated = false;
1308 if (buf == nullptr) {
1309 buf = new char[capacity];
1310 allocated = true;
1311 }
1312 jobject jbuf = env->NewDirectByteBuffer(const_cast<char*>(buf), static_cast<jlong>(capacity));
1313 if (jbuf == nullptr) {
1314 // exception occurred
1315 if (allocated) {
1316 delete[] static_cast<const char*>(buf);
1317 }
1318 return nullptr;
1319 }
1320 return jbuf;
1321 } else {
1322 const jclass jclazz =
1323 jbytebuffer_clazz == nullptr ? getJClass(env) : jbytebuffer_clazz;
1324 if (jclazz == nullptr) {
1325 // exception occurred accessing class
1326 return nullptr;
1327 }
1328 const jmethodID jmid_allocate = getAllocateMethodId(env, jbytebuffer_clazz);
1329 if (jmid_allocate == nullptr) {
1330 // exception occurred accessing class, or NoSuchMethodException or OutOfMemoryError
1331 return nullptr;
1332 }
1333 const jobject jbuf = env->CallStaticObjectMethod(
1334 jclazz, jmid_allocate, static_cast<jint>(capacity));
1335 if (env->ExceptionCheck()) {
1336 // exception occurred
1337 return nullptr;
1338 }
1339
1340 // set buffer data?
1341 if (buf != nullptr) {
1342 jbyteArray jarray = array(env, jbuf, jbytebuffer_clazz);
1343 if (jarray == nullptr) {
1344 // exception occurred
1345 env->DeleteLocalRef(jbuf);
1346 return nullptr;
1347 }
1348
1349 jboolean is_copy = JNI_FALSE;
1350 jbyte* ja = reinterpret_cast<jbyte*>(
1351 env->GetPrimitiveArrayCritical(jarray, &is_copy));
1352 if (ja == nullptr) {
1353 // exception occurred
1354 env->DeleteLocalRef(jarray);
1355 env->DeleteLocalRef(jbuf);
1356 return nullptr;
1357 }
1358
1359 memcpy(ja, const_cast<char*>(buf), capacity);
1360
1361 env->ReleasePrimitiveArrayCritical(jarray, ja, 0);
1362
1363 env->DeleteLocalRef(jarray);
1364 }
1365
1366 return jbuf;
1367 }
1368 }
1369
1370 static jbyteArray array(JNIEnv* env, const jobject& jbyte_buffer,
1371 jclass jbytebuffer_clazz = nullptr) {
1372 const jmethodID mid = getArrayMethodId(env, jbytebuffer_clazz);
1373 if (mid == nullptr) {
1374 // exception occurred accessing class, or NoSuchMethodException or OutOfMemoryError
1375 return nullptr;
1376 }
1377 const jobject jarray = env->CallObjectMethod(jbyte_buffer, mid);
1378 if (env->ExceptionCheck()) {
1379 // exception occurred
1380 return nullptr;
1381 }
1382 return static_cast<jbyteArray>(jarray);
1383 }
1384};
1385
494da23a
TL
1386// The portal class for java.lang.Integer
1387class IntegerJni : public JavaClass {
7c673cae
FG
1388 public:
1389 /**
494da23a 1390 * Get the Java Class java.lang.Integer
7c673cae
FG
1391 *
1392 * @param env A pointer to the Java environment
1393 *
1394 * @return The Java Class or nullptr if one of the
1395 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
1396 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
1397 */
1398 static jclass getJClass(JNIEnv* env) {
494da23a 1399 return JavaClass::getJClass(env, "java/lang/Integer");
7c673cae
FG
1400 }
1401
494da23a 1402 static jobject valueOf(JNIEnv* env, jint jprimitive_int) {
7c673cae 1403 jclass jclazz = getJClass(env);
494da23a 1404 if (jclazz == nullptr) {
7c673cae
FG
1405 // exception occurred accessing class
1406 return nullptr;
1407 }
1408
494da23a
TL
1409 jmethodID mid =
1410 env->GetStaticMethodID(jclazz, "valueOf", "(I)Ljava/lang/Integer;");
1411 if (mid == nullptr) {
1412 // exception thrown: NoSuchMethodException or OutOfMemoryError
1413 return nullptr;
1414 }
7c673cae 1415
494da23a
TL
1416 const jobject jinteger_obj =
1417 env->CallStaticObjectMethod(jclazz, mid, jprimitive_int);
1418 if (env->ExceptionCheck()) {
1419 // exception occurred
7c673cae
FG
1420 return nullptr;
1421 }
1422
494da23a 1423 return jinteger_obj;
7c673cae 1424 }
494da23a 1425};
7c673cae 1426
494da23a
TL
1427// The portal class for java.lang.Long
1428class LongJni : public JavaClass {
1429 public:
7c673cae 1430 /**
494da23a 1431 * Get the Java Class java.lang.Long
7c673cae
FG
1432 *
1433 * @param env A pointer to the Java environment
1434 *
494da23a
TL
1435 * @return The Java Class or nullptr if one of the
1436 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
1437 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
7c673cae 1438 */
494da23a
TL
1439 static jclass getJClass(JNIEnv* env) {
1440 return JavaClass::getJClass(env, "java/lang/Long");
1441 }
1442
1443 static jobject valueOf(JNIEnv* env, jlong jprimitive_long) {
7c673cae 1444 jclass jclazz = getJClass(env);
494da23a 1445 if (jclazz == nullptr) {
7c673cae
FG
1446 // exception occurred accessing class
1447 return nullptr;
1448 }
1449
494da23a
TL
1450 jmethodID mid =
1451 env->GetStaticMethodID(jclazz, "valueOf", "(J)Ljava/lang/Long;");
1452 if (mid == nullptr) {
1453 // exception thrown: NoSuchMethodException or OutOfMemoryError
1454 return nullptr;
1455 }
7c673cae 1456
494da23a
TL
1457 const jobject jlong_obj =
1458 env->CallStaticObjectMethod(jclazz, mid, jprimitive_long);
1459 if (env->ExceptionCheck()) {
1460 // exception occurred
7c673cae
FG
1461 return nullptr;
1462 }
1463
494da23a 1464 return jlong_obj;
7c673cae 1465 }
494da23a 1466};
7c673cae 1467
494da23a
TL
1468// The portal class for java.lang.StringBuilder
1469class StringBuilderJni : public JavaClass {
1470 public:
7c673cae 1471 /**
494da23a 1472 * Get the Java Class java.lang.StringBuilder
7c673cae
FG
1473 *
1474 * @param env A pointer to the Java environment
1475 *
494da23a
TL
1476 * @return The Java Class or nullptr if one of the
1477 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
1478 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
7c673cae 1479 */
494da23a
TL
1480 static jclass getJClass(JNIEnv* env) {
1481 return JavaClass::getJClass(env, "java/lang/StringBuilder");
7c673cae
FG
1482 }
1483
1484 /**
494da23a 1485 * Get the Java Method: StringBuilder#append
7c673cae
FG
1486 *
1487 * @param env A pointer to the Java environment
1488 *
1489 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 1490 * be retrieved
7c673cae 1491 */
494da23a 1492 static jmethodID getListAddMethodId(JNIEnv* env) {
7c673cae
FG
1493 jclass jclazz = getJClass(env);
1494 if(jclazz == nullptr) {
1495 // exception occurred accessing class
1496 return nullptr;
1497 }
1498
494da23a
TL
1499 static jmethodID mid =
1500 env->GetMethodID(jclazz, "append",
1501 "(Ljava/lang/String;)Ljava/lang/StringBuilder;");
7c673cae
FG
1502 assert(mid != nullptr);
1503 return mid;
1504 }
7c673cae 1505
7c673cae 1506 /**
494da23a 1507 * Appends a C-style string to a StringBuilder
7c673cae
FG
1508 *
1509 * @param env A pointer to the Java environment
494da23a
TL
1510 * @param jstring_builder Reference to a java.lang.StringBuilder
1511 * @param c_str A C-style string to append to the StringBuilder
7c673cae 1512 *
494da23a
TL
1513 * @return A reference to the updated StringBuilder, or a nullptr if
1514 * an exception occurs
7c673cae 1515 */
494da23a
TL
1516 static jobject append(JNIEnv* env, jobject jstring_builder,
1517 const char* c_str) {
1518 jmethodID mid = getListAddMethodId(env);
1519 if(mid == nullptr) {
1520 // exception occurred accessing class or method
11fdf7f2
TL
1521 return nullptr;
1522 }
1523
494da23a
TL
1524 jstring new_value_str = env->NewStringUTF(c_str);
1525 if(new_value_str == nullptr) {
1526 // exception thrown: OutOfMemoryError
7c673cae
FG
1527 return nullptr;
1528 }
1529
494da23a
TL
1530 jobject jresult_string_builder =
1531 env->CallObjectMethod(jstring_builder, mid, new_value_str);
1532 if(env->ExceptionCheck()) {
1533 // exception occurred
1534 env->DeleteLocalRef(new_value_str);
11fdf7f2
TL
1535 return nullptr;
1536 }
1537
494da23a 1538 return jresult_string_builder;
7c673cae 1539 }
494da23a 1540};
7c673cae 1541
494da23a
TL
1542// various utility functions for working with RocksDB and JNI
1543class JniUtil {
1544 public:
1545 /**
1546 * Detect if jlong overflows size_t
f67539c2 1547 *
494da23a 1548 * @param jvalue the jlong value
f67539c2 1549 *
494da23a
TL
1550 * @return
1551 */
1552 inline static Status check_if_jlong_fits_size_t(const jlong& jvalue) {
1553 Status s = Status::OK();
1554 if (static_cast<uint64_t>(jvalue) > std::numeric_limits<size_t>::max()) {
1555 s = Status::InvalidArgument(Slice("jlong overflows 32 bit value."));
1556 }
1557 return s;
11fdf7f2
TL
1558 }
1559
494da23a
TL
1560 /**
1561 * Obtains a reference to the JNIEnv from
1562 * the JVM
1563 *
1564 * If the current thread is not attached to the JavaVM
1565 * then it will be attached so as to retrieve the JNIEnv
1566 *
1567 * If a thread is attached, it must later be manually
1568 * released by calling JavaVM::DetachCurrentThread.
1569 * This can be handled by always matching calls to this
1570 * function with calls to {@link JniUtil::releaseJniEnv(JavaVM*, jboolean)}
1571 *
1572 * @param jvm (IN) A pointer to the JavaVM instance
1573 * @param attached (OUT) A pointer to a boolean which
1574 * will be set to JNI_TRUE if we had to attach the thread
1575 *
1576 * @return A pointer to the JNIEnv or nullptr if a fatal error
1577 * occurs and the JNIEnv cannot be retrieved
1578 */
1579 static JNIEnv* getJniEnv(JavaVM* jvm, jboolean* attached) {
1580 assert(jvm != nullptr);
11fdf7f2 1581
494da23a
TL
1582 JNIEnv *env;
1583 const jint env_rs = jvm->GetEnv(reinterpret_cast<void**>(&env),
f67539c2 1584 JNI_VERSION_1_6);
7c673cae 1585
494da23a
TL
1586 if(env_rs == JNI_OK) {
1587 // current thread is already attached, return the JNIEnv
1588 *attached = JNI_FALSE;
1589 return env;
1590 } else if(env_rs == JNI_EDETACHED) {
1591 // current thread is not attached, attempt to attach
1592 const jint rs_attach = jvm->AttachCurrentThread(reinterpret_cast<void**>(&env), NULL);
1593 if(rs_attach == JNI_OK) {
1594 *attached = JNI_TRUE;
1595 return env;
1596 } else {
1597 // error, could not attach the thread
1598 std::cerr << "JniUtil::getJniEnv - Fatal: could not attach current thread to JVM!" << std::endl;
1599 return nullptr;
1600 }
1601 } else if(env_rs == JNI_EVERSION) {
f67539c2
TL
1602 // error, JDK does not support JNI_VERSION_1_6+
1603 std::cerr << "JniUtil::getJniEnv - Fatal: JDK does not support JNI_VERSION_1_6" << std::endl;
494da23a
TL
1604 return nullptr;
1605 } else {
1606 std::cerr << "JniUtil::getJniEnv - Fatal: Unknown error: env_rs=" << env_rs << std::endl;
1607 return nullptr;
1608 }
11fdf7f2
TL
1609 }
1610
494da23a
TL
1611 /**
1612 * Counterpart to {@link JniUtil::getJniEnv(JavaVM*, jboolean*)}
1613 *
1614 * Detachess the current thread from the JVM if it was previously
1615 * attached
1616 *
1617 * @param jvm (IN) A pointer to the JavaVM instance
1618 * @param attached (IN) JNI_TRUE if we previously had to attach the thread
1619 * to the JavaVM to get the JNIEnv
1620 */
1621 static void releaseJniEnv(JavaVM* jvm, jboolean& attached) {
1622 assert(jvm != nullptr);
1623 if(attached == JNI_TRUE) {
1624 const jint rs_detach = jvm->DetachCurrentThread();
1625 assert(rs_detach == JNI_OK);
1626 if(rs_detach != JNI_OK) {
1627 std::cerr << "JniUtil::getJniEnv - Warn: Unable to detach current thread from JVM!" << std::endl;
1628 }
1629 }
11fdf7f2
TL
1630 }
1631
494da23a
TL
1632 /**
1633 * Copies a Java String[] to a C++ std::vector<std::string>
1634 *
1635 * @param env (IN) A pointer to the java environment
1636 * @param jss (IN) The Java String array to copy
1637 * @param has_exception (OUT) will be set to JNI_TRUE
1638 * if an OutOfMemoryError or ArrayIndexOutOfBoundsException
1639 * exception occurs
1640 *
1641 * @return A std::vector<std:string> containing copies of the Java strings
1642 */
1643 static std::vector<std::string> copyStrings(JNIEnv* env,
1644 jobjectArray jss, jboolean* has_exception) {
f67539c2
TL
1645 return ROCKSDB_NAMESPACE::JniUtil::copyStrings(
1646 env, jss, env->GetArrayLength(jss), has_exception);
11fdf7f2 1647 }
7c673cae 1648
494da23a
TL
1649 /**
1650 * Copies a Java String[] to a C++ std::vector<std::string>
1651 *
1652 * @param env (IN) A pointer to the java environment
1653 * @param jss (IN) The Java String array to copy
1654 * @param jss_len (IN) The length of the Java String array to copy
1655 * @param has_exception (OUT) will be set to JNI_TRUE
1656 * if an OutOfMemoryError or ArrayIndexOutOfBoundsException
1657 * exception occurs
1658 *
1659 * @return A std::vector<std:string> containing copies of the Java strings
1660 */
1661 static std::vector<std::string> copyStrings(JNIEnv* env,
1662 jobjectArray jss, const jsize jss_len, jboolean* has_exception) {
1663 std::vector<std::string> strs;
1664 strs.reserve(jss_len);
1665 for (jsize i = 0; i < jss_len; i++) {
1666 jobject js = env->GetObjectArrayElement(jss, i);
1667 if(env->ExceptionCheck()) {
1668 // exception thrown: ArrayIndexOutOfBoundsException
1669 *has_exception = JNI_TRUE;
1670 return strs;
1671 }
11fdf7f2 1672
494da23a
TL
1673 jstring jstr = static_cast<jstring>(js);
1674 const char* str = env->GetStringUTFChars(jstr, nullptr);
1675 if(str == nullptr) {
1676 // exception thrown: OutOfMemoryError
1677 env->DeleteLocalRef(js);
1678 *has_exception = JNI_TRUE;
1679 return strs;
1680 }
7c673cae 1681
494da23a 1682 strs.push_back(std::string(str));
7c673cae 1683
494da23a
TL
1684 env->ReleaseStringUTFChars(jstr, str);
1685 env->DeleteLocalRef(js);
1686 }
7c673cae 1687
494da23a
TL
1688 *has_exception = JNI_FALSE;
1689 return strs;
7c673cae
FG
1690 }
1691
494da23a
TL
1692 /**
1693 * Copies a jstring to a C-style null-terminated byte string
1694 * and releases the original jstring
1695 *
1696 * The jstring is copied as UTF-8
1697 *
1698 * If an exception occurs, then JNIEnv::ExceptionCheck()
1699 * will have been called
1700 *
1701 * @param env (IN) A pointer to the java environment
1702 * @param js (IN) The java string to copy
1703 * @param has_exception (OUT) will be set to JNI_TRUE
1704 * if an OutOfMemoryError exception occurs
1705 *
1706 * @return A pointer to the copied string, or a
1707 * nullptr if has_exception == JNI_TRUE
1708 */
1709 static std::unique_ptr<char[]> copyString(JNIEnv* env, jstring js,
1710 jboolean* has_exception) {
1711 const char *utf = env->GetStringUTFChars(js, nullptr);
1712 if(utf == nullptr) {
1713 // exception thrown: OutOfMemoryError
1714 env->ExceptionCheck();
1715 *has_exception = JNI_TRUE;
1716 return nullptr;
1717 } else if(env->ExceptionCheck()) {
1718 // exception thrown
1719 env->ReleaseStringUTFChars(js, utf);
1720 *has_exception = JNI_TRUE;
1721 return nullptr;
1722 }
11fdf7f2 1723
494da23a
TL
1724 const jsize utf_len = env->GetStringUTFLength(js);
1725 std::unique_ptr<char[]> str(new char[utf_len + 1]); // Note: + 1 is needed for the c_str null terminator
1726 std::strcpy(str.get(), utf);
1727 env->ReleaseStringUTFChars(js, utf);
1728 *has_exception = JNI_FALSE;
1729 return str;
7c673cae
FG
1730 }
1731
494da23a
TL
1732 /**
1733 * Copies a jstring to a std::string
1734 * and releases the original jstring
1735 *
1736 * If an exception occurs, then JNIEnv::ExceptionCheck()
1737 * will have been called
1738 *
1739 * @param env (IN) A pointer to the java environment
1740 * @param js (IN) The java string to copy
1741 * @param has_exception (OUT) will be set to JNI_TRUE
1742 * if an OutOfMemoryError exception occurs
1743 *
1744 * @return A std:string copy of the jstring, or an
1745 * empty std::string if has_exception == JNI_TRUE
1746 */
1747 static std::string copyStdString(JNIEnv* env, jstring js,
1748 jboolean* has_exception) {
1749 const char *utf = env->GetStringUTFChars(js, nullptr);
1750 if(utf == nullptr) {
1751 // exception thrown: OutOfMemoryError
1752 env->ExceptionCheck();
1753 *has_exception = JNI_TRUE;
1754 return std::string();
1755 } else if(env->ExceptionCheck()) {
1756 // exception thrown
1757 env->ReleaseStringUTFChars(js, utf);
1758 *has_exception = JNI_TRUE;
1759 return std::string();
1760 }
7c673cae 1761
494da23a
TL
1762 std::string name(utf);
1763 env->ReleaseStringUTFChars(js, utf);
1764 *has_exception = JNI_FALSE;
1765 return name;
7c673cae
FG
1766 }
1767
494da23a
TL
1768 /**
1769 * Copies bytes from a std::string to a jByteArray
1770 *
1771 * @param env A pointer to the java environment
1772 * @param bytes The bytes to copy
1773 *
1774 * @return the Java byte[], or nullptr if an exception occurs
f67539c2
TL
1775 *
1776 * @throws RocksDBException thrown
494da23a
TL
1777 * if memory size to copy exceeds general java specific array size limitation.
1778 */
1779 static jbyteArray copyBytes(JNIEnv* env, std::string bytes) {
1780 return createJavaByteArrayWithSizeCheck(env, bytes.c_str(), bytes.size());
11fdf7f2
TL
1781 }
1782
494da23a
TL
1783 /**
1784 * Given a Java byte[][] which is an array of java.lang.Strings
1785 * where each String is a byte[], the passed function `string_fn`
1786 * will be called on each String, the result is the collected by
1787 * calling the passed function `collector_fn`
1788 *
1789 * @param env (IN) A pointer to the java environment
1790 * @param jbyte_strings (IN) A Java array of Strings expressed as bytes
1791 * @param string_fn (IN) A transform function to call for each String
1792 * @param collector_fn (IN) A collector which is called for the result
1793 * of each `string_fn`
1794 * @param has_exception (OUT) will be set to JNI_TRUE
1795 * if an ArrayIndexOutOfBoundsException or OutOfMemoryError
1796 * exception occurs
1797 */
1798 template <typename T> static void byteStrings(JNIEnv* env,
1799 jobjectArray jbyte_strings,
1800 std::function<T(const char*, const size_t)> string_fn,
1801 std::function<void(size_t, T)> collector_fn,
1802 jboolean *has_exception) {
1803 const jsize jlen = env->GetArrayLength(jbyte_strings);
11fdf7f2 1804
494da23a
TL
1805 for(jsize i = 0; i < jlen; i++) {
1806 jobject jbyte_string_obj = env->GetObjectArrayElement(jbyte_strings, i);
1807 if(env->ExceptionCheck()) {
1808 // exception thrown: ArrayIndexOutOfBoundsException
1809 *has_exception = JNI_TRUE; // signal error
1810 return;
1811 }
7c673cae 1812
494da23a
TL
1813 jbyteArray jbyte_string_ary =
1814 reinterpret_cast<jbyteArray>(jbyte_string_obj);
1815 T result = byteString(env, jbyte_string_ary, string_fn, has_exception);
1816
1817 env->DeleteLocalRef(jbyte_string_obj);
1818
1819 if(*has_exception == JNI_TRUE) {
1820 // exception thrown: OutOfMemoryError
1821 return;
1822 }
1823
1824 collector_fn(i, result);
1825 }
1826
1827 *has_exception = JNI_FALSE;
1828 }
1829
1830 /**
1831 * Given a Java String which is expressed as a Java Byte Array byte[],
1832 * the passed function `string_fn` will be called on the String
1833 * and the result returned
1834 *
1835 * @param env (IN) A pointer to the java environment
1836 * @param jbyte_string_ary (IN) A Java String expressed in bytes
1837 * @param string_fn (IN) A transform function to call on the String
1838 * @param has_exception (OUT) will be set to JNI_TRUE
1839 * if an OutOfMemoryError exception occurs
1840 */
1841 template <typename T> static T byteString(JNIEnv* env,
1842 jbyteArray jbyte_string_ary,
1843 std::function<T(const char*, const size_t)> string_fn,
1844 jboolean* has_exception) {
1845 const jsize jbyte_string_len = env->GetArrayLength(jbyte_string_ary);
1846 return byteString<T>(env, jbyte_string_ary, jbyte_string_len, string_fn,
1847 has_exception);
1848 }
1849
1850 /**
1851 * Given a Java String which is expressed as a Java Byte Array byte[],
1852 * the passed function `string_fn` will be called on the String
1853 * and the result returned
1854 *
1855 * @param env (IN) A pointer to the java environment
1856 * @param jbyte_string_ary (IN) A Java String expressed in bytes
1857 * @param jbyte_string_len (IN) The length of the Java String
1858 * expressed in bytes
1859 * @param string_fn (IN) A transform function to call on the String
1860 * @param has_exception (OUT) will be set to JNI_TRUE
1861 * if an OutOfMemoryError exception occurs
1862 */
1863 template <typename T> static T byteString(JNIEnv* env,
1864 jbyteArray jbyte_string_ary, const jsize jbyte_string_len,
1865 std::function<T(const char*, const size_t)> string_fn,
1866 jboolean* has_exception) {
1867 jbyte* jbyte_string =
1868 env->GetByteArrayElements(jbyte_string_ary, nullptr);
1869 if(jbyte_string == nullptr) {
1870 // exception thrown: OutOfMemoryError
1871 *has_exception = JNI_TRUE;
1872 return nullptr; // signal error
1873 }
1874
1875 T result =
1876 string_fn(reinterpret_cast<char *>(jbyte_string), jbyte_string_len);
1877
1878 env->ReleaseByteArrayElements(jbyte_string_ary, jbyte_string, JNI_ABORT);
1879
1880 *has_exception = JNI_FALSE;
1881 return result;
1882 }
1883
1884 /**
1885 * Converts a std::vector<string> to a Java byte[][] where each Java String
1886 * is expressed as a Java Byte Array byte[].
1887 *
1888 * @param env A pointer to the java environment
1889 * @param strings A vector of Strings
1890 *
1891 * @return A Java array of Strings expressed as bytes,
1892 * or nullptr if an exception is thrown
1893 */
1894 static jobjectArray stringsBytes(JNIEnv* env, std::vector<std::string> strings) {
1895 jclass jcls_ba = ByteJni::getArrayJClass(env);
1896 if(jcls_ba == nullptr) {
1897 // exception occurred
1898 return nullptr;
1899 }
1900
1901 const jsize len = static_cast<jsize>(strings.size());
1902
1903 jobjectArray jbyte_strings = env->NewObjectArray(len, jcls_ba, nullptr);
1904 if(jbyte_strings == nullptr) {
1905 // exception thrown: OutOfMemoryError
1906 return nullptr;
1907 }
1908
1909 for (jsize i = 0; i < len; i++) {
1910 std::string *str = &strings[i];
1911 const jsize str_len = static_cast<jsize>(str->size());
1912
1913 jbyteArray jbyte_string_ary = env->NewByteArray(str_len);
1914 if(jbyte_string_ary == nullptr) {
1915 // exception thrown: OutOfMemoryError
1916 env->DeleteLocalRef(jbyte_strings);
1917 return nullptr;
1918 }
1919
1920 env->SetByteArrayRegion(
1921 jbyte_string_ary, 0, str_len,
1922 const_cast<jbyte*>(reinterpret_cast<const jbyte*>(str->c_str())));
1923 if(env->ExceptionCheck()) {
1924 // exception thrown: ArrayIndexOutOfBoundsException
1925 env->DeleteLocalRef(jbyte_string_ary);
1926 env->DeleteLocalRef(jbyte_strings);
1927 return nullptr;
1928 }
1929
1930 env->SetObjectArrayElement(jbyte_strings, i, jbyte_string_ary);
1931 if(env->ExceptionCheck()) {
1932 // exception thrown: ArrayIndexOutOfBoundsException
1933 // or ArrayStoreException
1934 env->DeleteLocalRef(jbyte_string_ary);
1935 env->DeleteLocalRef(jbyte_strings);
1936 return nullptr;
1937 }
1938
1939 env->DeleteLocalRef(jbyte_string_ary);
1940 }
1941
1942 return jbyte_strings;
1943 }
1944
1945 /**
1946 * Converts a std::vector<std::string> to a Java String[].
1947 *
1948 * @param env A pointer to the java environment
1949 * @param strings A vector of Strings
1950 *
1951 * @return A Java array of Strings,
1952 * or nullptr if an exception is thrown
1953 */
1954 static jobjectArray toJavaStrings(JNIEnv* env,
1955 const std::vector<std::string>* strings) {
1956 jclass jcls_str = env->FindClass("java/lang/String");
1957 if(jcls_str == nullptr) {
1958 // exception occurred
1959 return nullptr;
1960 }
1961
1962 const jsize len = static_cast<jsize>(strings->size());
1963
1964 jobjectArray jstrings = env->NewObjectArray(len, jcls_str, nullptr);
1965 if(jstrings == nullptr) {
1966 // exception thrown: OutOfMemoryError
1967 return nullptr;
1968 }
1969
1970 for (jsize i = 0; i < len; i++) {
1971 const std::string *str = &((*strings)[i]);
f67539c2 1972 jstring js = ROCKSDB_NAMESPACE::JniUtil::toJavaString(env, str);
494da23a
TL
1973 if (js == nullptr) {
1974 env->DeleteLocalRef(jstrings);
1975 return nullptr;
1976 }
1977
1978 env->SetObjectArrayElement(jstrings, i, js);
1979 if(env->ExceptionCheck()) {
1980 // exception thrown: ArrayIndexOutOfBoundsException
1981 // or ArrayStoreException
1982 env->DeleteLocalRef(js);
1983 env->DeleteLocalRef(jstrings);
1984 return nullptr;
1985 }
1986 }
1987
1988 return jstrings;
1989 }
1990
1991 /**
1992 * Creates a Java UTF String from a C++ std::string
1993 *
1994 * @param env A pointer to the java environment
1995 * @param string the C++ std::string
1996 * @param treat_empty_as_null true if empty strings should be treated as null
1997 *
1998 * @return the Java UTF string, or nullptr if the provided string
1999 * is null (or empty and treat_empty_as_null is set), or if an
2000 * exception occurs allocating the Java String.
2001 */
2002 static jstring toJavaString(JNIEnv* env, const std::string* string,
2003 const bool treat_empty_as_null = false) {
2004 if (string == nullptr) {
2005 return nullptr;
2006 }
2007
2008 if (treat_empty_as_null && string->empty()) {
2009 return nullptr;
2010 }
2011
2012 return env->NewStringUTF(string->c_str());
2013 }
f67539c2 2014
494da23a
TL
2015 /**
2016 * Copies bytes to a new jByteArray with the check of java array size limitation.
2017 *
2018 * @param bytes pointer to memory to copy to a new jByteArray
2019 * @param size number of bytes to copy
2020 *
2021 * @return the Java byte[], or nullptr if an exception occurs
f67539c2
TL
2022 *
2023 * @throws RocksDBException thrown
494da23a
TL
2024 * if memory size to copy exceeds general java array size limitation to avoid overflow.
2025 */
2026 static jbyteArray createJavaByteArrayWithSizeCheck(JNIEnv* env, const char* bytes, const size_t size) {
2027 // Limitation for java array size is vm specific
2028 // In general it cannot exceed Integer.MAX_VALUE (2^31 - 1)
2029 // Current HotSpot VM limitation for array size is Integer.MAX_VALUE - 5 (2^31 - 1 - 5)
f67539c2 2030 // It means that the next call to env->NewByteArray can still end with
494da23a
TL
2031 // OutOfMemoryError("Requested array size exceeds VM limit") coming from VM
2032 static const size_t MAX_JARRAY_SIZE = (static_cast<size_t>(1)) << 31;
2033 if(size > MAX_JARRAY_SIZE) {
f67539c2
TL
2034 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
2035 env, "Requested array size exceeds VM limit");
494da23a
TL
2036 return nullptr;
2037 }
f67539c2 2038
494da23a
TL
2039 const jsize jlen = static_cast<jsize>(size);
2040 jbyteArray jbytes = env->NewByteArray(jlen);
2041 if(jbytes == nullptr) {
f67539c2 2042 // exception thrown: OutOfMemoryError
494da23a
TL
2043 return nullptr;
2044 }
f67539c2 2045
494da23a
TL
2046 env->SetByteArrayRegion(jbytes, 0, jlen,
2047 const_cast<jbyte*>(reinterpret_cast<const jbyte*>(bytes)));
2048 if(env->ExceptionCheck()) {
2049 // exception thrown: ArrayIndexOutOfBoundsException
2050 env->DeleteLocalRef(jbytes);
2051 return nullptr;
2052 }
2053
2054 return jbytes;
2055 }
2056
2057 /**
f67539c2 2058 * Copies bytes from a ROCKSDB_NAMESPACE::Slice to a jByteArray
494da23a
TL
2059 *
2060 * @param env A pointer to the java environment
2061 * @param bytes The bytes to copy
2062 *
2063 * @return the Java byte[] or nullptr if an exception occurs
f67539c2
TL
2064 *
2065 * @throws RocksDBException thrown
2066 * if memory size to copy exceeds general java specific array size
2067 * limitation.
494da23a
TL
2068 */
2069 static jbyteArray copyBytes(JNIEnv* env, const Slice& bytes) {
2070 return createJavaByteArrayWithSizeCheck(env, bytes.data(), bytes.size());
2071 }
2072
2073 /*
2074 * Helper for operations on a key and value
2075 * for example WriteBatch->Put
2076 *
2077 * TODO(AR) could be used for RocksDB->Put etc.
2078 */
f67539c2
TL
2079 static std::unique_ptr<ROCKSDB_NAMESPACE::Status> kv_op(
2080 std::function<ROCKSDB_NAMESPACE::Status(ROCKSDB_NAMESPACE::Slice,
2081 ROCKSDB_NAMESPACE::Slice)>
2082 op,
2083 JNIEnv* env, jobject /*jobj*/, jbyteArray jkey, jint jkey_len,
494da23a
TL
2084 jbyteArray jvalue, jint jvalue_len) {
2085 jbyte* key = env->GetByteArrayElements(jkey, nullptr);
2086 if(env->ExceptionCheck()) {
2087 // exception thrown: OutOfMemoryError
2088 return nullptr;
2089 }
2090
2091 jbyte* value = env->GetByteArrayElements(jvalue, nullptr);
2092 if(env->ExceptionCheck()) {
2093 // exception thrown: OutOfMemoryError
2094 if(key != nullptr) {
2095 env->ReleaseByteArrayElements(jkey, key, JNI_ABORT);
2096 }
2097 return nullptr;
2098 }
2099
f67539c2
TL
2100 ROCKSDB_NAMESPACE::Slice key_slice(reinterpret_cast<char*>(key),
2101 jkey_len);
2102 ROCKSDB_NAMESPACE::Slice value_slice(reinterpret_cast<char*>(value),
2103 jvalue_len);
494da23a
TL
2104
2105 auto status = op(key_slice, value_slice);
2106
2107 if(value != nullptr) {
2108 env->ReleaseByteArrayElements(jvalue, value, JNI_ABORT);
2109 }
2110 if(key != nullptr) {
2111 env->ReleaseByteArrayElements(jkey, key, JNI_ABORT);
2112 }
2113
f67539c2
TL
2114 return std::unique_ptr<ROCKSDB_NAMESPACE::Status>(
2115 new ROCKSDB_NAMESPACE::Status(status));
494da23a
TL
2116 }
2117
2118 /*
2119 * Helper for operations on a key
2120 * for example WriteBatch->Delete
2121 *
2122 * TODO(AR) could be used for RocksDB->Delete etc.
2123 */
f67539c2
TL
2124 static std::unique_ptr<ROCKSDB_NAMESPACE::Status> k_op(
2125 std::function<ROCKSDB_NAMESPACE::Status(ROCKSDB_NAMESPACE::Slice)> op,
2126 JNIEnv* env, jobject /*jobj*/, jbyteArray jkey, jint jkey_len) {
494da23a
TL
2127 jbyte* key = env->GetByteArrayElements(jkey, nullptr);
2128 if(env->ExceptionCheck()) {
2129 // exception thrown: OutOfMemoryError
2130 return nullptr;
2131 }
2132
f67539c2
TL
2133 ROCKSDB_NAMESPACE::Slice key_slice(reinterpret_cast<char*>(key),
2134 jkey_len);
494da23a
TL
2135
2136 auto status = op(key_slice);
2137
2138 if(key != nullptr) {
2139 env->ReleaseByteArrayElements(jkey, key, JNI_ABORT);
2140 }
2141
f67539c2
TL
2142 return std::unique_ptr<ROCKSDB_NAMESPACE::Status>(
2143 new ROCKSDB_NAMESPACE::Status(status));
494da23a
TL
2144 }
2145
2146 /*
2147 * Helper for operations on a value
2148 * for example WriteBatchWithIndex->GetFromBatch
2149 */
f67539c2
TL
2150 static jbyteArray v_op(std::function<ROCKSDB_NAMESPACE::Status(
2151 ROCKSDB_NAMESPACE::Slice, std::string*)>
2152 op,
2153 JNIEnv* env, jbyteArray jkey, jint jkey_len) {
494da23a
TL
2154 jbyte* key = env->GetByteArrayElements(jkey, nullptr);
2155 if(env->ExceptionCheck()) {
2156 // exception thrown: OutOfMemoryError
2157 return nullptr;
2158 }
2159
f67539c2
TL
2160 ROCKSDB_NAMESPACE::Slice key_slice(reinterpret_cast<char*>(key),
2161 jkey_len);
494da23a
TL
2162
2163 std::string value;
f67539c2 2164 ROCKSDB_NAMESPACE::Status s = op(key_slice, &value);
494da23a
TL
2165
2166 if(key != nullptr) {
2167 env->ReleaseByteArrayElements(jkey, key, JNI_ABORT);
2168 }
2169
2170 if (s.IsNotFound()) {
2171 return nullptr;
2172 }
2173
2174 if (s.ok()) {
2175 jbyteArray jret_value =
2176 env->NewByteArray(static_cast<jsize>(value.size()));
2177 if(jret_value == nullptr) {
2178 // exception thrown: OutOfMemoryError
2179 return nullptr;
2180 }
2181
2182 env->SetByteArrayRegion(jret_value, 0, static_cast<jsize>(value.size()),
2183 const_cast<jbyte*>(reinterpret_cast<const jbyte*>(value.c_str())));
2184 if(env->ExceptionCheck()) {
2185 // exception thrown: ArrayIndexOutOfBoundsException
2186 if(jret_value != nullptr) {
2187 env->DeleteLocalRef(jret_value);
2188 }
2189 return nullptr;
2190 }
2191
2192 return jret_value;
2193 }
2194
f67539c2 2195 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
494da23a
TL
2196 return nullptr;
2197 }
2198
2199 /**
2200 * Creates a vector<T*> of C++ pointers from
2201 * a Java array of C++ pointer addresses.
f67539c2 2202 *
494da23a
TL
2203 * @param env (IN) A pointer to the java environment
2204 * @param pointers (IN) A Java array of C++ pointer addresses
2205 * @param has_exception (OUT) will be set to JNI_TRUE
2206 * if an ArrayIndexOutOfBoundsException or OutOfMemoryError
2207 * exception occurs.
f67539c2 2208 *
494da23a
TL
2209 * @return A vector of C++ pointers.
2210 */
2211 template<typename T> static std::vector<T*> fromJPointers(
2212 JNIEnv* env, jlongArray jptrs, jboolean *has_exception) {
2213 const jsize jptrs_len = env->GetArrayLength(jptrs);
2214 std::vector<T*> ptrs;
2215 jlong* jptr = env->GetLongArrayElements(jptrs, nullptr);
2216 if (jptr == nullptr) {
2217 // exception thrown: OutOfMemoryError
2218 *has_exception = JNI_TRUE;
2219 return ptrs;
2220 }
2221 ptrs.reserve(jptrs_len);
2222 for (jsize i = 0; i < jptrs_len; i++) {
2223 ptrs.push_back(reinterpret_cast<T*>(jptr[i]));
2224 }
2225 env->ReleaseLongArrayElements(jptrs, jptr, JNI_ABORT);
2226 return ptrs;
2227 }
2228
2229 /**
2230 * Creates a Java array of C++ pointer addresses
2231 * from a vector of C++ pointers.
f67539c2 2232 *
494da23a
TL
2233 * @param env (IN) A pointer to the java environment
2234 * @param pointers (IN) A vector of C++ pointers
2235 * @param has_exception (OUT) will be set to JNI_TRUE
2236 * if an ArrayIndexOutOfBoundsException or OutOfMemoryError
2237 * exception occurs
f67539c2 2238 *
494da23a
TL
2239 * @return Java array of C++ pointer addresses.
2240 */
2241 template<typename T> static jlongArray toJPointers(JNIEnv* env,
2242 const std::vector<T*> &pointers,
2243 jboolean *has_exception) {
2244 const jsize len = static_cast<jsize>(pointers.size());
2245 std::unique_ptr<jlong[]> results(new jlong[len]);
2246 std::transform(pointers.begin(), pointers.end(), results.get(), [](T* pointer) -> jlong {
2247 return reinterpret_cast<jlong>(pointer);
2248 });
2249
2250 jlongArray jpointers = env->NewLongArray(len);
2251 if (jpointers == nullptr) {
2252 // exception thrown: OutOfMemoryError
2253 *has_exception = JNI_TRUE;
2254 return nullptr;
2255 }
2256
2257 env->SetLongArrayRegion(jpointers, 0, len, results.get());
2258 if (env->ExceptionCheck()) {
2259 // exception thrown: ArrayIndexOutOfBoundsException
2260 *has_exception = JNI_TRUE;
2261 env->DeleteLocalRef(jpointers);
2262 return nullptr;
2263 }
2264
2265 *has_exception = JNI_FALSE;
2266
2267 return jpointers;
2268 }
f67539c2
TL
2269
2270 /*
2271 * Helper for operations on a key and value
2272 * for example WriteBatch->Put
2273 *
2274 * TODO(AR) could be extended to cover returning ROCKSDB_NAMESPACE::Status
2275 * from `op` and used for RocksDB->Put etc.
2276 */
2277 static void kv_op_direct(std::function<void(ROCKSDB_NAMESPACE::Slice&,
2278 ROCKSDB_NAMESPACE::Slice&)>
2279 op,
2280 JNIEnv* env, jobject jkey, jint jkey_off,
2281 jint jkey_len, jobject jval, jint jval_off,
2282 jint jval_len) {
2283 char* key = reinterpret_cast<char*>(env->GetDirectBufferAddress(jkey));
2284 if (key == nullptr ||
2285 env->GetDirectBufferCapacity(jkey) < (jkey_off + jkey_len)) {
2286 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
2287 env, "Invalid key argument");
2288 return;
2289 }
2290
2291 char* value = reinterpret_cast<char*>(env->GetDirectBufferAddress(jval));
2292 if (value == nullptr ||
2293 env->GetDirectBufferCapacity(jval) < (jval_off + jval_len)) {
2294 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
2295 env, "Invalid value argument");
2296 return;
2297 }
2298
2299 key += jkey_off;
2300 value += jval_off;
2301
2302 ROCKSDB_NAMESPACE::Slice key_slice(key, jkey_len);
2303 ROCKSDB_NAMESPACE::Slice value_slice(value, jval_len);
2304
2305 op(key_slice, value_slice);
2306 }
2307
2308 /*
2309 * Helper for operations on a key and value
2310 * for example WriteBatch->Delete
2311 *
2312 * TODO(AR) could be extended to cover returning ROCKSDB_NAMESPACE::Status
2313 * from `op` and used for RocksDB->Delete etc.
2314 */
2315 static void k_op_direct(std::function<void(ROCKSDB_NAMESPACE::Slice&)> op,
2316 JNIEnv* env, jobject jkey, jint jkey_off,
2317 jint jkey_len) {
2318 char* key = reinterpret_cast<char*>(env->GetDirectBufferAddress(jkey));
2319 if (key == nullptr ||
2320 env->GetDirectBufferCapacity(jkey) < (jkey_off + jkey_len)) {
2321 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
2322 env, "Invalid key argument");
2323 return;
2324 }
2325
2326 key += jkey_off;
2327
2328 ROCKSDB_NAMESPACE::Slice key_slice(key, jkey_len);
2329
2330 return op(key_slice);
2331 }
2332
2333 template <class T>
2334 static jint copyToDirect(JNIEnv* env, T& source, jobject jtarget,
2335 jint jtarget_off, jint jtarget_len) {
2336 char* target =
2337 reinterpret_cast<char*>(env->GetDirectBufferAddress(jtarget));
2338 if (target == nullptr ||
2339 env->GetDirectBufferCapacity(jtarget) < (jtarget_off + jtarget_len)) {
2340 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
2341 env, "Invalid target argument");
2342 return 0;
2343 }
2344
2345 target += jtarget_off;
2346
2347 const jint cvalue_len = static_cast<jint>(source.size());
2348 const jint length = std::min(jtarget_len, cvalue_len);
2349
2350 memcpy(target, source.data(), length);
2351
2352 return cvalue_len;
2353 }
494da23a
TL
2354};
2355
2356class MapJni : public JavaClass {
2357 public:
2358 /**
2359 * Get the Java Class java.util.Map
2360 *
2361 * @param env A pointer to the Java environment
2362 *
2363 * @return The Java Class or nullptr if one of the
2364 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
2365 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
2366 */
2367 static jclass getJClass(JNIEnv* env) {
2368 return JavaClass::getJClass(env, "java/util/Map");
2369 }
2370
2371 /**
2372 * Get the Java Method: Map#put
2373 *
2374 * @param env A pointer to the Java environment
2375 *
2376 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 2377 * be retrieved
494da23a
TL
2378 */
2379 static jmethodID getMapPutMethodId(JNIEnv* env) {
2380 jclass jlist_clazz = getJClass(env);
2381 if(jlist_clazz == nullptr) {
2382 // exception occurred accessing class
2383 return nullptr;
2384 }
2385
2386 static jmethodID mid =
2387 env->GetMethodID(jlist_clazz, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
2388 assert(mid != nullptr);
2389 return mid;
2390 }
2391};
2392
2393class HashMapJni : public JavaClass {
2394 public:
2395 /**
2396 * Get the Java Class java.util.HashMap
2397 *
2398 * @param env A pointer to the Java environment
2399 *
2400 * @return The Java Class or nullptr if one of the
2401 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
2402 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
2403 */
2404 static jclass getJClass(JNIEnv* env) {
2405 return JavaClass::getJClass(env, "java/util/HashMap");
2406 }
2407
2408 /**
2409 * Create a new Java java.util.HashMap object.
2410 *
2411 * @param env A pointer to the Java environment
2412 *
2413 * @return A reference to a Java java.util.HashMap object, or
2414 * nullptr if an an exception occurs
2415 */
2416 static jobject construct(JNIEnv* env, const uint32_t initial_capacity = 16) {
2417 jclass jclazz = getJClass(env);
2418 if (jclazz == nullptr) {
2419 // exception occurred accessing class
2420 return nullptr;
2421 }
2422
2423 jmethodID mid = env->GetMethodID(jclazz, "<init>", "(I)V");
2424 if (mid == nullptr) {
2425 // exception thrown: NoSuchMethodException or OutOfMemoryError
2426 return nullptr;
2427 }
2428
2429 jobject jhash_map = env->NewObject(jclazz, mid, static_cast<jint>(initial_capacity));
2430 if (env->ExceptionCheck()) {
2431 return nullptr;
2432 }
2433
2434 return jhash_map;
2435 }
2436
2437 /**
2438 * A function which maps a std::pair<K,V> to a std::pair<JK, JV>
2439 *
2440 * @return Either a pointer to a std::pair<jobject, jobject>, or nullptr
2441 * if an error occurs during the mapping
2442 */
2443 template <typename K, typename V, typename JK, typename JV>
2444 using FnMapKV = std::function<std::unique_ptr<std::pair<JK, JV>> (const std::pair<K, V>&)>;
2445
2446 // template <class I, typename K, typename V, typename K1, typename V1, typename std::enable_if<std::is_same<typename std::iterator_traits<I>::value_type, std::pair<const K,V>>::value, int32_t>::type = 0>
2447 // static void putAll(JNIEnv* env, const jobject jhash_map, I iterator, const FnMapKV<const K,V,K1,V1> &fn_map_kv) {
2448 /**
2449 * Returns true if it succeeds, false if an error occurs
2450 */
2451 template<class iterator_type, typename K, typename V>
2452 static bool putAll(JNIEnv* env, const jobject jhash_map, iterator_type iterator, iterator_type end, const FnMapKV<K, V, jobject, jobject> &fn_map_kv) {
f67539c2
TL
2453 const jmethodID jmid_put =
2454 ROCKSDB_NAMESPACE::MapJni::getMapPutMethodId(env);
494da23a
TL
2455 if (jmid_put == nullptr) {
2456 return false;
2457 }
2458
2459 for (auto it = iterator; it != end; ++it) {
2460 const std::unique_ptr<std::pair<jobject, jobject>> result = fn_map_kv(*it);
2461 if (result == nullptr) {
2462 // an error occurred during fn_map_kv
2463 return false;
2464 }
2465 env->CallObjectMethod(jhash_map, jmid_put, result->first, result->second);
2466 if (env->ExceptionCheck()) {
2467 // exception occurred
2468 env->DeleteLocalRef(result->second);
2469 env->DeleteLocalRef(result->first);
2470 return false;
2471 }
2472
2473 // release local references
2474 env->DeleteLocalRef(result->second);
2475 env->DeleteLocalRef(result->first);
2476 }
2477
2478 return true;
2479 }
2480
2481 /**
2482 * Creates a java.util.Map<String, String> from a std::map<std::string, std::string>
2483 *
2484 * @param env A pointer to the Java environment
2485 * @param map the Cpp map
2486 *
2487 * @return a reference to the Java java.util.Map object, or nullptr if an exception occcurred
2488 */
2489 static jobject fromCppMap(JNIEnv* env, const std::map<std::string, std::string>* map) {
2490 if (map == nullptr) {
2491 return nullptr;
2492 }
2493
2494 jobject jhash_map = construct(env, static_cast<uint32_t>(map->size()));
2495 if (jhash_map == nullptr) {
2496 // exception occurred
2497 return nullptr;
2498 }
2499
f67539c2
TL
2500 const ROCKSDB_NAMESPACE::HashMapJni::FnMapKV<
2501 const std::string, const std::string, jobject, jobject>
2502 fn_map_kv =
2503 [env](const std::pair<const std::string, const std::string>& kv) {
2504 jstring jkey = ROCKSDB_NAMESPACE::JniUtil::toJavaString(
2505 env, &(kv.first), false);
2506 if (env->ExceptionCheck()) {
2507 // an error occurred
2508 return std::unique_ptr<std::pair<jobject, jobject>>(nullptr);
2509 }
2510
2511 jstring jvalue = ROCKSDB_NAMESPACE::JniUtil::toJavaString(
2512 env, &(kv.second), true);
2513 if (env->ExceptionCheck()) {
2514 // an error occurred
2515 env->DeleteLocalRef(jkey);
2516 return std::unique_ptr<std::pair<jobject, jobject>>(nullptr);
2517 }
2518
2519 return std::unique_ptr<std::pair<jobject, jobject>>(
2520 new std::pair<jobject, jobject>(
2521 static_cast<jobject>(jkey),
2522 static_cast<jobject>(jvalue)));
2523 };
494da23a
TL
2524
2525 if (!putAll(env, jhash_map, map->begin(), map->end(), fn_map_kv)) {
2526 // exception occurred
2527 return nullptr;
2528 }
2529
2530 return jhash_map;
2531 }
2532
2533 /**
2534 * Creates a java.util.Map<String, Long> from a std::map<std::string, uint32_t>
2535 *
2536 * @param env A pointer to the Java environment
2537 * @param map the Cpp map
2538 *
2539 * @return a reference to the Java java.util.Map object, or nullptr if an exception occcurred
2540 */
2541 static jobject fromCppMap(JNIEnv* env, const std::map<std::string, uint32_t>* map) {
2542 if (map == nullptr) {
2543 return nullptr;
2544 }
2545
2546 if (map == nullptr) {
2547 return nullptr;
2548 }
2549
2550 jobject jhash_map = construct(env, static_cast<uint32_t>(map->size()));
2551 if (jhash_map == nullptr) {
2552 // exception occurred
2553 return nullptr;
2554 }
2555
f67539c2
TL
2556 const ROCKSDB_NAMESPACE::HashMapJni::FnMapKV<
2557 const std::string, const uint32_t, jobject, jobject>
2558 fn_map_kv =
2559 [env](const std::pair<const std::string, const uint32_t>& kv) {
2560 jstring jkey = ROCKSDB_NAMESPACE::JniUtil::toJavaString(
2561 env, &(kv.first), false);
2562 if (env->ExceptionCheck()) {
2563 // an error occurred
2564 return std::unique_ptr<std::pair<jobject, jobject>>(nullptr);
2565 }
494da23a 2566
f67539c2
TL
2567 jobject jvalue = ROCKSDB_NAMESPACE::IntegerJni::valueOf(
2568 env, static_cast<jint>(kv.second));
2569 if (env->ExceptionCheck()) {
2570 // an error occurred
2571 env->DeleteLocalRef(jkey);
2572 return std::unique_ptr<std::pair<jobject, jobject>>(nullptr);
2573 }
494da23a 2574
f67539c2
TL
2575 return std::unique_ptr<std::pair<jobject, jobject>>(
2576 new std::pair<jobject, jobject>(static_cast<jobject>(jkey),
2577 jvalue));
2578 };
494da23a
TL
2579
2580 if (!putAll(env, jhash_map, map->begin(), map->end(), fn_map_kv)) {
2581 // exception occurred
2582 return nullptr;
2583 }
2584
2585 return jhash_map;
2586 }
2587
2588 /**
2589 * Creates a java.util.Map<String, Long> from a std::map<std::string, uint64_t>
2590 *
2591 * @param env A pointer to the Java environment
2592 * @param map the Cpp map
2593 *
2594 * @return a reference to the Java java.util.Map object, or nullptr if an exception occcurred
2595 */
2596 static jobject fromCppMap(JNIEnv* env, const std::map<std::string, uint64_t>* map) {
2597 if (map == nullptr) {
2598 return nullptr;
2599 }
2600
2601 jobject jhash_map = construct(env, static_cast<uint32_t>(map->size()));
2602 if (jhash_map == nullptr) {
2603 // exception occurred
2604 return nullptr;
2605 }
2606
f67539c2
TL
2607 const ROCKSDB_NAMESPACE::HashMapJni::FnMapKV<
2608 const std::string, const uint64_t, jobject, jobject>
2609 fn_map_kv =
2610 [env](const std::pair<const std::string, const uint64_t>& kv) {
2611 jstring jkey = ROCKSDB_NAMESPACE::JniUtil::toJavaString(
2612 env, &(kv.first), false);
2613 if (env->ExceptionCheck()) {
2614 // an error occurred
2615 return std::unique_ptr<std::pair<jobject, jobject>>(nullptr);
2616 }
494da23a 2617
f67539c2
TL
2618 jobject jvalue = ROCKSDB_NAMESPACE::LongJni::valueOf(
2619 env, static_cast<jlong>(kv.second));
2620 if (env->ExceptionCheck()) {
2621 // an error occurred
2622 env->DeleteLocalRef(jkey);
2623 return std::unique_ptr<std::pair<jobject, jobject>>(nullptr);
2624 }
494da23a 2625
f67539c2
TL
2626 return std::unique_ptr<std::pair<jobject, jobject>>(
2627 new std::pair<jobject, jobject>(static_cast<jobject>(jkey),
2628 jvalue));
2629 };
494da23a
TL
2630
2631 if (!putAll(env, jhash_map, map->begin(), map->end(), fn_map_kv)) {
2632 // exception occurred
2633 return nullptr;
2634 }
2635
2636 return jhash_map;
2637 }
2638
2639 /**
2640 * Creates a java.util.Map<String, Long> from a std::map<uint32_t, uint64_t>
2641 *
2642 * @param env A pointer to the Java environment
2643 * @param map the Cpp map
2644 *
2645 * @return a reference to the Java java.util.Map object, or nullptr if an exception occcurred
2646 */
2647 static jobject fromCppMap(JNIEnv* env, const std::map<uint32_t, uint64_t>* map) {
2648 if (map == nullptr) {
2649 return nullptr;
2650 }
2651
2652 jobject jhash_map = construct(env, static_cast<uint32_t>(map->size()));
2653 if (jhash_map == nullptr) {
2654 // exception occurred
2655 return nullptr;
2656 }
2657
f67539c2
TL
2658 const ROCKSDB_NAMESPACE::HashMapJni::FnMapKV<const uint32_t, const uint64_t,
2659 jobject, jobject>
2660 fn_map_kv = [env](const std::pair<const uint32_t, const uint64_t>& kv) {
2661 jobject jkey = ROCKSDB_NAMESPACE::IntegerJni::valueOf(
2662 env, static_cast<jint>(kv.first));
2663 if (env->ExceptionCheck()) {
2664 // an error occurred
2665 return std::unique_ptr<std::pair<jobject, jobject>>(nullptr);
2666 }
494da23a 2667
f67539c2
TL
2668 jobject jvalue = ROCKSDB_NAMESPACE::LongJni::valueOf(
2669 env, static_cast<jlong>(kv.second));
2670 if (env->ExceptionCheck()) {
2671 // an error occurred
2672 env->DeleteLocalRef(jkey);
2673 return std::unique_ptr<std::pair<jobject, jobject>>(nullptr);
2674 }
494da23a 2675
f67539c2
TL
2676 return std::unique_ptr<std::pair<jobject, jobject>>(
2677 new std::pair<jobject, jobject>(static_cast<jobject>(jkey),
2678 jvalue));
2679 };
494da23a
TL
2680
2681 if (!putAll(env, jhash_map, map->begin(), map->end(), fn_map_kv)) {
2682 // exception occurred
2683 return nullptr;
2684 }
2685
2686 return jhash_map;
2687 }
2688};
2689
2690// The portal class for org.rocksdb.RocksDB
f67539c2
TL
2691class RocksDBJni
2692 : public RocksDBNativeClass<ROCKSDB_NAMESPACE::DB*, RocksDBJni> {
494da23a
TL
2693 public:
2694 /**
2695 * Get the Java Class org.rocksdb.RocksDB
2696 *
2697 * @param env A pointer to the Java environment
2698 *
2699 * @return The Java Class or nullptr if one of the
2700 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
2701 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
2702 */
2703 static jclass getJClass(JNIEnv* env) {
2704 return RocksDBNativeClass::getJClass(env, "org/rocksdb/RocksDB");
2705 }
2706};
2707
2708// The portal class for org.rocksdb.Options
f67539c2
TL
2709class OptionsJni
2710 : public RocksDBNativeClass<ROCKSDB_NAMESPACE::Options*, OptionsJni> {
494da23a
TL
2711 public:
2712 /**
2713 * Get the Java Class org.rocksdb.Options
2714 *
2715 * @param env A pointer to the Java environment
2716 *
2717 * @return The Java Class or nullptr if one of the
2718 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
2719 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
2720 */
2721 static jclass getJClass(JNIEnv* env) {
2722 return RocksDBNativeClass::getJClass(env, "org/rocksdb/Options");
2723 }
2724};
2725
2726// The portal class for org.rocksdb.DBOptions
f67539c2
TL
2727class DBOptionsJni
2728 : public RocksDBNativeClass<ROCKSDB_NAMESPACE::DBOptions*, DBOptionsJni> {
494da23a
TL
2729 public:
2730 /**
2731 * Get the Java Class org.rocksdb.DBOptions
2732 *
2733 * @param env A pointer to the Java environment
2734 *
2735 * @return The Java Class or nullptr if one of the
2736 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
2737 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
2738 */
2739 static jclass getJClass(JNIEnv* env) {
2740 return RocksDBNativeClass::getJClass(env, "org/rocksdb/DBOptions");
2741 }
2742};
2743
2744// The portal class for org.rocksdb.ColumnFamilyOptions
2745class ColumnFamilyOptionsJni
f67539c2 2746 : public RocksDBNativeClass<ROCKSDB_NAMESPACE::ColumnFamilyOptions*,
494da23a
TL
2747 ColumnFamilyOptionsJni> {
2748 public:
2749 /**
2750 * Get the Java Class org.rocksdb.ColumnFamilyOptions
2751 *
2752 * @param env A pointer to the Java environment
2753 *
2754 * @return The Java Class or nullptr if one of the
2755 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
2756 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
2757 */
2758 static jclass getJClass(JNIEnv* env) {
2759 return RocksDBNativeClass::getJClass(env,
2760 "org/rocksdb/ColumnFamilyOptions");
2761 }
2762
2763 /**
2764 * Create a new Java org.rocksdb.ColumnFamilyOptions object with the same
f67539c2
TL
2765 * properties as the provided C++ ROCKSDB_NAMESPACE::ColumnFamilyOptions
2766 * object
494da23a
TL
2767 *
2768 * @param env A pointer to the Java environment
f67539c2 2769 * @param cfoptions A pointer to ROCKSDB_NAMESPACE::ColumnFamilyOptions object
494da23a
TL
2770 *
2771 * @return A reference to a Java org.rocksdb.ColumnFamilyOptions object, or
2772 * nullptr if an an exception occurs
2773 */
2774 static jobject construct(JNIEnv* env, const ColumnFamilyOptions* cfoptions) {
f67539c2 2775 auto* cfo = new ROCKSDB_NAMESPACE::ColumnFamilyOptions(*cfoptions);
494da23a
TL
2776 jclass jclazz = getJClass(env);
2777 if(jclazz == nullptr) {
2778 // exception occurred accessing class
2779 return nullptr;
2780 }
2781
2782 jmethodID mid = env->GetMethodID(jclazz, "<init>", "(J)V");
2783 if (mid == nullptr) {
2784 // exception thrown: NoSuchMethodException or OutOfMemoryError
2785 return nullptr;
2786 }
2787
2788 jobject jcfd = env->NewObject(jclazz, mid, reinterpret_cast<jlong>(cfo));
2789 if (env->ExceptionCheck()) {
2790 return nullptr;
2791 }
2792
2793 return jcfd;
2794 }
2795};
2796
2797// The portal class for org.rocksdb.WriteOptions
f67539c2
TL
2798class WriteOptionsJni
2799 : public RocksDBNativeClass<ROCKSDB_NAMESPACE::WriteOptions*,
2800 WriteOptionsJni> {
494da23a
TL
2801 public:
2802 /**
2803 * Get the Java Class org.rocksdb.WriteOptions
2804 *
2805 * @param env A pointer to the Java environment
2806 *
2807 * @return The Java Class or nullptr if one of the
2808 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
2809 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
2810 */
2811 static jclass getJClass(JNIEnv* env) {
2812 return RocksDBNativeClass::getJClass(env, "org/rocksdb/WriteOptions");
2813 }
2814};
2815
2816// The portal class for org.rocksdb.ReadOptions
f67539c2
TL
2817class ReadOptionsJni
2818 : public RocksDBNativeClass<ROCKSDB_NAMESPACE::ReadOptions*,
2819 ReadOptionsJni> {
494da23a
TL
2820 public:
2821 /**
2822 * Get the Java Class org.rocksdb.ReadOptions
2823 *
2824 * @param env A pointer to the Java environment
2825 *
2826 * @return The Java Class or nullptr if one of the
2827 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
2828 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
2829 */
2830 static jclass getJClass(JNIEnv* env) {
2831 return RocksDBNativeClass::getJClass(env, "org/rocksdb/ReadOptions");
2832 }
2833};
2834
2835// The portal class for org.rocksdb.WriteBatch
f67539c2
TL
2836class WriteBatchJni
2837 : public RocksDBNativeClass<ROCKSDB_NAMESPACE::WriteBatch*, WriteBatchJni> {
494da23a
TL
2838 public:
2839 /**
2840 * Get the Java Class org.rocksdb.WriteBatch
2841 *
2842 * @param env A pointer to the Java environment
2843 *
2844 * @return The Java Class or nullptr if one of the
2845 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
2846 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
2847 */
2848 static jclass getJClass(JNIEnv* env) {
2849 return RocksDBNativeClass::getJClass(env, "org/rocksdb/WriteBatch");
2850 }
2851
2852 /**
2853 * Create a new Java org.rocksdb.WriteBatch object
2854 *
2855 * @param env A pointer to the Java environment
f67539c2 2856 * @param wb A pointer to ROCKSDB_NAMESPACE::WriteBatch object
494da23a
TL
2857 *
2858 * @return A reference to a Java org.rocksdb.WriteBatch object, or
2859 * nullptr if an an exception occurs
2860 */
2861 static jobject construct(JNIEnv* env, const WriteBatch* wb) {
2862 jclass jclazz = getJClass(env);
2863 if(jclazz == nullptr) {
2864 // exception occurred accessing class
2865 return nullptr;
2866 }
2867
2868 jmethodID mid = env->GetMethodID(jclazz, "<init>", "(J)V");
2869 if (mid == nullptr) {
2870 // exception thrown: NoSuchMethodException or OutOfMemoryError
2871 return nullptr;
2872 }
2873
2874 jobject jwb = env->NewObject(jclazz, mid, reinterpret_cast<jlong>(wb));
2875 if (env->ExceptionCheck()) {
2876 return nullptr;
2877 }
2878
2879 return jwb;
2880 }
2881};
2882
2883// The portal class for org.rocksdb.WriteBatch.Handler
f67539c2
TL
2884class WriteBatchHandlerJni
2885 : public RocksDBNativeClass<
2886 const ROCKSDB_NAMESPACE::WriteBatchHandlerJniCallback*,
2887 WriteBatchHandlerJni> {
494da23a
TL
2888 public:
2889 /**
2890 * Get the Java Class org.rocksdb.WriteBatch.Handler
2891 *
2892 * @param env A pointer to the Java environment
2893 *
2894 * @return The Java Class or nullptr if one of the
2895 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
2896 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
2897 */
2898 static jclass getJClass(JNIEnv* env) {
2899 return RocksDBNativeClass::getJClass(env,
2900 "org/rocksdb/WriteBatch$Handler");
2901 }
2902
2903 /**
2904 * Get the Java Method: WriteBatch.Handler#put
2905 *
2906 * @param env A pointer to the Java environment
2907 *
2908 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 2909 * be retrieved
494da23a
TL
2910 */
2911 static jmethodID getPutCfMethodId(JNIEnv* env) {
2912 jclass jclazz = getJClass(env);
2913 if(jclazz == nullptr) {
2914 // exception occurred accessing class
2915 return nullptr;
2916 }
2917
2918 static jmethodID mid = env->GetMethodID(jclazz, "put", "(I[B[B)V");
2919 assert(mid != nullptr);
2920 return mid;
2921 }
2922
2923 /**
2924 * Get the Java Method: WriteBatch.Handler#put
2925 *
2926 * @param env A pointer to the Java environment
2927 *
2928 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 2929 * be retrieved
494da23a
TL
2930 */
2931 static jmethodID getPutMethodId(JNIEnv* env) {
2932 jclass jclazz = getJClass(env);
2933 if(jclazz == nullptr) {
2934 // exception occurred accessing class
2935 return nullptr;
2936 }
2937
2938 static jmethodID mid = env->GetMethodID(jclazz, "put", "([B[B)V");
2939 assert(mid != nullptr);
2940 return mid;
2941 }
2942
2943 /**
2944 * Get the Java Method: WriteBatch.Handler#merge
2945 *
2946 * @param env A pointer to the Java environment
2947 *
2948 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 2949 * be retrieved
494da23a
TL
2950 */
2951 static jmethodID getMergeCfMethodId(JNIEnv* env) {
2952 jclass jclazz = getJClass(env);
2953 if(jclazz == nullptr) {
2954 // exception occurred accessing class
2955 return nullptr;
2956 }
2957
2958 static jmethodID mid = env->GetMethodID(jclazz, "merge", "(I[B[B)V");
2959 assert(mid != nullptr);
2960 return mid;
2961 }
2962
2963 /**
2964 * Get the Java Method: WriteBatch.Handler#merge
7c673cae
FG
2965 *
2966 * @param env A pointer to the Java environment
2967 *
494da23a 2968 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 2969 * be retrieved
7c673cae 2970 */
494da23a
TL
2971 static jmethodID getMergeMethodId(JNIEnv* env) {
2972 jclass jclazz = getJClass(env);
2973 if(jclazz == nullptr) {
2974 // exception occurred accessing class
2975 return nullptr;
2976 }
2977
2978 static jmethodID mid = env->GetMethodID(jclazz, "merge", "([B[B)V");
2979 assert(mid != nullptr);
2980 return mid;
7c673cae 2981 }
7c673cae 2982
7c673cae 2983 /**
494da23a 2984 * Get the Java Method: WriteBatch.Handler#delete
7c673cae
FG
2985 *
2986 * @param env A pointer to the Java environment
2987 *
494da23a 2988 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 2989 * be retrieved
7c673cae 2990 */
494da23a
TL
2991 static jmethodID getDeleteCfMethodId(JNIEnv* env) {
2992 jclass jclazz = getJClass(env);
2993 if(jclazz == nullptr) {
2994 // exception occurred accessing class
2995 return nullptr;
2996 }
2997
2998 static jmethodID mid = env->GetMethodID(jclazz, "delete", "(I[B)V");
2999 assert(mid != nullptr);
3000 return mid;
7c673cae
FG
3001 }
3002
3003 /**
494da23a 3004 * Get the Java Method: WriteBatch.Handler#delete
7c673cae
FG
3005 *
3006 * @param env A pointer to the Java environment
3007 *
11fdf7f2 3008 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 3009 * be retrieved
7c673cae 3010 */
494da23a 3011 static jmethodID getDeleteMethodId(JNIEnv* env) {
7c673cae
FG
3012 jclass jclazz = getJClass(env);
3013 if(jclazz == nullptr) {
3014 // exception occurred accessing class
3015 return nullptr;
3016 }
3017
494da23a 3018 static jmethodID mid = env->GetMethodID(jclazz, "delete", "([B)V");
11fdf7f2
TL
3019 assert(mid != nullptr);
3020 return mid;
7c673cae 3021 }
7c673cae 3022
7c673cae 3023 /**
494da23a 3024 * Get the Java Method: WriteBatch.Handler#singleDelete
7c673cae
FG
3025 *
3026 * @param env A pointer to the Java environment
3027 *
494da23a 3028 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 3029 * be retrieved
7c673cae 3030 */
494da23a
TL
3031 static jmethodID getSingleDeleteCfMethodId(JNIEnv* env) {
3032 jclass jclazz = getJClass(env);
3033 if(jclazz == nullptr) {
3034 // exception occurred accessing class
3035 return nullptr;
3036 }
3037
3038 static jmethodID mid = env->GetMethodID(jclazz, "singleDelete", "(I[B)V");
3039 assert(mid != nullptr);
3040 return mid;
7c673cae
FG
3041 }
3042
3043 /**
494da23a 3044 * Get the Java Method: WriteBatch.Handler#singleDelete
7c673cae
FG
3045 *
3046 * @param env A pointer to the Java environment
3047 *
494da23a 3048 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 3049 * be retrieved
7c673cae 3050 */
494da23a
TL
3051 static jmethodID getSingleDeleteMethodId(JNIEnv* env) {
3052 jclass jclazz = getJClass(env);
3053 if(jclazz == nullptr) {
3054 // exception occurred accessing class
3055 return nullptr;
3056 }
3057
3058 static jmethodID mid = env->GetMethodID(jclazz, "singleDelete", "([B)V");
3059 assert(mid != nullptr);
3060 return mid;
7c673cae 3061 }
7c673cae 3062
7c673cae 3063 /**
494da23a 3064 * Get the Java Method: WriteBatch.Handler#deleteRange
7c673cae
FG
3065 *
3066 * @param env A pointer to the Java environment
3067 *
494da23a 3068 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 3069 * be retrieved
7c673cae 3070 */
494da23a
TL
3071 static jmethodID getDeleteRangeCfMethodId(JNIEnv* env) {
3072 jclass jclazz = getJClass(env);
3073 if (jclazz == nullptr) {
3074 // exception occurred accessing class
3075 return nullptr;
3076 }
3077
3078 static jmethodID mid = env->GetMethodID(jclazz, "deleteRange", "(I[B[B)V");
3079 assert(mid != nullptr);
3080 return mid;
7c673cae
FG
3081 }
3082
3083 /**
494da23a 3084 * Get the Java Method: WriteBatch.Handler#deleteRange
7c673cae
FG
3085 *
3086 * @param env A pointer to the Java environment
3087 *
494da23a 3088 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 3089 * be retrieved
7c673cae 3090 */
494da23a
TL
3091 static jmethodID getDeleteRangeMethodId(JNIEnv* env) {
3092 jclass jclazz = getJClass(env);
3093 if (jclazz == nullptr) {
3094 // exception occurred accessing class
3095 return nullptr;
3096 }
3097
3098 static jmethodID mid = env->GetMethodID(jclazz, "deleteRange", "([B[B)V");
3099 assert(mid != nullptr);
3100 return mid;
7c673cae
FG
3101 }
3102
3103 /**
494da23a 3104 * Get the Java Method: WriteBatch.Handler#logData
7c673cae
FG
3105 *
3106 * @param env A pointer to the Java environment
3107 *
494da23a 3108 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 3109 * be retrieved
7c673cae 3110 */
494da23a
TL
3111 static jmethodID getLogDataMethodId(JNIEnv* env) {
3112 jclass jclazz = getJClass(env);
3113 if(jclazz == nullptr) {
3114 // exception occurred accessing class
3115 return nullptr;
3116 }
3117
3118 static jmethodID mid = env->GetMethodID(jclazz, "logData", "([B)V");
3119 assert(mid != nullptr);
3120 return mid;
7c673cae
FG
3121 }
3122
3123 /**
494da23a 3124 * Get the Java Method: WriteBatch.Handler#putBlobIndex
7c673cae
FG
3125 *
3126 * @param env A pointer to the Java environment
3127 *
494da23a 3128 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 3129 * be retrieved
7c673cae 3130 */
494da23a
TL
3131 static jmethodID getPutBlobIndexCfMethodId(JNIEnv* env) {
3132 jclass jclazz = getJClass(env);
3133 if(jclazz == nullptr) {
3134 // exception occurred accessing class
3135 return nullptr;
3136 }
3137
3138 static jmethodID mid = env->GetMethodID(jclazz, "putBlobIndex", "(I[B[B)V");
3139 assert(mid != nullptr);
3140 return mid;
7c673cae
FG
3141 }
3142
3143 /**
494da23a 3144 * Get the Java Method: WriteBatch.Handler#markBeginPrepare
7c673cae
FG
3145 *
3146 * @param env A pointer to the Java environment
3147 *
494da23a 3148 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 3149 * be retrieved
7c673cae 3150 */
494da23a
TL
3151 static jmethodID getMarkBeginPrepareMethodId(JNIEnv* env) {
3152 jclass jclazz = getJClass(env);
3153 if(jclazz == nullptr) {
3154 // exception occurred accessing class
3155 return nullptr;
3156 }
3157
3158 static jmethodID mid = env->GetMethodID(jclazz, "markBeginPrepare", "()V");
3159 assert(mid != nullptr);
3160 return mid;
7c673cae
FG
3161 }
3162
3163 /**
494da23a 3164 * Get the Java Method: WriteBatch.Handler#markEndPrepare
7c673cae
FG
3165 *
3166 * @param env A pointer to the Java environment
3167 *
494da23a 3168 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 3169 * be retrieved
494da23a
TL
3170 */
3171 static jmethodID getMarkEndPrepareMethodId(JNIEnv* env) {
3172 jclass jclazz = getJClass(env);
3173 if(jclazz == nullptr) {
3174 // exception occurred accessing class
3175 return nullptr;
3176 }
3177
3178 static jmethodID mid = env->GetMethodID(jclazz, "markEndPrepare", "([B)V");
3179 assert(mid != nullptr);
3180 return mid;
3181 }
3182
3183 /**
3184 * Get the Java Method: WriteBatch.Handler#markNoop
3185 *
3186 * @param env A pointer to the Java environment
3187 *
3188 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 3189 * be retrieved
7c673cae 3190 */
494da23a
TL
3191 static jmethodID getMarkNoopMethodId(JNIEnv* env) {
3192 jclass jclazz = getJClass(env);
3193 if(jclazz == nullptr) {
3194 // exception occurred accessing class
3195 return nullptr;
3196 }
3197
3198 static jmethodID mid = env->GetMethodID(jclazz, "markNoop", "(Z)V");
3199 assert(mid != nullptr);
3200 return mid;
7c673cae
FG
3201 }
3202
3203 /**
494da23a 3204 * Get the Java Method: WriteBatch.Handler#markRollback
7c673cae
FG
3205 *
3206 * @param env A pointer to the Java environment
3207 *
3208 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 3209 * be retrieved
7c673cae 3210 */
494da23a 3211 static jmethodID getMarkRollbackMethodId(JNIEnv* env) {
11fdf7f2
TL
3212 jclass jclazz = getJClass(env);
3213 if(jclazz == nullptr) {
7c673cae
FG
3214 // exception occurred accessing class
3215 return nullptr;
3216 }
11fdf7f2 3217
494da23a 3218 static jmethodID mid = env->GetMethodID(jclazz, "markRollback", "([B)V");
7c673cae
FG
3219 assert(mid != nullptr);
3220 return mid;
3221 }
3222
3223 /**
494da23a 3224 * Get the Java Method: WriteBatch.Handler#markCommit
7c673cae
FG
3225 *
3226 * @param env A pointer to the Java environment
3227 *
3228 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 3229 * be retrieved
7c673cae 3230 */
494da23a 3231 static jmethodID getMarkCommitMethodId(JNIEnv* env) {
11fdf7f2
TL
3232 jclass jclazz = getJClass(env);
3233 if(jclazz == nullptr) {
7c673cae
FG
3234 // exception occurred accessing class
3235 return nullptr;
3236 }
3237
494da23a 3238 static jmethodID mid = env->GetMethodID(jclazz, "markCommit", "([B)V");
7c673cae
FG
3239 assert(mid != nullptr);
3240 return mid;
3241 }
7c673cae 3242
494da23a
TL
3243 /**
3244 * Get the Java Method: WriteBatch.Handler#shouldContinue
3245 *
3246 * @param env A pointer to the Java environment
3247 *
3248 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 3249 * be retrieved
494da23a
TL
3250 */
3251 static jmethodID getContinueMethodId(JNIEnv* env) {
11fdf7f2
TL
3252 jclass jclazz = getJClass(env);
3253 if(jclazz == nullptr) {
3254 // exception occurred accessing class
3255 return nullptr;
3256 }
3257
494da23a 3258 static jmethodID mid = env->GetMethodID(jclazz, "shouldContinue", "()Z");
11fdf7f2
TL
3259 assert(mid != nullptr);
3260 return mid;
3261 }
3262};
3263
494da23a 3264class WriteBatchSavePointJni : public JavaClass {
11fdf7f2 3265 public:
7c673cae 3266 /**
494da23a 3267 * Get the Java Class org.rocksdb.WriteBatch.SavePoint
7c673cae
FG
3268 *
3269 * @param env A pointer to the Java environment
3270 *
3271 * @return The Java Class or nullptr if one of the
3272 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
3273 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
3274 */
11fdf7f2 3275 static jclass getJClass(JNIEnv* env) {
494da23a 3276 return JavaClass::getJClass(env, "org/rocksdb/WriteBatch$SavePoint");
7c673cae
FG
3277 }
3278
3279 /**
494da23a 3280 * Get the Java Method: HistogramData constructor
7c673cae
FG
3281 *
3282 * @param env A pointer to the Java environment
7c673cae 3283 *
11fdf7f2 3284 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 3285 * be retrieved
7c673cae 3286 */
494da23a 3287 static jmethodID getConstructorMethodId(JNIEnv* env) {
11fdf7f2
TL
3288 jclass jclazz = getJClass(env);
3289 if(jclazz == nullptr) {
7c673cae
FG
3290 // exception occurred accessing class
3291 return nullptr;
3292 }
3293
494da23a 3294 static jmethodID mid = env->GetMethodID(jclazz, "<init>", "(JJJ)V");
11fdf7f2
TL
3295 assert(mid != nullptr);
3296 return mid;
7c673cae
FG
3297 }
3298
3299 /**
494da23a 3300 * Create a new Java org.rocksdb.WriteBatch.SavePoint object
7c673cae
FG
3301 *
3302 * @param env A pointer to the Java environment
f67539c2
TL
3303 * @param savePoint A pointer to ROCKSDB_NAMESPACE::WriteBatch::SavePoint
3304 * object
7c673cae 3305 *
494da23a
TL
3306 * @return A reference to a Java org.rocksdb.WriteBatch.SavePoint object, or
3307 * nullptr if an an exception occurs
7c673cae 3308 */
494da23a 3309 static jobject construct(JNIEnv* env, const SavePoint &save_point) {
11fdf7f2
TL
3310 jclass jclazz = getJClass(env);
3311 if(jclazz == nullptr) {
7c673cae
FG
3312 // exception occurred accessing class
3313 return nullptr;
3314 }
3315
494da23a
TL
3316 jmethodID mid = getConstructorMethodId(env);
3317 if (mid == nullptr) {
3318 // exception thrown: NoSuchMethodException or OutOfMemoryError
3319 return nullptr;
3320 }
3321
3322 jobject jsave_point = env->NewObject(jclazz, mid,
3323 static_cast<jlong>(save_point.size),
3324 static_cast<jlong>(save_point.count),
3325 static_cast<jlong>(save_point.content_flags));
3326 if (env->ExceptionCheck()) {
3327 return nullptr;
3328 }
3329
3330 return jsave_point;
7c673cae 3331 }
494da23a 3332};
7c673cae 3333
494da23a 3334// The portal class for org.rocksdb.WriteBatchWithIndex
f67539c2
TL
3335class WriteBatchWithIndexJni
3336 : public RocksDBNativeClass<ROCKSDB_NAMESPACE::WriteBatchWithIndex*,
3337 WriteBatchWithIndexJni> {
494da23a 3338 public:
7c673cae 3339 /**
494da23a 3340 * Get the Java Class org.rocksdb.WriteBatchWithIndex
7c673cae
FG
3341 *
3342 * @param env A pointer to the Java environment
3343 *
494da23a
TL
3344 * @return The Java Class or nullptr if one of the
3345 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
3346 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
7c673cae 3347 */
494da23a
TL
3348 static jclass getJClass(JNIEnv* env) {
3349 return RocksDBNativeClass::getJClass(env,
3350 "org/rocksdb/WriteBatchWithIndex");
3351 }
3352};
11fdf7f2 3353
494da23a
TL
3354// The portal class for org.rocksdb.HistogramData
3355class HistogramDataJni : public JavaClass {
3356 public:
3357 /**
3358 * Get the Java Class org.rocksdb.HistogramData
3359 *
3360 * @param env A pointer to the Java environment
3361 *
3362 * @return The Java Class or nullptr if one of the
3363 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
3364 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
3365 */
3366 static jclass getJClass(JNIEnv* env) {
3367 return JavaClass::getJClass(env, "org/rocksdb/HistogramData");
7c673cae
FG
3368 }
3369
3370 /**
494da23a 3371 * Get the Java Method: HistogramData constructor
7c673cae
FG
3372 *
3373 * @param env A pointer to the Java environment
3374 *
3375 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 3376 * be retrieved
7c673cae 3377 */
494da23a 3378 static jmethodID getConstructorMethodId(JNIEnv* env) {
7c673cae
FG
3379 jclass jclazz = getJClass(env);
3380 if(jclazz == nullptr) {
3381 // exception occurred accessing class
3382 return nullptr;
3383 }
3384
494da23a 3385 static jmethodID mid = env->GetMethodID(jclazz, "<init>", "(DDDDDDJJD)V");
7c673cae
FG
3386 assert(mid != nullptr);
3387 return mid;
3388 }
11fdf7f2 3389};
7c673cae 3390
494da23a 3391// The portal class for org.rocksdb.BackupableDBOptions
f67539c2
TL
3392class BackupableDBOptionsJni
3393 : public RocksDBNativeClass<ROCKSDB_NAMESPACE::BackupableDBOptions*,
3394 BackupableDBOptionsJni> {
11fdf7f2 3395 public:
7c673cae 3396 /**
494da23a 3397 * Get the Java Class org.rocksdb.BackupableDBOptions
7c673cae
FG
3398 *
3399 * @param env A pointer to the Java environment
7c673cae 3400 *
11fdf7f2
TL
3401 * @return The Java Class or nullptr if one of the
3402 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
3403 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
7c673cae 3404 */
11fdf7f2 3405 static jclass getJClass(JNIEnv* env) {
494da23a
TL
3406 return RocksDBNativeClass::getJClass(env,
3407 "org/rocksdb/BackupableDBOptions");
7c673cae
FG
3408 }
3409};
3410
494da23a 3411// The portal class for org.rocksdb.BackupEngine
f67539c2
TL
3412class BackupEngineJni
3413 : public RocksDBNativeClass<ROCKSDB_NAMESPACE::BackupEngine*,
3414 BackupEngineJni> {
7c673cae
FG
3415 public:
3416 /**
494da23a 3417 * Get the Java Class org.rocksdb.BackupableEngine
7c673cae
FG
3418 *
3419 * @param env A pointer to the Java environment
3420 *
3421 * @return The Java Class or nullptr if one of the
3422 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
3423 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
3424 */
3425 static jclass getJClass(JNIEnv* env) {
494da23a 3426 return RocksDBNativeClass::getJClass(env, "org/rocksdb/BackupEngine");
7c673cae 3427 }
494da23a 3428};
7c673cae 3429
494da23a 3430// The portal class for org.rocksdb.RocksIterator
f67539c2
TL
3431class IteratorJni
3432 : public RocksDBNativeClass<ROCKSDB_NAMESPACE::Iterator*, IteratorJni> {
494da23a 3433 public:
7c673cae 3434 /**
494da23a 3435 * Get the Java Class org.rocksdb.RocksIterator
7c673cae
FG
3436 *
3437 * @param env A pointer to the Java environment
7c673cae 3438 *
494da23a
TL
3439 * @return The Java Class or nullptr if one of the
3440 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
3441 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
7c673cae 3442 */
494da23a
TL
3443 static jclass getJClass(JNIEnv* env) {
3444 return RocksDBNativeClass::getJClass(env, "org/rocksdb/RocksIterator");
7c673cae
FG
3445 }
3446};
3447
494da23a 3448// The portal class for org.rocksdb.Filter
f67539c2
TL
3449class FilterJni
3450 : public RocksDBNativeClass<
3451 std::shared_ptr<ROCKSDB_NAMESPACE::FilterPolicy>*, FilterJni> {
7c673cae
FG
3452 public:
3453 /**
494da23a 3454 * Get the Java Class org.rocksdb.Filter
7c673cae
FG
3455 *
3456 * @param env A pointer to the Java environment
7c673cae 3457 *
11fdf7f2
TL
3458 * @return The Java Class or nullptr if one of the
3459 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
3460 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
7c673cae 3461 */
11fdf7f2 3462 static jclass getJClass(JNIEnv* env) {
494da23a 3463 return RocksDBNativeClass::getJClass(env, "org/rocksdb/Filter");
11fdf7f2 3464 }
494da23a 3465};
11fdf7f2 3466
494da23a 3467// The portal class for org.rocksdb.ColumnFamilyHandle
f67539c2
TL
3468class ColumnFamilyHandleJni
3469 : public RocksDBNativeClass<ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
3470 ColumnFamilyHandleJni> {
494da23a 3471 public:
20effc67
TL
3472 static jobject fromCppColumnFamilyHandle(
3473 JNIEnv* env, const ROCKSDB_NAMESPACE::ColumnFamilyHandle* info) {
3474 jclass jclazz = getJClass(env);
3475 assert(jclazz != nullptr);
3476 static jmethodID ctor = getConstructorMethodId(env, jclazz);
3477 assert(ctor != nullptr);
3478 return env->NewObject(jclazz, ctor, reinterpret_cast<jlong>(info));
3479 }
3480
3481 static jmethodID getConstructorMethodId(JNIEnv* env, jclass clazz) {
3482 return env->GetMethodID(clazz, "<init>", "(J)V");
3483 }
3484
11fdf7f2 3485 /**
494da23a 3486 * Get the Java Class org.rocksdb.ColumnFamilyHandle
11fdf7f2
TL
3487 *
3488 * @param env A pointer to the Java environment
3489 *
494da23a
TL
3490 * @return The Java Class or nullptr if one of the
3491 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
3492 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
11fdf7f2 3493 */
494da23a
TL
3494 static jclass getJClass(JNIEnv* env) {
3495 return RocksDBNativeClass::getJClass(env,
3496 "org/rocksdb/ColumnFamilyHandle");
3497 }
3498};
7c673cae 3499
494da23a 3500// The portal class for org.rocksdb.FlushOptions
f67539c2
TL
3501class FlushOptionsJni
3502 : public RocksDBNativeClass<ROCKSDB_NAMESPACE::FlushOptions*,
3503 FlushOptionsJni> {
494da23a
TL
3504 public:
3505 /**
3506 * Get the Java Class org.rocksdb.FlushOptions
3507 *
3508 * @param env A pointer to the Java environment
3509 *
3510 * @return The Java Class or nullptr if one of the
3511 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
3512 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
3513 */
3514 static jclass getJClass(JNIEnv* env) {
3515 return RocksDBNativeClass::getJClass(env, "org/rocksdb/FlushOptions");
11fdf7f2
TL
3516 }
3517};
3518
494da23a 3519// The portal class for org.rocksdb.ComparatorOptions
f67539c2
TL
3520class ComparatorOptionsJni
3521 : public RocksDBNativeClass<
3522 ROCKSDB_NAMESPACE::ComparatorJniCallbackOptions*,
3523 ComparatorOptionsJni> {
11fdf7f2
TL
3524 public:
3525 /**
494da23a 3526 * Get the Java Class org.rocksdb.ComparatorOptions
11fdf7f2
TL
3527 *
3528 * @param env A pointer to the Java environment
3529 *
3530 * @return The Java Class or nullptr if one of the
3531 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
3532 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
3533 */
494da23a
TL
3534 static jclass getJClass(JNIEnv* env) {
3535 return RocksDBNativeClass::getJClass(env, "org/rocksdb/ComparatorOptions");
11fdf7f2 3536 }
494da23a 3537};
11fdf7f2 3538
494da23a 3539// The portal class for org.rocksdb.AbstractCompactionFilterFactory
f67539c2
TL
3540class AbstractCompactionFilterFactoryJni
3541 : public RocksDBNativeClass<
3542 const ROCKSDB_NAMESPACE::CompactionFilterFactoryJniCallback*,
3543 AbstractCompactionFilterFactoryJni> {
494da23a 3544 public:
11fdf7f2 3545 /**
494da23a 3546 * Get the Java Class org.rocksdb.AbstractCompactionFilterFactory
11fdf7f2
TL
3547 *
3548 * @param env A pointer to the Java environment
3549 *
3550 * @return The Java Class or nullptr if one of the
3551 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
3552 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
3553 */
494da23a
TL
3554 static jclass getJClass(JNIEnv* env) {
3555 return RocksDBNativeClass::getJClass(env,
3556 "org/rocksdb/AbstractCompactionFilterFactory");
11fdf7f2
TL
3557 }
3558
3559 /**
494da23a 3560 * Get the Java Method: AbstractCompactionFilterFactory#name
11fdf7f2
TL
3561 *
3562 * @param env A pointer to the Java environment
3563 *
494da23a 3564 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 3565 * be retrieved
11fdf7f2 3566 */
494da23a
TL
3567 static jmethodID getNameMethodId(JNIEnv* env) {
3568 jclass jclazz = getJClass(env);
3569 if(jclazz == nullptr) {
3570 // exception occurred accessing class
3571 return nullptr;
3572 }
3573
3574 static jmethodID mid = env->GetMethodID(
3575 jclazz, "name", "()Ljava/lang/String;");
3576 assert(mid != nullptr);
3577 return mid;
11fdf7f2
TL
3578 }
3579
3580 /**
494da23a 3581 * Get the Java Method: AbstractCompactionFilterFactory#createCompactionFilter
11fdf7f2
TL
3582 *
3583 * @param env A pointer to the Java environment
3584 *
3585 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 3586 * be retrieved
11fdf7f2 3587 */
494da23a
TL
3588 static jmethodID getCreateCompactionFilterMethodId(JNIEnv* env) {
3589 jclass jclazz = getJClass(env);
3590 if(jclazz == nullptr) {
11fdf7f2 3591 // exception occurred accessing class
7c673cae
FG
3592 return nullptr;
3593 }
3594
494da23a
TL
3595 static jmethodID mid = env->GetMethodID(jclazz,
3596 "createCompactionFilter",
3597 "(ZZ)J");
3598 assert(mid != nullptr);
3599 return mid;
3600 }
3601};
3602
3603// The portal class for org.rocksdb.AbstractTransactionNotifier
f67539c2
TL
3604class AbstractTransactionNotifierJni
3605 : public RocksDBNativeClass<
3606 const ROCKSDB_NAMESPACE::TransactionNotifierJniCallback*,
3607 AbstractTransactionNotifierJni> {
494da23a
TL
3608 public:
3609 static jclass getJClass(JNIEnv* env) {
3610 return RocksDBNativeClass::getJClass(env,
3611 "org/rocksdb/AbstractTransactionNotifier");
3612 }
3613
3614 // Get the java method `snapshotCreated`
3615 // of org.rocksdb.AbstractTransactionNotifier.
3616 static jmethodID getSnapshotCreatedMethodId(JNIEnv* env) {
3617 jclass jclazz = getJClass(env);
3618 if(jclazz == nullptr) {
3619 // exception occurred accessing class
3620 return nullptr;
3621 }
3622
3623 static jmethodID mid = env->GetMethodID(jclazz, "snapshotCreated", "(J)V");
11fdf7f2
TL
3624 assert(mid != nullptr);
3625 return mid;
3626 }
494da23a 3627};
7c673cae 3628
f67539c2
TL
3629// The portal class for org.rocksdb.AbstractComparatorJniBridge
3630class AbstractComparatorJniBridge : public JavaClass {
494da23a 3631 public:
11fdf7f2 3632 /**
f67539c2 3633 * Get the Java Class org.rocksdb.AbstractComparatorJniBridge
494da23a
TL
3634 *
3635 * @param env A pointer to the Java environment
3636 *
3637 * @return The Java Class or nullptr if one of the
3638 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
3639 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
3640 */
3641 static jclass getJClass(JNIEnv* env) {
f67539c2
TL
3642 return JavaClass::getJClass(env,
3643 "org/rocksdb/AbstractComparatorJniBridge");
494da23a
TL
3644 }
3645
3646 /**
f67539c2 3647 * Get the Java Method: Comparator#compareInternal
11fdf7f2
TL
3648 *
3649 * @param env A pointer to the Java environment
f67539c2 3650 * @param jclazz the AbstractComparatorJniBridge class
11fdf7f2
TL
3651 *
3652 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 3653 * be retrieved
11fdf7f2 3654 */
f67539c2 3655 static jmethodID getCompareInternalMethodId(JNIEnv* env, jclass jclazz) {
494da23a 3656 static jmethodID mid =
f67539c2
TL
3657 env->GetStaticMethodID(jclazz, "compareInternal",
3658 "(Lorg/rocksdb/AbstractComparator;Ljava/nio/ByteBuffer;ILjava/nio/ByteBuffer;I)I");
11fdf7f2
TL
3659 assert(mid != nullptr);
3660 return mid;
3661 }
3662
3663 /**
f67539c2 3664 * Get the Java Method: Comparator#findShortestSeparatorInternal
11fdf7f2
TL
3665 *
3666 * @param env A pointer to the Java environment
f67539c2 3667 * @param jclazz the AbstractComparatorJniBridge class
11fdf7f2
TL
3668 *
3669 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 3670 * be retrieved
11fdf7f2 3671 */
f67539c2 3672 static jmethodID getFindShortestSeparatorInternalMethodId(JNIEnv* env, jclass jclazz) {
11fdf7f2 3673 static jmethodID mid =
f67539c2
TL
3674 env->GetStaticMethodID(jclazz, "findShortestSeparatorInternal",
3675 "(Lorg/rocksdb/AbstractComparator;Ljava/nio/ByteBuffer;ILjava/nio/ByteBuffer;I)I");
11fdf7f2
TL
3676 assert(mid != nullptr);
3677 return mid;
3678 }
3679
3680 /**
f67539c2 3681 * Get the Java Method: Comparator#findShortSuccessorInternal
11fdf7f2
TL
3682 *
3683 * @param env A pointer to the Java environment
f67539c2 3684 * @param jclazz the AbstractComparatorJniBridge class
11fdf7f2
TL
3685 *
3686 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 3687 * be retrieved
11fdf7f2 3688 */
f67539c2 3689 static jmethodID getFindShortSuccessorInternalMethodId(JNIEnv* env, jclass jclazz) {
11fdf7f2 3690 static jmethodID mid =
f67539c2
TL
3691 env->GetStaticMethodID(jclazz, "findShortSuccessorInternal",
3692 "(Lorg/rocksdb/AbstractComparator;Ljava/nio/ByteBuffer;I)I");
11fdf7f2
TL
3693 assert(mid != nullptr);
3694 return mid;
3695 }
f67539c2
TL
3696};
3697
3698// The portal class for org.rocksdb.AbstractComparator
3699class AbstractComparatorJni
3700 : public RocksDBNativeClass<const ROCKSDB_NAMESPACE::ComparatorJniCallback*,
3701 AbstractComparatorJni> {
3702 public:
3703 /**
3704 * Get the Java Class org.rocksdb.AbstractComparator
3705 *
3706 * @param env A pointer to the Java environment
3707 *
3708 * @return The Java Class or nullptr if one of the
3709 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
3710 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
3711 */
3712 static jclass getJClass(JNIEnv* env) {
3713 return RocksDBNativeClass::getJClass(env,
3714 "org/rocksdb/AbstractComparator");
3715 }
11fdf7f2
TL
3716
3717 /**
f67539c2 3718 * Get the Java Method: Comparator#name
11fdf7f2
TL
3719 *
3720 * @param env A pointer to the Java environment
3721 *
3722 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 3723 * be retrieved
11fdf7f2 3724 */
f67539c2 3725 static jmethodID getNameMethodId(JNIEnv* env) {
494da23a
TL
3726 jclass jclazz = getJClass(env);
3727 if(jclazz == nullptr) {
11fdf7f2
TL
3728 // exception occurred accessing class
3729 return nullptr;
3730 }
3731
3732 static jmethodID mid =
f67539c2 3733 env->GetMethodID(jclazz, "name", "()Ljava/lang/String;");
11fdf7f2
TL
3734 assert(mid != nullptr);
3735 return mid;
7c673cae
FG
3736 }
3737};
3738
494da23a 3739// The portal class for org.rocksdb.AbstractSlice
f67539c2
TL
3740class AbstractSliceJni
3741 : public NativeRocksMutableObject<const ROCKSDB_NAMESPACE::Slice*,
3742 AbstractSliceJni> {
7c673cae
FG
3743 public:
3744 /**
494da23a 3745 * Get the Java Class org.rocksdb.AbstractSlice
7c673cae
FG
3746 *
3747 * @param env A pointer to the Java environment
3748 *
3749 * @return The Java Class or nullptr if one of the
3750 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
3751 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
3752 */
3753 static jclass getJClass(JNIEnv* env) {
494da23a 3754 return RocksDBNativeClass::getJClass(env, "org/rocksdb/AbstractSlice");
7c673cae 3755 }
494da23a 3756};
7c673cae 3757
494da23a 3758// The portal class for org.rocksdb.Slice
f67539c2
TL
3759class SliceJni
3760 : public NativeRocksMutableObject<const ROCKSDB_NAMESPACE::Slice*,
3761 AbstractSliceJni> {
494da23a 3762 public:
7c673cae 3763 /**
494da23a 3764 * Get the Java Class org.rocksdb.Slice
7c673cae
FG
3765 *
3766 * @param env A pointer to the Java environment
3767 *
11fdf7f2
TL
3768 * @return The Java Class or nullptr if one of the
3769 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
3770 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
3771 */
494da23a
TL
3772 static jclass getJClass(JNIEnv* env) {
3773 return RocksDBNativeClass::getJClass(env, "org/rocksdb/Slice");
11fdf7f2
TL
3774 }
3775
3776 /**
494da23a 3777 * Constructs a Slice object
11fdf7f2
TL
3778 *
3779 * @param env A pointer to the Java environment
11fdf7f2 3780 *
494da23a
TL
3781 * @return A reference to a Java Slice object, or a nullptr if an
3782 * exception occurs
11fdf7f2 3783 */
494da23a
TL
3784 static jobject construct0(JNIEnv* env) {
3785 jclass jclazz = getJClass(env);
3786 if(jclazz == nullptr) {
11fdf7f2
TL
3787 // exception occurred accessing class
3788 return nullptr;
3789 }
3790
494da23a
TL
3791 static jmethodID mid = env->GetMethodID(jclazz, "<init>", "()V");
3792 if(mid == nullptr) {
3793 // exception occurred accessing method
3794 return nullptr;
3795 }
11fdf7f2 3796
494da23a
TL
3797 jobject jslice = env->NewObject(jclazz, mid);
3798 if(env->ExceptionCheck()) {
7c673cae
FG
3799 return nullptr;
3800 }
3801
494da23a 3802 return jslice;
7c673cae 3803 }
11fdf7f2 3804};
7c673cae 3805
494da23a 3806// The portal class for org.rocksdb.DirectSlice
f67539c2
TL
3807class DirectSliceJni
3808 : public NativeRocksMutableObject<const ROCKSDB_NAMESPACE::Slice*,
3809 AbstractSliceJni> {
494da23a 3810 public:
7c673cae 3811 /**
494da23a 3812 * Get the Java Class org.rocksdb.DirectSlice
7c673cae 3813 *
11fdf7f2 3814 * @param env A pointer to the Java environment
7c673cae 3815 *
11fdf7f2
TL
3816 * @return The Java Class or nullptr if one of the
3817 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
3818 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
7c673cae 3819 */
11fdf7f2 3820 static jclass getJClass(JNIEnv* env) {
494da23a 3821 return RocksDBNativeClass::getJClass(env, "org/rocksdb/DirectSlice");
11fdf7f2
TL
3822 }
3823
3824 /**
494da23a 3825 * Constructs a DirectSlice object
11fdf7f2
TL
3826 *
3827 * @param env A pointer to the Java environment
494da23a
TL
3828 *
3829 * @return A reference to a Java DirectSlice object, or a nullptr if an
3830 * exception occurs
3831 */
3832 static jobject construct0(JNIEnv* env) {
3833 jclass jclazz = getJClass(env);
3834 if(jclazz == nullptr) {
3835 // exception occurred accessing class
11fdf7f2
TL
3836 return nullptr;
3837 }
3838
494da23a
TL
3839 static jmethodID mid = env->GetMethodID(jclazz, "<init>", "()V");
3840 if(mid == nullptr) {
3841 // exception occurred accessing method
11fdf7f2
TL
3842 return nullptr;
3843 }
3844
494da23a 3845 jobject jdirect_slice = env->NewObject(jclazz, mid);
11fdf7f2 3846 if(env->ExceptionCheck()) {
11fdf7f2
TL
3847 return nullptr;
3848 }
3849
494da23a 3850 return jdirect_slice;
11fdf7f2
TL
3851 }
3852};
3853
3854// The portal class for org.rocksdb.BackupInfo
3855class BackupInfoJni : public JavaClass {
3856 public:
3857 /**
3858 * Get the Java Class org.rocksdb.BackupInfo
3859 *
3860 * @param env A pointer to the Java environment
3861 *
3862 * @return The Java Class or nullptr if one of the
3863 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
3864 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
3865 */
3866 static jclass getJClass(JNIEnv* env) {
3867 return JavaClass::getJClass(env, "org/rocksdb/BackupInfo");
3868 }
3869
3870 /**
3871 * Constructs a BackupInfo object
3872 *
3873 * @param env A pointer to the Java environment
3874 * @param backup_id id of the backup
3875 * @param timestamp timestamp of the backup
3876 * @param size size of the backup
3877 * @param number_files number of files related to the backup
3878 * @param app_metadata application specific metadata
3879 *
3880 * @return A reference to a Java BackupInfo object, or a nullptr if an
3881 * exception occurs
3882 */
3883 static jobject construct0(JNIEnv* env, uint32_t backup_id, int64_t timestamp,
3884 uint64_t size, uint32_t number_files,
3885 const std::string& app_metadata) {
3886 jclass jclazz = getJClass(env);
3887 if(jclazz == nullptr) {
3888 // exception occurred accessing class
3889 return nullptr;
3890 }
3891
3892 static jmethodID mid =
3893 env->GetMethodID(jclazz, "<init>", "(IJJILjava/lang/String;)V");
3894 if(mid == nullptr) {
3895 // exception occurred accessing method
3896 return nullptr;
3897 }
3898
3899 jstring japp_metadata = nullptr;
3900 if (app_metadata != nullptr) {
3901 japp_metadata = env->NewStringUTF(app_metadata.c_str());
3902 if (japp_metadata == nullptr) {
3903 // exception occurred creating java string
3904 return nullptr;
3905 }
3906 }
3907
3908 jobject jbackup_info = env->NewObject(jclazz, mid, backup_id, timestamp,
3909 size, number_files, japp_metadata);
3910 if(env->ExceptionCheck()) {
3911 env->DeleteLocalRef(japp_metadata);
3912 return nullptr;
3913 }
3914
3915 return jbackup_info;
3916 }
3917};
3918
3919class BackupInfoListJni {
3920 public:
3921 /**
3922 * Converts a C++ std::vector<BackupInfo> object to
3923 * a Java ArrayList<org.rocksdb.BackupInfo> object
3924 *
3925 * @param env A pointer to the Java environment
3926 * @param backup_infos A vector of BackupInfo
3927 *
3928 * @return Either a reference to a Java ArrayList object, or a nullptr
3929 * if an exception occurs
3930 */
3931 static jobject getBackupInfo(JNIEnv* env,
3932 std::vector<BackupInfo> backup_infos) {
f67539c2
TL
3933 jclass jarray_list_clazz =
3934 ROCKSDB_NAMESPACE::ListJni::getArrayListClass(env);
11fdf7f2
TL
3935 if(jarray_list_clazz == nullptr) {
3936 // exception occurred accessing class
3937 return nullptr;
3938 }
3939
f67539c2
TL
3940 jmethodID cstr_mid =
3941 ROCKSDB_NAMESPACE::ListJni::getArrayListConstructorMethodId(env);
11fdf7f2
TL
3942 if(cstr_mid == nullptr) {
3943 // exception occurred accessing method
3944 return nullptr;
3945 }
3946
f67539c2 3947 jmethodID add_mid = ROCKSDB_NAMESPACE::ListJni::getListAddMethodId(env);
11fdf7f2
TL
3948 if(add_mid == nullptr) {
3949 // exception occurred accessing method
3950 return nullptr;
3951 }
3952
3953 // create java list
3954 jobject jbackup_info_handle_list =
3955 env->NewObject(jarray_list_clazz, cstr_mid, backup_infos.size());
3956 if(env->ExceptionCheck()) {
3957 // exception occurred constructing object
3958 return nullptr;
3959 }
3960
3961 // insert in java list
3962 auto end = backup_infos.end();
3963 for (auto it = backup_infos.begin(); it != end; ++it) {
3964 auto backup_info = *it;
3965
f67539c2 3966 jobject obj = ROCKSDB_NAMESPACE::BackupInfoJni::construct0(
11fdf7f2
TL
3967 env, backup_info.backup_id, backup_info.timestamp, backup_info.size,
3968 backup_info.number_files, backup_info.app_metadata);
3969 if(env->ExceptionCheck()) {
3970 // exception occurred constructing object
3971 if(obj != nullptr) {
3972 env->DeleteLocalRef(obj);
3973 }
3974 if(jbackup_info_handle_list != nullptr) {
3975 env->DeleteLocalRef(jbackup_info_handle_list);
3976 }
3977 return nullptr;
3978 }
3979
3980 jboolean rs =
3981 env->CallBooleanMethod(jbackup_info_handle_list, add_mid, obj);
3982 if(env->ExceptionCheck() || rs == JNI_FALSE) {
3983 // exception occurred calling method, or could not add
3984 if(obj != nullptr) {
3985 env->DeleteLocalRef(obj);
3986 }
3987 if(jbackup_info_handle_list != nullptr) {
3988 env->DeleteLocalRef(jbackup_info_handle_list);
3989 }
3990 return nullptr;
3991 }
3992 }
3993
3994 return jbackup_info_handle_list;
3995 }
3996};
3997
3998// The portal class for org.rocksdb.WBWIRocksIterator
3999class WBWIRocksIteratorJni : public JavaClass {
4000 public:
4001 /**
4002 * Get the Java Class org.rocksdb.WBWIRocksIterator
4003 *
4004 * @param env A pointer to the Java environment
4005 *
4006 * @return The Java Class or nullptr if one of the
4007 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
4008 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
4009 */
4010 static jclass getJClass(JNIEnv* env) {
4011 return JavaClass::getJClass(env, "org/rocksdb/WBWIRocksIterator");
4012 }
4013
4014 /**
4015 * Get the Java Field: WBWIRocksIterator#entry
4016 *
4017 * @param env A pointer to the Java environment
4018 *
4019 * @return The Java Field ID or nullptr if the class or field id could not
20effc67 4020 * be retrieved
11fdf7f2
TL
4021 */
4022 static jfieldID getWriteEntryField(JNIEnv* env) {
4023 jclass jclazz = getJClass(env);
4024 if(jclazz == nullptr) {
4025 // exception occurred accessing class
4026 return nullptr;
4027 }
4028
4029 static jfieldID fid =
4030 env->GetFieldID(jclazz, "entry",
4031 "Lorg/rocksdb/WBWIRocksIterator$WriteEntry;");
4032 assert(fid != nullptr);
4033 return fid;
4034 }
4035
4036 /**
4037 * Gets the value of the WBWIRocksIterator#entry
4038 *
4039 * @param env A pointer to the Java environment
4040 * @param jwbwi_rocks_iterator A reference to a WBWIIterator
4041 *
4042 * @return A reference to a Java WBWIRocksIterator.WriteEntry object, or
4043 * a nullptr if an exception occurs
4044 */
4045 static jobject getWriteEntry(JNIEnv* env, jobject jwbwi_rocks_iterator) {
4046 assert(jwbwi_rocks_iterator != nullptr);
4047
4048 jfieldID jwrite_entry_field = getWriteEntryField(env);
4049 if(jwrite_entry_field == nullptr) {
4050 // exception occurred accessing the field
4051 return nullptr;
4052 }
4053
4054 jobject jwe = env->GetObjectField(jwbwi_rocks_iterator, jwrite_entry_field);
4055 assert(jwe != nullptr);
4056 return jwe;
4057 }
4058};
4059
4060// The portal class for org.rocksdb.WBWIRocksIterator.WriteType
4061class WriteTypeJni : public JavaClass {
4062 public:
4063 /**
4064 * Get the PUT enum field value of WBWIRocksIterator.WriteType
4065 *
4066 * @param env A pointer to the Java environment
4067 *
4068 * @return A reference to the enum field value or a nullptr if
4069 * the enum field value could not be retrieved
4070 */
4071 static jobject PUT(JNIEnv* env) {
4072 return getEnum(env, "PUT");
4073 }
4074
4075 /**
4076 * Get the MERGE enum field value of WBWIRocksIterator.WriteType
4077 *
4078 * @param env A pointer to the Java environment
4079 *
4080 * @return A reference to the enum field value or a nullptr if
4081 * the enum field value could not be retrieved
4082 */
4083 static jobject MERGE(JNIEnv* env) {
4084 return getEnum(env, "MERGE");
4085 }
4086
4087 /**
4088 * Get the DELETE enum field value of WBWIRocksIterator.WriteType
4089 *
4090 * @param env A pointer to the Java environment
4091 *
4092 * @return A reference to the enum field value or a nullptr if
4093 * the enum field value could not be retrieved
4094 */
4095 static jobject DELETE(JNIEnv* env) {
4096 return getEnum(env, "DELETE");
4097 }
4098
4099 /**
4100 * Get the LOG enum field value of WBWIRocksIterator.WriteType
4101 *
4102 * @param env A pointer to the Java environment
4103 *
4104 * @return A reference to the enum field value or a nullptr if
4105 * the enum field value could not be retrieved
4106 */
4107 static jobject LOG(JNIEnv* env) {
4108 return getEnum(env, "LOG");
4109 }
4110
4111 // Returns the equivalent org.rocksdb.WBWIRocksIterator.WriteType for the
f67539c2
TL
4112 // provided C++ ROCKSDB_NAMESPACE::WriteType enum
4113 static jbyte toJavaWriteType(const ROCKSDB_NAMESPACE::WriteType& writeType) {
11fdf7f2 4114 switch (writeType) {
f67539c2 4115 case ROCKSDB_NAMESPACE::WriteType::kPutRecord:
11fdf7f2 4116 return 0x0;
f67539c2 4117 case ROCKSDB_NAMESPACE::WriteType::kMergeRecord:
11fdf7f2 4118 return 0x1;
f67539c2 4119 case ROCKSDB_NAMESPACE::WriteType::kDeleteRecord:
11fdf7f2 4120 return 0x2;
f67539c2 4121 case ROCKSDB_NAMESPACE::WriteType::kSingleDeleteRecord:
11fdf7f2 4122 return 0x3;
f67539c2 4123 case ROCKSDB_NAMESPACE::WriteType::kDeleteRangeRecord:
11fdf7f2 4124 return 0x4;
f67539c2 4125 case ROCKSDB_NAMESPACE::WriteType::kLogDataRecord:
11fdf7f2 4126 return 0x5;
f67539c2 4127 case ROCKSDB_NAMESPACE::WriteType::kXIDRecord:
11fdf7f2
TL
4128 return 0x6;
4129 default:
4130 return 0x7F; // undefined
4131 }
4132 }
4133
4134 private:
4135 /**
4136 * Get the Java Class org.rocksdb.WBWIRocksIterator.WriteType
4137 *
4138 * @param env A pointer to the Java environment
4139 *
4140 * @return The Java Class or nullptr if one of the
4141 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
4142 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
4143 */
4144 static jclass getJClass(JNIEnv* env) {
4145 return JavaClass::getJClass(env, "org/rocksdb/WBWIRocksIterator$WriteType");
4146 }
4147
4148 /**
4149 * Get an enum field of org.rocksdb.WBWIRocksIterator.WriteType
4150 *
4151 * @param env A pointer to the Java environment
4152 * @param name The name of the enum field
4153 *
4154 * @return A reference to the enum field value or a nullptr if
4155 * the enum field value could not be retrieved
4156 */
4157 static jobject getEnum(JNIEnv* env, const char name[]) {
4158 jclass jclazz = getJClass(env);
4159 if(jclazz == nullptr) {
4160 // exception occurred accessing class
4161 return nullptr;
4162 }
4163
4164 jfieldID jfid =
4165 env->GetStaticFieldID(jclazz, name,
4166 "Lorg/rocksdb/WBWIRocksIterator$WriteType;");
4167 if(env->ExceptionCheck()) {
4168 // exception occurred while getting field
4169 return nullptr;
4170 } else if(jfid == nullptr) {
4171 return nullptr;
4172 }
4173
4174 jobject jwrite_type = env->GetStaticObjectField(jclazz, jfid);
4175 assert(jwrite_type != nullptr);
4176 return jwrite_type;
4177 }
4178};
4179
4180// The portal class for org.rocksdb.WBWIRocksIterator.WriteEntry
4181class WriteEntryJni : public JavaClass {
4182 public:
4183 /**
4184 * Get the Java Class org.rocksdb.WBWIRocksIterator.WriteEntry
4185 *
4186 * @param env A pointer to the Java environment
4187 *
4188 * @return The Java Class or nullptr if one of the
4189 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
4190 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
4191 */
4192 static jclass getJClass(JNIEnv* env) {
4193 return JavaClass::getJClass(env, "org/rocksdb/WBWIRocksIterator$WriteEntry");
4194 }
4195};
4196
4197// The portal class for org.rocksdb.InfoLogLevel
4198class InfoLogLevelJni : public JavaClass {
4199 public:
4200 /**
4201 * Get the DEBUG_LEVEL enum field value of InfoLogLevel
4202 *
4203 * @param env A pointer to the Java environment
4204 *
4205 * @return A reference to the enum field value or a nullptr if
4206 * the enum field value could not be retrieved
4207 */
4208 static jobject DEBUG_LEVEL(JNIEnv* env) {
4209 return getEnum(env, "DEBUG_LEVEL");
4210 }
4211
4212 /**
4213 * Get the INFO_LEVEL enum field value of InfoLogLevel
4214 *
4215 * @param env A pointer to the Java environment
4216 *
4217 * @return A reference to the enum field value or a nullptr if
4218 * the enum field value could not be retrieved
4219 */
4220 static jobject INFO_LEVEL(JNIEnv* env) {
4221 return getEnum(env, "INFO_LEVEL");
4222 }
4223
4224 /**
4225 * Get the WARN_LEVEL enum field value of InfoLogLevel
4226 *
4227 * @param env A pointer to the Java environment
4228 *
4229 * @return A reference to the enum field value or a nullptr if
4230 * the enum field value could not be retrieved
4231 */
4232 static jobject WARN_LEVEL(JNIEnv* env) {
4233 return getEnum(env, "WARN_LEVEL");
4234 }
4235
4236 /**
4237 * Get the ERROR_LEVEL enum field value of InfoLogLevel
4238 *
4239 * @param env A pointer to the Java environment
4240 *
4241 * @return A reference to the enum field value or a nullptr if
4242 * the enum field value could not be retrieved
4243 */
4244 static jobject ERROR_LEVEL(JNIEnv* env) {
4245 return getEnum(env, "ERROR_LEVEL");
4246 }
4247
4248 /**
4249 * Get the FATAL_LEVEL enum field value of InfoLogLevel
4250 *
4251 * @param env A pointer to the Java environment
4252 *
4253 * @return A reference to the enum field value or a nullptr if
4254 * the enum field value could not be retrieved
4255 */
4256 static jobject FATAL_LEVEL(JNIEnv* env) {
4257 return getEnum(env, "FATAL_LEVEL");
4258 }
4259
4260 /**
4261 * Get the HEADER_LEVEL enum field value of InfoLogLevel
4262 *
4263 * @param env A pointer to the Java environment
4264 *
4265 * @return A reference to the enum field value or a nullptr if
4266 * the enum field value could not be retrieved
4267 */
4268 static jobject HEADER_LEVEL(JNIEnv* env) {
4269 return getEnum(env, "HEADER_LEVEL");
4270 }
4271
4272 private:
4273 /**
4274 * Get the Java Class org.rocksdb.InfoLogLevel
4275 *
4276 * @param env A pointer to the Java environment
4277 *
4278 * @return The Java Class or nullptr if one of the
4279 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
4280 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
4281 */
4282 static jclass getJClass(JNIEnv* env) {
4283 return JavaClass::getJClass(env, "org/rocksdb/InfoLogLevel");
4284 }
4285
4286 /**
4287 * Get an enum field of org.rocksdb.InfoLogLevel
4288 *
4289 * @param env A pointer to the Java environment
4290 * @param name The name of the enum field
4291 *
4292 * @return A reference to the enum field value or a nullptr if
4293 * the enum field value could not be retrieved
4294 */
4295 static jobject getEnum(JNIEnv* env, const char name[]) {
4296 jclass jclazz = getJClass(env);
4297 if(jclazz == nullptr) {
4298 // exception occurred accessing class
4299 return nullptr;
4300 }
4301
4302 jfieldID jfid =
4303 env->GetStaticFieldID(jclazz, name, "Lorg/rocksdb/InfoLogLevel;");
4304 if(env->ExceptionCheck()) {
4305 // exception occurred while getting field
4306 return nullptr;
4307 } else if(jfid == nullptr) {
4308 return nullptr;
4309 }
4310
4311 jobject jinfo_log_level = env->GetStaticObjectField(jclazz, jfid);
4312 assert(jinfo_log_level != nullptr);
4313 return jinfo_log_level;
4314 }
4315};
4316
4317// The portal class for org.rocksdb.Logger
f67539c2
TL
4318class LoggerJni
4319 : public RocksDBNativeClass<
4320 std::shared_ptr<ROCKSDB_NAMESPACE::LoggerJniCallback>*, LoggerJni> {
11fdf7f2
TL
4321 public:
4322 /**
4323 * Get the Java Class org/rocksdb/Logger
4324 *
4325 * @param env A pointer to the Java environment
4326 *
4327 * @return The Java Class or nullptr if one of the
4328 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
4329 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
4330 */
4331 static jclass getJClass(JNIEnv* env) {
4332 return RocksDBNativeClass::getJClass(env, "org/rocksdb/Logger");
4333 }
4334
4335 /**
4336 * Get the Java Method: Logger#log
4337 *
4338 * @param env A pointer to the Java environment
4339 *
4340 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 4341 * be retrieved
11fdf7f2
TL
4342 */
4343 static jmethodID getLogMethodId(JNIEnv* env) {
4344 jclass jclazz = getJClass(env);
4345 if(jclazz == nullptr) {
4346 // exception occurred accessing class
4347 return nullptr;
4348 }
4349
4350 static jmethodID mid =
4351 env->GetMethodID(jclazz, "log",
4352 "(Lorg/rocksdb/InfoLogLevel;Ljava/lang/String;)V");
4353 assert(mid != nullptr);
4354 return mid;
4355 }
4356};
4357
4358// The portal class for org.rocksdb.TransactionLogIterator.BatchResult
4359class BatchResultJni : public JavaClass {
4360 public:
4361 /**
4362 * Get the Java Class org.rocksdb.TransactionLogIterator.BatchResult
4363 *
4364 * @param env A pointer to the Java environment
4365 *
4366 * @return The Java Class or nullptr if one of the
4367 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
4368 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
4369 */
4370 static jclass getJClass(JNIEnv* env) {
4371 return JavaClass::getJClass(env,
4372 "org/rocksdb/TransactionLogIterator$BatchResult");
4373 }
4374
4375 /**
4376 * Create a new Java org.rocksdb.TransactionLogIterator.BatchResult object
f67539c2
TL
4377 * with the same properties as the provided C++ ROCKSDB_NAMESPACE::BatchResult
4378 * object
11fdf7f2
TL
4379 *
4380 * @param env A pointer to the Java environment
f67539c2 4381 * @param batch_result The ROCKSDB_NAMESPACE::BatchResult object
11fdf7f2
TL
4382 *
4383 * @return A reference to a Java
4384 * org.rocksdb.TransactionLogIterator.BatchResult object,
4385 * or nullptr if an an exception occurs
4386 */
4387 static jobject construct(JNIEnv* env,
f67539c2 4388 ROCKSDB_NAMESPACE::BatchResult& batch_result) {
11fdf7f2
TL
4389 jclass jclazz = getJClass(env);
4390 if(jclazz == nullptr) {
4391 // exception occurred accessing class
4392 return nullptr;
4393 }
4394
4395 jmethodID mid = env->GetMethodID(
4396 jclazz, "<init>", "(JJ)V");
4397 if(mid == nullptr) {
4398 // exception thrown: NoSuchMethodException or OutOfMemoryError
4399 return nullptr;
4400 }
4401
4402 jobject jbatch_result = env->NewObject(jclazz, mid,
4403 batch_result.sequence, batch_result.writeBatchPtr.get());
4404 if(jbatch_result == nullptr) {
4405 // exception thrown: InstantiationException or OutOfMemoryError
4406 return nullptr;
4407 }
4408
4409 batch_result.writeBatchPtr.release();
4410 return jbatch_result;
4411 }
4412};
4413
4414// The portal class for org.rocksdb.BottommostLevelCompaction
4415class BottommostLevelCompactionJni {
4416 public:
f67539c2
TL
4417 // Returns the equivalent org.rocksdb.BottommostLevelCompaction for the
4418 // provided C++ ROCKSDB_NAMESPACE::BottommostLevelCompaction enum
11fdf7f2 4419 static jint toJavaBottommostLevelCompaction(
f67539c2
TL
4420 const ROCKSDB_NAMESPACE::BottommostLevelCompaction&
4421 bottommost_level_compaction) {
11fdf7f2 4422 switch(bottommost_level_compaction) {
f67539c2 4423 case ROCKSDB_NAMESPACE::BottommostLevelCompaction::kSkip:
11fdf7f2 4424 return 0x0;
f67539c2
TL
4425 case ROCKSDB_NAMESPACE::BottommostLevelCompaction::
4426 kIfHaveCompactionFilter:
11fdf7f2 4427 return 0x1;
f67539c2 4428 case ROCKSDB_NAMESPACE::BottommostLevelCompaction::kForce:
11fdf7f2 4429 return 0x2;
f67539c2
TL
4430 case ROCKSDB_NAMESPACE::BottommostLevelCompaction::kForceOptimized:
4431 return 0x3;
11fdf7f2
TL
4432 default:
4433 return 0x7F; // undefined
4434 }
4435 }
4436
f67539c2
TL
4437 // Returns the equivalent C++ ROCKSDB_NAMESPACE::BottommostLevelCompaction
4438 // enum for the provided Java org.rocksdb.BottommostLevelCompaction
4439 static ROCKSDB_NAMESPACE::BottommostLevelCompaction
4440 toCppBottommostLevelCompaction(jint bottommost_level_compaction) {
11fdf7f2
TL
4441 switch(bottommost_level_compaction) {
4442 case 0x0:
f67539c2 4443 return ROCKSDB_NAMESPACE::BottommostLevelCompaction::kSkip;
11fdf7f2 4444 case 0x1:
f67539c2
TL
4445 return ROCKSDB_NAMESPACE::BottommostLevelCompaction::
4446 kIfHaveCompactionFilter;
11fdf7f2 4447 case 0x2:
f67539c2
TL
4448 return ROCKSDB_NAMESPACE::BottommostLevelCompaction::kForce;
4449 case 0x3:
4450 return ROCKSDB_NAMESPACE::BottommostLevelCompaction::kForceOptimized;
11fdf7f2
TL
4451 default:
4452 // undefined/default
f67539c2
TL
4453 return ROCKSDB_NAMESPACE::BottommostLevelCompaction::
4454 kIfHaveCompactionFilter;
11fdf7f2
TL
4455 }
4456 }
4457};
4458
4459// The portal class for org.rocksdb.CompactionStopStyle
4460class CompactionStopStyleJni {
4461 public:
4462 // Returns the equivalent org.rocksdb.CompactionStopStyle for the provided
f67539c2 4463 // C++ ROCKSDB_NAMESPACE::CompactionStopStyle enum
11fdf7f2 4464 static jbyte toJavaCompactionStopStyle(
f67539c2 4465 const ROCKSDB_NAMESPACE::CompactionStopStyle& compaction_stop_style) {
11fdf7f2 4466 switch(compaction_stop_style) {
f67539c2
TL
4467 case ROCKSDB_NAMESPACE::CompactionStopStyle::
4468 kCompactionStopStyleSimilarSize:
11fdf7f2 4469 return 0x0;
f67539c2
TL
4470 case ROCKSDB_NAMESPACE::CompactionStopStyle::
4471 kCompactionStopStyleTotalSize:
11fdf7f2
TL
4472 return 0x1;
4473 default:
4474 return 0x7F; // undefined
4475 }
4476 }
4477
f67539c2
TL
4478 // Returns the equivalent C++ ROCKSDB_NAMESPACE::CompactionStopStyle enum for
4479 // the provided Java org.rocksdb.CompactionStopStyle
4480 static ROCKSDB_NAMESPACE::CompactionStopStyle toCppCompactionStopStyle(
11fdf7f2
TL
4481 jbyte jcompaction_stop_style) {
4482 switch(jcompaction_stop_style) {
4483 case 0x0:
f67539c2
TL
4484 return ROCKSDB_NAMESPACE::CompactionStopStyle::
4485 kCompactionStopStyleSimilarSize;
11fdf7f2 4486 case 0x1:
f67539c2
TL
4487 return ROCKSDB_NAMESPACE::CompactionStopStyle::
4488 kCompactionStopStyleTotalSize;
11fdf7f2
TL
4489 default:
4490 // undefined/default
f67539c2
TL
4491 return ROCKSDB_NAMESPACE::CompactionStopStyle::
4492 kCompactionStopStyleSimilarSize;
11fdf7f2
TL
4493 }
4494 }
4495};
4496
4497// The portal class for org.rocksdb.CompressionType
4498class CompressionTypeJni {
4499 public:
4500 // Returns the equivalent org.rocksdb.CompressionType for the provided
f67539c2 4501 // C++ ROCKSDB_NAMESPACE::CompressionType enum
11fdf7f2 4502 static jbyte toJavaCompressionType(
f67539c2 4503 const ROCKSDB_NAMESPACE::CompressionType& compression_type) {
11fdf7f2 4504 switch(compression_type) {
f67539c2 4505 case ROCKSDB_NAMESPACE::CompressionType::kNoCompression:
11fdf7f2 4506 return 0x0;
f67539c2 4507 case ROCKSDB_NAMESPACE::CompressionType::kSnappyCompression:
11fdf7f2 4508 return 0x1;
f67539c2 4509 case ROCKSDB_NAMESPACE::CompressionType::kZlibCompression:
11fdf7f2 4510 return 0x2;
f67539c2 4511 case ROCKSDB_NAMESPACE::CompressionType::kBZip2Compression:
11fdf7f2 4512 return 0x3;
f67539c2 4513 case ROCKSDB_NAMESPACE::CompressionType::kLZ4Compression:
11fdf7f2 4514 return 0x4;
f67539c2 4515 case ROCKSDB_NAMESPACE::CompressionType::kLZ4HCCompression:
11fdf7f2 4516 return 0x5;
f67539c2 4517 case ROCKSDB_NAMESPACE::CompressionType::kXpressCompression:
11fdf7f2 4518 return 0x6;
f67539c2 4519 case ROCKSDB_NAMESPACE::CompressionType::kZSTD:
11fdf7f2 4520 return 0x7;
f67539c2 4521 case ROCKSDB_NAMESPACE::CompressionType::kDisableCompressionOption:
11fdf7f2
TL
4522 default:
4523 return 0x7F;
4524 }
4525 }
4526
f67539c2 4527 // Returns the equivalent C++ ROCKSDB_NAMESPACE::CompressionType enum for the
11fdf7f2 4528 // provided Java org.rocksdb.CompressionType
f67539c2 4529 static ROCKSDB_NAMESPACE::CompressionType toCppCompressionType(
11fdf7f2
TL
4530 jbyte jcompression_type) {
4531 switch(jcompression_type) {
4532 case 0x0:
f67539c2 4533 return ROCKSDB_NAMESPACE::CompressionType::kNoCompression;
11fdf7f2 4534 case 0x1:
f67539c2 4535 return ROCKSDB_NAMESPACE::CompressionType::kSnappyCompression;
11fdf7f2 4536 case 0x2:
f67539c2 4537 return ROCKSDB_NAMESPACE::CompressionType::kZlibCompression;
11fdf7f2 4538 case 0x3:
f67539c2 4539 return ROCKSDB_NAMESPACE::CompressionType::kBZip2Compression;
11fdf7f2 4540 case 0x4:
f67539c2 4541 return ROCKSDB_NAMESPACE::CompressionType::kLZ4Compression;
11fdf7f2 4542 case 0x5:
f67539c2 4543 return ROCKSDB_NAMESPACE::CompressionType::kLZ4HCCompression;
11fdf7f2 4544 case 0x6:
f67539c2 4545 return ROCKSDB_NAMESPACE::CompressionType::kXpressCompression;
11fdf7f2 4546 case 0x7:
f67539c2 4547 return ROCKSDB_NAMESPACE::CompressionType::kZSTD;
11fdf7f2
TL
4548 case 0x7F:
4549 default:
f67539c2 4550 return ROCKSDB_NAMESPACE::CompressionType::kDisableCompressionOption;
11fdf7f2
TL
4551 }
4552 }
4553};
4554
4555// The portal class for org.rocksdb.CompactionPriority
4556class CompactionPriorityJni {
4557 public:
4558 // Returns the equivalent org.rocksdb.CompactionPriority for the provided
f67539c2 4559 // C++ ROCKSDB_NAMESPACE::CompactionPri enum
11fdf7f2 4560 static jbyte toJavaCompactionPriority(
f67539c2 4561 const ROCKSDB_NAMESPACE::CompactionPri& compaction_priority) {
11fdf7f2 4562 switch(compaction_priority) {
f67539c2 4563 case ROCKSDB_NAMESPACE::CompactionPri::kByCompensatedSize:
11fdf7f2 4564 return 0x0;
f67539c2 4565 case ROCKSDB_NAMESPACE::CompactionPri::kOldestLargestSeqFirst:
11fdf7f2 4566 return 0x1;
f67539c2 4567 case ROCKSDB_NAMESPACE::CompactionPri::kOldestSmallestSeqFirst:
11fdf7f2 4568 return 0x2;
f67539c2 4569 case ROCKSDB_NAMESPACE::CompactionPri::kMinOverlappingRatio:
11fdf7f2
TL
4570 return 0x3;
4571 default:
4572 return 0x0; // undefined
4573 }
4574 }
4575
f67539c2 4576 // Returns the equivalent C++ ROCKSDB_NAMESPACE::CompactionPri enum for the
11fdf7f2 4577 // provided Java org.rocksdb.CompactionPriority
f67539c2 4578 static ROCKSDB_NAMESPACE::CompactionPri toCppCompactionPriority(
11fdf7f2
TL
4579 jbyte jcompaction_priority) {
4580 switch(jcompaction_priority) {
4581 case 0x0:
f67539c2 4582 return ROCKSDB_NAMESPACE::CompactionPri::kByCompensatedSize;
11fdf7f2 4583 case 0x1:
f67539c2 4584 return ROCKSDB_NAMESPACE::CompactionPri::kOldestLargestSeqFirst;
11fdf7f2 4585 case 0x2:
f67539c2 4586 return ROCKSDB_NAMESPACE::CompactionPri::kOldestSmallestSeqFirst;
11fdf7f2 4587 case 0x3:
f67539c2 4588 return ROCKSDB_NAMESPACE::CompactionPri::kMinOverlappingRatio;
11fdf7f2
TL
4589 default:
4590 // undefined/default
f67539c2 4591 return ROCKSDB_NAMESPACE::CompactionPri::kByCompensatedSize;
11fdf7f2
TL
4592 }
4593 }
4594};
4595
4596// The portal class for org.rocksdb.AccessHint
4597class AccessHintJni {
4598 public:
4599 // Returns the equivalent org.rocksdb.AccessHint for the provided
f67539c2 4600 // C++ ROCKSDB_NAMESPACE::DBOptions::AccessHint enum
11fdf7f2 4601 static jbyte toJavaAccessHint(
f67539c2 4602 const ROCKSDB_NAMESPACE::DBOptions::AccessHint& access_hint) {
11fdf7f2 4603 switch(access_hint) {
f67539c2 4604 case ROCKSDB_NAMESPACE::DBOptions::AccessHint::NONE:
11fdf7f2 4605 return 0x0;
f67539c2 4606 case ROCKSDB_NAMESPACE::DBOptions::AccessHint::NORMAL:
11fdf7f2 4607 return 0x1;
f67539c2 4608 case ROCKSDB_NAMESPACE::DBOptions::AccessHint::SEQUENTIAL:
11fdf7f2 4609 return 0x2;
f67539c2 4610 case ROCKSDB_NAMESPACE::DBOptions::AccessHint::WILLNEED:
11fdf7f2
TL
4611 return 0x3;
4612 default:
4613 // undefined/default
4614 return 0x1;
4615 }
4616 }
4617
f67539c2
TL
4618 // Returns the equivalent C++ ROCKSDB_NAMESPACE::DBOptions::AccessHint enum
4619 // for the provided Java org.rocksdb.AccessHint
4620 static ROCKSDB_NAMESPACE::DBOptions::AccessHint toCppAccessHint(
4621 jbyte jaccess_hint) {
11fdf7f2
TL
4622 switch(jaccess_hint) {
4623 case 0x0:
f67539c2 4624 return ROCKSDB_NAMESPACE::DBOptions::AccessHint::NONE;
11fdf7f2 4625 case 0x1:
f67539c2 4626 return ROCKSDB_NAMESPACE::DBOptions::AccessHint::NORMAL;
11fdf7f2 4627 case 0x2:
f67539c2 4628 return ROCKSDB_NAMESPACE::DBOptions::AccessHint::SEQUENTIAL;
11fdf7f2 4629 case 0x3:
f67539c2 4630 return ROCKSDB_NAMESPACE::DBOptions::AccessHint::WILLNEED;
11fdf7f2
TL
4631 default:
4632 // undefined/default
f67539c2 4633 return ROCKSDB_NAMESPACE::DBOptions::AccessHint::NORMAL;
11fdf7f2
TL
4634 }
4635 }
4636};
4637
4638// The portal class for org.rocksdb.WALRecoveryMode
4639class WALRecoveryModeJni {
4640 public:
4641 // Returns the equivalent org.rocksdb.WALRecoveryMode for the provided
f67539c2 4642 // C++ ROCKSDB_NAMESPACE::WALRecoveryMode enum
11fdf7f2 4643 static jbyte toJavaWALRecoveryMode(
f67539c2 4644 const ROCKSDB_NAMESPACE::WALRecoveryMode& wal_recovery_mode) {
11fdf7f2 4645 switch(wal_recovery_mode) {
f67539c2 4646 case ROCKSDB_NAMESPACE::WALRecoveryMode::kTolerateCorruptedTailRecords:
11fdf7f2 4647 return 0x0;
f67539c2 4648 case ROCKSDB_NAMESPACE::WALRecoveryMode::kAbsoluteConsistency:
11fdf7f2 4649 return 0x1;
f67539c2 4650 case ROCKSDB_NAMESPACE::WALRecoveryMode::kPointInTimeRecovery:
11fdf7f2 4651 return 0x2;
f67539c2 4652 case ROCKSDB_NAMESPACE::WALRecoveryMode::kSkipAnyCorruptedRecords:
11fdf7f2
TL
4653 return 0x3;
4654 default:
4655 // undefined/default
4656 return 0x2;
4657 }
4658 }
4659
f67539c2 4660 // Returns the equivalent C++ ROCKSDB_NAMESPACE::WALRecoveryMode enum for the
11fdf7f2 4661 // provided Java org.rocksdb.WALRecoveryMode
f67539c2
TL
4662 static ROCKSDB_NAMESPACE::WALRecoveryMode toCppWALRecoveryMode(
4663 jbyte jwal_recovery_mode) {
11fdf7f2
TL
4664 switch(jwal_recovery_mode) {
4665 case 0x0:
f67539c2
TL
4666 return ROCKSDB_NAMESPACE::WALRecoveryMode::
4667 kTolerateCorruptedTailRecords;
11fdf7f2 4668 case 0x1:
f67539c2 4669 return ROCKSDB_NAMESPACE::WALRecoveryMode::kAbsoluteConsistency;
11fdf7f2 4670 case 0x2:
f67539c2 4671 return ROCKSDB_NAMESPACE::WALRecoveryMode::kPointInTimeRecovery;
11fdf7f2 4672 case 0x3:
f67539c2 4673 return ROCKSDB_NAMESPACE::WALRecoveryMode::kSkipAnyCorruptedRecords;
11fdf7f2
TL
4674 default:
4675 // undefined/default
f67539c2 4676 return ROCKSDB_NAMESPACE::WALRecoveryMode::kPointInTimeRecovery;
11fdf7f2
TL
4677 }
4678 }
4679};
4680
4681// The portal class for org.rocksdb.TickerType
4682class TickerTypeJni {
4683 public:
4684 // Returns the equivalent org.rocksdb.TickerType for the provided
f67539c2
TL
4685 // C++ ROCKSDB_NAMESPACE::Tickers enum
4686 static jbyte toJavaTickerType(const ROCKSDB_NAMESPACE::Tickers& tickers) {
11fdf7f2 4687 switch(tickers) {
f67539c2 4688 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_MISS:
11fdf7f2 4689 return 0x0;
f67539c2 4690 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_HIT:
11fdf7f2 4691 return 0x1;
f67539c2 4692 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_ADD:
11fdf7f2 4693 return 0x2;
f67539c2 4694 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_ADD_FAILURES:
11fdf7f2 4695 return 0x3;
f67539c2 4696 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_INDEX_MISS:
11fdf7f2 4697 return 0x4;
f67539c2 4698 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_INDEX_HIT:
11fdf7f2 4699 return 0x5;
f67539c2 4700 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_INDEX_ADD:
11fdf7f2 4701 return 0x6;
f67539c2 4702 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_INDEX_BYTES_INSERT:
11fdf7f2 4703 return 0x7;
f67539c2 4704 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_INDEX_BYTES_EVICT:
11fdf7f2 4705 return 0x8;
f67539c2 4706 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_FILTER_MISS:
11fdf7f2 4707 return 0x9;
f67539c2 4708 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_FILTER_HIT:
11fdf7f2 4709 return 0xA;
f67539c2 4710 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_FILTER_ADD:
11fdf7f2 4711 return 0xB;
f67539c2 4712 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_FILTER_BYTES_INSERT:
11fdf7f2 4713 return 0xC;
f67539c2 4714 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_FILTER_BYTES_EVICT:
11fdf7f2 4715 return 0xD;
f67539c2 4716 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_DATA_MISS:
11fdf7f2 4717 return 0xE;
f67539c2 4718 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_DATA_HIT:
11fdf7f2 4719 return 0xF;
f67539c2 4720 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_DATA_ADD:
11fdf7f2 4721 return 0x10;
f67539c2 4722 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_DATA_BYTES_INSERT:
11fdf7f2 4723 return 0x11;
f67539c2 4724 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_BYTES_READ:
11fdf7f2 4725 return 0x12;
f67539c2 4726 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_BYTES_WRITE:
11fdf7f2 4727 return 0x13;
f67539c2 4728 case ROCKSDB_NAMESPACE::Tickers::BLOOM_FILTER_USEFUL:
11fdf7f2 4729 return 0x14;
f67539c2 4730 case ROCKSDB_NAMESPACE::Tickers::PERSISTENT_CACHE_HIT:
11fdf7f2 4731 return 0x15;
f67539c2 4732 case ROCKSDB_NAMESPACE::Tickers::PERSISTENT_CACHE_MISS:
11fdf7f2 4733 return 0x16;
f67539c2 4734 case ROCKSDB_NAMESPACE::Tickers::SIM_BLOCK_CACHE_HIT:
11fdf7f2 4735 return 0x17;
f67539c2 4736 case ROCKSDB_NAMESPACE::Tickers::SIM_BLOCK_CACHE_MISS:
11fdf7f2 4737 return 0x18;
f67539c2 4738 case ROCKSDB_NAMESPACE::Tickers::MEMTABLE_HIT:
11fdf7f2 4739 return 0x19;
f67539c2 4740 case ROCKSDB_NAMESPACE::Tickers::MEMTABLE_MISS:
11fdf7f2 4741 return 0x1A;
f67539c2 4742 case ROCKSDB_NAMESPACE::Tickers::GET_HIT_L0:
11fdf7f2 4743 return 0x1B;
f67539c2 4744 case ROCKSDB_NAMESPACE::Tickers::GET_HIT_L1:
11fdf7f2 4745 return 0x1C;
f67539c2 4746 case ROCKSDB_NAMESPACE::Tickers::GET_HIT_L2_AND_UP:
11fdf7f2 4747 return 0x1D;
f67539c2 4748 case ROCKSDB_NAMESPACE::Tickers::COMPACTION_KEY_DROP_NEWER_ENTRY:
11fdf7f2 4749 return 0x1E;
f67539c2 4750 case ROCKSDB_NAMESPACE::Tickers::COMPACTION_KEY_DROP_OBSOLETE:
11fdf7f2 4751 return 0x1F;
f67539c2 4752 case ROCKSDB_NAMESPACE::Tickers::COMPACTION_KEY_DROP_RANGE_DEL:
11fdf7f2 4753 return 0x20;
f67539c2 4754 case ROCKSDB_NAMESPACE::Tickers::COMPACTION_KEY_DROP_USER:
11fdf7f2 4755 return 0x21;
f67539c2 4756 case ROCKSDB_NAMESPACE::Tickers::COMPACTION_RANGE_DEL_DROP_OBSOLETE:
11fdf7f2 4757 return 0x22;
f67539c2 4758 case ROCKSDB_NAMESPACE::Tickers::NUMBER_KEYS_WRITTEN:
11fdf7f2 4759 return 0x23;
f67539c2 4760 case ROCKSDB_NAMESPACE::Tickers::NUMBER_KEYS_READ:
11fdf7f2 4761 return 0x24;
f67539c2 4762 case ROCKSDB_NAMESPACE::Tickers::NUMBER_KEYS_UPDATED:
11fdf7f2 4763 return 0x25;
f67539c2 4764 case ROCKSDB_NAMESPACE::Tickers::BYTES_WRITTEN:
11fdf7f2 4765 return 0x26;
f67539c2 4766 case ROCKSDB_NAMESPACE::Tickers::BYTES_READ:
11fdf7f2 4767 return 0x27;
f67539c2 4768 case ROCKSDB_NAMESPACE::Tickers::NUMBER_DB_SEEK:
11fdf7f2 4769 return 0x28;
f67539c2 4770 case ROCKSDB_NAMESPACE::Tickers::NUMBER_DB_NEXT:
11fdf7f2 4771 return 0x29;
f67539c2 4772 case ROCKSDB_NAMESPACE::Tickers::NUMBER_DB_PREV:
11fdf7f2 4773 return 0x2A;
f67539c2 4774 case ROCKSDB_NAMESPACE::Tickers::NUMBER_DB_SEEK_FOUND:
11fdf7f2 4775 return 0x2B;
f67539c2 4776 case ROCKSDB_NAMESPACE::Tickers::NUMBER_DB_NEXT_FOUND:
11fdf7f2 4777 return 0x2C;
f67539c2 4778 case ROCKSDB_NAMESPACE::Tickers::NUMBER_DB_PREV_FOUND:
11fdf7f2 4779 return 0x2D;
f67539c2 4780 case ROCKSDB_NAMESPACE::Tickers::ITER_BYTES_READ:
11fdf7f2 4781 return 0x2E;
f67539c2 4782 case ROCKSDB_NAMESPACE::Tickers::NO_FILE_CLOSES:
11fdf7f2 4783 return 0x2F;
f67539c2 4784 case ROCKSDB_NAMESPACE::Tickers::NO_FILE_OPENS:
11fdf7f2 4785 return 0x30;
f67539c2 4786 case ROCKSDB_NAMESPACE::Tickers::NO_FILE_ERRORS:
11fdf7f2 4787 return 0x31;
f67539c2 4788 case ROCKSDB_NAMESPACE::Tickers::STALL_L0_SLOWDOWN_MICROS:
11fdf7f2 4789 return 0x32;
f67539c2 4790 case ROCKSDB_NAMESPACE::Tickers::STALL_MEMTABLE_COMPACTION_MICROS:
11fdf7f2 4791 return 0x33;
f67539c2 4792 case ROCKSDB_NAMESPACE::Tickers::STALL_L0_NUM_FILES_MICROS:
11fdf7f2 4793 return 0x34;
f67539c2 4794 case ROCKSDB_NAMESPACE::Tickers::STALL_MICROS:
11fdf7f2 4795 return 0x35;
f67539c2 4796 case ROCKSDB_NAMESPACE::Tickers::DB_MUTEX_WAIT_MICROS:
11fdf7f2 4797 return 0x36;
f67539c2 4798 case ROCKSDB_NAMESPACE::Tickers::RATE_LIMIT_DELAY_MILLIS:
11fdf7f2 4799 return 0x37;
f67539c2 4800 case ROCKSDB_NAMESPACE::Tickers::NO_ITERATORS:
11fdf7f2 4801 return 0x38;
f67539c2 4802 case ROCKSDB_NAMESPACE::Tickers::NUMBER_MULTIGET_CALLS:
11fdf7f2 4803 return 0x39;
f67539c2 4804 case ROCKSDB_NAMESPACE::Tickers::NUMBER_MULTIGET_KEYS_READ:
11fdf7f2 4805 return 0x3A;
f67539c2 4806 case ROCKSDB_NAMESPACE::Tickers::NUMBER_MULTIGET_BYTES_READ:
11fdf7f2 4807 return 0x3B;
f67539c2 4808 case ROCKSDB_NAMESPACE::Tickers::NUMBER_FILTERED_DELETES:
11fdf7f2 4809 return 0x3C;
f67539c2 4810 case ROCKSDB_NAMESPACE::Tickers::NUMBER_MERGE_FAILURES:
11fdf7f2 4811 return 0x3D;
f67539c2 4812 case ROCKSDB_NAMESPACE::Tickers::BLOOM_FILTER_PREFIX_CHECKED:
11fdf7f2 4813 return 0x3E;
f67539c2 4814 case ROCKSDB_NAMESPACE::Tickers::BLOOM_FILTER_PREFIX_USEFUL:
11fdf7f2 4815 return 0x3F;
f67539c2 4816 case ROCKSDB_NAMESPACE::Tickers::NUMBER_OF_RESEEKS_IN_ITERATION:
11fdf7f2 4817 return 0x40;
f67539c2 4818 case ROCKSDB_NAMESPACE::Tickers::GET_UPDATES_SINCE_CALLS:
11fdf7f2 4819 return 0x41;
f67539c2 4820 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_COMPRESSED_MISS:
11fdf7f2 4821 return 0x42;
f67539c2 4822 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_COMPRESSED_HIT:
11fdf7f2 4823 return 0x43;
f67539c2 4824 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_COMPRESSED_ADD:
11fdf7f2 4825 return 0x44;
f67539c2 4826 case ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_COMPRESSED_ADD_FAILURES:
11fdf7f2 4827 return 0x45;
f67539c2 4828 case ROCKSDB_NAMESPACE::Tickers::WAL_FILE_SYNCED:
11fdf7f2 4829 return 0x46;
f67539c2 4830 case ROCKSDB_NAMESPACE::Tickers::WAL_FILE_BYTES:
11fdf7f2 4831 return 0x47;
f67539c2 4832 case ROCKSDB_NAMESPACE::Tickers::WRITE_DONE_BY_SELF:
11fdf7f2 4833 return 0x48;
f67539c2 4834 case ROCKSDB_NAMESPACE::Tickers::WRITE_DONE_BY_OTHER:
11fdf7f2 4835 return 0x49;
f67539c2 4836 case ROCKSDB_NAMESPACE::Tickers::WRITE_TIMEDOUT:
11fdf7f2 4837 return 0x4A;
f67539c2 4838 case ROCKSDB_NAMESPACE::Tickers::WRITE_WITH_WAL:
11fdf7f2 4839 return 0x4B;
f67539c2 4840 case ROCKSDB_NAMESPACE::Tickers::COMPACT_READ_BYTES:
11fdf7f2 4841 return 0x4C;
f67539c2 4842 case ROCKSDB_NAMESPACE::Tickers::COMPACT_WRITE_BYTES:
11fdf7f2 4843 return 0x4D;
f67539c2 4844 case ROCKSDB_NAMESPACE::Tickers::FLUSH_WRITE_BYTES:
11fdf7f2 4845 return 0x4E;
f67539c2 4846 case ROCKSDB_NAMESPACE::Tickers::NUMBER_DIRECT_LOAD_TABLE_PROPERTIES:
11fdf7f2 4847 return 0x4F;
f67539c2 4848 case ROCKSDB_NAMESPACE::Tickers::NUMBER_SUPERVERSION_ACQUIRES:
11fdf7f2 4849 return 0x50;
f67539c2 4850 case ROCKSDB_NAMESPACE::Tickers::NUMBER_SUPERVERSION_RELEASES:
11fdf7f2 4851 return 0x51;
f67539c2 4852 case ROCKSDB_NAMESPACE::Tickers::NUMBER_SUPERVERSION_CLEANUPS:
11fdf7f2 4853 return 0x52;
f67539c2 4854 case ROCKSDB_NAMESPACE::Tickers::NUMBER_BLOCK_COMPRESSED:
11fdf7f2 4855 return 0x53;
f67539c2 4856 case ROCKSDB_NAMESPACE::Tickers::NUMBER_BLOCK_DECOMPRESSED:
11fdf7f2 4857 return 0x54;
f67539c2 4858 case ROCKSDB_NAMESPACE::Tickers::NUMBER_BLOCK_NOT_COMPRESSED:
11fdf7f2 4859 return 0x55;
f67539c2 4860 case ROCKSDB_NAMESPACE::Tickers::MERGE_OPERATION_TOTAL_TIME:
11fdf7f2 4861 return 0x56;
f67539c2 4862 case ROCKSDB_NAMESPACE::Tickers::FILTER_OPERATION_TOTAL_TIME:
11fdf7f2 4863 return 0x57;
f67539c2 4864 case ROCKSDB_NAMESPACE::Tickers::ROW_CACHE_HIT:
11fdf7f2 4865 return 0x58;
f67539c2 4866 case ROCKSDB_NAMESPACE::Tickers::ROW_CACHE_MISS:
11fdf7f2 4867 return 0x59;
f67539c2 4868 case ROCKSDB_NAMESPACE::Tickers::READ_AMP_ESTIMATE_USEFUL_BYTES:
11fdf7f2 4869 return 0x5A;
f67539c2 4870 case ROCKSDB_NAMESPACE::Tickers::READ_AMP_TOTAL_READ_BYTES:
11fdf7f2 4871 return 0x5B;
f67539c2 4872 case ROCKSDB_NAMESPACE::Tickers::NUMBER_RATE_LIMITER_DRAINS:
11fdf7f2 4873 return 0x5C;
f67539c2 4874 case ROCKSDB_NAMESPACE::Tickers::NUMBER_ITER_SKIP:
11fdf7f2 4875 return 0x5D;
f67539c2 4876 case ROCKSDB_NAMESPACE::Tickers::NUMBER_MULTIGET_KEYS_FOUND:
11fdf7f2 4877 return 0x5E;
f67539c2 4878 case ROCKSDB_NAMESPACE::Tickers::NO_ITERATOR_CREATED:
494da23a
TL
4879 // -0x01 to fixate the new value that incorrectly changed TICKER_ENUM_MAX.
4880 return -0x01;
f67539c2 4881 case ROCKSDB_NAMESPACE::Tickers::NO_ITERATOR_DELETED:
494da23a 4882 return 0x60;
f67539c2 4883 case ROCKSDB_NAMESPACE::Tickers::COMPACTION_OPTIMIZED_DEL_DROP_OBSOLETE:
494da23a 4884 return 0x61;
f67539c2 4885 case ROCKSDB_NAMESPACE::Tickers::COMPACTION_CANCELLED:
494da23a 4886 return 0x62;
f67539c2 4887 case ROCKSDB_NAMESPACE::Tickers::BLOOM_FILTER_FULL_POSITIVE:
494da23a 4888 return 0x63;
f67539c2 4889 case ROCKSDB_NAMESPACE::Tickers::BLOOM_FILTER_FULL_TRUE_POSITIVE:
494da23a 4890 return 0x64;
f67539c2 4891 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_NUM_PUT:
494da23a 4892 return 0x65;
f67539c2 4893 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_NUM_WRITE:
494da23a 4894 return 0x66;
f67539c2 4895 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_NUM_GET:
494da23a 4896 return 0x67;
f67539c2 4897 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_NUM_MULTIGET:
494da23a 4898 return 0x68;
f67539c2 4899 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_NUM_SEEK:
494da23a 4900 return 0x69;
f67539c2 4901 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_NUM_NEXT:
494da23a 4902 return 0x6A;
f67539c2 4903 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_NUM_PREV:
494da23a 4904 return 0x6B;
f67539c2 4905 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_NUM_KEYS_WRITTEN:
494da23a 4906 return 0x6C;
f67539c2 4907 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_NUM_KEYS_READ:
494da23a 4908 return 0x6D;
f67539c2 4909 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_BYTES_WRITTEN:
494da23a 4910 return 0x6E;
f67539c2 4911 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_BYTES_READ:
494da23a 4912 return 0x6F;
f67539c2 4913 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_WRITE_INLINED:
494da23a 4914 return 0x70;
f67539c2 4915 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_WRITE_INLINED_TTL:
494da23a 4916 return 0x71;
f67539c2 4917 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_WRITE_BLOB:
494da23a 4918 return 0x72;
f67539c2 4919 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_WRITE_BLOB_TTL:
494da23a 4920 return 0x73;
f67539c2 4921 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_BLOB_FILE_BYTES_WRITTEN:
494da23a 4922 return 0x74;
f67539c2 4923 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_BLOB_FILE_BYTES_READ:
494da23a 4924 return 0x75;
f67539c2 4925 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_BLOB_FILE_SYNCED:
494da23a 4926 return 0x76;
f67539c2 4927 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_BLOB_INDEX_EXPIRED_COUNT:
494da23a 4928 return 0x77;
f67539c2 4929 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_BLOB_INDEX_EXPIRED_SIZE:
494da23a 4930 return 0x78;
f67539c2 4931 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_BLOB_INDEX_EVICTED_COUNT:
494da23a 4932 return 0x79;
f67539c2 4933 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_BLOB_INDEX_EVICTED_SIZE:
494da23a 4934 return 0x7A;
f67539c2 4935 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_GC_NUM_FILES:
494da23a 4936 return 0x7B;
f67539c2 4937 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_GC_NUM_NEW_FILES:
494da23a 4938 return 0x7C;
f67539c2 4939 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_GC_FAILURES:
494da23a 4940 return 0x7D;
f67539c2 4941 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_GC_NUM_KEYS_OVERWRITTEN:
494da23a 4942 return 0x7E;
f67539c2 4943 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_GC_NUM_KEYS_EXPIRED:
494da23a 4944 return 0x7F;
f67539c2 4945 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_GC_NUM_KEYS_RELOCATED:
494da23a 4946 return -0x02;
f67539c2 4947 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_GC_BYTES_OVERWRITTEN:
494da23a 4948 return -0x03;
f67539c2 4949 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_GC_BYTES_EXPIRED:
494da23a 4950 return -0x04;
f67539c2 4951 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_GC_BYTES_RELOCATED:
494da23a 4952 return -0x05;
f67539c2 4953 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_FIFO_NUM_FILES_EVICTED:
494da23a 4954 return -0x06;
f67539c2 4955 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_FIFO_NUM_KEYS_EVICTED:
494da23a 4956 return -0x07;
f67539c2 4957 case ROCKSDB_NAMESPACE::Tickers::BLOB_DB_FIFO_BYTES_EVICTED:
494da23a 4958 return -0x08;
f67539c2 4959 case ROCKSDB_NAMESPACE::Tickers::TXN_PREPARE_MUTEX_OVERHEAD:
494da23a 4960 return -0x09;
f67539c2 4961 case ROCKSDB_NAMESPACE::Tickers::TXN_OLD_COMMIT_MAP_MUTEX_OVERHEAD:
494da23a 4962 return -0x0A;
f67539c2 4963 case ROCKSDB_NAMESPACE::Tickers::TXN_DUPLICATE_KEY_OVERHEAD:
494da23a 4964 return -0x0B;
f67539c2 4965 case ROCKSDB_NAMESPACE::Tickers::TXN_SNAPSHOT_MUTEX_OVERHEAD:
494da23a 4966 return -0x0C;
f67539c2
TL
4967 case ROCKSDB_NAMESPACE::Tickers::TXN_GET_TRY_AGAIN:
4968 return -0x0D;
20effc67
TL
4969 case ROCKSDB_NAMESPACE::Tickers::FILES_MARKED_TRASH:
4970 return -0x0E;
4971 case ROCKSDB_NAMESPACE::Tickers::FILES_DELETED_IMMEDIATELY:
4972 return -0X0F;
4973 case ROCKSDB_NAMESPACE::Tickers::COMPACT_READ_BYTES_MARKED:
4974 return -0x10;
4975 case ROCKSDB_NAMESPACE::Tickers::COMPACT_READ_BYTES_PERIODIC:
4976 return -0x11;
4977 case ROCKSDB_NAMESPACE::Tickers::COMPACT_READ_BYTES_TTL:
4978 return -0x12;
4979 case ROCKSDB_NAMESPACE::Tickers::COMPACT_WRITE_BYTES_MARKED:
4980 return -0x13;
4981 case ROCKSDB_NAMESPACE::Tickers::COMPACT_WRITE_BYTES_PERIODIC:
4982 return -0x14;
4983 case ROCKSDB_NAMESPACE::Tickers::COMPACT_WRITE_BYTES_TTL:
4984 return -0x15;
4985
f67539c2 4986 case ROCKSDB_NAMESPACE::Tickers::TICKER_ENUM_MAX:
494da23a 4987 // 0x5F for backwards compatibility on current minor version.
11fdf7f2 4988 return 0x5F;
11fdf7f2
TL
4989 default:
4990 // undefined/default
4991 return 0x0;
4992 }
4993 }
4994
f67539c2 4995 // Returns the equivalent C++ ROCKSDB_NAMESPACE::Tickers enum for the
11fdf7f2 4996 // provided Java org.rocksdb.TickerType
f67539c2 4997 static ROCKSDB_NAMESPACE::Tickers toCppTickers(jbyte jticker_type) {
11fdf7f2
TL
4998 switch(jticker_type) {
4999 case 0x0:
f67539c2 5000 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_MISS;
11fdf7f2 5001 case 0x1:
f67539c2 5002 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_HIT;
11fdf7f2 5003 case 0x2:
f67539c2 5004 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_ADD;
11fdf7f2 5005 case 0x3:
f67539c2 5006 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_ADD_FAILURES;
11fdf7f2 5007 case 0x4:
f67539c2 5008 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_INDEX_MISS;
11fdf7f2 5009 case 0x5:
f67539c2 5010 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_INDEX_HIT;
11fdf7f2 5011 case 0x6:
f67539c2 5012 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_INDEX_ADD;
11fdf7f2 5013 case 0x7:
f67539c2 5014 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_INDEX_BYTES_INSERT;
11fdf7f2 5015 case 0x8:
f67539c2 5016 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_INDEX_BYTES_EVICT;
11fdf7f2 5017 case 0x9:
f67539c2 5018 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_FILTER_MISS;
11fdf7f2 5019 case 0xA:
f67539c2 5020 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_FILTER_HIT;
11fdf7f2 5021 case 0xB:
f67539c2 5022 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_FILTER_ADD;
11fdf7f2 5023 case 0xC:
f67539c2 5024 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_FILTER_BYTES_INSERT;
11fdf7f2 5025 case 0xD:
f67539c2 5026 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_FILTER_BYTES_EVICT;
11fdf7f2 5027 case 0xE:
f67539c2 5028 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_DATA_MISS;
11fdf7f2 5029 case 0xF:
f67539c2 5030 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_DATA_HIT;
11fdf7f2 5031 case 0x10:
f67539c2 5032 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_DATA_ADD;
11fdf7f2 5033 case 0x11:
f67539c2 5034 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_DATA_BYTES_INSERT;
11fdf7f2 5035 case 0x12:
f67539c2 5036 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_BYTES_READ;
11fdf7f2 5037 case 0x13:
f67539c2 5038 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_BYTES_WRITE;
11fdf7f2 5039 case 0x14:
f67539c2 5040 return ROCKSDB_NAMESPACE::Tickers::BLOOM_FILTER_USEFUL;
11fdf7f2 5041 case 0x15:
f67539c2 5042 return ROCKSDB_NAMESPACE::Tickers::PERSISTENT_CACHE_HIT;
11fdf7f2 5043 case 0x16:
f67539c2 5044 return ROCKSDB_NAMESPACE::Tickers::PERSISTENT_CACHE_MISS;
11fdf7f2 5045 case 0x17:
f67539c2 5046 return ROCKSDB_NAMESPACE::Tickers::SIM_BLOCK_CACHE_HIT;
11fdf7f2 5047 case 0x18:
f67539c2 5048 return ROCKSDB_NAMESPACE::Tickers::SIM_BLOCK_CACHE_MISS;
11fdf7f2 5049 case 0x19:
f67539c2 5050 return ROCKSDB_NAMESPACE::Tickers::MEMTABLE_HIT;
11fdf7f2 5051 case 0x1A:
f67539c2 5052 return ROCKSDB_NAMESPACE::Tickers::MEMTABLE_MISS;
11fdf7f2 5053 case 0x1B:
f67539c2 5054 return ROCKSDB_NAMESPACE::Tickers::GET_HIT_L0;
11fdf7f2 5055 case 0x1C:
f67539c2 5056 return ROCKSDB_NAMESPACE::Tickers::GET_HIT_L1;
11fdf7f2 5057 case 0x1D:
f67539c2 5058 return ROCKSDB_NAMESPACE::Tickers::GET_HIT_L2_AND_UP;
11fdf7f2 5059 case 0x1E:
f67539c2 5060 return ROCKSDB_NAMESPACE::Tickers::COMPACTION_KEY_DROP_NEWER_ENTRY;
11fdf7f2 5061 case 0x1F:
f67539c2 5062 return ROCKSDB_NAMESPACE::Tickers::COMPACTION_KEY_DROP_OBSOLETE;
11fdf7f2 5063 case 0x20:
f67539c2 5064 return ROCKSDB_NAMESPACE::Tickers::COMPACTION_KEY_DROP_RANGE_DEL;
11fdf7f2 5065 case 0x21:
f67539c2 5066 return ROCKSDB_NAMESPACE::Tickers::COMPACTION_KEY_DROP_USER;
11fdf7f2 5067 case 0x22:
f67539c2 5068 return ROCKSDB_NAMESPACE::Tickers::COMPACTION_RANGE_DEL_DROP_OBSOLETE;
11fdf7f2 5069 case 0x23:
f67539c2 5070 return ROCKSDB_NAMESPACE::Tickers::NUMBER_KEYS_WRITTEN;
11fdf7f2 5071 case 0x24:
f67539c2 5072 return ROCKSDB_NAMESPACE::Tickers::NUMBER_KEYS_READ;
11fdf7f2 5073 case 0x25:
f67539c2 5074 return ROCKSDB_NAMESPACE::Tickers::NUMBER_KEYS_UPDATED;
11fdf7f2 5075 case 0x26:
f67539c2 5076 return ROCKSDB_NAMESPACE::Tickers::BYTES_WRITTEN;
11fdf7f2 5077 case 0x27:
f67539c2 5078 return ROCKSDB_NAMESPACE::Tickers::BYTES_READ;
11fdf7f2 5079 case 0x28:
f67539c2 5080 return ROCKSDB_NAMESPACE::Tickers::NUMBER_DB_SEEK;
11fdf7f2 5081 case 0x29:
f67539c2 5082 return ROCKSDB_NAMESPACE::Tickers::NUMBER_DB_NEXT;
11fdf7f2 5083 case 0x2A:
f67539c2 5084 return ROCKSDB_NAMESPACE::Tickers::NUMBER_DB_PREV;
11fdf7f2 5085 case 0x2B:
f67539c2 5086 return ROCKSDB_NAMESPACE::Tickers::NUMBER_DB_SEEK_FOUND;
11fdf7f2 5087 case 0x2C:
f67539c2 5088 return ROCKSDB_NAMESPACE::Tickers::NUMBER_DB_NEXT_FOUND;
11fdf7f2 5089 case 0x2D:
f67539c2 5090 return ROCKSDB_NAMESPACE::Tickers::NUMBER_DB_PREV_FOUND;
11fdf7f2 5091 case 0x2E:
f67539c2 5092 return ROCKSDB_NAMESPACE::Tickers::ITER_BYTES_READ;
11fdf7f2 5093 case 0x2F:
f67539c2 5094 return ROCKSDB_NAMESPACE::Tickers::NO_FILE_CLOSES;
11fdf7f2 5095 case 0x30:
f67539c2 5096 return ROCKSDB_NAMESPACE::Tickers::NO_FILE_OPENS;
11fdf7f2 5097 case 0x31:
f67539c2 5098 return ROCKSDB_NAMESPACE::Tickers::NO_FILE_ERRORS;
11fdf7f2 5099 case 0x32:
f67539c2 5100 return ROCKSDB_NAMESPACE::Tickers::STALL_L0_SLOWDOWN_MICROS;
11fdf7f2 5101 case 0x33:
f67539c2 5102 return ROCKSDB_NAMESPACE::Tickers::STALL_MEMTABLE_COMPACTION_MICROS;
11fdf7f2 5103 case 0x34:
f67539c2 5104 return ROCKSDB_NAMESPACE::Tickers::STALL_L0_NUM_FILES_MICROS;
11fdf7f2 5105 case 0x35:
f67539c2 5106 return ROCKSDB_NAMESPACE::Tickers::STALL_MICROS;
11fdf7f2 5107 case 0x36:
f67539c2 5108 return ROCKSDB_NAMESPACE::Tickers::DB_MUTEX_WAIT_MICROS;
11fdf7f2 5109 case 0x37:
f67539c2 5110 return ROCKSDB_NAMESPACE::Tickers::RATE_LIMIT_DELAY_MILLIS;
11fdf7f2 5111 case 0x38:
f67539c2 5112 return ROCKSDB_NAMESPACE::Tickers::NO_ITERATORS;
11fdf7f2 5113 case 0x39:
f67539c2 5114 return ROCKSDB_NAMESPACE::Tickers::NUMBER_MULTIGET_CALLS;
11fdf7f2 5115 case 0x3A:
f67539c2 5116 return ROCKSDB_NAMESPACE::Tickers::NUMBER_MULTIGET_KEYS_READ;
11fdf7f2 5117 case 0x3B:
f67539c2 5118 return ROCKSDB_NAMESPACE::Tickers::NUMBER_MULTIGET_BYTES_READ;
11fdf7f2 5119 case 0x3C:
f67539c2 5120 return ROCKSDB_NAMESPACE::Tickers::NUMBER_FILTERED_DELETES;
11fdf7f2 5121 case 0x3D:
f67539c2 5122 return ROCKSDB_NAMESPACE::Tickers::NUMBER_MERGE_FAILURES;
11fdf7f2 5123 case 0x3E:
f67539c2 5124 return ROCKSDB_NAMESPACE::Tickers::BLOOM_FILTER_PREFIX_CHECKED;
11fdf7f2 5125 case 0x3F:
f67539c2 5126 return ROCKSDB_NAMESPACE::Tickers::BLOOM_FILTER_PREFIX_USEFUL;
11fdf7f2 5127 case 0x40:
f67539c2 5128 return ROCKSDB_NAMESPACE::Tickers::NUMBER_OF_RESEEKS_IN_ITERATION;
11fdf7f2 5129 case 0x41:
f67539c2 5130 return ROCKSDB_NAMESPACE::Tickers::GET_UPDATES_SINCE_CALLS;
11fdf7f2 5131 case 0x42:
f67539c2 5132 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_COMPRESSED_MISS;
11fdf7f2 5133 case 0x43:
f67539c2 5134 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_COMPRESSED_HIT;
11fdf7f2 5135 case 0x44:
f67539c2 5136 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_COMPRESSED_ADD;
11fdf7f2 5137 case 0x45:
f67539c2 5138 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_COMPRESSED_ADD_FAILURES;
11fdf7f2 5139 case 0x46:
f67539c2 5140 return ROCKSDB_NAMESPACE::Tickers::WAL_FILE_SYNCED;
11fdf7f2 5141 case 0x47:
f67539c2 5142 return ROCKSDB_NAMESPACE::Tickers::WAL_FILE_BYTES;
11fdf7f2 5143 case 0x48:
f67539c2 5144 return ROCKSDB_NAMESPACE::Tickers::WRITE_DONE_BY_SELF;
11fdf7f2 5145 case 0x49:
f67539c2 5146 return ROCKSDB_NAMESPACE::Tickers::WRITE_DONE_BY_OTHER;
11fdf7f2 5147 case 0x4A:
f67539c2 5148 return ROCKSDB_NAMESPACE::Tickers::WRITE_TIMEDOUT;
11fdf7f2 5149 case 0x4B:
f67539c2 5150 return ROCKSDB_NAMESPACE::Tickers::WRITE_WITH_WAL;
11fdf7f2 5151 case 0x4C:
f67539c2 5152 return ROCKSDB_NAMESPACE::Tickers::COMPACT_READ_BYTES;
11fdf7f2 5153 case 0x4D:
f67539c2 5154 return ROCKSDB_NAMESPACE::Tickers::COMPACT_WRITE_BYTES;
11fdf7f2 5155 case 0x4E:
f67539c2 5156 return ROCKSDB_NAMESPACE::Tickers::FLUSH_WRITE_BYTES;
11fdf7f2 5157 case 0x4F:
f67539c2 5158 return ROCKSDB_NAMESPACE::Tickers::NUMBER_DIRECT_LOAD_TABLE_PROPERTIES;
11fdf7f2 5159 case 0x50:
f67539c2 5160 return ROCKSDB_NAMESPACE::Tickers::NUMBER_SUPERVERSION_ACQUIRES;
11fdf7f2 5161 case 0x51:
f67539c2 5162 return ROCKSDB_NAMESPACE::Tickers::NUMBER_SUPERVERSION_RELEASES;
11fdf7f2 5163 case 0x52:
f67539c2 5164 return ROCKSDB_NAMESPACE::Tickers::NUMBER_SUPERVERSION_CLEANUPS;
11fdf7f2 5165 case 0x53:
f67539c2 5166 return ROCKSDB_NAMESPACE::Tickers::NUMBER_BLOCK_COMPRESSED;
11fdf7f2 5167 case 0x54:
f67539c2 5168 return ROCKSDB_NAMESPACE::Tickers::NUMBER_BLOCK_DECOMPRESSED;
11fdf7f2 5169 case 0x55:
f67539c2 5170 return ROCKSDB_NAMESPACE::Tickers::NUMBER_BLOCK_NOT_COMPRESSED;
11fdf7f2 5171 case 0x56:
f67539c2 5172 return ROCKSDB_NAMESPACE::Tickers::MERGE_OPERATION_TOTAL_TIME;
11fdf7f2 5173 case 0x57:
f67539c2 5174 return ROCKSDB_NAMESPACE::Tickers::FILTER_OPERATION_TOTAL_TIME;
11fdf7f2 5175 case 0x58:
f67539c2 5176 return ROCKSDB_NAMESPACE::Tickers::ROW_CACHE_HIT;
11fdf7f2 5177 case 0x59:
f67539c2 5178 return ROCKSDB_NAMESPACE::Tickers::ROW_CACHE_MISS;
11fdf7f2 5179 case 0x5A:
f67539c2 5180 return ROCKSDB_NAMESPACE::Tickers::READ_AMP_ESTIMATE_USEFUL_BYTES;
11fdf7f2 5181 case 0x5B:
f67539c2 5182 return ROCKSDB_NAMESPACE::Tickers::READ_AMP_TOTAL_READ_BYTES;
11fdf7f2 5183 case 0x5C:
f67539c2 5184 return ROCKSDB_NAMESPACE::Tickers::NUMBER_RATE_LIMITER_DRAINS;
11fdf7f2 5185 case 0x5D:
f67539c2 5186 return ROCKSDB_NAMESPACE::Tickers::NUMBER_ITER_SKIP;
11fdf7f2 5187 case 0x5E:
f67539c2 5188 return ROCKSDB_NAMESPACE::Tickers::NUMBER_MULTIGET_KEYS_FOUND;
494da23a
TL
5189 case -0x01:
5190 // -0x01 to fixate the new value that incorrectly changed TICKER_ENUM_MAX.
f67539c2 5191 return ROCKSDB_NAMESPACE::Tickers::NO_ITERATOR_CREATED;
494da23a 5192 case 0x60:
f67539c2 5193 return ROCKSDB_NAMESPACE::Tickers::NO_ITERATOR_DELETED;
494da23a 5194 case 0x61:
f67539c2
TL
5195 return ROCKSDB_NAMESPACE::Tickers::
5196 COMPACTION_OPTIMIZED_DEL_DROP_OBSOLETE;
494da23a 5197 case 0x62:
f67539c2 5198 return ROCKSDB_NAMESPACE::Tickers::COMPACTION_CANCELLED;
494da23a 5199 case 0x63:
f67539c2 5200 return ROCKSDB_NAMESPACE::Tickers::BLOOM_FILTER_FULL_POSITIVE;
494da23a 5201 case 0x64:
f67539c2 5202 return ROCKSDB_NAMESPACE::Tickers::BLOOM_FILTER_FULL_TRUE_POSITIVE;
494da23a 5203 case 0x65:
f67539c2 5204 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_NUM_PUT;
494da23a 5205 case 0x66:
f67539c2 5206 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_NUM_WRITE;
494da23a 5207 case 0x67:
f67539c2 5208 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_NUM_GET;
494da23a 5209 case 0x68:
f67539c2 5210 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_NUM_MULTIGET;
494da23a 5211 case 0x69:
f67539c2 5212 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_NUM_SEEK;
494da23a 5213 case 0x6A:
f67539c2 5214 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_NUM_NEXT;
494da23a 5215 case 0x6B:
f67539c2 5216 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_NUM_PREV;
494da23a 5217 case 0x6C:
f67539c2 5218 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_NUM_KEYS_WRITTEN;
494da23a 5219 case 0x6D:
f67539c2 5220 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_NUM_KEYS_READ;
494da23a 5221 case 0x6E:
f67539c2 5222 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_BYTES_WRITTEN;
494da23a 5223 case 0x6F:
f67539c2 5224 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_BYTES_READ;
494da23a 5225 case 0x70:
f67539c2 5226 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_WRITE_INLINED;
494da23a 5227 case 0x71:
f67539c2 5228 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_WRITE_INLINED_TTL;
494da23a 5229 case 0x72:
f67539c2 5230 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_WRITE_BLOB;
494da23a 5231 case 0x73:
f67539c2 5232 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_WRITE_BLOB_TTL;
494da23a 5233 case 0x74:
f67539c2 5234 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_BLOB_FILE_BYTES_WRITTEN;
494da23a 5235 case 0x75:
f67539c2 5236 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_BLOB_FILE_BYTES_READ;
494da23a 5237 case 0x76:
f67539c2 5238 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_BLOB_FILE_SYNCED;
494da23a 5239 case 0x77:
f67539c2 5240 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_BLOB_INDEX_EXPIRED_COUNT;
494da23a 5241 case 0x78:
f67539c2 5242 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_BLOB_INDEX_EXPIRED_SIZE;
494da23a 5243 case 0x79:
f67539c2 5244 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_BLOB_INDEX_EVICTED_COUNT;
494da23a 5245 case 0x7A:
f67539c2 5246 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_BLOB_INDEX_EVICTED_SIZE;
494da23a 5247 case 0x7B:
f67539c2 5248 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_GC_NUM_FILES;
494da23a 5249 case 0x7C:
f67539c2 5250 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_GC_NUM_NEW_FILES;
494da23a 5251 case 0x7D:
f67539c2 5252 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_GC_FAILURES;
494da23a 5253 case 0x7E:
f67539c2 5254 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_GC_NUM_KEYS_OVERWRITTEN;
494da23a 5255 case 0x7F:
f67539c2 5256 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_GC_NUM_KEYS_EXPIRED;
494da23a 5257 case -0x02:
f67539c2 5258 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_GC_NUM_KEYS_RELOCATED;
494da23a 5259 case -0x03:
f67539c2 5260 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_GC_BYTES_OVERWRITTEN;
494da23a 5261 case -0x04:
f67539c2 5262 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_GC_BYTES_EXPIRED;
494da23a 5263 case -0x05:
f67539c2 5264 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_GC_BYTES_RELOCATED;
494da23a 5265 case -0x06:
f67539c2 5266 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_FIFO_NUM_FILES_EVICTED;
494da23a 5267 case -0x07:
f67539c2 5268 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_FIFO_NUM_KEYS_EVICTED;
494da23a 5269 case -0x08:
f67539c2 5270 return ROCKSDB_NAMESPACE::Tickers::BLOB_DB_FIFO_BYTES_EVICTED;
494da23a 5271 case -0x09:
f67539c2 5272 return ROCKSDB_NAMESPACE::Tickers::TXN_PREPARE_MUTEX_OVERHEAD;
494da23a 5273 case -0x0A:
f67539c2 5274 return ROCKSDB_NAMESPACE::Tickers::TXN_OLD_COMMIT_MAP_MUTEX_OVERHEAD;
494da23a 5275 case -0x0B:
f67539c2 5276 return ROCKSDB_NAMESPACE::Tickers::TXN_DUPLICATE_KEY_OVERHEAD;
494da23a 5277 case -0x0C:
f67539c2
TL
5278 return ROCKSDB_NAMESPACE::Tickers::TXN_SNAPSHOT_MUTEX_OVERHEAD;
5279 case -0x0D:
5280 return ROCKSDB_NAMESPACE::Tickers::TXN_GET_TRY_AGAIN;
20effc67
TL
5281 case -0x0E:
5282 return ROCKSDB_NAMESPACE::Tickers::FILES_MARKED_TRASH;
5283 case -0x0F:
5284 return ROCKSDB_NAMESPACE::Tickers::FILES_DELETED_IMMEDIATELY;
5285 case -0x10:
5286 return ROCKSDB_NAMESPACE::Tickers::COMPACT_READ_BYTES_MARKED;
5287 case -0x11:
5288 return ROCKSDB_NAMESPACE::Tickers::COMPACT_READ_BYTES_PERIODIC;
5289 case -0x12:
5290 return ROCKSDB_NAMESPACE::Tickers::COMPACT_READ_BYTES_TTL;
5291 case -0x13:
5292 return ROCKSDB_NAMESPACE::Tickers::COMPACT_WRITE_BYTES_MARKED;
5293 case -0x14:
5294 return ROCKSDB_NAMESPACE::Tickers::COMPACT_WRITE_BYTES_PERIODIC;
5295 case -0x15:
5296 return ROCKSDB_NAMESPACE::Tickers::COMPACT_WRITE_BYTES_TTL;
11fdf7f2 5297 case 0x5F:
494da23a 5298 // 0x5F for backwards compatibility on current minor version.
f67539c2 5299 return ROCKSDB_NAMESPACE::Tickers::TICKER_ENUM_MAX;
11fdf7f2
TL
5300
5301 default:
5302 // undefined/default
f67539c2 5303 return ROCKSDB_NAMESPACE::Tickers::BLOCK_CACHE_MISS;
11fdf7f2
TL
5304 }
5305 }
5306};
5307
5308// The portal class for org.rocksdb.HistogramType
5309class HistogramTypeJni {
5310 public:
5311 // Returns the equivalent org.rocksdb.HistogramType for the provided
f67539c2 5312 // C++ ROCKSDB_NAMESPACE::Histograms enum
11fdf7f2 5313 static jbyte toJavaHistogramsType(
f67539c2 5314 const ROCKSDB_NAMESPACE::Histograms& histograms) {
11fdf7f2 5315 switch(histograms) {
f67539c2 5316 case ROCKSDB_NAMESPACE::Histograms::DB_GET:
11fdf7f2 5317 return 0x0;
f67539c2 5318 case ROCKSDB_NAMESPACE::Histograms::DB_WRITE:
11fdf7f2 5319 return 0x1;
f67539c2 5320 case ROCKSDB_NAMESPACE::Histograms::COMPACTION_TIME:
11fdf7f2 5321 return 0x2;
f67539c2 5322 case ROCKSDB_NAMESPACE::Histograms::SUBCOMPACTION_SETUP_TIME:
11fdf7f2 5323 return 0x3;
f67539c2 5324 case ROCKSDB_NAMESPACE::Histograms::TABLE_SYNC_MICROS:
11fdf7f2 5325 return 0x4;
f67539c2 5326 case ROCKSDB_NAMESPACE::Histograms::COMPACTION_OUTFILE_SYNC_MICROS:
11fdf7f2 5327 return 0x5;
f67539c2 5328 case ROCKSDB_NAMESPACE::Histograms::WAL_FILE_SYNC_MICROS:
11fdf7f2 5329 return 0x6;
f67539c2 5330 case ROCKSDB_NAMESPACE::Histograms::MANIFEST_FILE_SYNC_MICROS:
11fdf7f2 5331 return 0x7;
f67539c2 5332 case ROCKSDB_NAMESPACE::Histograms::TABLE_OPEN_IO_MICROS:
11fdf7f2 5333 return 0x8;
f67539c2 5334 case ROCKSDB_NAMESPACE::Histograms::DB_MULTIGET:
11fdf7f2 5335 return 0x9;
f67539c2 5336 case ROCKSDB_NAMESPACE::Histograms::READ_BLOCK_COMPACTION_MICROS:
11fdf7f2 5337 return 0xA;
f67539c2 5338 case ROCKSDB_NAMESPACE::Histograms::READ_BLOCK_GET_MICROS:
11fdf7f2 5339 return 0xB;
f67539c2 5340 case ROCKSDB_NAMESPACE::Histograms::WRITE_RAW_BLOCK_MICROS:
11fdf7f2 5341 return 0xC;
f67539c2 5342 case ROCKSDB_NAMESPACE::Histograms::STALL_L0_SLOWDOWN_COUNT:
11fdf7f2 5343 return 0xD;
f67539c2 5344 case ROCKSDB_NAMESPACE::Histograms::STALL_MEMTABLE_COMPACTION_COUNT:
11fdf7f2 5345 return 0xE;
f67539c2 5346 case ROCKSDB_NAMESPACE::Histograms::STALL_L0_NUM_FILES_COUNT:
11fdf7f2 5347 return 0xF;
f67539c2 5348 case ROCKSDB_NAMESPACE::Histograms::HARD_RATE_LIMIT_DELAY_COUNT:
11fdf7f2 5349 return 0x10;
f67539c2 5350 case ROCKSDB_NAMESPACE::Histograms::SOFT_RATE_LIMIT_DELAY_COUNT:
11fdf7f2 5351 return 0x11;
f67539c2 5352 case ROCKSDB_NAMESPACE::Histograms::NUM_FILES_IN_SINGLE_COMPACTION:
11fdf7f2 5353 return 0x12;
f67539c2 5354 case ROCKSDB_NAMESPACE::Histograms::DB_SEEK:
11fdf7f2 5355 return 0x13;
f67539c2 5356 case ROCKSDB_NAMESPACE::Histograms::WRITE_STALL:
11fdf7f2 5357 return 0x14;
f67539c2 5358 case ROCKSDB_NAMESPACE::Histograms::SST_READ_MICROS:
11fdf7f2 5359 return 0x15;
f67539c2 5360 case ROCKSDB_NAMESPACE::Histograms::NUM_SUBCOMPACTIONS_SCHEDULED:
11fdf7f2 5361 return 0x16;
f67539c2 5362 case ROCKSDB_NAMESPACE::Histograms::BYTES_PER_READ:
11fdf7f2 5363 return 0x17;
f67539c2 5364 case ROCKSDB_NAMESPACE::Histograms::BYTES_PER_WRITE:
11fdf7f2 5365 return 0x18;
f67539c2 5366 case ROCKSDB_NAMESPACE::Histograms::BYTES_PER_MULTIGET:
11fdf7f2 5367 return 0x19;
f67539c2 5368 case ROCKSDB_NAMESPACE::Histograms::BYTES_COMPRESSED:
11fdf7f2 5369 return 0x1A;
f67539c2 5370 case ROCKSDB_NAMESPACE::Histograms::BYTES_DECOMPRESSED:
11fdf7f2 5371 return 0x1B;
f67539c2 5372 case ROCKSDB_NAMESPACE::Histograms::COMPRESSION_TIMES_NANOS:
11fdf7f2 5373 return 0x1C;
f67539c2 5374 case ROCKSDB_NAMESPACE::Histograms::DECOMPRESSION_TIMES_NANOS:
11fdf7f2 5375 return 0x1D;
f67539c2 5376 case ROCKSDB_NAMESPACE::Histograms::READ_NUM_MERGE_OPERANDS:
11fdf7f2 5377 return 0x1E;
494da23a 5378 // 0x20 to skip 0x1F so TICKER_ENUM_MAX remains unchanged for minor version compatibility.
f67539c2 5379 case ROCKSDB_NAMESPACE::Histograms::FLUSH_TIME:
11fdf7f2 5380 return 0x20;
f67539c2 5381 case ROCKSDB_NAMESPACE::Histograms::BLOB_DB_KEY_SIZE:
494da23a 5382 return 0x21;
f67539c2 5383 case ROCKSDB_NAMESPACE::Histograms::BLOB_DB_VALUE_SIZE:
494da23a 5384 return 0x22;
f67539c2 5385 case ROCKSDB_NAMESPACE::Histograms::BLOB_DB_WRITE_MICROS:
494da23a 5386 return 0x23;
f67539c2 5387 case ROCKSDB_NAMESPACE::Histograms::BLOB_DB_GET_MICROS:
494da23a 5388 return 0x24;
f67539c2 5389 case ROCKSDB_NAMESPACE::Histograms::BLOB_DB_MULTIGET_MICROS:
494da23a 5390 return 0x25;
f67539c2 5391 case ROCKSDB_NAMESPACE::Histograms::BLOB_DB_SEEK_MICROS:
494da23a 5392 return 0x26;
f67539c2 5393 case ROCKSDB_NAMESPACE::Histograms::BLOB_DB_NEXT_MICROS:
494da23a 5394 return 0x27;
f67539c2 5395 case ROCKSDB_NAMESPACE::Histograms::BLOB_DB_PREV_MICROS:
494da23a 5396 return 0x28;
f67539c2 5397 case ROCKSDB_NAMESPACE::Histograms::BLOB_DB_BLOB_FILE_WRITE_MICROS:
494da23a 5398 return 0x29;
f67539c2 5399 case ROCKSDB_NAMESPACE::Histograms::BLOB_DB_BLOB_FILE_READ_MICROS:
494da23a 5400 return 0x2A;
f67539c2 5401 case ROCKSDB_NAMESPACE::Histograms::BLOB_DB_BLOB_FILE_SYNC_MICROS:
494da23a 5402 return 0x2B;
f67539c2 5403 case ROCKSDB_NAMESPACE::Histograms::BLOB_DB_GC_MICROS:
494da23a 5404 return 0x2C;
f67539c2 5405 case ROCKSDB_NAMESPACE::Histograms::BLOB_DB_COMPRESSION_MICROS:
494da23a 5406 return 0x2D;
f67539c2 5407 case ROCKSDB_NAMESPACE::Histograms::BLOB_DB_DECOMPRESSION_MICROS:
494da23a 5408 return 0x2E;
20effc67
TL
5409 case ROCKSDB_NAMESPACE::Histograms::
5410 NUM_INDEX_AND_FILTER_BLOCKS_READ_PER_LEVEL:
5411 return 0x2F;
5412 case ROCKSDB_NAMESPACE::Histograms::NUM_DATA_BLOCKS_READ_PER_LEVEL:
5413 return 0x30;
5414 case ROCKSDB_NAMESPACE::Histograms::NUM_SST_READ_PER_LEVEL:
5415 return 0x31;
f67539c2 5416 case ROCKSDB_NAMESPACE::Histograms::HISTOGRAM_ENUM_MAX:
494da23a
TL
5417 // 0x1F for backwards compatibility on current minor version.
5418 return 0x1F;
11fdf7f2
TL
5419
5420 default:
5421 // undefined/default
5422 return 0x0;
5423 }
5424 }
5425
f67539c2 5426 // Returns the equivalent C++ ROCKSDB_NAMESPACE::Histograms enum for the
11fdf7f2 5427 // provided Java org.rocksdb.HistogramsType
f67539c2 5428 static ROCKSDB_NAMESPACE::Histograms toCppHistograms(jbyte jhistograms_type) {
11fdf7f2
TL
5429 switch(jhistograms_type) {
5430 case 0x0:
f67539c2 5431 return ROCKSDB_NAMESPACE::Histograms::DB_GET;
11fdf7f2 5432 case 0x1:
f67539c2 5433 return ROCKSDB_NAMESPACE::Histograms::DB_WRITE;
11fdf7f2 5434 case 0x2:
f67539c2 5435 return ROCKSDB_NAMESPACE::Histograms::COMPACTION_TIME;
11fdf7f2 5436 case 0x3:
f67539c2 5437 return ROCKSDB_NAMESPACE::Histograms::SUBCOMPACTION_SETUP_TIME;
11fdf7f2 5438 case 0x4:
f67539c2 5439 return ROCKSDB_NAMESPACE::Histograms::TABLE_SYNC_MICROS;
11fdf7f2 5440 case 0x5:
f67539c2 5441 return ROCKSDB_NAMESPACE::Histograms::COMPACTION_OUTFILE_SYNC_MICROS;
11fdf7f2 5442 case 0x6:
f67539c2 5443 return ROCKSDB_NAMESPACE::Histograms::WAL_FILE_SYNC_MICROS;
11fdf7f2 5444 case 0x7:
f67539c2 5445 return ROCKSDB_NAMESPACE::Histograms::MANIFEST_FILE_SYNC_MICROS;
11fdf7f2 5446 case 0x8:
f67539c2 5447 return ROCKSDB_NAMESPACE::Histograms::TABLE_OPEN_IO_MICROS;
11fdf7f2 5448 case 0x9:
f67539c2 5449 return ROCKSDB_NAMESPACE::Histograms::DB_MULTIGET;
11fdf7f2 5450 case 0xA:
f67539c2 5451 return ROCKSDB_NAMESPACE::Histograms::READ_BLOCK_COMPACTION_MICROS;
11fdf7f2 5452 case 0xB:
f67539c2 5453 return ROCKSDB_NAMESPACE::Histograms::READ_BLOCK_GET_MICROS;
11fdf7f2 5454 case 0xC:
f67539c2 5455 return ROCKSDB_NAMESPACE::Histograms::WRITE_RAW_BLOCK_MICROS;
11fdf7f2 5456 case 0xD:
f67539c2 5457 return ROCKSDB_NAMESPACE::Histograms::STALL_L0_SLOWDOWN_COUNT;
11fdf7f2 5458 case 0xE:
f67539c2 5459 return ROCKSDB_NAMESPACE::Histograms::STALL_MEMTABLE_COMPACTION_COUNT;
11fdf7f2 5460 case 0xF:
f67539c2 5461 return ROCKSDB_NAMESPACE::Histograms::STALL_L0_NUM_FILES_COUNT;
11fdf7f2 5462 case 0x10:
f67539c2 5463 return ROCKSDB_NAMESPACE::Histograms::HARD_RATE_LIMIT_DELAY_COUNT;
11fdf7f2 5464 case 0x11:
f67539c2 5465 return ROCKSDB_NAMESPACE::Histograms::SOFT_RATE_LIMIT_DELAY_COUNT;
11fdf7f2 5466 case 0x12:
f67539c2 5467 return ROCKSDB_NAMESPACE::Histograms::NUM_FILES_IN_SINGLE_COMPACTION;
11fdf7f2 5468 case 0x13:
f67539c2 5469 return ROCKSDB_NAMESPACE::Histograms::DB_SEEK;
11fdf7f2 5470 case 0x14:
f67539c2 5471 return ROCKSDB_NAMESPACE::Histograms::WRITE_STALL;
11fdf7f2 5472 case 0x15:
f67539c2 5473 return ROCKSDB_NAMESPACE::Histograms::SST_READ_MICROS;
11fdf7f2 5474 case 0x16:
f67539c2 5475 return ROCKSDB_NAMESPACE::Histograms::NUM_SUBCOMPACTIONS_SCHEDULED;
11fdf7f2 5476 case 0x17:
f67539c2 5477 return ROCKSDB_NAMESPACE::Histograms::BYTES_PER_READ;
11fdf7f2 5478 case 0x18:
f67539c2 5479 return ROCKSDB_NAMESPACE::Histograms::BYTES_PER_WRITE;
11fdf7f2 5480 case 0x19:
f67539c2 5481 return ROCKSDB_NAMESPACE::Histograms::BYTES_PER_MULTIGET;
11fdf7f2 5482 case 0x1A:
f67539c2 5483 return ROCKSDB_NAMESPACE::Histograms::BYTES_COMPRESSED;
11fdf7f2 5484 case 0x1B:
f67539c2 5485 return ROCKSDB_NAMESPACE::Histograms::BYTES_DECOMPRESSED;
11fdf7f2 5486 case 0x1C:
f67539c2 5487 return ROCKSDB_NAMESPACE::Histograms::COMPRESSION_TIMES_NANOS;
11fdf7f2 5488 case 0x1D:
f67539c2 5489 return ROCKSDB_NAMESPACE::Histograms::DECOMPRESSION_TIMES_NANOS;
11fdf7f2 5490 case 0x1E:
f67539c2 5491 return ROCKSDB_NAMESPACE::Histograms::READ_NUM_MERGE_OPERANDS;
494da23a 5492 // 0x20 to skip 0x1F so TICKER_ENUM_MAX remains unchanged for minor version compatibility.
11fdf7f2 5493 case 0x20:
f67539c2 5494 return ROCKSDB_NAMESPACE::Histograms::FLUSH_TIME;
494da23a 5495 case 0x21:
f67539c2 5496 return ROCKSDB_NAMESPACE::Histograms::BLOB_DB_KEY_SIZE;
494da23a 5497 case 0x22:
f67539c2 5498 return ROCKSDB_NAMESPACE::Histograms::BLOB_DB_VALUE_SIZE;
494da23a 5499 case 0x23:
f67539c2 5500 return ROCKSDB_NAMESPACE::Histograms::BLOB_DB_WRITE_MICROS;
494da23a 5501 case 0x24:
f67539c2 5502 return ROCKSDB_NAMESPACE::Histograms::BLOB_DB_GET_MICROS;
494da23a 5503 case 0x25:
f67539c2 5504 return ROCKSDB_NAMESPACE::Histograms::BLOB_DB_MULTIGET_MICROS;
494da23a 5505 case 0x26:
f67539c2 5506 return ROCKSDB_NAMESPACE::Histograms::BLOB_DB_SEEK_MICROS;
494da23a 5507 case 0x27:
f67539c2 5508 return ROCKSDB_NAMESPACE::Histograms::BLOB_DB_NEXT_MICROS;
494da23a 5509 case 0x28:
f67539c2 5510 return ROCKSDB_NAMESPACE::Histograms::BLOB_DB_PREV_MICROS;
494da23a 5511 case 0x29:
f67539c2 5512 return ROCKSDB_NAMESPACE::Histograms::BLOB_DB_BLOB_FILE_WRITE_MICROS;
494da23a 5513 case 0x2A:
f67539c2 5514 return ROCKSDB_NAMESPACE::Histograms::BLOB_DB_BLOB_FILE_READ_MICROS;
494da23a 5515 case 0x2B:
f67539c2 5516 return ROCKSDB_NAMESPACE::Histograms::BLOB_DB_BLOB_FILE_SYNC_MICROS;
494da23a 5517 case 0x2C:
f67539c2 5518 return ROCKSDB_NAMESPACE::Histograms::BLOB_DB_GC_MICROS;
494da23a 5519 case 0x2D:
f67539c2 5520 return ROCKSDB_NAMESPACE::Histograms::BLOB_DB_COMPRESSION_MICROS;
494da23a 5521 case 0x2E:
f67539c2 5522 return ROCKSDB_NAMESPACE::Histograms::BLOB_DB_DECOMPRESSION_MICROS;
20effc67
TL
5523 case 0x2F:
5524 return ROCKSDB_NAMESPACE::Histograms::
5525 NUM_INDEX_AND_FILTER_BLOCKS_READ_PER_LEVEL;
5526 case 0x30:
5527 return ROCKSDB_NAMESPACE::Histograms::NUM_DATA_BLOCKS_READ_PER_LEVEL;
5528 case 0x31:
5529 return ROCKSDB_NAMESPACE::Histograms::NUM_SST_READ_PER_LEVEL;
494da23a
TL
5530 case 0x1F:
5531 // 0x1F for backwards compatibility on current minor version.
f67539c2 5532 return ROCKSDB_NAMESPACE::Histograms::HISTOGRAM_ENUM_MAX;
11fdf7f2
TL
5533
5534 default:
5535 // undefined/default
f67539c2 5536 return ROCKSDB_NAMESPACE::Histograms::DB_GET;
11fdf7f2
TL
5537 }
5538 }
5539};
5540
5541// The portal class for org.rocksdb.StatsLevel
5542class StatsLevelJni {
5543 public:
5544 // Returns the equivalent org.rocksdb.StatsLevel for the provided
f67539c2 5545 // C++ ROCKSDB_NAMESPACE::StatsLevel enum
11fdf7f2 5546 static jbyte toJavaStatsLevel(
f67539c2 5547 const ROCKSDB_NAMESPACE::StatsLevel& stats_level) {
11fdf7f2 5548 switch(stats_level) {
f67539c2 5549 case ROCKSDB_NAMESPACE::StatsLevel::kExceptDetailedTimers:
11fdf7f2 5550 return 0x0;
f67539c2 5551 case ROCKSDB_NAMESPACE::StatsLevel::kExceptTimeForMutex:
11fdf7f2 5552 return 0x1;
f67539c2 5553 case ROCKSDB_NAMESPACE::StatsLevel::kAll:
11fdf7f2
TL
5554 return 0x2;
5555
5556 default:
5557 // undefined/default
5558 return 0x0;
5559 }
5560 }
5561
f67539c2 5562 // Returns the equivalent C++ ROCKSDB_NAMESPACE::StatsLevel enum for the
11fdf7f2 5563 // provided Java org.rocksdb.StatsLevel
f67539c2 5564 static ROCKSDB_NAMESPACE::StatsLevel toCppStatsLevel(jbyte jstats_level) {
11fdf7f2
TL
5565 switch(jstats_level) {
5566 case 0x0:
f67539c2 5567 return ROCKSDB_NAMESPACE::StatsLevel::kExceptDetailedTimers;
11fdf7f2 5568 case 0x1:
f67539c2 5569 return ROCKSDB_NAMESPACE::StatsLevel::kExceptTimeForMutex;
11fdf7f2 5570 case 0x2:
f67539c2 5571 return ROCKSDB_NAMESPACE::StatsLevel::kAll;
11fdf7f2
TL
5572
5573 default:
5574 // undefined/default
f67539c2 5575 return ROCKSDB_NAMESPACE::StatsLevel::kExceptDetailedTimers;
11fdf7f2 5576 }
7c673cae
FG
5577 }
5578};
5579
11fdf7f2
TL
5580// The portal class for org.rocksdb.RateLimiterMode
5581class RateLimiterModeJni {
7c673cae 5582 public:
11fdf7f2 5583 // Returns the equivalent org.rocksdb.RateLimiterMode for the provided
f67539c2 5584 // C++ ROCKSDB_NAMESPACE::RateLimiter::Mode enum
11fdf7f2 5585 static jbyte toJavaRateLimiterMode(
f67539c2 5586 const ROCKSDB_NAMESPACE::RateLimiter::Mode& rate_limiter_mode) {
11fdf7f2 5587 switch(rate_limiter_mode) {
f67539c2 5588 case ROCKSDB_NAMESPACE::RateLimiter::Mode::kReadsOnly:
11fdf7f2 5589 return 0x0;
f67539c2 5590 case ROCKSDB_NAMESPACE::RateLimiter::Mode::kWritesOnly:
11fdf7f2 5591 return 0x1;
f67539c2 5592 case ROCKSDB_NAMESPACE::RateLimiter::Mode::kAllIo:
11fdf7f2 5593 return 0x2;
7c673cae 5594
11fdf7f2
TL
5595 default:
5596 // undefined/default
5597 return 0x1;
7c673cae 5598 }
11fdf7f2 5599 }
7c673cae 5600
f67539c2
TL
5601 // Returns the equivalent C++ ROCKSDB_NAMESPACE::RateLimiter::Mode enum for
5602 // the provided Java org.rocksdb.RateLimiterMode
5603 static ROCKSDB_NAMESPACE::RateLimiter::Mode toCppRateLimiterMode(
5604 jbyte jrate_limiter_mode) {
11fdf7f2
TL
5605 switch(jrate_limiter_mode) {
5606 case 0x0:
f67539c2 5607 return ROCKSDB_NAMESPACE::RateLimiter::Mode::kReadsOnly;
11fdf7f2 5608 case 0x1:
f67539c2 5609 return ROCKSDB_NAMESPACE::RateLimiter::Mode::kWritesOnly;
11fdf7f2 5610 case 0x2:
f67539c2 5611 return ROCKSDB_NAMESPACE::RateLimiter::Mode::kAllIo;
7c673cae 5612
11fdf7f2
TL
5613 default:
5614 // undefined/default
f67539c2 5615 return ROCKSDB_NAMESPACE::RateLimiter::Mode::kWritesOnly;
7c673cae 5616 }
11fdf7f2
TL
5617 }
5618};
7c673cae 5619
494da23a
TL
5620// The portal class for org.rocksdb.MemoryUsageType
5621class MemoryUsageTypeJni {
5622public:
f67539c2
TL
5623 // Returns the equivalent org.rocksdb.MemoryUsageType for the provided
5624 // C++ ROCKSDB_NAMESPACE::MemoryUtil::UsageType enum
5625 static jbyte toJavaMemoryUsageType(
5626 const ROCKSDB_NAMESPACE::MemoryUtil::UsageType& usage_type) {
5627 switch (usage_type) {
5628 case ROCKSDB_NAMESPACE::MemoryUtil::UsageType::kMemTableTotal:
5629 return 0x0;
5630 case ROCKSDB_NAMESPACE::MemoryUtil::UsageType::kMemTableUnFlushed:
5631 return 0x1;
5632 case ROCKSDB_NAMESPACE::MemoryUtil::UsageType::kTableReadersTotal:
5633 return 0x2;
5634 case ROCKSDB_NAMESPACE::MemoryUtil::UsageType::kCacheTotal:
5635 return 0x3;
5636 default:
5637 // undefined: use kNumUsageTypes
5638 return 0x4;
5639 }
5640 }
494da23a 5641
f67539c2
TL
5642 // Returns the equivalent C++ ROCKSDB_NAMESPACE::MemoryUtil::UsageType enum for
5643 // the provided Java org.rocksdb.MemoryUsageType
5644 static ROCKSDB_NAMESPACE::MemoryUtil::UsageType toCppMemoryUsageType(
5645 jbyte usage_type) {
5646 switch (usage_type) {
5647 case 0x0:
5648 return ROCKSDB_NAMESPACE::MemoryUtil::UsageType::kMemTableTotal;
5649 case 0x1:
5650 return ROCKSDB_NAMESPACE::MemoryUtil::UsageType::kMemTableUnFlushed;
5651 case 0x2:
5652 return ROCKSDB_NAMESPACE::MemoryUtil::UsageType::kTableReadersTotal;
5653 case 0x3:
5654 return ROCKSDB_NAMESPACE::MemoryUtil::UsageType::kCacheTotal;
5655 default:
5656 // undefined/default: use kNumUsageTypes
5657 return ROCKSDB_NAMESPACE::MemoryUtil::UsageType::kNumUsageTypes;
5658 }
5659 }
494da23a
TL
5660};
5661
11fdf7f2
TL
5662// The portal class for org.rocksdb.Transaction
5663class TransactionJni : public JavaClass {
5664 public:
7c673cae 5665 /**
11fdf7f2 5666 * Get the Java Class org.rocksdb.Transaction
7c673cae
FG
5667 *
5668 * @param env A pointer to the Java environment
5669 *
5670 * @return The Java Class or nullptr if one of the
5671 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
5672 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
5673 */
5674 static jclass getJClass(JNIEnv* env) {
11fdf7f2
TL
5675 return JavaClass::getJClass(env,
5676 "org/rocksdb/Transaction");
7c673cae
FG
5677 }
5678
5679 /**
11fdf7f2 5680 * Create a new Java org.rocksdb.Transaction.WaitingTransactions object
7c673cae
FG
5681 *
5682 * @param env A pointer to the Java environment
11fdf7f2
TL
5683 * @param jtransaction A Java org.rocksdb.Transaction object
5684 * @param column_family_id The id of the column family
5685 * @param key The key
5686 * @param transaction_ids The transaction ids
7c673cae 5687 *
11fdf7f2
TL
5688 * @return A reference to a Java
5689 * org.rocksdb.Transaction.WaitingTransactions object,
5690 * or nullptr if an an exception occurs
7c673cae 5691 */
11fdf7f2
TL
5692 static jobject newWaitingTransactions(JNIEnv* env, jobject jtransaction,
5693 const uint32_t column_family_id, const std::string &key,
5694 const std::vector<TransactionID> &transaction_ids) {
7c673cae
FG
5695 jclass jclazz = getJClass(env);
5696 if(jclazz == nullptr) {
5697 // exception occurred accessing class
5698 return nullptr;
5699 }
5700
11fdf7f2
TL
5701 jmethodID mid = env->GetMethodID(
5702 jclazz, "newWaitingTransactions", "(JLjava/lang/String;[J)Lorg/rocksdb/Transaction$WaitingTransactions;");
5703 if(mid == nullptr) {
5704 // exception thrown: NoSuchMethodException or OutOfMemoryError
7c673cae 5705 return nullptr;
11fdf7f2
TL
5706 }
5707
5708 jstring jkey = env->NewStringUTF(key.c_str());
5709 if(jkey == nullptr) {
5710 // exception thrown: OutOfMemoryError
7c673cae
FG
5711 return nullptr;
5712 }
5713
11fdf7f2
TL
5714 const size_t len = transaction_ids.size();
5715 jlongArray jtransaction_ids = env->NewLongArray(static_cast<jsize>(len));
5716 if(jtransaction_ids == nullptr) {
5717 // exception thrown: OutOfMemoryError
5718 env->DeleteLocalRef(jkey);
5719 return nullptr;
5720 }
5721
20effc67
TL
5722 jboolean is_copy;
5723 jlong* body = env->GetLongArrayElements(jtransaction_ids, &is_copy);
11fdf7f2
TL
5724 if(body == nullptr) {
5725 // exception thrown: OutOfMemoryError
5726 env->DeleteLocalRef(jkey);
5727 env->DeleteLocalRef(jtransaction_ids);
5728 return nullptr;
5729 }
5730 for(size_t i = 0; i < len; ++i) {
5731 body[i] = static_cast<jlong>(transaction_ids[i]);
5732 }
20effc67
TL
5733 env->ReleaseLongArrayElements(jtransaction_ids, body,
5734 is_copy == JNI_TRUE ? 0 : JNI_ABORT);
11fdf7f2
TL
5735
5736 jobject jwaiting_transactions = env->CallObjectMethod(jtransaction,
5737 mid, static_cast<jlong>(column_family_id), jkey, jtransaction_ids);
5738 if(env->ExceptionCheck()) {
5739 // exception thrown: InstantiationException or OutOfMemoryError
5740 env->DeleteLocalRef(jkey);
5741 env->DeleteLocalRef(jtransaction_ids);
5742 return nullptr;
5743 }
5744
5745 return jwaiting_transactions;
7c673cae
FG
5746 }
5747};
5748
11fdf7f2
TL
5749// The portal class for org.rocksdb.TransactionDB
5750class TransactionDBJni : public JavaClass {
7c673cae 5751 public:
11fdf7f2
TL
5752 /**
5753 * Get the Java Class org.rocksdb.TransactionDB
5754 *
5755 * @param env A pointer to the Java environment
5756 *
5757 * @return The Java Class or nullptr if one of the
5758 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
5759 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
5760 */
5761 static jclass getJClass(JNIEnv* env) {
5762 return JavaClass::getJClass(env,
5763 "org/rocksdb/TransactionDB");
5764 }
5765
7c673cae 5766 /**
11fdf7f2 5767 * Create a new Java org.rocksdb.TransactionDB.DeadlockInfo object
7c673cae
FG
5768 *
5769 * @param env A pointer to the Java environment
11fdf7f2
TL
5770 * @param jtransaction A Java org.rocksdb.Transaction object
5771 * @param column_family_id The id of the column family
5772 * @param key The key
5773 * @param transaction_ids The transaction ids
7c673cae 5774 *
11fdf7f2
TL
5775 * @return A reference to a Java
5776 * org.rocksdb.Transaction.WaitingTransactions object,
5777 * or nullptr if an an exception occurs
7c673cae 5778 */
f67539c2
TL
5779 static jobject newDeadlockInfo(
5780 JNIEnv* env, jobject jtransaction_db,
5781 const ROCKSDB_NAMESPACE::TransactionID transaction_id,
5782 const uint32_t column_family_id, const std::string& waiting_key,
11fdf7f2
TL
5783 const bool exclusive) {
5784 jclass jclazz = getJClass(env);
5785 if(jclazz == nullptr) {
5786 // exception occurred accessing class
5787 return nullptr;
7c673cae
FG
5788 }
5789
11fdf7f2
TL
5790 jmethodID mid = env->GetMethodID(
5791 jclazz, "newDeadlockInfo", "(JJLjava/lang/String;Z)Lorg/rocksdb/TransactionDB$DeadlockInfo;");
5792 if(mid == nullptr) {
5793 // exception thrown: NoSuchMethodException or OutOfMemoryError
5794 return nullptr;
7c673cae
FG
5795 }
5796
11fdf7f2
TL
5797 jstring jwaiting_key = env->NewStringUTF(waiting_key.c_str());
5798 if(jwaiting_key == nullptr) {
5799 // exception thrown: OutOfMemoryError
5800 return nullptr;
7c673cae
FG
5801 }
5802
11fdf7f2
TL
5803 // resolve the column family id to a ColumnFamilyHandle
5804 jobject jdeadlock_info = env->CallObjectMethod(jtransaction_db,
5805 mid, transaction_id, static_cast<jlong>(column_family_id),
5806 jwaiting_key, exclusive);
5807 if(env->ExceptionCheck()) {
5808 // exception thrown: InstantiationException or OutOfMemoryError
5809 env->DeleteLocalRef(jwaiting_key);
5810 return nullptr;
7c673cae
FG
5811 }
5812
11fdf7f2
TL
5813 return jdeadlock_info;
5814 }
5815};
7c673cae 5816
11fdf7f2
TL
5817// The portal class for org.rocksdb.TxnDBWritePolicy
5818class TxnDBWritePolicyJni {
5819 public:
f67539c2
TL
5820 // Returns the equivalent org.rocksdb.TxnDBWritePolicy for the provided
5821 // C++ ROCKSDB_NAMESPACE::TxnDBWritePolicy enum
5822 static jbyte toJavaTxnDBWritePolicy(
5823 const ROCKSDB_NAMESPACE::TxnDBWritePolicy& txndb_write_policy) {
5824 switch (txndb_write_policy) {
5825 case ROCKSDB_NAMESPACE::TxnDBWritePolicy::WRITE_COMMITTED:
5826 return 0x0;
5827 case ROCKSDB_NAMESPACE::TxnDBWritePolicy::WRITE_PREPARED:
5828 return 0x1;
5829 case ROCKSDB_NAMESPACE::TxnDBWritePolicy::WRITE_UNPREPARED:
5830 return 0x2;
5831 default:
5832 return 0x7F; // undefined
5833 }
5834 }
11fdf7f2 5835
f67539c2
TL
5836 // Returns the equivalent C++ ROCKSDB_NAMESPACE::TxnDBWritePolicy enum for the
5837 // provided Java org.rocksdb.TxnDBWritePolicy
5838 static ROCKSDB_NAMESPACE::TxnDBWritePolicy toCppTxnDBWritePolicy(
5839 jbyte jtxndb_write_policy) {
5840 switch (jtxndb_write_policy) {
5841 case 0x0:
5842 return ROCKSDB_NAMESPACE::TxnDBWritePolicy::WRITE_COMMITTED;
5843 case 0x1:
5844 return ROCKSDB_NAMESPACE::TxnDBWritePolicy::WRITE_PREPARED;
5845 case 0x2:
5846 return ROCKSDB_NAMESPACE::TxnDBWritePolicy::WRITE_UNPREPARED;
5847 default:
5848 // undefined/default
5849 return ROCKSDB_NAMESPACE::TxnDBWritePolicy::WRITE_COMMITTED;
5850 }
5851 }
11fdf7f2 5852};
7c673cae 5853
11fdf7f2
TL
5854// The portal class for org.rocksdb.TransactionDB.KeyLockInfo
5855class KeyLockInfoJni : public JavaClass {
5856 public:
7c673cae 5857 /**
11fdf7f2 5858 * Get the Java Class org.rocksdb.TransactionDB.KeyLockInfo
7c673cae
FG
5859 *
5860 * @param env A pointer to the Java environment
5861 *
5862 * @return The Java Class or nullptr if one of the
5863 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
5864 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
5865 */
5866 static jclass getJClass(JNIEnv* env) {
11fdf7f2
TL
5867 return JavaClass::getJClass(env,
5868 "org/rocksdb/TransactionDB$KeyLockInfo");
7c673cae
FG
5869 }
5870
5871 /**
11fdf7f2 5872 * Create a new Java org.rocksdb.TransactionDB.KeyLockInfo object
f67539c2
TL
5873 * with the same properties as the provided C++ ROCKSDB_NAMESPACE::KeyLockInfo
5874 * object
7c673cae
FG
5875 *
5876 * @param env A pointer to the Java environment
f67539c2 5877 * @param key_lock_info The ROCKSDB_NAMESPACE::KeyLockInfo object
7c673cae 5878 *
11fdf7f2
TL
5879 * @return A reference to a Java
5880 * org.rocksdb.TransactionDB.KeyLockInfo object,
5881 * or nullptr if an an exception occurs
7c673cae 5882 */
f67539c2
TL
5883 static jobject construct(
5884 JNIEnv* env, const ROCKSDB_NAMESPACE::KeyLockInfo& key_lock_info) {
7c673cae
FG
5885 jclass jclazz = getJClass(env);
5886 if(jclazz == nullptr) {
5887 // exception occurred accessing class
5888 return nullptr;
5889 }
5890
11fdf7f2
TL
5891 jmethodID mid = env->GetMethodID(
5892 jclazz, "<init>", "(Ljava/lang/String;[JZ)V");
5893 if (mid == nullptr) {
5894 // exception thrown: NoSuchMethodException or OutOfMemoryError
7c673cae 5895 return nullptr;
11fdf7f2
TL
5896 }
5897
5898 jstring jkey = env->NewStringUTF(key_lock_info.key.c_str());
5899 if (jkey == nullptr) {
5900 // exception thrown: OutOfMemoryError
7c673cae
FG
5901 return nullptr;
5902 }
5903
11fdf7f2
TL
5904 const jsize jtransaction_ids_len = static_cast<jsize>(key_lock_info.ids.size());
5905 jlongArray jtransactions_ids = env->NewLongArray(jtransaction_ids_len);
5906 if (jtransactions_ids == nullptr) {
5907 // exception thrown: OutOfMemoryError
5908 env->DeleteLocalRef(jkey);
5909 return nullptr;
5910 }
5911
5912 const jobject jkey_lock_info = env->NewObject(jclazz, mid,
5913 jkey, jtransactions_ids, key_lock_info.exclusive);
5914 if(jkey_lock_info == nullptr) {
5915 // exception thrown: InstantiationException or OutOfMemoryError
5916 env->DeleteLocalRef(jtransactions_ids);
5917 env->DeleteLocalRef(jkey);
5918 return nullptr;
5919 }
5920
5921 return jkey_lock_info;
7c673cae
FG
5922 }
5923};
5924
11fdf7f2
TL
5925// The portal class for org.rocksdb.TransactionDB.DeadlockInfo
5926class DeadlockInfoJni : public JavaClass {
7c673cae
FG
5927 public:
5928 /**
11fdf7f2 5929 * Get the Java Class org.rocksdb.TransactionDB.DeadlockInfo
7c673cae
FG
5930 *
5931 * @param env A pointer to the Java environment
5932 *
5933 * @return The Java Class or nullptr if one of the
5934 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
5935 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
5936 */
11fdf7f2
TL
5937 static jclass getJClass(JNIEnv* env) {
5938 return JavaClass::getJClass(env,"org/rocksdb/TransactionDB$DeadlockInfo");
7c673cae 5939 }
11fdf7f2
TL
5940};
5941
5942// The portal class for org.rocksdb.TransactionDB.DeadlockPath
5943class DeadlockPathJni : public JavaClass {
5944 public:
7c673cae 5945 /**
11fdf7f2 5946 * Get the Java Class org.rocksdb.TransactionDB.DeadlockPath
7c673cae
FG
5947 *
5948 * @param env A pointer to the Java environment
5949 *
5950 * @return The Java Class or nullptr if one of the
5951 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
5952 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
5953 */
5954 static jclass getJClass(JNIEnv* env) {
5955 return JavaClass::getJClass(env,
11fdf7f2 5956 "org/rocksdb/TransactionDB$DeadlockPath");
7c673cae
FG
5957 }
5958
5959 /**
11fdf7f2 5960 * Create a new Java org.rocksdb.TransactionDB.DeadlockPath object
7c673cae
FG
5961 *
5962 * @param env A pointer to the Java environment
7c673cae
FG
5963 *
5964 * @return A reference to a Java
11fdf7f2 5965 * org.rocksdb.TransactionDB.DeadlockPath object,
7c673cae
FG
5966 * or nullptr if an an exception occurs
5967 */
5968 static jobject construct(JNIEnv* env,
11fdf7f2 5969 const jobjectArray jdeadlock_infos, const bool limit_exceeded) {
7c673cae
FG
5970 jclass jclazz = getJClass(env);
5971 if(jclazz == nullptr) {
5972 // exception occurred accessing class
5973 return nullptr;
5974 }
5975
5976 jmethodID mid = env->GetMethodID(
11fdf7f2
TL
5977 jclazz, "<init>", "([LDeadlockInfo;Z)V");
5978 if (mid == nullptr) {
7c673cae
FG
5979 // exception thrown: NoSuchMethodException or OutOfMemoryError
5980 return nullptr;
5981 }
5982
11fdf7f2
TL
5983 const jobject jdeadlock_path = env->NewObject(jclazz, mid,
5984 jdeadlock_infos, limit_exceeded);
5985 if(jdeadlock_path == nullptr) {
7c673cae
FG
5986 // exception thrown: InstantiationException or OutOfMemoryError
5987 return nullptr;
5988 }
5989
11fdf7f2 5990 return jdeadlock_path;
7c673cae
FG
5991 }
5992};
5993
f67539c2
TL
5994class AbstractTableFilterJni
5995 : public RocksDBNativeClass<
5996 const ROCKSDB_NAMESPACE::TableFilterJniCallback*,
5997 AbstractTableFilterJni> {
7c673cae 5998 public:
494da23a
TL
5999 /**
6000 * Get the Java Method: TableFilter#filter(TableProperties)
6001 *
6002 * @param env A pointer to the Java environment
6003 *
6004 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 6005 * be retrieved
494da23a
TL
6006 */
6007 static jmethodID getFilterMethod(JNIEnv* env) {
6008 jclass jclazz = getJClass(env);
6009 if(jclazz == nullptr) {
6010 // exception occurred accessing class
6011 return nullptr;
6012 }
7c673cae 6013
494da23a
TL
6014 static jmethodID mid =
6015 env->GetMethodID(jclazz, "filter", "(Lorg/rocksdb/TableProperties;)Z");
6016 assert(mid != nullptr);
6017 return mid;
6018 }
7c673cae 6019
494da23a
TL
6020 private:
6021 static jclass getJClass(JNIEnv* env) {
6022 return JavaClass::getJClass(env, "org/rocksdb/TableFilter");
6023 }
6024};
6025
6026class TablePropertiesJni : public JavaClass {
6027 public:
6028 /**
6029 * Create a new Java org.rocksdb.TableProperties object.
6030 *
6031 * @param env A pointer to the Java environment
6032 * @param table_properties A Cpp table properties object
6033 *
6034 * @return A reference to a Java org.rocksdb.TableProperties object, or
6035 * nullptr if an an exception occurs
6036 */
f67539c2
TL
6037 static jobject fromCppTableProperties(
6038 JNIEnv* env, const ROCKSDB_NAMESPACE::TableProperties& table_properties) {
494da23a
TL
6039 jclass jclazz = getJClass(env);
6040 if (jclazz == nullptr) {
6041 // exception occurred accessing class
6042 return nullptr;
7c673cae
FG
6043 }
6044
494da23a
TL
6045 jmethodID mid = env->GetMethodID(jclazz, "<init>", "(JJJJJJJJJJJJJJJJJJJ[BLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;)V");
6046 if (mid == nullptr) {
6047 // exception thrown: NoSuchMethodException or OutOfMemoryError
6048 return nullptr;
6049 }
6050
f67539c2
TL
6051 jbyteArray jcolumn_family_name = ROCKSDB_NAMESPACE::JniUtil::copyBytes(
6052 env, table_properties.column_family_name);
494da23a
TL
6053 if (jcolumn_family_name == nullptr) {
6054 // exception occurred creating java string
6055 return nullptr;
6056 }
6057
f67539c2
TL
6058 jstring jfilter_policy_name = ROCKSDB_NAMESPACE::JniUtil::toJavaString(
6059 env, &table_properties.filter_policy_name, true);
494da23a
TL
6060 if (env->ExceptionCheck()) {
6061 // exception occurred creating java string
6062 env->DeleteLocalRef(jcolumn_family_name);
6063 return nullptr;
6064 }
6065
f67539c2
TL
6066 jstring jcomparator_name = ROCKSDB_NAMESPACE::JniUtil::toJavaString(
6067 env, &table_properties.comparator_name, true);
494da23a
TL
6068 if (env->ExceptionCheck()) {
6069 // exception occurred creating java string
6070 env->DeleteLocalRef(jcolumn_family_name);
6071 env->DeleteLocalRef(jfilter_policy_name);
6072 return nullptr;
6073 }
6074
f67539c2
TL
6075 jstring jmerge_operator_name = ROCKSDB_NAMESPACE::JniUtil::toJavaString(
6076 env, &table_properties.merge_operator_name, true);
494da23a
TL
6077 if (env->ExceptionCheck()) {
6078 // exception occurred creating java string
6079 env->DeleteLocalRef(jcolumn_family_name);
6080 env->DeleteLocalRef(jfilter_policy_name);
6081 env->DeleteLocalRef(jcomparator_name);
6082 return nullptr;
6083 }
6084
f67539c2
TL
6085 jstring jprefix_extractor_name = ROCKSDB_NAMESPACE::JniUtil::toJavaString(
6086 env, &table_properties.prefix_extractor_name, true);
494da23a
TL
6087 if (env->ExceptionCheck()) {
6088 // exception occurred creating java string
6089 env->DeleteLocalRef(jcolumn_family_name);
6090 env->DeleteLocalRef(jfilter_policy_name);
6091 env->DeleteLocalRef(jcomparator_name);
6092 env->DeleteLocalRef(jmerge_operator_name);
6093 return nullptr;
6094 }
f67539c2
TL
6095
6096 jstring jproperty_collectors_names =
6097 ROCKSDB_NAMESPACE::JniUtil::toJavaString(
6098 env, &table_properties.property_collectors_names, true);
494da23a
TL
6099 if (env->ExceptionCheck()) {
6100 // exception occurred creating java string
6101 env->DeleteLocalRef(jcolumn_family_name);
6102 env->DeleteLocalRef(jfilter_policy_name);
6103 env->DeleteLocalRef(jcomparator_name);
6104 env->DeleteLocalRef(jmerge_operator_name);
6105 env->DeleteLocalRef(jprefix_extractor_name);
6106 return nullptr;
6107 }
6108
f67539c2
TL
6109 jstring jcompression_name = ROCKSDB_NAMESPACE::JniUtil::toJavaString(
6110 env, &table_properties.compression_name, true);
494da23a
TL
6111 if (env->ExceptionCheck()) {
6112 // exception occurred creating java string
6113 env->DeleteLocalRef(jcolumn_family_name);
6114 env->DeleteLocalRef(jfilter_policy_name);
6115 env->DeleteLocalRef(jcomparator_name);
6116 env->DeleteLocalRef(jmerge_operator_name);
6117 env->DeleteLocalRef(jprefix_extractor_name);
6118 env->DeleteLocalRef(jproperty_collectors_names);
6119 return nullptr;
6120 }
6121
6122 // Map<String, String>
f67539c2
TL
6123 jobject juser_collected_properties =
6124 ROCKSDB_NAMESPACE::HashMapJni::fromCppMap(
6125 env, &table_properties.user_collected_properties);
494da23a
TL
6126 if (env->ExceptionCheck()) {
6127 // exception occurred creating java map
6128 env->DeleteLocalRef(jcolumn_family_name);
6129 env->DeleteLocalRef(jfilter_policy_name);
6130 env->DeleteLocalRef(jcomparator_name);
6131 env->DeleteLocalRef(jmerge_operator_name);
6132 env->DeleteLocalRef(jprefix_extractor_name);
6133 env->DeleteLocalRef(jproperty_collectors_names);
6134 env->DeleteLocalRef(jcompression_name);
6135 return nullptr;
6136 }
6137
6138 // Map<String, String>
f67539c2
TL
6139 jobject jreadable_properties = ROCKSDB_NAMESPACE::HashMapJni::fromCppMap(
6140 env, &table_properties.readable_properties);
494da23a
TL
6141 if (env->ExceptionCheck()) {
6142 // exception occurred creating java map
6143 env->DeleteLocalRef(jcolumn_family_name);
6144 env->DeleteLocalRef(jfilter_policy_name);
6145 env->DeleteLocalRef(jcomparator_name);
6146 env->DeleteLocalRef(jmerge_operator_name);
6147 env->DeleteLocalRef(jprefix_extractor_name);
6148 env->DeleteLocalRef(jproperty_collectors_names);
6149 env->DeleteLocalRef(jcompression_name);
6150 env->DeleteLocalRef(juser_collected_properties);
6151 return nullptr;
6152 }
6153
6154 // Map<String, Long>
f67539c2
TL
6155 jobject jproperties_offsets = ROCKSDB_NAMESPACE::HashMapJni::fromCppMap(
6156 env, &table_properties.properties_offsets);
494da23a
TL
6157 if (env->ExceptionCheck()) {
6158 // exception occurred creating java map
6159 env->DeleteLocalRef(jcolumn_family_name);
6160 env->DeleteLocalRef(jfilter_policy_name);
6161 env->DeleteLocalRef(jcomparator_name);
6162 env->DeleteLocalRef(jmerge_operator_name);
6163 env->DeleteLocalRef(jprefix_extractor_name);
6164 env->DeleteLocalRef(jproperty_collectors_names);
6165 env->DeleteLocalRef(jcompression_name);
6166 env->DeleteLocalRef(juser_collected_properties);
6167 env->DeleteLocalRef(jreadable_properties);
6168 return nullptr;
6169 }
6170
6171 jobject jtable_properties = env->NewObject(jclazz, mid,
6172 static_cast<jlong>(table_properties.data_size),
6173 static_cast<jlong>(table_properties.index_size),
6174 static_cast<jlong>(table_properties.index_partitions),
6175 static_cast<jlong>(table_properties.top_level_index_size),
6176 static_cast<jlong>(table_properties.index_key_is_user_key),
6177 static_cast<jlong>(table_properties.index_value_is_delta_encoded),
6178 static_cast<jlong>(table_properties.filter_size),
6179 static_cast<jlong>(table_properties.raw_key_size),
6180 static_cast<jlong>(table_properties.raw_value_size),
6181 static_cast<jlong>(table_properties.num_data_blocks),
6182 static_cast<jlong>(table_properties.num_entries),
6183 static_cast<jlong>(table_properties.num_deletions),
6184 static_cast<jlong>(table_properties.num_merge_operands),
6185 static_cast<jlong>(table_properties.num_range_deletions),
6186 static_cast<jlong>(table_properties.format_version),
6187 static_cast<jlong>(table_properties.fixed_key_len),
6188 static_cast<jlong>(table_properties.column_family_id),
6189 static_cast<jlong>(table_properties.creation_time),
6190 static_cast<jlong>(table_properties.oldest_key_time),
6191 jcolumn_family_name,
6192 jfilter_policy_name,
6193 jcomparator_name,
6194 jmerge_operator_name,
6195 jprefix_extractor_name,
6196 jproperty_collectors_names,
6197 jcompression_name,
6198 juser_collected_properties,
6199 jreadable_properties,
6200 jproperties_offsets
6201 );
6202
6203 if (env->ExceptionCheck()) {
6204 return nullptr;
6205 }
6206
6207 return jtable_properties;
6208 }
6209
6210 private:
6211 static jclass getJClass(JNIEnv* env) {
6212 return JavaClass::getJClass(env, "org/rocksdb/TableProperties");
6213 }
6214};
6215
6216class ColumnFamilyDescriptorJni : public JavaClass {
6217 public:
6218 /**
6219 * Get the Java Class org.rocksdb.ColumnFamilyDescriptor
6220 *
6221 * @param env A pointer to the Java environment
6222 *
6223 * @return The Java Class or nullptr if one of the
6224 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
6225 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
6226 */
6227 static jclass getJClass(JNIEnv* env) {
6228 return JavaClass::getJClass(env, "org/rocksdb/ColumnFamilyDescriptor");
6229 }
6230
6231 /**
6232 * Create a new Java org.rocksdb.ColumnFamilyDescriptor object with the same
f67539c2
TL
6233 * properties as the provided C++ ROCKSDB_NAMESPACE::ColumnFamilyDescriptor
6234 * object
494da23a
TL
6235 *
6236 * @param env A pointer to the Java environment
f67539c2 6237 * @param cfd A pointer to ROCKSDB_NAMESPACE::ColumnFamilyDescriptor object
494da23a
TL
6238 *
6239 * @return A reference to a Java org.rocksdb.ColumnFamilyDescriptor object, or
6240 * nullptr if an an exception occurs
6241 */
6242 static jobject construct(JNIEnv* env, ColumnFamilyDescriptor* cfd) {
6243 jbyteArray jcf_name = JniUtil::copyBytes(env, cfd->name);
6244 jobject cfopts = ColumnFamilyOptionsJni::construct(env, &(cfd->options));
6245
6246 jclass jclazz = getJClass(env);
6247 if (jclazz == nullptr) {
6248 // exception occurred accessing class
6249 return nullptr;
7c673cae
FG
6250 }
6251
494da23a
TL
6252 jmethodID mid = env->GetMethodID(jclazz, "<init>",
6253 "([BLorg/rocksdb/ColumnFamilyOptions;)V");
6254 if (mid == nullptr) {
6255 // exception thrown: NoSuchMethodException or OutOfMemoryError
6256 env->DeleteLocalRef(jcf_name);
6257 return nullptr;
7c673cae
FG
6258 }
6259
494da23a
TL
6260 jobject jcfd = env->NewObject(jclazz, mid, jcf_name, cfopts);
6261 if (env->ExceptionCheck()) {
6262 env->DeleteLocalRef(jcf_name);
6263 return nullptr;
6264 }
7c673cae 6265
494da23a
TL
6266 return jcfd;
6267 }
7c673cae 6268
494da23a
TL
6269 /**
6270 * Get the Java Method: ColumnFamilyDescriptor#columnFamilyName
6271 *
6272 * @param env A pointer to the Java environment
6273 *
6274 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 6275 * be retrieved
494da23a
TL
6276 */
6277 static jmethodID getColumnFamilyNameMethod(JNIEnv* env) {
6278 jclass jclazz = getJClass(env);
6279 if (jclazz == nullptr) {
6280 // exception occurred accessing class
6281 return nullptr;
6282 }
7c673cae 6283
494da23a
TL
6284 static jmethodID mid = env->GetMethodID(jclazz, "columnFamilyName", "()[B");
6285 assert(mid != nullptr);
6286 return mid;
6287 }
7c673cae 6288
494da23a
TL
6289 /**
6290 * Get the Java Method: ColumnFamilyDescriptor#columnFamilyOptions
6291 *
6292 * @param env A pointer to the Java environment
6293 *
6294 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 6295 * be retrieved
494da23a
TL
6296 */
6297 static jmethodID getColumnFamilyOptionsMethod(JNIEnv* env) {
6298 jclass jclazz = getJClass(env);
6299 if (jclazz == nullptr) {
6300 // exception occurred accessing class
6301 return nullptr;
11fdf7f2
TL
6302 }
6303
494da23a
TL
6304 static jmethodID mid = env->GetMethodID(
6305 jclazz, "columnFamilyOptions", "()Lorg/rocksdb/ColumnFamilyOptions;");
6306 assert(mid != nullptr);
6307 return mid;
6308 }
6309};
11fdf7f2 6310
494da23a
TL
6311// The portal class for org.rocksdb.IndexType
6312class IndexTypeJni {
6313 public:
f67539c2
TL
6314 // Returns the equivalent org.rocksdb.IndexType for the provided
6315 // C++ ROCKSDB_NAMESPACE::IndexType enum
6316 static jbyte toJavaIndexType(
6317 const ROCKSDB_NAMESPACE::BlockBasedTableOptions::IndexType& index_type) {
6318 switch (index_type) {
6319 case ROCKSDB_NAMESPACE::BlockBasedTableOptions::IndexType::kBinarySearch:
6320 return 0x0;
6321 case ROCKSDB_NAMESPACE::BlockBasedTableOptions::IndexType::kHashSearch:
6322 return 0x1;
6323 case ROCKSDB_NAMESPACE::BlockBasedTableOptions::IndexType::
6324 kTwoLevelIndexSearch:
6325 return 0x2;
6326 case ROCKSDB_NAMESPACE::BlockBasedTableOptions::IndexType::
6327 kBinarySearchWithFirstKey:
6328 return 0x3;
6329 default:
6330 return 0x7F; // undefined
6331 }
6332 }
7c673cae 6333
f67539c2
TL
6334 // Returns the equivalent C++ ROCKSDB_NAMESPACE::IndexType enum for the
6335 // provided Java org.rocksdb.IndexType
6336 static ROCKSDB_NAMESPACE::BlockBasedTableOptions::IndexType toCppIndexType(
6337 jbyte jindex_type) {
6338 switch (jindex_type) {
6339 case 0x0:
6340 return ROCKSDB_NAMESPACE::BlockBasedTableOptions::IndexType::
6341 kBinarySearch;
6342 case 0x1:
6343 return ROCKSDB_NAMESPACE::BlockBasedTableOptions::IndexType::
6344 kHashSearch;
6345 case 0x2:
6346 return ROCKSDB_NAMESPACE::BlockBasedTableOptions::IndexType::
6347 kTwoLevelIndexSearch;
6348 case 0x3:
6349 return ROCKSDB_NAMESPACE::BlockBasedTableOptions::IndexType::
6350 kBinarySearchWithFirstKey;
6351 default:
6352 // undefined/default
6353 return ROCKSDB_NAMESPACE::BlockBasedTableOptions::IndexType::
6354 kBinarySearch;
6355 }
6356 }
494da23a 6357};
7c673cae 6358
494da23a
TL
6359// The portal class for org.rocksdb.DataBlockIndexType
6360class DataBlockIndexTypeJni {
6361 public:
f67539c2
TL
6362 // Returns the equivalent org.rocksdb.DataBlockIndexType for the provided
6363 // C++ ROCKSDB_NAMESPACE::DataBlockIndexType enum
6364 static jbyte toJavaDataBlockIndexType(
6365 const ROCKSDB_NAMESPACE::BlockBasedTableOptions::DataBlockIndexType&
6366 index_type) {
6367 switch (index_type) {
6368 case ROCKSDB_NAMESPACE::BlockBasedTableOptions::DataBlockIndexType::
6369 kDataBlockBinarySearch:
6370 return 0x0;
6371 case ROCKSDB_NAMESPACE::BlockBasedTableOptions::DataBlockIndexType::
6372 kDataBlockBinaryAndHash:
6373 return 0x1;
6374 default:
6375 return 0x7F; // undefined
6376 }
6377 }
7c673cae 6378
f67539c2
TL
6379 // Returns the equivalent C++ ROCKSDB_NAMESPACE::DataBlockIndexType enum for
6380 // the provided Java org.rocksdb.DataBlockIndexType
6381 static ROCKSDB_NAMESPACE::BlockBasedTableOptions::DataBlockIndexType
6382 toCppDataBlockIndexType(jbyte jindex_type) {
6383 switch (jindex_type) {
6384 case 0x0:
6385 return ROCKSDB_NAMESPACE::BlockBasedTableOptions::DataBlockIndexType::
6386 kDataBlockBinarySearch;
6387 case 0x1:
6388 return ROCKSDB_NAMESPACE::BlockBasedTableOptions::DataBlockIndexType::
6389 kDataBlockBinaryAndHash;
6390 default:
6391 // undefined/default
6392 return ROCKSDB_NAMESPACE::BlockBasedTableOptions::DataBlockIndexType::
6393 kDataBlockBinarySearch;
6394 }
6395 }
494da23a 6396};
7c673cae 6397
494da23a
TL
6398// The portal class for org.rocksdb.ChecksumType
6399class ChecksumTypeJni {
6400 public:
f67539c2
TL
6401 // Returns the equivalent org.rocksdb.ChecksumType for the provided
6402 // C++ ROCKSDB_NAMESPACE::ChecksumType enum
6403 static jbyte toJavaChecksumType(
6404 const ROCKSDB_NAMESPACE::ChecksumType& checksum_type) {
6405 switch (checksum_type) {
6406 case ROCKSDB_NAMESPACE::ChecksumType::kNoChecksum:
6407 return 0x0;
6408 case ROCKSDB_NAMESPACE::ChecksumType::kCRC32c:
6409 return 0x1;
6410 case ROCKSDB_NAMESPACE::ChecksumType::kxxHash:
6411 return 0x2;
6412 case ROCKSDB_NAMESPACE::ChecksumType::kxxHash64:
6413 return 0x3;
6414 default:
6415 return 0x7F; // undefined
6416 }
6417 }
494da23a 6418
f67539c2
TL
6419 // Returns the equivalent C++ ROCKSDB_NAMESPACE::ChecksumType enum for the
6420 // provided Java org.rocksdb.ChecksumType
6421 static ROCKSDB_NAMESPACE::ChecksumType toCppChecksumType(
6422 jbyte jchecksum_type) {
6423 switch (jchecksum_type) {
6424 case 0x0:
6425 return ROCKSDB_NAMESPACE::ChecksumType::kNoChecksum;
6426 case 0x1:
6427 return ROCKSDB_NAMESPACE::ChecksumType::kCRC32c;
6428 case 0x2:
6429 return ROCKSDB_NAMESPACE::ChecksumType::kxxHash;
6430 case 0x3:
6431 return ROCKSDB_NAMESPACE::ChecksumType::kxxHash64;
6432 default:
6433 // undefined/default
6434 return ROCKSDB_NAMESPACE::ChecksumType::kCRC32c;
6435 }
6436 }
494da23a 6437};
7c673cae 6438
20effc67
TL
6439// The portal class for org.rocksdb.IndexShorteningMode
6440class IndexShorteningModeJni {
6441 public:
6442 // Returns the equivalent org.rocksdb.IndexShorteningMode for the provided
6443 // C++ ROCKSDB_NAMESPACE::IndexShorteningMode enum
6444 static jbyte toJavaIndexShorteningMode(
6445 const ROCKSDB_NAMESPACE::BlockBasedTableOptions::IndexShorteningMode&
6446 index_shortening_mode) {
6447 switch (index_shortening_mode) {
6448 case ROCKSDB_NAMESPACE::BlockBasedTableOptions::IndexShorteningMode::
6449 kNoShortening:
6450 return 0x0;
6451 case ROCKSDB_NAMESPACE::BlockBasedTableOptions::IndexShorteningMode::
6452 kShortenSeparators:
6453 return 0x1;
6454 case ROCKSDB_NAMESPACE::BlockBasedTableOptions::IndexShorteningMode::
6455 kShortenSeparatorsAndSuccessor:
6456 return 0x2;
6457 default:
6458 return 0x7F; // undefined
6459 }
6460 }
6461
6462 // Returns the equivalent C++ ROCKSDB_NAMESPACE::IndexShorteningMode enum for
6463 // the provided Java org.rocksdb.IndexShorteningMode
6464 static ROCKSDB_NAMESPACE::BlockBasedTableOptions::IndexShorteningMode
6465 toCppIndexShorteningMode(jbyte jindex_shortening_mode) {
6466 switch (jindex_shortening_mode) {
6467 case 0x0:
6468 return ROCKSDB_NAMESPACE::BlockBasedTableOptions::IndexShorteningMode::
6469 kNoShortening;
6470 case 0x1:
6471 return ROCKSDB_NAMESPACE::BlockBasedTableOptions::IndexShorteningMode::
6472 kShortenSeparators;
6473 case 0x2:
6474 return ROCKSDB_NAMESPACE::BlockBasedTableOptions::IndexShorteningMode::
6475 kShortenSeparatorsAndSuccessor;
6476 default:
6477 // undefined/default
6478 return ROCKSDB_NAMESPACE::BlockBasedTableOptions::IndexShorteningMode::
6479 kShortenSeparators;
6480 }
6481 }
6482};
6483
494da23a
TL
6484// The portal class for org.rocksdb.Priority
6485class PriorityJni {
6486 public:
f67539c2
TL
6487 // Returns the equivalent org.rocksdb.Priority for the provided
6488 // C++ ROCKSDB_NAMESPACE::Env::Priority enum
6489 static jbyte toJavaPriority(
6490 const ROCKSDB_NAMESPACE::Env::Priority& priority) {
6491 switch (priority) {
6492 case ROCKSDB_NAMESPACE::Env::Priority::BOTTOM:
6493 return 0x0;
6494 case ROCKSDB_NAMESPACE::Env::Priority::LOW:
6495 return 0x1;
6496 case ROCKSDB_NAMESPACE::Env::Priority::HIGH:
6497 return 0x2;
6498 case ROCKSDB_NAMESPACE::Env::Priority::TOTAL:
6499 return 0x3;
6500 default:
6501 return 0x7F; // undefined
6502 }
6503 }
7c673cae 6504
f67539c2
TL
6505 // Returns the equivalent C++ ROCKSDB_NAMESPACE::env::Priority enum for the
6506 // provided Java org.rocksdb.Priority
6507 static ROCKSDB_NAMESPACE::Env::Priority toCppPriority(jbyte jpriority) {
6508 switch (jpriority) {
6509 case 0x0:
6510 return ROCKSDB_NAMESPACE::Env::Priority::BOTTOM;
6511 case 0x1:
6512 return ROCKSDB_NAMESPACE::Env::Priority::LOW;
6513 case 0x2:
6514 return ROCKSDB_NAMESPACE::Env::Priority::HIGH;
6515 case 0x3:
6516 return ROCKSDB_NAMESPACE::Env::Priority::TOTAL;
6517 default:
6518 // undefined/default
6519 return ROCKSDB_NAMESPACE::Env::Priority::LOW;
6520 }
6521 }
494da23a 6522};
7c673cae 6523
494da23a
TL
6524// The portal class for org.rocksdb.ThreadType
6525class ThreadTypeJni {
6526 public:
f67539c2
TL
6527 // Returns the equivalent org.rocksdb.ThreadType for the provided
6528 // C++ ROCKSDB_NAMESPACE::ThreadStatus::ThreadType enum
6529 static jbyte toJavaThreadType(
6530 const ROCKSDB_NAMESPACE::ThreadStatus::ThreadType& thread_type) {
6531 switch (thread_type) {
6532 case ROCKSDB_NAMESPACE::ThreadStatus::ThreadType::HIGH_PRIORITY:
6533 return 0x0;
6534 case ROCKSDB_NAMESPACE::ThreadStatus::ThreadType::LOW_PRIORITY:
6535 return 0x1;
6536 case ROCKSDB_NAMESPACE::ThreadStatus::ThreadType::USER:
6537 return 0x2;
6538 case ROCKSDB_NAMESPACE::ThreadStatus::ThreadType::BOTTOM_PRIORITY:
6539 return 0x3;
6540 default:
6541 return 0x7F; // undefined
6542 }
6543 }
7c673cae 6544
f67539c2
TL
6545 // Returns the equivalent C++ ROCKSDB_NAMESPACE::ThreadStatus::ThreadType enum
6546 // for the provided Java org.rocksdb.ThreadType
6547 static ROCKSDB_NAMESPACE::ThreadStatus::ThreadType toCppThreadType(
6548 jbyte jthread_type) {
6549 switch (jthread_type) {
6550 case 0x0:
6551 return ROCKSDB_NAMESPACE::ThreadStatus::ThreadType::HIGH_PRIORITY;
6552 case 0x1:
6553 return ROCKSDB_NAMESPACE::ThreadStatus::ThreadType::LOW_PRIORITY;
6554 case 0x2:
6555 return ThreadStatus::ThreadType::USER;
6556 case 0x3:
6557 return ROCKSDB_NAMESPACE::ThreadStatus::ThreadType::BOTTOM_PRIORITY;
6558 default:
6559 // undefined/default
6560 return ROCKSDB_NAMESPACE::ThreadStatus::ThreadType::LOW_PRIORITY;
6561 }
6562 }
494da23a 6563};
7c673cae 6564
494da23a
TL
6565// The portal class for org.rocksdb.OperationType
6566class OperationTypeJni {
6567 public:
f67539c2
TL
6568 // Returns the equivalent org.rocksdb.OperationType for the provided
6569 // C++ ROCKSDB_NAMESPACE::ThreadStatus::OperationType enum
6570 static jbyte toJavaOperationType(
6571 const ROCKSDB_NAMESPACE::ThreadStatus::OperationType& operation_type) {
6572 switch (operation_type) {
6573 case ROCKSDB_NAMESPACE::ThreadStatus::OperationType::OP_UNKNOWN:
6574 return 0x0;
6575 case ROCKSDB_NAMESPACE::ThreadStatus::OperationType::OP_COMPACTION:
6576 return 0x1;
6577 case ROCKSDB_NAMESPACE::ThreadStatus::OperationType::OP_FLUSH:
6578 return 0x2;
6579 default:
6580 return 0x7F; // undefined
6581 }
6582 }
7c673cae 6583
f67539c2
TL
6584 // Returns the equivalent C++ ROCKSDB_NAMESPACE::ThreadStatus::OperationType
6585 // enum for the provided Java org.rocksdb.OperationType
6586 static ROCKSDB_NAMESPACE::ThreadStatus::OperationType toCppOperationType(
6587 jbyte joperation_type) {
6588 switch (joperation_type) {
6589 case 0x0:
6590 return ROCKSDB_NAMESPACE::ThreadStatus::OperationType::OP_UNKNOWN;
6591 case 0x1:
6592 return ROCKSDB_NAMESPACE::ThreadStatus::OperationType::OP_COMPACTION;
6593 case 0x2:
6594 return ROCKSDB_NAMESPACE::ThreadStatus::OperationType::OP_FLUSH;
6595 default:
6596 // undefined/default
6597 return ROCKSDB_NAMESPACE::ThreadStatus::OperationType::OP_UNKNOWN;
6598 }
6599 }
494da23a 6600};
7c673cae 6601
494da23a
TL
6602// The portal class for org.rocksdb.OperationStage
6603class OperationStageJni {
6604 public:
f67539c2
TL
6605 // Returns the equivalent org.rocksdb.OperationStage for the provided
6606 // C++ ROCKSDB_NAMESPACE::ThreadStatus::OperationStage enum
6607 static jbyte toJavaOperationStage(
6608 const ROCKSDB_NAMESPACE::ThreadStatus::OperationStage& operation_stage) {
6609 switch (operation_stage) {
6610 case ROCKSDB_NAMESPACE::ThreadStatus::OperationStage::STAGE_UNKNOWN:
6611 return 0x0;
6612 case ROCKSDB_NAMESPACE::ThreadStatus::OperationStage::STAGE_FLUSH_RUN:
6613 return 0x1;
6614 case ROCKSDB_NAMESPACE::ThreadStatus::OperationStage::
6615 STAGE_FLUSH_WRITE_L0:
6616 return 0x2;
6617 case ROCKSDB_NAMESPACE::ThreadStatus::OperationStage::
6618 STAGE_COMPACTION_PREPARE:
6619 return 0x3;
6620 case ROCKSDB_NAMESPACE::ThreadStatus::OperationStage::
6621 STAGE_COMPACTION_RUN:
6622 return 0x4;
6623 case ROCKSDB_NAMESPACE::ThreadStatus::OperationStage::
6624 STAGE_COMPACTION_PROCESS_KV:
6625 return 0x5;
6626 case ROCKSDB_NAMESPACE::ThreadStatus::OperationStage::
6627 STAGE_COMPACTION_INSTALL:
6628 return 0x6;
6629 case ROCKSDB_NAMESPACE::ThreadStatus::OperationStage::
6630 STAGE_COMPACTION_SYNC_FILE:
6631 return 0x7;
6632 case ROCKSDB_NAMESPACE::ThreadStatus::OperationStage::
6633 STAGE_PICK_MEMTABLES_TO_FLUSH:
6634 return 0x8;
6635 case ROCKSDB_NAMESPACE::ThreadStatus::OperationStage::
6636 STAGE_MEMTABLE_ROLLBACK:
6637 return 0x9;
6638 case ROCKSDB_NAMESPACE::ThreadStatus::OperationStage::
6639 STAGE_MEMTABLE_INSTALL_FLUSH_RESULTS:
6640 return 0xA;
6641 default:
6642 return 0x7F; // undefined
6643 }
6644 }
11fdf7f2 6645
f67539c2
TL
6646 // Returns the equivalent C++ ROCKSDB_NAMESPACE::ThreadStatus::OperationStage
6647 // enum for the provided Java org.rocksdb.OperationStage
6648 static ROCKSDB_NAMESPACE::ThreadStatus::OperationStage toCppOperationStage(
6649 jbyte joperation_stage) {
6650 switch (joperation_stage) {
6651 case 0x0:
6652 return ROCKSDB_NAMESPACE::ThreadStatus::OperationStage::STAGE_UNKNOWN;
6653 case 0x1:
6654 return ROCKSDB_NAMESPACE::ThreadStatus::OperationStage::STAGE_FLUSH_RUN;
6655 case 0x2:
6656 return ROCKSDB_NAMESPACE::ThreadStatus::OperationStage::
6657 STAGE_FLUSH_WRITE_L0;
6658 case 0x3:
6659 return ROCKSDB_NAMESPACE::ThreadStatus::OperationStage::
6660 STAGE_COMPACTION_PREPARE;
6661 case 0x4:
6662 return ROCKSDB_NAMESPACE::ThreadStatus::OperationStage::
6663 STAGE_COMPACTION_RUN;
6664 case 0x5:
6665 return ROCKSDB_NAMESPACE::ThreadStatus::OperationStage::
6666 STAGE_COMPACTION_PROCESS_KV;
6667 case 0x6:
6668 return ROCKSDB_NAMESPACE::ThreadStatus::OperationStage::
6669 STAGE_COMPACTION_INSTALL;
6670 case 0x7:
6671 return ROCKSDB_NAMESPACE::ThreadStatus::OperationStage::
6672 STAGE_COMPACTION_SYNC_FILE;
6673 case 0x8:
6674 return ROCKSDB_NAMESPACE::ThreadStatus::OperationStage::
6675 STAGE_PICK_MEMTABLES_TO_FLUSH;
6676 case 0x9:
6677 return ROCKSDB_NAMESPACE::ThreadStatus::OperationStage::
6678 STAGE_MEMTABLE_ROLLBACK;
6679 case 0xA:
6680 return ROCKSDB_NAMESPACE::ThreadStatus::OperationStage::
6681 STAGE_MEMTABLE_INSTALL_FLUSH_RESULTS;
6682 default:
6683 // undefined/default
6684 return ROCKSDB_NAMESPACE::ThreadStatus::OperationStage::STAGE_UNKNOWN;
6685 }
6686 }
494da23a 6687};
7c673cae 6688
494da23a
TL
6689// The portal class for org.rocksdb.StateType
6690class StateTypeJni {
6691 public:
f67539c2
TL
6692 // Returns the equivalent org.rocksdb.StateType for the provided
6693 // C++ ROCKSDB_NAMESPACE::ThreadStatus::StateType enum
6694 static jbyte toJavaStateType(
6695 const ROCKSDB_NAMESPACE::ThreadStatus::StateType& state_type) {
6696 switch (state_type) {
6697 case ROCKSDB_NAMESPACE::ThreadStatus::StateType::STATE_UNKNOWN:
6698 return 0x0;
6699 case ROCKSDB_NAMESPACE::ThreadStatus::StateType::STATE_MUTEX_WAIT:
6700 return 0x1;
6701 default:
6702 return 0x7F; // undefined
6703 }
6704 }
7c673cae 6705
f67539c2
TL
6706 // Returns the equivalent C++ ROCKSDB_NAMESPACE::ThreadStatus::StateType enum
6707 // for the provided Java org.rocksdb.StateType
6708 static ROCKSDB_NAMESPACE::ThreadStatus::StateType toCppStateType(
6709 jbyte jstate_type) {
6710 switch (jstate_type) {
6711 case 0x0:
6712 return ROCKSDB_NAMESPACE::ThreadStatus::StateType::STATE_UNKNOWN;
6713 case 0x1:
6714 return ROCKSDB_NAMESPACE::ThreadStatus::StateType::STATE_MUTEX_WAIT;
6715 default:
6716 // undefined/default
6717 return ROCKSDB_NAMESPACE::ThreadStatus::StateType::STATE_UNKNOWN;
6718 }
6719 }
494da23a 6720};
7c673cae 6721
494da23a
TL
6722// The portal class for org.rocksdb.ThreadStatus
6723class ThreadStatusJni : public JavaClass {
6724 public:
6725 /**
6726 * Get the Java Class org.rocksdb.ThreadStatus
6727 *
6728 * @param env A pointer to the Java environment
6729 *
6730 * @return The Java Class or nullptr if one of the
6731 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
6732 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
6733 */
6734 static jclass getJClass(JNIEnv* env) {
6735 return JavaClass::getJClass(env,
6736 "org/rocksdb/ThreadStatus");
6737 }
6738
6739 /**
6740 * Create a new Java org.rocksdb.ThreadStatus object with the same
f67539c2 6741 * properties as the provided C++ ROCKSDB_NAMESPACE::ThreadStatus object
494da23a
TL
6742 *
6743 * @param env A pointer to the Java environment
f67539c2 6744 * @param thread_status A pointer to ROCKSDB_NAMESPACE::ThreadStatus object
494da23a
TL
6745 *
6746 * @return A reference to a Java org.rocksdb.ColumnFamilyOptions object, or
6747 * nullptr if an an exception occurs
6748 */
f67539c2
TL
6749 static jobject construct(
6750 JNIEnv* env, const ROCKSDB_NAMESPACE::ThreadStatus* thread_status) {
494da23a
TL
6751 jclass jclazz = getJClass(env);
6752 if(jclazz == nullptr) {
6753 // exception occurred accessing class
6754 return nullptr;
7c673cae
FG
6755 }
6756
494da23a
TL
6757 jmethodID mid = env->GetMethodID(jclazz, "<init>", "(JBLjava/lang/String;Ljava/lang/String;BJB[JB)V");
6758 if (mid == nullptr) {
6759 // exception thrown: NoSuchMethodException or OutOfMemoryError
6760 return nullptr;
6761 }
6762
6763 jstring jdb_name =
6764 JniUtil::toJavaString(env, &(thread_status->db_name), true);
6765 if (env->ExceptionCheck()) {
6766 // an error occurred
7c673cae 6767 return nullptr;
494da23a 6768 }
7c673cae 6769
494da23a
TL
6770 jstring jcf_name =
6771 JniUtil::toJavaString(env, &(thread_status->cf_name), true);
6772 if (env->ExceptionCheck()) {
6773 // an error occurred
6774 env->DeleteLocalRef(jdb_name);
6775 return nullptr;
6776 }
7c673cae 6777
494da23a 6778 // long[]
f67539c2
TL
6779 const jsize len = static_cast<jsize>(
6780 ROCKSDB_NAMESPACE::ThreadStatus::kNumOperationProperties);
494da23a
TL
6781 jlongArray joperation_properties =
6782 env->NewLongArray(len);
6783 if (joperation_properties == nullptr) {
6784 // an exception occurred
6785 env->DeleteLocalRef(jdb_name);
6786 env->DeleteLocalRef(jcf_name);
6787 return nullptr;
6788 }
20effc67
TL
6789 jboolean is_copy;
6790 jlong* body = env->GetLongArrayElements(joperation_properties, &is_copy);
494da23a 6791 if (body == nullptr) {
7c673cae 6792 // exception thrown: OutOfMemoryError
494da23a
TL
6793 env->DeleteLocalRef(jdb_name);
6794 env->DeleteLocalRef(jcf_name);
6795 env->DeleteLocalRef(joperation_properties);
7c673cae 6796 return nullptr;
494da23a
TL
6797 }
6798 for (size_t i = 0; i < len; ++i) {
6799 body[i] = static_cast<jlong>(thread_status->op_properties[i]);
6800 }
20effc67
TL
6801 env->ReleaseLongArrayElements(joperation_properties, body,
6802 is_copy == JNI_TRUE ? 0 : JNI_ABORT);
494da23a
TL
6803
6804 jobject jcfd = env->NewObject(jclazz, mid,
6805 static_cast<jlong>(thread_status->thread_id),
6806 ThreadTypeJni::toJavaThreadType(thread_status->thread_type),
6807 jdb_name,
6808 jcf_name,
6809 OperationTypeJni::toJavaOperationType(thread_status->operation_type),
6810 static_cast<jlong>(thread_status->op_elapsed_micros),
6811 OperationStageJni::toJavaOperationStage(thread_status->operation_stage),
6812 joperation_properties,
6813 StateTypeJni::toJavaStateType(thread_status->state_type));
6814 if (env->ExceptionCheck()) {
6815 // exception occurred
6816 env->DeleteLocalRef(jdb_name);
6817 env->DeleteLocalRef(jcf_name);
6818 env->DeleteLocalRef(joperation_properties);
6819 return nullptr;
6820 }
7c673cae 6821
494da23a
TL
6822 // cleanup
6823 env->DeleteLocalRef(jdb_name);
6824 env->DeleteLocalRef(jcf_name);
6825 env->DeleteLocalRef(joperation_properties);
7c673cae 6826
494da23a
TL
6827 return jcfd;
6828 }
6829};
6830
6831// The portal class for org.rocksdb.CompactionStyle
6832class CompactionStyleJni {
6833 public:
f67539c2
TL
6834 // Returns the equivalent org.rocksdb.CompactionStyle for the provided
6835 // C++ ROCKSDB_NAMESPACE::CompactionStyle enum
6836 static jbyte toJavaCompactionStyle(
6837 const ROCKSDB_NAMESPACE::CompactionStyle& compaction_style) {
6838 switch (compaction_style) {
6839 case ROCKSDB_NAMESPACE::CompactionStyle::kCompactionStyleLevel:
6840 return 0x0;
6841 case ROCKSDB_NAMESPACE::CompactionStyle::kCompactionStyleUniversal:
6842 return 0x1;
6843 case ROCKSDB_NAMESPACE::CompactionStyle::kCompactionStyleFIFO:
6844 return 0x2;
6845 case ROCKSDB_NAMESPACE::CompactionStyle::kCompactionStyleNone:
6846 return 0x3;
6847 default:
6848 return 0x7F; // undefined
6849 }
6850 }
494da23a 6851
f67539c2
TL
6852 // Returns the equivalent C++ ROCKSDB_NAMESPACE::CompactionStyle enum for the
6853 // provided Java org.rocksdb.CompactionStyle
6854 static ROCKSDB_NAMESPACE::CompactionStyle toCppCompactionStyle(
6855 jbyte jcompaction_style) {
6856 switch (jcompaction_style) {
6857 case 0x0:
6858 return ROCKSDB_NAMESPACE::CompactionStyle::kCompactionStyleLevel;
6859 case 0x1:
6860 return ROCKSDB_NAMESPACE::CompactionStyle::kCompactionStyleUniversal;
6861 case 0x2:
6862 return ROCKSDB_NAMESPACE::CompactionStyle::kCompactionStyleFIFO;
6863 case 0x3:
6864 return ROCKSDB_NAMESPACE::CompactionStyle::kCompactionStyleNone;
6865 default:
6866 // undefined/default
6867 return ROCKSDB_NAMESPACE::CompactionStyle::kCompactionStyleLevel;
6868 }
6869 }
494da23a
TL
6870};
6871
6872// The portal class for org.rocksdb.CompactionReason
6873class CompactionReasonJni {
6874 public:
f67539c2
TL
6875 // Returns the equivalent org.rocksdb.CompactionReason for the provided
6876 // C++ ROCKSDB_NAMESPACE::CompactionReason enum
6877 static jbyte toJavaCompactionReason(
6878 const ROCKSDB_NAMESPACE::CompactionReason& compaction_reason) {
6879 switch (compaction_reason) {
6880 case ROCKSDB_NAMESPACE::CompactionReason::kUnknown:
6881 return 0x0;
6882 case ROCKSDB_NAMESPACE::CompactionReason::kLevelL0FilesNum:
6883 return 0x1;
6884 case ROCKSDB_NAMESPACE::CompactionReason::kLevelMaxLevelSize:
6885 return 0x2;
6886 case ROCKSDB_NAMESPACE::CompactionReason::kUniversalSizeAmplification:
6887 return 0x3;
6888 case ROCKSDB_NAMESPACE::CompactionReason::kUniversalSizeRatio:
6889 return 0x4;
6890 case ROCKSDB_NAMESPACE::CompactionReason::kUniversalSortedRunNum:
6891 return 0x5;
6892 case ROCKSDB_NAMESPACE::CompactionReason::kFIFOMaxSize:
6893 return 0x6;
6894 case ROCKSDB_NAMESPACE::CompactionReason::kFIFOReduceNumFiles:
6895 return 0x7;
6896 case ROCKSDB_NAMESPACE::CompactionReason::kFIFOTtl:
6897 return 0x8;
6898 case ROCKSDB_NAMESPACE::CompactionReason::kManualCompaction:
6899 return 0x9;
6900 case ROCKSDB_NAMESPACE::CompactionReason::kFilesMarkedForCompaction:
6901 return 0x10;
6902 case ROCKSDB_NAMESPACE::CompactionReason::kBottommostFiles:
6903 return 0x0A;
6904 case ROCKSDB_NAMESPACE::CompactionReason::kTtl:
6905 return 0x0B;
6906 case ROCKSDB_NAMESPACE::CompactionReason::kFlush:
6907 return 0x0C;
6908 case ROCKSDB_NAMESPACE::CompactionReason::kExternalSstIngestion:
6909 return 0x0D;
6910 default:
6911 return 0x7F; // undefined
6912 }
6913 }
494da23a 6914
f67539c2
TL
6915 // Returns the equivalent C++ ROCKSDB_NAMESPACE::CompactionReason enum for the
6916 // provided Java org.rocksdb.CompactionReason
6917 static ROCKSDB_NAMESPACE::CompactionReason toCppCompactionReason(
6918 jbyte jcompaction_reason) {
6919 switch (jcompaction_reason) {
6920 case 0x0:
6921 return ROCKSDB_NAMESPACE::CompactionReason::kUnknown;
6922 case 0x1:
6923 return ROCKSDB_NAMESPACE::CompactionReason::kLevelL0FilesNum;
6924 case 0x2:
6925 return ROCKSDB_NAMESPACE::CompactionReason::kLevelMaxLevelSize;
6926 case 0x3:
6927 return ROCKSDB_NAMESPACE::CompactionReason::kUniversalSizeAmplification;
6928 case 0x4:
6929 return ROCKSDB_NAMESPACE::CompactionReason::kUniversalSizeRatio;
6930 case 0x5:
6931 return ROCKSDB_NAMESPACE::CompactionReason::kUniversalSortedRunNum;
6932 case 0x6:
6933 return ROCKSDB_NAMESPACE::CompactionReason::kFIFOMaxSize;
6934 case 0x7:
6935 return ROCKSDB_NAMESPACE::CompactionReason::kFIFOReduceNumFiles;
6936 case 0x8:
6937 return ROCKSDB_NAMESPACE::CompactionReason::kFIFOTtl;
6938 case 0x9:
6939 return ROCKSDB_NAMESPACE::CompactionReason::kManualCompaction;
6940 case 0x10:
6941 return ROCKSDB_NAMESPACE::CompactionReason::kFilesMarkedForCompaction;
6942 case 0x0A:
6943 return ROCKSDB_NAMESPACE::CompactionReason::kBottommostFiles;
6944 case 0x0B:
6945 return ROCKSDB_NAMESPACE::CompactionReason::kTtl;
6946 case 0x0C:
6947 return ROCKSDB_NAMESPACE::CompactionReason::kFlush;
6948 case 0x0D:
6949 return ROCKSDB_NAMESPACE::CompactionReason::kExternalSstIngestion;
6950 default:
6951 // undefined/default
6952 return ROCKSDB_NAMESPACE::CompactionReason::kUnknown;
6953 }
6954 }
494da23a 6955};
7c673cae 6956
494da23a
TL
6957// The portal class for org.rocksdb.WalFileType
6958class WalFileTypeJni {
6959 public:
f67539c2
TL
6960 // Returns the equivalent org.rocksdb.WalFileType for the provided
6961 // C++ ROCKSDB_NAMESPACE::WalFileType enum
6962 static jbyte toJavaWalFileType(
6963 const ROCKSDB_NAMESPACE::WalFileType& wal_file_type) {
6964 switch (wal_file_type) {
6965 case ROCKSDB_NAMESPACE::WalFileType::kArchivedLogFile:
6966 return 0x0;
6967 case ROCKSDB_NAMESPACE::WalFileType::kAliveLogFile:
6968 return 0x1;
6969 default:
6970 return 0x7F; // undefined
6971 }
6972 }
7c673cae 6973
f67539c2
TL
6974 // Returns the equivalent C++ ROCKSDB_NAMESPACE::WalFileType enum for the
6975 // provided Java org.rocksdb.WalFileType
6976 static ROCKSDB_NAMESPACE::WalFileType toCppWalFileType(jbyte jwal_file_type) {
6977 switch (jwal_file_type) {
6978 case 0x0:
6979 return ROCKSDB_NAMESPACE::WalFileType::kArchivedLogFile;
6980 case 0x1:
6981 return ROCKSDB_NAMESPACE::WalFileType::kAliveLogFile;
6982 default:
6983 // undefined/default
6984 return ROCKSDB_NAMESPACE::WalFileType::kAliveLogFile;
6985 }
6986 }
494da23a 6987};
7c673cae 6988
494da23a
TL
6989class LogFileJni : public JavaClass {
6990 public:
6991 /**
6992 * Create a new Java org.rocksdb.LogFile object.
6993 *
6994 * @param env A pointer to the Java environment
6995 * @param log_file A Cpp log file object
6996 *
6997 * @return A reference to a Java org.rocksdb.LogFile object, or
6998 * nullptr if an an exception occurs
6999 */
f67539c2
TL
7000 static jobject fromCppLogFile(JNIEnv* env,
7001 ROCKSDB_NAMESPACE::LogFile* log_file) {
494da23a
TL
7002 jclass jclazz = getJClass(env);
7003 if (jclazz == nullptr) {
7004 // exception occurred accessing class
7005 return nullptr;
7006 }
7c673cae 7007
494da23a
TL
7008 jmethodID mid = env->GetMethodID(jclazz, "<init>", "(Ljava/lang/String;JBJJ)V");
7009 if (mid == nullptr) {
7010 // exception thrown: NoSuchMethodException or OutOfMemoryError
7011 return nullptr;
7c673cae 7012 }
11fdf7f2 7013
494da23a 7014 std::string path_name = log_file->PathName();
f67539c2
TL
7015 jstring jpath_name =
7016 ROCKSDB_NAMESPACE::JniUtil::toJavaString(env, &path_name, true);
494da23a
TL
7017 if (env->ExceptionCheck()) {
7018 // exception occurred creating java string
7019 return nullptr;
11fdf7f2
TL
7020 }
7021
f67539c2
TL
7022 jobject jlog_file = env->NewObject(
7023 jclazz, mid, jpath_name, static_cast<jlong>(log_file->LogNumber()),
7024 ROCKSDB_NAMESPACE::WalFileTypeJni::toJavaWalFileType(log_file->Type()),
494da23a 7025 static_cast<jlong>(log_file->StartSequence()),
f67539c2 7026 static_cast<jlong>(log_file->SizeFileBytes()));
494da23a
TL
7027
7028 if (env->ExceptionCheck()) {
7029 env->DeleteLocalRef(jpath_name);
7030 return nullptr;
11fdf7f2 7031 }
7c673cae 7032
494da23a
TL
7033 // cleanup
7034 env->DeleteLocalRef(jpath_name);
7c673cae 7035
494da23a
TL
7036 return jlog_file;
7037 }
7c673cae 7038
494da23a
TL
7039 static jclass getJClass(JNIEnv* env) {
7040 return JavaClass::getJClass(env, "org/rocksdb/LogFile");
7041 }
7042};
7c673cae 7043
494da23a
TL
7044class LiveFileMetaDataJni : public JavaClass {
7045 public:
7046 /**
7047 * Create a new Java org.rocksdb.LiveFileMetaData object.
7048 *
7049 * @param env A pointer to the Java environment
7050 * @param live_file_meta_data A Cpp live file meta data object
7051 *
7052 * @return A reference to a Java org.rocksdb.LiveFileMetaData object, or
7053 * nullptr if an an exception occurs
7054 */
f67539c2
TL
7055 static jobject fromCppLiveFileMetaData(
7056 JNIEnv* env, ROCKSDB_NAMESPACE::LiveFileMetaData* live_file_meta_data) {
494da23a
TL
7057 jclass jclazz = getJClass(env);
7058 if (jclazz == nullptr) {
7059 // exception occurred accessing class
7060 return nullptr;
7061 }
7c673cae 7062
494da23a
TL
7063 jmethodID mid = env->GetMethodID(jclazz, "<init>", "([BILjava/lang/String;Ljava/lang/String;JJJ[B[BJZJJ)V");
7064 if (mid == nullptr) {
7065 // exception thrown: NoSuchMethodException or OutOfMemoryError
7066 return nullptr;
7067 }
11fdf7f2 7068
f67539c2 7069 jbyteArray jcolumn_family_name = ROCKSDB_NAMESPACE::JniUtil::copyBytes(
494da23a
TL
7070 env, live_file_meta_data->column_family_name);
7071 if (jcolumn_family_name == nullptr) {
7072 // exception occurred creating java byte array
7073 return nullptr;
7c673cae
FG
7074 }
7075
f67539c2 7076 jstring jfile_name = ROCKSDB_NAMESPACE::JniUtil::toJavaString(
494da23a
TL
7077 env, &live_file_meta_data->name, true);
7078 if (env->ExceptionCheck()) {
7079 // exception occurred creating java string
7080 env->DeleteLocalRef(jcolumn_family_name);
7081 return nullptr;
7082 }
7c673cae 7083
f67539c2 7084 jstring jpath = ROCKSDB_NAMESPACE::JniUtil::toJavaString(
494da23a
TL
7085 env, &live_file_meta_data->db_path, true);
7086 if (env->ExceptionCheck()) {
7087 // exception occurred creating java string
7088 env->DeleteLocalRef(jcolumn_family_name);
7089 env->DeleteLocalRef(jfile_name);
7090 return nullptr;
7091 }
7c673cae 7092
f67539c2 7093 jbyteArray jsmallest_key = ROCKSDB_NAMESPACE::JniUtil::copyBytes(
494da23a
TL
7094 env, live_file_meta_data->smallestkey);
7095 if (jsmallest_key == nullptr) {
7096 // exception occurred creating java byte array
7097 env->DeleteLocalRef(jcolumn_family_name);
7098 env->DeleteLocalRef(jfile_name);
7099 env->DeleteLocalRef(jpath);
7100 return nullptr;
7101 }
7c673cae 7102
f67539c2 7103 jbyteArray jlargest_key = ROCKSDB_NAMESPACE::JniUtil::copyBytes(
494da23a
TL
7104 env, live_file_meta_data->largestkey);
7105 if (jlargest_key == nullptr) {
7106 // exception occurred creating java byte array
7107 env->DeleteLocalRef(jcolumn_family_name);
7108 env->DeleteLocalRef(jfile_name);
7109 env->DeleteLocalRef(jpath);
7110 env->DeleteLocalRef(jsmallest_key);
7111 return nullptr;
7112 }
11fdf7f2 7113
494da23a
TL
7114 jobject jlive_file_meta_data = env->NewObject(jclazz, mid,
7115 jcolumn_family_name,
7116 static_cast<jint>(live_file_meta_data->level),
7117 jfile_name,
7118 jpath,
7119 static_cast<jlong>(live_file_meta_data->size),
7120 static_cast<jlong>(live_file_meta_data->smallest_seqno),
7121 static_cast<jlong>(live_file_meta_data->largest_seqno),
7122 jsmallest_key,
7123 jlargest_key,
7124 static_cast<jlong>(live_file_meta_data->num_reads_sampled),
7125 static_cast<jboolean>(live_file_meta_data->being_compacted),
7126 static_cast<jlong>(live_file_meta_data->num_entries),
7127 static_cast<jlong>(live_file_meta_data->num_deletions)
7128 );
7129
7130 if (env->ExceptionCheck()) {
7131 env->DeleteLocalRef(jcolumn_family_name);
7132 env->DeleteLocalRef(jfile_name);
7133 env->DeleteLocalRef(jpath);
7134 env->DeleteLocalRef(jsmallest_key);
7135 env->DeleteLocalRef(jlargest_key);
7136 return nullptr;
7c673cae
FG
7137 }
7138
494da23a
TL
7139 // cleanup
7140 env->DeleteLocalRef(jcolumn_family_name);
7141 env->DeleteLocalRef(jfile_name);
7142 env->DeleteLocalRef(jpath);
7143 env->DeleteLocalRef(jsmallest_key);
7144 env->DeleteLocalRef(jlargest_key);
7c673cae 7145
494da23a
TL
7146 return jlive_file_meta_data;
7147 }
7c673cae 7148
494da23a
TL
7149 static jclass getJClass(JNIEnv* env) {
7150 return JavaClass::getJClass(env, "org/rocksdb/LiveFileMetaData");
7151 }
7152};
7c673cae 7153
494da23a
TL
7154class SstFileMetaDataJni : public JavaClass {
7155 public:
7156 /**
7157 * Create a new Java org.rocksdb.SstFileMetaData object.
7158 *
7159 * @param env A pointer to the Java environment
7160 * @param sst_file_meta_data A Cpp sst file meta data object
7161 *
7162 * @return A reference to a Java org.rocksdb.SstFileMetaData object, or
7163 * nullptr if an an exception occurs
7164 */
f67539c2
TL
7165 static jobject fromCppSstFileMetaData(
7166 JNIEnv* env,
7167 const ROCKSDB_NAMESPACE::SstFileMetaData* sst_file_meta_data) {
494da23a
TL
7168 jclass jclazz = getJClass(env);
7169 if (jclazz == nullptr) {
7170 // exception occurred accessing class
7171 return nullptr;
7172 }
7c673cae 7173
494da23a
TL
7174 jmethodID mid = env->GetMethodID(jclazz, "<init>", "(Ljava/lang/String;Ljava/lang/String;JJJ[B[BJZJJ)V");
7175 if (mid == nullptr) {
7176 // exception thrown: NoSuchMethodException or OutOfMemoryError
7177 return nullptr;
7178 }
7c673cae 7179
f67539c2 7180 jstring jfile_name = ROCKSDB_NAMESPACE::JniUtil::toJavaString(
494da23a
TL
7181 env, &sst_file_meta_data->name, true);
7182 if (jfile_name == nullptr) {
7183 // exception occurred creating java byte array
7184 return nullptr;
7185 }
7c673cae 7186
f67539c2 7187 jstring jpath = ROCKSDB_NAMESPACE::JniUtil::toJavaString(
494da23a
TL
7188 env, &sst_file_meta_data->db_path, true);
7189 if (jpath == nullptr) {
7190 // exception occurred creating java byte array
7191 env->DeleteLocalRef(jfile_name);
7192 return nullptr;
7193 }
7c673cae 7194
f67539c2 7195 jbyteArray jsmallest_key = ROCKSDB_NAMESPACE::JniUtil::copyBytes(
494da23a
TL
7196 env, sst_file_meta_data->smallestkey);
7197 if (jsmallest_key == nullptr) {
7198 // exception occurred creating java byte array
7199 env->DeleteLocalRef(jfile_name);
7200 env->DeleteLocalRef(jpath);
7201 return nullptr;
7202 }
7c673cae 7203
f67539c2 7204 jbyteArray jlargest_key = ROCKSDB_NAMESPACE::JniUtil::copyBytes(
494da23a
TL
7205 env, sst_file_meta_data->largestkey);
7206 if (jlargest_key == nullptr) {
7207 // exception occurred creating java byte array
7208 env->DeleteLocalRef(jfile_name);
7209 env->DeleteLocalRef(jpath);
7210 env->DeleteLocalRef(jsmallest_key);
7211 return nullptr;
7212 }
7213
7214 jobject jsst_file_meta_data = env->NewObject(jclazz, mid,
7215 jfile_name,
7216 jpath,
7217 static_cast<jlong>(sst_file_meta_data->size),
7218 static_cast<jint>(sst_file_meta_data->smallest_seqno),
7219 static_cast<jlong>(sst_file_meta_data->largest_seqno),
7220 jsmallest_key,
7221 jlargest_key,
7222 static_cast<jlong>(sst_file_meta_data->num_reads_sampled),
7223 static_cast<jboolean>(sst_file_meta_data->being_compacted),
7224 static_cast<jlong>(sst_file_meta_data->num_entries),
7225 static_cast<jlong>(sst_file_meta_data->num_deletions)
7226 );
7227
7228 if (env->ExceptionCheck()) {
7229 env->DeleteLocalRef(jfile_name);
7230 env->DeleteLocalRef(jpath);
7231 env->DeleteLocalRef(jsmallest_key);
7232 env->DeleteLocalRef(jlargest_key);
7c673cae
FG
7233 return nullptr;
7234 }
494da23a
TL
7235
7236 // cleanup
7237 env->DeleteLocalRef(jfile_name);
7238 env->DeleteLocalRef(jpath);
7239 env->DeleteLocalRef(jsmallest_key);
7240 env->DeleteLocalRef(jlargest_key);
7241
7242 return jsst_file_meta_data;
7243 }
7244
7245 static jclass getJClass(JNIEnv* env) {
7246 return JavaClass::getJClass(env, "org/rocksdb/SstFileMetaData");
7247 }
7c673cae
FG
7248};
7249
494da23a 7250class LevelMetaDataJni : public JavaClass {
11fdf7f2
TL
7251 public:
7252 /**
494da23a 7253 * Create a new Java org.rocksdb.LevelMetaData object.
11fdf7f2
TL
7254 *
7255 * @param env A pointer to the Java environment
494da23a 7256 * @param level_meta_data A Cpp level meta data object
11fdf7f2 7257 *
494da23a
TL
7258 * @return A reference to a Java org.rocksdb.LevelMetaData object, or
7259 * nullptr if an an exception occurs
11fdf7f2 7260 */
f67539c2
TL
7261 static jobject fromCppLevelMetaData(
7262 JNIEnv* env, const ROCKSDB_NAMESPACE::LevelMetaData* level_meta_data) {
494da23a
TL
7263 jclass jclazz = getJClass(env);
7264 if (jclazz == nullptr) {
7265 // exception occurred accessing class
7266 return nullptr;
7267 }
7268
7269 jmethodID mid = env->GetMethodID(jclazz, "<init>", "(IJ[Lorg/rocksdb/SstFileMetaData;)V");
7270 if (mid == nullptr) {
7271 // exception thrown: NoSuchMethodException or OutOfMemoryError
7272 return nullptr;
7273 }
7274
7275 const jsize jlen =
7276 static_cast<jsize>(level_meta_data->files.size());
7277 jobjectArray jfiles = env->NewObjectArray(jlen, SstFileMetaDataJni::getJClass(env), nullptr);
7278 if (jfiles == nullptr) {
7279 // exception thrown: OutOfMemoryError
7280 return nullptr;
7281 }
7282
7283 jsize i = 0;
7284 for (auto it = level_meta_data->files.begin();
7285 it != level_meta_data->files.end(); ++it) {
7286 jobject jfile = SstFileMetaDataJni::fromCppSstFileMetaData(env, &(*it));
7287 if (jfile == nullptr) {
7288 // exception occurred
7289 env->DeleteLocalRef(jfiles);
7290 return nullptr;
7291 }
7292 env->SetObjectArrayElement(jfiles, i++, jfile);
7293 }
7294
7295 jobject jlevel_meta_data = env->NewObject(jclazz, mid,
7296 static_cast<jint>(level_meta_data->level),
7297 static_cast<jlong>(level_meta_data->size),
7298 jfiles
7299 );
7300
7301 if (env->ExceptionCheck()) {
7302 env->DeleteLocalRef(jfiles);
7303 return nullptr;
7304 }
7305
7306 // cleanup
7307 env->DeleteLocalRef(jfiles);
7308
7309 return jlevel_meta_data;
7310 }
7311
11fdf7f2 7312 static jclass getJClass(JNIEnv* env) {
494da23a 7313 return JavaClass::getJClass(env, "org/rocksdb/LevelMetaData");
11fdf7f2 7314 }
494da23a 7315};
11fdf7f2 7316
494da23a
TL
7317class ColumnFamilyMetaDataJni : public JavaClass {
7318 public:
11fdf7f2 7319 /**
494da23a 7320 * Create a new Java org.rocksdb.ColumnFamilyMetaData object.
11fdf7f2
TL
7321 *
7322 * @param env A pointer to the Java environment
494da23a 7323 * @param column_famly_meta_data A Cpp live file meta data object
11fdf7f2 7324 *
494da23a 7325 * @return A reference to a Java org.rocksdb.ColumnFamilyMetaData object, or
11fdf7f2
TL
7326 * nullptr if an an exception occurs
7327 */
f67539c2
TL
7328 static jobject fromCppColumnFamilyMetaData(
7329 JNIEnv* env,
7330 const ROCKSDB_NAMESPACE::ColumnFamilyMetaData* column_famly_meta_data) {
11fdf7f2
TL
7331 jclass jclazz = getJClass(env);
7332 if (jclazz == nullptr) {
7333 // exception occurred accessing class
7334 return nullptr;
7335 }
7336
494da23a 7337 jmethodID mid = env->GetMethodID(jclazz, "<init>", "(JJ[B[Lorg/rocksdb/LevelMetaData;)V");
11fdf7f2
TL
7338 if (mid == nullptr) {
7339 // exception thrown: NoSuchMethodException or OutOfMemoryError
11fdf7f2
TL
7340 return nullptr;
7341 }
7342
f67539c2 7343 jbyteArray jname = ROCKSDB_NAMESPACE::JniUtil::copyBytes(
494da23a
TL
7344 env, column_famly_meta_data->name);
7345 if (jname == nullptr) {
7346 // exception occurred creating java byte array
7347 return nullptr;
7348 }
7349
7350 const jsize jlen =
7351 static_cast<jsize>(column_famly_meta_data->levels.size());
7352 jobjectArray jlevels = env->NewObjectArray(jlen, LevelMetaDataJni::getJClass(env), nullptr);
7353 if(jlevels == nullptr) {
7354 // exception thrown: OutOfMemoryError
7355 env->DeleteLocalRef(jname);
7356 return nullptr;
7357 }
7358
7359 jsize i = 0;
7360 for (auto it = column_famly_meta_data->levels.begin();
7361 it != column_famly_meta_data->levels.end(); ++it) {
7362 jobject jlevel = LevelMetaDataJni::fromCppLevelMetaData(env, &(*it));
7363 if (jlevel == nullptr) {
7364 // exception occurred
7365 env->DeleteLocalRef(jname);
7366 env->DeleteLocalRef(jlevels);
7367 return nullptr;
7368 }
7369 env->SetObjectArrayElement(jlevels, i++, jlevel);
7370 }
7371
7372 jobject jcolumn_family_meta_data = env->NewObject(jclazz, mid,
7373 static_cast<jlong>(column_famly_meta_data->size),
7374 static_cast<jlong>(column_famly_meta_data->file_count),
7375 jname,
7376 jlevels
7377 );
7378
11fdf7f2 7379 if (env->ExceptionCheck()) {
494da23a
TL
7380 env->DeleteLocalRef(jname);
7381 env->DeleteLocalRef(jlevels);
11fdf7f2
TL
7382 return nullptr;
7383 }
7384
494da23a
TL
7385 // cleanup
7386 env->DeleteLocalRef(jname);
7387 env->DeleteLocalRef(jlevels);
7388
7389 return jcolumn_family_meta_data;
7390 }
7391
7392 static jclass getJClass(JNIEnv* env) {
7393 return JavaClass::getJClass(env, "org/rocksdb/ColumnFamilyMetaData");
11fdf7f2 7394 }
494da23a 7395};
11fdf7f2 7396
494da23a 7397// The portal class for org.rocksdb.AbstractTraceWriter
f67539c2
TL
7398class AbstractTraceWriterJni
7399 : public RocksDBNativeClass<
7400 const ROCKSDB_NAMESPACE::TraceWriterJniCallback*,
7401 AbstractTraceWriterJni> {
494da23a 7402 public:
11fdf7f2 7403 /**
494da23a
TL
7404 * Get the Java Class org.rocksdb.AbstractTraceWriter
7405 *
7406 * @param env A pointer to the Java environment
7407 *
7408 * @return The Java Class or nullptr if one of the
7409 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
7410 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
7411 */
7412 static jclass getJClass(JNIEnv* env) {
7413 return RocksDBNativeClass::getJClass(env,
7414 "org/rocksdb/AbstractTraceWriter");
7415 }
7416
7417 /**
7418 * Get the Java Method: AbstractTraceWriter#write
11fdf7f2
TL
7419 *
7420 * @param env A pointer to the Java environment
7421 *
7422 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 7423 * be retrieved
11fdf7f2 7424 */
494da23a 7425 static jmethodID getWriteProxyMethodId(JNIEnv* env) {
11fdf7f2 7426 jclass jclazz = getJClass(env);
494da23a 7427 if(jclazz == nullptr) {
11fdf7f2
TL
7428 // exception occurred accessing class
7429 return nullptr;
7430 }
7431
494da23a
TL
7432 static jmethodID mid = env->GetMethodID(
7433 jclazz, "writeProxy", "(J)S");
11fdf7f2
TL
7434 assert(mid != nullptr);
7435 return mid;
7436 }
7437
7438 /**
494da23a 7439 * Get the Java Method: AbstractTraceWriter#closeWriter
11fdf7f2
TL
7440 *
7441 * @param env A pointer to the Java environment
7442 *
7443 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 7444 * be retrieved
11fdf7f2 7445 */
494da23a 7446 static jmethodID getCloseWriterProxyMethodId(JNIEnv* env) {
11fdf7f2 7447 jclass jclazz = getJClass(env);
494da23a 7448 if(jclazz == nullptr) {
11fdf7f2
TL
7449 // exception occurred accessing class
7450 return nullptr;
7451 }
7452
7453 static jmethodID mid = env->GetMethodID(
494da23a 7454 jclazz, "closeWriterProxy", "()S");
11fdf7f2
TL
7455 assert(mid != nullptr);
7456 return mid;
7457 }
11fdf7f2
TL
7458
7459 /**
494da23a 7460 * Get the Java Method: AbstractTraceWriter#getFileSize
11fdf7f2
TL
7461 *
7462 * @param env A pointer to the Java environment
7463 *
7464 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 7465 * be retrieved
11fdf7f2 7466 */
494da23a
TL
7467 static jmethodID getGetFileSizeMethodId(JNIEnv* env) {
7468 jclass jclazz = getJClass(env);
7469 if(jclazz == nullptr) {
11fdf7f2
TL
7470 // exception occurred accessing class
7471 return nullptr;
7472 }
7473
494da23a
TL
7474 static jmethodID mid = env->GetMethodID(
7475 jclazz, "getFileSize", "()J");
11fdf7f2
TL
7476 assert(mid != nullptr);
7477 return mid;
7478 }
7479};
7480
494da23a 7481// The portal class for org.rocksdb.AbstractWalFilter
f67539c2
TL
7482class AbstractWalFilterJni
7483 : public RocksDBNativeClass<const ROCKSDB_NAMESPACE::WalFilterJniCallback*,
7484 AbstractWalFilterJni> {
11fdf7f2
TL
7485 public:
7486 /**
494da23a 7487 * Get the Java Class org.rocksdb.AbstractWalFilter
11fdf7f2
TL
7488 *
7489 * @param env A pointer to the Java environment
7490 *
7491 * @return The Java Class or nullptr if one of the
7492 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
7493 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
7494 */
7495 static jclass getJClass(JNIEnv* env) {
494da23a
TL
7496 return RocksDBNativeClass::getJClass(env,
7497 "org/rocksdb/AbstractWalFilter");
11fdf7f2
TL
7498 }
7499
7500 /**
494da23a 7501 * Get the Java Method: AbstractWalFilter#columnFamilyLogNumberMap
11fdf7f2
TL
7502 *
7503 * @param env A pointer to the Java environment
7504 *
494da23a 7505 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 7506 * be retrieved
11fdf7f2 7507 */
494da23a 7508 static jmethodID getColumnFamilyLogNumberMapMethodId(JNIEnv* env) {
11fdf7f2 7509 jclass jclazz = getJClass(env);
494da23a 7510 if(jclazz == nullptr) {
11fdf7f2
TL
7511 // exception occurred accessing class
7512 return nullptr;
7513 }
7514
494da23a
TL
7515 static jmethodID mid = env->GetMethodID(
7516 jclazz, "columnFamilyLogNumberMap",
7517 "(Ljava/util/Map;Ljava/util/Map;)V");
7518 assert(mid != nullptr);
7519 return mid;
11fdf7f2
TL
7520 }
7521
7522 /**
494da23a 7523 * Get the Java Method: AbstractTraceWriter#logRecordFoundProxy
11fdf7f2 7524 *
494da23a
TL
7525 * @param env A pointer to the Java environment
7526 *
7527 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 7528 * be retrieved
11fdf7f2 7529 */
494da23a
TL
7530 static jmethodID getLogRecordFoundProxyMethodId(JNIEnv* env) {
7531 jclass jclazz = getJClass(env);
7532 if(jclazz == nullptr) {
7533 // exception occurred accessing class
7534 return nullptr;
11fdf7f2
TL
7535 }
7536
494da23a
TL
7537 static jmethodID mid = env->GetMethodID(
7538 jclazz, "logRecordFoundProxy", "(JLjava/lang/String;JJ)S");
7539 assert(mid != nullptr);
7540 return mid;
11fdf7f2 7541 }
11fdf7f2 7542
11fdf7f2 7543 /**
494da23a 7544 * Get the Java Method: AbstractTraceWriter#name
11fdf7f2
TL
7545 *
7546 * @param env A pointer to the Java environment
7547 *
494da23a 7548 * @return The Java Method ID or nullptr if the class or method id could not
20effc67 7549 * be retrieved
11fdf7f2 7550 */
494da23a 7551 static jmethodID getNameMethodId(JNIEnv* env) {
11fdf7f2 7552 jclass jclazz = getJClass(env);
494da23a 7553 if(jclazz == nullptr) {
11fdf7f2
TL
7554 // exception occurred accessing class
7555 return nullptr;
7556 }
7557
494da23a
TL
7558 static jmethodID mid = env->GetMethodID(
7559 jclazz, "name", "()Ljava/lang/String;");
7560 assert(mid != nullptr);
7561 return mid;
7562 }
7563};
11fdf7f2 7564
494da23a
TL
7565// The portal class for org.rocksdb.WalProcessingOption
7566class WalProcessingOptionJni {
7567 public:
f67539c2
TL
7568 // Returns the equivalent org.rocksdb.WalProcessingOption for the provided
7569 // C++ ROCKSDB_NAMESPACE::WalFilter::WalProcessingOption enum
7570 static jbyte toJavaWalProcessingOption(
7571 const ROCKSDB_NAMESPACE::WalFilter::WalProcessingOption&
7572 wal_processing_option) {
7573 switch (wal_processing_option) {
7574 case ROCKSDB_NAMESPACE::WalFilter::WalProcessingOption::
7575 kContinueProcessing:
7576 return 0x0;
7577 case ROCKSDB_NAMESPACE::WalFilter::WalProcessingOption::
7578 kIgnoreCurrentRecord:
7579 return 0x1;
7580 case ROCKSDB_NAMESPACE::WalFilter::WalProcessingOption::kStopReplay:
7581 return 0x2;
7582 case ROCKSDB_NAMESPACE::WalFilter::WalProcessingOption::kCorruptedRecord:
7583 return 0x3;
7584 default:
7585 return 0x7F; // undefined
7586 }
7587 }
11fdf7f2 7588
f67539c2
TL
7589 // Returns the equivalent C++
7590 // ROCKSDB_NAMESPACE::WalFilter::WalProcessingOption enum for the provided
7591 // Java org.rocksdb.WalProcessingOption
7592 static ROCKSDB_NAMESPACE::WalFilter::WalProcessingOption
7593 toCppWalProcessingOption(jbyte jwal_processing_option) {
7594 switch (jwal_processing_option) {
7595 case 0x0:
7596 return ROCKSDB_NAMESPACE::WalFilter::WalProcessingOption::
7597 kContinueProcessing;
7598 case 0x1:
7599 return ROCKSDB_NAMESPACE::WalFilter::WalProcessingOption::
7600 kIgnoreCurrentRecord;
7601 case 0x2:
7602 return ROCKSDB_NAMESPACE::WalFilter::WalProcessingOption::kStopReplay;
7603 case 0x3:
7604 return ROCKSDB_NAMESPACE::WalFilter::WalProcessingOption::
7605 kCorruptedRecord;
7606 default:
7607 // undefined/default
7608 return ROCKSDB_NAMESPACE::WalFilter::WalProcessingOption::
7609 kCorruptedRecord;
7610 }
7611 }
7612};
7613
7614// The portal class for org.rocksdb.ReusedSynchronisationType
7615class ReusedSynchronisationTypeJni {
7616 public:
7617 // Returns the equivalent org.rocksdb.ReusedSynchronisationType for the
7618 // provided C++ ROCKSDB_NAMESPACE::ReusedSynchronisationType enum
7619 static jbyte toJavaReusedSynchronisationType(
7620 const ROCKSDB_NAMESPACE::ReusedSynchronisationType&
7621 reused_synchronisation_type) {
7622 switch(reused_synchronisation_type) {
7623 case ROCKSDB_NAMESPACE::ReusedSynchronisationType::MUTEX:
7624 return 0x0;
7625 case ROCKSDB_NAMESPACE::ReusedSynchronisationType::ADAPTIVE_MUTEX:
7626 return 0x1;
7627 case ROCKSDB_NAMESPACE::ReusedSynchronisationType::THREAD_LOCAL:
7628 return 0x2;
7629 default:
7630 return 0x7F; // undefined
7631 }
7632 }
7633
7634 // Returns the equivalent C++ ROCKSDB_NAMESPACE::ReusedSynchronisationType
7635 // enum for the provided Java org.rocksdb.ReusedSynchronisationType
7636 static ROCKSDB_NAMESPACE::ReusedSynchronisationType
7637 toCppReusedSynchronisationType(jbyte reused_synchronisation_type) {
7638 switch(reused_synchronisation_type) {
7639 case 0x0:
7640 return ROCKSDB_NAMESPACE::ReusedSynchronisationType::MUTEX;
7641 case 0x1:
7642 return ROCKSDB_NAMESPACE::ReusedSynchronisationType::ADAPTIVE_MUTEX;
7643 case 0x2:
7644 return ROCKSDB_NAMESPACE::ReusedSynchronisationType::THREAD_LOCAL;
7645 default:
7646 // undefined/default
7647 return ROCKSDB_NAMESPACE::ReusedSynchronisationType::ADAPTIVE_MUTEX;
7648 }
7649 }
11fdf7f2 7650};
20effc67
TL
7651// The portal class for org.rocksdb.SanityLevel
7652class SanityLevelJni {
7653 public:
7654 // Returns the equivalent org.rocksdb.SanityLevel for the provided
7655 // C++ ROCKSDB_NAMESPACE::ConfigOptions::SanityLevel enum
7656 static jbyte toJavaSanityLevel(
7657 const ROCKSDB_NAMESPACE::ConfigOptions::SanityLevel &sanity_level) {
7658 switch (sanity_level) {
7659 case ROCKSDB_NAMESPACE::ConfigOptions::SanityLevel::kSanityLevelNone:
7660 return 0x0;
7661 case ROCKSDB_NAMESPACE::ConfigOptions::SanityLevel::
7662 kSanityLevelLooselyCompatible:
7663 return 0x1;
7664 case ROCKSDB_NAMESPACE::ConfigOptions::SanityLevel::
7665 kSanityLevelExactMatch:
7666 return -0x01;
7667 default:
7668 return -0x01; // undefined
7669 }
7670 }
7671
7672 // Returns the equivalent C++ ROCKSDB_NAMESPACE::ConfigOptions::SanityLevel enum for
7673 // the provided Java org.rocksdb.SanityLevel
7674 static ROCKSDB_NAMESPACE::ConfigOptions::SanityLevel toCppSanityLevel(
7675 jbyte sanity_level) {
7676 switch (sanity_level) {
7677 case 0x0:
7678 return ROCKSDB_NAMESPACE::ConfigOptions::kSanityLevelNone;
7679 case 0x1:
7680 return ROCKSDB_NAMESPACE::ConfigOptions::kSanityLevelLooselyCompatible;
7681 default:
7682 // undefined/default
7683 return ROCKSDB_NAMESPACE::ConfigOptions::kSanityLevelExactMatch;
7684 }
7685 }
7686};
7687
7688// The portal class for org.rocksdb.AbstractListener.EnabledEventCallback
7689class EnabledEventCallbackJni {
7690 public:
7691 // Returns the set of equivalent C++
7692 // rocksdb::EnabledEventCallbackJni::EnabledEventCallback enums for
7693 // the provided Java jenabled_event_callback_values
7694 static std::set<EnabledEventCallback> toCppEnabledEventCallbacks(
7695 jlong jenabled_event_callback_values) {
7696 std::set<EnabledEventCallback> enabled_event_callbacks;
7697 for (size_t i = 0; i < EnabledEventCallback::NUM_ENABLED_EVENT_CALLBACK;
7698 ++i) {
7699 if (((1ULL << i) & jenabled_event_callback_values) > 0) {
7700 enabled_event_callbacks.emplace(static_cast<EnabledEventCallback>(i));
7701 }
7702 }
7703 return enabled_event_callbacks;
7704 }
7705};
7706
7707// The portal class for org.rocksdb.AbstractEventListener
7708class AbstractEventListenerJni
7709 : public RocksDBNativeClass<
7710 const ROCKSDB_NAMESPACE::EventListenerJniCallback*,
7711 AbstractEventListenerJni> {
7712 public:
7713 /**
7714 * Get the Java Class org.rocksdb.AbstractEventListener
7715 *
7716 * @param env A pointer to the Java environment
7717 *
7718 * @return The Java Class or nullptr if one of the
7719 * ClassFormatError, ClassCircularityError, NoClassDefFoundError,
7720 * OutOfMemoryError or ExceptionInInitializerError exceptions is thrown
7721 */
7722 static jclass getJClass(JNIEnv* env) {
7723 return RocksDBNativeClass::getJClass(env,
7724 "org/rocksdb/AbstractEventListener");
7725 }
7726
7727 /**
7728 * Get the Java Method: AbstractEventListener#onFlushCompletedProxy
7729 *
7730 * @param env A pointer to the Java environment
7731 *
7732 * @return The Java Method ID
7733 */
7734 static jmethodID getOnFlushCompletedProxyMethodId(JNIEnv* env) {
7735 jclass jclazz = getJClass(env);
7736 assert(jclazz != nullptr);
7737 static jmethodID mid = env->GetMethodID(jclazz, "onFlushCompletedProxy",
7738 "(JLorg/rocksdb/FlushJobInfo;)V");
7739 assert(mid != nullptr);
7740 return mid;
7741 }
7742
7743 /**
7744 * Get the Java Method: AbstractEventListener#onFlushBeginProxy
7745 *
7746 * @param env A pointer to the Java environment
7747 *
7748 * @return The Java Method ID
7749 */
7750 static jmethodID getOnFlushBeginProxyMethodId(JNIEnv* env) {
7751 jclass jclazz = getJClass(env);
7752 assert(jclazz != nullptr);
7753 static jmethodID mid = env->GetMethodID(jclazz, "onFlushBeginProxy",
7754 "(JLorg/rocksdb/FlushJobInfo;)V");
7755 assert(mid != nullptr);
7756 return mid;
7757 }
7758
7759 /**
7760 * Get the Java Method: AbstractEventListener#onTableFileDeleted
7761 *
7762 * @param env A pointer to the Java environment
7763 *
7764 * @return The Java Method ID
7765 */
7766 static jmethodID getOnTableFileDeletedMethodId(JNIEnv* env) {
7767 jclass jclazz = getJClass(env);
7768 assert(jclazz != nullptr);
7769 static jmethodID mid = env->GetMethodID(
7770 jclazz, "onTableFileDeleted", "(Lorg/rocksdb/TableFileDeletionInfo;)V");
7771 assert(mid != nullptr);
7772 return mid;
7773 }
7774
7775 /**
7776 * Get the Java Method: AbstractEventListener#onCompactionBeginProxy
7777 *
7778 * @param env A pointer to the Java environment
7779 *
7780 * @return The Java Method ID
7781 */
7782 static jmethodID getOnCompactionBeginProxyMethodId(JNIEnv* env) {
7783 jclass jclazz = getJClass(env);
7784 assert(jclazz != nullptr);
7785 static jmethodID mid =
7786 env->GetMethodID(jclazz, "onCompactionBeginProxy",
7787 "(JLorg/rocksdb/CompactionJobInfo;)V");
7788 assert(mid != nullptr);
7789 return mid;
7790 }
7791
7792 /**
7793 * Get the Java Method: AbstractEventListener#onCompactionCompletedProxy
7794 *
7795 * @param env A pointer to the Java environment
7796 *
7797 * @return The Java Method ID
7798 */
7799 static jmethodID getOnCompactionCompletedProxyMethodId(JNIEnv* env) {
7800 jclass jclazz = getJClass(env);
7801 assert(jclazz != nullptr);
7802 static jmethodID mid =
7803 env->GetMethodID(jclazz, "onCompactionCompletedProxy",
7804 "(JLorg/rocksdb/CompactionJobInfo;)V");
7805 assert(mid != nullptr);
7806 return mid;
7807 }
7808
7809 /**
7810 * Get the Java Method: AbstractEventListener#onTableFileCreated
7811 *
7812 * @param env A pointer to the Java environment
7813 *
7814 * @return The Java Method ID
7815 */
7816 static jmethodID getOnTableFileCreatedMethodId(JNIEnv* env) {
7817 jclass jclazz = getJClass(env);
7818 assert(jclazz != nullptr);
7819 static jmethodID mid = env->GetMethodID(
7820 jclazz, "onTableFileCreated", "(Lorg/rocksdb/TableFileCreationInfo;)V");
7821 assert(mid != nullptr);
7822 return mid;
7823 }
7824
7825 /**
7826 * Get the Java Method: AbstractEventListener#onTableFileCreationStarted
7827 *
7828 * @param env A pointer to the Java environment
7829 *
7830 * @return The Java Method ID
7831 */
7832 static jmethodID getOnTableFileCreationStartedMethodId(JNIEnv* env) {
7833 jclass jclazz = getJClass(env);
7834 assert(jclazz != nullptr);
7835 static jmethodID mid =
7836 env->GetMethodID(jclazz, "onTableFileCreationStarted",
7837 "(Lorg/rocksdb/TableFileCreationBriefInfo;)V");
7838 assert(mid != nullptr);
7839 return mid;
7840 }
7841
7842 /**
7843 * Get the Java Method: AbstractEventListener#onMemTableSealed
7844 *
7845 * @param env A pointer to the Java environment
7846 *
7847 * @return The Java Method ID
7848 */
7849 static jmethodID getOnMemTableSealedMethodId(JNIEnv* env) {
7850 jclass jclazz = getJClass(env);
7851 assert(jclazz != nullptr);
7852 static jmethodID mid = env->GetMethodID(jclazz, "onMemTableSealed",
7853 "(Lorg/rocksdb/MemTableInfo;)V");
7854 assert(mid != nullptr);
7855 return mid;
7856 }
7857
7858 /**
7859 * Get the Java Method:
7860 * AbstractEventListener#onColumnFamilyHandleDeletionStarted
7861 *
7862 * @param env A pointer to the Java environment
7863 *
7864 * @return The Java Method ID
7865 */
7866 static jmethodID getOnColumnFamilyHandleDeletionStartedMethodId(JNIEnv* env) {
7867 jclass jclazz = getJClass(env);
7868 assert(jclazz != nullptr);
7869 static jmethodID mid =
7870 env->GetMethodID(jclazz, "onColumnFamilyHandleDeletionStarted",
7871 "(Lorg/rocksdb/ColumnFamilyHandle;)V");
7872 assert(mid != nullptr);
7873 return mid;
7874 }
7875
7876 /**
7877 * Get the Java Method: AbstractEventListener#onExternalFileIngestedProxy
7878 *
7879 * @param env A pointer to the Java environment
7880 *
7881 * @return The Java Method ID
7882 */
7883 static jmethodID getOnExternalFileIngestedProxyMethodId(JNIEnv* env) {
7884 jclass jclazz = getJClass(env);
7885 assert(jclazz != nullptr);
7886 static jmethodID mid =
7887 env->GetMethodID(jclazz, "onExternalFileIngestedProxy",
7888 "(JLorg/rocksdb/ExternalFileIngestionInfo;)V");
7889 assert(mid != nullptr);
7890 return mid;
7891 }
7892
7893 /**
7894 * Get the Java Method: AbstractEventListener#onBackgroundError
7895 *
7896 * @param env A pointer to the Java environment
7897 *
7898 * @return The Java Method ID
7899 */
7900 static jmethodID getOnBackgroundErrorProxyMethodId(JNIEnv* env) {
7901 jclass jclazz = getJClass(env);
7902 assert(jclazz != nullptr);
7903 static jmethodID mid = env->GetMethodID(jclazz, "onBackgroundErrorProxy",
7904 "(BLorg/rocksdb/Status;)V");
7905 assert(mid != nullptr);
7906 return mid;
7907 }
7908
7909 /**
7910 * Get the Java Method: AbstractEventListener#onStallConditionsChanged
7911 *
7912 * @param env A pointer to the Java environment
7913 *
7914 * @return The Java Method ID
7915 */
7916 static jmethodID getOnStallConditionsChangedMethodId(JNIEnv* env) {
7917 jclass jclazz = getJClass(env);
7918 assert(jclazz != nullptr);
7919 static jmethodID mid = env->GetMethodID(jclazz, "onStallConditionsChanged",
7920 "(Lorg/rocksdb/WriteStallInfo;)V");
7921 assert(mid != nullptr);
7922 return mid;
7923 }
7924
7925 /**
7926 * Get the Java Method: AbstractEventListener#onFileReadFinish
7927 *
7928 * @param env A pointer to the Java environment
7929 *
7930 * @return The Java Method ID
7931 */
7932 static jmethodID getOnFileReadFinishMethodId(JNIEnv* env) {
7933 jclass jclazz = getJClass(env);
7934 assert(jclazz != nullptr);
7935 static jmethodID mid = env->GetMethodID(
7936 jclazz, "onFileReadFinish", "(Lorg/rocksdb/FileOperationInfo;)V");
7937 assert(mid != nullptr);
7938 return mid;
7939 }
7940
7941 /**
7942 * Get the Java Method: AbstractEventListener#onFileWriteFinish
7943 *
7944 * @param env A pointer to the Java environment
7945 *
7946 * @return The Java Method ID
7947 */
7948 static jmethodID getOnFileWriteFinishMethodId(JNIEnv* env) {
7949 jclass jclazz = getJClass(env);
7950 assert(jclazz != nullptr);
7951 static jmethodID mid = env->GetMethodID(
7952 jclazz, "onFileWriteFinish", "(Lorg/rocksdb/FileOperationInfo;)V");
7953 assert(mid != nullptr);
7954 return mid;
7955 }
7956
7957 /**
7958 * Get the Java Method: AbstractEventListener#onFileFlushFinish
7959 *
7960 * @param env A pointer to the Java environment
7961 *
7962 * @return The Java Method ID
7963 */
7964 static jmethodID getOnFileFlushFinishMethodId(JNIEnv* env) {
7965 jclass jclazz = getJClass(env);
7966 assert(jclazz != nullptr);
7967 static jmethodID mid = env->GetMethodID(
7968 jclazz, "onFileFlushFinish", "(Lorg/rocksdb/FileOperationInfo;)V");
7969 assert(mid != nullptr);
7970 return mid;
7971 }
7972
7973 /**
7974 * Get the Java Method: AbstractEventListener#onFileSyncFinish
7975 *
7976 * @param env A pointer to the Java environment
7977 *
7978 * @return The Java Method ID
7979 */
7980 static jmethodID getOnFileSyncFinishMethodId(JNIEnv* env) {
7981 jclass jclazz = getJClass(env);
7982 assert(jclazz != nullptr);
7983 static jmethodID mid = env->GetMethodID(
7984 jclazz, "onFileSyncFinish", "(Lorg/rocksdb/FileOperationInfo;)V");
7985 assert(mid != nullptr);
7986 return mid;
7987 }
7988
7989 /**
7990 * Get the Java Method: AbstractEventListener#onFileRangeSyncFinish
7991 *
7992 * @param env A pointer to the Java environment
7993 *
7994 * @return The Java Method ID
7995 */
7996 static jmethodID getOnFileRangeSyncFinishMethodId(JNIEnv* env) {
7997 jclass jclazz = getJClass(env);
7998 assert(jclazz != nullptr);
7999 static jmethodID mid = env->GetMethodID(
8000 jclazz, "onFileRangeSyncFinish", "(Lorg/rocksdb/FileOperationInfo;)V");
8001 assert(mid != nullptr);
8002 return mid;
8003 }
8004
8005 /**
8006 * Get the Java Method: AbstractEventListener#onFileTruncateFinish
8007 *
8008 * @param env A pointer to the Java environment
8009 *
8010 * @return The Java Method ID
8011 */
8012 static jmethodID getOnFileTruncateFinishMethodId(JNIEnv* env) {
8013 jclass jclazz = getJClass(env);
8014 assert(jclazz != nullptr);
8015 static jmethodID mid = env->GetMethodID(
8016 jclazz, "onFileTruncateFinish", "(Lorg/rocksdb/FileOperationInfo;)V");
8017 assert(mid != nullptr);
8018 return mid;
8019 }
8020
8021 /**
8022 * Get the Java Method: AbstractEventListener#onFileCloseFinish
8023 *
8024 * @param env A pointer to the Java environment
8025 *
8026 * @return The Java Method ID
8027 */
8028 static jmethodID getOnFileCloseFinishMethodId(JNIEnv* env) {
8029 jclass jclazz = getJClass(env);
8030 assert(jclazz != nullptr);
8031 static jmethodID mid = env->GetMethodID(
8032 jclazz, "onFileCloseFinish", "(Lorg/rocksdb/FileOperationInfo;)V");
8033 assert(mid != nullptr);
8034 return mid;
8035 }
8036
8037 /**
8038 * Get the Java Method: AbstractEventListener#shouldBeNotifiedOnFileIO
8039 *
8040 * @param env A pointer to the Java environment
8041 *
8042 * @return The Java Method ID
8043 */
8044 static jmethodID getShouldBeNotifiedOnFileIOMethodId(JNIEnv* env) {
8045 jclass jclazz = getJClass(env);
8046 assert(jclazz != nullptr);
8047 static jmethodID mid =
8048 env->GetMethodID(jclazz, "shouldBeNotifiedOnFileIO", "()Z");
8049 assert(mid != nullptr);
8050 return mid;
8051 }
8052
8053 /**
8054 * Get the Java Method: AbstractEventListener#onErrorRecoveryBeginProxy
8055 *
8056 * @param env A pointer to the Java environment
8057 *
8058 * @return The Java Method ID
8059 */
8060 static jmethodID getOnErrorRecoveryBeginProxyMethodId(JNIEnv* env) {
8061 jclass jclazz = getJClass(env);
8062 assert(jclazz != nullptr);
8063 static jmethodID mid = env->GetMethodID(jclazz, "onErrorRecoveryBeginProxy",
8064 "(BLorg/rocksdb/Status;)Z");
8065 assert(mid != nullptr);
8066 return mid;
8067 }
8068
8069 /**
8070 * Get the Java Method: AbstractEventListener#onErrorRecoveryCompleted
8071 *
8072 * @param env A pointer to the Java environment
8073 *
8074 * @return The Java Method ID
8075 */
8076 static jmethodID getOnErrorRecoveryCompletedMethodId(JNIEnv* env) {
8077 jclass jclazz = getJClass(env);
8078 assert(jclazz != nullptr);
8079 static jmethodID mid = env->GetMethodID(jclazz, "onErrorRecoveryCompleted",
8080 "(Lorg/rocksdb/Status;)V");
8081 assert(mid != nullptr);
8082 return mid;
8083 }
8084};
8085
8086class FlushJobInfoJni : public JavaClass {
8087 public:
8088 /**
8089 * Create a new Java org.rocksdb.FlushJobInfo object.
8090 *
8091 * @param env A pointer to the Java environment
8092 * @param flush_job_info A Cpp flush job info object
8093 *
8094 * @return A reference to a Java org.rocksdb.FlushJobInfo object, or
8095 * nullptr if an an exception occurs
8096 */
8097 static jobject fromCppFlushJobInfo(
8098 JNIEnv* env, const ROCKSDB_NAMESPACE::FlushJobInfo* flush_job_info) {
8099 jclass jclazz = getJClass(env);
8100 if (jclazz == nullptr) {
8101 // exception occurred accessing class
8102 return nullptr;
8103 }
8104 static jmethodID ctor = getConstructorMethodId(env, jclazz);
8105 assert(ctor != nullptr);
8106 jstring jcf_name = JniUtil::toJavaString(env, &flush_job_info->cf_name);
8107 if (env->ExceptionCheck()) {
8108 return nullptr;
8109 }
8110 jstring jfile_path = JniUtil::toJavaString(env, &flush_job_info->file_path);
8111 if (env->ExceptionCheck()) {
8112 env->DeleteLocalRef(jfile_path);
8113 return nullptr;
8114 }
8115 jobject jtable_properties = TablePropertiesJni::fromCppTableProperties(
8116 env, flush_job_info->table_properties);
8117 if (jtable_properties == nullptr) {
8118 env->DeleteLocalRef(jcf_name);
8119 env->DeleteLocalRef(jfile_path);
8120 return nullptr;
8121 }
8122 return env->NewObject(
8123 jclazz, ctor, static_cast<jlong>(flush_job_info->cf_id), jcf_name,
8124 jfile_path, static_cast<jlong>(flush_job_info->thread_id),
8125 static_cast<jint>(flush_job_info->job_id),
8126 static_cast<jboolean>(flush_job_info->triggered_writes_slowdown),
8127 static_cast<jboolean>(flush_job_info->triggered_writes_stop),
8128 static_cast<jlong>(flush_job_info->smallest_seqno),
8129 static_cast<jlong>(flush_job_info->largest_seqno), jtable_properties,
8130 static_cast<jbyte>(flush_job_info->flush_reason));
8131 }
8132
8133 static jclass getJClass(JNIEnv* env) {
8134 return JavaClass::getJClass(env, "org/rocksdb/FlushJobInfo");
8135 }
8136
8137 static jmethodID getConstructorMethodId(JNIEnv* env, jclass clazz) {
8138 return env->GetMethodID(clazz, "<init>",
8139 "(JLjava/lang/String;Ljava/lang/String;JIZZJJLorg/"
8140 "rocksdb/TableProperties;B)V");
8141 }
8142};
8143
8144class TableFileDeletionInfoJni : public JavaClass {
8145 public:
8146 /**
8147 * Create a new Java org.rocksdb.TableFileDeletionInfo object.
8148 *
8149 * @param env A pointer to the Java environment
8150 * @param file_del_info A Cpp table file deletion info object
8151 *
8152 * @return A reference to a Java org.rocksdb.TableFileDeletionInfo object, or
8153 * nullptr if an an exception occurs
8154 */
8155 static jobject fromCppTableFileDeletionInfo(
8156 JNIEnv* env,
8157 const ROCKSDB_NAMESPACE::TableFileDeletionInfo* file_del_info) {
8158 jclass jclazz = getJClass(env);
8159 if (jclazz == nullptr) {
8160 // exception occurred accessing class
8161 return nullptr;
8162 }
8163 static jmethodID ctor = getConstructorMethodId(env, jclazz);
8164 assert(ctor != nullptr);
8165 jstring jdb_name = JniUtil::toJavaString(env, &file_del_info->db_name);
8166 if (env->ExceptionCheck()) {
8167 return nullptr;
8168 }
8169 jobject jstatus = StatusJni::construct(env, file_del_info->status);
8170 if (jstatus == nullptr) {
8171 env->DeleteLocalRef(jdb_name);
8172 return nullptr;
8173 }
8174 return env->NewObject(jclazz, ctor, jdb_name,
8175 JniUtil::toJavaString(env, &file_del_info->file_path),
8176 static_cast<jint>(file_del_info->job_id), jstatus);
8177 }
8178
8179 static jclass getJClass(JNIEnv* env) {
8180 return JavaClass::getJClass(env, "org/rocksdb/TableFileDeletionInfo");
8181 }
8182
8183 static jmethodID getConstructorMethodId(JNIEnv* env, jclass clazz) {
8184 return env->GetMethodID(
8185 clazz, "<init>",
8186 "(Ljava/lang/String;Ljava/lang/String;ILorg/rocksdb/Status;)V");
8187 }
8188};
8189
8190class CompactionJobInfoJni : public JavaClass {
8191 public:
8192 static jobject fromCppCompactionJobInfo(
8193 JNIEnv* env,
8194 const ROCKSDB_NAMESPACE::CompactionJobInfo* compaction_job_info) {
8195 jclass jclazz = getJClass(env);
8196 assert(jclazz != nullptr);
8197 static jmethodID ctor = getConstructorMethodId(env, jclazz);
8198 assert(ctor != nullptr);
8199 return env->NewObject(jclazz, ctor,
8200 reinterpret_cast<jlong>(compaction_job_info));
8201 }
8202
8203 static jclass getJClass(JNIEnv* env) {
8204 return JavaClass::getJClass(env, "org/rocksdb/CompactionJobInfo");
8205 }
8206
8207 static jmethodID getConstructorMethodId(JNIEnv* env, jclass clazz) {
8208 return env->GetMethodID(clazz, "<init>", "(J)V");
8209 }
8210};
8211
8212class TableFileCreationInfoJni : public JavaClass {
8213 public:
8214 static jobject fromCppTableFileCreationInfo(
8215 JNIEnv* env, const ROCKSDB_NAMESPACE::TableFileCreationInfo* info) {
8216 jclass jclazz = getJClass(env);
8217 assert(jclazz != nullptr);
8218 static jmethodID ctor = getConstructorMethodId(env, jclazz);
8219 assert(ctor != nullptr);
8220 jstring jdb_name = JniUtil::toJavaString(env, &info->db_name);
8221 if (env->ExceptionCheck()) {
8222 return nullptr;
8223 }
8224 jstring jcf_name = JniUtil::toJavaString(env, &info->cf_name);
8225 if (env->ExceptionCheck()) {
8226 env->DeleteLocalRef(jdb_name);
8227 return nullptr;
8228 }
8229 jstring jfile_path = JniUtil::toJavaString(env, &info->file_path);
8230 if (env->ExceptionCheck()) {
8231 env->DeleteLocalRef(jdb_name);
8232 env->DeleteLocalRef(jcf_name);
8233 return nullptr;
8234 }
8235 jobject jtable_properties =
8236 TablePropertiesJni::fromCppTableProperties(env, info->table_properties);
8237 if (jtable_properties == nullptr) {
8238 env->DeleteLocalRef(jdb_name);
8239 env->DeleteLocalRef(jcf_name);
8240 return nullptr;
8241 }
8242 jobject jstatus = StatusJni::construct(env, info->status);
8243 if (jstatus == nullptr) {
8244 env->DeleteLocalRef(jdb_name);
8245 env->DeleteLocalRef(jcf_name);
8246 env->DeleteLocalRef(jtable_properties);
8247 return nullptr;
8248 }
8249 return env->NewObject(jclazz, ctor, static_cast<jlong>(info->file_size),
8250 jtable_properties, jstatus, jdb_name, jcf_name,
8251 jfile_path, static_cast<jint>(info->job_id),
8252 static_cast<jbyte>(info->reason));
8253 }
8254
8255 static jclass getJClass(JNIEnv* env) {
8256 return JavaClass::getJClass(env, "org/rocksdb/TableFileCreationInfo");
8257 }
8258
8259 static jmethodID getConstructorMethodId(JNIEnv* env, jclass clazz) {
8260 return env->GetMethodID(
8261 clazz, "<init>",
8262 "(JLorg/rocksdb/TableProperties;Lorg/rocksdb/Status;Ljava/lang/"
8263 "String;Ljava/lang/String;Ljava/lang/String;IB)V");
8264 }
8265};
8266
8267class TableFileCreationBriefInfoJni : public JavaClass {
8268 public:
8269 static jobject fromCppTableFileCreationBriefInfo(
8270 JNIEnv* env, const ROCKSDB_NAMESPACE::TableFileCreationBriefInfo* info) {
8271 jclass jclazz = getJClass(env);
8272 assert(jclazz != nullptr);
8273 static jmethodID ctor = getConstructorMethodId(env, jclazz);
8274 assert(ctor != nullptr);
8275 jstring jdb_name = JniUtil::toJavaString(env, &info->db_name);
8276 if (env->ExceptionCheck()) {
8277 return nullptr;
8278 }
8279 jstring jcf_name = JniUtil::toJavaString(env, &info->cf_name);
8280 if (env->ExceptionCheck()) {
8281 env->DeleteLocalRef(jdb_name);
8282 return nullptr;
8283 }
8284 jstring jfile_path = JniUtil::toJavaString(env, &info->file_path);
8285 if (env->ExceptionCheck()) {
8286 env->DeleteLocalRef(jdb_name);
8287 env->DeleteLocalRef(jcf_name);
8288 return nullptr;
8289 }
8290 return env->NewObject(jclazz, ctor, jdb_name, jcf_name, jfile_path,
8291 static_cast<jint>(info->job_id),
8292 static_cast<jbyte>(info->reason));
8293 }
8294
8295 static jclass getJClass(JNIEnv* env) {
8296 return JavaClass::getJClass(env, "org/rocksdb/TableFileCreationBriefInfo");
8297 }
8298
8299 static jmethodID getConstructorMethodId(JNIEnv* env, jclass clazz) {
8300 return env->GetMethodID(
8301 clazz, "<init>",
8302 "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IB)V");
8303 }
8304};
8305
8306class MemTableInfoJni : public JavaClass {
8307 public:
8308 static jobject fromCppMemTableInfo(
8309 JNIEnv* env, const ROCKSDB_NAMESPACE::MemTableInfo* info) {
8310 jclass jclazz = getJClass(env);
8311 assert(jclazz != nullptr);
8312 static jmethodID ctor = getConstructorMethodId(env, jclazz);
8313 assert(ctor != nullptr);
8314 jstring jcf_name = JniUtil::toJavaString(env, &info->cf_name);
8315 if (env->ExceptionCheck()) {
8316 return nullptr;
8317 }
8318 return env->NewObject(jclazz, ctor, jcf_name,
8319 static_cast<jlong>(info->first_seqno),
8320 static_cast<jlong>(info->earliest_seqno),
8321 static_cast<jlong>(info->num_entries),
8322 static_cast<jlong>(info->num_deletes));
8323 }
8324
8325 static jclass getJClass(JNIEnv* env) {
8326 return JavaClass::getJClass(env, "org/rocksdb/MemTableInfo");
8327 }
8328
8329 static jmethodID getConstructorMethodId(JNIEnv* env, jclass clazz) {
8330 return env->GetMethodID(clazz, "<init>", "(Ljava/lang/String;JJJJ)V");
8331 }
8332};
8333
8334class ExternalFileIngestionInfoJni : public JavaClass {
8335 public:
8336 static jobject fromCppExternalFileIngestionInfo(
8337 JNIEnv* env, const ROCKSDB_NAMESPACE::ExternalFileIngestionInfo* info) {
8338 jclass jclazz = getJClass(env);
8339 assert(jclazz != nullptr);
8340 static jmethodID ctor = getConstructorMethodId(env, jclazz);
8341 assert(ctor != nullptr);
8342 jstring jcf_name = JniUtil::toJavaString(env, &info->cf_name);
8343 if (env->ExceptionCheck()) {
8344 return nullptr;
8345 }
8346 jstring jexternal_file_path =
8347 JniUtil::toJavaString(env, &info->external_file_path);
8348 if (env->ExceptionCheck()) {
8349 env->DeleteLocalRef(jcf_name);
8350 return nullptr;
8351 }
8352 jstring jinternal_file_path =
8353 JniUtil::toJavaString(env, &info->internal_file_path);
8354 if (env->ExceptionCheck()) {
8355 env->DeleteLocalRef(jcf_name);
8356 env->DeleteLocalRef(jexternal_file_path);
8357 return nullptr;
8358 }
8359 jobject jtable_properties =
8360 TablePropertiesJni::fromCppTableProperties(env, info->table_properties);
8361 if (jtable_properties == nullptr) {
8362 env->DeleteLocalRef(jcf_name);
8363 env->DeleteLocalRef(jexternal_file_path);
8364 env->DeleteLocalRef(jinternal_file_path);
8365 return nullptr;
8366 }
8367 return env->NewObject(
8368 jclazz, ctor, jcf_name, jexternal_file_path, jinternal_file_path,
8369 static_cast<jlong>(info->global_seqno), jtable_properties);
8370 }
8371
8372 static jclass getJClass(JNIEnv* env) {
8373 return JavaClass::getJClass(env, "org/rocksdb/ExternalFileIngestionInfo");
8374 }
8375
8376 static jmethodID getConstructorMethodId(JNIEnv* env, jclass clazz) {
8377 return env->GetMethodID(clazz, "<init>",
8378 "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/"
8379 "String;JLorg/rocksdb/TableProperties;)V");
8380 }
8381};
8382
8383class WriteStallInfoJni : public JavaClass {
8384 public:
8385 static jobject fromCppWriteStallInfo(
8386 JNIEnv* env, const ROCKSDB_NAMESPACE::WriteStallInfo* info) {
8387 jclass jclazz = getJClass(env);
8388 assert(jclazz != nullptr);
8389 static jmethodID ctor = getConstructorMethodId(env, jclazz);
8390 assert(ctor != nullptr);
8391 jstring jcf_name = JniUtil::toJavaString(env, &info->cf_name);
8392 if (env->ExceptionCheck()) {
8393 return nullptr;
8394 }
8395 return env->NewObject(jclazz, ctor, jcf_name,
8396 static_cast<jbyte>(info->condition.cur),
8397 static_cast<jbyte>(info->condition.prev));
8398 }
8399
8400 static jclass getJClass(JNIEnv* env) {
8401 return JavaClass::getJClass(env, "org/rocksdb/WriteStallInfo");
8402 }
8403
8404 static jmethodID getConstructorMethodId(JNIEnv* env, jclass clazz) {
8405 return env->GetMethodID(clazz, "<init>", "(Ljava/lang/String;BB)V");
8406 }
8407};
8408
8409class FileOperationInfoJni : public JavaClass {
8410 public:
8411 static jobject fromCppFileOperationInfo(
8412 JNIEnv* env, const ROCKSDB_NAMESPACE::FileOperationInfo* info) {
8413 jclass jclazz = getJClass(env);
8414 assert(jclazz != nullptr);
8415 static jmethodID ctor = getConstructorMethodId(env, jclazz);
8416 assert(ctor != nullptr);
8417 jstring jpath = JniUtil::toJavaString(env, &info->path);
8418 if (env->ExceptionCheck()) {
8419 return nullptr;
8420 }
8421 jobject jstatus = StatusJni::construct(env, info->status);
8422 if (jstatus == nullptr) {
8423 env->DeleteLocalRef(jpath);
8424 return nullptr;
8425 }
8426 return env->NewObject(
8427 jclazz, ctor, jpath, static_cast<jlong>(info->offset),
8428 static_cast<jlong>(info->length),
8429 static_cast<jlong>(info->start_ts.time_since_epoch().count()),
8430 static_cast<jlong>(info->duration.count()), jstatus);
8431 }
8432
8433 static jclass getJClass(JNIEnv* env) {
8434 return JavaClass::getJClass(env, "org/rocksdb/FileOperationInfo");
8435 }
8436
8437 static jmethodID getConstructorMethodId(JNIEnv* env, jclass clazz) {
8438 return env->GetMethodID(clazz, "<init>",
8439 "(Ljava/lang/String;JJJJLorg/rocksdb/Status;)V");
8440 }
8441};
f67539c2 8442} // namespace ROCKSDB_NAMESPACE
7c673cae 8443#endif // JAVA_ROCKSJNI_PORTAL_H_