fixed cases Drivers and Dialects are not registered, where sql driver is loaded after xorm.init(), using explicit call to register Drivers and Dialects upon xorm.NewEngine() call
This commit is contained in:
parent
145358a74e
commit
895d976804
56
xorm.go
56
xorm.go
|
@ -4,41 +4,52 @@ import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/go-xorm/core"
|
||||||
"os"
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
"runtime"
|
"runtime"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/go-xorm/core"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
Version string = "0.4"
|
Version string = "0.4"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
// !nashtsai! implicit register drivers and dialects is no good, as init() can be called before sql driver got registered
|
||||||
|
// func init() {
|
||||||
|
// regDrvsNDialects()
|
||||||
|
// }
|
||||||
|
|
||||||
providedDrvsNDialects := map[string]struct {
|
func regDrvsNDialects() bool {
|
||||||
dbType core.DbType
|
if core.RegisteredDriverSize() == 0 {
|
||||||
getDriver func() core.Driver
|
providedDrvsNDialects := map[string]struct {
|
||||||
getDialect func() core.Dialect
|
dbType core.DbType
|
||||||
}{
|
getDriver func() core.Driver
|
||||||
"odbc": {"mssql", func() core.Driver { return &odbcDriver{} }, func() core.Dialect { return &mssql{} }}, // !nashtsai! TODO change this when supporting MS Access
|
getDialect func() core.Dialect
|
||||||
"mysql": {"mysql", func() core.Driver { return &mysqlDriver{} }, func() core.Dialect { return &mysql{} }},
|
}{
|
||||||
"mymysql": {"mysql", func() core.Driver { return &mymysqlDriver{} }, func() core.Dialect { return &mysql{} }},
|
"odbc": {"mssql", func() core.Driver { return &odbcDriver{} }, func() core.Dialect { return &mssql{} }}, // !nashtsai! TODO change this when supporting MS Access
|
||||||
"postgres": {"postgres", func() core.Driver { return &pqDriver{} }, func() core.Dialect { return &postgres{} }},
|
"mysql": {"mysql", func() core.Driver { return &mysqlDriver{} }, func() core.Dialect { return &mysql{} }},
|
||||||
"sqlite3": {"sqlite3", func() core.Driver { return &sqlite3Driver{} }, func() core.Dialect { return &sqlite3{} }},
|
"mymysql": {"mysql", func() core.Driver { return &mymysqlDriver{} }, func() core.Dialect { return &mysql{} }},
|
||||||
"oci8": {"oracle", func() core.Driver { return &oci8Driver{} }, func() core.Dialect { return &oracle{} }},
|
"postgres": {"postgres", func() core.Driver { return &pqDriver{} }, func() core.Dialect { return &postgres{} }},
|
||||||
"goracle": {"oracle", func() core.Driver { return &goracleDriver{} }, func() core.Dialect { return &oracle{} }},
|
"sqlite3": {"sqlite3", func() core.Driver { return &sqlite3Driver{} }, func() core.Dialect { return &sqlite3{} }},
|
||||||
}
|
"oci8": {"oracle", func() core.Driver { return &oci8Driver{} }, func() core.Dialect { return &oracle{} }},
|
||||||
|
"goracle": {"oracle", func() core.Driver { return &goracleDriver{} }, func() core.Dialect { return &oracle{} }},
|
||||||
for driverName, v := range providedDrvsNDialects {
|
|
||||||
_, err := sql.Open(driverName, "")
|
|
||||||
if err == nil {
|
|
||||||
core.RegisterDriver(driverName, v.getDriver())
|
|
||||||
core.RegisterDialect(v.dbType, v.getDialect())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for driverName, v := range providedDrvsNDialects {
|
||||||
|
_, err := sql.Open(driverName, "")
|
||||||
|
if err == nil {
|
||||||
|
// fmt.Printf("driver succeed: %v\n", driverName)
|
||||||
|
core.RegisterDriver(driverName, v.getDriver())
|
||||||
|
core.RegisterDialect(v.dbType, v.getDialect())
|
||||||
|
} else {
|
||||||
|
// fmt.Printf("driver failed: %v | err: %v\n", driverName, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,6 +60,7 @@ func close(engine *Engine) {
|
||||||
// new a db manager according to the parameter. Currently support four
|
// new a db manager according to the parameter. Currently support four
|
||||||
// drivers
|
// drivers
|
||||||
func NewEngine(driverName string, dataSourceName string) (*Engine, error) {
|
func NewEngine(driverName string, dataSourceName string) (*Engine, error) {
|
||||||
|
regDrvsNDialects()
|
||||||
driver := core.QueryDriver(driverName)
|
driver := core.QueryDriver(driverName)
|
||||||
if driver == nil {
|
if driver == nil {
|
||||||
return nil, errors.New(fmt.Sprintf("Unsupported driver name: %v", driverName))
|
return nil, errors.New(fmt.Sprintf("Unsupported driver name: %v", driverName))
|
||||||
|
|
Loading…
Reference in New Issue