package Ġcom . so y wiz . k mini orm . dialect Ċ Ċ import Ġcom . so y wiz . k mini orm .* Ċ import Ġcom . so y wiz . k mini orm . ty per . T yper Ċ import Ġjava . sql . SQLException Ċ import Ġjava . sql . SQL Integr ity Constraint Violation Exception Ċ import Ġjava . util .* Ċ import Ġkotlin . reflect . K Annotated Element Ċ import Ġkotlin . reflect . K Property 1 Ċ import Ġkotlin . reflect . K Type Ċ import Ġkotlin . reflect . full . find Annotation Ċ import Ġkotlin . reflect . jvm . jvm Er asure Ċ Ċ open Ġclass ĠSql Dialect () Ġ: ĠDb Quote able Ġ{ ĊĠĠĠ Ġopen Ġval Ġsupports Last Insert Id : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġval Ġdialect Ġ= Ġthis ĊĠĠĠ Ġopen Ġval Ġsupport Primary Index Ġget () Ġ= Ġfalse ĊĊĠĠĠ Ġcompanion Ġobject ĠANSI Ġ: ĠSql Dialect () ĊĊĠĠĠ Ġenum Ġclass ĠIndex Type Ġ{ ĠPRIMARY , ĠUNIQUE , ĠINDEX , ĠOTHER Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġquote ColumnName ( str : ĠString ) Ġ= Ġ_ quote ( str ) ĊĠĠĠ Ġoverride Ġfun Ġquote TableName ( str : ĠString ) Ġ= Ġ_ quote ( str ) ĊĠĠĠ Ġoverride Ġfun Ġquote String ( str : ĠString ) Ġ= Ġ_ quote ( str , Ġtype Ġ= Ġ'\' ') ĊĠĠĠ Ġoverride Ġfun Ġquote Literal ( value : ĠAny ?) Ġ= Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ" NULL " ĊĠĠĠĠĠĠĠ Ġis ĠBoolean Ġ-> Ġ"$ value " ĊĠĠĠĠĠĠĠ Ġis ĠInt , Ġis ĠLong , Ġis ĠFloat , Ġis ĠDouble , Ġis ĠNumber Ġ-> Ġ"$ value " ĊĠĠĠĠĠĠĠ Ġis ĠDb Int Key Ġ-> Ġ"${ value . key }" ĊĠĠĠĠĠĠĠ Ġis ĠString Ġ-> Ġquote String ( value ) ĊĠĠĠĠĠĠĠ Ġis ĠDate Ġ-> Ġquote String ( java . sql . Date ( value . time ). toString ()) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġquote String ("$ value ") ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġopen Ġfun Ġto Sql Type ( property : ĠK Property 1 < *, Ġ* >): ĠString Ġ= Ġto Sql Type ( property . returnType , Ġproperty ) ĊĊĠĠĠ Ġopen Ġfun Ġto Sql Type ( type : ĠK Type , Ġannotations : ĠK Annotated Element ? Ġ= Ġnull ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( type . jvm Er asure ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInt :: class Ġ-> Ġ" INTEGER " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLong :: class Ġ-> Ġ" BIG INT " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Boolean :: class Ġ-> Ġ" TIN Y INT " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBoolean :: class Ġ-> Ġ" BOOLEAN " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠByteArray :: class Ġ-> Ġ" BLOB " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDate :: class Ġ-> Ġ" TIMESTAMP " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString :: class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠmaxLength Ġ= Ġannotations ?. find Annotation < Db MaxLength >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġ( maxLength Ġ!= Ġnull ) Ġ" VARCHAR (${ maxLength . length })" Ġelse Ġ" TEXT " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( maxLength Ġ!= Ġnull ) Ġ" VARCHAR (${ maxLength . length })" Ġelse Ġ" VARCHAR " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDb Int Ref :: class , ĠDb Int Key :: class Ġ-> Ġ" INTEGER " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDb Ref :: class , ĠDb Key :: class Ġ-> Ġ" VARCHAR " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDb String Ref :: class , ĠDb String Ref :: class Ġ-> Ġ" VARCHAR " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDb Any Ref :: class , ĠDb Any Ref :: class Ġ-> Ġ" VARCHAR " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" VARCHAR " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġsql Create Column Def ( ty per : ĠT yper , Ġcol Name : ĠString , Ġtype : ĠK Type , ĠdefaultValue : ĠAny ? Ġ= ĠUnit , Ġannotations : ĠK Annotated Element ? Ġ= Ġnull ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( quote ColumnName ( col Name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotations ?. find Annotation < Db Auto Increment >() Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( auto increment ( type , Ġannotations )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( to Sql Type ( type , Ġannotations )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Marked Nullable Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" ĠNULL ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" ĠNOT ĠNULL ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" ĠDEFAULT Ġ( ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( quote Literal ( if Ġ( defaultValue Ġ!= ĠUnit ) ĠdefaultValue Ġelse Ġty per . create Default ( type ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġauto increment ( type : ĠK Type , Ġannotations : ĠK Annotated Element ): ĠString Ġ= Ġ"${ to Sql Type ( type , Ġannotations )} ĠAUTO _ INCREMENT " ĊĊĠĠĠ Ġopen Ġfun Ġsql Create Column Def ( ty per : ĠT yper , Ġcolumn : ĠI Column Def ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsql Create Column Def ( ty per , Ġcolumn . name , Ġcolumn . column Type , Ġcolumn . defaultValue , Ġcolumn . annotated Element ) ĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( quote ColumnName ( column . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( to Sql Type ( column . property )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( column . is Nullable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" ĠNULL ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" ĠNOT ĠNULL ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn . j clazz Ġ== ĠString :: class Ġ-> Ġappend (" ĠDEFAULT Ġ(' ') ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn . j clazz . is Subclass Of ( Number :: class ) Ġ-> Ġappend (" ĠDEFAULT Ġ( 0 )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġsql CreateTable ( ty per : ĠT yper , Ġtable : ĠString , Ġcolumns : ĠList < I Column Def >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" CREATE ĠTABLE ĠIF ĠNOT ĠEXISTS Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( quote TableName ( table )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Ġ( ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( columns . join ToString (", Ġ") Ġ{ Ġsql Create Column Def ( ty per , Ġit ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" ); ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġsql Alter Table Add Column ( ty per : ĠT yper , Ġtable : ĠString , Ġcolumn : ĠI Column Def ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" ALTER ĠTABLE Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( quote TableName ( table )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" ĠADD Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( sql Create Column Def ( ty per , Ġcolumn )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("; ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġsql Delete ( table : ĠString , Ġquery : ĠDb Query <* >, Ġparams : ĠArrayList < Any ? >, Ġlimit : ĠLong ? Ġ= Ġnull ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" DELETE ĠFROM Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( quote TableName ( table )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" ĠWHERE Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( query . toString ( dialect , Ġparams )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( limit Ġ!= Ġnull ) Ġappend (" ĠLIMIT Ġ$ limit ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("; ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġsuspend Ġfun Ġshow Columns ( db : ĠDb Queryable , Ġtable : ĠString ): ĠList < I Column Def > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdb . query (" SHOW ĠCOL UMNS ĠFROM Ġ${ quote TableName ( table )}; ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSynt hetic Column < String >( it [" FIELD "] ?. toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġit [" COLUMN _ NAME "] ?. toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ"- ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġprotected Ġfun Ġ_ quote ( str : ĠString , Ġtype : ĠChar Ġ= Ġ'" ') Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠ Ġappend ( type ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( char Ġin Ġstr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char Ġ== Ġtype ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( char ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġappend ( type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġsql Alter Create Index ( index : ĠIndex Type , ĠtableName : ĠString , Ġcolumns : ĠList < Column Def <* >>, Ġindex Name : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" CREATE Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( when Ġ( index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIndex Type . PRIMARY Ġ-> Ġif Ġ( dialect . support Primary Index ) Ġ" PRIMARY ĠINDEX " Ġelse Ġ" UNIQUE ĠINDEX " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIndex Type . UNIQUE Ġ-> Ġ" UNIQUE ĠINDEX " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" INDEX " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpack s Ġ= Ġcolumns . map Ġ{ Ġ"${ quote ColumnName ( it . name )} Ġ${ it . index Direction . s name }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" ĠIF ĠNOT ĠEXISTS Ġ${ quote ColumnName ("${ tableName }_${ index Name }") } ĠON Ġ${ quote TableName ( tableName )} Ġ(${ packs . join ToString (", Ġ") }); ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġsql Insert Into ( on Conflict : ĠDb On Conflict ): ĠString Ġ= Ġwhen Ġ( on Conflict ) Ġ{ ĊĠĠĠĠĠĠĠ ĠDb On Conflict . ERROR Ġ-> Ġ" INSERT ĠINTO Ġ" ĊĠĠĠĠĠĠĠ ĠDb On Conflict . IGNORE Ġ-> Ġ" INSERT ĠIG NORE ĠINTO Ġ" ĊĠĠĠĠĠĠĠ ĠDb On Conflict . REPLACE Ġ-> Ġ" INSERT ĠINTO Ġ" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠSql Insert Info ( val Ġsql : ĠString , Ġval Ġrepeat Count : ĠInt ) ĊĠĠĠ Ġopen Ġfun Ġsql Insert ( tableName : ĠString , Ġtable Info : ĠO rm Table Info <* >, Ġkeys : ĠList < I Column Def >, Ġon Conflict : ĠDb On Conflict ): ĠSql Insert Info Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġrepeat Count Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġreturn ĠSql Insert Info ( build String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( sql Insert Into ( on Conflict )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( quote TableName ( tableName )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Ġ( ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( keys . join ToString (", Ġ") Ġ{ Ġquote ColumnName ( it . name ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" ) ĠVALUES Ġ( ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( keys . join ToString (", Ġ") Ġ{ Ġ" ?" Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( on Conflict Ġ== ĠDb On Conflict . REPLACE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġsql Insert Replace ( table Info , Ġkeys ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( res . sql ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat Count Ġ+= Ġres . repeat Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġrepeat Count ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġsql Insert Replace ( table Info : ĠO rm Table Info <* >, Ġkeys : ĠList < I Column Def >): ĠSql Insert Info Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSql Insert Info ("", Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġval Ġsupport Extended Insert Ġ= Ġfalse ĊĊĠĠĠ Ġopen Ġfun Ġtransform Exception ( e : ĠThrowable ): ĠThrowable Ġ= Ġwhen Ġ( e ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠSQL Integr ity Constraint Violation Exception Ġ-> ĠDuplicate Key Db Exception (" Conflict ", Ġe ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġe . message Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe Ġis ĠSQLException Ġ&& Ġ( message . contains (" constraint Ġviolation ") Ġ|| Ġmessage . contains (" constraint Ġfailed ") Ġ|| Ġmessage . contains (" key Ġviolation ")) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDuplicate Key Db Exception (" Conflict ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġlast Insert Id (): ĠString Ġ= Ġerror (" UNSUPPORTED ") Ċ }