diff --git a/Makefile b/Makefile index 87ad9a16..77f0c72b 100644 --- a/Makefile +++ b/Makefile @@ -196,18 +196,33 @@ test-mysql\#%: go-check -conn_str="$(TEST_MYSQL_USERNAME):$(TEST_MYSQL_PASSWORD)@tcp($(TEST_MYSQL_HOST))/$(TEST_MYSQL_DBNAME)?charset=$(TEST_MYSQL_CHARSET)" \ -coverprofile=mysql.$(TEST_QUOTE_POLICY).$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic -.PNONY: test-oracle -test-oracle: go-check +.PHONY: test-oracle +test-oracle: test-godror + +.PNONY: test-oci8 +test-oci8: go-check $(GO) test -race -tags=oracle -db=oci8 -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ -conn_str="$(TEST_ORACLE_USERNAME):$(TEST_ORACLE_PASSWORD)@$(TEST_ORACLE_HOST)/$(TEST_ORACLE_DBNAME)" \ -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic -.PHONY: test-oracle\#% -test-oralce\#%: go-check +.PHONY: test-oci8\#% +test-oci8\#%: go-check $(GO) test -race -run $* -tags=oracle -db=oci8 -schema='$(TEST_PGSQL_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ -conn_str="postgres://$(TEST_PGSQL_USERNAME):$(TEST_PGSQL_PASSWORD)@$(TEST_PGSQL_HOST)/$(TEST_PGSQL_DBNAME)" \ -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic +.PHONY: test-godror +test-godror: go-check + $(GO) test -race -tags=oracle -db=godror -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ + -conn_str="oracle://$(TEST_ORACLE_USERNAME):$(TEST_ORACLE_PASSWORD)@$(TEST_ORACLE_HOST)/$(TEST_ORACLE_DBNAME)" \ + -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic + +.PHONY: test-godror\#% +test-godror\#%: go-check + $(GO) test -race -run $* -tags=oracle -db=godror -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ + -conn_str="oracle://$(TEST_ORACLE_USERNAME):$(TEST_ORACLE_PASSWORD)@$(TEST_ORACLE_HOST)/$(TEST_ORACLE_DBNAME)" \ + -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic + .PNONY: test-postgres test-postgres: go-check $(GO) test $(INTEGRATION_PACKAGES) -v -race -db=postgres -schema='$(TEST_PGSQL_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ diff --git a/dialects/oracle.go b/dialects/oracle.go index be08a9a6..6fed0b6a 100644 --- a/dialects/oracle.go +++ b/dialects/oracle.go @@ -9,7 +9,7 @@ import ( "database/sql" "errors" "fmt" - "regexp" + "net/url" "strconv" "strings" @@ -856,6 +856,7 @@ func (db *oracle) Filters() []Filter { } } +// https://github.com/godror/godror type godrorDriver struct { baseDriver } @@ -866,22 +867,31 @@ func (g *godrorDriver) Features() *DriverFeatures { } } -func (g *godrorDriver) Parse(driverName, dataSourceName string) (*URI, error) { - db := &URI{DBType: schemas.ORACLE} - dsnPattern := regexp.MustCompile( - `^(?:(?P.*?)(?::(?P.*))?@)?` + // [user[:password]@] - `(?:(?P[^\(]*)(?:\((?P[^\)]*)\))?)?` + // [net[(addr)]] - `\/(?P.*?)` + // /dbname - `(?:\?(?P[^\?]*))?$`) // [?param1=value1¶mN=valueN] - matches := dsnPattern.FindStringSubmatch(dataSourceName) - // tlsConfigRegister := make(map[string]*tls.Config) - names := dsnPattern.SubexpNames() - - for i, match := range matches { - if names[i] == "dbname" { - db.DBName = match - } +func parseOracle(driverName, dataSourceName string) (*URI, error) { + var connStr = dataSourceName + if !strings.HasPrefix(connStr, "oracle://") { + connStr = fmt.Sprintf("oracle://%s", connStr) } + + u, err := url.Parse(connStr) + if err != nil { + return nil, err + } + + db := &URI{ + DBType: schemas.ORACLE, + Host: u.Hostname(), + Port: u.Port(), + DBName: strings.TrimLeft(u.RequestURI(), "/"), + } + + if u.User != nil { + db.User = u.User.Username() + db.Passwd, _ = u.User.Password() + } + + fmt.Printf("%#v\n", db) + if db.DBName == "" { return nil, errors.New("dbname is empty") } @@ -908,27 +918,12 @@ func (g *godrorDriver) GenScanResult(colType string) (interface{}, error) { } } -type oci8Driver struct { - godrorDriver +func (g *godrorDriver) Parse(driverName, dataSourceName string) (*URI, error) { + return parseOracle(driverName, dataSourceName) } // dataSourceName=user/password@ipv4:port/dbname // dataSourceName=user/password@[ipv6]:port/dbname -func (o *oci8Driver) Parse(driverName, dataSourceName string) (*URI, error) { - db := &URI{DBType: schemas.ORACLE} - dsnPattern := regexp.MustCompile( - `^(?P.*)\/(?P.*)@` + // user:password@ - `(?P.*)` + // ip:port - `\/(?P.*)`) // dbname - matches := dsnPattern.FindStringSubmatch(dataSourceName) - names := dsnPattern.SubexpNames() - for i, match := range matches { - if names[i] == "dbname" { - db.DBName = match - } - } - if db.DBName == "" && len(matches) != 0 { - return nil, errors.New("dbname is empty") - } - return db, nil +type oci8Driver struct { + godrorDriver } diff --git a/go.sum b/go.sum index e117870a..1b13ef82 100644 --- a/go.sum +++ b/go.sum @@ -278,9 +278,7 @@ github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtb github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= diff --git a/integrations/engine_test.go b/integrations/engine_test.go index 74e1f903..06ab4988 100644 --- a/integrations/engine_test.go +++ b/integrations/engine_test.go @@ -17,12 +17,14 @@ import ( _ "gitee.com/travelliu/dm" _ "github.com/denisenkom/go-mssqldb" _ "github.com/go-sql-driver/mysql" + _ "github.com/godror/godror" _ "github.com/jackc/pgx/v4/stdlib" _ "github.com/lib/pq" _ "github.com/mattn/go-sqlite3" - "github.com/stretchr/testify/assert" _ "github.com/ziutek/mymysql/godrv" _ "modernc.org/sqlite" + + "github.com/stretchr/testify/assert" ) func TestPing(t *testing.T) {