github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/sqx/db.go (about)

     1  package sqx
     2  
     3  import (
     4  	"database/sql"
     5  	"net/url"
     6  	"strings"
     7  )
     8  
     9  func open(driverName, dataSourceName string) (*sql.DB, error) {
    10  	driverName = DetectDriverName(driverName, dataSourceName)
    11  	dataSourceName = tryUrlEncodePass(driverName, dataSourceName)
    12  	db, err := sql.Open(driverName, dataSourceName)
    13  	if err != nil {
    14  		return db, err
    15  	}
    16  
    17  	RegisterDriverName(db.Driver(), driverName)
    18  	return db, nil
    19  }
    20  
    21  func tryUrlEncodePass(driverName string, dataSourceName string) string {
    22  	switch driverName {
    23  	case "pgx", "dm":
    24  		s := dataSourceName
    25  		p1 := strings.Index(s, "://")
    26  		p2 := 0
    27  		p3 := 0
    28  		if p1 > 0 {
    29  			s = s[p1+3:]
    30  			p2 = strings.Index(s, ":")
    31  		}
    32  		if p2 > 0 {
    33  			s = s[p2+1:]
    34  			p3 = strings.LastIndex(s, "@")
    35  		}
    36  		if p3 > 0 {
    37  			pp0 := s[:p3]
    38  			if pp1 := url.QueryEscape(pp0); pp0 != pp1 {
    39  				dataSourceName = strings.Replace(dataSourceName, ":"+pp0+"@", ":"+pp1+"@", 1)
    40  			}
    41  		}
    42  	}
    43  
    44  	return dataSourceName
    45  }
    46  
    47  func Open(driverName, dataSourceName string) (*sql.DB, *Sqx, error) {
    48  	db, err := open(driverName, dataSourceName)
    49  	if err != nil {
    50  		return nil, nil, err
    51  	}
    52  
    53  	return db, NewSqx(db), nil
    54  }