package Ġcom . github . ins an us mo kr ass ar . J DB CA uto ORM Driver Ċ Ċ import Ġcom . github . ins an us mo kr ass ar . Auto ORM . core .* Ċ import Ġcom . github . ins an us mo kr ass ar . Auto ORM . core . comp ilers . Operations Compiler Ċ import Ġcom . github . ins an us mo kr ass ar . Auto ORM . core . drivers . tables . interfaces . Connection Provider Ċ import Ġcom . github . ins an us mo kr ass ar . Auto ORM . core . drivers . tables . interfaces . Table Provider Ċ import Ġjava . sql . Connection Ċ import Ġjava . util . logging . Logger Ċ import Ġkotlin . reflect . K Class Ċ Ċ val Ġnative Types Map Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠ ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" INTEGER " ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLong :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" LONG " ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFloat :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" FLOAT " ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDouble :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" DOUBLE " ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" TEXT " ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBoolean :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" BOOLEAN " ĊĠĠĠĠĠĠĠ Ġ) Ċ ) Ċ Ċ class ĠJDBC Connection Provider ( private Ġval Ġconnection : ĠConnection ) Ġ: ĠConnection Provider Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġ< M Ġ: ĠAny , ĠO Ġ: ĠM > Ġget Table Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperations Compiler : ĠOperations Compiler , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Class : ĠK Class < M >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperations Class : ĠK Class < in ĠO >): ĠTable Provider < M , ĠO > Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Table If NotExist ( model Class ) ĊĠĠĠĠĠĠĠ Ġreturn ĠJ DB CT able Provider ( model Class , Ġoperations Class , Ġoperations Compiler , Ġconnection ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġ< M Ġ: ĠAny > Ġcreate Table If NotExist ( model Class : ĠK Class < M >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfields Builder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġval Ġprimary Fields Ġ= Ġmodel Class . get Primary Fields () ĊĊĠĠĠĠĠĠĠ Ġmodel Class . get Variables (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Return Native ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields Builder . append ("${ it . name } Ġ${ native Types Map [ it . return Class () ]} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Nullable ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields Builder . append (" ĠNOT ĠNULL ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( primary Fields . contains ( it ) Ġ&& Ġit . is Auto increment ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields Builder . append (" ĠAUTO _ INCREMENT ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfields Builder . append (", Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( primary Fields . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfields Builder . append (" CONSTRAINT Ġ${ model Class . simple Name }_ PR _ KEY ĠPRIMARY ĠKEY Ġ( ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprimary Fields . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields Builder . append ( it . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! primary Fields . is Last ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields Builder . append (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfields Builder . append (" )") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( connection . prepareStatement (" CREATE ĠTABLE ĠIF ĠNOT ĠEXISTS Ġ${ model Class . simple Name } Ġ($ fields Builder ); "). execute ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . getGlobal (). info (" Table Ġ${ model Class . simple Name } Ġwas Ġcreated ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . getGlobal (). throw ing ( this :: class . simple Name , Ġ" init ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Can 't Ġcreate Ġtable Ġ${ model Class . simple Name }", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection . close () ĊĠĠĠ Ġ} Ċ }