package Ġcom . ze ko . example Ċ Ċ import Ġcom . github . j async . sql . db . ResultSet Ċ import Ġcom . github . j async . sql . db . mysql . MySQL Connection Builder Ċ import Ġio . vertx . ext . web . Route Ċ import Ġio . vertx . ext . web . Router Ċ import Ġio . vertx . ext . web . Routing Context Ċ import Ġio . vertx . kotlin . coroutines . Coroutine Vert icle Ċ import Ġio . vertx . kotlin . coroutines . await Event Ċ import Ġio . vertx . kotlin . coroutines . dispatcher Ċ import Ġkotlinx . coroutines . launch Ċ import Ġcom . ze ko . model .* Ċ import Ġcom . ze ko . model . Select Ċ import Ġio . vertx . core . json . Json Ċ import Ġio . vertx . core . json . JsonObject Ċ import Ġio . vertx . core . json . JsonArray Ċ import Ġio . vertx . ext . async sql . MySQL Client Ċ import Ġorg . joda . time .* Ċ import Ġjava . util . Linked HashMap Ċ import Ġorg . joda . time . base . Base Local Ċ Ċ class ĠMain Vert icle Ġ: ĠCor outine Vert icle () Ġ{ ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrouter Ġ= ĠRouter . router ( vertx ) ĊĠĠĠĠĠĠĠ Ġrouter . get ("/ j async - raw - sql "). coroutine Handler Ġ{ Ġctx Ġ-> Ġj async Raw Sql ( ctx ) Ġ} ĊĠĠĠĠĠĠĠ Ġrouter . get ("/ j async - easy "). coroutine Handler Ġ{ Ġctx Ġ-> Ġj async Easy ( ctx ) Ġ} ĊĠĠĠĠĠĠĠ Ġrouter . get ("/ common - sql "). coroutine Handler Ġ{ Ġctx Ġ-> Ġcommon Sql ( ctx ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġvert x . create HttpServer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. request Handler ( router ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. listen ( 8 0 8 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġj async Raw Sql ( ctx : ĠRouting Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsql Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser . id Ġas Ġ` user - id `, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser . name Ġas Ġ` user - name `, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrole . id Ġas Ġ` role - id `, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser . id Ġas Ġ` role - user _ id `, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrole . role _ name Ġas Ġ` role - role _ name `, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress . id Ġas Ġ` address - id `, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser . id Ġas Ġ` address - user _ id `, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress . street 1 Ġas Ġ` address - street 1 `, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress . street 2 Ġas Ġ` address - street 2 ` ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Ġuser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġjoin Ġaddress Ġon Ġaddress . user _ id Ġ= Ġuser . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġouter Ġjoin Ġuser _ has _ role Ġon Ġuser _ has _ role . user _ id Ġ= Ġuser . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġouter Ġjoin Ġrole Ġon Ġrole . id Ġ= Ġuser _ has _ role . role _ id ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠĠĠĠĠ Ġ// ĠConnection Ġto ĠMySQL ĠDB ĊĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= ĠMySQL Connection Builder . create Connection Pool (" jdbc : mysql :// localhost : 3 3 0 6 / ze ko _ test ? user = root & password = root ") ĊĠĠĠĠĠĠĠ Ġval Ġres Future Ġ= Ġconnection . send PreparedStatement ( sql ) ĊĠĠĠĠĠĠĠ Ġval Ġquery Result Ġ= Ġres Future . get () ĊĠĠĠĠĠĠĠ Ġconnection . disconnect (). get () ĊĊĠĠĠĠĠĠĠ Ġval Ġrows Ġ= Ġquery Result . rows ĊĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġrows . to Maps ( listOf (" user - id ", Ġ" user - name ", Ġ" role - id ", Ġ" role - user _ id ", Ġ" role - role _ name ", Ġ" address - id ", Ġ" address - user _ id ", Ġ" address - street 1 ", Ġ" address - street 2 ")) ĊĊĠĠĠĠĠĠĠ Ġval Ġtables Ġ= Ġlinked Map Of < String , ĠTable Info >() ĊĠĠĠĠĠĠĠ Ġtables [" user "] Ġ= ĠTable Info ( key Ġ= Ġ" id ") ĊĠĠĠĠĠĠĠ Ġtables [" role "] Ġ= ĠTable Info ( key Ġ= Ġ" id ", Ġmove _ under Ġ= Ġ" user ", Ġforeign _ key Ġ= Ġ" user _ id ", Ġmany _ to _ many Ġ= Ġtrue , Ġremove Ġ= ĠlistOf (" user _ id ")) ĊĠĠĠĠĠĠĠ Ġtables [" address "] Ġ= ĠTable Info ( key Ġ= Ġ" id ", Ġmove _ under Ġ= Ġ" user ", Ġforeign _ key Ġ= Ġ" user _ id ", Ġmany _ to _ one Ġ= Ġtrue , Ġremove Ġ= ĠlistOf (" user _ id ")) ĊĊĠĠĠĠĠĠĠ Ġval Ġmapper Ġ= ĠData Mapper () ĊĠĠĠĠĠĠĠ Ġval Ġmapped Results Ġ= Ġmapper . map ( tables , Ġresults ) ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= ĠJson . encode P ret til y ( mapped Results ) ĊĊĠĠĠĠĠĠĠ Ġctx . response (). end ( json ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġj async Easy ( ctx : ĠRouting Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġselect Ġ= ĠSelect () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table (" user "). fields (" id ", Ġ" name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table (" role "). fields (" id ", Ġ" role _ name ", Ġ" user . id Ġ= Ġuser _ id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table (" address "). fields (" id ", Ġ" street 1 ", Ġ" street 2 ", Ġ" user . id Ġ= Ġuser _ id ") ĊĊĠĠĠĠĠĠĠ Ġval Ġ( columns , Ġsql Fields ) Ġ= Ġselect . prepare () ĊĊĠĠĠĠĠĠĠ Ġval Ġsql Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect Ġ$ sql Fields ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Ġuser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġjoin Ġaddress Ġon Ġaddress . user _ id Ġ= Ġuser . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġouter Ġjoin Ġuser _ has _ role Ġon Ġuser _ has _ role . user _ id Ġ= Ġuser . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġouter Ġjoin Ġrole Ġon Ġrole . id Ġ= Ġuser _ has _ role . role _ id ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠĠĠĠĠ Ġ// ĠConnection Ġto ĠMySQL ĠDB ĊĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= ĠMySQL Connection Builder . create Connection Pool (" jdbc : mysql :// localhost : 3 3 0 6 / ze ko _ test ? user = root & password = root ") ĊĠĠĠĠĠĠĠ Ġval Ġres Future Ġ= Ġconnection . send PreparedStatement ( sql ) ĊĠĠĠĠĠĠĠ Ġval Ġquery Result Ġ= Ġres Future . get () ĊĠĠĠĠĠĠĠ Ġconnection . disconnect (). get () ĊĊĠĠĠĠĠĠĠ Ġval Ġrows Ġ= Ġquery Result . rows ĊĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġrows . to Maps ( columns ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtables Ġ= ĠMapper Config (" id ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table (" user ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table (" role "). many ToMany ( true ). move Under (" user "). foreign Key (" user _ id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table (" address "). many ToOne ( true ). move Under (" user "). foreign Key (" user _ id ") ĊĊĠĠĠĠĠĠĠ Ġval Ġmapper Ġ= ĠData Mapper () ĊĠĠĠĠĠĠĠ Ġval Ġmapped Results Ġ= Ġmapper . map ( tables , Ġresults ) ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= ĠJson . encode P ret til y ( mapped Results ) ĊĊĠĠĠĠĠĠĠ Ġctx . response (). end ( json ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġsuspend Ġfun Ġcommon Sql ( ctx : ĠRouting Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclient Conf Ġ= ĠJsonObject (). put (" host ", Ġ" localhost ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put (" port ", Ġ 3 3 0 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put (" database ", Ġ" ze ko _ test ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put (" username ", Ġ" root ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put (" password ", Ġ" root ") ĊĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠMySQL Client . create Shared ( vertx , Ġclient Conf ) ĊĊĠĠĠĠĠĠĠ Ġval Ġselect Ġ= ĠSelect () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table (" user "). fields (" id ", Ġ" name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table (" role "). fields (" id ", Ġ" role _ name ", Ġ" user . id Ġ= Ġuser _ id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. table (" address "). fields (" id ", Ġ" street 1 ", Ġ" street 2 ", Ġ" user . id Ġ= Ġuser _ id ") ĊĊĠĠĠĠĠĠĠ Ġval Ġ( columns , Ġsql Fields ) Ġ= Ġselect . prepare () ĊĊĠĠĠĠĠĠĠ Ġval Ġsql Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect Ġ$ sql Fields ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Ġuser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġjoin Ġaddress Ġon Ġaddress . user _ id Ġ= Ġuser . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġouter Ġjoin Ġuser _ has _ role Ġon Ġuser _ has _ role . user _ id Ġ= Ġuser . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġouter Ġjoin Ġrole Ġon Ġrole . id Ġ= Ġuser _ has _ role . role _ id ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠĠĠĠĠ Ġclient . getConnection Ġ{ Ġres Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( res . succeeded ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġres . result () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . query ( sql , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrows Ġ= Ġit . result (). results ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġrows . to Maps ( columns ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtables Ġ= ĠMapper Config (" id ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. table (" user ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. table (" role "). many ToMany ( true ). move Under (" user "). foreign Key (" user _ id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. table (" address "). many ToOne ( true ). move Under (" user "). foreign Key (" user _ id ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmapper Ġ= ĠData Mapper () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmapped Results Ġ= Ġmapper . map ( tables , Ġresults ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Ġ= ĠJson . encode P ret til y ( mapped Results ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . response (). end ( json ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAn Ġextension Ġmethod Ġfor Ġsimpl ifying Ġcor outines Ġusage Ġwith ĠVert . x ĠWeb Ġrout ers ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠRoute . coroutine Handler ( fn : Ġsuspend Ġ( Routing Context ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandler Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( ctx . vertx (). dispatcher ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfn ( ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . fail ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExtension Ġmethod Ġto ĠJ async ĠResultSet Ġto Maps ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠResultSet . to Maps ( sel : ĠSelect Info , Ġtime Processor : Ġ(( Base Local , ĠDateTime Zone ?, ĠDateTime Zone ?) Ġ-> ĠAny )? Ġ= Ġnull , Ġtz From : ĠDateTime Zone ? Ġ= Ġnull , Ġtz To : ĠDateTime Zone ? Ġ= Ġnull ): ĠList < Linked HashMap < String , ĠAny ? >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠResultSet Helper . to Maps ( this , Ġsel . columns , Ġtime Processor , Ġtz From , Ġtz To ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠResultSet . to Maps ( columns : ĠList < String >, Ġtime Processor : Ġ(( Base Local , ĠDateTime Zone ?, ĠDateTime Zone ?) Ġ-> ĠAny )? Ġ= Ġnull , Ġtz From : ĠDateTime Zone ? Ġ= Ġnull , Ġtz To : ĠDateTime Zone ? Ġ= Ġnull ): ĠList < Linked HashMap < String , ĠAny ? >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠResultSet Helper . to Maps ( this , Ġcolumns , Ġtime Processor , Ġtz From , Ġtz To ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExtension Ġmethod Ġto Ġvert x Ġcommon - sql Ġresults Ġwhich Ġreturns ĠList < JsonArray > Ġin Ġa Ġquery ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠList < JsonArray >. to Maps ( sel : ĠSelect Info , Ġtime Processor : Ġ(( Base Local , ĠDateTime Zone ?, ĠDateTime Zone ?) Ġ-> ĠAny )? Ġ= Ġnull , Ġtz From : ĠDateTime Zone ? Ġ= Ġnull , Ġtz To : ĠDateTime Zone ? Ġ= Ġnull ): ĠList < Linked HashMap < String , ĠAny ? >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠResultSet Helper . to Maps ( this , Ġsel . columns , Ġtime Processor , Ġtz From , Ġtz To ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠList < JsonArray >. to Maps ( columns : ĠList < String >, Ġtime Processor : Ġ(( Base Local , ĠDateTime Zone ?, ĠDateTime Zone ?) Ġ-> ĠAny )? Ġ= Ġnull , Ġtz From : ĠDateTime Zone ? Ġ= Ġnull , Ġtz To : ĠDateTime Zone ? Ġ= Ġnull ): ĠList < Linked HashMap < String , ĠAny ? >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠResultSet Helper . to Maps ( this , Ġcolumns , Ġtime Processor , Ġtz From , Ġtz To ) ĊĠĠĠ Ġ} Ċ } Ċ