package db import ( "fmt" _ "github.com/go-sql-driver/mysql" _ "github.com/lib/pq" "golib.gaore.com/GaoreGo/grconfig" "golib.gaore.com/GaoreGo/grlogs" "path" ) const DEFAULT = "default" var DbPrefix map[string]string = make(map[string]string) type dsnConfig struct { Dsn string Driver string Item *DbItem } type DbItem struct { User string `yaml:"user"` Pass string `yaml:"pass"` Host string `yaml:"host"` Port int `yaml:"port"` Name string `yaml:"name"` Driver string `yaml:"driver"` Prefix string `yaml:"prefix"` MaxIdleConns int `yaml:"max_idle_conns"` MaxOpenConns int `yaml:"max_open_conns"` ConnMaxLifetime int64 `yaml:"conn_max_lifetime"` Timeout int `yaml:"timeout"` } func (d *DbItem) Dsn() string { if d.Timeout <= 0 { d.Timeout = 5 } 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) } func init() { // Reload() 不再自动链接数据库了, 需要自己手动 } func ReloadByDefault() { Reload(nil) } func Reload(files []string, dir ...string) { var err error var configer *grconfig.Configer logger := grlogs.GetAli("sql") defer func() { if err != nil { logger.Critical(err.Error()) } }() if len(dir) == 0 { configer = grconfig.New("conf/") } else { dir = append(dir, "conf/") configer = grconfig.New(path.Join(dir...)) } dsns, err := GetDsn(configer, files...) if err = LoadXorm(dsns); err != nil { logger.Critical(err.Error()) } } func GetDsn(configer *grconfig.Configer, dbfiles ...string) (DsnList map[string]dsnConfig, err error) { var items map[string]*DbItem DsnList = make(map[string]dsnConfig) if nil == dbfiles || len(dbfiles) == 0 { dbfiles = []string{"db"} } for _, dbfile := range dbfiles { if dbfile == "" { continue } err = configer.Item(dbfile, &items) if err != nil { return } for alias, v := range items { dsn := v.Dsn() driver := v.Driver if driver == "" { driver = "mysql" } DsnList[alias] = dsnConfig{Dsn: dsn, Driver: driver, Item: v} } } return }