/internal/models/model.go

https://github.com/ouqiang/gocron · Go · 143 lines · 117 code · 21 blank · 5 comment · 15 complexity · 462e82c221251706e1f97512d0ec5bd2 MD5 · raw file

  1. package models
  2. import (
  3. "fmt"
  4. "strings"
  5. "time"
  6. macaron "gopkg.in/macaron.v1"
  7. _ "github.com/go-sql-driver/mysql"
  8. "github.com/go-xorm/core"
  9. "github.com/go-xorm/xorm"
  10. _ "github.com/lib/pq"
  11. "github.com/ouqiang/gocron/internal/modules/app"
  12. "github.com/ouqiang/gocron/internal/modules/logger"
  13. "github.com/ouqiang/gocron/internal/modules/setting"
  14. )
  15. type Status int8
  16. type CommonMap map[string]interface{}
  17. var TablePrefix = ""
  18. var Db *xorm.Engine
  19. const (
  20. Disabled Status = 0 // 禁用
  21. Failure Status = 0 // 失败
  22. Enabled Status = 1 // 启用
  23. Running Status = 1 // 运行中
  24. Finish Status = 2 // 完成
  25. Cancel Status = 3 // 取消
  26. )
  27. const (
  28. Page = 1 // 当前页数
  29. PageSize = 20 // 每页多少条数据
  30. MaxPageSize = 1000 // 每次最多取多少条
  31. )
  32. const DefaultTimeFormat = "2006-01-02 15:04:05"
  33. const (
  34. dbPingInterval = 90 * time.Second
  35. dbMaxLiftTime = 2 * time.Hour
  36. )
  37. type BaseModel struct {
  38. Page int `xorm:"-"`
  39. PageSize int `xorm:"-"`
  40. }
  41. func (model *BaseModel) parsePageAndPageSize(params CommonMap) {
  42. page, ok := params["Page"]
  43. if ok {
  44. model.Page = page.(int)
  45. }
  46. pageSize, ok := params["PageSize"]
  47. if ok {
  48. model.PageSize = pageSize.(int)
  49. }
  50. if model.Page <= 0 {
  51. model.Page = Page
  52. }
  53. if model.PageSize <= 0 {
  54. model.PageSize = MaxPageSize
  55. }
  56. }
  57. func (model *BaseModel) pageLimitOffset() int {
  58. return (model.Page - 1) * model.PageSize
  59. }
  60. // 创建Db
  61. func CreateDb() *xorm.Engine {
  62. dsn := getDbEngineDSN(app.Setting)
  63. engine, err := xorm.NewEngine(app.Setting.Db.Engine, dsn)
  64. if err != nil {
  65. logger.Fatal("创建xorm引擎失败", err)
  66. }
  67. engine.SetMaxIdleConns(app.Setting.Db.MaxIdleConns)
  68. engine.SetMaxOpenConns(app.Setting.Db.MaxOpenConns)
  69. engine.SetConnMaxLifetime(dbMaxLiftTime)
  70. if app.Setting.Db.Prefix != "" {
  71. // 设置表前缀
  72. TablePrefix = app.Setting.Db.Prefix
  73. mapper := core.NewPrefixMapper(core.SnakeMapper{}, app.Setting.Db.Prefix)
  74. engine.SetTableMapper(mapper)
  75. }
  76. // 本地环境开启日志
  77. if macaron.Env == macaron.DEV {
  78. engine.ShowSQL(true)
  79. engine.Logger().SetLevel(core.LOG_DEBUG)
  80. }
  81. go keepDbAlived(engine)
  82. return engine
  83. }
  84. // 创建临时数据库连接
  85. func CreateTmpDb(setting *setting.Setting) (*xorm.Engine, error) {
  86. dsn := getDbEngineDSN(setting)
  87. return xorm.NewEngine(setting.Db.Engine, dsn)
  88. }
  89. // 获取数据库引擎DSN mysql,sqlite,postgres
  90. func getDbEngineDSN(setting *setting.Setting) string {
  91. engine := strings.ToLower(setting.Db.Engine)
  92. dsn := ""
  93. switch engine {
  94. case "mysql":
  95. dsn = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&allowNativePasswords=true",
  96. setting.Db.User,
  97. setting.Db.Password,
  98. setting.Db.Host,
  99. setting.Db.Port,
  100. setting.Db.Database,
  101. setting.Db.Charset)
  102. case "postgres":
  103. dsn = fmt.Sprintf("user=%s password=%s host=%s port=%d dbname=%s sslmode=disable",
  104. setting.Db.User,
  105. setting.Db.Password,
  106. setting.Db.Host,
  107. setting.Db.Port,
  108. setting.Db.Database)
  109. }
  110. return dsn
  111. }
  112. func keepDbAlived(engine *xorm.Engine) {
  113. t := time.Tick(dbPingInterval)
  114. var err error
  115. for {
  116. <-t
  117. err = engine.Ping()
  118. if err != nil {
  119. logger.Infof("database ping: %s", err)
  120. }
  121. }
  122. }