package Ġcom . ssh ust off . k ts ql ite . android Ċ Ċ import Ġandroid . database . sqlite . SQLite Database Ċ import Ġandroid . util . Log Ċ import Ġcom . ssh ust off . k ts ql ite . parsing . Sql Result Parser Ċ import Ġcom . ssh ust off . k ts ql ite . statement . Statement Executor Ċ import Ġkotlinx . coroutines . as Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . util . concurrent . Executors Ċ Ċ class ĠAndroid Statement Executor ( ĊĠĠĠ Ġprivate Ġval Ġwritable : Ġ() Ġ-> ĠSQLite Database , ĊĠĠĠ Ġprivate Ġval Ġreadable : Ġ() Ġ-> ĠSQLite Database Ġ= Ġwritable , ĊĠĠĠ Ġprivate Ġval Ġclose After Execute : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġprivate Ġval Ġdebug : ĠBoolean Ġ= Ġfalse Ċ ) Ġ: ĠStatement Executor Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġ< R > Ġselect ( ĊĠĠĠĠĠĠĠ Ġsql : ĠString , ĊĠĠĠĠĠĠĠ Ġargs : ĠArray < String >, ĊĠĠĠĠĠĠĠ Ġitem Parser : Ġ( Sql Result Parser ) Ġ-> ĠR ĊĠĠĠ Ġ): ĠList < R > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreadable (). use And Close IfNeeded Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( debug ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" k ts ql ite ", Ġ" sql :\ n \ r $ sql ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . raw Query ( sql , Ġargs ). use Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArrayList < R >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( cursor . moveTo Next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( item Parser ( Cursor Parser ( cursor ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( debug ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" k ts ql ite ", Ġ" select Ġresult Ġcount : Ġ${ this . size }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinsert ( sql : ĠString , Ġargs : ĠArray < String >): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwritable (). use And Close IfNeeded Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( debug ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" k ts ql ite ", Ġ" sql :\ n \ r $ sql ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . compile Statement ( sql ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind All Args As Strings ( args ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. execute Insert () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġexecute ( sql : ĠString , Ġargs : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( debug ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" k ts ql ite ", Ġ" sql :\ n \ r $ sql ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwritable (). use And Close IfNeeded Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . exec SQL ( sql , Ġargs ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< T > Ġin Transaction ( block : Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( transaction Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Transaction Blocking ( block ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġin Transaction Blocking ( block : Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwritable Ġ= Ġwritable () ĊĠĠĠĠĠĠĠ Ġwritable . beginTransaction Non Exclusive () ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock . invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwritable . set Transaction Successful () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwritable . end Transaction () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< R > ĠSQLite Database . use And Close IfNeeded ( run : Ġ( SQLite Database ) Ġ-> ĠR ): ĠR Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( close After Execute ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuse ( run ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtransaction Dispatcher Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExec utors . new Single Thread Executor (). as Coroutine Dispatcher () ĊĠĠĠ Ġ} Ċ } Ċ