package Ġde . mark us fis ch . android . binary eye . repository Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . database . Cursor Ċ import Ġde . mark us fis ch . android . binary eye . data . Database Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . flow . flow On Ċ import Ġkotlinx . coroutines . flow . map Ċ Ċ class ĠDatabase Repository Ġ{ Ċ ĉ private Ġval Ġdb Ġ= ĠDatabase () ĊĊ ĉ fun Ġopen ( application Context : ĠContext ) Ġ{ Ċĉ ĉ db . open ( application Context ) Ċ ĉ } ĊĊ ĉ fun Ġget Scan ( id : ĠLong ): ĠScan ? Ġ= Ġget Scan ( id ) Ġ{ Ġ_, Ġcursor Ġ-> Ċĉ ĉ val Ġtime Index Ġ= Ġcursor . getColumnIndex ( Database . SCAN S _ DATETIME ) Ċĉ ĉ val Ġcontent Index Ġ= Ġcursor . getColumnIndex ( Database . SCAN S _ CONTENT ) Ċĉ ĉ val Ġraw Index Ġ= Ġcursor . getColumnIndex ( Database . SCAN S _ RAW ) Ċĉ ĉ val Ġformat Index Ġ= Ġcursor . getColumnIndex ( Database . SCAN S _ FORMAT ) Ċĉ ĉ Scan ( Ċĉĉ ĉ id Ġ= Ġid , Ċĉĉ ĉ timestamp Ġ= Ġcursor . getString ( time Index ), Ċĉĉ ĉ content Ġ= Ġcursor . getString ( content Index ), Ċĉĉ ĉ raw Ġ= Ġcursor . get Blob ( raw Index ), Ċĉĉ ĉ format Ġ= Ġcursor . getString ( format Index ) Ċĉ ĉ ) Ċ ĉ } ĊĊ ĉ fun Ġ< T > Ġget Scan ( id : ĠLong , Ġmap : Ġ( id : ĠLong , ĠCursor ) Ġ-> ĠT ): ĠT ? Ġ= Ċĉ ĉ db . get Scan ( id )?. use Ġ{ Ġmap ( id , Ġit . apply Ġ{ Ġmove To First () Ġ}) Ġ} ĊĊ ĉ fun Ġget Sc ans (): ĠFlow < Simple Scan > Ġ= Ġget Sc ans Ġ{ Ġcursor Ġ-> Ċĉ ĉ val Ġid Index Ġ= Ġcursor . getColumnIndex ( Database . SCAN S _ ID ) Ċĉ ĉ val Ġtime Index Ġ= Ġcursor . getColumnIndex ( Database . SCAN S _ DATETIME ) Ċĉ ĉ val Ġcontent Index Ġ= Ġcursor . getColumnIndex ( Database . SCAN S _ CONTENT ) Ċĉ ĉ val Ġformat Index Ġ= Ġcursor . getColumnIndex ( Database . SCAN S _ FORMAT ) Ċĉ ĉ Simple Scan ( Ċĉĉ ĉ id Ġ= Ġcursor . getLong ( id Index ), Ċĉĉ ĉ timestamp Ġ= Ġcursor . getString ( time Index ), Ċĉĉ ĉ content Ġ= Ġcursor . getString ( content Index ), Ċĉĉ ĉ format Ġ= Ġcursor . getString ( format Index ) Ċĉ ĉ ) Ċ ĉ } ĊĊ ĉ fun Ġ< T > Ġget Sc ans ( map : Ġsuspend Ġ( Cursor ) Ġ-> ĠT ): ĠFlow < T > Ġ= Ġflow Ġ{ Ċĉ ĉ db . get Sc ans ()?. use Ġ{ Ġresults Ġ-> Ċĉĉ ĉ results . as Iterable . forEach Ġ{ Ċĉĉĉ ĉ emit ( it ) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ }. map ( map ). flow On ( Dispatch ers . IO ) ĊĊ ĉ fun Ġget Sc ans Cursor (): ĠCursor ? Ġ= Ġdb . get Sc ans () ĊĊ ĉ fun Ġhas Binary Data () Ġ= Ġdb . has Binary Data ()?. use Ġ{ Ġit . count Ġ> Ġ 0 Ġ} Ġ?: Ġfalse ĊĊ ĉ fun Ġinsert Scan ( Ċĉ ĉ timestamp : ĠLong , Ċĉ ĉ content : ĠString , Ċĉ ĉ raw : ĠByteArray ?, Ċĉ ĉ format : ĠString Ċ ĉ ): ĠLong Ġ= Ġdb . insert Scan ( timestamp , Ġcontent , Ġraw , Ġformat ) ĊĊ ĉ fun Ġremove Scan ( id : ĠLong ) Ġ= Ġdb . remove Scan ( id ) ĊĊ ĉ fun Ġremove Sc ans () Ġ= Ġdb . remove Sc ans () ĊĊ ĉ data Ġclass ĠSimple Scan ( Ċĉ ĉ val Ġid : ĠLong , Ċĉ ĉ val Ġtimestamp : ĠString , Ċĉ ĉ val Ġcontent : ĠString , Ċĉ ĉ val Ġformat : ĠString Ċ ĉ ) ĊĊ ĉ data Ġclass ĠScan ( Ċĉ ĉ val Ġid : ĠLong , Ċĉ ĉ val Ġtimestamp : ĠString , Ċĉ ĉ val Ġcontent : ĠString , Ċĉ ĉ val Ġraw : ĠByteArray ?, Ċĉ ĉ val Ġformat : ĠString Ċ ĉ ) Ġ{ Ċĉ ĉ // ĠN eeded Ġto Ġbe Ġoverwritten Ġmanually , Ġas ĠByteArray Ġis Ġan Ġarray Ġand Ġthis Ġisn 't Ġhandled Ġwell Ġby ĠKotlin Ċĉ ĉ override Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ Ċĉĉ ĉ if Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue Ċĉĉ ĉ if Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĊĉĉ ĉ other Ġas ĠScan ĊĊĉĉ ĉ if Ġ( id Ġ!= Ġother . id ) Ġreturn Ġfalse Ċĉĉ ĉ if Ġ( timestamp Ġ!= Ġother . timestamp ) Ġreturn Ġfalse Ċĉĉ ĉ if Ġ( content Ġ!= Ġother . content ) Ġreturn Ġfalse Ċĉĉ ĉ if Ġ( raw Ġ!= Ġnull ) Ġ{ Ċĉĉĉ ĉ if Ġ( other . raw Ġ== Ġnull ) Ġreturn Ġfalse Ċĉĉĉ ĉ if Ġ(! raw . content Equals ( other . raw )) Ġreturn Ġfalse Ċĉĉ ĉ } Ġelse Ġif Ġ( other . raw Ġ!= Ġnull ) Ġreturn Ġfalse Ċĉĉ ĉ if Ġ( format Ġ!= Ġother . format ) Ġreturn Ġfalse ĊĊĉĉ ĉ return Ġtrue Ċĉ ĉ } ĊĊĉ ĉ // ĠNeeds Ġto Ġbe Ġoverwritten Ġmanually , Ġas ĠByteArray Ġis Ġan Ġarray Ġand Ġthis Ċĉ ĉ // Ġisn 't Ġhandled Ġwell Ġby ĠKotlin Ċĉ ĉ override Ġfun ĠhashCode (): ĠInt Ġ{ Ċĉĉ ĉ var Ġresult Ġ= Ġid . hashCode () Ċĉĉ ĉ result Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġtimestamp . hashCode () Ċĉĉ ĉ result Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġcontent . hashCode () Ċĉĉ ĉ result Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġ( raw ?. content HashCode () Ġ?: Ġ 0 ) Ċĉĉ ĉ result Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġformat . hashCode () Ċĉĉ ĉ return Ġresult Ċĉ ĉ } Ċ ĉ } Ċ } Ċ Ċ private Ġval ĠCursor . as Iterable : ĠIterable < Cursor > Ċ ĉ get () Ġ= Ġobject Ġ: ĠIterable < Cursor > Ġ{ Ċĉ ĉ override Ġfun Ġiterator (): ĠIterator < Cursor > Ġ= Ġobject Ġ: ĠIterator < Cursor > Ġ{ Ċĉĉ ĉ override Ġfun Ġhas Next (): ĠBoolean Ġ= Ġposition Ġ+ Ġ 1 Ġ< Ġcount Ċĉĉ ĉ override Ġfun Ġnext (): ĠCursor Ġ= Ġif Ġ( moveTo Next ()) Ġ{ Ċĉĉĉ ĉ this @ as Iterable Ċĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉ ĉ throw ĠIllegalStateException (" You Ġcan 't Ġaccess Ġmore Ġitems , Ġthen Ġthere Ġare ") Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } Ċ