@@ -119,18 +119,18 @@ func (c *Conn) handshake() error {
119
119
var err error
120
120
if err = c .readInitialHandshake (); err != nil {
121
121
c .Close ()
122
- return errors .Trace (err )
122
+ return errors .Trace (fmt . Errorf ( "readInitialHandshake: %w" , err ) )
123
123
}
124
124
125
125
if err := c .writeAuthHandshake (); err != nil {
126
126
c .Close ()
127
127
128
- return errors .Trace (err )
128
+ return errors .Trace (fmt . Errorf ( "writeAuthHandshake: %w" , err ) )
129
129
}
130
130
131
131
if err := c .handleAuthResult (); err != nil {
132
132
c .Close ()
133
- return errors .Trace (err )
133
+ return errors .Trace (fmt . Errorf ( "handleAuthResult: %w" , err ) )
134
134
}
135
135
136
136
return nil
@@ -408,3 +408,129 @@ func (c *Conn) exec(query string) (*Result, error) {
408
408
409
409
return c .readResult (false )
410
410
}
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