]> git.proxmox.com Git - ceph.git/blame - ceph/src/rocksdb/java/rocksjni/transaction.cc
import quincy beta 17.1.0
[ceph.git] / ceph / src / rocksdb / java / rocksjni / transaction.cc
CommitLineData
11fdf7f2
TL
1// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
2// This source code is licensed under both the GPLv2 (found in the
3// COPYING file in the root directory) and Apache 2.0 License
4// (found in the LICENSE.Apache file in the root directory).
5//
6// This file implements the "bridge" between Java and C++
f67539c2 7// for ROCKSDB_NAMESPACE::Transaction.
11fdf7f2
TL
8
9#include <jni.h>
10#include <functional>
11
12#include "include/org_rocksdb_Transaction.h"
13
14#include "rocksdb/utilities/transaction.h"
15#include "rocksjni/portal.h"
16
17using namespace std::placeholders;
18
19#if defined(_MSC_VER)
20#pragma warning(push)
21#pragma warning(disable : 4503) // identifier' : decorated name length
22 // exceeded, name was truncated
23#endif
24
25/*
26 * Class: org_rocksdb_Transaction
27 * Method: setSnapshot
28 * Signature: (J)V
29 */
30void Java_org_rocksdb_Transaction_setSnapshot(JNIEnv* /*env*/, jobject /*jobj*/,
31 jlong jhandle) {
f67539c2 32 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2
TL
33 txn->SetSnapshot();
34}
35
36/*
37 * Class: org_rocksdb_Transaction
38 * Method: setSnapshotOnNextOperation
39 * Signature: (J)V
40 */
41void Java_org_rocksdb_Transaction_setSnapshotOnNextOperation__J(
42 JNIEnv* /*env*/, jobject /*jobj*/, jlong jhandle) {
f67539c2 43 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2
TL
44 txn->SetSnapshotOnNextOperation(nullptr);
45}
46
47/*
48 * Class: org_rocksdb_Transaction
49 * Method: setSnapshotOnNextOperation
50 * Signature: (JJ)V
51 */
52void Java_org_rocksdb_Transaction_setSnapshotOnNextOperation__JJ(
53 JNIEnv* /*env*/, jobject /*jobj*/, jlong jhandle,
54 jlong jtxn_notifier_handle) {
f67539c2
TL
55 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
56 auto* txn_notifier = reinterpret_cast<
57 std::shared_ptr<ROCKSDB_NAMESPACE::TransactionNotifierJniCallback>*>(
58 jtxn_notifier_handle);
11fdf7f2
TL
59 txn->SetSnapshotOnNextOperation(*txn_notifier);
60}
61
62/*
63 * Class: org_rocksdb_Transaction
64 * Method: getSnapshot
65 * Signature: (J)J
66 */
67jlong Java_org_rocksdb_Transaction_getSnapshot(JNIEnv* /*env*/,
68 jobject /*jobj*/,
69 jlong jhandle) {
f67539c2
TL
70 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
71 const ROCKSDB_NAMESPACE::Snapshot* snapshot = txn->GetSnapshot();
11fdf7f2
TL
72 return reinterpret_cast<jlong>(snapshot);
73}
74
75/*
76 * Class: org_rocksdb_Transaction
77 * Method: clearSnapshot
78 * Signature: (J)V
79 */
80void Java_org_rocksdb_Transaction_clearSnapshot(JNIEnv* /*env*/,
81 jobject /*jobj*/,
82 jlong jhandle) {
f67539c2 83 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2
TL
84 txn->ClearSnapshot();
85}
86
87/*
88 * Class: org_rocksdb_Transaction
89 * Method: prepare
90 * Signature: (J)V
91 */
92void Java_org_rocksdb_Transaction_prepare(JNIEnv* env, jobject /*jobj*/,
93 jlong jhandle) {
f67539c2
TL
94 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
95 ROCKSDB_NAMESPACE::Status s = txn->Prepare();
11fdf7f2 96 if (!s.ok()) {
f67539c2 97 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
11fdf7f2
TL
98 }
99}
100
101/*
102 * Class: org_rocksdb_Transaction
103 * Method: commit
104 * Signature: (J)V
105 */
106void Java_org_rocksdb_Transaction_commit(JNIEnv* env, jobject /*jobj*/,
107 jlong jhandle) {
f67539c2
TL
108 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
109 ROCKSDB_NAMESPACE::Status s = txn->Commit();
11fdf7f2 110 if (!s.ok()) {
f67539c2 111 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
11fdf7f2
TL
112 }
113}
114
115/*
116 * Class: org_rocksdb_Transaction
117 * Method: rollback
118 * Signature: (J)V
119 */
120void Java_org_rocksdb_Transaction_rollback(JNIEnv* env, jobject /*jobj*/,
121 jlong jhandle) {
f67539c2
TL
122 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
123 ROCKSDB_NAMESPACE::Status s = txn->Rollback();
11fdf7f2 124 if (!s.ok()) {
f67539c2 125 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
11fdf7f2
TL
126 }
127}
128
129/*
130 * Class: org_rocksdb_Transaction
131 * Method: setSavePoint
132 * Signature: (J)V
133 */
134void Java_org_rocksdb_Transaction_setSavePoint(JNIEnv* /*env*/,
135 jobject /*jobj*/,
136 jlong jhandle) {
f67539c2 137 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2
TL
138 txn->SetSavePoint();
139}
140
141/*
142 * Class: org_rocksdb_Transaction
143 * Method: rollbackToSavePoint
144 * Signature: (J)V
145 */
146void Java_org_rocksdb_Transaction_rollbackToSavePoint(JNIEnv* env,
147 jobject /*jobj*/,
148 jlong jhandle) {
f67539c2
TL
149 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
150 ROCKSDB_NAMESPACE::Status s = txn->RollbackToSavePoint();
11fdf7f2 151 if (!s.ok()) {
f67539c2 152 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
11fdf7f2
TL
153 }
154}
155
f67539c2
TL
156typedef std::function<ROCKSDB_NAMESPACE::Status(
157 const ROCKSDB_NAMESPACE::ReadOptions&, const ROCKSDB_NAMESPACE::Slice&,
158 std::string*)>
11fdf7f2
TL
159 FnGet;
160
161// TODO(AR) consider refactoring to share this between here and rocksjni.cc
162jbyteArray txn_get_helper(JNIEnv* env, const FnGet& fn_get,
163 const jlong& jread_options_handle,
164 const jbyteArray& jkey, const jint& jkey_part_len) {
165 jbyte* key = env->GetByteArrayElements(jkey, nullptr);
166 if (key == nullptr) {
167 // exception thrown: OutOfMemoryError
168 return nullptr;
169 }
f67539c2
TL
170 ROCKSDB_NAMESPACE::Slice key_slice(reinterpret_cast<char*>(key),
171 jkey_part_len);
11fdf7f2
TL
172
173 auto* read_options =
f67539c2 174 reinterpret_cast<ROCKSDB_NAMESPACE::ReadOptions*>(jread_options_handle);
11fdf7f2 175 std::string value;
f67539c2 176 ROCKSDB_NAMESPACE::Status s = fn_get(*read_options, key_slice, &value);
11fdf7f2
TL
177
178 // trigger java unref on key.
179 // by passing JNI_ABORT, it will simply release the reference without
180 // copying the result back to the java byte array.
181 env->ReleaseByteArrayElements(jkey, key, JNI_ABORT);
182
183 if (s.IsNotFound()) {
184 return nullptr;
185 }
186
187 if (s.ok()) {
188 jbyteArray jret_value = env->NewByteArray(static_cast<jsize>(value.size()));
189 if (jret_value == nullptr) {
190 // exception thrown: OutOfMemoryError
191 return nullptr;
192 }
193 env->SetByteArrayRegion(jret_value, 0, static_cast<jsize>(value.size()),
194 const_cast<jbyte*>(reinterpret_cast<const jbyte*>(value.c_str())));
195 if (env->ExceptionCheck()) {
196 // exception thrown: ArrayIndexOutOfBoundsException
197 return nullptr;
198 }
199 return jret_value;
200 }
201
f67539c2 202 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
11fdf7f2
TL
203 return nullptr;
204}
205
206/*
207 * Class: org_rocksdb_Transaction
208 * Method: get
209 * Signature: (JJ[BIJ)[B
210 */
211jbyteArray Java_org_rocksdb_Transaction_get__JJ_3BIJ(
212 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jlong jread_options_handle,
213 jbyteArray jkey, jint jkey_part_len, jlong jcolumn_family_handle) {
f67539c2 214 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2 215 auto* column_family_handle =
f67539c2
TL
216 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(
217 jcolumn_family_handle);
218 FnGet fn_get =
219 std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
220 const ROCKSDB_NAMESPACE::ReadOptions&,
221 ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
222 const ROCKSDB_NAMESPACE::Slice&, std::string*)>(
223 &ROCKSDB_NAMESPACE::Transaction::Get, txn, _1, column_family_handle,
224 _2, _3);
11fdf7f2
TL
225 return txn_get_helper(env, fn_get, jread_options_handle, jkey, jkey_part_len);
226}
227
228/*
229 * Class: org_rocksdb_Transaction
230 * Method: get
231 * Signature: (JJ[BI)[B
232 */
233jbyteArray Java_org_rocksdb_Transaction_get__JJ_3BI(
234 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jlong jread_options_handle,
235 jbyteArray jkey, jint jkey_part_len) {
f67539c2
TL
236 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
237 FnGet fn_get =
238 std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
239 const ROCKSDB_NAMESPACE::ReadOptions&,
240 const ROCKSDB_NAMESPACE::Slice&, std::string*)>(
241 &ROCKSDB_NAMESPACE::Transaction::Get, txn, _1, _2, _3);
11fdf7f2
TL
242 return txn_get_helper(env, fn_get, jread_options_handle, jkey, jkey_part_len);
243}
244
245// TODO(AR) consider refactoring to share this between here and rocksjni.cc
246// used by txn_multi_get_helper below
f67539c2 247std::vector<ROCKSDB_NAMESPACE::ColumnFamilyHandle*> txn_column_families_helper(
11fdf7f2 248 JNIEnv* env, jlongArray jcolumn_family_handles, bool* has_exception) {
f67539c2 249 std::vector<ROCKSDB_NAMESPACE::ColumnFamilyHandle*> cf_handles;
11fdf7f2
TL
250 if (jcolumn_family_handles != nullptr) {
251 const jsize len_cols = env->GetArrayLength(jcolumn_family_handles);
252 if (len_cols > 0) {
253 if (env->EnsureLocalCapacity(len_cols) != 0) {
254 // out of memory
255 *has_exception = JNI_TRUE;
f67539c2 256 return std::vector<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>();
11fdf7f2
TL
257 }
258
259 jlong* jcfh = env->GetLongArrayElements(jcolumn_family_handles, nullptr);
260 if (jcfh == nullptr) {
261 // exception thrown: OutOfMemoryError
262 *has_exception = JNI_TRUE;
f67539c2 263 return std::vector<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>();
11fdf7f2
TL
264 }
265 for (int i = 0; i < len_cols; i++) {
266 auto* cf_handle =
f67539c2 267 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcfh[i]);
11fdf7f2
TL
268 cf_handles.push_back(cf_handle);
269 }
270 env->ReleaseLongArrayElements(jcolumn_family_handles, jcfh, JNI_ABORT);
271 }
272 }
273 return cf_handles;
274}
275
f67539c2
TL
276typedef std::function<std::vector<ROCKSDB_NAMESPACE::Status>(
277 const ROCKSDB_NAMESPACE::ReadOptions&,
278 const std::vector<ROCKSDB_NAMESPACE::Slice>&, std::vector<std::string>*)>
11fdf7f2
TL
279 FnMultiGet;
280
281void free_parts(
282 JNIEnv* env,
283 std::vector<std::tuple<jbyteArray, jbyte*, jobject>>& parts_to_free) {
284 for (auto& value : parts_to_free) {
285 jobject jk;
286 jbyteArray jk_ba;
287 jbyte* jk_val;
288 std::tie(jk_ba, jk_val, jk) = value;
289 env->ReleaseByteArrayElements(jk_ba, jk_val, JNI_ABORT);
290 env->DeleteLocalRef(jk);
291 }
292}
293
294// TODO(AR) consider refactoring to share this between here and rocksjni.cc
295// cf multi get
296jobjectArray txn_multi_get_helper(JNIEnv* env, const FnMultiGet& fn_multi_get,
297 const jlong& jread_options_handle,
298 const jobjectArray& jkey_parts) {
299 const jsize len_key_parts = env->GetArrayLength(jkey_parts);
300 if (env->EnsureLocalCapacity(len_key_parts) != 0) {
301 // out of memory
302 return nullptr;
303 }
304
f67539c2 305 std::vector<ROCKSDB_NAMESPACE::Slice> key_parts;
11fdf7f2
TL
306 std::vector<std::tuple<jbyteArray, jbyte*, jobject>> key_parts_to_free;
307 for (int i = 0; i < len_key_parts; i++) {
308 const jobject jk = env->GetObjectArrayElement(jkey_parts, i);
309 if (env->ExceptionCheck()) {
310 // exception thrown: ArrayIndexOutOfBoundsException
311 free_parts(env, key_parts_to_free);
312 return nullptr;
313 }
314 jbyteArray jk_ba = reinterpret_cast<jbyteArray>(jk);
315 const jsize len_key = env->GetArrayLength(jk_ba);
316 if (env->EnsureLocalCapacity(len_key) != 0) {
317 // out of memory
318 env->DeleteLocalRef(jk);
319 free_parts(env, key_parts_to_free);
320 return nullptr;
321 }
322 jbyte* jk_val = env->GetByteArrayElements(jk_ba, nullptr);
323 if (jk_val == nullptr) {
324 // exception thrown: OutOfMemoryError
325 env->DeleteLocalRef(jk);
326 free_parts(env, key_parts_to_free);
327 return nullptr;
328 }
329
f67539c2
TL
330 ROCKSDB_NAMESPACE::Slice key_slice(reinterpret_cast<char*>(jk_val),
331 len_key);
11fdf7f2
TL
332 key_parts.push_back(key_slice);
333
334 key_parts_to_free.push_back(std::make_tuple(jk_ba, jk_val, jk));
335 }
336
337 auto* read_options =
f67539c2 338 reinterpret_cast<ROCKSDB_NAMESPACE::ReadOptions*>(jread_options_handle);
11fdf7f2 339 std::vector<std::string> value_parts;
f67539c2 340 std::vector<ROCKSDB_NAMESPACE::Status> s =
11fdf7f2
TL
341 fn_multi_get(*read_options, key_parts, &value_parts);
342
343 // free up allocated byte arrays
344 free_parts(env, key_parts_to_free);
345
346 // prepare the results
347 const jclass jcls_ba = env->FindClass("[B");
348 jobjectArray jresults =
349 env->NewObjectArray(static_cast<jsize>(s.size()), jcls_ba, nullptr);
350 if (jresults == nullptr) {
351 // exception thrown: OutOfMemoryError
352 return nullptr;
353 }
354
355 // add to the jresults
f67539c2
TL
356 for (std::vector<ROCKSDB_NAMESPACE::Status>::size_type i = 0; i != s.size();
357 i++) {
11fdf7f2
TL
358 if (s[i].ok()) {
359 jbyteArray jentry_value =
360 env->NewByteArray(static_cast<jsize>(value_parts[i].size()));
361 if (jentry_value == nullptr) {
362 // exception thrown: OutOfMemoryError
363 return nullptr;
364 }
365
366 env->SetByteArrayRegion(
367 jentry_value, 0, static_cast<jsize>(value_parts[i].size()),
368 const_cast<jbyte*>(reinterpret_cast<const jbyte*>(value_parts[i].c_str())));
369 if (env->ExceptionCheck()) {
370 // exception thrown: ArrayIndexOutOfBoundsException
371 env->DeleteLocalRef(jentry_value);
372 return nullptr;
373 }
374
375 env->SetObjectArrayElement(jresults, static_cast<jsize>(i), jentry_value);
376 env->DeleteLocalRef(jentry_value);
377 }
378 }
379
380 return jresults;
381}
382
383/*
384 * Class: org_rocksdb_Transaction
385 * Method: multiGet
386 * Signature: (JJ[[B[J)[[B
387 */
388jobjectArray Java_org_rocksdb_Transaction_multiGet__JJ_3_3B_3J(
389 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jlong jread_options_handle,
390 jobjectArray jkey_parts, jlongArray jcolumn_family_handles) {
391 bool has_exception = false;
f67539c2
TL
392 const std::vector<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>
393 column_family_handles = txn_column_families_helper(
394 env, jcolumn_family_handles, &has_exception);
11fdf7f2
TL
395 if (has_exception) {
396 // exception thrown: OutOfMemoryError
397 return nullptr;
398 }
f67539c2
TL
399 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
400 FnMultiGet fn_multi_get = std::bind<std::vector<ROCKSDB_NAMESPACE::Status> (
401 ROCKSDB_NAMESPACE::Transaction::*)(
402 const ROCKSDB_NAMESPACE::ReadOptions&,
403 const std::vector<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>&,
404 const std::vector<ROCKSDB_NAMESPACE::Slice>&, std::vector<std::string>*)>(
405 &ROCKSDB_NAMESPACE::Transaction::MultiGet, txn, _1, column_family_handles,
406 _2, _3);
11fdf7f2
TL
407 return txn_multi_get_helper(env, fn_multi_get, jread_options_handle,
408 jkey_parts);
409}
410
411/*
412 * Class: org_rocksdb_Transaction
413 * Method: multiGet
414 * Signature: (JJ[[B)[[B
415 */
416jobjectArray Java_org_rocksdb_Transaction_multiGet__JJ_3_3B(
417 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jlong jread_options_handle,
418 jobjectArray jkey_parts) {
f67539c2
TL
419 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
420 FnMultiGet fn_multi_get = std::bind<std::vector<ROCKSDB_NAMESPACE::Status> (
421 ROCKSDB_NAMESPACE::Transaction::*)(
422 const ROCKSDB_NAMESPACE::ReadOptions&,
423 const std::vector<ROCKSDB_NAMESPACE::Slice>&, std::vector<std::string>*)>(
424 &ROCKSDB_NAMESPACE::Transaction::MultiGet, txn, _1, _2, _3);
11fdf7f2
TL
425 return txn_multi_get_helper(env, fn_multi_get, jread_options_handle,
426 jkey_parts);
427}
428
429/*
430 * Class: org_rocksdb_Transaction
431 * Method: getForUpdate
494da23a 432 * Signature: (JJ[BIJZZ)[B
11fdf7f2 433 */
494da23a 434jbyteArray Java_org_rocksdb_Transaction_getForUpdate__JJ_3BIJZZ(
11fdf7f2
TL
435 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jlong jread_options_handle,
436 jbyteArray jkey, jint jkey_part_len, jlong jcolumn_family_handle,
494da23a 437 jboolean jexclusive, jboolean jdo_validate) {
11fdf7f2 438 auto* column_family_handle =
f67539c2
TL
439 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(
440 jcolumn_family_handle);
441 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
442 FnGet fn_get_for_update =
443 std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
444 const ROCKSDB_NAMESPACE::ReadOptions&,
445 ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
446 const ROCKSDB_NAMESPACE::Slice&, std::string*, bool, bool)>(
447 &ROCKSDB_NAMESPACE::Transaction::GetForUpdate, txn, _1,
448 column_family_handle, _2, _3, jexclusive, jdo_validate);
11fdf7f2
TL
449 return txn_get_helper(env, fn_get_for_update, jread_options_handle, jkey,
450 jkey_part_len);
451}
452
453/*
454 * Class: org_rocksdb_Transaction
455 * Method: getForUpdate
494da23a 456 * Signature: (JJ[BIZZ)[B
11fdf7f2 457 */
494da23a 458jbyteArray Java_org_rocksdb_Transaction_getForUpdate__JJ_3BIZZ(
11fdf7f2 459 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jlong jread_options_handle,
494da23a
TL
460 jbyteArray jkey, jint jkey_part_len, jboolean jexclusive,
461 jboolean jdo_validate) {
f67539c2
TL
462 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
463 FnGet fn_get_for_update =
464 std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
465 const ROCKSDB_NAMESPACE::ReadOptions&,
466 const ROCKSDB_NAMESPACE::Slice&, std::string*, bool, bool)>(
467 &ROCKSDB_NAMESPACE::Transaction::GetForUpdate, txn, _1, _2, _3,
468 jexclusive, jdo_validate);
11fdf7f2
TL
469 return txn_get_helper(env, fn_get_for_update, jread_options_handle, jkey,
470 jkey_part_len);
471}
472
473/*
474 * Class: org_rocksdb_Transaction
475 * Method: multiGetForUpdate
476 * Signature: (JJ[[B[J)[[B
477 */
478jobjectArray Java_org_rocksdb_Transaction_multiGetForUpdate__JJ_3_3B_3J(
479 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jlong jread_options_handle,
480 jobjectArray jkey_parts, jlongArray jcolumn_family_handles) {
481 bool has_exception = false;
f67539c2
TL
482 const std::vector<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>
483 column_family_handles = txn_column_families_helper(
484 env, jcolumn_family_handles, &has_exception);
11fdf7f2
TL
485 if (has_exception) {
486 // exception thrown: OutOfMemoryError
487 return nullptr;
488 }
f67539c2
TL
489 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
490 FnMultiGet fn_multi_get_for_update = std::bind<std::vector<
491 ROCKSDB_NAMESPACE::Status> (ROCKSDB_NAMESPACE::Transaction::*)(
492 const ROCKSDB_NAMESPACE::ReadOptions&,
493 const std::vector<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>&,
494 const std::vector<ROCKSDB_NAMESPACE::Slice>&, std::vector<std::string>*)>(
495 &ROCKSDB_NAMESPACE::Transaction::MultiGetForUpdate, txn, _1,
496 column_family_handles, _2, _3);
11fdf7f2
TL
497 return txn_multi_get_helper(env, fn_multi_get_for_update,
498 jread_options_handle, jkey_parts);
499}
500
501/*
502 * Class: org_rocksdb_Transaction
503 * Method: multiGetForUpdate
504 * Signature: (JJ[[B)[[B
505 */
506jobjectArray Java_org_rocksdb_Transaction_multiGetForUpdate__JJ_3_3B(
507 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jlong jread_options_handle,
508 jobjectArray jkey_parts) {
f67539c2
TL
509 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
510 FnMultiGet fn_multi_get_for_update = std::bind<std::vector<
511 ROCKSDB_NAMESPACE::Status> (ROCKSDB_NAMESPACE::Transaction::*)(
512 const ROCKSDB_NAMESPACE::ReadOptions&,
513 const std::vector<ROCKSDB_NAMESPACE::Slice>&, std::vector<std::string>*)>(
514 &ROCKSDB_NAMESPACE::Transaction::MultiGetForUpdate, txn, _1, _2, _3);
11fdf7f2
TL
515 return txn_multi_get_helper(env, fn_multi_get_for_update,
516 jread_options_handle, jkey_parts);
517}
518
519/*
520 * Class: org_rocksdb_Transaction
521 * Method: getIterator
522 * Signature: (JJ)J
523 */
524jlong Java_org_rocksdb_Transaction_getIterator__JJ(JNIEnv* /*env*/,
525 jobject /*jobj*/,
526 jlong jhandle,
527 jlong jread_options_handle) {
f67539c2 528 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2 529 auto* read_options =
f67539c2 530 reinterpret_cast<ROCKSDB_NAMESPACE::ReadOptions*>(jread_options_handle);
11fdf7f2
TL
531 return reinterpret_cast<jlong>(txn->GetIterator(*read_options));
532}
533
534/*
535 * Class: org_rocksdb_Transaction
536 * Method: getIterator
537 * Signature: (JJJ)J
538 */
539jlong Java_org_rocksdb_Transaction_getIterator__JJJ(
540 JNIEnv* /*env*/, jobject /*jobj*/, jlong jhandle,
541 jlong jread_options_handle, jlong jcolumn_family_handle) {
f67539c2 542 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2 543 auto* read_options =
f67539c2 544 reinterpret_cast<ROCKSDB_NAMESPACE::ReadOptions*>(jread_options_handle);
11fdf7f2 545 auto* column_family_handle =
f67539c2
TL
546 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(
547 jcolumn_family_handle);
11fdf7f2
TL
548 return reinterpret_cast<jlong>(
549 txn->GetIterator(*read_options, column_family_handle));
550}
551
f67539c2
TL
552typedef std::function<ROCKSDB_NAMESPACE::Status(
553 const ROCKSDB_NAMESPACE::Slice&, const ROCKSDB_NAMESPACE::Slice&)>
11fdf7f2
TL
554 FnWriteKV;
555
556// TODO(AR) consider refactoring to share this between here and rocksjni.cc
557void txn_write_kv_helper(JNIEnv* env, const FnWriteKV& fn_write_kv,
558 const jbyteArray& jkey, const jint& jkey_part_len,
559 const jbyteArray& jval, const jint& jval_len) {
560 jbyte* key = env->GetByteArrayElements(jkey, nullptr);
561 if (key == nullptr) {
562 // exception thrown: OutOfMemoryError
563 return;
564 }
565 jbyte* value = env->GetByteArrayElements(jval, nullptr);
566 if (value == nullptr) {
567 // exception thrown: OutOfMemoryError
568 env->ReleaseByteArrayElements(jkey, key, JNI_ABORT);
569 return;
570 }
f67539c2
TL
571 ROCKSDB_NAMESPACE::Slice key_slice(reinterpret_cast<char*>(key),
572 jkey_part_len);
573 ROCKSDB_NAMESPACE::Slice value_slice(reinterpret_cast<char*>(value),
574 jval_len);
11fdf7f2 575
f67539c2 576 ROCKSDB_NAMESPACE::Status s = fn_write_kv(key_slice, value_slice);
11fdf7f2
TL
577
578 // trigger java unref on key.
579 // by passing JNI_ABORT, it will simply release the reference without
580 // copying the result back to the java byte array.
581 env->ReleaseByteArrayElements(jval, value, JNI_ABORT);
582 env->ReleaseByteArrayElements(jkey, key, JNI_ABORT);
583
584 if (s.ok()) {
585 return;
586 }
f67539c2 587 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
11fdf7f2
TL
588}
589
590/*
591 * Class: org_rocksdb_Transaction
592 * Method: put
494da23a 593 * Signature: (J[BI[BIJZ)V
11fdf7f2 594 */
494da23a 595void Java_org_rocksdb_Transaction_put__J_3BI_3BIJZ(
11fdf7f2
TL
596 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jbyteArray jkey,
597 jint jkey_part_len, jbyteArray jval, jint jval_len,
494da23a 598 jlong jcolumn_family_handle, jboolean jassume_tracked) {
f67539c2 599 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2 600 auto* column_family_handle =
f67539c2
TL
601 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(
602 jcolumn_family_handle);
603 FnWriteKV fn_put =
604 std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
605 ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
606 const ROCKSDB_NAMESPACE::Slice&, const ROCKSDB_NAMESPACE::Slice&,
607 bool)>(&ROCKSDB_NAMESPACE::Transaction::Put, txn,
608 column_family_handle, _1, _2, jassume_tracked);
11fdf7f2
TL
609 txn_write_kv_helper(env, fn_put, jkey, jkey_part_len, jval, jval_len);
610}
611
612/*
613 * Class: org_rocksdb_Transaction
614 * Method: put
615 * Signature: (J[BI[BI)V
616 */
617void Java_org_rocksdb_Transaction_put__J_3BI_3BI(JNIEnv* env, jobject /*jobj*/,
618 jlong jhandle, jbyteArray jkey,
619 jint jkey_part_len,
620 jbyteArray jval,
621 jint jval_len) {
f67539c2
TL
622 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
623 FnWriteKV fn_put =
624 std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
625 const ROCKSDB_NAMESPACE::Slice&, const ROCKSDB_NAMESPACE::Slice&)>(
626 &ROCKSDB_NAMESPACE::Transaction::Put, txn, _1, _2);
11fdf7f2
TL
627 txn_write_kv_helper(env, fn_put, jkey, jkey_part_len, jval, jval_len);
628}
629
f67539c2
TL
630typedef std::function<ROCKSDB_NAMESPACE::Status(
631 const ROCKSDB_NAMESPACE::SliceParts&, const ROCKSDB_NAMESPACE::SliceParts&)>
11fdf7f2
TL
632 FnWriteKVParts;
633
634// TODO(AR) consider refactoring to share this between here and rocksjni.cc
635void txn_write_kv_parts_helper(JNIEnv* env,
636 const FnWriteKVParts& fn_write_kv_parts,
637 const jobjectArray& jkey_parts,
638 const jint& jkey_parts_len,
639 const jobjectArray& jvalue_parts,
640 const jint& jvalue_parts_len) {
641#ifndef DEBUG
642 (void) jvalue_parts_len;
643#else
644 assert(jkey_parts_len == jvalue_parts_len);
645#endif
646
f67539c2
TL
647 auto key_parts = std::vector<ROCKSDB_NAMESPACE::Slice>();
648 auto value_parts = std::vector<ROCKSDB_NAMESPACE::Slice>();
11fdf7f2
TL
649 auto jparts_to_free = std::vector<std::tuple<jbyteArray, jbyte*, jobject>>();
650
651 // convert java key_parts/value_parts byte[][] to Slice(s)
652 for (jsize i = 0; i < jkey_parts_len; ++i) {
653 const jobject jobj_key_part = env->GetObjectArrayElement(jkey_parts, i);
654 if (env->ExceptionCheck()) {
655 // exception thrown: ArrayIndexOutOfBoundsException
656 free_parts(env, jparts_to_free);
657 return;
658 }
659 const jobject jobj_value_part = env->GetObjectArrayElement(jvalue_parts, i);
660 if (env->ExceptionCheck()) {
661 // exception thrown: ArrayIndexOutOfBoundsException
662 env->DeleteLocalRef(jobj_key_part);
663 free_parts(env, jparts_to_free);
664 return;
665 }
666
667 const jbyteArray jba_key_part = reinterpret_cast<jbyteArray>(jobj_key_part);
668 const jsize jkey_part_len = env->GetArrayLength(jba_key_part);
669 if (env->EnsureLocalCapacity(jkey_part_len) != 0) {
670 // out of memory
671 env->DeleteLocalRef(jobj_value_part);
672 env->DeleteLocalRef(jobj_key_part);
673 free_parts(env, jparts_to_free);
674 return;
675 }
676 jbyte* jkey_part = env->GetByteArrayElements(jba_key_part, nullptr);
677 if (jkey_part == nullptr) {
678 // exception thrown: OutOfMemoryError
679 env->DeleteLocalRef(jobj_value_part);
680 env->DeleteLocalRef(jobj_key_part);
681 free_parts(env, jparts_to_free);
682 return;
683 }
684
685 const jbyteArray jba_value_part =
686 reinterpret_cast<jbyteArray>(jobj_value_part);
687 const jsize jvalue_part_len = env->GetArrayLength(jba_value_part);
688 if (env->EnsureLocalCapacity(jvalue_part_len) != 0) {
689 // out of memory
690 env->DeleteLocalRef(jobj_value_part);
691 env->DeleteLocalRef(jobj_key_part);
20effc67 692 env->ReleaseByteArrayElements(jba_key_part, jkey_part, JNI_ABORT);
11fdf7f2
TL
693 free_parts(env, jparts_to_free);
694 return;
695 }
696 jbyte* jvalue_part = env->GetByteArrayElements(jba_value_part, nullptr);
697 if (jvalue_part == nullptr) {
698 // exception thrown: OutOfMemoryError
699 env->ReleaseByteArrayElements(jba_value_part, jvalue_part, JNI_ABORT);
700 env->DeleteLocalRef(jobj_value_part);
701 env->DeleteLocalRef(jobj_key_part);
20effc67 702 env->ReleaseByteArrayElements(jba_key_part, jkey_part, JNI_ABORT);
11fdf7f2
TL
703 free_parts(env, jparts_to_free);
704 return;
705 }
706
707 jparts_to_free.push_back(
708 std::make_tuple(jba_key_part, jkey_part, jobj_key_part));
709 jparts_to_free.push_back(
710 std::make_tuple(jba_value_part, jvalue_part, jobj_value_part));
711
f67539c2
TL
712 key_parts.push_back(ROCKSDB_NAMESPACE::Slice(
713 reinterpret_cast<char*>(jkey_part), jkey_part_len));
714 value_parts.push_back(ROCKSDB_NAMESPACE::Slice(
715 reinterpret_cast<char*>(jvalue_part), jvalue_part_len));
11fdf7f2
TL
716 }
717
718 // call the write_multi function
f67539c2
TL
719 ROCKSDB_NAMESPACE::Status s = fn_write_kv_parts(
720 ROCKSDB_NAMESPACE::SliceParts(key_parts.data(), (int)key_parts.size()),
721 ROCKSDB_NAMESPACE::SliceParts(value_parts.data(),
722 (int)value_parts.size()));
11fdf7f2
TL
723
724 // cleanup temporary memory
725 free_parts(env, jparts_to_free);
726
727 // return
728 if (s.ok()) {
729 return;
730 }
731
f67539c2 732 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
11fdf7f2
TL
733}
734
735/*
736 * Class: org_rocksdb_Transaction
737 * Method: put
494da23a 738 * Signature: (J[[BI[[BIJZ)V
11fdf7f2 739 */
494da23a 740void Java_org_rocksdb_Transaction_put__J_3_3BI_3_3BIJZ(
11fdf7f2
TL
741 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jobjectArray jkey_parts,
742 jint jkey_parts_len, jobjectArray jvalue_parts, jint jvalue_parts_len,
494da23a 743 jlong jcolumn_family_handle, jboolean jassume_tracked) {
f67539c2 744 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2 745 auto* column_family_handle =
f67539c2
TL
746 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(
747 jcolumn_family_handle);
11fdf7f2 748 FnWriteKVParts fn_put_parts =
f67539c2
TL
749 std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
750 ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
751 const ROCKSDB_NAMESPACE::SliceParts&,
752 const ROCKSDB_NAMESPACE::SliceParts&, bool)>(
753 &ROCKSDB_NAMESPACE::Transaction::Put, txn, column_family_handle, _1,
754 _2, jassume_tracked);
11fdf7f2
TL
755 txn_write_kv_parts_helper(env, fn_put_parts, jkey_parts, jkey_parts_len,
756 jvalue_parts, jvalue_parts_len);
757}
758
759/*
760 * Class: org_rocksdb_Transaction
761 * Method: put
762 * Signature: (J[[BI[[BI)V
763 */
764void Java_org_rocksdb_Transaction_put__J_3_3BI_3_3BI(
765 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jobjectArray jkey_parts,
766 jint jkey_parts_len, jobjectArray jvalue_parts, jint jvalue_parts_len) {
f67539c2
TL
767 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
768 FnWriteKVParts fn_put_parts = std::bind<ROCKSDB_NAMESPACE::Status (
769 ROCKSDB_NAMESPACE::Transaction::*)(const ROCKSDB_NAMESPACE::SliceParts&,
770 const ROCKSDB_NAMESPACE::SliceParts&)>(
771 &ROCKSDB_NAMESPACE::Transaction::Put, txn, _1, _2);
11fdf7f2
TL
772 txn_write_kv_parts_helper(env, fn_put_parts, jkey_parts, jkey_parts_len,
773 jvalue_parts, jvalue_parts_len);
774}
775
776/*
777 * Class: org_rocksdb_Transaction
778 * Method: merge
494da23a 779 * Signature: (J[BI[BIJZ)V
11fdf7f2 780 */
494da23a 781void Java_org_rocksdb_Transaction_merge__J_3BI_3BIJZ(
11fdf7f2
TL
782 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jbyteArray jkey,
783 jint jkey_part_len, jbyteArray jval, jint jval_len,
494da23a 784 jlong jcolumn_family_handle, jboolean jassume_tracked) {
f67539c2 785 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2 786 auto* column_family_handle =
f67539c2
TL
787 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(
788 jcolumn_family_handle);
789 FnWriteKV fn_merge =
790 std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
791 ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
792 const ROCKSDB_NAMESPACE::Slice&, const ROCKSDB_NAMESPACE::Slice&,
793 bool)>(&ROCKSDB_NAMESPACE::Transaction::Merge, txn,
794 column_family_handle, _1, _2, jassume_tracked);
11fdf7f2
TL
795 txn_write_kv_helper(env, fn_merge, jkey, jkey_part_len, jval, jval_len);
796}
797
798/*
799 * Class: org_rocksdb_Transaction
800 * Method: merge
801 * Signature: (J[BI[BI)V
802 */
803void Java_org_rocksdb_Transaction_merge__J_3BI_3BI(
804 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jbyteArray jkey,
805 jint jkey_part_len, jbyteArray jval, jint jval_len) {
f67539c2
TL
806 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
807 FnWriteKV fn_merge =
808 std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
809 const ROCKSDB_NAMESPACE::Slice&, const ROCKSDB_NAMESPACE::Slice&)>(
810 &ROCKSDB_NAMESPACE::Transaction::Merge, txn, _1, _2);
11fdf7f2
TL
811 txn_write_kv_helper(env, fn_merge, jkey, jkey_part_len, jval, jval_len);
812}
813
f67539c2
TL
814typedef std::function<ROCKSDB_NAMESPACE::Status(
815 const ROCKSDB_NAMESPACE::Slice&)>
816 FnWriteK;
11fdf7f2
TL
817
818// TODO(AR) consider refactoring to share this between here and rocksjni.cc
819void txn_write_k_helper(JNIEnv* env, const FnWriteK& fn_write_k,
820 const jbyteArray& jkey, const jint& jkey_part_len) {
821 jbyte* key = env->GetByteArrayElements(jkey, nullptr);
822 if (key == nullptr) {
823 // exception thrown: OutOfMemoryError
824 return;
825 }
f67539c2
TL
826 ROCKSDB_NAMESPACE::Slice key_slice(reinterpret_cast<char*>(key),
827 jkey_part_len);
11fdf7f2 828
f67539c2 829 ROCKSDB_NAMESPACE::Status s = fn_write_k(key_slice);
11fdf7f2
TL
830
831 // trigger java unref on key.
832 // by passing JNI_ABORT, it will simply release the reference without
833 // copying the result back to the java byte array.
834 env->ReleaseByteArrayElements(jkey, key, JNI_ABORT);
835
836 if (s.ok()) {
837 return;
838 }
f67539c2 839 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
11fdf7f2
TL
840}
841
842/*
843 * Class: org_rocksdb_Transaction
844 * Method: delete
494da23a 845 * Signature: (J[BIJZ)V
11fdf7f2 846 */
494da23a
TL
847void Java_org_rocksdb_Transaction_delete__J_3BIJZ(
848 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jbyteArray jkey,
849 jint jkey_part_len, jlong jcolumn_family_handle, jboolean jassume_tracked) {
f67539c2 850 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2 851 auto* column_family_handle =
f67539c2
TL
852 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(
853 jcolumn_family_handle);
854 FnWriteK fn_delete =
855 std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
856 ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
857 const ROCKSDB_NAMESPACE::Slice&, bool)>(
858 &ROCKSDB_NAMESPACE::Transaction::Delete, txn, column_family_handle,
859 _1, jassume_tracked);
11fdf7f2
TL
860 txn_write_k_helper(env, fn_delete, jkey, jkey_part_len);
861}
862
863/*
864 * Class: org_rocksdb_Transaction
865 * Method: delete
866 * Signature: (J[BI)V
867 */
868void Java_org_rocksdb_Transaction_delete__J_3BI(JNIEnv* env, jobject /*jobj*/,
869 jlong jhandle, jbyteArray jkey,
870 jint jkey_part_len) {
f67539c2
TL
871 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
872 FnWriteK fn_delete = std::bind<ROCKSDB_NAMESPACE::Status (
873 ROCKSDB_NAMESPACE::Transaction::*)(const ROCKSDB_NAMESPACE::Slice&)>(
874 &ROCKSDB_NAMESPACE::Transaction::Delete, txn, _1);
11fdf7f2
TL
875 txn_write_k_helper(env, fn_delete, jkey, jkey_part_len);
876}
877
f67539c2
TL
878typedef std::function<ROCKSDB_NAMESPACE::Status(
879 const ROCKSDB_NAMESPACE::SliceParts&)>
11fdf7f2
TL
880 FnWriteKParts;
881
882// TODO(AR) consider refactoring to share this between here and rocksjni.cc
883void txn_write_k_parts_helper(JNIEnv* env,
884 const FnWriteKParts& fn_write_k_parts,
885 const jobjectArray& jkey_parts,
886 const jint& jkey_parts_len) {
f67539c2 887 std::vector<ROCKSDB_NAMESPACE::Slice> key_parts;
11fdf7f2
TL
888 std::vector<std::tuple<jbyteArray, jbyte*, jobject>> jkey_parts_to_free;
889
890 // convert java key_parts byte[][] to Slice(s)
891 for (jint i = 0; i < jkey_parts_len; ++i) {
892 const jobject jobj_key_part = env->GetObjectArrayElement(jkey_parts, i);
893 if (env->ExceptionCheck()) {
894 // exception thrown: ArrayIndexOutOfBoundsException
895 free_parts(env, jkey_parts_to_free);
896 return;
897 }
898
899 const jbyteArray jba_key_part = reinterpret_cast<jbyteArray>(jobj_key_part);
900 const jsize jkey_part_len = env->GetArrayLength(jba_key_part);
901 if (env->EnsureLocalCapacity(jkey_part_len) != 0) {
902 // out of memory
903 env->DeleteLocalRef(jobj_key_part);
904 free_parts(env, jkey_parts_to_free);
905 return;
906 }
907 jbyte* jkey_part = env->GetByteArrayElements(jba_key_part, nullptr);
908 if (jkey_part == nullptr) {
909 // exception thrown: OutOfMemoryError
910 env->DeleteLocalRef(jobj_key_part);
911 free_parts(env, jkey_parts_to_free);
912 return;
913 }
914
915 jkey_parts_to_free.push_back(std::tuple<jbyteArray, jbyte*, jobject>(
916 jba_key_part, jkey_part, jobj_key_part));
917
f67539c2
TL
918 key_parts.push_back(ROCKSDB_NAMESPACE::Slice(
919 reinterpret_cast<char*>(jkey_part), jkey_part_len));
11fdf7f2
TL
920 }
921
922 // call the write_multi function
f67539c2
TL
923 ROCKSDB_NAMESPACE::Status s = fn_write_k_parts(
924 ROCKSDB_NAMESPACE::SliceParts(key_parts.data(), (int)key_parts.size()));
11fdf7f2
TL
925
926 // cleanup temporary memory
927 free_parts(env, jkey_parts_to_free);
928
929 // return
930 if (s.ok()) {
931 return;
932 }
f67539c2 933 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
11fdf7f2
TL
934}
935
936/*
937 * Class: org_rocksdb_Transaction
938 * Method: delete
494da23a 939 * Signature: (J[[BIJZ)V
11fdf7f2 940 */
494da23a 941void Java_org_rocksdb_Transaction_delete__J_3_3BIJZ(
11fdf7f2 942 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jobjectArray jkey_parts,
494da23a
TL
943 jint jkey_parts_len, jlong jcolumn_family_handle,
944 jboolean jassume_tracked) {
f67539c2 945 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2 946 auto* column_family_handle =
f67539c2
TL
947 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(
948 jcolumn_family_handle);
11fdf7f2 949 FnWriteKParts fn_delete_parts =
f67539c2
TL
950 std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
951 ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
952 const ROCKSDB_NAMESPACE::SliceParts&, bool)>(
953 &ROCKSDB_NAMESPACE::Transaction::Delete, txn, column_family_handle,
954 _1, jassume_tracked);
11fdf7f2
TL
955 txn_write_k_parts_helper(env, fn_delete_parts, jkey_parts, jkey_parts_len);
956}
957
958/*
959 * Class: org_rocksdb_Transaction
960 * Method: delete
961 * Signature: (J[[BI)V
962 */
963void Java_org_rocksdb_Transaction_delete__J_3_3BI(JNIEnv* env, jobject /*jobj*/,
964 jlong jhandle,
965 jobjectArray jkey_parts,
966 jint jkey_parts_len) {
f67539c2
TL
967 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
968 FnWriteKParts fn_delete_parts = std::bind<ROCKSDB_NAMESPACE::Status (
969 ROCKSDB_NAMESPACE::Transaction::*)(const ROCKSDB_NAMESPACE::SliceParts&)>(
970 &ROCKSDB_NAMESPACE::Transaction::Delete, txn, _1);
11fdf7f2
TL
971 txn_write_k_parts_helper(env, fn_delete_parts, jkey_parts, jkey_parts_len);
972}
973
974/*
975 * Class: org_rocksdb_Transaction
976 * Method: singleDelete
494da23a 977 * Signature: (J[BIJZ)V
11fdf7f2 978 */
494da23a 979void Java_org_rocksdb_Transaction_singleDelete__J_3BIJZ(
11fdf7f2 980 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jbyteArray jkey,
494da23a 981 jint jkey_part_len, jlong jcolumn_family_handle, jboolean jassume_tracked) {
f67539c2 982 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2 983 auto* column_family_handle =
f67539c2
TL
984 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(
985 jcolumn_family_handle);
11fdf7f2 986 FnWriteK fn_single_delete =
f67539c2
TL
987 std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
988 ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
989 const ROCKSDB_NAMESPACE::Slice&, bool)>(
990 &ROCKSDB_NAMESPACE::Transaction::SingleDelete, txn,
991 column_family_handle, _1, jassume_tracked);
11fdf7f2
TL
992 txn_write_k_helper(env, fn_single_delete, jkey, jkey_part_len);
993}
994
995/*
996 * Class: org_rocksdb_Transaction
997 * Method: singleDelete
998 * Signature: (J[BI)V
999 */
1000void Java_org_rocksdb_Transaction_singleDelete__J_3BI(JNIEnv* env,
1001 jobject /*jobj*/,
1002 jlong jhandle,
1003 jbyteArray jkey,
1004 jint jkey_part_len) {
f67539c2
TL
1005 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
1006 FnWriteK fn_single_delete = std::bind<ROCKSDB_NAMESPACE::Status (
1007 ROCKSDB_NAMESPACE::Transaction::*)(const ROCKSDB_NAMESPACE::Slice&)>(
1008 &ROCKSDB_NAMESPACE::Transaction::SingleDelete, txn, _1);
11fdf7f2
TL
1009 txn_write_k_helper(env, fn_single_delete, jkey, jkey_part_len);
1010}
1011
1012/*
1013 * Class: org_rocksdb_Transaction
1014 * Method: singleDelete
494da23a 1015 * Signature: (J[[BIJZ)V
11fdf7f2 1016 */
494da23a 1017void Java_org_rocksdb_Transaction_singleDelete__J_3_3BIJZ(
11fdf7f2 1018 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jobjectArray jkey_parts,
494da23a
TL
1019 jint jkey_parts_len, jlong jcolumn_family_handle,
1020 jboolean jassume_tracked) {
f67539c2 1021 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2 1022 auto* column_family_handle =
f67539c2
TL
1023 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(
1024 jcolumn_family_handle);
11fdf7f2 1025 FnWriteKParts fn_single_delete_parts =
f67539c2
TL
1026 std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
1027 ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
1028 const ROCKSDB_NAMESPACE::SliceParts&, bool)>(
1029 &ROCKSDB_NAMESPACE::Transaction::SingleDelete, txn,
1030 column_family_handle, _1, jassume_tracked);
11fdf7f2
TL
1031 txn_write_k_parts_helper(env, fn_single_delete_parts, jkey_parts,
1032 jkey_parts_len);
1033}
1034
1035/*
1036 * Class: org_rocksdb_Transaction
1037 * Method: singleDelete
1038 * Signature: (J[[BI)V
1039 */
1040void Java_org_rocksdb_Transaction_singleDelete__J_3_3BI(JNIEnv* env,
1041 jobject /*jobj*/,
1042 jlong jhandle,
1043 jobjectArray jkey_parts,
1044 jint jkey_parts_len) {
f67539c2
TL
1045 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
1046 FnWriteKParts fn_single_delete_parts = std::bind<ROCKSDB_NAMESPACE::Status (
1047 ROCKSDB_NAMESPACE::Transaction::*)(const ROCKSDB_NAMESPACE::SliceParts&)>(
1048 &ROCKSDB_NAMESPACE::Transaction::SingleDelete, txn, _1);
11fdf7f2
TL
1049 txn_write_k_parts_helper(env, fn_single_delete_parts, jkey_parts,
1050 jkey_parts_len);
1051}
1052
1053/*
1054 * Class: org_rocksdb_Transaction
1055 * Method: putUntracked
1056 * Signature: (J[BI[BIJ)V
1057 */
1058void Java_org_rocksdb_Transaction_putUntracked__J_3BI_3BIJ(
1059 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jbyteArray jkey,
1060 jint jkey_part_len, jbyteArray jval, jint jval_len,
1061 jlong jcolumn_family_handle) {
f67539c2 1062 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2 1063 auto* column_family_handle =
f67539c2
TL
1064 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(
1065 jcolumn_family_handle);
1066 FnWriteKV fn_put_untracked =
1067 std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
1068 ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
1069 const ROCKSDB_NAMESPACE::Slice&, const ROCKSDB_NAMESPACE::Slice&)>(
1070 &ROCKSDB_NAMESPACE::Transaction::PutUntracked, txn,
1071 column_family_handle, _1, _2);
11fdf7f2
TL
1072 txn_write_kv_helper(env, fn_put_untracked, jkey, jkey_part_len, jval,
1073 jval_len);
1074}
1075
1076/*
1077 * Class: org_rocksdb_Transaction
1078 * Method: putUntracked
1079 * Signature: (J[BI[BI)V
1080 */
1081void Java_org_rocksdb_Transaction_putUntracked__J_3BI_3BI(
1082 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jbyteArray jkey,
1083 jint jkey_part_len, jbyteArray jval, jint jval_len) {
f67539c2
TL
1084 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
1085 FnWriteKV fn_put_untracked =
1086 std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
1087 const ROCKSDB_NAMESPACE::Slice&, const ROCKSDB_NAMESPACE::Slice&)>(
1088 &ROCKSDB_NAMESPACE::Transaction::PutUntracked, txn, _1, _2);
11fdf7f2
TL
1089 txn_write_kv_helper(env, fn_put_untracked, jkey, jkey_part_len, jval,
1090 jval_len);
1091}
1092
1093/*
1094 * Class: org_rocksdb_Transaction
1095 * Method: putUntracked
1096 * Signature: (J[[BI[[BIJ)V
1097 */
1098void Java_org_rocksdb_Transaction_putUntracked__J_3_3BI_3_3BIJ(
1099 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jobjectArray jkey_parts,
1100 jint jkey_parts_len, jobjectArray jvalue_parts, jint jvalue_parts_len,
1101 jlong jcolumn_family_handle) {
f67539c2 1102 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2 1103 auto* column_family_handle =
f67539c2
TL
1104 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(
1105 jcolumn_family_handle);
1106 FnWriteKVParts fn_put_parts_untracked = std::bind<ROCKSDB_NAMESPACE::Status (
1107 ROCKSDB_NAMESPACE::Transaction::*)(ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
1108 const ROCKSDB_NAMESPACE::SliceParts&,
1109 const ROCKSDB_NAMESPACE::SliceParts&)>(
1110 &ROCKSDB_NAMESPACE::Transaction::PutUntracked, txn, column_family_handle,
1111 _1, _2);
11fdf7f2
TL
1112 txn_write_kv_parts_helper(env, fn_put_parts_untracked, jkey_parts,
1113 jkey_parts_len, jvalue_parts, jvalue_parts_len);
1114}
1115
1116/*
1117 * Class: org_rocksdb_Transaction
1118 * Method: putUntracked
1119 * Signature: (J[[BI[[BI)V
1120 */
1121void Java_org_rocksdb_Transaction_putUntracked__J_3_3BI_3_3BI(
1122 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jobjectArray jkey_parts,
1123 jint jkey_parts_len, jobjectArray jvalue_parts, jint jvalue_parts_len) {
f67539c2
TL
1124 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
1125 FnWriteKVParts fn_put_parts_untracked = std::bind<ROCKSDB_NAMESPACE::Status (
1126 ROCKSDB_NAMESPACE::Transaction::*)(const ROCKSDB_NAMESPACE::SliceParts&,
1127 const ROCKSDB_NAMESPACE::SliceParts&)>(
1128 &ROCKSDB_NAMESPACE::Transaction::PutUntracked, txn, _1, _2);
11fdf7f2
TL
1129 txn_write_kv_parts_helper(env, fn_put_parts_untracked, jkey_parts,
1130 jkey_parts_len, jvalue_parts, jvalue_parts_len);
1131}
1132
1133/*
1134 * Class: org_rocksdb_Transaction
1135 * Method: mergeUntracked
1136 * Signature: (J[BI[BIJ)V
1137 */
1138void Java_org_rocksdb_Transaction_mergeUntracked__J_3BI_3BIJ(
1139 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jbyteArray jkey,
1140 jint jkey_part_len, jbyteArray jval, jint jval_len,
1141 jlong jcolumn_family_handle) {
f67539c2 1142 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2 1143 auto* column_family_handle =
f67539c2
TL
1144 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(
1145 jcolumn_family_handle);
1146 FnWriteKV fn_merge_untracked =
1147 std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
1148 ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
1149 const ROCKSDB_NAMESPACE::Slice&, const ROCKSDB_NAMESPACE::Slice&)>(
1150 &ROCKSDB_NAMESPACE::Transaction::MergeUntracked, txn,
1151 column_family_handle, _1, _2);
11fdf7f2
TL
1152 txn_write_kv_helper(env, fn_merge_untracked, jkey, jkey_part_len, jval,
1153 jval_len);
1154}
1155
1156/*
1157 * Class: org_rocksdb_Transaction
1158 * Method: mergeUntracked
1159 * Signature: (J[BI[BI)V
1160 */
1161void Java_org_rocksdb_Transaction_mergeUntracked__J_3BI_3BI(
1162 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jbyteArray jkey,
1163 jint jkey_part_len, jbyteArray jval, jint jval_len) {
f67539c2
TL
1164 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
1165 FnWriteKV fn_merge_untracked =
1166 std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
1167 const ROCKSDB_NAMESPACE::Slice&, const ROCKSDB_NAMESPACE::Slice&)>(
1168 &ROCKSDB_NAMESPACE::Transaction::MergeUntracked, txn, _1, _2);
11fdf7f2
TL
1169 txn_write_kv_helper(env, fn_merge_untracked, jkey, jkey_part_len, jval,
1170 jval_len);
1171}
1172
1173/*
1174 * Class: org_rocksdb_Transaction
1175 * Method: deleteUntracked
1176 * Signature: (J[BIJ)V
1177 */
1178void Java_org_rocksdb_Transaction_deleteUntracked__J_3BIJ(
1179 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jbyteArray jkey,
1180 jint jkey_part_len, jlong jcolumn_family_handle) {
f67539c2 1181 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2 1182 auto* column_family_handle =
f67539c2
TL
1183 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(
1184 jcolumn_family_handle);
1185 FnWriteK fn_delete_untracked = std::bind<ROCKSDB_NAMESPACE::Status (
1186 ROCKSDB_NAMESPACE::Transaction::*)(ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
1187 const ROCKSDB_NAMESPACE::Slice&)>(
1188 &ROCKSDB_NAMESPACE::Transaction::DeleteUntracked, txn,
1189 column_family_handle, _1);
11fdf7f2
TL
1190 txn_write_k_helper(env, fn_delete_untracked, jkey, jkey_part_len);
1191}
1192
1193/*
1194 * Class: org_rocksdb_Transaction
1195 * Method: deleteUntracked
1196 * Signature: (J[BI)V
1197 */
1198void Java_org_rocksdb_Transaction_deleteUntracked__J_3BI(JNIEnv* env,
1199 jobject /*jobj*/,
1200 jlong jhandle,
1201 jbyteArray jkey,
1202 jint jkey_part_len) {
f67539c2
TL
1203 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
1204 FnWriteK fn_delete_untracked = std::bind<ROCKSDB_NAMESPACE::Status (
1205 ROCKSDB_NAMESPACE::Transaction::*)(const ROCKSDB_NAMESPACE::Slice&)>(
1206 &ROCKSDB_NAMESPACE::Transaction::DeleteUntracked, txn, _1);
11fdf7f2
TL
1207 txn_write_k_helper(env, fn_delete_untracked, jkey, jkey_part_len);
1208}
1209
1210/*
1211 * Class: org_rocksdb_Transaction
1212 * Method: deleteUntracked
1213 * Signature: (J[[BIJ)V
1214 */
1215void Java_org_rocksdb_Transaction_deleteUntracked__J_3_3BIJ(
1216 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jobjectArray jkey_parts,
1217 jint jkey_parts_len, jlong jcolumn_family_handle) {
f67539c2 1218 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2 1219 auto* column_family_handle =
f67539c2
TL
1220 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(
1221 jcolumn_family_handle);
11fdf7f2 1222 FnWriteKParts fn_delete_untracked_parts =
f67539c2
TL
1223 std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
1224 ROCKSDB_NAMESPACE::ColumnFamilyHandle*,
1225 const ROCKSDB_NAMESPACE::SliceParts&)>(
1226 &ROCKSDB_NAMESPACE::Transaction::DeleteUntracked, txn,
1227 column_family_handle, _1);
11fdf7f2
TL
1228 txn_write_k_parts_helper(env, fn_delete_untracked_parts, jkey_parts,
1229 jkey_parts_len);
1230}
1231
1232/*
1233 * Class: org_rocksdb_Transaction
1234 * Method: deleteUntracked
1235 * Signature: (J[[BI)V
1236 */
1237void Java_org_rocksdb_Transaction_deleteUntracked__J_3_3BI(
1238 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jobjectArray jkey_parts,
1239 jint jkey_parts_len) {
f67539c2
TL
1240 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
1241 FnWriteKParts fn_delete_untracked_parts =
1242 std::bind<ROCKSDB_NAMESPACE::Status (ROCKSDB_NAMESPACE::Transaction::*)(
1243 const ROCKSDB_NAMESPACE::SliceParts&)>(
1244 &ROCKSDB_NAMESPACE::Transaction::DeleteUntracked, txn, _1);
11fdf7f2
TL
1245 txn_write_k_parts_helper(env, fn_delete_untracked_parts, jkey_parts,
1246 jkey_parts_len);
1247}
1248
1249/*
1250 * Class: org_rocksdb_Transaction
1251 * Method: putLogData
1252 * Signature: (J[BI)V
1253 */
1254void Java_org_rocksdb_Transaction_putLogData(JNIEnv* env, jobject /*jobj*/,
1255 jlong jhandle, jbyteArray jkey,
1256 jint jkey_part_len) {
f67539c2 1257 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2
TL
1258
1259 jbyte* key = env->GetByteArrayElements(jkey, nullptr);
1260 if (key == nullptr) {
1261 // exception thrown: OutOfMemoryError
1262 return;
1263 }
1264
f67539c2
TL
1265 ROCKSDB_NAMESPACE::Slice key_slice(reinterpret_cast<char*>(key),
1266 jkey_part_len);
11fdf7f2
TL
1267 txn->PutLogData(key_slice);
1268
1269 // trigger java unref on key.
1270 // by passing JNI_ABORT, it will simply release the reference without
1271 // copying the result back to the java byte array.
1272 env->ReleaseByteArrayElements(jkey, key, JNI_ABORT);
1273}
1274
1275/*
1276 * Class: org_rocksdb_Transaction
1277 * Method: disableIndexing
1278 * Signature: (J)V
1279 */
1280void Java_org_rocksdb_Transaction_disableIndexing(JNIEnv* /*env*/,
1281 jobject /*jobj*/,
1282 jlong jhandle) {
f67539c2 1283 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2
TL
1284 txn->DisableIndexing();
1285}
1286
1287/*
1288 * Class: org_rocksdb_Transaction
1289 * Method: enableIndexing
1290 * Signature: (J)V
1291 */
1292void Java_org_rocksdb_Transaction_enableIndexing(JNIEnv* /*env*/,
1293 jobject /*jobj*/,
1294 jlong jhandle) {
f67539c2 1295 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2
TL
1296 txn->EnableIndexing();
1297}
1298
1299/*
1300 * Class: org_rocksdb_Transaction
1301 * Method: getNumKeys
1302 * Signature: (J)J
1303 */
1304jlong Java_org_rocksdb_Transaction_getNumKeys(JNIEnv* /*env*/, jobject /*jobj*/,
1305 jlong jhandle) {
f67539c2 1306 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2
TL
1307 return txn->GetNumKeys();
1308}
1309
1310/*
1311 * Class: org_rocksdb_Transaction
1312 * Method: getNumPuts
1313 * Signature: (J)J
1314 */
1315jlong Java_org_rocksdb_Transaction_getNumPuts(JNIEnv* /*env*/, jobject /*jobj*/,
1316 jlong jhandle) {
f67539c2 1317 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2
TL
1318 return txn->GetNumPuts();
1319}
1320
1321/*
1322 * Class: org_rocksdb_Transaction
1323 * Method: getNumDeletes
1324 * Signature: (J)J
1325 */
1326jlong Java_org_rocksdb_Transaction_getNumDeletes(JNIEnv* /*env*/,
1327 jobject /*jobj*/,
1328 jlong jhandle) {
f67539c2 1329 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2
TL
1330 return txn->GetNumDeletes();
1331}
1332
1333/*
1334 * Class: org_rocksdb_Transaction
1335 * Method: getNumMerges
1336 * Signature: (J)J
1337 */
1338jlong Java_org_rocksdb_Transaction_getNumMerges(JNIEnv* /*env*/,
1339 jobject /*jobj*/,
1340 jlong jhandle) {
f67539c2 1341 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2
TL
1342 return txn->GetNumMerges();
1343}
1344
1345/*
1346 * Class: org_rocksdb_Transaction
1347 * Method: getElapsedTime
1348 * Signature: (J)J
1349 */
1350jlong Java_org_rocksdb_Transaction_getElapsedTime(JNIEnv* /*env*/,
1351 jobject /*jobj*/,
1352 jlong jhandle) {
f67539c2 1353 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2
TL
1354 return txn->GetElapsedTime();
1355}
1356
1357/*
1358 * Class: org_rocksdb_Transaction
1359 * Method: getWriteBatch
1360 * Signature: (J)J
1361 */
1362jlong Java_org_rocksdb_Transaction_getWriteBatch(JNIEnv* /*env*/,
1363 jobject /*jobj*/,
1364 jlong jhandle) {
f67539c2 1365 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2
TL
1366 return reinterpret_cast<jlong>(txn->GetWriteBatch());
1367}
1368
1369/*
1370 * Class: org_rocksdb_Transaction
1371 * Method: setLockTimeout
1372 * Signature: (JJ)V
1373 */
1374void Java_org_rocksdb_Transaction_setLockTimeout(JNIEnv* /*env*/,
1375 jobject /*jobj*/,
1376 jlong jhandle,
1377 jlong jlock_timeout) {
f67539c2 1378 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2
TL
1379 txn->SetLockTimeout(jlock_timeout);
1380}
1381
1382/*
1383 * Class: org_rocksdb_Transaction
1384 * Method: getWriteOptions
1385 * Signature: (J)J
1386 */
1387jlong Java_org_rocksdb_Transaction_getWriteOptions(JNIEnv* /*env*/,
1388 jobject /*jobj*/,
1389 jlong jhandle) {
f67539c2 1390 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2
TL
1391 return reinterpret_cast<jlong>(txn->GetWriteOptions());
1392}
1393
1394/*
1395 * Class: org_rocksdb_Transaction
1396 * Method: setWriteOptions
1397 * Signature: (JJ)V
1398 */
1399void Java_org_rocksdb_Transaction_setWriteOptions(JNIEnv* /*env*/,
1400 jobject /*jobj*/,
1401 jlong jhandle,
1402 jlong jwrite_options_handle) {
f67539c2 1403 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2 1404 auto* write_options =
f67539c2 1405 reinterpret_cast<ROCKSDB_NAMESPACE::WriteOptions*>(jwrite_options_handle);
11fdf7f2
TL
1406 txn->SetWriteOptions(*write_options);
1407}
1408
1409/*
1410 * Class: org_rocksdb_Transaction
1411 * Method: undo
1412 * Signature: (J[BIJ)V
1413 */
1414void Java_org_rocksdb_Transaction_undoGetForUpdate__J_3BIJ(
1415 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jbyteArray jkey,
1416 jint jkey_part_len, jlong jcolumn_family_handle) {
f67539c2 1417 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2 1418 auto* column_family_handle =
f67539c2
TL
1419 reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(
1420 jcolumn_family_handle);
11fdf7f2
TL
1421 jbyte* key = env->GetByteArrayElements(jkey, nullptr);
1422 if (key == nullptr) {
1423 // exception thrown: OutOfMemoryError
1424 return;
1425 }
1426
f67539c2
TL
1427 ROCKSDB_NAMESPACE::Slice key_slice(reinterpret_cast<char*>(key),
1428 jkey_part_len);
11fdf7f2
TL
1429 txn->UndoGetForUpdate(column_family_handle, key_slice);
1430
1431 env->ReleaseByteArrayElements(jkey, key, JNI_ABORT);
1432}
1433
1434/*
1435 * Class: org_rocksdb_Transaction
1436 * Method: undoGetForUpdate
1437 * Signature: (J[BI)V
1438 */
1439void Java_org_rocksdb_Transaction_undoGetForUpdate__J_3BI(JNIEnv* env,
1440 jobject /*jobj*/,
1441 jlong jhandle,
1442 jbyteArray jkey,
1443 jint jkey_part_len) {
f67539c2 1444 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2
TL
1445 jbyte* key = env->GetByteArrayElements(jkey, nullptr);
1446 if (key == nullptr) {
1447 // exception thrown: OutOfMemoryError
1448 return;
1449 }
1450
f67539c2
TL
1451 ROCKSDB_NAMESPACE::Slice key_slice(reinterpret_cast<char*>(key),
1452 jkey_part_len);
11fdf7f2
TL
1453 txn->UndoGetForUpdate(key_slice);
1454
1455 env->ReleaseByteArrayElements(jkey, key, JNI_ABORT);
1456}
1457
1458/*
1459 * Class: org_rocksdb_Transaction
1460 * Method: rebuildFromWriteBatch
1461 * Signature: (JJ)V
1462 */
1463void Java_org_rocksdb_Transaction_rebuildFromWriteBatch(
1464 JNIEnv* env, jobject /*jobj*/, jlong jhandle, jlong jwrite_batch_handle) {
f67539c2 1465 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2 1466 auto* write_batch =
f67539c2
TL
1467 reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwrite_batch_handle);
1468 ROCKSDB_NAMESPACE::Status s = txn->RebuildFromWriteBatch(write_batch);
11fdf7f2 1469 if (!s.ok()) {
f67539c2 1470 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
11fdf7f2
TL
1471 }
1472}
1473
1474/*
1475 * Class: org_rocksdb_Transaction
1476 * Method: getCommitTimeWriteBatch
1477 * Signature: (J)J
1478 */
1479jlong Java_org_rocksdb_Transaction_getCommitTimeWriteBatch(JNIEnv* /*env*/,
1480 jobject /*jobj*/,
1481 jlong jhandle) {
f67539c2 1482 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2
TL
1483 return reinterpret_cast<jlong>(txn->GetCommitTimeWriteBatch());
1484}
1485
1486/*
1487 * Class: org_rocksdb_Transaction
1488 * Method: setLogNumber
1489 * Signature: (JJ)V
1490 */
1491void Java_org_rocksdb_Transaction_setLogNumber(JNIEnv* /*env*/,
1492 jobject /*jobj*/, jlong jhandle,
1493 jlong jlog_number) {
f67539c2 1494 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2
TL
1495 txn->SetLogNumber(jlog_number);
1496}
1497
1498/*
1499 * Class: org_rocksdb_Transaction
1500 * Method: getLogNumber
1501 * Signature: (J)J
1502 */
1503jlong Java_org_rocksdb_Transaction_getLogNumber(JNIEnv* /*env*/,
1504 jobject /*jobj*/,
1505 jlong jhandle) {
f67539c2 1506 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2
TL
1507 return txn->GetLogNumber();
1508}
1509
1510/*
1511 * Class: org_rocksdb_Transaction
1512 * Method: setName
1513 * Signature: (JLjava/lang/String;)V
1514 */
1515void Java_org_rocksdb_Transaction_setName(JNIEnv* env, jobject /*jobj*/,
1516 jlong jhandle, jstring jname) {
f67539c2 1517 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2
TL
1518 const char* name = env->GetStringUTFChars(jname, nullptr);
1519 if (name == nullptr) {
1520 // exception thrown: OutOfMemoryError
1521 return;
1522 }
1523
f67539c2 1524 ROCKSDB_NAMESPACE::Status s = txn->SetName(name);
11fdf7f2
TL
1525
1526 env->ReleaseStringUTFChars(jname, name);
1527
1528 if (!s.ok()) {
f67539c2 1529 ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
11fdf7f2
TL
1530 }
1531}
1532
1533/*
1534 * Class: org_rocksdb_Transaction
1535 * Method: getName
1536 * Signature: (J)Ljava/lang/String;
1537 */
1538jstring Java_org_rocksdb_Transaction_getName(JNIEnv* env, jobject /*jobj*/,
1539 jlong jhandle) {
f67539c2
TL
1540 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
1541 ROCKSDB_NAMESPACE::TransactionName name = txn->GetName();
11fdf7f2
TL
1542 return env->NewStringUTF(name.data());
1543}
1544
1545/*
1546 * Class: org_rocksdb_Transaction
1547 * Method: getID
1548 * Signature: (J)J
1549 */
1550jlong Java_org_rocksdb_Transaction_getID(JNIEnv* /*env*/, jobject /*jobj*/,
1551 jlong jhandle) {
f67539c2
TL
1552 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
1553 ROCKSDB_NAMESPACE::TransactionID id = txn->GetID();
11fdf7f2
TL
1554 return static_cast<jlong>(id);
1555}
1556
1557/*
1558 * Class: org_rocksdb_Transaction
1559 * Method: isDeadlockDetect
1560 * Signature: (J)Z
1561 */
1562jboolean Java_org_rocksdb_Transaction_isDeadlockDetect(JNIEnv* /*env*/,
1563 jobject /*jobj*/,
1564 jlong jhandle) {
f67539c2 1565 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2
TL
1566 return static_cast<jboolean>(txn->IsDeadlockDetect());
1567}
1568
1569/*
1570 * Class: org_rocksdb_Transaction
1571 * Method: getWaitingTxns
1572 * Signature: (J)Lorg/rocksdb/Transaction/WaitingTransactions;
1573 */
1574jobject Java_org_rocksdb_Transaction_getWaitingTxns(JNIEnv* env,
1575 jobject jtransaction_obj,
1576 jlong jhandle) {
f67539c2 1577 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2
TL
1578 uint32_t column_family_id;
1579 std::string key;
f67539c2 1580 std::vector<ROCKSDB_NAMESPACE::TransactionID> waiting_txns =
11fdf7f2 1581 txn->GetWaitingTxns(&column_family_id, &key);
f67539c2
TL
1582 jobject jwaiting_txns =
1583 ROCKSDB_NAMESPACE::TransactionJni::newWaitingTransactions(
1584 env, jtransaction_obj, column_family_id, key, waiting_txns);
11fdf7f2
TL
1585 return jwaiting_txns;
1586}
1587
1588/*
1589 * Class: org_rocksdb_Transaction
1590 * Method: getState
1591 * Signature: (J)B
1592 */
1593jbyte Java_org_rocksdb_Transaction_getState(JNIEnv* /*env*/, jobject /*jobj*/,
1594 jlong jhandle) {
f67539c2
TL
1595 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
1596 ROCKSDB_NAMESPACE::Transaction::TransactionState txn_status = txn->GetState();
11fdf7f2 1597 switch (txn_status) {
f67539c2 1598 case ROCKSDB_NAMESPACE::Transaction::TransactionState::STARTED:
11fdf7f2
TL
1599 return 0x0;
1600
f67539c2 1601 case ROCKSDB_NAMESPACE::Transaction::TransactionState::AWAITING_PREPARE:
11fdf7f2
TL
1602 return 0x1;
1603
f67539c2 1604 case ROCKSDB_NAMESPACE::Transaction::TransactionState::PREPARED:
11fdf7f2
TL
1605 return 0x2;
1606
f67539c2 1607 case ROCKSDB_NAMESPACE::Transaction::TransactionState::AWAITING_COMMIT:
11fdf7f2
TL
1608 return 0x3;
1609
20effc67 1610 case ROCKSDB_NAMESPACE::Transaction::TransactionState::COMMITTED:
11fdf7f2
TL
1611 return 0x4;
1612
f67539c2 1613 case ROCKSDB_NAMESPACE::Transaction::TransactionState::AWAITING_ROLLBACK:
11fdf7f2
TL
1614 return 0x5;
1615
f67539c2 1616 case ROCKSDB_NAMESPACE::Transaction::TransactionState::ROLLEDBACK:
11fdf7f2
TL
1617 return 0x6;
1618
f67539c2 1619 case ROCKSDB_NAMESPACE::Transaction::TransactionState::LOCKS_STOLEN:
11fdf7f2
TL
1620 return 0x7;
1621 }
1622
1623 assert(false);
1624 return static_cast<jbyte>(-1);
1625}
1626
1627/*
1628 * Class: org_rocksdb_Transaction
1629 * Method: getId
1630 * Signature: (J)J
1631 */
1632jlong Java_org_rocksdb_Transaction_getId(JNIEnv* /*env*/, jobject /*jobj*/,
1633 jlong jhandle) {
f67539c2 1634 auto* txn = reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2
TL
1635 uint64_t id = txn->GetId();
1636 return static_cast<jlong>(id);
1637}
1638
1639/*
1640 * Class: org_rocksdb_Transaction
1641 * Method: disposeInternal
1642 * Signature: (J)V
1643 */
1644void Java_org_rocksdb_Transaction_disposeInternal(JNIEnv* /*env*/,
1645 jobject /*jobj*/,
1646 jlong jhandle) {
f67539c2 1647 delete reinterpret_cast<ROCKSDB_NAMESPACE::Transaction*>(jhandle);
11fdf7f2 1648}