@@ -119,18 +119,18 @@ func (c *Conn) handshake() error {
119119var err error
120120if err = c .readInitialHandshake (); err != nil {
121121c .Close ()
122- return errors .Trace (err )
122+ return errors .Trace (fmt . Errorf ( "readInitialHandshake: %w" , err ) )
123123}
124124
125125if err := c .writeAuthHandshake (); err != nil {
126126c .Close ()
127127
128- return errors .Trace (err )
128+ return errors .Trace (fmt . Errorf ( "writeAuthHandshake: %w" , err ) )
129129}
130130
131131if err := c .handleAuthResult (); err != nil {
132132c .Close ()
133- return errors .Trace (err )
133+ return errors .Trace (fmt . Errorf ( "handleAuthResult: %w" , err ) )
134134}
135135
136136return nil
@@ -408,3 +408,129 @@ func (c *Conn) exec(query string) (*Result, error) {
408408
409409return c .readResult (false )
410410}
411+
412+ func (c * Conn ) CapabilityString () string {
413+ var caps []string
414+ capability := c .capability
415+ for i := 0 ; capability != 0 ; i ++ {
416+ field := uint32 (1 << i )
417+ if capability & field == 0 {
418+ continue
419+ }
420+ capability ^= field
421+
422+ switch field {
423+ case CLIENT_LONG_PASSWORD :
424+ caps = append (caps , "CLIENT_LONG_PASSWORD" )
425+ case CLIENT_FOUND_ROWS :
426+ caps = append (caps , "CLIENT_FOUND_ROWS" )
427+ case CLIENT_LONG_FLAG :
428+ caps = append (caps , "CLIENT_LONG_FLAG" )
429+ case CLIENT_CONNECT_WITH_DB :
430+ caps = append (caps , "CLIENT_CONNECT_WITH_DB" )
431+ case CLIENT_NO_SCHEMA :
432+ caps = append (caps , "CLIENT_NO_SCHEMA" )
433+ case CLIENT_COMPRESS :
434+ caps = append (caps , "CLIENT_COMPRESS" )
435+ case CLIENT_ODBC :
436+ caps = append (caps , "CLIENT_ODBC" )
437+ case CLIENT_LOCAL_FILES :
438+ caps = append (caps , "CLIENT_LOCAL_FILES" )
439+ case CLIENT_IGNORE_SPACE :
440+ caps = append (caps , "CLIENT_IGNORE_SPACE" )
441+ case CLIENT_PROTOCOL_41 :
442+ caps = append (caps , "CLIENT_PROTOCOL_41" )
443+ case CLIENT_INTERACTIVE :
444+ caps = append (caps , "CLIENT_INTERACTIVE" )
445+ case CLIENT_SSL :
446+ caps = append (caps , "CLIENT_SSL" )
447+ case CLIENT_IGNORE_SIGPIPE :
448+ caps = append (caps , "CLIENT_IGNORE_SIGPIPE" )
449+ case CLIENT_TRANSACTIONS :
450+ caps = append (caps , "CLIENT_TRANSACTIONS" )
451+ case CLIENT_RESERVED :
452+ caps = append (caps , "CLIENT_RESERVED" )
453+ case CLIENT_SECURE_CONNECTION :
454+ caps = append (caps , "CLIENT_SECURE_CONNECTION" )
455+ case CLIENT_MULTI_STATEMENTS :
456+ caps = append (caps , "CLIENT_MULTI_STATEMENTS" )
457+ case CLIENT_MULTI_RESULTS :
458+ caps = append (caps , "CLIENT_MULTI_RESULTS" )
459+ case CLIENT_PS_MULTI_RESULTS :
460+ caps = append (caps , "CLIENT_PS_MULTI_RESULTS" )
461+ case CLIENT_PLUGIN_AUTH :
462+ caps = append (caps , "CLIENT_PLUGIN_AUTH" )
463+ case CLIENT_CONNECT_ATTRS :
464+ caps = append (caps , "CLIENT_CONNECT_ATTRS" )
465+ case CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA :
466+ caps = append (caps , "CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA" )
467+ case CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS :
468+ caps = append (caps , "CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS" )
469+ case CLIENT_SESSION_TRACK :
470+ caps = append (caps , "CLIENT_SESSION_TRACK" )
471+ case CLIENT_DEPRECATE_EOF :
472+ caps = append (caps , "CLIENT_DEPRECATE_EOF" )
473+ case CLIENT_OPTIONAL_RESULTSET_METADATA :
474+ caps = append (caps , "CLIENT_OPTIONAL_RESULTSET_METADATA" )
475+ case CLIENT_ZSTD_COMPRESSION_ALGORITHM :
476+ caps = append (caps , "CLIENT_ZSTD_COMPRESSION_ALGORITHM" )
477+ case CLIENT_QUERY_ATTRIBUTES :
478+ caps = append (caps , "CLIENT_QUERY_ATTRIBUTES" )
479+ case MULTI_FACTOR_AUTHENTICATION :
480+ caps = append (caps , "MULTI_FACTOR_AUTHENTICATION" )
481+ case CLIENT_CAPABILITY_EXTENSION :
482+ caps = append (caps , "CLIENT_CAPABILITY_EXTENSION" )
483+ case CLIENT_SSL_VERIFY_SERVER_CERT :
484+ caps = append (caps , "CLIENT_SSL_VERIFY_SERVER_CERT" )
485+ case CLIENT_REMEMBER_OPTIONS :
486+ caps = append (caps , "CLIENT_REMEMBER_OPTIONS" )
487+ default :
488+ caps = append (caps , fmt .Sprintf ("(%d)" , field ))
489+ }
490+ }
491+
492+ return strings .Join (caps , "|" )
493+ }
494+
495+ func (c * Conn ) StatusString () string {
496+ var stats []string
497+ status := c .status
498+ for i := 0 ; status != 0 ; i ++ {
499+ field := uint16 (1 << i )
500+ if status & field == 0 {
501+ continue
502+ }
503+ status ^= field
504+
505+ switch field {
506+ case SERVER_STATUS_IN_TRANS :
507+ stats = append (stats , "SERVER_STATUS_IN_TRANS" )
508+ case SERVER_STATUS_AUTOCOMMIT :
509+ stats = append (stats , "SERVER_STATUS_AUTOCOMMIT" )
510+ case SERVER_MORE_RESULTS_EXISTS :
511+ stats = append (stats , "SERVER_MORE_RESULTS_EXISTS" )
512+ case SERVER_STATUS_NO_GOOD_INDEX_USED :
513+ stats = append (stats , "SERVER_STATUS_NO_GOOD_INDEX_USED" )
514+ case SERVER_STATUS_NO_INDEX_USED :
515+ stats = append (stats , "SERVER_STATUS_NO_INDEX_USED" )
516+ case SERVER_STATUS_CURSOR_EXISTS :
517+ stats = append (stats , "SERVER_STATUS_CURSOR_EXISTS" )
518+ case SERVER_STATUS_LAST_ROW_SEND :
519+ stats = append (stats , "SERVER_STATUS_LAST_ROW_SEND" )
520+ case SERVER_STATUS_DB_DROPPED :
521+ stats = append (stats , "SERVER_STATUS_DB_DROPPED" )
522+ case SERVER_STATUS_NO_BACKSLASH_ESCAPED :
523+ stats = append (stats , "SERVER_STATUS_NO_BACKSLASH_ESCAPED" )
524+ case SERVER_STATUS_METADATA_CHANGED :
525+ stats = append (stats , "SERVER_STATUS_METADATA_CHANGED" )
526+ case SERVER_QUERY_WAS_SLOW :
527+ stats = append (stats , "SERVER_QUERY_WAS_SLOW" )
528+ case SERVER_PS_OUT_PARAMS :
529+ stats = append (stats , "SERVER_PS_OUT_PARAMS" )
530+ default :
531+ stats = append (stats , fmt .Sprintf ("(%d)" , field ))
532+ }
533+ }
534+
535+ return strings .Join (stats , "|" )
536+ }
0 commit comments