portal.h 308 KB

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