/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠX iz hi ĠZ hu Ċ Ġ* Ċ Ġ* Ġ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 Ġme . x iz zh u . android . ask . db Ċ Ċ import Ġme . x iz zh u . android . ask . utils . forEach Indexed Ċ Ċ /** Ċ Ġ* Ġ@ internal Ċ Ġ*/ Ċ fun Ġbuild Sql For Creating Table ( table : ĠString , Ġif Not Exists : ĠBoolean , Ġcolumn Definitions : ĠMap < String , ĠColumn Modifiers >): ĠString Ġ{ ĊĠĠĠ Ġval Ġsql Builder Ġ= ĠStringBuilder (" CREATE ĠTABLE Ġ") ĊĠĠĠ Ġif Ġ( if Not Exists ) Ġsql Builder . append (" IF ĠNOT ĠEXISTS Ġ") ĊĠĠĠ Ġsql Builder . append ( table ) ĊĊĠĠĠ Ġsql Builder . append (" Ġ( ") ĊĊĠĠĠ Ġval Ġprimary Keys Ġ= Ġarray ListOf < String >() ĊĠĠĠ Ġvar Ġprimary Key Conflict Clause : ĠConflict Clause ? Ġ= Ġnull ĊĠĠĠ Ġval Ġforeign Keys Ġ= Ġhash Map Of < String , ĠForeign Key >() ĊĠĠĠ Ġcolumn Definitions . forEach Indexed Ġ{ Ġindex , Ġ( columnName , Ġmodifiers ) Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġ 0 ) Ġsql Builder . append (", Ġ") ĊĠĠĠĠĠĠĠ Ġsql Builder . append ( columnName ) ĊĊĠĠĠĠĠĠĠ Ġmodifiers . modifiers . forEach Ġ{ Ġmodifier Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( modifier ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPrimary Key Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprimary Keys . add ( columnName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( primaryKey Conflict Clause Ġ== Ġnull ) Ġprimary Key Conflict Clause Ġ= Ġmodifier . conflict Clause ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠForeign Key Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforeign Keys [ columnName ] Ġ= Ġmodifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsql Builder . append (' Ġ'). append ( modifier . text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( primary Keys . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġsql Builder . append (", ĠPRIMARY ĠKEY (" ) ĊĠĠĠĠĠĠĠ Ġprimary Keys . forEach Indexed Ġ{ Ġindex , Ġprimary Key Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġ 0 ) Ġsql Builder . append (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql Builder . append ( primaryKey ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsql Builder . append (' )') ĊĠĠĠĠĠĠĠ Ġprimary Key Conflict Clause ?. let Ġ{ Ġsql Builder . append (' Ġ'). append ( it . text ) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġforeign Keys . forEach Ġ{ Ġ( columnName , Ġforeign Key ) Ġ-> ĊĠĠĠĠĠĠĠ Ġsql Builder . append (", ĠFOREIGN ĠKEY (" ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ( columnName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append (" ) ĠREFERENCES Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ( foreign Key . reference Table ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append (' (' ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ( foreign Key . reference Column ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append (' )') ĊĊĠĠĠĠĠĠĠ Ġforeign Key . constraints . forEach Ġ{ Ġconstraint Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql Builder . append (' Ġ'). append ( constraint . text ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsql Builder . append (" ); ") ĊĊĠĠĠ Ġreturn Ġsql Builder . toString () Ċ } Ċ Ċ /** Ċ Ġ* Ġ@ internal Ċ Ġ*/ Ċ fun Ġbuild Sql For Creating Index ( index : ĠString , Ġtable : ĠString , Ġcolumns : ĠArray < out ĠString >, Ġif Not Exists : ĠBoolean ) ĊĠĠĠĠĠĠĠ Ġ: ĠString Ġ= ĠStringBuilder (). run Ġ{ ĊĠĠĠ Ġappend (" CREATE ĠINDEX Ġ") ĊĠĠĠ Ġif Ġ( if Not Exists ) Ġappend (" IF ĠNOT ĠEXISTS Ġ") ĊĠĠĠ Ġappend ( index ) ĊĠĠĠ Ġappend (" ĠON Ġ") ĊĠĠĠ Ġappend ( table ) ĊĠĠĠ Ġappend (" Ġ( ") ĊĠĠĠ Ġcolumns . forEach Indexed Ġ{ Ġindex , Ġcolumn Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġ 0 ) Ġappend (", Ġ") ĊĠĠĠĠĠĠĠ Ġappend ( column ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġappend (" ); ") ĊĊĠĠĠ ĠtoString () Ċ } Ċ Ċ /** Ċ Ġ* Ġ@ internal Ċ Ġ*/ Ċ fun Ġbuild Sql For Where ( condition : ĠCondition ): ĠString Ġ= Ġcondition . text Ċ Ċ // ĠA Ġstring Ġconstant Ġis Ġformed Ġby Ġen closing Ġthe Ġstring Ġin Ġsingle Ġquotes Ġ( '). ĠA Ġsingle Ġquote Ġwithin Ċ // Ġthe Ġstring Ġcan Ġbe Ġencoded Ġby Ġputting Ġtwo Ġsingle Ġquotes Ġin Ġa Ġrow Ġ- Ġas Ġin ĠPas cal . ĠC - style Ġescap es Ċ // Ġusing Ġthe Ġback slash Ġcharacter Ġare Ġnot Ġsupported Ġbecause Ġthey Ġare Ġnot Ġstandard ĠSQL . Ċ // ĠRef . Ġhttps :// www . sqlite . org / lang _ expr . html Ċ internal Ġfun ĠString . escape (): ĠString Ġ= Ġreplace (" '", Ġ" '' ") Ċ Ċ internal Ġfun Ġ< T > ĠIterable < T >. to Sql In Expression (): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġjoin ToString ( prefix Ġ= Ġ"'", Ġpostfix Ġ= Ġ"'", Ġseparator Ġ= Ġ"', Ġ' ", Ġtransform Ġ= Ġ{ Ġit . toString (). escape () Ġ}) Ċ