github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/internal/xsql/unwrap.go (about) 1 package xsql 2 3 import ( 4 "database/sql" 5 "fmt" 6 7 "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" 8 "github.com/ydb-platform/ydb-go-sdk/v3/internal/xsql/badconn" 9 ) 10 11 func Unwrap[T *sql.DB | *sql.Conn](v T) (connector *Connector, err error) { 12 switch vv := any(v).(type) { 13 case *sql.DB: 14 d := vv.Driver() 15 if dw, ok := d.(*driverWrapper); ok { 16 return dw.c, nil 17 } 18 19 return nil, xerrors.WithStackTrace(fmt.Errorf("%T is not a *driverWrapper", d)) 20 case *sql.Conn: 21 if err = vv.Raw(func(driverConn interface{}) error { 22 if cc, ok := driverConn.(*conn); ok { 23 connector = cc.connector 24 25 return nil 26 } 27 28 return xerrors.WithStackTrace(fmt.Errorf("%T is not a *conn", driverConn)) 29 }); err != nil { 30 return nil, badconn.Map(xerrors.WithStackTrace(err)) 31 } 32 33 return connector, nil 34 default: 35 return nil, xerrors.WithStackTrace(fmt.Errorf("unknown type %T for Unwrap", vv)) 36 } 37 }