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  }