diff --git a/g/frame/gins/gins.go b/g/frame/gins/gins.go index f2030224d..3047098e3 100644 --- a/g/frame/gins/gins.go +++ b/g/frame/gins/gins.go @@ -87,75 +87,34 @@ func Database(name ...string) gdb.DB { glog.Error(`database init failed: "database" node not found, is config file or configuration missing?`) return nil } - for group, v := range m { + // Parse as map-slice. + for group, groupConfig := range m { cg := gdb.ConfigGroup{} - if list, ok := v.([]interface{}); ok { - for _, nodeValue := range list { - node := gdb.ConfigNode{} - nodeMap := nodeValue.(map[string]interface{}) - if value, ok := nodeMap["host"]; ok { - node.Host = gconv.String(value) + switch value := groupConfig.(type) { + case []interface{}: + for _, v := range value { + if node := parseConfigNode(v); node != nil { + cg = append(cg, *node) } - if value, ok := nodeMap["port"]; ok { - node.Port = gconv.String(value) - } - if value, ok := nodeMap["user"]; ok { - node.User = gconv.String(value) - } - if value, ok := nodeMap["pass"]; ok { - node.Pass = gconv.String(value) - } - if value, ok := nodeMap["name"]; ok { - node.Name = gconv.String(value) - } - if value, ok := nodeMap["type"]; ok { - node.Type = gconv.String(value) - } - if value, ok := nodeMap["role"]; ok { - node.Role = gconv.String(value) - } - if value, ok := nodeMap["charset"]; ok { - node.Charset = gconv.String(value) - } - if value, ok := nodeMap["priority"]; ok { - node.Priority = gconv.Int(value) - } - // Deprecated - if value, ok := nodeMap["linkinfo"]; ok { - node.LinkInfo = gconv.String(value) - } - // Deprecated - if value, ok := nodeMap["link-info"]; ok { - node.LinkInfo = gconv.String(value) - } - if value, ok := nodeMap["linkInfo"]; ok { - node.LinkInfo = gconv.String(value) - } - // Deprecated - if value, ok := nodeMap["max-idle"]; ok { - node.MaxIdleConnCount = gconv.Int(value) - } - if value, ok := nodeMap["maxIdle"]; ok { - node.MaxIdleConnCount = gconv.Int(value) - } - // Deprecated - if value, ok := nodeMap["max-open"]; ok { - node.MaxOpenConnCount = gconv.Int(value) - } - if value, ok := nodeMap["maxOpen"]; ok { - node.MaxOpenConnCount = gconv.Int(value) - } - // Deprecated - if value, ok := nodeMap["max-lifetime"]; ok { - node.MaxConnLifetime = gconv.Int(value) - } - if value, ok := nodeMap["maxLifetime"]; ok { - node.MaxConnLifetime = gconv.Int(value) - } - cg = append(cg, node) + } + case map[string]interface{}: + if node := parseConfigNode(value); node != nil { + cg = append(cg, *node) } } - gdb.AddConfigGroup(group, cg) + if len(cg) > 0 { + gdb.AddConfigGroup(group, cg) + } + } + // Parse as a single node configuration. + if node := parseConfigNode(m); node != nil { + cg := gdb.ConfigGroup{} + if node.LinkInfo != "" || node.Host != "" { + cg = append(cg, *node) + } + if len(cg) > 0 { + gdb.AddConfigGroup(group, cg) + } } addConfigMonitor(key, config) } @@ -172,6 +131,81 @@ func Database(name ...string) gdb.DB { return nil } +// 解析数据库配置节点项 +func parseConfigNode(value interface{}) *gdb.ConfigNode { + nodeMap, ok := value.(map[string]interface{}) + if !ok { + return nil + } + node := &gdb.ConfigNode{} + if value, ok := nodeMap["host"]; ok { + node.Host = gconv.String(value) + } + if value, ok := nodeMap["port"]; ok { + node.Port = gconv.String(value) + } + if value, ok := nodeMap["user"]; ok { + node.User = gconv.String(value) + } + if value, ok := nodeMap["pass"]; ok { + node.Pass = gconv.String(value) + } + if value, ok := nodeMap["name"]; ok { + node.Name = gconv.String(value) + } + if value, ok := nodeMap["type"]; ok { + node.Type = gconv.String(value) + } + if value, ok := nodeMap["role"]; ok { + node.Role = gconv.String(value) + } + if value, ok := nodeMap["charset"]; ok { + node.Charset = gconv.String(value) + } + if value, ok := nodeMap["priority"]; ok { + node.Priority = gconv.Int(value) + } + if value, ok := nodeMap["linkinfo"]; ok { + node.LinkInfo = gconv.String(value) + } + if value, ok := nodeMap["link-info"]; ok { + node.LinkInfo = gconv.String(value) + } + if value, ok := nodeMap["linkInfo"]; ok { + node.LinkInfo = gconv.String(value) + } + if value, ok := nodeMap["link"]; ok { + node.LinkInfo = gconv.String(value) + } + if value, ok := nodeMap["max-idle"]; ok { + node.MaxIdleConnCount = gconv.Int(value) + } + if value, ok := nodeMap["maxIdle"]; ok { + node.MaxIdleConnCount = gconv.Int(value) + } + if value, ok := nodeMap["max-open"]; ok { + node.MaxOpenConnCount = gconv.Int(value) + } + if value, ok := nodeMap["maxOpen"]; ok { + node.MaxOpenConnCount = gconv.Int(value) + } + if value, ok := nodeMap["max-lifetime"]; ok { + node.MaxConnLifetime = gconv.Int(value) + } + if value, ok := nodeMap["maxLifetime"]; ok { + node.MaxConnLifetime = gconv.Int(value) + } + // Parse link syntax. + if node.LinkInfo != "" && node.Type == "" { + match, _ := gregex.MatchString(`([a-z]+):(.+)`, node.LinkInfo) + if len(match) == 3 { + node.Type = match[1] + node.LinkInfo = match[2] + } + } + return node +} + // Redis操作对象,使用了连接池 func Redis(name ...string) *gredis.Redis { config := Config() diff --git a/geg/database/gdb/mysql/config2.toml b/geg/database/gdb/mysql/config2.toml new file mode 100644 index 000000000..8722ede8c --- /dev/null +++ b/geg/database/gdb/mysql/config2.toml @@ -0,0 +1,4 @@ + +# MySQL数据库配置 +[database] + link = "mysql:root:8692651@tcp(192.168.1.11:3306)/test" diff --git a/geg/database/gdb/mysql/config3.toml b/geg/database/gdb/mysql/config3.toml new file mode 100644 index 000000000..ce3512864 --- /dev/null +++ b/geg/database/gdb/mysql/config3.toml @@ -0,0 +1,7 @@ + +# MySQL数据库配置 +[database] + [database.default] + link = "mysql:root:8692651@tcp(192.168.1.11:3306)/test" + [database.user] + link = "mysql:root:8692651@tcp(192.168.1.11:3306)/test" \ No newline at end of file diff --git a/geg/database/gdb/mysql/gdb_config.go b/geg/database/gdb/mysql/gdb_config.go index b27c0a318..5bab7abee 100644 --- a/geg/database/gdb/mysql/gdb_config.go +++ b/geg/database/gdb/mysql/gdb_config.go @@ -6,7 +6,6 @@ import ( ) func main() { - g.Config().AddPath("/home/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/frame") if r, err := g.DB().Table("user").Where("uid=?", 1).One(); err == nil { fmt.Println(r["uid"].Int()) fmt.Println(r["name"].String()) diff --git a/geg/database/gdb/mysql/gdb_config2.go b/geg/database/gdb/mysql/gdb_config2.go new file mode 100644 index 000000000..330d78108 --- /dev/null +++ b/geg/database/gdb/mysql/gdb_config2.go @@ -0,0 +1,16 @@ +package main + +import ( + "fmt" + "github.com/gogf/gf/g" +) + +func main() { + g.Config().SetFileName("config2.toml") + if r, err := g.DB().Table("user").Where("uid=?", 1).One(); err == nil { + fmt.Println(r["uid"].Int()) + fmt.Println(r["name"].String()) + } else { + fmt.Println(err) + } +} diff --git a/geg/database/gdb/mysql/gdb_config3.go b/geg/database/gdb/mysql/gdb_config3.go new file mode 100644 index 000000000..37608057d --- /dev/null +++ b/geg/database/gdb/mysql/gdb_config3.go @@ -0,0 +1,23 @@ +package main + +import ( + "fmt" + "github.com/gogf/gf/g" +) + +func main() { + g.Config().SetFileName("config3.toml") + if r, err := g.DB().Table("user").Where("uid=?", 1).One(); err == nil { + fmt.Println(r["uid"].Int()) + fmt.Println(r["name"].String()) + } else { + fmt.Println(err) + } + + if r, err := g.DB("user").Table("user").Where("uid=?", 1).One(); err == nil { + fmt.Println(r["uid"].Int()) + fmt.Println(r["name"].String()) + } else { + fmt.Println(err) + } +}