xorm.go 3.0 KB

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