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 }