rocksjni.cc 111 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406
  1. // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
  2. // This source code is licensed under both the GPLv2 (found in the
  3. // COPYING file in the root directory) and Apache 2.0 License
  4. // (found in the LICENSE.Apache file in the root directory).
  5. //
  6. // This file implements the "bridge" between Java and C++ and enables
  7. // calling c++ ROCKSDB_NAMESPACE::DB methods from Java side.
  8. #include <jni.h>
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <algorithm>
  12. #include <functional>
  13. #include <memory>
  14. #include <string>
  15. #include <tuple>
  16. #include <vector>
  17. #include "include/org_rocksdb_RocksDB.h"
  18. #include "rocksdb/cache.h"
  19. #include "rocksdb/convenience.h"
  20. #include "rocksdb/db.h"
  21. #include "rocksdb/options.h"
  22. #include "rocksdb/types.h"
  23. #include "rocksjni/portal.h"
  24. #ifdef min
  25. #undef min
  26. #endif
  27. jlong rocksdb_open_helper(JNIEnv* env, jlong jopt_handle, jstring jdb_path,
  28. std::function<ROCKSDB_NAMESPACE::Status(
  29. const ROCKSDB_NAMESPACE::Options&,
  30. const std::string&, ROCKSDB_NAMESPACE::DB**)>
  31. open_fn) {
  32. const char* db_path = env->GetStringUTFChars(jdb_path, nullptr);
  33. if (db_path == nullptr) {
  34. // exception thrown: OutOfMemoryError
  35. return 0;
  36. }
  37. auto* opt = reinterpret_cast<ROCKSDB_NAMESPACE::Options*>(jopt_handle);
  38. ROCKSDB_NAMESPACE::DB* db = nullptr;
  39. ROCKSDB_NAMESPACE::Status s = open_fn(*opt, db_path, &db);
  40. env->ReleaseStringUTFChars(jdb_path, db_path);
  41. if (s.ok()) {
  42. return reinterpret_cast<jlong>(db);
  43. } else {
  44. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  45. return 0;
  46. }
  47. }
  48. /*
  49. * Class: org_rocksdb_RocksDB
  50. * Method: open
  51. * Signature: (JLjava/lang/String;)J
  52. */
  53. jlong Java_org_rocksdb_RocksDB_open__JLjava_lang_String_2(
  54. JNIEnv* env, jclass, jlong jopt_handle, jstring jdb_path) {
  55. return rocksdb_open_helper(env, jopt_handle, jdb_path,
  56. (ROCKSDB_NAMESPACE::Status(*)(
  57. const ROCKSDB_NAMESPACE::Options&,
  58. const std::string&, ROCKSDB_NAMESPACE::DB**)) &
  59. ROCKSDB_NAMESPACE::DB::Open);
  60. }
  61. /*
  62. * Class: org_rocksdb_RocksDB
  63. * Method: openROnly
  64. * Signature: (JLjava/lang/String;)J
  65. */
  66. jlong Java_org_rocksdb_RocksDB_openROnly__JLjava_lang_String_2(
  67. JNIEnv* env, jclass, jlong jopt_handle, jstring jdb_path) {
  68. return rocksdb_open_helper(
  69. env, jopt_handle, jdb_path,
  70. [](const ROCKSDB_NAMESPACE::Options& options, const std::string& db_path,
  71. ROCKSDB_NAMESPACE::DB** db) {
  72. return ROCKSDB_NAMESPACE::DB::OpenForReadOnly(options, db_path, db);
  73. });
  74. }
  75. jlongArray rocksdb_open_helper(
  76. JNIEnv* env, jlong jopt_handle, jstring jdb_path,
  77. jobjectArray jcolumn_names, jlongArray jcolumn_options,
  78. std::function<ROCKSDB_NAMESPACE::Status(
  79. const ROCKSDB_NAMESPACE::DBOptions&, const std::string&,
  80. const std::vector<ROCKSDB_NAMESPACE::ColumnFamilyDescriptor>&,
  81. std::vector<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>*,
  82. ROCKSDB_NAMESPACE::DB**)>
  83. open_fn) {
  84. const char* db_path = env->GetStringUTFChars(jdb_path, nullptr);
  85. if (db_path == nullptr) {
  86. // exception thrown: OutOfMemoryError
  87. return nullptr;
  88. }
  89. const jsize len_cols = env->GetArrayLength(jcolumn_names);
  90. jlong* jco = env->GetLongArrayElements(jcolumn_options, nullptr);
  91. if (jco == nullptr) {
  92. // exception thrown: OutOfMemoryError
  93. env->ReleaseStringUTFChars(jdb_path, db_path);
  94. return nullptr;
  95. }
  96. std::vector<ROCKSDB_NAMESPACE::ColumnFamilyDescriptor> column_families;
  97. jboolean has_exception = JNI_FALSE;
  98. ROCKSDB_NAMESPACE::JniUtil::byteStrings<std::string>(
  99. env, jcolumn_names,
  100. [](const char* str_data, const size_t str_len) {
  101. return std::string(str_data, str_len);
  102. },
  103. [&jco, &column_families](size_t idx, std::string cf_name) {
  104. ROCKSDB_NAMESPACE::ColumnFamilyOptions* cf_options =
  105. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyOptions*>(jco[idx]);
  106. column_families.push_back(
  107. ROCKSDB_NAMESPACE::ColumnFamilyDescriptor(cf_name, *cf_options));
  108. },
  109. &has_exception);
  110. env->ReleaseLongArrayElements(jcolumn_options, jco, JNI_ABORT);
  111. if (has_exception == JNI_TRUE) {
  112. // exception occurred
  113. env->ReleaseStringUTFChars(jdb_path, db_path);
  114. return nullptr;
  115. }
  116. auto* opt = reinterpret_cast<ROCKSDB_NAMESPACE::DBOptions*>(jopt_handle);
  117. std::vector<ROCKSDB_NAMESPACE::ColumnFamilyHandle*> cf_handles;
  118. ROCKSDB_NAMESPACE::DB* db = nullptr;
  119. ROCKSDB_NAMESPACE::Status s =
  120. open_fn(*opt, db_path, column_families, &cf_handles, &db);
  121. // we have now finished with db_path
  122. env->ReleaseStringUTFChars(jdb_path, db_path);
  123. // check if open operation was successful
  124. if (!s.ok()) {
  125. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  126. return nullptr;
  127. }
  128. const jsize resultsLen = 1 + len_cols; // db handle + column family handles
  129. std::unique_ptr<jlong[]> results =
  130. std::unique_ptr<jlong[]>(new jlong[resultsLen]);
  131. results[0] = reinterpret_cast<jlong>(db);
  132. for (int i = 1; i <= len_cols; i++) {
  133. results[i] = reinterpret_cast<jlong>(cf_handles[i - 1]);
  134. }
  135. jlongArray jresults = env->NewLongArray(resultsLen);
  136. if (jresults == nullptr) {
  137. // exception thrown: OutOfMemoryError
  138. return nullptr;
  139. }
  140. env->SetLongArrayRegion(jresults, 0, resultsLen, results.get());
  141. if (env->ExceptionCheck()) {
  142. // exception thrown: ArrayIndexOutOfBoundsException
  143. env->DeleteLocalRef(jresults);
  144. return nullptr;
  145. }
  146. return jresults;
  147. }
  148. /*
  149. * Class: org_rocksdb_RocksDB
  150. * Method: openROnly
  151. * Signature: (JLjava/lang/String;[[B[J)[J
  152. */
  153. jlongArray Java_org_rocksdb_RocksDB_openROnly__JLjava_lang_String_2_3_3B_3J(
  154. JNIEnv* env, jclass, jlong jopt_handle, jstring jdb_path,
  155. jobjectArray jcolumn_names, jlongArray jcolumn_options) {
  156. return rocksdb_open_helper(
  157. env, jopt_handle, jdb_path, jcolumn_names, jcolumn_options,
  158. [](const ROCKSDB_NAMESPACE::DBOptions& options,
  159. const std::string& db_path,
  160. const std::vector<ROCKSDB_NAMESPACE::ColumnFamilyDescriptor>&
  161. column_families,
  162. std::vector<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>* handles,
  163. ROCKSDB_NAMESPACE::DB** db) {
  164. return ROCKSDB_NAMESPACE::DB::OpenForReadOnly(
  165. options, db_path, column_families, handles, db);
  166. });
  167. }
  168. /*
  169. * Class: org_rocksdb_RocksDB
  170. * Method: open
  171. * Signature: (JLjava/lang/String;[[B[J)[J
  172. */
  173. jlongArray Java_org_rocksdb_RocksDB_open__JLjava_lang_String_2_3_3B_3J(
  174. JNIEnv* env, jclass, jlong jopt_handle, jstring jdb_path,
  175. jobjectArray jcolumn_names, jlongArray jcolumn_options) {
  176. return rocksdb_open_helper(
  177. env, jopt_handle, jdb_path, jcolumn_names, jcolumn_options,
  178. (ROCKSDB_NAMESPACE::Status(*)(
  179. const ROCKSDB_NAMESPACE::DBOptions&, const std::string&,
  180. const std::vector<ROCKSDB_NAMESPACE::ColumnFamilyDescriptor>&,
  181. std::vector<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>*,
  182. ROCKSDB_NAMESPACE::DB**)) &
  183. ROCKSDB_NAMESPACE::DB::Open);
  184. }
  185. /*
  186. * Class: org_rocksdb_RocksDB
  187. * Method: disposeInternal
  188. * Signature: (J)V
  189. */
  190. void Java_org_rocksdb_RocksDB_disposeInternal(
  191. JNIEnv*, jobject, jlong jhandle) {
  192. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jhandle);
  193. assert(db != nullptr);
  194. delete db;
  195. }
  196. /*
  197. * Class: org_rocksdb_RocksDB
  198. * Method: closeDatabase
  199. * Signature: (J)V
  200. */
  201. void Java_org_rocksdb_RocksDB_closeDatabase(
  202. JNIEnv* env, jclass, jlong jhandle) {
  203. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jhandle);
  204. assert(db != nullptr);
  205. ROCKSDB_NAMESPACE::Status s = db->Close();
  206. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  207. }
  208. /*
  209. * Class: org_rocksdb_RocksDB
  210. * Method: listColumnFamilies
  211. * Signature: (JLjava/lang/String;)[[B
  212. */
  213. jobjectArray Java_org_rocksdb_RocksDB_listColumnFamilies(
  214. JNIEnv* env, jclass, jlong jopt_handle, jstring jdb_path) {
  215. std::vector<std::string> column_family_names;
  216. const char* db_path = env->GetStringUTFChars(jdb_path, nullptr);
  217. if (db_path == nullptr) {
  218. // exception thrown: OutOfMemoryError
  219. return nullptr;
  220. }
  221. auto* opt = reinterpret_cast<ROCKSDB_NAMESPACE::Options*>(jopt_handle);
  222. ROCKSDB_NAMESPACE::Status s = ROCKSDB_NAMESPACE::DB::ListColumnFamilies(
  223. *opt, db_path, &column_family_names);
  224. env->ReleaseStringUTFChars(jdb_path, db_path);
  225. jobjectArray jcolumn_family_names =
  226. ROCKSDB_NAMESPACE::JniUtil::stringsBytes(env, column_family_names);
  227. return jcolumn_family_names;
  228. }
  229. /*
  230. * Class: org_rocksdb_RocksDB
  231. * Method: createColumnFamily
  232. * Signature: (J[BIJ)J
  233. */
  234. jlong Java_org_rocksdb_RocksDB_createColumnFamily(
  235. JNIEnv* env, jobject, jlong jhandle, jbyteArray jcf_name,
  236. jint jcf_name_len, jlong jcf_options_handle) {
  237. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jhandle);
  238. jboolean has_exception = JNI_FALSE;
  239. const std::string cf_name =
  240. ROCKSDB_NAMESPACE::JniUtil::byteString<std::string>(
  241. env, jcf_name, jcf_name_len,
  242. [](const char* str, const size_t len) {
  243. return std::string(str, len);
  244. },
  245. &has_exception);
  246. if (has_exception == JNI_TRUE) {
  247. // exception occurred
  248. return 0;
  249. }
  250. auto* cf_options = reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyOptions*>(
  251. jcf_options_handle);
  252. ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle;
  253. ROCKSDB_NAMESPACE::Status s =
  254. db->CreateColumnFamily(*cf_options, cf_name, &cf_handle);
  255. if (!s.ok()) {
  256. // error occurred
  257. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  258. return 0;
  259. }
  260. return reinterpret_cast<jlong>(cf_handle);
  261. }
  262. /*
  263. * Class: org_rocksdb_RocksDB
  264. * Method: createColumnFamilies
  265. * Signature: (JJ[[B)[J
  266. */
  267. jlongArray Java_org_rocksdb_RocksDB_createColumnFamilies__JJ_3_3B(
  268. JNIEnv* env, jobject, jlong jhandle, jlong jcf_options_handle,
  269. jobjectArray jcf_names) {
  270. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jhandle);
  271. auto* cf_options = reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyOptions*>(
  272. jcf_options_handle);
  273. jboolean has_exception = JNI_FALSE;
  274. std::vector<std::string> cf_names;
  275. ROCKSDB_NAMESPACE::JniUtil::byteStrings<std::string>(
  276. env, jcf_names,
  277. [](const char* str, const size_t len) { return std::string(str, len); },
  278. [&cf_names](const size_t, std::string str) { cf_names.push_back(str); },
  279. &has_exception);
  280. if (has_exception == JNI_TRUE) {
  281. // exception occurred
  282. return nullptr;
  283. }
  284. std::vector<ROCKSDB_NAMESPACE::ColumnFamilyHandle*> cf_handles;
  285. ROCKSDB_NAMESPACE::Status s =
  286. db->CreateColumnFamilies(*cf_options, cf_names, &cf_handles);
  287. if (!s.ok()) {
  288. // error occurred
  289. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  290. return nullptr;
  291. }
  292. jlongArray jcf_handles = ROCKSDB_NAMESPACE::JniUtil::toJPointers<
  293. ROCKSDB_NAMESPACE::ColumnFamilyHandle>(env, cf_handles, &has_exception);
  294. if (has_exception == JNI_TRUE) {
  295. // exception occurred
  296. return nullptr;
  297. }
  298. return jcf_handles;
  299. }
  300. /*
  301. * Class: org_rocksdb_RocksDB
  302. * Method: createColumnFamilies
  303. * Signature: (J[J[[B)[J
  304. */
  305. jlongArray Java_org_rocksdb_RocksDB_createColumnFamilies__J_3J_3_3B(
  306. JNIEnv* env, jobject, jlong jhandle, jlongArray jcf_options_handles,
  307. jobjectArray jcf_names) {
  308. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jhandle);
  309. const jsize jlen = env->GetArrayLength(jcf_options_handles);
  310. std::vector<ROCKSDB_NAMESPACE::ColumnFamilyDescriptor> cf_descriptors;
  311. cf_descriptors.reserve(jlen);
  312. jboolean jcf_options_handles_is_copy = JNI_FALSE;
  313. jlong *jcf_options_handles_elems = env->GetLongArrayElements(jcf_options_handles, &jcf_options_handles_is_copy);
  314. if(jcf_options_handles_elems == nullptr) {
  315. // exception thrown: OutOfMemoryError
  316. return nullptr;
  317. }
  318. // extract the column family descriptors
  319. jboolean has_exception = JNI_FALSE;
  320. for (jsize i = 0; i < jlen; i++) {
  321. auto* cf_options =
  322. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyOptions*>(
  323. jcf_options_handles_elems[i]);
  324. jbyteArray jcf_name = static_cast<jbyteArray>(
  325. env->GetObjectArrayElement(jcf_names, i));
  326. if (env->ExceptionCheck()) {
  327. // exception thrown: ArrayIndexOutOfBoundsException
  328. env->ReleaseLongArrayElements(jcf_options_handles, jcf_options_handles_elems, JNI_ABORT);
  329. return nullptr;
  330. }
  331. const std::string cf_name =
  332. ROCKSDB_NAMESPACE::JniUtil::byteString<std::string>(
  333. env, jcf_name,
  334. [](const char* str, const size_t len) {
  335. return std::string(str, len);
  336. },
  337. &has_exception);
  338. if (has_exception == JNI_TRUE) {
  339. // exception occurred
  340. env->DeleteLocalRef(jcf_name);
  341. env->ReleaseLongArrayElements(jcf_options_handles, jcf_options_handles_elems, JNI_ABORT);
  342. return nullptr;
  343. }
  344. cf_descriptors.push_back(
  345. ROCKSDB_NAMESPACE::ColumnFamilyDescriptor(cf_name, *cf_options));
  346. env->DeleteLocalRef(jcf_name);
  347. }
  348. std::vector<ROCKSDB_NAMESPACE::ColumnFamilyHandle*> cf_handles;
  349. ROCKSDB_NAMESPACE::Status s =
  350. db->CreateColumnFamilies(cf_descriptors, &cf_handles);
  351. env->ReleaseLongArrayElements(jcf_options_handles, jcf_options_handles_elems, JNI_ABORT);
  352. if (!s.ok()) {
  353. // error occurred
  354. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  355. return nullptr;
  356. }
  357. jlongArray jcf_handles = ROCKSDB_NAMESPACE::JniUtil::toJPointers<
  358. ROCKSDB_NAMESPACE::ColumnFamilyHandle>(env, cf_handles, &has_exception);
  359. if (has_exception == JNI_TRUE) {
  360. // exception occurred
  361. return nullptr;
  362. }
  363. return jcf_handles;
  364. }
  365. /*
  366. * Class: org_rocksdb_RocksDB
  367. * Method: dropColumnFamily
  368. * Signature: (JJ)V;
  369. */
  370. void Java_org_rocksdb_RocksDB_dropColumnFamily(
  371. JNIEnv* env, jobject, jlong jdb_handle,
  372. jlong jcf_handle) {
  373. auto* db_handle = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  374. auto* cf_handle =
  375. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  376. ROCKSDB_NAMESPACE::Status s = db_handle->DropColumnFamily(cf_handle);
  377. if (!s.ok()) {
  378. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  379. }
  380. }
  381. /*
  382. * Class: org_rocksdb_RocksDB
  383. * Method: dropColumnFamilies
  384. * Signature: (J[J)V
  385. */
  386. void Java_org_rocksdb_RocksDB_dropColumnFamilies(
  387. JNIEnv* env, jobject, jlong jdb_handle,
  388. jlongArray jcolumn_family_handles) {
  389. auto* db_handle = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  390. std::vector<ROCKSDB_NAMESPACE::ColumnFamilyHandle*> cf_handles;
  391. if (jcolumn_family_handles != nullptr) {
  392. const jsize len_cols = env->GetArrayLength(jcolumn_family_handles);
  393. jlong* jcfh = env->GetLongArrayElements(jcolumn_family_handles, nullptr);
  394. if (jcfh == nullptr) {
  395. // exception thrown: OutOfMemoryError
  396. return;
  397. }
  398. for (jsize i = 0; i < len_cols; i++) {
  399. auto* cf_handle =
  400. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcfh[i]);
  401. cf_handles.push_back(cf_handle);
  402. }
  403. env->ReleaseLongArrayElements(jcolumn_family_handles, jcfh, JNI_ABORT);
  404. }
  405. ROCKSDB_NAMESPACE::Status s = db_handle->DropColumnFamilies(cf_handles);
  406. if (!s.ok()) {
  407. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  408. }
  409. }
  410. //////////////////////////////////////////////////////////////////////////////
  411. // ROCKSDB_NAMESPACE::DB::Put
  412. /**
  413. * @return true if the put succeeded, false if a Java Exception was thrown
  414. */
  415. bool rocksdb_put_helper(JNIEnv* env, ROCKSDB_NAMESPACE::DB* db,
  416. const ROCKSDB_NAMESPACE::WriteOptions& write_options,
  417. ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle,
  418. jbyteArray jkey, jint jkey_off, jint jkey_len,
  419. jbyteArray jval, jint jval_off, jint jval_len) {
  420. jbyte* key = new jbyte[jkey_len];
  421. env->GetByteArrayRegion(jkey, jkey_off, jkey_len, key);
  422. if (env->ExceptionCheck()) {
  423. // exception thrown: ArrayIndexOutOfBoundsException
  424. delete[] key;
  425. return false;
  426. }
  427. jbyte* value = new jbyte[jval_len];
  428. env->GetByteArrayRegion(jval, jval_off, jval_len, value);
  429. if (env->ExceptionCheck()) {
  430. // exception thrown: ArrayIndexOutOfBoundsException
  431. delete[] value;
  432. delete[] key;
  433. return false;
  434. }
  435. ROCKSDB_NAMESPACE::Slice key_slice(reinterpret_cast<char*>(key), jkey_len);
  436. ROCKSDB_NAMESPACE::Slice value_slice(reinterpret_cast<char*>(value),
  437. jval_len);
  438. ROCKSDB_NAMESPACE::Status s;
  439. if (cf_handle != nullptr) {
  440. s = db->Put(write_options, cf_handle, key_slice, value_slice);
  441. } else {
  442. // backwards compatibility
  443. s = db->Put(write_options, key_slice, value_slice);
  444. }
  445. // cleanup
  446. delete[] value;
  447. delete[] key;
  448. if (s.ok()) {
  449. return true;
  450. } else {
  451. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  452. return false;
  453. }
  454. }
  455. /*
  456. * Class: org_rocksdb_RocksDB
  457. * Method: put
  458. * Signature: (J[BII[BII)V
  459. */
  460. void Java_org_rocksdb_RocksDB_put__J_3BII_3BII(
  461. JNIEnv* env, jobject, jlong jdb_handle,
  462. jbyteArray jkey, jint jkey_off, jint jkey_len,
  463. jbyteArray jval, jint jval_off, jint jval_len) {
  464. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  465. static const ROCKSDB_NAMESPACE::WriteOptions default_write_options =
  466. ROCKSDB_NAMESPACE::WriteOptions();
  467. rocksdb_put_helper(env, db, default_write_options, nullptr, jkey, jkey_off,
  468. jkey_len, jval, jval_off, jval_len);
  469. }
  470. /*
  471. * Class: org_rocksdb_RocksDB
  472. * Method: put
  473. * Signature: (J[BII[BIIJ)V
  474. */
  475. void Java_org_rocksdb_RocksDB_put__J_3BII_3BIIJ(
  476. JNIEnv* env, jobject, jlong jdb_handle,
  477. jbyteArray jkey, jint jkey_off, jint jkey_len,
  478. jbyteArray jval, jint jval_off, jint jval_len,
  479. jlong jcf_handle) {
  480. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  481. static const ROCKSDB_NAMESPACE::WriteOptions default_write_options =
  482. ROCKSDB_NAMESPACE::WriteOptions();
  483. auto* cf_handle =
  484. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  485. if (cf_handle != nullptr) {
  486. rocksdb_put_helper(env, db, default_write_options, cf_handle, jkey,
  487. jkey_off, jkey_len, jval, jval_off, jval_len);
  488. } else {
  489. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
  490. env, ROCKSDB_NAMESPACE::Status::InvalidArgument(
  491. "Invalid ColumnFamilyHandle."));
  492. }
  493. }
  494. /*
  495. * Class: org_rocksdb_RocksDB
  496. * Method: put
  497. * Signature: (JJ[BII[BII)V
  498. */
  499. void Java_org_rocksdb_RocksDB_put__JJ_3BII_3BII(
  500. JNIEnv* env, jobject, jlong jdb_handle,
  501. jlong jwrite_options_handle,
  502. jbyteArray jkey, jint jkey_off, jint jkey_len,
  503. jbyteArray jval, jint jval_off, jint jval_len) {
  504. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  505. auto* write_options =
  506. reinterpret_cast<ROCKSDB_NAMESPACE::WriteOptions*>(jwrite_options_handle);
  507. rocksdb_put_helper(env, db, *write_options, nullptr, jkey, jkey_off, jkey_len,
  508. jval, jval_off, jval_len);
  509. }
  510. /*
  511. * Class: org_rocksdb_RocksDB
  512. * Method: put
  513. * Signature: (JJ[BII[BIIJ)V
  514. */
  515. void Java_org_rocksdb_RocksDB_put__JJ_3BII_3BIIJ(
  516. JNIEnv* env, jobject, jlong jdb_handle, jlong jwrite_options_handle,
  517. jbyteArray jkey, jint jkey_off, jint jkey_len,
  518. jbyteArray jval, jint jval_off, jint jval_len,
  519. jlong jcf_handle) {
  520. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  521. auto* write_options =
  522. reinterpret_cast<ROCKSDB_NAMESPACE::WriteOptions*>(jwrite_options_handle);
  523. auto* cf_handle =
  524. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  525. if (cf_handle != nullptr) {
  526. rocksdb_put_helper(env, db, *write_options, cf_handle, jkey, jkey_off,
  527. jkey_len, jval, jval_off, jval_len);
  528. } else {
  529. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
  530. env, ROCKSDB_NAMESPACE::Status::InvalidArgument(
  531. "Invalid ColumnFamilyHandle."));
  532. }
  533. }
  534. /*
  535. * Class: org_rocksdb_RocksDB
  536. * Method: putDirect
  537. * Signature: (JJLjava/nio/ByteBuffer;IILjava/nio/ByteBuffer;IIJ)V
  538. */
  539. void Java_org_rocksdb_RocksDB_putDirect(
  540. JNIEnv* env, jobject /*jdb*/, jlong jdb_handle, jlong jwrite_options_handle,
  541. jobject jkey, jint jkey_off, jint jkey_len, jobject jval, jint jval_off,
  542. jint jval_len, jlong jcf_handle) {
  543. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  544. auto* write_options =
  545. reinterpret_cast<ROCKSDB_NAMESPACE::WriteOptions*>(jwrite_options_handle);
  546. auto* cf_handle =
  547. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  548. auto put = [&env, &db, &cf_handle, &write_options](
  549. ROCKSDB_NAMESPACE::Slice& key,
  550. ROCKSDB_NAMESPACE::Slice& value) {
  551. ROCKSDB_NAMESPACE::Status s;
  552. if (cf_handle == nullptr) {
  553. s = db->Put(*write_options, key, value);
  554. } else {
  555. s = db->Put(*write_options, cf_handle, key, value);
  556. }
  557. if (s.ok()) {
  558. return;
  559. }
  560. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  561. };
  562. ROCKSDB_NAMESPACE::JniUtil::kv_op_direct(put, env, jkey, jkey_off, jkey_len,
  563. jval, jval_off, jval_len);
  564. }
  565. //////////////////////////////////////////////////////////////////////////////
  566. // ROCKSDB_NAMESPACE::DB::Delete()
  567. /**
  568. * @return true if the delete succeeded, false if a Java Exception was thrown
  569. */
  570. bool rocksdb_delete_helper(JNIEnv* env, ROCKSDB_NAMESPACE::DB* db,
  571. const ROCKSDB_NAMESPACE::WriteOptions& write_options,
  572. ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle,
  573. jbyteArray jkey, jint jkey_off, jint jkey_len) {
  574. jbyte* key = new jbyte[jkey_len];
  575. env->GetByteArrayRegion(jkey, jkey_off, jkey_len, key);
  576. if (env->ExceptionCheck()) {
  577. // exception thrown: ArrayIndexOutOfBoundsException
  578. delete[] key;
  579. return false;
  580. }
  581. ROCKSDB_NAMESPACE::Slice key_slice(reinterpret_cast<char*>(key), jkey_len);
  582. ROCKSDB_NAMESPACE::Status s;
  583. if (cf_handle != nullptr) {
  584. s = db->Delete(write_options, cf_handle, key_slice);
  585. } else {
  586. // backwards compatibility
  587. s = db->Delete(write_options, key_slice);
  588. }
  589. // cleanup
  590. delete[] key;
  591. if (s.ok()) {
  592. return true;
  593. }
  594. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  595. return false;
  596. }
  597. /*
  598. * Class: org_rocksdb_RocksDB
  599. * Method: delete
  600. * Signature: (J[BII)V
  601. */
  602. void Java_org_rocksdb_RocksDB_delete__J_3BII(
  603. JNIEnv* env, jobject, jlong jdb_handle,
  604. jbyteArray jkey, jint jkey_off, jint jkey_len) {
  605. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  606. static const ROCKSDB_NAMESPACE::WriteOptions default_write_options =
  607. ROCKSDB_NAMESPACE::WriteOptions();
  608. rocksdb_delete_helper(env, db, default_write_options, nullptr, jkey, jkey_off,
  609. jkey_len);
  610. }
  611. /*
  612. * Class: org_rocksdb_RocksDB
  613. * Method: delete
  614. * Signature: (J[BIIJ)V
  615. */
  616. void Java_org_rocksdb_RocksDB_delete__J_3BIIJ(
  617. JNIEnv* env, jobject, jlong jdb_handle,
  618. jbyteArray jkey, jint jkey_off, jint jkey_len,
  619. jlong jcf_handle) {
  620. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  621. static const ROCKSDB_NAMESPACE::WriteOptions default_write_options =
  622. ROCKSDB_NAMESPACE::WriteOptions();
  623. auto* cf_handle =
  624. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  625. if (cf_handle != nullptr) {
  626. rocksdb_delete_helper(env, db, default_write_options, cf_handle, jkey,
  627. jkey_off, jkey_len);
  628. } else {
  629. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
  630. env, ROCKSDB_NAMESPACE::Status::InvalidArgument(
  631. "Invalid ColumnFamilyHandle."));
  632. }
  633. }
  634. /*
  635. * Class: org_rocksdb_RocksDB
  636. * Method: delete
  637. * Signature: (JJ[BII)V
  638. */
  639. void Java_org_rocksdb_RocksDB_delete__JJ_3BII(
  640. JNIEnv* env, jobject,
  641. jlong jdb_handle,
  642. jlong jwrite_options,
  643. jbyteArray jkey, jint jkey_off, jint jkey_len) {
  644. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  645. auto* write_options =
  646. reinterpret_cast<ROCKSDB_NAMESPACE::WriteOptions*>(jwrite_options);
  647. rocksdb_delete_helper(env, db, *write_options, nullptr, jkey, jkey_off,
  648. jkey_len);
  649. }
  650. /*
  651. * Class: org_rocksdb_RocksDB
  652. * Method: delete
  653. * Signature: (JJ[BIIJ)V
  654. */
  655. void Java_org_rocksdb_RocksDB_delete__JJ_3BIIJ(
  656. JNIEnv* env, jobject, jlong jdb_handle, jlong jwrite_options,
  657. jbyteArray jkey, jint jkey_off, jint jkey_len, jlong jcf_handle) {
  658. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  659. auto* write_options =
  660. reinterpret_cast<ROCKSDB_NAMESPACE::WriteOptions*>(jwrite_options);
  661. auto* cf_handle =
  662. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  663. if (cf_handle != nullptr) {
  664. rocksdb_delete_helper(env, db, *write_options, cf_handle, jkey, jkey_off,
  665. jkey_len);
  666. } else {
  667. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
  668. env, ROCKSDB_NAMESPACE::Status::InvalidArgument(
  669. "Invalid ColumnFamilyHandle."));
  670. }
  671. }
  672. //////////////////////////////////////////////////////////////////////////////
  673. // ROCKSDB_NAMESPACE::DB::SingleDelete()
  674. /**
  675. * @return true if the single delete succeeded, false if a Java Exception
  676. * was thrown
  677. */
  678. bool rocksdb_single_delete_helper(
  679. JNIEnv* env, ROCKSDB_NAMESPACE::DB* db,
  680. const ROCKSDB_NAMESPACE::WriteOptions& write_options,
  681. ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle, jbyteArray jkey,
  682. jint jkey_len) {
  683. jbyte* key = env->GetByteArrayElements(jkey, nullptr);
  684. if (key == nullptr) {
  685. // exception thrown: OutOfMemoryError
  686. return false;
  687. }
  688. ROCKSDB_NAMESPACE::Slice key_slice(reinterpret_cast<char*>(key), jkey_len);
  689. ROCKSDB_NAMESPACE::Status s;
  690. if (cf_handle != nullptr) {
  691. s = db->SingleDelete(write_options, cf_handle, key_slice);
  692. } else {
  693. // backwards compatibility
  694. s = db->SingleDelete(write_options, key_slice);
  695. }
  696. // trigger java unref on key and value.
  697. // by passing JNI_ABORT, it will simply release the reference without
  698. // copying the result back to the java byte array.
  699. env->ReleaseByteArrayElements(jkey, key, JNI_ABORT);
  700. if (s.ok()) {
  701. return true;
  702. }
  703. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  704. return false;
  705. }
  706. /*
  707. * Class: org_rocksdb_RocksDB
  708. * Method: singleDelete
  709. * Signature: (J[BI)V
  710. */
  711. void Java_org_rocksdb_RocksDB_singleDelete__J_3BI(
  712. JNIEnv* env, jobject,
  713. jlong jdb_handle,
  714. jbyteArray jkey,
  715. jint jkey_len) {
  716. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  717. static const ROCKSDB_NAMESPACE::WriteOptions default_write_options =
  718. ROCKSDB_NAMESPACE::WriteOptions();
  719. rocksdb_single_delete_helper(env, db, default_write_options, nullptr,
  720. jkey, jkey_len);
  721. }
  722. /*
  723. * Class: org_rocksdb_RocksDB
  724. * Method: singleDelete
  725. * Signature: (J[BIJ)V
  726. */
  727. void Java_org_rocksdb_RocksDB_singleDelete__J_3BIJ(
  728. JNIEnv* env, jobject, jlong jdb_handle,
  729. jbyteArray jkey, jint jkey_len, jlong jcf_handle) {
  730. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  731. static const ROCKSDB_NAMESPACE::WriteOptions default_write_options =
  732. ROCKSDB_NAMESPACE::WriteOptions();
  733. auto* cf_handle =
  734. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  735. if (cf_handle != nullptr) {
  736. rocksdb_single_delete_helper(env, db, default_write_options, cf_handle,
  737. jkey, jkey_len);
  738. } else {
  739. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
  740. env, ROCKSDB_NAMESPACE::Status::InvalidArgument(
  741. "Invalid ColumnFamilyHandle."));
  742. }
  743. }
  744. /*
  745. * Class: org_rocksdb_RocksDB
  746. * Method: singleDelete
  747. * Signature: (JJ[BIJ)V
  748. */
  749. void Java_org_rocksdb_RocksDB_singleDelete__JJ_3BI(
  750. JNIEnv* env, jobject, jlong jdb_handle,
  751. jlong jwrite_options,
  752. jbyteArray jkey,
  753. jint jkey_len) {
  754. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  755. auto* write_options =
  756. reinterpret_cast<ROCKSDB_NAMESPACE::WriteOptions*>(jwrite_options);
  757. rocksdb_single_delete_helper(env, db, *write_options, nullptr, jkey,
  758. jkey_len);
  759. }
  760. /*
  761. * Class: org_rocksdb_RocksDB
  762. * Method: singleDelete
  763. * Signature: (JJ[BIJ)V
  764. */
  765. void Java_org_rocksdb_RocksDB_singleDelete__JJ_3BIJ(
  766. JNIEnv* env, jobject, jlong jdb_handle, jlong jwrite_options,
  767. jbyteArray jkey, jint jkey_len, jlong jcf_handle) {
  768. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  769. auto* write_options =
  770. reinterpret_cast<ROCKSDB_NAMESPACE::WriteOptions*>(jwrite_options);
  771. auto* cf_handle =
  772. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  773. if (cf_handle != nullptr) {
  774. rocksdb_single_delete_helper(env, db, *write_options, cf_handle, jkey,
  775. jkey_len);
  776. } else {
  777. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
  778. env, ROCKSDB_NAMESPACE::Status::InvalidArgument(
  779. "Invalid ColumnFamilyHandle."));
  780. }
  781. }
  782. //////////////////////////////////////////////////////////////////////////////
  783. // ROCKSDB_NAMESPACE::DB::DeleteRange()
  784. /**
  785. * @return true if the delete range succeeded, false if a Java Exception
  786. * was thrown
  787. */
  788. bool rocksdb_delete_range_helper(
  789. JNIEnv* env, ROCKSDB_NAMESPACE::DB* db,
  790. const ROCKSDB_NAMESPACE::WriteOptions& write_options,
  791. ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle, jbyteArray jbegin_key,
  792. jint jbegin_key_off, jint jbegin_key_len, jbyteArray jend_key,
  793. jint jend_key_off, jint jend_key_len) {
  794. jbyte* begin_key = new jbyte[jbegin_key_len];
  795. env->GetByteArrayRegion(jbegin_key, jbegin_key_off, jbegin_key_len,
  796. begin_key);
  797. if (env->ExceptionCheck()) {
  798. // exception thrown: ArrayIndexOutOfBoundsException
  799. delete[] begin_key;
  800. return false;
  801. }
  802. ROCKSDB_NAMESPACE::Slice begin_key_slice(reinterpret_cast<char*>(begin_key),
  803. jbegin_key_len);
  804. jbyte* end_key = new jbyte[jend_key_len];
  805. env->GetByteArrayRegion(jend_key, jend_key_off, jend_key_len, end_key);
  806. if (env->ExceptionCheck()) {
  807. // exception thrown: ArrayIndexOutOfBoundsException
  808. delete[] begin_key;
  809. delete[] end_key;
  810. return false;
  811. }
  812. ROCKSDB_NAMESPACE::Slice end_key_slice(reinterpret_cast<char*>(end_key),
  813. jend_key_len);
  814. ROCKSDB_NAMESPACE::Status s =
  815. db->DeleteRange(write_options, cf_handle, begin_key_slice, end_key_slice);
  816. // cleanup
  817. delete[] begin_key;
  818. delete[] end_key;
  819. if (s.ok()) {
  820. return true;
  821. }
  822. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  823. return false;
  824. }
  825. /*
  826. * Class: org_rocksdb_RocksDB
  827. * Method: deleteRange
  828. * Signature: (J[BII[BII)V
  829. */
  830. void Java_org_rocksdb_RocksDB_deleteRange__J_3BII_3BII(
  831. JNIEnv* env, jobject, jlong jdb_handle,
  832. jbyteArray jbegin_key, jint jbegin_key_off, jint jbegin_key_len,
  833. jbyteArray jend_key, jint jend_key_off, jint jend_key_len) {
  834. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  835. static const ROCKSDB_NAMESPACE::WriteOptions default_write_options =
  836. ROCKSDB_NAMESPACE::WriteOptions();
  837. rocksdb_delete_range_helper(env, db, default_write_options, nullptr,
  838. jbegin_key, jbegin_key_off, jbegin_key_len,
  839. jend_key, jend_key_off, jend_key_len);
  840. }
  841. jint rocksdb_get_helper_direct(
  842. JNIEnv* env, ROCKSDB_NAMESPACE::DB* db,
  843. const ROCKSDB_NAMESPACE::ReadOptions& read_options,
  844. ROCKSDB_NAMESPACE::ColumnFamilyHandle* column_family_handle, jobject jkey,
  845. jint jkey_off, jint jkey_len, jobject jval, jint jval_off, jint jval_len,
  846. bool* has_exception) {
  847. static const int kNotFound = -1;
  848. static const int kStatusError = -2;
  849. static const int kArgumentError = -3;
  850. char* key = reinterpret_cast<char*>(env->GetDirectBufferAddress(jkey));
  851. if (key == nullptr) {
  852. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
  853. env,
  854. "Invalid key argument (argument is not a valid direct ByteBuffer)");
  855. *has_exception = true;
  856. return kArgumentError;
  857. }
  858. if (env->GetDirectBufferCapacity(jkey) < (jkey_off + jkey_len)) {
  859. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
  860. env,
  861. "Invalid key argument. Capacity is less than requested region (offset "
  862. "+ length).");
  863. *has_exception = true;
  864. return kArgumentError;
  865. }
  866. char* value = reinterpret_cast<char*>(env->GetDirectBufferAddress(jval));
  867. if (value == nullptr) {
  868. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
  869. env,
  870. "Invalid value argument (argument is not a valid direct ByteBuffer)");
  871. *has_exception = true;
  872. return kArgumentError;
  873. }
  874. if (env->GetDirectBufferCapacity(jval) < (jval_off + jval_len)) {
  875. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
  876. env,
  877. "Invalid value argument. Capacity is less than requested region "
  878. "(offset + length).");
  879. *has_exception = true;
  880. return kArgumentError;
  881. }
  882. key += jkey_off;
  883. value += jval_off;
  884. ROCKSDB_NAMESPACE::Slice key_slice(key, jkey_len);
  885. // TODO(yhchiang): we might save one memory allocation here by adding
  886. // a DB::Get() function which takes preallocated jbyte* as input.
  887. std::string cvalue;
  888. ROCKSDB_NAMESPACE::Status s;
  889. if (column_family_handle != nullptr) {
  890. s = db->Get(read_options, column_family_handle, key_slice, &cvalue);
  891. } else {
  892. // backwards compatibility
  893. s = db->Get(read_options, key_slice, &cvalue);
  894. }
  895. if (s.IsNotFound()) {
  896. *has_exception = false;
  897. return kNotFound;
  898. } else if (!s.ok()) {
  899. *has_exception = true;
  900. // Here since we are throwing a Java exception from c++ side.
  901. // As a result, c++ does not know calling this function will in fact
  902. // throwing an exception. As a result, the execution flow will
  903. // not stop here, and codes after this throw will still be
  904. // executed.
  905. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  906. // Return a dummy const value to avoid compilation error, although
  907. // java side might not have a chance to get the return value :)
  908. return kStatusError;
  909. }
  910. const jint cvalue_len = static_cast<jint>(cvalue.size());
  911. const jint length = std::min(jval_len, cvalue_len);
  912. memcpy(value, cvalue.c_str(), length);
  913. *has_exception = false;
  914. return cvalue_len;
  915. }
  916. /*
  917. * Class: org_rocksdb_RocksDB
  918. * Method: deleteRange
  919. * Signature: (J[BII[BIIJ)V
  920. */
  921. void Java_org_rocksdb_RocksDB_deleteRange__J_3BII_3BIIJ(
  922. JNIEnv* env, jobject, jlong jdb_handle,
  923. jbyteArray jbegin_key, jint jbegin_key_off, jint jbegin_key_len,
  924. jbyteArray jend_key, jint jend_key_off, jint jend_key_len,
  925. jlong jcf_handle) {
  926. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  927. static const ROCKSDB_NAMESPACE::WriteOptions default_write_options =
  928. ROCKSDB_NAMESPACE::WriteOptions();
  929. auto* cf_handle =
  930. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  931. if (cf_handle != nullptr) {
  932. rocksdb_delete_range_helper(env, db, default_write_options, cf_handle,
  933. jbegin_key, jbegin_key_off, jbegin_key_len,
  934. jend_key, jend_key_off, jend_key_len);
  935. } else {
  936. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
  937. env, ROCKSDB_NAMESPACE::Status::InvalidArgument(
  938. "Invalid ColumnFamilyHandle."));
  939. }
  940. }
  941. /*
  942. * Class: org_rocksdb_RocksDB
  943. * Method: deleteRange
  944. * Signature: (JJ[BII[BII)V
  945. */
  946. void Java_org_rocksdb_RocksDB_deleteRange__JJ_3BII_3BII(
  947. JNIEnv* env, jobject, jlong jdb_handle, jlong jwrite_options,
  948. jbyteArray jbegin_key, jint jbegin_key_off, jint jbegin_key_len,
  949. jbyteArray jend_key, jint jend_key_off, jint jend_key_len) {
  950. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  951. auto* write_options =
  952. reinterpret_cast<ROCKSDB_NAMESPACE::WriteOptions*>(jwrite_options);
  953. rocksdb_delete_range_helper(env, db, *write_options, nullptr, jbegin_key,
  954. jbegin_key_off, jbegin_key_len, jend_key,
  955. jend_key_off, jend_key_len);
  956. }
  957. /*
  958. * Class: org_rocksdb_RocksDB
  959. * Method: deleteRange
  960. * Signature: (JJ[BII[BIIJ)V
  961. */
  962. void Java_org_rocksdb_RocksDB_deleteRange__JJ_3BII_3BIIJ(
  963. JNIEnv* env, jobject, jlong jdb_handle, jlong jwrite_options,
  964. jbyteArray jbegin_key, jint jbegin_key_off, jint jbegin_key_len,
  965. jbyteArray jend_key, jint jend_key_off, jint jend_key_len,
  966. jlong jcf_handle) {
  967. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  968. auto* write_options =
  969. reinterpret_cast<ROCKSDB_NAMESPACE::WriteOptions*>(jwrite_options);
  970. auto* cf_handle =
  971. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  972. if (cf_handle != nullptr) {
  973. rocksdb_delete_range_helper(env, db, *write_options, cf_handle,
  974. jbegin_key, jbegin_key_off, jbegin_key_len,
  975. jend_key, jend_key_off, jend_key_len);
  976. } else {
  977. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
  978. env, ROCKSDB_NAMESPACE::Status::InvalidArgument(
  979. "Invalid ColumnFamilyHandle."));
  980. }
  981. }
  982. /*
  983. * Class: org_rocksdb_RocksDB
  984. * Method: getDirect
  985. * Signature: (JJLjava/nio/ByteBuffer;IILjava/nio/ByteBuffer;IIJ)I
  986. */
  987. jint Java_org_rocksdb_RocksDB_getDirect(JNIEnv* env, jobject /*jdb*/,
  988. jlong jdb_handle, jlong jropt_handle,
  989. jobject jkey, jint jkey_off,
  990. jint jkey_len, jobject jval,
  991. jint jval_off, jint jval_len,
  992. jlong jcf_handle) {
  993. auto* db_handle = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  994. auto* ro_opt =
  995. reinterpret_cast<ROCKSDB_NAMESPACE::ReadOptions*>(jropt_handle);
  996. auto* cf_handle =
  997. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  998. bool has_exception = false;
  999. return rocksdb_get_helper_direct(
  1000. env, db_handle,
  1001. ro_opt == nullptr ? ROCKSDB_NAMESPACE::ReadOptions() : *ro_opt, cf_handle,
  1002. jkey, jkey_off, jkey_len, jval, jval_off, jval_len, &has_exception);
  1003. }
  1004. //////////////////////////////////////////////////////////////////////////////
  1005. // ROCKSDB_NAMESPACE::DB::Merge
  1006. /**
  1007. * @return true if the merge succeeded, false if a Java Exception was thrown
  1008. */
  1009. bool rocksdb_merge_helper(JNIEnv* env, ROCKSDB_NAMESPACE::DB* db,
  1010. const ROCKSDB_NAMESPACE::WriteOptions& write_options,
  1011. ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle,
  1012. jbyteArray jkey, jint jkey_off, jint jkey_len,
  1013. jbyteArray jval, jint jval_off, jint jval_len) {
  1014. jbyte* key = new jbyte[jkey_len];
  1015. env->GetByteArrayRegion(jkey, jkey_off, jkey_len, key);
  1016. if (env->ExceptionCheck()) {
  1017. // exception thrown: ArrayIndexOutOfBoundsException
  1018. delete[] key;
  1019. return false;
  1020. }
  1021. ROCKSDB_NAMESPACE::Slice key_slice(reinterpret_cast<char*>(key), jkey_len);
  1022. jbyte* value = new jbyte[jval_len];
  1023. env->GetByteArrayRegion(jval, jval_off, jval_len, value);
  1024. if (env->ExceptionCheck()) {
  1025. // exception thrown: ArrayIndexOutOfBoundsException
  1026. delete[] value;
  1027. delete[] key;
  1028. return false;
  1029. }
  1030. ROCKSDB_NAMESPACE::Slice value_slice(reinterpret_cast<char*>(value),
  1031. jval_len);
  1032. ROCKSDB_NAMESPACE::Status s;
  1033. if (cf_handle != nullptr) {
  1034. s = db->Merge(write_options, cf_handle, key_slice, value_slice);
  1035. } else {
  1036. s = db->Merge(write_options, key_slice, value_slice);
  1037. }
  1038. // cleanup
  1039. delete[] value;
  1040. delete[] key;
  1041. if (s.ok()) {
  1042. return true;
  1043. }
  1044. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  1045. return false;
  1046. }
  1047. /*
  1048. * Class: org_rocksdb_RocksDB
  1049. * Method: merge
  1050. * Signature: (J[BII[BII)V
  1051. */
  1052. void Java_org_rocksdb_RocksDB_merge__J_3BII_3BII(
  1053. JNIEnv* env, jobject, jlong jdb_handle,
  1054. jbyteArray jkey, jint jkey_off, jint jkey_len,
  1055. jbyteArray jval, jint jval_off, jint jval_len) {
  1056. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  1057. static const ROCKSDB_NAMESPACE::WriteOptions default_write_options =
  1058. ROCKSDB_NAMESPACE::WriteOptions();
  1059. rocksdb_merge_helper(env, db, default_write_options, nullptr, jkey, jkey_off,
  1060. jkey_len, jval, jval_off, jval_len);
  1061. }
  1062. /*
  1063. * Class: org_rocksdb_RocksDB
  1064. * Method: merge
  1065. * Signature: (J[BII[BIIJ)V
  1066. */
  1067. void Java_org_rocksdb_RocksDB_merge__J_3BII_3BIIJ(
  1068. JNIEnv* env, jobject, jlong jdb_handle,
  1069. jbyteArray jkey, jint jkey_off, jint jkey_len,
  1070. jbyteArray jval, jint jval_off, jint jval_len,
  1071. jlong jcf_handle) {
  1072. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  1073. static const ROCKSDB_NAMESPACE::WriteOptions default_write_options =
  1074. ROCKSDB_NAMESPACE::WriteOptions();
  1075. auto* cf_handle =
  1076. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  1077. if (cf_handle != nullptr) {
  1078. rocksdb_merge_helper(env, db, default_write_options, cf_handle, jkey,
  1079. jkey_off, jkey_len, jval, jval_off, jval_len);
  1080. } else {
  1081. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
  1082. env, ROCKSDB_NAMESPACE::Status::InvalidArgument(
  1083. "Invalid ColumnFamilyHandle."));
  1084. }
  1085. }
  1086. /*
  1087. * Class: org_rocksdb_RocksDB
  1088. * Method: merge
  1089. * Signature: (JJ[BII[BII)V
  1090. */
  1091. void Java_org_rocksdb_RocksDB_merge__JJ_3BII_3BII(
  1092. JNIEnv* env, jobject, jlong jdb_handle, jlong jwrite_options_handle,
  1093. jbyteArray jkey, jint jkey_off, jint jkey_len,
  1094. jbyteArray jval, jint jval_off, jint jval_len) {
  1095. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  1096. auto* write_options =
  1097. reinterpret_cast<ROCKSDB_NAMESPACE::WriteOptions*>(jwrite_options_handle);
  1098. rocksdb_merge_helper(env, db, *write_options, nullptr, jkey, jkey_off,
  1099. jkey_len, jval, jval_off, jval_len);
  1100. }
  1101. /*
  1102. * Class: org_rocksdb_RocksDB
  1103. * Method: merge
  1104. * Signature: (JJ[BII[BIIJ)V
  1105. */
  1106. void Java_org_rocksdb_RocksDB_merge__JJ_3BII_3BIIJ(
  1107. JNIEnv* env, jobject, jlong jdb_handle, jlong jwrite_options_handle,
  1108. jbyteArray jkey, jint jkey_off, jint jkey_len,
  1109. jbyteArray jval, jint jval_off, jint jval_len, jlong jcf_handle) {
  1110. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  1111. auto* write_options =
  1112. reinterpret_cast<ROCKSDB_NAMESPACE::WriteOptions*>(jwrite_options_handle);
  1113. auto* cf_handle =
  1114. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  1115. if (cf_handle != nullptr) {
  1116. rocksdb_merge_helper(env, db, *write_options, cf_handle, jkey, jkey_off,
  1117. jkey_len, jval, jval_off, jval_len);
  1118. } else {
  1119. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
  1120. env, ROCKSDB_NAMESPACE::Status::InvalidArgument(
  1121. "Invalid ColumnFamilyHandle."));
  1122. }
  1123. }
  1124. jlong rocksdb_iterator_helper(
  1125. ROCKSDB_NAMESPACE::DB* db, ROCKSDB_NAMESPACE::ReadOptions read_options,
  1126. ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle) {
  1127. ROCKSDB_NAMESPACE::Iterator* iterator = nullptr;
  1128. if (cf_handle != nullptr) {
  1129. iterator = db->NewIterator(read_options, cf_handle);
  1130. } else {
  1131. iterator = db->NewIterator(read_options);
  1132. }
  1133. return reinterpret_cast<jlong>(iterator);
  1134. }
  1135. /*
  1136. * Class: org_rocksdb_RocksDB
  1137. * Method: deleteDirect
  1138. * Signature: (JJLjava/nio/ByteBuffer;IIJ)V
  1139. */
  1140. void Java_org_rocksdb_RocksDB_deleteDirect(JNIEnv* env, jobject /*jdb*/,
  1141. jlong jdb_handle,
  1142. jlong jwrite_options, jobject jkey,
  1143. jint jkey_offset, jint jkey_len,
  1144. jlong jcf_handle) {
  1145. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  1146. auto* write_options =
  1147. reinterpret_cast<ROCKSDB_NAMESPACE::WriteOptions*>(jwrite_options);
  1148. auto* cf_handle =
  1149. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  1150. auto remove = [&env, &db, &write_options,
  1151. &cf_handle](ROCKSDB_NAMESPACE::Slice& key) {
  1152. ROCKSDB_NAMESPACE::Status s;
  1153. if (cf_handle == nullptr) {
  1154. s = db->Delete(*write_options, key);
  1155. } else {
  1156. s = db->Delete(*write_options, cf_handle, key);
  1157. }
  1158. if (s.ok()) {
  1159. return;
  1160. }
  1161. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  1162. };
  1163. ROCKSDB_NAMESPACE::JniUtil::k_op_direct(remove, env, jkey, jkey_offset,
  1164. jkey_len);
  1165. }
  1166. //////////////////////////////////////////////////////////////////////////////
  1167. // ROCKSDB_NAMESPACE::DB::Write
  1168. /*
  1169. * Class: org_rocksdb_RocksDB
  1170. * Method: write0
  1171. * Signature: (JJJ)V
  1172. */
  1173. void Java_org_rocksdb_RocksDB_write0(
  1174. JNIEnv* env, jobject, jlong jdb_handle,
  1175. jlong jwrite_options_handle, jlong jwb_handle) {
  1176. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  1177. auto* write_options =
  1178. reinterpret_cast<ROCKSDB_NAMESPACE::WriteOptions*>(jwrite_options_handle);
  1179. auto* wb = reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatch*>(jwb_handle);
  1180. ROCKSDB_NAMESPACE::Status s = db->Write(*write_options, wb);
  1181. if (!s.ok()) {
  1182. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  1183. }
  1184. }
  1185. /*
  1186. * Class: org_rocksdb_RocksDB
  1187. * Method: write1
  1188. * Signature: (JJJ)V
  1189. */
  1190. void Java_org_rocksdb_RocksDB_write1(
  1191. JNIEnv* env, jobject, jlong jdb_handle,
  1192. jlong jwrite_options_handle, jlong jwbwi_handle) {
  1193. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  1194. auto* write_options =
  1195. reinterpret_cast<ROCKSDB_NAMESPACE::WriteOptions*>(jwrite_options_handle);
  1196. auto* wbwi =
  1197. reinterpret_cast<ROCKSDB_NAMESPACE::WriteBatchWithIndex*>(jwbwi_handle);
  1198. auto* wb = wbwi->GetWriteBatch();
  1199. ROCKSDB_NAMESPACE::Status s = db->Write(*write_options, wb);
  1200. if (!s.ok()) {
  1201. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  1202. }
  1203. }
  1204. //////////////////////////////////////////////////////////////////////////////
  1205. // ROCKSDB_NAMESPACE::DB::Get
  1206. jbyteArray rocksdb_get_helper(
  1207. JNIEnv* env, ROCKSDB_NAMESPACE::DB* db,
  1208. const ROCKSDB_NAMESPACE::ReadOptions& read_opt,
  1209. ROCKSDB_NAMESPACE::ColumnFamilyHandle* column_family_handle,
  1210. jbyteArray jkey, jint jkey_off, jint jkey_len) {
  1211. jbyte* key = new jbyte[jkey_len];
  1212. env->GetByteArrayRegion(jkey, jkey_off, jkey_len, key);
  1213. if (env->ExceptionCheck()) {
  1214. // exception thrown: ArrayIndexOutOfBoundsException
  1215. delete[] key;
  1216. return nullptr;
  1217. }
  1218. ROCKSDB_NAMESPACE::Slice key_slice(reinterpret_cast<char*>(key), jkey_len);
  1219. std::string value;
  1220. ROCKSDB_NAMESPACE::Status s;
  1221. if (column_family_handle != nullptr) {
  1222. s = db->Get(read_opt, column_family_handle, key_slice, &value);
  1223. } else {
  1224. // backwards compatibility
  1225. s = db->Get(read_opt, key_slice, &value);
  1226. }
  1227. // cleanup
  1228. delete[] key;
  1229. if (s.IsNotFound()) {
  1230. return nullptr;
  1231. }
  1232. if (s.ok()) {
  1233. jbyteArray jret_value = ROCKSDB_NAMESPACE::JniUtil::copyBytes(env, value);
  1234. if (jret_value == nullptr) {
  1235. // exception occurred
  1236. return nullptr;
  1237. }
  1238. return jret_value;
  1239. }
  1240. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  1241. return nullptr;
  1242. }
  1243. /*
  1244. * Class: org_rocksdb_RocksDB
  1245. * Method: get
  1246. * Signature: (J[BII)[B
  1247. */
  1248. jbyteArray Java_org_rocksdb_RocksDB_get__J_3BII(
  1249. JNIEnv* env, jobject, jlong jdb_handle,
  1250. jbyteArray jkey, jint jkey_off, jint jkey_len) {
  1251. return rocksdb_get_helper(
  1252. env, reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle),
  1253. ROCKSDB_NAMESPACE::ReadOptions(), nullptr, jkey, jkey_off, jkey_len);
  1254. }
  1255. /*
  1256. * Class: org_rocksdb_RocksDB
  1257. * Method: get
  1258. * Signature: (J[BIIJ)[B
  1259. */
  1260. jbyteArray Java_org_rocksdb_RocksDB_get__J_3BIIJ(
  1261. JNIEnv* env, jobject, jlong jdb_handle,
  1262. jbyteArray jkey, jint jkey_off, jint jkey_len, jlong jcf_handle) {
  1263. auto db_handle = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  1264. auto cf_handle =
  1265. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  1266. if (cf_handle != nullptr) {
  1267. return rocksdb_get_helper(env, db_handle, ROCKSDB_NAMESPACE::ReadOptions(),
  1268. cf_handle, jkey, jkey_off, jkey_len);
  1269. } else {
  1270. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
  1271. env, ROCKSDB_NAMESPACE::Status::InvalidArgument(
  1272. "Invalid ColumnFamilyHandle."));
  1273. return nullptr;
  1274. }
  1275. }
  1276. /*
  1277. * Class: org_rocksdb_RocksDB
  1278. * Method: get
  1279. * Signature: (JJ[BII)[B
  1280. */
  1281. jbyteArray Java_org_rocksdb_RocksDB_get__JJ_3BII(
  1282. JNIEnv* env, jobject,
  1283. jlong jdb_handle, jlong jropt_handle,
  1284. jbyteArray jkey, jint jkey_off, jint jkey_len) {
  1285. return rocksdb_get_helper(
  1286. env, reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle),
  1287. *reinterpret_cast<ROCKSDB_NAMESPACE::ReadOptions*>(jropt_handle), nullptr,
  1288. jkey, jkey_off, jkey_len);
  1289. }
  1290. /*
  1291. * Class: org_rocksdb_RocksDB
  1292. * Method: get
  1293. * Signature: (JJ[BIIJ)[B
  1294. */
  1295. jbyteArray Java_org_rocksdb_RocksDB_get__JJ_3BIIJ(
  1296. JNIEnv* env, jobject, jlong jdb_handle, jlong jropt_handle,
  1297. jbyteArray jkey, jint jkey_off, jint jkey_len, jlong jcf_handle) {
  1298. auto* db_handle = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  1299. auto& ro_opt =
  1300. *reinterpret_cast<ROCKSDB_NAMESPACE::ReadOptions*>(jropt_handle);
  1301. auto* cf_handle =
  1302. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  1303. if (cf_handle != nullptr) {
  1304. return rocksdb_get_helper(
  1305. env, db_handle, ro_opt, cf_handle, jkey, jkey_off, jkey_len);
  1306. } else {
  1307. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
  1308. env, ROCKSDB_NAMESPACE::Status::InvalidArgument(
  1309. "Invalid ColumnFamilyHandle."));
  1310. return nullptr;
  1311. }
  1312. }
  1313. jint rocksdb_get_helper(
  1314. JNIEnv* env, ROCKSDB_NAMESPACE::DB* db,
  1315. const ROCKSDB_NAMESPACE::ReadOptions& read_options,
  1316. ROCKSDB_NAMESPACE::ColumnFamilyHandle* column_family_handle,
  1317. jbyteArray jkey, jint jkey_off, jint jkey_len, jbyteArray jval,
  1318. jint jval_off, jint jval_len, bool* has_exception) {
  1319. static const int kNotFound = -1;
  1320. static const int kStatusError = -2;
  1321. jbyte* key = new jbyte[jkey_len];
  1322. env->GetByteArrayRegion(jkey, jkey_off, jkey_len, key);
  1323. if (env->ExceptionCheck()) {
  1324. // exception thrown: OutOfMemoryError
  1325. delete[] key;
  1326. *has_exception = true;
  1327. return kStatusError;
  1328. }
  1329. ROCKSDB_NAMESPACE::Slice key_slice(reinterpret_cast<char*>(key), jkey_len);
  1330. // TODO(yhchiang): we might save one memory allocation here by adding
  1331. // a DB::Get() function which takes preallocated jbyte* as input.
  1332. std::string cvalue;
  1333. ROCKSDB_NAMESPACE::Status s;
  1334. if (column_family_handle != nullptr) {
  1335. s = db->Get(read_options, column_family_handle, key_slice, &cvalue);
  1336. } else {
  1337. // backwards compatibility
  1338. s = db->Get(read_options, key_slice, &cvalue);
  1339. }
  1340. // cleanup
  1341. delete[] key;
  1342. if (s.IsNotFound()) {
  1343. *has_exception = false;
  1344. return kNotFound;
  1345. } else if (!s.ok()) {
  1346. *has_exception = true;
  1347. // Here since we are throwing a Java exception from c++ side.
  1348. // As a result, c++ does not know calling this function will in fact
  1349. // throwing an exception. As a result, the execution flow will
  1350. // not stop here, and codes after this throw will still be
  1351. // executed.
  1352. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  1353. // Return a dummy const value to avoid compilation error, although
  1354. // java side might not have a chance to get the return value :)
  1355. return kStatusError;
  1356. }
  1357. const jint cvalue_len = static_cast<jint>(cvalue.size());
  1358. const jint length = std::min(jval_len, cvalue_len);
  1359. env->SetByteArrayRegion(
  1360. jval, jval_off, length,
  1361. const_cast<jbyte*>(reinterpret_cast<const jbyte*>(cvalue.c_str())));
  1362. if (env->ExceptionCheck()) {
  1363. // exception thrown: OutOfMemoryError
  1364. *has_exception = true;
  1365. return kStatusError;
  1366. }
  1367. *has_exception = false;
  1368. return cvalue_len;
  1369. }
  1370. /*
  1371. * Class: org_rocksdb_RocksDB
  1372. * Method: get
  1373. * Signature: (J[BII[BII)I
  1374. */
  1375. jint Java_org_rocksdb_RocksDB_get__J_3BII_3BII(
  1376. JNIEnv* env, jobject, jlong jdb_handle,
  1377. jbyteArray jkey, jint jkey_off, jint jkey_len,
  1378. jbyteArray jval, jint jval_off, jint jval_len) {
  1379. bool has_exception = false;
  1380. return rocksdb_get_helper(
  1381. env, reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle),
  1382. ROCKSDB_NAMESPACE::ReadOptions(), nullptr, jkey, jkey_off, jkey_len, jval,
  1383. jval_off, jval_len, &has_exception);
  1384. }
  1385. /*
  1386. * Class: org_rocksdb_RocksDB
  1387. * Method: get
  1388. * Signature: (J[BII[BIIJ)I
  1389. */
  1390. jint Java_org_rocksdb_RocksDB_get__J_3BII_3BIIJ(
  1391. JNIEnv* env, jobject, jlong jdb_handle,
  1392. jbyteArray jkey, jint jkey_off, jint jkey_len,
  1393. jbyteArray jval, jint jval_off, jint jval_len,
  1394. jlong jcf_handle) {
  1395. auto* db_handle = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  1396. auto* cf_handle =
  1397. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  1398. if (cf_handle != nullptr) {
  1399. bool has_exception = false;
  1400. return rocksdb_get_helper(env, db_handle, ROCKSDB_NAMESPACE::ReadOptions(),
  1401. cf_handle, jkey, jkey_off, jkey_len, jval,
  1402. jval_off, jval_len, &has_exception);
  1403. } else {
  1404. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
  1405. env, ROCKSDB_NAMESPACE::Status::InvalidArgument(
  1406. "Invalid ColumnFamilyHandle."));
  1407. // will never be evaluated
  1408. return 0;
  1409. }
  1410. }
  1411. /*
  1412. * Class: org_rocksdb_RocksDB
  1413. * Method: get
  1414. * Signature: (JJ[BII[BII)I
  1415. */
  1416. jint Java_org_rocksdb_RocksDB_get__JJ_3BII_3BII(
  1417. JNIEnv* env, jobject, jlong jdb_handle, jlong jropt_handle,
  1418. jbyteArray jkey, jint jkey_off, jint jkey_len,
  1419. jbyteArray jval, jint jval_off, jint jval_len) {
  1420. bool has_exception = false;
  1421. return rocksdb_get_helper(
  1422. env, reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle),
  1423. *reinterpret_cast<ROCKSDB_NAMESPACE::ReadOptions*>(jropt_handle), nullptr,
  1424. jkey, jkey_off, jkey_len, jval, jval_off, jval_len, &has_exception);
  1425. }
  1426. /*
  1427. * Class: org_rocksdb_RocksDB
  1428. * Method: get
  1429. * Signature: (JJ[BII[BIIJ)I
  1430. */
  1431. jint Java_org_rocksdb_RocksDB_get__JJ_3BII_3BIIJ(
  1432. JNIEnv* env, jobject, jlong jdb_handle, jlong jropt_handle,
  1433. jbyteArray jkey, jint jkey_off, jint jkey_len,
  1434. jbyteArray jval, jint jval_off, jint jval_len,
  1435. jlong jcf_handle) {
  1436. auto* db_handle = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  1437. auto& ro_opt =
  1438. *reinterpret_cast<ROCKSDB_NAMESPACE::ReadOptions*>(jropt_handle);
  1439. auto* cf_handle =
  1440. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  1441. if (cf_handle != nullptr) {
  1442. bool has_exception = false;
  1443. return rocksdb_get_helper(env, db_handle, ro_opt, cf_handle,
  1444. jkey, jkey_off, jkey_len,
  1445. jval, jval_off, jval_len,
  1446. &has_exception);
  1447. } else {
  1448. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
  1449. env, ROCKSDB_NAMESPACE::Status::InvalidArgument(
  1450. "Invalid ColumnFamilyHandle."));
  1451. // will never be evaluated
  1452. return 0;
  1453. }
  1454. }
  1455. inline void multi_get_helper_release_keys(
  1456. JNIEnv* env, std::vector<std::pair<jbyte*, jobject>>& keys_to_free) {
  1457. auto end = keys_to_free.end();
  1458. for (auto it = keys_to_free.begin(); it != end; ++it) {
  1459. delete[] it->first;
  1460. env->DeleteLocalRef(it->second);
  1461. }
  1462. keys_to_free.clear();
  1463. }
  1464. /**
  1465. * cf multi get
  1466. *
  1467. * @return byte[][] of values or nullptr if an exception occurs
  1468. */
  1469. jobjectArray multi_get_helper(JNIEnv* env, jobject, ROCKSDB_NAMESPACE::DB* db,
  1470. const ROCKSDB_NAMESPACE::ReadOptions& rOpt,
  1471. jobjectArray jkeys, jintArray jkey_offs,
  1472. jintArray jkey_lens,
  1473. jlongArray jcolumn_family_handles) {
  1474. std::vector<ROCKSDB_NAMESPACE::ColumnFamilyHandle*> cf_handles;
  1475. if (jcolumn_family_handles != nullptr) {
  1476. const jsize len_cols = env->GetArrayLength(jcolumn_family_handles);
  1477. jlong* jcfh = env->GetLongArrayElements(jcolumn_family_handles, nullptr);
  1478. if (jcfh == nullptr) {
  1479. // exception thrown: OutOfMemoryError
  1480. return nullptr;
  1481. }
  1482. for (jsize i = 0; i < len_cols; i++) {
  1483. auto* cf_handle =
  1484. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcfh[i]);
  1485. cf_handles.push_back(cf_handle);
  1486. }
  1487. env->ReleaseLongArrayElements(jcolumn_family_handles, jcfh, JNI_ABORT);
  1488. }
  1489. const jsize len_keys = env->GetArrayLength(jkeys);
  1490. if (env->EnsureLocalCapacity(len_keys) != 0) {
  1491. // exception thrown: OutOfMemoryError
  1492. return nullptr;
  1493. }
  1494. jint* jkey_off = env->GetIntArrayElements(jkey_offs, nullptr);
  1495. if (jkey_off == nullptr) {
  1496. // exception thrown: OutOfMemoryError
  1497. return nullptr;
  1498. }
  1499. jint* jkey_len = env->GetIntArrayElements(jkey_lens, nullptr);
  1500. if (jkey_len == nullptr) {
  1501. // exception thrown: OutOfMemoryError
  1502. env->ReleaseIntArrayElements(jkey_offs, jkey_off, JNI_ABORT);
  1503. return nullptr;
  1504. }
  1505. std::vector<ROCKSDB_NAMESPACE::Slice> keys;
  1506. std::vector<std::pair<jbyte*, jobject>> keys_to_free;
  1507. for (jsize i = 0; i < len_keys; i++) {
  1508. jobject jkey = env->GetObjectArrayElement(jkeys, i);
  1509. if (env->ExceptionCheck()) {
  1510. // exception thrown: ArrayIndexOutOfBoundsException
  1511. env->ReleaseIntArrayElements(jkey_lens, jkey_len, JNI_ABORT);
  1512. env->ReleaseIntArrayElements(jkey_offs, jkey_off, JNI_ABORT);
  1513. multi_get_helper_release_keys(env, keys_to_free);
  1514. return nullptr;
  1515. }
  1516. jbyteArray jkey_ba = reinterpret_cast<jbyteArray>(jkey);
  1517. const jint len_key = jkey_len[i];
  1518. jbyte* key = new jbyte[len_key];
  1519. env->GetByteArrayRegion(jkey_ba, jkey_off[i], len_key, key);
  1520. if (env->ExceptionCheck()) {
  1521. // exception thrown: ArrayIndexOutOfBoundsException
  1522. delete[] key;
  1523. env->DeleteLocalRef(jkey);
  1524. env->ReleaseIntArrayElements(jkey_lens, jkey_len, JNI_ABORT);
  1525. env->ReleaseIntArrayElements(jkey_offs, jkey_off, JNI_ABORT);
  1526. multi_get_helper_release_keys(env, keys_to_free);
  1527. return nullptr;
  1528. }
  1529. ROCKSDB_NAMESPACE::Slice key_slice(reinterpret_cast<char*>(key), len_key);
  1530. keys.push_back(key_slice);
  1531. keys_to_free.push_back(std::pair<jbyte*, jobject>(key, jkey));
  1532. }
  1533. // cleanup jkey_off and jken_len
  1534. env->ReleaseIntArrayElements(jkey_lens, jkey_len, JNI_ABORT);
  1535. env->ReleaseIntArrayElements(jkey_offs, jkey_off, JNI_ABORT);
  1536. std::vector<std::string> values;
  1537. std::vector<ROCKSDB_NAMESPACE::Status> s;
  1538. if (cf_handles.size() == 0) {
  1539. s = db->MultiGet(rOpt, keys, &values);
  1540. } else {
  1541. s = db->MultiGet(rOpt, cf_handles, keys, &values);
  1542. }
  1543. // free up allocated byte arrays
  1544. multi_get_helper_release_keys(env, keys_to_free);
  1545. // prepare the results
  1546. jobjectArray jresults = ROCKSDB_NAMESPACE::ByteJni::new2dByteArray(
  1547. env, static_cast<jsize>(s.size()));
  1548. if (jresults == nullptr) {
  1549. // exception occurred
  1550. return nullptr;
  1551. }
  1552. // TODO(AR) it is not clear to me why EnsureLocalCapacity is needed for the
  1553. // loop as we cleanup references with env->DeleteLocalRef(jentry_value);
  1554. if (env->EnsureLocalCapacity(static_cast<jint>(s.size())) != 0) {
  1555. // exception thrown: OutOfMemoryError
  1556. return nullptr;
  1557. }
  1558. // add to the jresults
  1559. for (std::vector<ROCKSDB_NAMESPACE::Status>::size_type i = 0; i != s.size();
  1560. i++) {
  1561. if (s[i].ok()) {
  1562. std::string* value = &values[i];
  1563. const jsize jvalue_len = static_cast<jsize>(value->size());
  1564. jbyteArray jentry_value = env->NewByteArray(jvalue_len);
  1565. if (jentry_value == nullptr) {
  1566. // exception thrown: OutOfMemoryError
  1567. return nullptr;
  1568. }
  1569. env->SetByteArrayRegion(
  1570. jentry_value, 0, static_cast<jsize>(jvalue_len),
  1571. const_cast<jbyte*>(reinterpret_cast<const jbyte*>(value->c_str())));
  1572. if (env->ExceptionCheck()) {
  1573. // exception thrown: ArrayIndexOutOfBoundsException
  1574. env->DeleteLocalRef(jentry_value);
  1575. return nullptr;
  1576. }
  1577. env->SetObjectArrayElement(jresults, static_cast<jsize>(i), jentry_value);
  1578. if (env->ExceptionCheck()) {
  1579. // exception thrown: ArrayIndexOutOfBoundsException
  1580. env->DeleteLocalRef(jentry_value);
  1581. return nullptr;
  1582. }
  1583. env->DeleteLocalRef(jentry_value);
  1584. }
  1585. }
  1586. return jresults;
  1587. }
  1588. /*
  1589. * Class: org_rocksdb_RocksDB
  1590. * Method: multiGet
  1591. * Signature: (J[[B[I[I)[[B
  1592. */
  1593. jobjectArray Java_org_rocksdb_RocksDB_multiGet__J_3_3B_3I_3I(
  1594. JNIEnv* env, jobject jdb, jlong jdb_handle,
  1595. jobjectArray jkeys, jintArray jkey_offs, jintArray jkey_lens) {
  1596. return multi_get_helper(
  1597. env, jdb, reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle),
  1598. ROCKSDB_NAMESPACE::ReadOptions(), jkeys, jkey_offs, jkey_lens, nullptr);
  1599. }
  1600. /*
  1601. * Class: org_rocksdb_RocksDB
  1602. * Method: multiGet
  1603. * Signature: (J[[B[I[I[J)[[B
  1604. */
  1605. jobjectArray Java_org_rocksdb_RocksDB_multiGet__J_3_3B_3I_3I_3J(
  1606. JNIEnv* env, jobject jdb, jlong jdb_handle,
  1607. jobjectArray jkeys, jintArray jkey_offs, jintArray jkey_lens,
  1608. jlongArray jcolumn_family_handles) {
  1609. return multi_get_helper(env, jdb,
  1610. reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle),
  1611. ROCKSDB_NAMESPACE::ReadOptions(), jkeys, jkey_offs,
  1612. jkey_lens, jcolumn_family_handles);
  1613. }
  1614. /*
  1615. * Class: org_rocksdb_RocksDB
  1616. * Method: multiGet
  1617. * Signature: (JJ[[B[I[I)[[B
  1618. */
  1619. jobjectArray Java_org_rocksdb_RocksDB_multiGet__JJ_3_3B_3I_3I(
  1620. JNIEnv* env, jobject jdb, jlong jdb_handle, jlong jropt_handle,
  1621. jobjectArray jkeys, jintArray jkey_offs, jintArray jkey_lens) {
  1622. return multi_get_helper(
  1623. env, jdb, reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle),
  1624. *reinterpret_cast<ROCKSDB_NAMESPACE::ReadOptions*>(jropt_handle), jkeys,
  1625. jkey_offs, jkey_lens, nullptr);
  1626. }
  1627. /*
  1628. * Class: org_rocksdb_RocksDB
  1629. * Method: multiGet
  1630. * Signature: (JJ[[B[I[I[J)[[B
  1631. */
  1632. jobjectArray Java_org_rocksdb_RocksDB_multiGet__JJ_3_3B_3I_3I_3J(
  1633. JNIEnv* env, jobject jdb, jlong jdb_handle, jlong jropt_handle,
  1634. jobjectArray jkeys, jintArray jkey_offs, jintArray jkey_lens,
  1635. jlongArray jcolumn_family_handles) {
  1636. return multi_get_helper(
  1637. env, jdb, reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle),
  1638. *reinterpret_cast<ROCKSDB_NAMESPACE::ReadOptions*>(jropt_handle), jkeys,
  1639. jkey_offs, jkey_lens, jcolumn_family_handles);
  1640. }
  1641. //////////////////////////////////////////////////////////////////////////////
  1642. // ROCKSDB_NAMESPACE::DB::KeyMayExist
  1643. bool key_may_exist_helper(JNIEnv* env, jlong jdb_handle, jlong jcf_handle,
  1644. jlong jread_opts_handle,
  1645. jbyteArray jkey, jint jkey_offset, jint jkey_len,
  1646. bool* has_exception, std::string* value, bool* value_found) {
  1647. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  1648. ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle;
  1649. if (jcf_handle == 0) {
  1650. cf_handle = db->DefaultColumnFamily();
  1651. } else {
  1652. cf_handle =
  1653. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  1654. }
  1655. ROCKSDB_NAMESPACE::ReadOptions read_opts =
  1656. jread_opts_handle == 0
  1657. ? ROCKSDB_NAMESPACE::ReadOptions()
  1658. : *(reinterpret_cast<ROCKSDB_NAMESPACE::ReadOptions*>(
  1659. jread_opts_handle));
  1660. jbyte* key = new jbyte[jkey_len];
  1661. env->GetByteArrayRegion(jkey, jkey_offset, jkey_len, key);
  1662. if (env->ExceptionCheck()) {
  1663. // exception thrown: ArrayIndexOutOfBoundsException
  1664. delete[] key;
  1665. *has_exception = true;
  1666. return false;
  1667. }
  1668. ROCKSDB_NAMESPACE::Slice key_slice(reinterpret_cast<char*>(key), jkey_len);
  1669. const bool exists = db->KeyMayExist(
  1670. read_opts, cf_handle, key_slice, value, value_found);
  1671. // cleanup
  1672. delete[] key;
  1673. return exists;
  1674. }
  1675. /*
  1676. * Class: org_rocksdb_RocksDB
  1677. * Method: keyMayExist
  1678. * Signature: (JJJ[BII)Z
  1679. */
  1680. jboolean Java_org_rocksdb_RocksDB_keyMayExist(
  1681. JNIEnv* env, jobject, jlong jdb_handle, jlong jcf_handle,
  1682. jlong jread_opts_handle,
  1683. jbyteArray jkey, jint jkey_offset, jint jkey_len) {
  1684. bool has_exception = false;
  1685. std::string value;
  1686. bool value_found = false;
  1687. const bool exists = key_may_exist_helper(
  1688. env, jdb_handle, jcf_handle, jread_opts_handle,
  1689. jkey, jkey_offset, jkey_len,
  1690. &has_exception, &value, &value_found);
  1691. if (has_exception) {
  1692. // java exception already raised
  1693. return false;
  1694. }
  1695. return static_cast<jboolean>(exists);
  1696. }
  1697. /*
  1698. * Class: org_rocksdb_RocksDB
  1699. * Method: keyMayExistFoundValue
  1700. * Signature: (JJJ[BII)[[B
  1701. */
  1702. jobjectArray Java_org_rocksdb_RocksDB_keyMayExistFoundValue(
  1703. JNIEnv* env, jobject, jlong jdb_handle, jlong jcf_handle,
  1704. jlong jread_opts_handle,
  1705. jbyteArray jkey, jint jkey_offset, jint jkey_len) {
  1706. bool has_exception = false;
  1707. std::string value;
  1708. bool value_found = false;
  1709. const bool exists = key_may_exist_helper(
  1710. env, jdb_handle, jcf_handle, jread_opts_handle,
  1711. jkey, jkey_offset, jkey_len,
  1712. &has_exception, &value, &value_found);
  1713. if (has_exception) {
  1714. // java exception already raised
  1715. return nullptr;
  1716. }
  1717. jbyte result_flags[1];
  1718. if (!exists) {
  1719. result_flags[0] = 0;
  1720. } else if (!value_found) {
  1721. result_flags[0] = 1;
  1722. } else {
  1723. // found
  1724. result_flags[0] = 2;
  1725. }
  1726. jobjectArray jresults = ROCKSDB_NAMESPACE::ByteJni::new2dByteArray(env, 2);
  1727. if (jresults == nullptr) {
  1728. // exception occurred
  1729. return nullptr;
  1730. }
  1731. // prepare the result flag
  1732. jbyteArray jresult_flags = env->NewByteArray(1);
  1733. if (jresult_flags == nullptr) {
  1734. // exception thrown: OutOfMemoryError
  1735. return nullptr;
  1736. }
  1737. env->SetByteArrayRegion(jresult_flags, 0, 1, result_flags);
  1738. if (env->ExceptionCheck()) {
  1739. // exception thrown: ArrayIndexOutOfBoundsException
  1740. env->DeleteLocalRef(jresult_flags);
  1741. return nullptr;
  1742. }
  1743. env->SetObjectArrayElement(jresults, 0, jresult_flags);
  1744. if (env->ExceptionCheck()) {
  1745. // exception thrown: ArrayIndexOutOfBoundsException
  1746. env->DeleteLocalRef(jresult_flags);
  1747. return nullptr;
  1748. }
  1749. env->DeleteLocalRef(jresult_flags);
  1750. if (result_flags[0] == 2) {
  1751. // set the value
  1752. const jsize jvalue_len = static_cast<jsize>(value.size());
  1753. jbyteArray jresult_value = env->NewByteArray(jvalue_len);
  1754. if (jresult_value == nullptr) {
  1755. // exception thrown: OutOfMemoryError
  1756. return nullptr;
  1757. }
  1758. env->SetByteArrayRegion(jresult_value, 0, jvalue_len,
  1759. const_cast<jbyte*>(reinterpret_cast<const jbyte*>(value.data())));
  1760. if (env->ExceptionCheck()) {
  1761. // exception thrown: ArrayIndexOutOfBoundsException
  1762. env->DeleteLocalRef(jresult_value);
  1763. return nullptr;
  1764. }
  1765. env->SetObjectArrayElement(jresults, 1, jresult_value);
  1766. if (env->ExceptionCheck()) {
  1767. // exception thrown: ArrayIndexOutOfBoundsException
  1768. env->DeleteLocalRef(jresult_value);
  1769. return nullptr;
  1770. }
  1771. env->DeleteLocalRef(jresult_value);
  1772. }
  1773. return jresults;
  1774. }
  1775. /*
  1776. * Class: org_rocksdb_RocksDB
  1777. * Method: iterator
  1778. * Signature: (J)J
  1779. */
  1780. jlong Java_org_rocksdb_RocksDB_iterator__J(
  1781. JNIEnv*, jobject, jlong db_handle) {
  1782. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(db_handle);
  1783. return rocksdb_iterator_helper(db, ROCKSDB_NAMESPACE::ReadOptions(), nullptr);
  1784. }
  1785. /*
  1786. * Class: org_rocksdb_RocksDB
  1787. * Method: iterator
  1788. * Signature: (JJ)J
  1789. */
  1790. jlong Java_org_rocksdb_RocksDB_iterator__JJ(
  1791. JNIEnv*, jobject, jlong db_handle, jlong jread_options_handle) {
  1792. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(db_handle);
  1793. auto& read_options =
  1794. *reinterpret_cast<ROCKSDB_NAMESPACE::ReadOptions*>(jread_options_handle);
  1795. return rocksdb_iterator_helper(db, read_options, nullptr);
  1796. }
  1797. /*
  1798. * Class: org_rocksdb_RocksDB
  1799. * Method: iteratorCF
  1800. * Signature: (JJ)J
  1801. */
  1802. jlong Java_org_rocksdb_RocksDB_iteratorCF__JJ(
  1803. JNIEnv*, jobject, jlong db_handle, jlong jcf_handle) {
  1804. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(db_handle);
  1805. auto* cf_handle =
  1806. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  1807. return rocksdb_iterator_helper(db, ROCKSDB_NAMESPACE::ReadOptions(),
  1808. cf_handle);
  1809. }
  1810. /*
  1811. * Class: org_rocksdb_RocksDB
  1812. * Method: iteratorCF
  1813. * Signature: (JJJ)J
  1814. */
  1815. jlong Java_org_rocksdb_RocksDB_iteratorCF__JJJ(
  1816. JNIEnv*, jobject,
  1817. jlong db_handle, jlong jcf_handle, jlong jread_options_handle) {
  1818. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(db_handle);
  1819. auto* cf_handle =
  1820. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  1821. auto& read_options =
  1822. *reinterpret_cast<ROCKSDB_NAMESPACE::ReadOptions*>(jread_options_handle);
  1823. return rocksdb_iterator_helper(db, read_options, cf_handle);
  1824. }
  1825. /*
  1826. * Class: org_rocksdb_RocksDB
  1827. * Method: iterators
  1828. * Signature: (J[JJ)[J
  1829. */
  1830. jlongArray Java_org_rocksdb_RocksDB_iterators(
  1831. JNIEnv* env, jobject, jlong db_handle,
  1832. jlongArray jcolumn_family_handles,
  1833. jlong jread_options_handle) {
  1834. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(db_handle);
  1835. auto& read_options =
  1836. *reinterpret_cast<ROCKSDB_NAMESPACE::ReadOptions*>(jread_options_handle);
  1837. std::vector<ROCKSDB_NAMESPACE::ColumnFamilyHandle*> cf_handles;
  1838. if (jcolumn_family_handles != nullptr) {
  1839. const jsize len_cols = env->GetArrayLength(jcolumn_family_handles);
  1840. jlong* jcfh = env->GetLongArrayElements(jcolumn_family_handles, nullptr);
  1841. if (jcfh == nullptr) {
  1842. // exception thrown: OutOfMemoryError
  1843. return nullptr;
  1844. }
  1845. for (jsize i = 0; i < len_cols; i++) {
  1846. auto* cf_handle =
  1847. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcfh[i]);
  1848. cf_handles.push_back(cf_handle);
  1849. }
  1850. env->ReleaseLongArrayElements(jcolumn_family_handles, jcfh, JNI_ABORT);
  1851. }
  1852. std::vector<ROCKSDB_NAMESPACE::Iterator*> iterators;
  1853. ROCKSDB_NAMESPACE::Status s =
  1854. db->NewIterators(read_options, cf_handles, &iterators);
  1855. if (s.ok()) {
  1856. jlongArray jLongArray =
  1857. env->NewLongArray(static_cast<jsize>(iterators.size()));
  1858. if (jLongArray == nullptr) {
  1859. // exception thrown: OutOfMemoryError
  1860. return nullptr;
  1861. }
  1862. for (std::vector<ROCKSDB_NAMESPACE::Iterator*>::size_type i = 0;
  1863. i < iterators.size(); i++) {
  1864. env->SetLongArrayRegion(
  1865. jLongArray, static_cast<jsize>(i), 1,
  1866. const_cast<jlong*>(reinterpret_cast<const jlong*>(&iterators[i])));
  1867. if (env->ExceptionCheck()) {
  1868. // exception thrown: ArrayIndexOutOfBoundsException
  1869. env->DeleteLocalRef(jLongArray);
  1870. return nullptr;
  1871. }
  1872. }
  1873. return jLongArray;
  1874. } else {
  1875. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  1876. return nullptr;
  1877. }
  1878. }
  1879. /*
  1880. * Method: getSnapshot
  1881. * Signature: (J)J
  1882. */
  1883. jlong Java_org_rocksdb_RocksDB_getSnapshot(
  1884. JNIEnv*, jobject, jlong db_handle) {
  1885. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(db_handle);
  1886. const ROCKSDB_NAMESPACE::Snapshot* snapshot = db->GetSnapshot();
  1887. return reinterpret_cast<jlong>(snapshot);
  1888. }
  1889. /*
  1890. * Method: releaseSnapshot
  1891. * Signature: (JJ)V
  1892. */
  1893. void Java_org_rocksdb_RocksDB_releaseSnapshot(
  1894. JNIEnv*, jobject, jlong db_handle,
  1895. jlong snapshot_handle) {
  1896. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(db_handle);
  1897. auto* snapshot =
  1898. reinterpret_cast<ROCKSDB_NAMESPACE::Snapshot*>(snapshot_handle);
  1899. db->ReleaseSnapshot(snapshot);
  1900. }
  1901. /*
  1902. * Class: org_rocksdb_RocksDB
  1903. * Method: getProperty
  1904. * Signature: (JJLjava/lang/String;I)Ljava/lang/String;
  1905. */
  1906. jstring Java_org_rocksdb_RocksDB_getProperty(
  1907. JNIEnv* env, jobject, jlong jdb_handle, jlong jcf_handle,
  1908. jstring jproperty, jint jproperty_len) {
  1909. const char* property = env->GetStringUTFChars(jproperty, nullptr);
  1910. if (property == nullptr) {
  1911. // exception thrown: OutOfMemoryError
  1912. return nullptr;
  1913. }
  1914. ROCKSDB_NAMESPACE::Slice property_name(property, jproperty_len);
  1915. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  1916. ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle;
  1917. if (jcf_handle == 0) {
  1918. cf_handle = db->DefaultColumnFamily();
  1919. } else {
  1920. cf_handle =
  1921. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  1922. }
  1923. std::string property_value;
  1924. bool retCode = db->GetProperty(cf_handle, property_name, &property_value);
  1925. env->ReleaseStringUTFChars(jproperty, property);
  1926. if (retCode) {
  1927. return env->NewStringUTF(property_value.c_str());
  1928. }
  1929. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
  1930. env, ROCKSDB_NAMESPACE::Status::NotFound());
  1931. return nullptr;
  1932. }
  1933. /*
  1934. * Class: org_rocksdb_RocksDB
  1935. * Method: getMapProperty
  1936. * Signature: (JJLjava/lang/String;I)Ljava/util/Map;
  1937. */
  1938. jobject Java_org_rocksdb_RocksDB_getMapProperty(
  1939. JNIEnv* env, jobject, jlong jdb_handle, jlong jcf_handle,
  1940. jstring jproperty, jint jproperty_len) {
  1941. const char* property = env->GetStringUTFChars(jproperty, nullptr);
  1942. if (property == nullptr) {
  1943. // exception thrown: OutOfMemoryError
  1944. return nullptr;
  1945. }
  1946. ROCKSDB_NAMESPACE::Slice property_name(property, jproperty_len);
  1947. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  1948. ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle;
  1949. if (jcf_handle == 0) {
  1950. cf_handle = db->DefaultColumnFamily();
  1951. } else {
  1952. cf_handle =
  1953. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  1954. }
  1955. std::map<std::string, std::string> property_value;
  1956. bool retCode = db->GetMapProperty(cf_handle, property_name, &property_value);
  1957. env->ReleaseStringUTFChars(jproperty, property);
  1958. if (retCode) {
  1959. return ROCKSDB_NAMESPACE::HashMapJni::fromCppMap(env, &property_value);
  1960. }
  1961. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
  1962. env, ROCKSDB_NAMESPACE::Status::NotFound());
  1963. return nullptr;
  1964. }
  1965. /*
  1966. * Class: org_rocksdb_RocksDB
  1967. * Method: getLongProperty
  1968. * Signature: (JJLjava/lang/String;I)J
  1969. */
  1970. jlong Java_org_rocksdb_RocksDB_getLongProperty(
  1971. JNIEnv* env, jobject, jlong jdb_handle, jlong jcf_handle,
  1972. jstring jproperty, jint jproperty_len) {
  1973. const char* property = env->GetStringUTFChars(jproperty, nullptr);
  1974. if (property == nullptr) {
  1975. // exception thrown: OutOfMemoryError
  1976. return 0;
  1977. }
  1978. ROCKSDB_NAMESPACE::Slice property_name(property, jproperty_len);
  1979. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  1980. ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle;
  1981. if (jcf_handle == 0) {
  1982. cf_handle = db->DefaultColumnFamily();
  1983. } else {
  1984. cf_handle =
  1985. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  1986. }
  1987. uint64_t property_value;
  1988. bool retCode = db->GetIntProperty(cf_handle, property_name, &property_value);
  1989. env->ReleaseStringUTFChars(jproperty, property);
  1990. if (retCode) {
  1991. return property_value;
  1992. }
  1993. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
  1994. env, ROCKSDB_NAMESPACE::Status::NotFound());
  1995. return 0;
  1996. }
  1997. /*
  1998. * Class: org_rocksdb_RocksDB
  1999. * Method: resetStats
  2000. * Signature: (J)V
  2001. */
  2002. void Java_org_rocksdb_RocksDB_resetStats(
  2003. JNIEnv *, jobject, jlong jdb_handle) {
  2004. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2005. db->ResetStats();
  2006. }
  2007. /*
  2008. * Class: org_rocksdb_RocksDB
  2009. * Method: getAggregatedLongProperty
  2010. * Signature: (JLjava/lang/String;I)J
  2011. */
  2012. jlong Java_org_rocksdb_RocksDB_getAggregatedLongProperty(
  2013. JNIEnv* env, jobject, jlong db_handle,
  2014. jstring jproperty, jint jproperty_len) {
  2015. const char* property = env->GetStringUTFChars(jproperty, nullptr);
  2016. if (property == nullptr) {
  2017. return 0;
  2018. }
  2019. ROCKSDB_NAMESPACE::Slice property_name(property, jproperty_len);
  2020. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(db_handle);
  2021. uint64_t property_value = 0;
  2022. bool retCode = db->GetAggregatedIntProperty(property_name, &property_value);
  2023. env->ReleaseStringUTFChars(jproperty, property);
  2024. if (retCode) {
  2025. return property_value;
  2026. }
  2027. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
  2028. env, ROCKSDB_NAMESPACE::Status::NotFound());
  2029. return 0;
  2030. }
  2031. /*
  2032. * Class: org_rocksdb_RocksDB
  2033. * Method: getApproximateSizes
  2034. * Signature: (JJ[JB)[J
  2035. */
  2036. jlongArray Java_org_rocksdb_RocksDB_getApproximateSizes(
  2037. JNIEnv* env, jobject, jlong jdb_handle, jlong jcf_handle,
  2038. jlongArray jrange_slice_handles, jbyte jinclude_flags) {
  2039. const jsize jlen = env->GetArrayLength(jrange_slice_handles);
  2040. const size_t range_count = jlen / 2;
  2041. jboolean jranges_is_copy = JNI_FALSE;
  2042. jlong* jranges = env->GetLongArrayElements(jrange_slice_handles,
  2043. &jranges_is_copy);
  2044. if (jranges == nullptr) {
  2045. // exception thrown: OutOfMemoryError
  2046. return nullptr;
  2047. }
  2048. auto ranges = std::unique_ptr<ROCKSDB_NAMESPACE::Range[]>(
  2049. new ROCKSDB_NAMESPACE::Range[range_count]);
  2050. for (jsize i = 0; i < jlen; ++i) {
  2051. auto* start = reinterpret_cast<ROCKSDB_NAMESPACE::Slice*>(jranges[i]);
  2052. auto* limit = reinterpret_cast<ROCKSDB_NAMESPACE::Slice*>(jranges[++i]);
  2053. ranges.get()[i] = ROCKSDB_NAMESPACE::Range(*start, *limit);
  2054. }
  2055. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2056. ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle;
  2057. if (jcf_handle == 0) {
  2058. cf_handle = db->DefaultColumnFamily();
  2059. } else {
  2060. cf_handle =
  2061. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  2062. }
  2063. auto sizes = std::unique_ptr<uint64_t[]>(new uint64_t[range_count]);
  2064. db->GetApproximateSizes(cf_handle, ranges.get(),
  2065. static_cast<int>(range_count), sizes.get(),
  2066. static_cast<uint8_t>(jinclude_flags));
  2067. // release LongArrayElements
  2068. env->ReleaseLongArrayElements(jrange_slice_handles, jranges, JNI_ABORT);
  2069. // prepare results
  2070. auto results = std::unique_ptr<jlong[]>(new jlong[range_count]);
  2071. for (size_t i = 0; i < range_count; ++i) {
  2072. results.get()[i] = static_cast<jlong>(sizes.get()[i]);
  2073. }
  2074. const jsize jrange_count = jlen / 2;
  2075. jlongArray jresults = env->NewLongArray(jrange_count);
  2076. if (jresults == nullptr) {
  2077. // exception thrown: OutOfMemoryError
  2078. return nullptr;
  2079. }
  2080. env->SetLongArrayRegion(jresults, 0, jrange_count, results.get());
  2081. if (env->ExceptionCheck()) {
  2082. // exception thrown: ArrayIndexOutOfBoundsException
  2083. env->DeleteLocalRef(jresults);
  2084. return nullptr;
  2085. }
  2086. return jresults;
  2087. }
  2088. /*
  2089. * Class: org_rocksdb_RocksDB
  2090. * Method: getApproximateMemTableStats
  2091. * Signature: (JJJJ)[J
  2092. */
  2093. jlongArray Java_org_rocksdb_RocksDB_getApproximateMemTableStats(
  2094. JNIEnv* env, jobject, jlong jdb_handle, jlong jcf_handle,
  2095. jlong jstartHandle, jlong jlimitHandle) {
  2096. auto* start = reinterpret_cast<ROCKSDB_NAMESPACE::Slice*>(jstartHandle);
  2097. auto* limit = reinterpret_cast<ROCKSDB_NAMESPACE::Slice*>(jlimitHandle);
  2098. const ROCKSDB_NAMESPACE::Range range(*start, *limit);
  2099. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2100. ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle;
  2101. if (jcf_handle == 0) {
  2102. cf_handle = db->DefaultColumnFamily();
  2103. } else {
  2104. cf_handle =
  2105. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  2106. }
  2107. uint64_t count = 0;
  2108. uint64_t sizes = 0;
  2109. db->GetApproximateMemTableStats(cf_handle, range, &count, &sizes);
  2110. // prepare results
  2111. jlong results[2] = {
  2112. static_cast<jlong>(count),
  2113. static_cast<jlong>(sizes)};
  2114. const jsize jcount = static_cast<jsize>(count);
  2115. jlongArray jsizes = env->NewLongArray(jcount);
  2116. if (jsizes == nullptr) {
  2117. // exception thrown: OutOfMemoryError
  2118. return nullptr;
  2119. }
  2120. env->SetLongArrayRegion(jsizes, 0, jcount, results);
  2121. if (env->ExceptionCheck()) {
  2122. // exception thrown: ArrayIndexOutOfBoundsException
  2123. env->DeleteLocalRef(jsizes);
  2124. return nullptr;
  2125. }
  2126. return jsizes;
  2127. }
  2128. /*
  2129. * Class: org_rocksdb_RocksDB
  2130. * Method: compactRange
  2131. * Signature: (J[BI[BIJJ)V
  2132. */
  2133. void Java_org_rocksdb_RocksDB_compactRange(
  2134. JNIEnv* env, jobject, jlong jdb_handle,
  2135. jbyteArray jbegin, jint jbegin_len,
  2136. jbyteArray jend, jint jend_len,
  2137. jlong jcompact_range_opts_handle,
  2138. jlong jcf_handle) {
  2139. jboolean has_exception = JNI_FALSE;
  2140. std::string str_begin;
  2141. if (jbegin_len > 0) {
  2142. str_begin = ROCKSDB_NAMESPACE::JniUtil::byteString<std::string>(
  2143. env, jbegin, jbegin_len,
  2144. [](const char* str, const size_t len) { return std::string(str, len); },
  2145. &has_exception);
  2146. if (has_exception == JNI_TRUE) {
  2147. // exception occurred
  2148. return;
  2149. }
  2150. }
  2151. std::string str_end;
  2152. if (jend_len > 0) {
  2153. str_end = ROCKSDB_NAMESPACE::JniUtil::byteString<std::string>(
  2154. env, jend, jend_len,
  2155. [](const char* str, const size_t len) { return std::string(str, len); },
  2156. &has_exception);
  2157. if (has_exception == JNI_TRUE) {
  2158. // exception occurred
  2159. return;
  2160. }
  2161. }
  2162. ROCKSDB_NAMESPACE::CompactRangeOptions* compact_range_opts = nullptr;
  2163. if (jcompact_range_opts_handle == 0) {
  2164. // NOTE: we DO own the pointer!
  2165. compact_range_opts = new ROCKSDB_NAMESPACE::CompactRangeOptions();
  2166. } else {
  2167. // NOTE: we do NOT own the pointer!
  2168. compact_range_opts =
  2169. reinterpret_cast<ROCKSDB_NAMESPACE::CompactRangeOptions*>(
  2170. jcompact_range_opts_handle);
  2171. }
  2172. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2173. ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle;
  2174. if (jcf_handle == 0) {
  2175. cf_handle = db->DefaultColumnFamily();
  2176. } else {
  2177. cf_handle =
  2178. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  2179. }
  2180. ROCKSDB_NAMESPACE::Status s;
  2181. if (jbegin_len > 0 || jend_len > 0) {
  2182. const ROCKSDB_NAMESPACE::Slice begin(str_begin);
  2183. const ROCKSDB_NAMESPACE::Slice end(str_end);
  2184. s = db->CompactRange(*compact_range_opts, cf_handle, &begin, &end);
  2185. } else {
  2186. s = db->CompactRange(*compact_range_opts, cf_handle, nullptr, nullptr);
  2187. }
  2188. if (jcompact_range_opts_handle == 0) {
  2189. delete compact_range_opts;
  2190. }
  2191. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  2192. }
  2193. /*
  2194. * Class: org_rocksdb_RocksDB
  2195. * Method: setOptions
  2196. * Signature: (JJ[Ljava/lang/String;[Ljava/lang/String;)V
  2197. */
  2198. void Java_org_rocksdb_RocksDB_setOptions(
  2199. JNIEnv* env, jobject, jlong jdb_handle, jlong jcf_handle,
  2200. jobjectArray jkeys, jobjectArray jvalues) {
  2201. const jsize len = env->GetArrayLength(jkeys);
  2202. assert(len == env->GetArrayLength(jvalues));
  2203. std::unordered_map<std::string, std::string> options_map;
  2204. for (jsize i = 0; i < len; i++) {
  2205. jobject jobj_key = env->GetObjectArrayElement(jkeys, i);
  2206. if (env->ExceptionCheck()) {
  2207. // exception thrown: ArrayIndexOutOfBoundsException
  2208. return;
  2209. }
  2210. jobject jobj_value = env->GetObjectArrayElement(jvalues, i);
  2211. if (env->ExceptionCheck()) {
  2212. // exception thrown: ArrayIndexOutOfBoundsException
  2213. env->DeleteLocalRef(jobj_key);
  2214. return;
  2215. }
  2216. jboolean has_exception = JNI_FALSE;
  2217. std::string s_key = ROCKSDB_NAMESPACE::JniUtil::copyStdString(
  2218. env, reinterpret_cast<jstring>(jobj_key), &has_exception);
  2219. if (has_exception == JNI_TRUE) {
  2220. // exception occurred
  2221. env->DeleteLocalRef(jobj_value);
  2222. env->DeleteLocalRef(jobj_key);
  2223. return;
  2224. }
  2225. std::string s_value = ROCKSDB_NAMESPACE::JniUtil::copyStdString(
  2226. env, reinterpret_cast<jstring>(jobj_value), &has_exception);
  2227. if (has_exception == JNI_TRUE) {
  2228. // exception occurred
  2229. env->DeleteLocalRef(jobj_value);
  2230. env->DeleteLocalRef(jobj_key);
  2231. return;
  2232. }
  2233. options_map[s_key] = s_value;
  2234. env->DeleteLocalRef(jobj_key);
  2235. env->DeleteLocalRef(jobj_value);
  2236. }
  2237. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2238. auto* cf_handle =
  2239. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  2240. auto s = db->SetOptions(cf_handle, options_map);
  2241. if (!s.ok()) {
  2242. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  2243. }
  2244. }
  2245. /*
  2246. * Class: org_rocksdb_RocksDB
  2247. * Method: setDBOptions
  2248. * Signature: (J[Ljava/lang/String;[Ljava/lang/String;)V
  2249. */
  2250. void Java_org_rocksdb_RocksDB_setDBOptions(
  2251. JNIEnv* env, jobject, jlong jdb_handle,
  2252. jobjectArray jkeys, jobjectArray jvalues) {
  2253. const jsize len = env->GetArrayLength(jkeys);
  2254. assert(len == env->GetArrayLength(jvalues));
  2255. std::unordered_map<std::string, std::string> options_map;
  2256. for (jsize i = 0; i < len; i++) {
  2257. jobject jobj_key = env->GetObjectArrayElement(jkeys, i);
  2258. if (env->ExceptionCheck()) {
  2259. // exception thrown: ArrayIndexOutOfBoundsException
  2260. return;
  2261. }
  2262. jobject jobj_value = env->GetObjectArrayElement(jvalues, i);
  2263. if (env->ExceptionCheck()) {
  2264. // exception thrown: ArrayIndexOutOfBoundsException
  2265. env->DeleteLocalRef(jobj_key);
  2266. return;
  2267. }
  2268. jboolean has_exception = JNI_FALSE;
  2269. std::string s_key = ROCKSDB_NAMESPACE::JniUtil::copyStdString(
  2270. env, reinterpret_cast<jstring>(jobj_key), &has_exception);
  2271. if (has_exception == JNI_TRUE) {
  2272. // exception occurred
  2273. env->DeleteLocalRef(jobj_value);
  2274. env->DeleteLocalRef(jobj_key);
  2275. return;
  2276. }
  2277. std::string s_value = ROCKSDB_NAMESPACE::JniUtil::copyStdString(
  2278. env, reinterpret_cast<jstring>(jobj_value), &has_exception);
  2279. if (has_exception == JNI_TRUE) {
  2280. // exception occurred
  2281. env->DeleteLocalRef(jobj_value);
  2282. env->DeleteLocalRef(jobj_key);
  2283. return;
  2284. }
  2285. options_map[s_key] = s_value;
  2286. env->DeleteLocalRef(jobj_key);
  2287. env->DeleteLocalRef(jobj_value);
  2288. }
  2289. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2290. auto s = db->SetDBOptions(options_map);
  2291. if (!s.ok()) {
  2292. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  2293. }
  2294. }
  2295. /*
  2296. * Class: org_rocksdb_RocksDB
  2297. * Method: compactFiles
  2298. * Signature: (JJJ[Ljava/lang/String;IIJ)[Ljava/lang/String;
  2299. */
  2300. jobjectArray Java_org_rocksdb_RocksDB_compactFiles(
  2301. JNIEnv* env, jobject, jlong jdb_handle, jlong jcompaction_opts_handle,
  2302. jlong jcf_handle, jobjectArray jinput_file_names, jint joutput_level,
  2303. jint joutput_path_id, jlong jcompaction_job_info_handle) {
  2304. jboolean has_exception = JNI_FALSE;
  2305. const std::vector<std::string> input_file_names =
  2306. ROCKSDB_NAMESPACE::JniUtil::copyStrings(env, jinput_file_names,
  2307. &has_exception);
  2308. if (has_exception == JNI_TRUE) {
  2309. // exception occurred
  2310. return nullptr;
  2311. }
  2312. auto* compaction_opts =
  2313. reinterpret_cast<ROCKSDB_NAMESPACE::CompactionOptions*>(
  2314. jcompaction_opts_handle);
  2315. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2316. ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle;
  2317. if (jcf_handle == 0) {
  2318. cf_handle = db->DefaultColumnFamily();
  2319. } else {
  2320. cf_handle =
  2321. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  2322. }
  2323. ROCKSDB_NAMESPACE::CompactionJobInfo* compaction_job_info = nullptr;
  2324. if (jcompaction_job_info_handle != 0) {
  2325. compaction_job_info =
  2326. reinterpret_cast<ROCKSDB_NAMESPACE::CompactionJobInfo*>(
  2327. jcompaction_job_info_handle);
  2328. }
  2329. std::vector<std::string> output_file_names;
  2330. auto s = db->CompactFiles(*compaction_opts, cf_handle, input_file_names,
  2331. static_cast<int>(joutput_level), static_cast<int>(joutput_path_id),
  2332. &output_file_names, compaction_job_info);
  2333. if (!s.ok()) {
  2334. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  2335. return nullptr;
  2336. }
  2337. return ROCKSDB_NAMESPACE::JniUtil::toJavaStrings(env, &output_file_names);
  2338. }
  2339. /*
  2340. * Class: org_rocksdb_RocksDB
  2341. * Method: pauseBackgroundWork
  2342. * Signature: (J)V
  2343. */
  2344. void Java_org_rocksdb_RocksDB_pauseBackgroundWork(
  2345. JNIEnv* env, jobject, jlong jdb_handle) {
  2346. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2347. auto s = db->PauseBackgroundWork();
  2348. if (!s.ok()) {
  2349. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  2350. }
  2351. }
  2352. /*
  2353. * Class: org_rocksdb_RocksDB
  2354. * Method: continueBackgroundWork
  2355. * Signature: (J)V
  2356. */
  2357. void Java_org_rocksdb_RocksDB_continueBackgroundWork(
  2358. JNIEnv* env, jobject, jlong jdb_handle) {
  2359. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2360. auto s = db->ContinueBackgroundWork();
  2361. if (!s.ok()) {
  2362. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  2363. }
  2364. }
  2365. /*
  2366. * Class: org_rocksdb_RocksDB
  2367. * Method: enableAutoCompaction
  2368. * Signature: (J[J)V
  2369. */
  2370. void Java_org_rocksdb_RocksDB_enableAutoCompaction(
  2371. JNIEnv* env, jobject, jlong jdb_handle, jlongArray jcf_handles) {
  2372. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2373. jboolean has_exception = JNI_FALSE;
  2374. const std::vector<ROCKSDB_NAMESPACE::ColumnFamilyHandle*> cf_handles =
  2375. ROCKSDB_NAMESPACE::JniUtil::fromJPointers<
  2376. ROCKSDB_NAMESPACE::ColumnFamilyHandle>(env, jcf_handles,
  2377. &has_exception);
  2378. if (has_exception == JNI_TRUE) {
  2379. // exception occurred
  2380. return;
  2381. }
  2382. db->EnableAutoCompaction(cf_handles);
  2383. }
  2384. /*
  2385. * Class: org_rocksdb_RocksDB
  2386. * Method: numberLevels
  2387. * Signature: (JJ)I
  2388. */
  2389. jint Java_org_rocksdb_RocksDB_numberLevels(
  2390. JNIEnv*, jobject, jlong jdb_handle, jlong jcf_handle) {
  2391. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2392. ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle;
  2393. if (jcf_handle == 0) {
  2394. cf_handle = db->DefaultColumnFamily();
  2395. } else {
  2396. cf_handle =
  2397. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  2398. }
  2399. return static_cast<jint>(db->NumberLevels(cf_handle));
  2400. }
  2401. /*
  2402. * Class: org_rocksdb_RocksDB
  2403. * Method: maxMemCompactionLevel
  2404. * Signature: (JJ)I
  2405. */
  2406. jint Java_org_rocksdb_RocksDB_maxMemCompactionLevel(
  2407. JNIEnv*, jobject, jlong jdb_handle, jlong jcf_handle) {
  2408. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2409. ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle;
  2410. if (jcf_handle == 0) {
  2411. cf_handle = db->DefaultColumnFamily();
  2412. } else {
  2413. cf_handle =
  2414. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  2415. }
  2416. return static_cast<jint>(db->MaxMemCompactionLevel(cf_handle));
  2417. }
  2418. /*
  2419. * Class: org_rocksdb_RocksDB
  2420. * Method: level0StopWriteTrigger
  2421. * Signature: (JJ)I
  2422. */
  2423. jint Java_org_rocksdb_RocksDB_level0StopWriteTrigger(
  2424. JNIEnv*, jobject, jlong jdb_handle, jlong jcf_handle) {
  2425. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2426. ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle;
  2427. if (jcf_handle == 0) {
  2428. cf_handle = db->DefaultColumnFamily();
  2429. } else {
  2430. cf_handle =
  2431. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  2432. }
  2433. return static_cast<jint>(db->Level0StopWriteTrigger(cf_handle));
  2434. }
  2435. /*
  2436. * Class: org_rocksdb_RocksDB
  2437. * Method: getName
  2438. * Signature: (J)Ljava/lang/String;
  2439. */
  2440. jstring Java_org_rocksdb_RocksDB_getName(
  2441. JNIEnv* env, jobject, jlong jdb_handle) {
  2442. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2443. std::string name = db->GetName();
  2444. return ROCKSDB_NAMESPACE::JniUtil::toJavaString(env, &name, false);
  2445. }
  2446. /*
  2447. * Class: org_rocksdb_RocksDB
  2448. * Method: getEnv
  2449. * Signature: (J)J
  2450. */
  2451. jlong Java_org_rocksdb_RocksDB_getEnv(
  2452. JNIEnv*, jobject, jlong jdb_handle) {
  2453. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2454. return reinterpret_cast<jlong>(db->GetEnv());
  2455. }
  2456. /*
  2457. * Class: org_rocksdb_RocksDB
  2458. * Method: flush
  2459. * Signature: (JJ[J)V
  2460. */
  2461. void Java_org_rocksdb_RocksDB_flush(
  2462. JNIEnv* env, jobject, jlong jdb_handle, jlong jflush_opts_handle,
  2463. jlongArray jcf_handles) {
  2464. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2465. auto* flush_opts =
  2466. reinterpret_cast<ROCKSDB_NAMESPACE::FlushOptions*>(jflush_opts_handle);
  2467. std::vector<ROCKSDB_NAMESPACE::ColumnFamilyHandle*> cf_handles;
  2468. if (jcf_handles == nullptr) {
  2469. cf_handles.push_back(db->DefaultColumnFamily());
  2470. } else {
  2471. jboolean has_exception = JNI_FALSE;
  2472. cf_handles = ROCKSDB_NAMESPACE::JniUtil::fromJPointers<
  2473. ROCKSDB_NAMESPACE::ColumnFamilyHandle>(env, jcf_handles,
  2474. &has_exception);
  2475. if (has_exception) {
  2476. // exception occurred
  2477. return;
  2478. }
  2479. }
  2480. auto s = db->Flush(*flush_opts, cf_handles);
  2481. if (!s.ok()) {
  2482. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  2483. }
  2484. }
  2485. /*
  2486. * Class: org_rocksdb_RocksDB
  2487. * Method: flushWal
  2488. * Signature: (JZ)V
  2489. */
  2490. void Java_org_rocksdb_RocksDB_flushWal(
  2491. JNIEnv* env, jobject, jlong jdb_handle, jboolean jsync) {
  2492. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2493. auto s = db->FlushWAL(jsync == JNI_TRUE);
  2494. if (!s.ok()) {
  2495. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  2496. }
  2497. }
  2498. /*
  2499. * Class: org_rocksdb_RocksDB
  2500. * Method: syncWal
  2501. * Signature: (J)V
  2502. */
  2503. void Java_org_rocksdb_RocksDB_syncWal(
  2504. JNIEnv* env, jobject, jlong jdb_handle) {
  2505. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2506. auto s = db->SyncWAL();
  2507. if (!s.ok()) {
  2508. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  2509. }
  2510. }
  2511. /*
  2512. * Class: org_rocksdb_RocksDB
  2513. * Method: getLatestSequenceNumber
  2514. * Signature: (J)V
  2515. */
  2516. jlong Java_org_rocksdb_RocksDB_getLatestSequenceNumber(
  2517. JNIEnv*, jobject, jlong jdb_handle) {
  2518. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2519. return db->GetLatestSequenceNumber();
  2520. }
  2521. /*
  2522. * Class: org_rocksdb_RocksDB
  2523. * Method: setPreserveDeletesSequenceNumber
  2524. * Signature: (JJ)Z
  2525. */
  2526. jboolean JNICALL Java_org_rocksdb_RocksDB_setPreserveDeletesSequenceNumber(
  2527. JNIEnv*, jobject, jlong jdb_handle, jlong jseq_number) {
  2528. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2529. if (db->SetPreserveDeletesSequenceNumber(
  2530. static_cast<uint64_t>(jseq_number))) {
  2531. return JNI_TRUE;
  2532. } else {
  2533. return JNI_FALSE;
  2534. }
  2535. }
  2536. /*
  2537. * Class: org_rocksdb_RocksDB
  2538. * Method: disableFileDeletions
  2539. * Signature: (J)V
  2540. */
  2541. void Java_org_rocksdb_RocksDB_disableFileDeletions(
  2542. JNIEnv* env, jobject, jlong jdb_handle) {
  2543. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2544. ROCKSDB_NAMESPACE::Status s = db->DisableFileDeletions();
  2545. if (!s.ok()) {
  2546. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  2547. }
  2548. }
  2549. /*
  2550. * Class: org_rocksdb_RocksDB
  2551. * Method: enableFileDeletions
  2552. * Signature: (JZ)V
  2553. */
  2554. void Java_org_rocksdb_RocksDB_enableFileDeletions(
  2555. JNIEnv* env, jobject, jlong jdb_handle, jboolean jforce) {
  2556. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2557. ROCKSDB_NAMESPACE::Status s = db->EnableFileDeletions(jforce);
  2558. if (!s.ok()) {
  2559. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  2560. }
  2561. }
  2562. /*
  2563. * Class: org_rocksdb_RocksDB
  2564. * Method: getLiveFiles
  2565. * Signature: (JZ)[Ljava/lang/String;
  2566. */
  2567. jobjectArray Java_org_rocksdb_RocksDB_getLiveFiles(
  2568. JNIEnv* env, jobject, jlong jdb_handle, jboolean jflush_memtable) {
  2569. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2570. std::vector<std::string> live_files;
  2571. uint64_t manifest_file_size = 0;
  2572. auto s = db->GetLiveFiles(
  2573. live_files, &manifest_file_size, jflush_memtable == JNI_TRUE);
  2574. if (!s.ok()) {
  2575. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  2576. return nullptr;
  2577. }
  2578. // append the manifest_file_size to the vector
  2579. // for passing back to java
  2580. live_files.push_back(std::to_string(manifest_file_size));
  2581. return ROCKSDB_NAMESPACE::JniUtil::toJavaStrings(env, &live_files);
  2582. }
  2583. /*
  2584. * Class: org_rocksdb_RocksDB
  2585. * Method: getSortedWalFiles
  2586. * Signature: (J)[Lorg/rocksdb/LogFile;
  2587. */
  2588. jobjectArray Java_org_rocksdb_RocksDB_getSortedWalFiles(
  2589. JNIEnv* env, jobject, jlong jdb_handle) {
  2590. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2591. std::vector<std::unique_ptr<ROCKSDB_NAMESPACE::LogFile>> sorted_wal_files;
  2592. auto s = db->GetSortedWalFiles(sorted_wal_files);
  2593. if (!s.ok()) {
  2594. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  2595. return nullptr;
  2596. }
  2597. // convert to Java type
  2598. const jsize jlen = static_cast<jsize>(sorted_wal_files.size());
  2599. jobjectArray jsorted_wal_files = env->NewObjectArray(
  2600. jlen, ROCKSDB_NAMESPACE::LogFileJni::getJClass(env), nullptr);
  2601. if(jsorted_wal_files == nullptr) {
  2602. // exception thrown: OutOfMemoryError
  2603. return nullptr;
  2604. }
  2605. jsize i = 0;
  2606. for (auto it = sorted_wal_files.begin(); it != sorted_wal_files.end(); ++it) {
  2607. jobject jlog_file =
  2608. ROCKSDB_NAMESPACE::LogFileJni::fromCppLogFile(env, it->get());
  2609. if (jlog_file == nullptr) {
  2610. // exception occurred
  2611. env->DeleteLocalRef(jsorted_wal_files);
  2612. return nullptr;
  2613. }
  2614. env->SetObjectArrayElement(jsorted_wal_files, i++, jlog_file);
  2615. if (env->ExceptionCheck()) {
  2616. // exception occurred
  2617. env->DeleteLocalRef(jlog_file);
  2618. env->DeleteLocalRef(jsorted_wal_files);
  2619. return nullptr;
  2620. }
  2621. env->DeleteLocalRef(jlog_file);
  2622. }
  2623. return jsorted_wal_files;
  2624. }
  2625. /*
  2626. * Class: org_rocksdb_RocksDB
  2627. * Method: getUpdatesSince
  2628. * Signature: (JJ)J
  2629. */
  2630. jlong Java_org_rocksdb_RocksDB_getUpdatesSince(
  2631. JNIEnv* env, jobject, jlong jdb_handle, jlong jsequence_number) {
  2632. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2633. ROCKSDB_NAMESPACE::SequenceNumber sequence_number =
  2634. static_cast<ROCKSDB_NAMESPACE::SequenceNumber>(jsequence_number);
  2635. std::unique_ptr<ROCKSDB_NAMESPACE::TransactionLogIterator> iter;
  2636. ROCKSDB_NAMESPACE::Status s = db->GetUpdatesSince(sequence_number, &iter);
  2637. if (s.ok()) {
  2638. return reinterpret_cast<jlong>(iter.release());
  2639. }
  2640. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  2641. return 0;
  2642. }
  2643. /*
  2644. * Class: org_rocksdb_RocksDB
  2645. * Method: deleteFile
  2646. * Signature: (JLjava/lang/String;)V
  2647. */
  2648. void Java_org_rocksdb_RocksDB_deleteFile(
  2649. JNIEnv* env, jobject, jlong jdb_handle, jstring jname) {
  2650. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2651. jboolean has_exception = JNI_FALSE;
  2652. std::string name =
  2653. ROCKSDB_NAMESPACE::JniUtil::copyStdString(env, jname, &has_exception);
  2654. if (has_exception == JNI_TRUE) {
  2655. // exception occurred
  2656. return;
  2657. }
  2658. db->DeleteFile(name);
  2659. }
  2660. /*
  2661. * Class: org_rocksdb_RocksDB
  2662. * Method: getLiveFilesMetaData
  2663. * Signature: (J)[Lorg/rocksdb/LiveFileMetaData;
  2664. */
  2665. jobjectArray Java_org_rocksdb_RocksDB_getLiveFilesMetaData(
  2666. JNIEnv* env, jobject, jlong jdb_handle) {
  2667. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2668. std::vector<ROCKSDB_NAMESPACE::LiveFileMetaData> live_files_meta_data;
  2669. db->GetLiveFilesMetaData(&live_files_meta_data);
  2670. // convert to Java type
  2671. const jsize jlen = static_cast<jsize>(live_files_meta_data.size());
  2672. jobjectArray jlive_files_meta_data = env->NewObjectArray(
  2673. jlen, ROCKSDB_NAMESPACE::LiveFileMetaDataJni::getJClass(env), nullptr);
  2674. if(jlive_files_meta_data == nullptr) {
  2675. // exception thrown: OutOfMemoryError
  2676. return nullptr;
  2677. }
  2678. jsize i = 0;
  2679. for (auto it = live_files_meta_data.begin(); it != live_files_meta_data.end(); ++it) {
  2680. jobject jlive_file_meta_data =
  2681. ROCKSDB_NAMESPACE::LiveFileMetaDataJni::fromCppLiveFileMetaData(env,
  2682. &(*it));
  2683. if (jlive_file_meta_data == nullptr) {
  2684. // exception occurred
  2685. env->DeleteLocalRef(jlive_files_meta_data);
  2686. return nullptr;
  2687. }
  2688. env->SetObjectArrayElement(jlive_files_meta_data, i++, jlive_file_meta_data);
  2689. if (env->ExceptionCheck()) {
  2690. // exception occurred
  2691. env->DeleteLocalRef(jlive_file_meta_data);
  2692. env->DeleteLocalRef(jlive_files_meta_data);
  2693. return nullptr;
  2694. }
  2695. env->DeleteLocalRef(jlive_file_meta_data);
  2696. }
  2697. return jlive_files_meta_data;
  2698. }
  2699. /*
  2700. * Class: org_rocksdb_RocksDB
  2701. * Method: getColumnFamilyMetaData
  2702. * Signature: (JJ)Lorg/rocksdb/ColumnFamilyMetaData;
  2703. */
  2704. jobject Java_org_rocksdb_RocksDB_getColumnFamilyMetaData(
  2705. JNIEnv* env, jobject, jlong jdb_handle, jlong jcf_handle) {
  2706. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2707. ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle;
  2708. if (jcf_handle == 0) {
  2709. cf_handle = db->DefaultColumnFamily();
  2710. } else {
  2711. cf_handle =
  2712. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  2713. }
  2714. ROCKSDB_NAMESPACE::ColumnFamilyMetaData cf_metadata;
  2715. db->GetColumnFamilyMetaData(cf_handle, &cf_metadata);
  2716. return ROCKSDB_NAMESPACE::ColumnFamilyMetaDataJni::
  2717. fromCppColumnFamilyMetaData(env, &cf_metadata);
  2718. }
  2719. /*
  2720. * Class: org_rocksdb_RocksDB
  2721. * Method: ingestExternalFile
  2722. * Signature: (JJ[Ljava/lang/String;IJ)V
  2723. */
  2724. void Java_org_rocksdb_RocksDB_ingestExternalFile(
  2725. JNIEnv* env, jobject, jlong jdb_handle, jlong jcf_handle,
  2726. jobjectArray jfile_path_list, jint jfile_path_list_len,
  2727. jlong jingest_external_file_options_handle) {
  2728. jboolean has_exception = JNI_FALSE;
  2729. std::vector<std::string> file_path_list =
  2730. ROCKSDB_NAMESPACE::JniUtil::copyStrings(
  2731. env, jfile_path_list, jfile_path_list_len, &has_exception);
  2732. if (has_exception == JNI_TRUE) {
  2733. // exception occurred
  2734. return;
  2735. }
  2736. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2737. auto* column_family =
  2738. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  2739. auto* ifo = reinterpret_cast<ROCKSDB_NAMESPACE::IngestExternalFileOptions*>(
  2740. jingest_external_file_options_handle);
  2741. ROCKSDB_NAMESPACE::Status s =
  2742. db->IngestExternalFile(column_family, file_path_list, *ifo);
  2743. if (!s.ok()) {
  2744. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  2745. }
  2746. }
  2747. /*
  2748. * Class: org_rocksdb_RocksDB
  2749. * Method: verifyChecksum
  2750. * Signature: (J)V
  2751. */
  2752. void Java_org_rocksdb_RocksDB_verifyChecksum(
  2753. JNIEnv* env, jobject, jlong jdb_handle) {
  2754. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2755. auto s = db->VerifyChecksum();
  2756. if (!s.ok()) {
  2757. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  2758. }
  2759. }
  2760. /*
  2761. * Class: org_rocksdb_RocksDB
  2762. * Method: getDefaultColumnFamily
  2763. * Signature: (J)J
  2764. */
  2765. jlong Java_org_rocksdb_RocksDB_getDefaultColumnFamily(
  2766. JNIEnv*, jobject, jlong jdb_handle) {
  2767. auto* db_handle = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2768. auto* cf_handle = db_handle->DefaultColumnFamily();
  2769. return reinterpret_cast<jlong>(cf_handle);
  2770. }
  2771. /*
  2772. * Class: org_rocksdb_RocksDB
  2773. * Method: getPropertiesOfAllTables
  2774. * Signature: (JJ)Ljava/util/Map;
  2775. */
  2776. jobject Java_org_rocksdb_RocksDB_getPropertiesOfAllTables(
  2777. JNIEnv* env, jobject, jlong jdb_handle, jlong jcf_handle) {
  2778. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2779. ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle;
  2780. if (jcf_handle == 0) {
  2781. cf_handle = db->DefaultColumnFamily();
  2782. } else {
  2783. cf_handle =
  2784. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  2785. }
  2786. ROCKSDB_NAMESPACE::TablePropertiesCollection table_properties_collection;
  2787. auto s = db->GetPropertiesOfAllTables(cf_handle,
  2788. &table_properties_collection);
  2789. if (!s.ok()) {
  2790. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  2791. }
  2792. // convert to Java type
  2793. jobject jhash_map = ROCKSDB_NAMESPACE::HashMapJni::construct(
  2794. env, static_cast<uint32_t>(table_properties_collection.size()));
  2795. if (jhash_map == nullptr) {
  2796. // exception occurred
  2797. return nullptr;
  2798. }
  2799. const ROCKSDB_NAMESPACE::HashMapJni::FnMapKV<
  2800. const std::string,
  2801. const std::shared_ptr<const ROCKSDB_NAMESPACE::TableProperties>, jobject,
  2802. jobject>
  2803. fn_map_kv =
  2804. [env](const std::pair<const std::string,
  2805. const std::shared_ptr<
  2806. const ROCKSDB_NAMESPACE::TableProperties>>&
  2807. kv) {
  2808. jstring jkey = ROCKSDB_NAMESPACE::JniUtil::toJavaString(
  2809. env, &(kv.first), false);
  2810. if (env->ExceptionCheck()) {
  2811. // an error occurred
  2812. return std::unique_ptr<std::pair<jobject, jobject>>(nullptr);
  2813. }
  2814. jobject jtable_properties =
  2815. ROCKSDB_NAMESPACE::TablePropertiesJni::fromCppTableProperties(
  2816. env, *(kv.second.get()));
  2817. if (jtable_properties == nullptr) {
  2818. // an error occurred
  2819. env->DeleteLocalRef(jkey);
  2820. return std::unique_ptr<std::pair<jobject, jobject>>(nullptr);
  2821. }
  2822. return std::unique_ptr<std::pair<jobject, jobject>>(
  2823. new std::pair<jobject, jobject>(
  2824. static_cast<jobject>(jkey),
  2825. static_cast<jobject>(jtable_properties)));
  2826. };
  2827. if (!ROCKSDB_NAMESPACE::HashMapJni::putAll(
  2828. env, jhash_map, table_properties_collection.begin(),
  2829. table_properties_collection.end(), fn_map_kv)) {
  2830. // exception occurred
  2831. return nullptr;
  2832. }
  2833. return jhash_map;
  2834. }
  2835. /*
  2836. * Class: org_rocksdb_RocksDB
  2837. * Method: getPropertiesOfTablesInRange
  2838. * Signature: (JJ[J)Ljava/util/Map;
  2839. */
  2840. jobject Java_org_rocksdb_RocksDB_getPropertiesOfTablesInRange(
  2841. JNIEnv* env, jobject, jlong jdb_handle, jlong jcf_handle,
  2842. jlongArray jrange_slice_handles) {
  2843. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2844. ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle;
  2845. if (jcf_handle == 0) {
  2846. cf_handle = db->DefaultColumnFamily();
  2847. } else {
  2848. cf_handle =
  2849. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  2850. }
  2851. const jsize jlen = env->GetArrayLength(jrange_slice_handles);
  2852. jboolean jrange_slice_handles_is_copy = JNI_FALSE;
  2853. jlong *jrange_slice_handle = env->GetLongArrayElements(
  2854. jrange_slice_handles, &jrange_slice_handles_is_copy);
  2855. if (jrange_slice_handle == nullptr) {
  2856. // exception occurred
  2857. return nullptr;
  2858. }
  2859. const size_t ranges_len = static_cast<size_t>(jlen / 2);
  2860. auto ranges = std::unique_ptr<ROCKSDB_NAMESPACE::Range[]>(
  2861. new ROCKSDB_NAMESPACE::Range[ranges_len]);
  2862. for (jsize i = 0, j = 0; i < jlen; ++i) {
  2863. auto* start =
  2864. reinterpret_cast<ROCKSDB_NAMESPACE::Slice*>(jrange_slice_handle[i]);
  2865. auto* limit =
  2866. reinterpret_cast<ROCKSDB_NAMESPACE::Slice*>(jrange_slice_handle[++i]);
  2867. ranges[j++] = ROCKSDB_NAMESPACE::Range(*start, *limit);
  2868. }
  2869. ROCKSDB_NAMESPACE::TablePropertiesCollection table_properties_collection;
  2870. auto s = db->GetPropertiesOfTablesInRange(
  2871. cf_handle, ranges.get(), ranges_len, &table_properties_collection);
  2872. if (!s.ok()) {
  2873. // error occurred
  2874. env->ReleaseLongArrayElements(jrange_slice_handles, jrange_slice_handle, JNI_ABORT);
  2875. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  2876. return nullptr;
  2877. }
  2878. // cleanup
  2879. env->ReleaseLongArrayElements(jrange_slice_handles, jrange_slice_handle, JNI_ABORT);
  2880. return jrange_slice_handles;
  2881. }
  2882. /*
  2883. * Class: org_rocksdb_RocksDB
  2884. * Method: suggestCompactRange
  2885. * Signature: (JJ)[J
  2886. */
  2887. jlongArray Java_org_rocksdb_RocksDB_suggestCompactRange(
  2888. JNIEnv* env, jobject, jlong jdb_handle, jlong jcf_handle) {
  2889. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2890. ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle;
  2891. if (jcf_handle == 0) {
  2892. cf_handle = db->DefaultColumnFamily();
  2893. } else {
  2894. cf_handle =
  2895. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  2896. }
  2897. auto* begin = new ROCKSDB_NAMESPACE::Slice();
  2898. auto* end = new ROCKSDB_NAMESPACE::Slice();
  2899. auto s = db->SuggestCompactRange(cf_handle, begin, end);
  2900. if (!s.ok()) {
  2901. // error occurred
  2902. delete begin;
  2903. delete end;
  2904. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  2905. return nullptr;
  2906. }
  2907. jlongArray jslice_handles = env->NewLongArray(2);
  2908. if (jslice_handles == nullptr) {
  2909. // exception thrown: OutOfMemoryError
  2910. delete begin;
  2911. delete end;
  2912. return nullptr;
  2913. }
  2914. jlong slice_handles[2];
  2915. slice_handles[0] = reinterpret_cast<jlong>(begin);
  2916. slice_handles[1] = reinterpret_cast<jlong>(end);
  2917. env->SetLongArrayRegion(jslice_handles, 0, 2, slice_handles);
  2918. if (env->ExceptionCheck()) {
  2919. // exception thrown: ArrayIndexOutOfBoundsException
  2920. delete begin;
  2921. delete end;
  2922. env->DeleteLocalRef(jslice_handles);
  2923. return nullptr;
  2924. }
  2925. return jslice_handles;
  2926. }
  2927. /*
  2928. * Class: org_rocksdb_RocksDB
  2929. * Method: promoteL0
  2930. * Signature: (JJI)V
  2931. */
  2932. void Java_org_rocksdb_RocksDB_promoteL0(
  2933. JNIEnv*, jobject, jlong jdb_handle, jlong jcf_handle, jint jtarget_level) {
  2934. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2935. ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle;
  2936. if (jcf_handle == 0) {
  2937. cf_handle = db->DefaultColumnFamily();
  2938. } else {
  2939. cf_handle =
  2940. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  2941. }
  2942. db->PromoteL0(cf_handle, static_cast<int>(jtarget_level));
  2943. }
  2944. /*
  2945. * Class: org_rocksdb_RocksDB
  2946. * Method: startTrace
  2947. * Signature: (JJJ)V
  2948. */
  2949. void Java_org_rocksdb_RocksDB_startTrace(
  2950. JNIEnv* env, jobject, jlong jdb_handle, jlong jmax_trace_file_size,
  2951. jlong jtrace_writer_jnicallback_handle) {
  2952. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2953. ROCKSDB_NAMESPACE::TraceOptions trace_options;
  2954. trace_options.max_trace_file_size =
  2955. static_cast<uint64_t>(jmax_trace_file_size);
  2956. // transfer ownership of trace writer from Java to C++
  2957. auto trace_writer =
  2958. std::unique_ptr<ROCKSDB_NAMESPACE::TraceWriterJniCallback>(
  2959. reinterpret_cast<ROCKSDB_NAMESPACE::TraceWriterJniCallback*>(
  2960. jtrace_writer_jnicallback_handle));
  2961. auto s = db->StartTrace(trace_options, std::move(trace_writer));
  2962. if (!s.ok()) {
  2963. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  2964. }
  2965. }
  2966. /*
  2967. * Class: org_rocksdb_RocksDB
  2968. * Method: endTrace
  2969. * Signature: (J)V
  2970. */
  2971. JNIEXPORT void JNICALL Java_org_rocksdb_RocksDB_endTrace(
  2972. JNIEnv* env, jobject, jlong jdb_handle) {
  2973. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  2974. auto s = db->EndTrace();
  2975. if (!s.ok()) {
  2976. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  2977. }
  2978. }
  2979. /*
  2980. * Class: org_rocksdb_RocksDB
  2981. * Method: destroyDB
  2982. * Signature: (Ljava/lang/String;J)V
  2983. */
  2984. void Java_org_rocksdb_RocksDB_destroyDB(
  2985. JNIEnv* env, jclass, jstring jdb_path, jlong joptions_handle) {
  2986. const char* db_path = env->GetStringUTFChars(jdb_path, nullptr);
  2987. if (db_path == nullptr) {
  2988. // exception thrown: OutOfMemoryError
  2989. return;
  2990. }
  2991. auto* options =
  2992. reinterpret_cast<ROCKSDB_NAMESPACE::Options*>(joptions_handle);
  2993. if (options == nullptr) {
  2994. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(
  2995. env, ROCKSDB_NAMESPACE::Status::InvalidArgument("Invalid Options."));
  2996. }
  2997. ROCKSDB_NAMESPACE::Status s = ROCKSDB_NAMESPACE::DestroyDB(db_path, *options);
  2998. env->ReleaseStringUTFChars(jdb_path, db_path);
  2999. if (!s.ok()) {
  3000. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  3001. }
  3002. }
  3003. bool get_slice_helper(JNIEnv* env, jobjectArray ranges, jsize index,
  3004. std::unique_ptr<ROCKSDB_NAMESPACE::Slice>& slice,
  3005. std::vector<std::unique_ptr<jbyte[]>>& ranges_to_free) {
  3006. jobject jArray = env->GetObjectArrayElement(ranges, index);
  3007. if (env->ExceptionCheck()) {
  3008. // exception thrown: ArrayIndexOutOfBoundsException
  3009. return false;
  3010. }
  3011. if (jArray == nullptr) {
  3012. return true;
  3013. }
  3014. jbyteArray jba = reinterpret_cast<jbyteArray>(jArray);
  3015. jsize len_ba = env->GetArrayLength(jba);
  3016. ranges_to_free.push_back(std::unique_ptr<jbyte[]>(new jbyte[len_ba]));
  3017. env->GetByteArrayRegion(jba, 0, len_ba, ranges_to_free.back().get());
  3018. if (env->ExceptionCheck()) {
  3019. // exception thrown: ArrayIndexOutOfBoundsException
  3020. env->DeleteLocalRef(jArray);
  3021. return false;
  3022. }
  3023. env->DeleteLocalRef(jArray);
  3024. slice.reset(new ROCKSDB_NAMESPACE::Slice(
  3025. reinterpret_cast<char*>(ranges_to_free.back().get()), len_ba));
  3026. return true;
  3027. }
  3028. /*
  3029. * Class: org_rocksdb_RocksDB
  3030. * Method: deleteFilesInRanges
  3031. * Signature: (JJLjava/util/List;Z)V
  3032. */
  3033. JNIEXPORT void JNICALL Java_org_rocksdb_RocksDB_deleteFilesInRanges(
  3034. JNIEnv* env, jobject /*jdb*/, jlong jdb_handle, jlong jcf_handle,
  3035. jobjectArray ranges, jboolean include_end) {
  3036. jsize length = env->GetArrayLength(ranges);
  3037. std::vector<ROCKSDB_NAMESPACE::RangePtr> rangesVector;
  3038. std::vector<std::unique_ptr<ROCKSDB_NAMESPACE::Slice>> slices;
  3039. std::vector<std::unique_ptr<jbyte[]>> ranges_to_free;
  3040. for (jsize i = 0; (i + 1) < length; i += 2) {
  3041. slices.push_back(std::unique_ptr<ROCKSDB_NAMESPACE::Slice>());
  3042. if (!get_slice_helper(env, ranges, i, slices.back(), ranges_to_free)) {
  3043. // exception thrown
  3044. return;
  3045. }
  3046. slices.push_back(std::unique_ptr<ROCKSDB_NAMESPACE::Slice>());
  3047. if (!get_slice_helper(env, ranges, i + 1, slices.back(), ranges_to_free)) {
  3048. // exception thrown
  3049. return;
  3050. }
  3051. rangesVector.push_back(ROCKSDB_NAMESPACE::RangePtr(
  3052. slices[slices.size() - 2].get(), slices[slices.size() - 1].get()));
  3053. }
  3054. auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle);
  3055. auto* column_family =
  3056. reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle);
  3057. ROCKSDB_NAMESPACE::Status s = ROCKSDB_NAMESPACE::DeleteFilesInRanges(
  3058. db, column_family == nullptr ? db->DefaultColumnFamily() : column_family,
  3059. rangesVector.data(), rangesVector.size(), include_end);
  3060. if (!s.ok()) {
  3061. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  3062. }
  3063. }