/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠRealm ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġio . realm Ċ Ċ import Ġio . realm . interop . Property Ċ import Ġio . realm . interop . PropertyType Ċ import Ġio . realm . interop . Realm Interop Ċ import Ġio . realm . interop . Schema Mode Ċ import Ġio . realm . interop . Table Ċ import Ġio . realm . runtime api . Mediator Ċ import Ġio . realm . runtime api . Native Pointer Ċ import Ġio . realm . runtime api . Realm Companion Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġkotlinx . serialization . json . Json Element Ċ import Ġkotlinx . serialization . json . JsonObject Ċ import Ġkotlinx . serialization . json . json Array Ċ import Ġkotlinx . serialization . json . jsonObject Ċ import Ġkotlinx . serialization . json . json Primitive Ċ Ċ class ĠRealm Configuration Ġprivate Ġconstructor ( ĊĠĠĠ Ġval Ġpath : ĠString ?, Ġ// ĠFull Ġpath Ġif Ġwe Ġdon 't Ġwant Ġto Ġuse Ġthe Ġdefault Ġlocation ĊĠĠĠ Ġval Ġname : ĠString ?, Ġ// ĠOptional ĠRealm Ġname Ġ( default Ġis Ġ' default ') ĊĠĠĠ Ġval Ġschema : ĠMed iator , Ġ// ĠTODO Ġcreate Ġa Ġschema Ġtype , Ġto Ġfail Ġat Ġcompile Ġtime ? ĊĠĠĠ Ġval Ġversion : ĠLong Ġ= Ġ 0 , ĊĠĠĠ Ġval Ġtables : ĠList < Table > Ġ= ĠlistOf () Ċ ) Ġ{ ĊĊĠĠĠ Ġinternal Ġval Ġnative Config : ĠNative Pointer ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġnative Config Ġ= ĠRealm Interop . realm _ config _ new () ĊĠĠĠĠĠĠĠ ĠRealm Interop . realm _ config _ set _ path ( native Config , Ġpath !! ) ĊĠĠĠĠĠĠĠ ĠRealm Interop . realm _ config _ set _ schema _ mode ( native Config , ĠSchema Mode . RL M _ SCHEMA _ MODE _ AUT OM AT IC ) ĊĠĠĠĠĠĠĠ ĠRealm Interop . realm _ config _ set _ schema _ version ( native Config , Ġversion ) ĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= ĠRealm Interop . realm _ schema _ new ( tables ) ĊĠĠĠĠĠĠĠ ĠRealm Interop . realm _ config _ set _ schema ( native Config , Ġschema ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠBuilder ( ĊĠĠĠĠĠĠĠ Ġvar Ġpath : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġvar Ġname : ĠString Ġ= Ġ" default ", Ġ// ĠOptional ĠRealm Ġname Ġ( default Ġis Ġ' default ') ĊĠĠĠĠĠĠĠ Ġvar Ġschema : ĠAny ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġvar Ġclasses : ĠList < Realm Companion > Ġ= ĠlistOf () ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġpath ( path : ĠString ) Ġ= Ġapply Ġ{ Ġthis . path Ġ= Ġpath Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġname ( name : ĠString ) Ġ= Ġapply Ġ{ Ġthis . name Ġ= Ġname Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġschema ( schema : ĠAny ) Ġ= Ġapply Ġ{ Ġthis . schema Ġ= Ġschema Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġclasses ( classes : ĠList < Realm Companion >) Ġ= Ġapply Ġ{ Ġthis . classes Ġ= Ġclasses Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġbuild (): ĠRealm Configuration Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( path Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdirectory Ġ= ĠPlatform Helper . app Files Directory () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFIXME ĠPro per Ġplatform Ġag nost ic Ġfile Ġseparator : ĠFile . separator Ġis Ġnot Ġavailable Ġfor ĠKotlin / Native ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġhttps :// github . com / realm / realm - kotlin / issues / 7 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ= Ġ"$ directory /$ name . realm " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( schema Ġ! is ĠMed iator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" schema Ġparameter Ġshould Ġbe Ġa Ġclass Ġannotated Ġwith Ġ@ Realm Module ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRealm Configuration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath , Ġname , Ġschema Ġas ĠMed iator , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtables Ġ= Ġ( schema Ġas ĠMed iator ). schema (). map Ġ{ Ġparse Schema ( it Ġas ĠString ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠHigh ly Ġexplo s ive . ĠQuick Ġimplementation Ġto Ġover come Ġthat Ġwe Ġdon 't Ġhave Ġtyped Ġschemas Ġin Ġthe Ġcomp ant ion Ġobjects Ġyet ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġparse Schema ( schema : ĠString ): ĠTable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtable : ĠJsonObject Ġ= ĠJson . parse ToJson Element ( schema ). jsonObject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname 1 Ġ= Ġtable [" name "] !!. json Primitive . content ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperties Ġ= Ġtable [" properties "] !!. json Array . toList (). map Ġ{ Ġelement : ĠJson Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Ġ= Ġelement Ġas ĠJsonObject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" Too Generic Exception Thrown ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( property . keys . size Ġ!= Ġ 1 ) Ġthrow ĠRuntimeException (" Malformed Ġschema : Ġ$ schema ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġproperty . keys . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġattributes Ġ= Ġproperty [ name ] !!. jsonObject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġwhen Ġ( attributes [" type "] !!. json Primitive . content ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" string " Ġ-> ĠProperty Type . RL M _ PROPERTY _ TYPE _ STRING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" int " Ġ-> ĠProperty Type . RL M _ PROPERTY _ TYPE _ INT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" boolean " Ġ-> ĠProperty Type . RL M _ PROPERTY _ TYPE _ BOOL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" float " Ġ-> ĠProperty Type . RL M _ PROPERTY _ TYPE _ FLOAT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" double " Ġ-> ĠProperty Type . RL M _ PROPERTY _ TYPE _ DOUBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unsupported Ġtype Ġ${ attributes [" type "] !!. json Primitive . content }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty ( name Ġ= Ġname , Ġtype Ġ= Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTable ( name 1 , Ġproperties Ġ= Ġproperties ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ