transaction.cc 62 KB

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