package Ġorg . map db . store Ċ Ċ import Ġorg . eclipse . collections . impl . factory . primitive . Long Lists Ċ import Ġorg . eclipse . collections . impl . map . mutable . primitive . Long Object HashMap Ċ import Ġorg . map db . DB Exception Ċ import Ġorg . map db . io . Data Input 2 ByteArray Ċ import Ġorg . map db . serializer . Serializer Ċ import Ġorg . map db . serializer . Serial izers Ċ import Ġorg . map db . util . lock Read Ċ import Ġorg . map db . util . lock Write Ċ import Ġjava . util . concurrent . locks . ReadWrite Lock Ċ import Ġjava . util . concurrent . locks . Re entrant ReadWrite Lock Ċ Ċ class ĠStore On Heap Ser ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġis Thread Safe : Boolean = true Ċ ): Mutable Store { ĊĊĠĠĠ Ġprotected Ġval ĠNULL _ RECORD Ġ= Ġbyte ArrayOf ( 1 , 2 , 3 ) ĊĊĊĠĠĠ Ġprotected Ġval Ġlock : ĠRead Write Lock ? Ġ= Ġif ( is Thread Safe ) ĠRe entrant ReadWrite Lock () Ġelse Ġnull ĊĊĠĠĠ Ġprotected Ġval Ġrecords : ĠLong Object HashMap < ByteArray > Ġ= ĠLong Object HashMap . new Map () ĊĊĠĠĠ Ġprotected Ġval Ġfree Rec ids Ġ= ĠLong Lists . mutable . empty () ĊĊĠĠĠ Ġprotected Ġvar Ġmax Rec id : Long Ġ= Ġ 0 ; ĊĊĊĠĠĠ Ġprotected Ġfun Ġ< E > Ġcheck ( value : ByteArray ?, Ġserializer : Serializer < E >): E ? { ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue === NULL _ RECORD Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue == null Ġ-> Ġthrow ĠDB Exception . Rec id NotFound () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġserializer . deserialize ( Data Input 2 ByteArray ( value )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< K > Ġget ( rec id : ĠLong , Ġserializer : ĠSerializer < K >): ĠK ? Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . lock Read Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcheck ( records . get ( rec id ), Ġserializer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġoverride Ġfun ĠgetAll ( consumer : Ġ( Long , ĠByteArray ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . lock Read Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrec ids Ġ= Ġrecords . keySet (). to Sorted Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( rec id Ġin Ġrec ids ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġrecords . get ( rec id ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġif ( v Ġ=== ĠNULL _ RECORD ) Ġnull Ġelse Ġv ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsumer ( rec id , Ġdata Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprotected Ġfun Ġpre allocate 2 (): Long { ĊĠĠĠĠĠĠĠ Ġval Ġrec id Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( free Rec ids . isEmpty ) Ġ++ max Rec id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġfree Rec ids . remove AtIndex ( free Rec ids . size ()- 1 ) ĊĊĠĠĠĠĠĠĠ Ġrecords . put ( rec id , ĠNULL _ RECORD ) ĊĠĠĠĠĠĠĠ Ġreturn Ġrec id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpre allocate (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . lock Write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpre allocate 2 () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< K > Ġput ( record : ĠK , Ġserializer : ĠSerializer < K >): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠSerial izers . serialize To ByteArray ( record , Ġserializer ) ĊĠĠĠĠĠĠĠ Ġlock . lock Write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrec id Ġ= Ġpre allocate 2 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecords . put ( rec id , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrec id ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< K > Ġupdate ( rec id : ĠLong , Ġserializer : ĠSerializer < K >, Ġnew Record : ĠK ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠnewVal Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( new Record == null ) ĠNULL _ RECORD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠSerial izers . serialize To ByteArray ( new Record , Ġserializer ) ĊĠĠĠĠĠĠĠ Ġlock . lock Write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! records . containsKey ( rec id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDB Exception . Rec id NotFound () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecords . put ( rec id , ĠnewVal ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< K > Ġcompare AndUpdate ( rec id : ĠLong , Ġserializer : ĠSerializer < K >, Ġexpected Old Record : ĠK ?, Ġnew Record : ĠK ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠnewVal Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( new Record == null ) ĠNULL _ RECORD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠSerial izers . serialize To ByteArray ( new Record , Ġserializer ) ĊĊĠĠĠĠĠĠĠ Ġlock . lock Write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Rec Ġ= Ġcheck ( records . get ( rec id ), Ġserializer ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! serializer . equals ( old Rec , expected Old Record )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecords . put ( rec id , ĠnewVal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< K > Ġcompare And Delete ( rec id : ĠLong , Ġserializer : ĠSerializer < K >, Ġexpected Old Record : ĠK ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . lock Write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Rec Ġ= Ġcheck ( records . get ( rec id ), Ġserializer ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! serializer . equals ( old Rec , expected Old Record )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecords . remove ( rec id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfree Rec ids . add ( rec id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< K > Ġdelete ( rec id : ĠLong , Ġserializer : ĠSerializer < K >) Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . lock Write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecords . remove ( rec id ) Ġ?: Ġthrow ĠDB Exception . Rec id NotFound () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfree Rec ids . add ( rec id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġverify () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcommit () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcompact () Ġ{ ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠ Ġ} Ċ Ċ }