xorm.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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. package xorm
  5. import (
  6. "errors"
  7. "fmt"
  8. "os"
  9. "reflect"
  10. "runtime"
  11. "sync"
  12. "time"
  13. "github.com/xormplus/core"
  14. )
  15. const (
  16. Version string = "1.0.0"
  17. )
  18. // new a db manager according to the parameter. Currently support four
  19. // drivers
  20. func NewEngine(driverName string, dataSourceName string) (*Engine, error) {
  21. regDrvsNDialects()
  22. driver := core.QueryDriver(driverName)
  23. if driver == nil {
  24. return nil, errors.New(fmt.Sprintf("Unsupported driver name: %v", driverName))
  25. }
  26. uri, err := driver.Parse(driverName, dataSourceName)
  27. if err != nil {
  28. return nil, err
  29. }
  30. dialect := core.QueryDialect(uri.DbType)
  31. if dialect == nil {
  32. return nil, errors.New(fmt.Sprintf("Unsupported dialect type: %v", uri.DbType))
  33. }
  34. db, err := core.Open(driverName, dataSourceName)
  35. if err != nil {
  36. return nil, err
  37. }
  38. err = dialect.Init(db, uri, driverName, dataSourceName)
  39. if err != nil {
  40. return nil, err
  41. }
  42. sqlMap := SqlMap{}
  43. err = sqlMap.Init()
  44. engine := &Engine{
  45. db: db,
  46. dialect: dialect,
  47. Tables: make(map[reflect.Type]*core.Table),
  48. mutex: &sync.RWMutex{},
  49. TagIdentifier: "xorm",
  50. Logger: NewSimpleLogger(os.Stdout),
  51. TZLocation: time.Local,
  52. SqlMap: sqlMap,
  53. }
  54. if err != nil {
  55. engine.Logger.Warning(err)
  56. }
  57. engine.dialect.SetLogger(engine.Logger)
  58. engine.SetMapper(core.NewCacheMapper(new(core.SnakeMapper)))
  59. runtime.SetFinalizer(engine, close)
  60. return engine, nil
  61. }
  62. func regDrvsNDialects() bool {
  63. providedDrvsNDialects := map[string]struct {
  64. dbType core.DbType
  65. getDriver func() core.Driver
  66. getDialect func() core.Dialect
  67. }{
  68. "mssql": {"mssql", func() core.Driver { return &odbcDriver{} }, func() core.Dialect { return &mssql{} }},
  69. "odbc": {"mssql", func() core.Driver { return &odbcDriver{} }, func() core.Dialect { return &mssql{} }}, // !nashtsai! TODO change this when supporting MS Access
  70. "mysql": {"mysql", func() core.Driver { return &mysqlDriver{} }, func() core.Dialect { return &mysql{} }},
  71. "mymysql": {"mysql", func() core.Driver { return &mymysqlDriver{} }, func() core.Dialect { return &mysql{} }},
  72. "postgres": {"postgres", func() core.Driver { return &pqDriver{} }, func() core.Dialect { return &postgres{} }},
  73. "sqlite3": {"sqlite3", func() core.Driver { return &sqlite3Driver{} }, func() core.Dialect { return &sqlite3{} }},
  74. "oci8": {"oracle", func() core.Driver { return &oci8Driver{} }, func() core.Dialect { return &oracle{} }},
  75. "goracle": {"oracle", func() core.Driver { return &goracleDriver{} }, func() core.Dialect { return &oracle{} }},
  76. }
  77. for driverName, v := range providedDrvsNDialects {
  78. if driver := core.QueryDriver(driverName); driver == nil {
  79. core.RegisterDriver(driverName, v.getDriver())
  80. core.RegisterDialect(v.dbType, v.getDialect())
  81. }
  82. }
  83. return true
  84. }
  85. func close(engine *Engine) {
  86. engine.Close()
  87. }
  88. // clone an engine
  89. func (engine *Engine) Clone() (*Engine, error) {
  90. return NewEngine(engine.DriverName(), engine.DataSourceName())
  91. }