package Ġcom . github . j async . sql . db . postgresql . codec Ċ Ċ import Ġcom . github . j async . sql . db . Configuration Ċ import Ġcom . github . j async . sql . db . SSL Configuration Ċ import Ġcom . github . j async . sql . db . column . Column Decoder Registry Ċ import Ġcom . github . j async . sql . db . column . Column Encoder Registry Ċ import Ġcom . github . j async . sql . db . postgresql . exceptions . Query Must Not BeNull OrEmpty Exception Ċ import Ġcom . github . j async . sql . db . postgresql . messages . backend . Authentication Message Ċ import Ġcom . github . j async . sql . db . postgresql . messages . backend . Command Complete Message Ċ import Ġcom . github . j async . sql . db . postgresql . messages . backend . DataRow Message Ċ import Ġcom . github . j async . sql . db . postgresql . messages . backend . ErrorMessage Ċ import Ġcom . github . j async . sql . db . postgresql . messages . backend . Notification Response Ċ import Ġcom . github . j async . sql . db . postgresql . messages . backend . Parameter StatusMessage Ċ import Ġcom . github . j async . sql . db . postgresql . messages . backend . Process Data Ċ import Ġcom . github . j async . sql . db . postgresql . messages . backend . Row Description Message Ċ import Ġcom . github . j async . sql . db . postgresql . messages . backend . SSL Response Message Ċ import Ġcom . github . j async . sql . db . postgresql . messages . backend . Server Message Ċ import Ġcom . github . j async . sql . db . postgresql . messages . frontend . Client Message Ċ import Ġcom . github . j async . sql . db . postgresql . messages . frontend . Close Message Ċ import Ġcom . github . j async . sql . db . postgresql . messages . frontend . SSL Request Message Ċ import Ġcom . github . j async . sql . db . postgresql . messages . frontend . Startup Message Ċ import Ġcom . github . j async . sql . db . util . ExecutorService Utils Ċ import Ġcom . github . j async . sql . db . util . Try Ċ import Ġcom . github . j async . sql . db . util . onComplete Ċ import Ġcom . github . j async . sql . db . util . on Failure Ċ import Ġcom . github . j async . sql . db . util . success Ċ import Ġcom . github . j async . sql . db . util . to Comp letableFuture Ċ import Ġcom . github . j async . sql . db . util . try Failure Ċ import Ġio . netty . bootstrap . Bootstrap Ċ import Ġio . netty . channel . Channel Ċ import Ġio . netty . channel . Channel HandlerContext Ċ import Ġio . netty . channel . Channel Initializer Ċ import Ġio . netty . channel . Channel Option Ċ import Ġio . netty . channel . EventLoop Group Ċ import Ġio . netty . channel . Simple Channel Inbound Handler Ċ import Ġio . netty . channel . socket . nio . Nio SocketChannel Ċ import Ġio . netty . handler . codec . Codec Exception Ċ import Ġio . netty . handler . ssl . Ssl Context Builder Ċ import Ġio . netty . handler . ssl . Ssl Handler Ċ import Ġio . netty . handler . ssl . util . In secure Trust ManagerFactory Ċ import Ġmu . Kotlin Logging Ċ import Ġjava . io . FileInputStream Ċ import Ġjava . net . Inet SocketAddress Ċ import Ġjava . security . KeyStore Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ import Ġjava . util . concurrent . Executor Ċ import Ġjavax . net . ssl . Trust ManagerFactory Ċ Ċ private Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} Ċ Ċ class ĠPostgreSQL Connection Handler ( ĊĠĠĠ Ġval Ġconfiguration : ĠConfiguration , ĊĠĠĠ Ġval Ġencoder Registry : ĠColumn Encoder Registry , ĊĠĠĠ Ġval Ġdecoder Registry : ĠColumn Decoder Registry , ĊĠĠĠ Ġval Ġconnection Delegate : ĠPostgreSQL Connection Delegate , ĊĠĠĠ Ġval Ġgroup : ĠEvent Loop Group , ĊĠĠĠ Ġval Ġexecution Context : ĠExecutor Ġ= ĠExecutor Service Utils . Common Pool Ċ ) Ġ: ĠSimple Channel Inbound Handler < Any >() Ġ{ ĊĊĠ Ġprivate Ġval Ġproperties Ġ= ĠlistOf ( ĊĠĠĠĠĠ Ġ" user " Ġto Ġconfiguration . username , ĊĠĠĠĠĠ Ġ" database " Ġto Ġconfiguration . database , ĊĠĠĠĠĠ Ġ" client _ encoding " Ġto Ġconfiguration . charset . name (), ĊĠĠĠĠĠ Ġ" Date Style " Ġto Ġ" ISO ", ĊĠĠĠĠĠ Ġ" extra _ float _ digits " Ġto Ġ" 2 " ĊĠ Ġ) ĊĊĠ Ġ// Ġ Ġprivate Ġval Ġexecution Context : ĠExecutor Ġ= ĠExecutor Service Utils . Common Pool ĊĠ Ġprivate Ġval Ġbootstrap Ġ= ĠBootstrap () ĊĠ Ġprivate Ġval Ġconnection Future Ġ= ĠCompletableFuture < PostgreSQL Connection Handler >() ĊĠ Ġprivate Ġval Ġdis connection Promise Ġ= ĠCompletableFuture < PostgreSQL Connection Handler >() ĊĠ Ġprivate Ġvar Ġprocess Data : ĠProcess Data ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġcurrent Context : ĠChannel HandlerContext ? Ġ= Ġnull ĊĊĠ Ġfun Ġconnect (): ĠCompletableFuture < PostgreSQL Connection Handler > Ġ{ ĊĠĠĠ Ġthis . bootstrap . group ( this . group ) ĊĠĠĠ Ġthis . bootstrap . channel ( Nio SocketChannel :: class . java ) ĊĠĠĠ Ġthis . bootstrap . handler ( object Ġ: ĠChannel Initializer < Channel >() Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġinit Channel ( ch : ĠChannel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġch . pipeline (). add Last ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Decoder ( configuration . ssl . mode Ġ!= ĠSSL Configuration . Mode . Disable , Ġconfiguration . charset , Ġconfiguration . maximum Message Size ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Encoder ( configuration . charset , Ġencoder Registry ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ PostgreSQL Connection Handler ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĠĠĠ Ġthis . bootstrap . option < Boolean >( Channel Option . SO _ KEEP AL IVE , Ġtrue ) ĊĠĠĠ Ġthis . bootstrap . option ( Channel Option . ALLOC ATOR , Ġconfiguration . allocator ) ĊĠĠĠ Ġthis . bootstrap . connect ( Inet SocketAddress ( configuration . host , Ġconfiguration . port )). on Failure ( executionContext ) Ġ{ Ġe Ġ-> ĊĠĠĠĠĠ Ġconnection Future . try Failure ( e ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis . connection Future ĊĠ Ġ} ĊĊĊĠ Ġfun Ġdisconnect (): ĠCompletableFuture < PostgreSQL Connection Handler > Ġ{ ĊĠĠĠ Ġif Ġ( isConnected ()) Ġ{ ĊĠĠĠĠĠ Ġthis . current Context !!. channel (). write And Flush ( Close Message ). to Comp letableFuture (). onComplete ( executionContext ) Ġ{ Ġty 1 Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ( ty 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġis ĠTry . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġty 1 . get (). channel (). close (). to Comp letableFuture (). onComplete ( executionContext ) Ġ{ Ġty 2 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( ty 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTry . Success Ġ-> Ġthis . dis connection Promise . success ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTry . Failure Ġ-> Ġthis . dis connection Promise . try Failure ( ty 2 . exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġis ĠTry . Failure Ġ-> Ġthis . dis connection Promise . try Failure ( ty 1 . exception ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġthis . dis connection Promise ĊĠ Ġ} ĊĊĠ Ġfun Ġis Connected (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġthis . current Context ?. channel ()?. isActive Ġ?: Ġfalse ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġchannel Active ( ctx : ĠChannel HandlerContext ): ĠUnit Ġ{ ĊĠĠĠ Ġif Ġ( configuration . ssl . mode Ġ== ĠSSL Configuration . Mode . Disable ) ĊĠĠĠĠĠ Ġctx . write And Flush ( Startup Message ( this . properties )) ĊĠĠĠ Ġelse ĊĠĠĠĠĠ Ġctx . write And Flush ( SSL Request Message ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġchannel Read 0 ( ctx : ĠChannel HandlerContext ?, Ġmessage : ĠAny ) Ġ{ ĊĠĠĠ Ġwhen Ġ( message ) Ġ{ ĊĠĠĠĠĠ ĠSSL Response Message ( true ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġctx Builder Ġ= ĠS sl Context Builder . for Client () ĊĠĠĠĠĠĠĠ Ġif Ġ( configuration . ssl . mode Ġ>= ĠSSL Configuration . Mode . Verify CA ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( configuration . ssl . root Cert Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt mf Ġ= ĠTrust ManagerFactory . getInstance ( Trust ManagerFactory . getDefault Algorithm ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġks Ġ= ĠKey Store . getInstance ( KeyStore . getDefault Type ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc ac erts Ġ= ĠFileInputStream ( System . getProperty (" java . home ") Ġ+ Ġ"/ lib / security / cac erts ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc ac erts . use Ġ{ Ġks . load ( it , Ġ" change it ". toCharArray ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt mf . init ( ks ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx Builder . trust Manager ( tm f ) ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx Builder . trust Manager ( configuration . ssl . root Cert ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġctx Builder . trust Manager ( In secure Trust ManagerFactory . INSTANCE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġssl Context Ġ= Ġctx Builder . build () ĊĠĠĠĠĠĠĠ Ġval Ġssl Engine Ġ= Ġssl Context . new Engine ( ctx !!. alloc (), Ġconfiguration . host , Ġconfiguration . port ) ĊĠĠĠĠĠĠĠ Ġif Ġ( configuration . ssl . mode Ġ>= ĠSSL Configuration . Mode . Verify Full ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġssl Params Ġ= Ġssl Engine . ssl Parameters ĊĠĠĠĠĠĠĠĠĠ Ġssl Params . endpoint Identification Algorithm Ġ= Ġ" HTTPS " ĊĠĠĠĠĠĠĠĠĠ Ġssl Engine . ssl Parameters Ġ= Ġssl Params ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠS sl Handler ( ssl Engine ) ĊĠĠĠĠĠĠĠ Ġctx . pipeline (). add First ( handler ) ĊĠĠĠĠĠĠĠ Ġhandler . handshake Future (). addListener Ġ{ Ġfuture Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( future . is Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . write And Flush ( Startup Message ( properties )) ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Delegate . onError ( future . cause ()) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ ĠSSL Response Message ( false ) Ġ-> Ġif Ġ( configuration . ssl . mode Ġ< ĠSSL Configuration . Mode . Require ) Ġ{ ĊĠĠĠĠĠĠĠ Ġctx !!. write And Flush ( Startup Message ( properties )) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection Delegate . onError ( IllegalArgumentException (" SSL Ġis Ġnot Ġsupported Ġon Ġserver ")) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġis ĠServer Message Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( message . kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠServer Message . Backend Key Data Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . process Data Ġ= Ġmessage Ġas ĠProcess Data ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠServer Message . Bind Complete Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠServer Message . Authentication Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Authentication Ġresponse Ġreceived Ġ$ message ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Delegate . on Authentication Response ( message Ġas ĠAuthentication Message ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠServer Message . Command Complete Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Delegate . on Command Complete ( message Ġas ĠCommand Complete Message ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠServer Message . Close Complete Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠServer Message . DataRow Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Delegate . on DataRow ( message Ġas ĠData Row Message ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠServer Message . Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Delegate . onError ( message Ġas ĠError Message ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠServer Message . Empty QueryString Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠQuery Must Not BeNull OrEmpty Exception ("") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception . fill In StackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Delegate . onError ( exception ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠServer Message . No Data Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠServer Message . Notice Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Received Ġnotice Ġ$ message ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠServer Message . Notification Response Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Delegate . on Notification Response ( message Ġas ĠNotification Response ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠServer Message . Parameter Status Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Delegate . on Parameter Status ( message Ġas ĠParameter StatusMessage ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠServer Message . Parse Complete Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠServer Message . Ready For Query Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Delegate . on Ready For Query () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠServer Message . Row Description Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Delegate . on Row Description ( message Ġas ĠRow Description Message ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠIllegalStateException (" Handler Ġnot Ġimplemented Ġfor Ġmessage Ġ% s ". format ( message . kind )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception . fill In StackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Delegate . onError ( exception ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . error (" Unknown Ġmessage Ġtype Ġ- Ġ$ message ") ĊĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠIllegalArgumentException (" Unknown Ġmessage Ġtype Ġ- Ġ% s ". format ( message )) ĊĠĠĠĠĠĠĠ Ġexception . fill In StackTrace () ĊĠĠĠĠĠĠĠ Ġconnection Delegate . onError ( exception ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġexception Ca ught ( ctx : ĠChannel HandlerContext , Ġcause : ĠThrowable ) Ġ{ ĊĠĠĠ Ġ// Ġunwrap ĠCodec Exception Ġif Ġneeded ĊĠĠĠ Ġwhen Ġ( cause ) Ġ{ ĊĠĠĠĠĠ Ġis ĠCodec Exception Ġ-> Ġconnection Delegate . onError ( cause . cause !! ) ĊĠĠĠĠĠ Ġelse Ġ-> Ġconnection Delegate . onError ( cause ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġchannel Inactive ( ctx : ĠChannel HandlerContext ): ĠUnit Ġ{ ĊĠĠĠ Ġlogger . info (" Connection Ġdisconnected Ġ- Ġ{}", Ġctx . channel (). remote Address ()) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġhandler Added ( ctx : ĠChannel HandlerContext ) Ġ{ ĊĠĠĠ Ġthis . current Context Ġ= Ġctx ĊĠ Ġ} ĊĊĠ Ġfun Ġwrite ( message : ĠClient Message ) Ġ{ ĊĠĠĠ Ġthis . current Context !!. write And Flush ( message ). on Failure ( executionContext ) Ġ{ Ġe : ĠThrowable Ġ-> ĊĠĠĠĠĠ Ġconnection Delegate . onError ( e ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ Ċ } Ċ