package Ġde . tre ona . league Tools . io Ċ Ċ import Ġcom . mysql . cj . jdbc . Mysql DataSource Ċ import Ġde . tre ona . league Tools . account . Discord Sum mon er Ċ import Ġde . tre ona . shelf s . api . She lfs Ċ import Ġde . tre ona . shelf s . io . database . Database Credentials Ċ import Ġde . tre ona . shelf s . io . logger . Logger Ċ import Ġnet . dv 8 tion . j da . core . entities . User Ċ import Ġno . st el ar 7 . api . l 4 j 8 . basic . constants . api . Platform Ċ import Ġjava . sql . PreparedStatement Ċ import Ġjava . sql . SQLException Ċ Ċ class ĠDatabase Manager ( private Ġval Ġlogger : ĠLogger ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠdataSource Ġ= ĠM ysql DataSource () ĊĊĠĠĠ Ġfun Ġsetup ( database Credentials : ĠDatabase Credentials ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . logger . log Message (" Starting Ġthe Ġmysql Ġmanager .", Ġde . tre ona . shelf s . io . logger . LogLevel . INFO ) ĊĠĠĠĠĠĠĠ Ġthis . dataSource . user Ġ= Ġdatabase Credentials . user ĊĠĠĠĠĠĠĠ Ġthis . dataSource . set Password ( database Credentials . password ) ĊĠĠĠĠĠĠĠ Ġthis . dataSource . server Name Ġ= Ġdatabase Credentials . host ĊĠĠĠĠĠĠĠ Ġthis . dataSource . port Ġ= Ġdatabase Credentials . port ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . dataSource . use SSL Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSQLException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . dataSource . server Timezone Ġ= Ġ" UTC " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġadd Ġtime Ġzone Ġsupport ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSQLException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . dataSource . set URL (" jdbc : mysql ://" Ġ+ Ġdatabase Credentials . host Ġ+ Ġ"/" Ġ+ Ġdatabase Credentials . database ) ĊĠĠĠĠĠĠĠ Ġthis . setup Environment () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdoes Table Exist ( tableName : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġthis . dataSource . connection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprepared Statement : ĠPreparedStatement ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Statement Ġ= Ġwhen Ġ( tableName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" sum mon ers " Ġ-> Ġconnection . prepareStatement (" SELECT Ġ 1 ĠFROM Ġsum mon ers ĠLIMIT Ġ 1 ; ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" versions " Ġ-> Ġconnection . prepareStatement (" SELECT Ġ 1 ĠFROM Ġversions ĠLIMIT Ġ 1 ; ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" champ ions " Ġ-> Ġconnection . prepareStatement (" SELECT Ġ 1 ĠFROM Ġchamp ions ĠLIMIT Ġ 1 ; ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Statement ?. executeQuery () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Statement ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSQLException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcan Connect (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġthis . dataSource . connection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Sum mon ers Table () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġthis . dataSource . connection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprepared Statement Ġ= Ġconnection . prepareStatement (" CREATE ĠTABLE Ġsum mon ers ( ĠuserId Ġint ĠPRIMARY ĠKEY ĠNOT ĠNULL ĠAUTO _ INCREMENT , Ġsum mon er Id ĠLONG ĠNOT ĠNULL , Ġregion ĠTEXT ĠNOT ĠNULL , Ġdiscord Id ĠLONG ); ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Statement . executeUpdate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Statement . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Statement Ġ= Ġconnection . prepareStatement (" CREATE ĠUNIQUE ĠINDEX Ġsum mon ers _ userId _ u index ĠON Ġsum mon ers Ġ( userId ); ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Statement . executeUpdate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Statement . close () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSQLException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Versions Table () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġthis . dataSource . connection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprepared Statement Ġ= Ġconnection . prepareStatement (" CREATE ĠTABLE Ġversions ( version Id Ġint ĠPRIMARY ĠKEY ĠNOT ĠNULL ĠAUTO _ INCREMENT , version Name ĠTEXT ); ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Statement . executeUpdate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Statement . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Statement Ġ= Ġconnection . prepareStatement (" CREATE ĠUNIQUE ĠINDEX Ġversions _ version Id _ u index ĠON Ġversions Ġ( version Id ); ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Statement . executeUpdate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Statement . close () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSQLException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Champ ions Table () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġthis . dataSource . connection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprepared Statement Ġ= Ġconnection . prepareStatement (" CREATE ĠTABLE Ġchamp ions ( entry Id Ġint ĠPRIMARY ĠKEY ĠNOT ĠNULL ĠAUTO _ INCREMENT , Ġversion Id Ġint , champ ion Id Ġint , Ġchamp ion Data ĠTEXT ); ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Statement . executeUpdate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Statement . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Statement Ġ= Ġconnection . prepareStatement (" CREATE ĠUNIQUE ĠINDEX Ġchamp ions _ entry Id _ u index ĠON Ġchamp ions Ġ( entry Id ); ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Statement . executeUpdate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Statement . close () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSQLException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Environment (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! this . can Connect ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . logger . log Message (" Can 't Ġconnect Ġto Ġthe Ġdatabase .", Ġde . tre ona . shelf s . io . logger . LogLevel . WARNING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( this . does Table Exist (" sum mon ers ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . logger . log Message (" Connected Ġto Ġthe Ġdatabase .", Ġde . tre ona . shelf s . io . logger . LogLevel . INFO ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . create Sum mon ers Table () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . logger . log Message (" Creating Ġthe Ġsum mon ers Ġtable .", Ġde . tre ona . shelf s . io . logger . LogLevel . INFO ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! this . does Table Exist (" sum mon ers ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . logger . log Message (" No Ġwrite Ġpermission Ġon Ġthe Ġdatabase !", Ġde . tre ona . shelf s . io . logger . LogLevel . WARNING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! this . does Table Exist (" versions ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . create Versions Table () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . logger . log Message (" Creating Ġthe Ġversions Ġtable .", Ġde . tre ona . shelf s . io . logger . LogLevel . INFO ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! this . does Table Exist (" champ ions ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . create Champ ions Table () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . logger . log Message (" Creating Ġthe Ġchamp ions Ġtable .", Ġde . tre ona . shelf s . io . logger . LogLevel . INFO ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . logger . log Message (" Environment Ġis Ġsetup .", Ġde . tre ona . shelf s . io . logger . LogLevel . INFO ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Discord User Registered ( discord Id : ĠLong ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠdataSource . connection . prepareStatement (" SELECT Ġ 1 Ġdiscord Id ĠFROM Ġsum mon ers ĠWHERE Ġdiscord Id Ġ= Ġ? ; "). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Long ( 1 , Ġdiscord Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . executeQuery (). use Ġ{ Ġreturn Ġit . next () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Sum mon er Registered ( sum mon er Id : ĠLong , Ġplatform : ĠPlatform ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠdataSource . connection . prepareStatement (" SELECT Ġsum mon er Id ĠFROM Ġsum mon ers ĠWHERE Ġ( sum mon er Id Ġ= Ġ? ĠAND Ġregion Ġ= Ġ? ); "). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Long ( 1 , Ġsum mon er Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . setString ( 2 , Ġplatform . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . executeQuery (). use Ġ{ Ġreturn Ġit . next () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Discord User By Sum mon er Id ( sum mon er Id : ĠLong , Ġplatform : ĠPlatform ): ĠUser ? Ġ{ ĊĠĠĠĠĠĠĠ ĠdataSource . connection . prepareStatement (" SELECT Ġdiscord Id ĠFROM Ġsum mon ers ĠWHERE Ġ( sum mon er Id Ġ= Ġ? ĠAND Ġregion Ġ= Ġ? ); "). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Long ( 1 , Ġsum mon er Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . setString ( 1 , Ġplatform . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . executeQuery (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! it . next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShe lfs . get J da (). getUser ById ( it . getLong ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Discord Sum mon er By Discord Id ( discord Id : ĠLong ): ĠDiscord Sum mon er ? Ġ{ ĊĠĠĠĠĠĠĠ ĠdataSource . connection . prepareStatement (" SELECT Ġsum mon er Id , Ġregion ĠFROM Ġsum mon ers ĠWHERE Ġdiscord Id Ġ= Ġ? ; "). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Long ( 1 , Ġdiscord Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . executeQuery (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! it . next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDiscord Sum mon er ( She lfs . get J da (). getUser ById ( discord Id ), Ġit . getLong ( 1 ), ĠPlatform . fromString ( it . getString ( 2 )). get ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġregister Sum mon er ( discord Sum mon er : ĠDiscord Sum mon er ) Ġ{ ĊĠĠĠĠĠĠĠ ĠdataSource . connection . prepareStatement (" INSERT ĠINTO Ġsum mon ers Ġ( sum mon er Id , Ġregion , Ġdiscord Id ) ĠVALUES Ġ( ?, Ġ?, Ġ? ); "). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Long ( 1 , Ġdiscord Sum mon er . sum mon er Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . setString ( 2 , Ġdiscord Sum mon er . region . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Long ( 3 , Ġdiscord Sum mon er . user . id Long ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . executeUpdate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Latest Cached Version (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . dataSource . connection . prepareStatement (" SELECT Ġversion Name ĠFROM Ġversions ĠORDER ĠBY Ġversion Id ĠDESC ĠLIMIT Ġ 0 , 1 ; "). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . executeQuery (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! it . next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . getString ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Latest Version ( version Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprepared Statement Ġ= Ġthis . dataSource . connection . prepareStatement (" INSERT ĠINTO Ġversions Ġ( version Name ) ĠVALUES (? ); ") ĊĠĠĠĠĠĠĠ Ġprepared Statement . setString ( 1 , Ġversion Name ) ĊĠĠĠĠĠĠĠ Ġprepared Statement . executeUpdate () ĊĠĠĠĠĠĠĠ Ġprepared Statement . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Latest Version Id (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . dataSource . connection . prepareStatement (" SELECT Ġversion Id ĠFROM Ġversions ĠORDER ĠBY Ġversion Id ĠDESC ĠLIMIT Ġ 0 , 1 ; ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . executeQuery () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( it . next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . getInt ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTODO Ġmake Ġthis Ġmore Ġefficient ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate Champ ions ( champ ions : ĠHashMap < Int , ĠString >, Ġversion Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchamp ions . forEach Ġ{ Ġchamp ion Id , Ġbase 6 4 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . dataSource . connection . prepareStatement (" INSERT ĠINTO Ġchamp ions Ġ( version Id , Ġchamp ion Id , Ġchamp ion Data ) ĠVALUES Ġ( ?, Ġ?, Ġ? ); "). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . setInt ( 1 , Ġversion Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . setInt ( 2 , Ġchamp ion Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . setString ( 3 , Ġbase 6 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . executeUpdate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Cached Champ ions ( version Id : ĠInt ): ĠHashMap < Int , ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchamp ions Ġ= ĠHashMap < Int , ĠString >() ĊĠĠĠĠĠĠĠ Ġthis . dataSource . connection . prepareStatement (" SELECT Ġchamp ion Id , Ġchamp ion Data ĠFROM Ġchamp ions ĠWHERE Ġversion Id Ġ= Ġ? "). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . setInt ( 1 , Ġversion Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . executeQuery (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( it . next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchamp ions [ it . getInt ( 1 )] Ġ= Ġit . getString ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġchamp ions ĊĠĠĠ Ġ} Ċ }