portal.h 247 KB

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