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:
Nash Tsai 2014-04-16 01:25:01 +08:00
parent 145358a74e
commit 895d976804
1 changed files with 34 additions and 22 deletions

56
xorm.go
View File

@ -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))