统一初始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.

87 lines
1.9 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 Reload(dir ...string) {
  40. var err error
  41. var configer *grconfig.Configer
  42. logger := grlogs.GetAli("sql")
  43. defer func() {
  44. if err != nil {
  45. logger.Critical(err.Error())
  46. }
  47. }()
  48. if len(dir) == 0 {
  49. configer = grconfig.New("conf/")
  50. } else {
  51. dir = append(dir, "conf/")
  52. configer = grconfig.New(path.Join(dir...))
  53. }
  54. dsns, err := GetDsn(configer)
  55. if err = LoadXorm(dsns); err != nil {
  56. logger.Critical(err.Error())
  57. }
  58. }
  59. func GetDsn(configer *grconfig.Configer) (DsnList map[string]dsnConfig, err error) {
  60. var items map[string]*DbItem
  61. DsnList = make(map[string]dsnConfig)
  62. err = configer.Item("db", &items)
  63. if err != nil {
  64. return
  65. }
  66. for alias, v := range items {
  67. dsn := v.Dsn()
  68. driver := v.Driver
  69. if driver == "" {
  70. driver = "mysql"
  71. }
  72. DsnList[alias] = dsnConfig{Dsn: dsn, Driver: driver, Item: v}
  73. }
  74. return
  75. }