/ext/db/xorm/service.go

https://github.com/henrylee2cn/faygo · Go · 114 lines · 98 code · 12 blank · 4 comment · 40 complexity · 0380f790be58e71614f51dafd9e2d720 MD5 · raw file

  1. package xorm
  2. import (
  3. "os"
  4. "path/filepath"
  5. "strings"
  6. "xorm.io/core"
  7. "xorm.io/xorm"
  8. // _ "github.com/denisenkom/go-mssqldb" //mssql
  9. _ "github.com/go-sql-driver/mysql" //mysql
  10. _ "github.com/lib/pq" //postgres
  11. // _ "github.com/mattn/go-oci8" //oracle(need to install the pkg-config utility)
  12. // _ "github.com/mattn/go-sqlite3" //sqlite
  13. "github.com/henrylee2cn/faygo"
  14. )
  15. // DBService is a database engine object.
  16. type DBService struct {
  17. Default *xorm.Engine // the default database engine
  18. List map[string]*xorm.Engine // database engine list
  19. }
  20. var dbService = func() (serv *DBService) {
  21. serv = &DBService{
  22. List: map[string]*xorm.Engine{},
  23. }
  24. var errs []string
  25. defer func() {
  26. if len(errs) > 0 {
  27. panic("[xorm] " + strings.Join(errs, "\n"))
  28. }
  29. if serv.Default == nil {
  30. faygo.Panicf("[xorm] the `default` database engine must be configured and enabled")
  31. }
  32. }()
  33. err := loadDBConfig()
  34. if err != nil {
  35. faygo.Panicf("[xorm]", err.Error())
  36. return
  37. }
  38. for _, conf := range dbConfigs {
  39. if !conf.Enable {
  40. continue
  41. }
  42. engine, err := xorm.NewEngine(conf.Driver, conf.Connstring)
  43. if err != nil {
  44. faygo.Critical("[xorm]", err.Error())
  45. errs = append(errs, err.Error())
  46. continue
  47. }
  48. err = engine.Ping()
  49. if err != nil {
  50. faygo.Critical("[xorm]", err.Error())
  51. errs = append(errs, err.Error())
  52. continue
  53. }
  54. engine.SetLogger(iLogger)
  55. engine.SetMaxOpenConns(conf.MaxOpenConns)
  56. engine.SetMaxIdleConns(conf.MaxIdleConns)
  57. engine.SetDisableGlobalCache(conf.DisableCache)
  58. engine.ShowSQL(conf.ShowSql)
  59. engine.ShowExecTime(conf.ShowExecTime)
  60. if (conf.TableFix == "prefix" || conf.TableFix == "suffix") && len(conf.TableSpace) > 0 {
  61. var impr core.IMapper
  62. if conf.TableSnake {
  63. impr = core.SnakeMapper{}
  64. } else {
  65. impr = core.SameMapper{}
  66. }
  67. if conf.TableFix == "prefix" {
  68. engine.SetTableMapper(core.NewPrefixMapper(impr, conf.TableSpace))
  69. } else {
  70. engine.SetTableMapper(core.NewSuffixMapper(impr, conf.TableSpace))
  71. }
  72. }
  73. if (conf.ColumnFix == "prefix" || conf.ColumnFix == "suffix") && len(conf.ColumnSpace) > 0 {
  74. var impr core.IMapper
  75. if conf.ColumnSnake {
  76. impr = core.SnakeMapper{}
  77. } else {
  78. impr = core.SameMapper{}
  79. }
  80. if conf.ColumnFix == "prefix" {
  81. engine.SetTableMapper(core.NewPrefixMapper(impr, conf.ColumnSpace))
  82. } else {
  83. engine.SetTableMapper(core.NewSuffixMapper(impr, conf.ColumnSpace))
  84. }
  85. }
  86. if conf.Driver == "sqlite3" && !faygo.FileExists(conf.Connstring) {
  87. os.MkdirAll(filepath.Dir(conf.Connstring), 0777)
  88. f, err := os.Create(conf.Connstring)
  89. if err != nil {
  90. faygo.Critical("[xorm]", err.Error())
  91. errs = append(errs, err.Error())
  92. } else {
  93. f.Close()
  94. }
  95. }
  96. serv.List[conf.Name] = engine
  97. if DEFAULTDB_NAME == conf.Name {
  98. serv.Default = engine
  99. }
  100. }
  101. return
  102. }()