/* Ċ Ġ* ĠCopyright Ġ 2 0 1 3 ĠM aur ÃŃc io ĠLin ha res Ċ Ġ* Ċ Ġ* ĠM aur ÃŃc io ĠLin ha res Ġlicenses Ġthis Ġfile Ġto Ġyou Ġunder Ġthe ĠApache ĠLicense , Ċ Ġ* Ġversion Ġ 2 . 0 Ġ( the Ġ" License "); Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ċ Ġ* Ġwith Ġthe ĠLicense . ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat : Ċ Ġ* Ċ Ġ* ĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , ĠWITHOUT Ċ Ġ* ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . ĠSee Ġthe Ċ Ġ* ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ġlimitations Ċ Ġ* Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . github . ma ur icio . async . db . postgresql Ċ Ċ import Ġcom . github . el izar ov . async . async Ċ import Ġcom . github . el izar ov . async . suspend able Ċ import Ġcom . github . ma ur icio . async . db . QueryResult Ċ import Ġcom . github . ma ur icio . async . db . column . Column Decoder Registry Ċ import Ġcom . github . ma ur icio . async . db . column . Column Encoder Registry Ċ import Ġcom . github . ma ur icio . async . db . exceptions . Connection Still Running Query Exception Ċ import Ġcom . github . ma ur icio . async . db . exceptions . Ins ufficient Parameters Exception Ċ import Ġcom . github . ma ur icio . async . db . general . Mutable ResultSet Ċ import Ġcom . github . ma ur icio . async . db . postgresql . codec . PostgreSQL Connection Delegate Ċ import Ġcom . github . ma ur icio . async . db . postgresql . codec . PostgreSQL Connection Handler Ċ import Ġcom . github . ma ur icio . async . db . postgresql . column . PostgreSQL Column Decoder Registry Ċ import Ġcom . github . ma ur icio . async . db . postgresql . column . PostgreSQL Column Encoder Registry Ċ import Ġcom . github . ma ur icio . async . db . postgresql . exceptions .* Ċ import Ġcom . github . ma ur icio . async . db . util .* Ċ import Ġcom . github . ma ur icio . async . db . Configuration Ċ import Ġcom . github . ma ur icio . async . db . Connection Ċ import Ġcom . github . ma ur icio . async . db . pool . Timeout Scheduler Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ import Ġjava . util . concurrent . atomic . Atomic Long Ċ import Ġjava . util . concurrent . atomic . Atomic Reference Ċ Ċ import Ġcom . github . ma ur icio . async . db . postgresql . messages . backend .* Ċ import Ġcom . github . ma ur icio . async . db . postgresql . messages . frontend .* Ċ Ċ import Ġio . netty . channel . EventLoop Group Ċ import Ġjava . util . concurrent . Copy On Write ArrayList Ċ Ċ import Ġcom . github . ma ur icio . async . db . postgresql . util . URL Parser Ċ import Ġmu . K Logging Ċ import Ġjava . time . Duration Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġkotlin . coroutines . Continuation Ċ import Ġkotlin . coroutines . Continuation Dispatcher Ċ import Ġkotlin . coroutines . suspend Coroutine Ċ Ċ class ĠPostgreSQL Connection Ċ ( ĊĠĠĠĠĠĠĠ Ġval Ġconfiguration : ĠConfiguration Ġ= ĠURL Parser . DEFAULT , ĊĠĠĠĠĠĠĠ Ġval Ġencoder Registry : ĠColumn Encoder Registry Ġ= ĠPostgreSQL Column Encoder Registry . Instance , ĊĠĠĠĠĠĠĠ Ġval Ġdecoder Registry : ĠColumn Decoder Registry Ġ= ĠPostgreSQL Column Decoder Registry . Instance , ĊĠĠĠĠĠĠĠ Ġval Ġgroup : ĠEvent Loop Group Ġ= ĠNet ty Utils . Default EventLoop Group , ĊĠĠĠĠĠĠĠ Ġval Ġexecution Context : ĠContinu ation Dispatcher Ġ= ĠExecutor Service Utils . Cached ExecutionContext Ċ ) ĊĠĠĠ Ġ: ĠPostgreSQL Connection Delegate , ĊĠĠĠĠĠĠĠ ĠConnection , ĠTimeout Scheduler Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ: ĠK Logging () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠCounter Ġ= ĠAtomic Long () ĊĠĠĠĠĠĠĠ Ġval ĠServer Version Key Ġ= Ġ" server _ version " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġconnection Handler Ġ= ĠPostgreSQL Connection Handler ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencoder Registry , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdecoder Registry , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecution Context ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġcurrent Count Ġ= ĠCounter . increment AndGet () ĊĠĠĠ Ġprivate Ġval Ġprepared Statements Counter Ġ= ĠAtomicInteger () ĊĊĠĠĠ Ġprivate Ġval Ġparameter Status Ġ= Ġmutable Map Of < String , ĠString >() ĊĠĠĠ Ġprivate Ġval Ġparsed Statements Ġ= Ġmutable Map Of < String , ĠPreparedStatement Holder >() ĊĠĠĠ Ġprivate Ġvar Ġauthenticated Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar Ġconnection Future : ĠContinu ation < Connection >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġconnection Future Flag Ġ= ĠAtomic Boolean ( false ) ĊĊĠĠĠ Ġprivate Ġvar Ġrecent Error Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġval Ġquery Promise Reference Ġ= ĠAtomic Reference < Continuation < QueryResult >? >( null ) ĊĠĠĠ Ġprivate Ġvar Ġcurrent Query : ĠMutable ResultSet < PostgreSQL Column Data >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcurrent PreparedStatement : ĠPreparedStatement Holder ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġversion Ġ= ĠVersion ( 0 , Ġ 0 , Ġ 0 ) ĊĠĠĠ Ġprivate Ġvar Ġnotify Listeners Ġ= ĠCopy On Write ArrayList <( Notification Response ) Ġ-> ĠUnit >() ĊĊĠĠĠ Ġprivate Ġvar Ġquery Result : ĠQuery Result ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġevent Loop Group () Ġ= Ġgroup ĊĊĠĠĠ Ġoverride Ġfun Ġexecution Context () Ġ= Ġexecution Context ĊĊĠĠĠ Ġoverride Ġval Ġis Timeout ed Bool Ġ= ĠAtomic Boolean ( false ) ĊĊĠĠĠ Ġfun Ġis Ready For Query (): ĠBoolean Ġ= Ġthis . query Promise () Ġ== Ġnull ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġconnect () Ġ= Ġsuspend Coroutine < Connection > Ġ{ ĊĠĠĠĠĠĠĠ Ġcont Ġ-> ĊĠĠĠĠĠĠĠ Ġconnection Future Ġ= Ġcont ĊĠĠĠĠĠĠĠ Ġasync ( executionContext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . connection Handler . connect () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Future Flag . set ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume With Exception ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdisconnect () Ġ= Ġsuspend able ( executionContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection Handler . disconnect () ĊĠĠĠĠĠĠĠ Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Timeout () Ġ{ ĊĠĠĠĠĠĠĠ Ġasync ( executionContext ) Ġ{ Ġdisconnect () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġis Connected : ĠBoolean Ġget () Ġ= Ġthis . connection Handler . isConnected () ĊĊĠĠĠ Ġfun Ġparameter Statuses () Ġ= Ġthis . parameter Status . toMap () ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġsend Query ( query : ĠString ): ĠQuery Result Ġ{ ĊĠĠĠĠĠĠĠ Ġvalidate Query ( query ) ĊĠĠĠĠĠĠĠ Ġreturn Ġadd Timeout ( configuration . query Timeout ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcont Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Query Promise ( cont ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite ( Query Message ( query )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġsend PreparedStatement ( query : ĠString , Ġvalues : ĠList < Any ?> ): ĠQuery Result Ġ{ ĊĠĠĠĠĠĠĠ Ġvalidate Query ( query ) ĊĠĠĠĠĠĠĠ Ġreturn Ġadd Timeout ( configuration . query Timeout ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcont Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Query Promise ( cont ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġholder Ġ= Ġthis . parsed Statements . get Or Put ( query ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPreparedStatement Holder ( query , Ġprepared Statements Counter . increment AndGet ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( holder . params Count Ġ!= Ġvalues . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . clear Query Promise () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume With Exception ( Ins ufficient Parameters Exception ( holder . params Count , Ġvalues )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ add Timeout ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . current PreparedStatement Ġ= Ġholder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . current Query Ġ= ĠMutable ResultSet ( holder . column Datas ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( holder . prepared ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPreparedStatement Execute Message ( holder . statement Id , Ġholder . real Query , Ġvalues , Ġthis . encoder Registry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . prepared Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPreparedStatement Opening Message ( holder . statement Id , Ġholder . real Query , Ġvalues , Ġthis . encoder Registry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonError ( exception : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . setError On F utures ( exception ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Recent Error (): ĠBoolean Ġ= Ġthis . recent Error ĊĊĠĠĠ Ġfun ĠsetError On F utures ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . recent Error Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġlogger . error (" Error Ġon Ġconnection ", Ġe ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcf Ġ= Ġthis . connection Future ĊĠĠĠĠĠĠĠ Ġif Ġ( cf Ġ!= Ġnull Ġ&& Ġ! connection Future Flag . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Future Flag . set ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcf . resume With Exception ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// nothing , Ġalready Ġdone ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcps Ġ= Ġthis . current PreparedStatement ĊĠĠĠĠĠĠĠ Ġif Ġ( cps Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparsed Statements . remove ( cps . query ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfail Query Promise ( e ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Ready For Query () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! connection Future Flag . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Future Flag . set ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Future !!. resume ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . recent Error Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġqr Ġ= Ġquery Result ĊĠĠĠĠĠĠĠ Ġif Ġ( qr Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsucceed Query Promise ( qr ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonError ( message : ĠError Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . error (" Error Ġwith Ġmessage Ġ-> Ġ{}", Ġmessage ) ĊĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠGeneric Database Exception ( message ) ĊĠĠĠĠĠĠĠ Ġerror . fill In StackTrace () ĊĊĠĠĠĠĠĠĠ Ġthis . setError On F utures ( error ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Command Complete ( message : ĠCommand Complete Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . current PreparedStatement Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġquery Result Ġ= ĠQuery Result ( message . rows Affected . to Long (), Ġmessage . status Message , Ġthis . current Query ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Parameter Status ( message : ĠParameter StatusMessage ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . parameter Status . put ( message . key , Ġmessage . value ) ĊĠĠĠĠĠĠĠ Ġif Ġ( Server Version Key Ġ== Ġmessage . key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . version Ġ= ĠVersion ( message . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon DataRow ( message : ĠData Row Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitems Ġ= ĠArray < Any ? >( message . values . size , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= Ġmessage . values [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buf Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolumn Type Ġ= Ġcurrent Query !!. column Types [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecoder Registry . decode ( column Type , Ġbuf , Ġconfiguration . charset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . release () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġcurrent Query !!. add Row ( items ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Row Description ( message : ĠRow Description Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmessage . column Datas . toList () ĊĠĠĠĠĠĠĠ Ġthis . current Query Ġ= ĠMutable ResultSet ( list ) ĊĠĠĠĠĠĠĠ Ġthis . set Column Datas ( list ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Column Datas ( column Datas : ĠList < PostgreSQL Column Data >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . current PreparedStatement . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . column Datas Ġ= Ġcolumn Datas ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Authentication Response ( message : ĠAuthentication Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( message ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAuthentication Ok Message Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Successfully Ġlogged Ġin Ġto Ġdatabase ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthenticated Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAuthentication Challenge Cle art ext Message Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite ( this . credential ( message )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAuthentication Challenge MD 5 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite ( this . credential ( message )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Notification Response ( message : ĠNotification Response ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġthis . notify Listeners . iterator () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . next ()( message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġregister Notify Listener ( listener : Ġ( Notification Response ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . notify Listeners . add ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġunregister Notify Listener ( listener : Ġ( Notification Response ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . notify Listeners . remove ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Notify Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . notify Listeners . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcredential ( authentication Message : ĠAuthentication Challenge Message ): ĠCredential Message Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( configuration . password Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCredential Message ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration . username , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration . password !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthentication Message . challenge Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthentication Message . salt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠMissing Credential Information Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . configuration . username , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . configuration . password , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthentication Message . challenge Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnot Ready For Query Error ( errorMessage : ĠString , Ġrace : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . error ( errorMessage ) ĊĠĠĠĠĠĠĠ Ġthrow ĠConnection Still Running Query Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . current Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrace ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvalidate If It Is Ready For Query ( errorMessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( query Promise () Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot Ready For Query Error ( errorMessage , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Query ( query : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . validate If It Is Ready For Query (" Can 't Ġrun Ġquery Ġbecause Ġthere Ġis Ġone Ġquery Ġpending Ġalready ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( query . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠQuery Must Not BeNull OrEmpty Exception ( query ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġquery Promise (): ĠContinu ation < QueryResult >? Ġ= Ġquery Promise Reference . get () ĊĊĠĠĠ Ġprivate Ġfun Ġset Query Promise ( promise : ĠContinu ation < QueryResult >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! this . query Promise Reference . compare AndSet ( null , Ġpromise )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot Ready For Query Error (" Can 't Ġrun Ġquery Ġdue Ġto Ġa Ġrace Ġwith Ġanother Ġstarted Ġquery ", Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear Query Promise () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Promise Reference . get AndSet ( null ) ĊĊĠĠĠ Ġprivate Ġfun Ġfail Query Promise ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclear Query Promise (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Setting Ġerror Ġon Ġfuture Ġ$ t ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . resume With Exception ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsucceed Query Promise ( result : ĠQuery Result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . query Result Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġthis . current Query Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġclear Query Promise ()?. resume ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite ( message : ĠClient Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . connection Handler . write ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ this . java Class . getSimpleName () }{ counter =${ this . current Count }}" ĊĊĠĠĠ Ġ// 1 . 1 Ġerrors ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< A > Ġin Transaction ( dispatcher : ĠContinu ation Dispatcher ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf : Ġsuspend Ġ( conn : ĠConnection ) Ġ-> ĠA ) Ġ= Ġsuper . in Transaction ( dispatcher , Ġf ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< T > Ġadd Timeout ( duration : ĠDuration ?, Ġblock : Ġ( Continuation < T >) Ġ-> ĠUnit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġsuper . add Timeout ( duration , Ġblock ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< T > Ġadd Timeout ( duration Millis : ĠLong ?, Ġblock : Ġ( Continuation < T >) Ġ-> ĠUnit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġsuper . add Timeout ( duration Millis , Ġblock ) Ċ } Ċ