github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/go-xorm/xorm/xorm.go (about) 1 // Copyright 2015 The Xorm Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package xorm 6 7 import ( 8 "fmt" 9 "os" 10 "reflect" 11 "runtime" 12 "sync" 13 "time" 14 15 "github.com/insionng/yougam/libraries/go-xorm/core" 16 ) 17 18 const ( 19 // Version show the xorm's version 20 Version string = "0.6.0.1022" 21 ) 22 23 func regDrvsNDialects() bool { 24 providedDrvsNDialects := map[string]struct { 25 dbType core.DbType 26 getDriver func() core.Driver 27 getDialect func() core.Dialect 28 }{ 29 "mssql": {"mssql", func() core.Driver { return &odbcDriver{} }, func() core.Dialect { return &mssql{} }}, 30 "odbc": {"mssql", func() core.Driver { return &odbcDriver{} }, func() core.Dialect { return &mssql{} }}, // !nashtsai! TODO change this when supporting MS Access 31 "mysql": {"mysql", func() core.Driver { return &mysqlDriver{} }, func() core.Dialect { return &mysql{} }}, 32 "mymysql": {"mysql", func() core.Driver { return &mymysqlDriver{} }, func() core.Dialect { return &mysql{} }}, 33 "postgres": {"postgres", func() core.Driver { return &pqDriver{} }, func() core.Dialect { return &postgres{} }}, 34 "pgx": {"postgres", func() core.Driver { return &pqDriver{} }, func() core.Dialect { return &postgres{} }}, 35 "sqlite3": {"sqlite3", func() core.Driver { return &sqlite3Driver{} }, func() core.Dialect { return &sqlite3{} }}, 36 "oci8": {"oracle", func() core.Driver { return &oci8Driver{} }, func() core.Dialect { return &oracle{} }}, 37 "goracle": {"oracle", func() core.Driver { return &goracleDriver{} }, func() core.Dialect { return &oracle{} }}, 38 } 39 40 for driverName, v := range providedDrvsNDialects { 41 if driver := core.QueryDriver(driverName); driver == nil { 42 core.RegisterDriver(driverName, v.getDriver()) 43 core.RegisterDialect(v.dbType, v.getDialect) 44 } 45 } 46 return true 47 } 48 49 func close(engine *Engine) { 50 engine.Close() 51 } 52 53 // NewEngine new a db manager according to the parameter. Currently support four 54 // drivers 55 func NewEngine(driverName string, dataSourceName string) (*Engine, error) { 56 regDrvsNDialects() 57 driver := core.QueryDriver(driverName) 58 if driver == nil { 59 return nil, fmt.Errorf("Unsupported driver name: %v", driverName) 60 } 61 62 uri, err := driver.Parse(driverName, dataSourceName) 63 if err != nil { 64 return nil, err 65 } 66 67 dialect := core.QueryDialect(uri.DbType) 68 if dialect == nil { 69 return nil, fmt.Errorf("Unsupported dialect type: %v", uri.DbType) 70 } 71 72 db, err := core.Open(driverName, dataSourceName) 73 if err != nil { 74 return nil, err 75 } 76 77 err = dialect.Init(db, uri, driverName, dataSourceName) 78 if err != nil { 79 return nil, err 80 } 81 82 engine := &Engine{ 83 db: db, 84 dialect: dialect, 85 Tables: make(map[reflect.Type]*core.Table), 86 mutex: &sync.RWMutex{}, 87 TagIdentifier: "xorm", 88 TZLocation: time.Local, 89 } 90 91 logger := NewSimpleLogger(os.Stdout) 92 logger.SetLevel(core.LOG_INFO) 93 engine.SetLogger(logger) 94 engine.SetMapper(core.NewCacheMapper(new(core.SnakeMapper))) 95 96 runtime.SetFinalizer(engine, close) 97 98 return engine, nil 99 } 100 101 // Clone clone an engine 102 func (engine *Engine) Clone() (*Engine, error) { 103 return NewEngine(engine.DriverName(), engine.DataSourceName()) 104 }