统一初始beego mvc 的方法
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
2.2 KiB

  1. package db
  2. import (
  3. "fmt"
  4. _ "github.com/go-sql-driver/mysql"
  5. _ "github.com/lib/pq"
  6. "golib.gaore.com/GaoreGo/grconfig"
  7. "golib.gaore.com/GaoreGo/grlogs"
  8. "path"
  9. )
  10. const DEFAULT = "default"
  11. var DbPrefix map[string]string = make(map[string]string)
  12. type dsnConfig struct {
  13. Dsn string
  14. Driver string
  15. Item *DbItem
  16. }
  17. type DbItem struct {
  18. User string `yaml:"user"`
  19. Pass string `yaml:"pass"`
  20. Host string `yaml:"host"`
  21. Port int `yaml:"port"`
  22. Name string `yaml:"name"`
  23. Driver string `yaml:"driver"`
  24. Prefix string `yaml:"prefix"`
  25. MaxIdleConns int `yaml:"max_idle_conns"`
  26. MaxOpenConns int `yaml:"max_open_conns"`
  27. ConnMaxLifetime int64 `yaml:"conn_max_lifetime"`
  28. Timeout int `yaml:"timeout"`
  29. }
  30. func (d *DbItem) Dsn() string {
  31. if d.Timeout <= 0 {
  32. d.Timeout = 5
  33. }
  34. return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&loc=Local&autocommit=true&timeout=%ds", d.User, d.Pass, d.Host, d.Port, d.Name, d.Timeout)
  35. }
  36. func init() {
  37. // Reload() 不再自动链接数据库了, 需要自己手动
  38. }
  39. func ReloadByDefault() {
  40. Reload(nil)
  41. }
  42. func Reload(files []string, dir ...string) {
  43. var err error
  44. var configer *grconfig.Configer
  45. logger := grlogs.GetAli("sql")
  46. defer func() {
  47. if err != nil {
  48. logger.Critical(err.Error())
  49. }
  50. }()
  51. if len(dir) == 0 {
  52. configer = grconfig.New("conf/")
  53. } else {
  54. dir = append(dir, "conf/")
  55. configer = grconfig.New(path.Join(dir...))
  56. }
  57. dsns, err := GetDsn(configer, files...)
  58. if err = LoadXorm(dsns); err != nil {
  59. logger.Critical(err.Error())
  60. }
  61. }
  62. func GetDsn(configer *grconfig.Configer, dbfiles ...string) (DsnList map[string]dsnConfig, err error) {
  63. var items map[string]*DbItem
  64. DsnList = make(map[string]dsnConfig)
  65. if nil == dbfiles || len(dbfiles) == 0 {
  66. dbfiles = []string{"db"}
  67. }
  68. for _, dbfile := range dbfiles {
  69. if dbfile == "" {
  70. continue
  71. }
  72. err = configer.Item(dbfile, &items)
  73. if err != nil {
  74. return
  75. }
  76. for alias, v := range items {
  77. dsn := v.Dsn()
  78. driver := v.Driver
  79. if driver == "" {
  80. driver = "mysql"
  81. }
  82. DsnList[alias] = dsnConfig{Dsn: dsn, Driver: driver, Item: v}
  83. }
  84. }
  85. return
  86. }