diff --git a/database/gdb/gdb.go b/database/gdb/gdb.go index b60f1f2b6..9705e3316 100644 --- a/database/gdb/gdb.go +++ b/database/gdb/gdb.go @@ -373,9 +373,8 @@ var ( // tableFieldsMap caches the table information retrieved from database. tableFieldsMap = gmap.NewStrAnyMap(true) - // [username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN] - linkPatternWithType = `(\w+):([\w\-]+):(.+?)@(.+?)\((.+?):(\d+)\)/{0,1}([\w\-]*)\?{0,1}(.*)` - linkPatternWithoutType = `([\w\-]+):(.+?)@(.+?)\((.+?):(\d+)\)/{0,1}([\w\-]*)\?{0,1}(.*)` + // type:[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN] + linkPattern = `(\w+):([\w\-]*):(.*?)@(\w+?)\((.+?)\)/{0,1}([\w\-]*)\?{0,1}(.*)` ) func init() { diff --git a/database/gdb/gdb_driver_wrapper_db.go b/database/gdb/gdb_driver_wrapper_db.go index 7a58ec88b..3cbac5662 100644 --- a/database/gdb/gdb_driver_wrapper_db.go +++ b/database/gdb/gdb_driver_wrapper_db.go @@ -86,31 +86,22 @@ func (d *DriverWrapperDB) TableFields(ctx context.Context, table string, schema func parseConfigNodeLink(node *ConfigNode) *ConfigNode { var match []string - // It firstly parses `link` using with type pattern. - match, _ = gregex.MatchString(linkPatternWithType, node.Link) - if len(match) > 6 { - node.Type = match[1] - node.User = match[2] - node.Pass = match[3] - node.Protocol = match[4] - node.Host = match[5] - node.Port = match[6] - node.Name = match[7] - if len(match) > 7 { - node.Extra = match[8] - } - node.Link = "" - } else { - // Else it parses `link` using without type pattern. - match, _ = gregex.MatchString(linkPatternWithoutType, node.Link) - if len(match) > 6 { - node.User = match[1] - node.Pass = match[2] - node.Protocol = match[3] - node.Host = match[4] - node.Port = match[5] - node.Name = match[6] - if len(match) > 7 { + if node.Link != "" { + match, _ = gregex.MatchString(linkPattern, node.Link) + if len(match) > 5 { + node.Type = match[1] + node.User = match[2] + node.Pass = match[3] + node.Protocol = match[4] + array := gstr.Split(match[5], ":") + if len(array) == 2 { + node.Host = array[0] + node.Port = array[1] + node.Name = match[6] + } else { + node.Name = match[5] + } + if len(match) > 6 { node.Extra = match[7] } node.Link = "" diff --git a/database/gdb/gdb_z_mysql_internal_test.go b/database/gdb/gdb_z_mysql_internal_test.go index 0cef9bd4c..b8e2a0575 100644 --- a/database/gdb/gdb_z_mysql_internal_test.go +++ b/database/gdb/gdb_z_mysql_internal_test.go @@ -141,125 +141,50 @@ func Test_parseConfigNodeLink_WithType(t *testing.T) { t.Assert(newNode.Charset, defaultCharset) t.Assert(newNode.Protocol, `udp`) }) -} - -func Test_parseConfigNodeLink_WithoutType(t *testing.T) { gtest.C(t, func(t *gtest.T) { node := &ConfigNode{ - Link: `root:CxzhD*624:27jh@tcp(9.135.69.119:3306)/khaos_oss?loc=Local&parseTime=true&charset=latin`, + Link: `sqlite:root:CxzhD*624:27jh@file(/var/data/db.sqlite3)?local=Local&parseTime=true`, } newNode := parseConfigNodeLink(node) - t.Assert(newNode.Type, ``) + t.Assert(newNode.Type, `sqlite`) t.Assert(newNode.User, `root`) t.Assert(newNode.Pass, `CxzhD*624:27jh`) - t.Assert(newNode.Host, `9.135.69.119`) - t.Assert(newNode.Port, `3306`) - t.Assert(newNode.Name, `khaos_oss`) - t.Assert(newNode.Extra, `loc=Local&parseTime=true&charset=latin`) - t.Assert(newNode.Charset, `latin`) - t.Assert(newNode.Protocol, `tcp`) + t.Assert(newNode.Host, ``) + t.Assert(newNode.Port, ``) + t.Assert(newNode.Name, `/var/data/db.sqlite3`) + t.Assert(newNode.Extra, `local=Local&parseTime=true`) + t.Assert(newNode.Charset, defaultCharset) + t.Assert(newNode.Protocol, `file`) }) gtest.C(t, func(t *gtest.T) { node := &ConfigNode{ - Link: `root:CxzhD*624:27jh@tcp(9.135.69.119:3306)/khaos_oss?`, + Link: `sqlite::CxzhD*624:2@7jh@file(/var/data/db.sqlite3)`, } newNode := parseConfigNodeLink(node) - t.Assert(newNode.Type, ``) - t.Assert(newNode.User, `root`) - t.Assert(newNode.Pass, `CxzhD*624:27jh`) - t.Assert(newNode.Host, `9.135.69.119`) - t.Assert(newNode.Port, `3306`) - t.Assert(newNode.Name, `khaos_oss`) + t.Assert(newNode.Type, `sqlite`) + t.Assert(newNode.User, ``) + t.Assert(newNode.Pass, `CxzhD*624:2@7jh`) + t.Assert(newNode.Host, ``) + t.Assert(newNode.Port, ``) + t.Assert(newNode.Name, `/var/data/db.sqlite3`) t.Assert(newNode.Extra, ``) t.Assert(newNode.Charset, defaultCharset) - t.Assert(newNode.Protocol, `tcp`) + t.Assert(newNode.Protocol, `file`) }) gtest.C(t, func(t *gtest.T) { node := &ConfigNode{ - Link: `root:CxzhD*624:27jh@tcp(9.135.69.119:3306)/khaos_oss`, + Link: `sqlite::@file(/var/data/db.sqlite3)`, } newNode := parseConfigNodeLink(node) - t.Assert(newNode.Type, ``) - t.Assert(newNode.User, `root`) - t.Assert(newNode.Pass, `CxzhD*624:27jh`) - t.Assert(newNode.Host, `9.135.69.119`) - t.Assert(newNode.Port, `3306`) - t.Assert(newNode.Name, `khaos_oss`) + t.Assert(newNode.Type, `sqlite`) + t.Assert(newNode.User, ``) + t.Assert(newNode.Pass, ``) + t.Assert(newNode.Host, ``) + t.Assert(newNode.Port, ``) + t.Assert(newNode.Name, `/var/data/db.sqlite3`) t.Assert(newNode.Extra, ``) t.Assert(newNode.Charset, defaultCharset) - t.Assert(newNode.Protocol, `tcp`) - }) - // empty database preselect. - gtest.C(t, func(t *gtest.T) { - node := &ConfigNode{ - Link: `root:CxzhD*624:27jh@tcp(9.135.69.119:3306)/?loc=Local&parseTime=true&charset=latin`, - } - newNode := parseConfigNodeLink(node) - t.Assert(newNode.User, `root`) - t.Assert(newNode.Pass, `CxzhD*624:27jh`) - t.Assert(newNode.Host, `9.135.69.119`) - t.Assert(newNode.Port, `3306`) - t.Assert(newNode.Name, ``) - t.Assert(newNode.Extra, `loc=Local&parseTime=true&charset=latin`) - t.Assert(newNode.Charset, `latin`) - t.Assert(newNode.Protocol, `tcp`) - }) - gtest.C(t, func(t *gtest.T) { - node := &ConfigNode{ - Link: `root:CxzhD*624:27jh@tcp(9.135.69.119:3306)?loc=Local&parseTime=true&charset=latin`, - } - newNode := parseConfigNodeLink(node) - t.Assert(newNode.User, `root`) - t.Assert(newNode.Pass, `CxzhD*624:27jh`) - t.Assert(newNode.Host, `9.135.69.119`) - t.Assert(newNode.Port, `3306`) - t.Assert(newNode.Name, ``) - t.Assert(newNode.Extra, `loc=Local&parseTime=true&charset=latin`) - t.Assert(newNode.Charset, `latin`) - t.Assert(newNode.Protocol, `tcp`) - }) - gtest.C(t, func(t *gtest.T) { - node := &ConfigNode{ - Link: `root:CxzhD*624:27jh@tcp(9.135.69.119:3306)/`, - } - newNode := parseConfigNodeLink(node) - t.Assert(newNode.User, `root`) - t.Assert(newNode.Pass, `CxzhD*624:27jh`) - t.Assert(newNode.Host, `9.135.69.119`) - t.Assert(newNode.Port, `3306`) - t.Assert(newNode.Name, ``) - t.Assert(newNode.Extra, ``) - t.Assert(newNode.Charset, defaultCharset) - t.Assert(newNode.Protocol, `tcp`) - }) - gtest.C(t, func(t *gtest.T) { - node := &ConfigNode{ - Link: `root:CxzhD*624:27jh@tcp(9.135.69.119:3306)`, - } - newNode := parseConfigNodeLink(node) - t.Assert(newNode.User, `root`) - t.Assert(newNode.Pass, `CxzhD*624:27jh`) - t.Assert(newNode.Host, `9.135.69.119`) - t.Assert(newNode.Port, `3306`) - t.Assert(newNode.Name, ``) - t.Assert(newNode.Extra, ``) - t.Assert(newNode.Charset, defaultCharset) - t.Assert(newNode.Protocol, `tcp`) - }) - // protocol. - gtest.C(t, func(t *gtest.T) { - node := &ConfigNode{ - Link: `root:CxzhD*624:27jh@udp(9.135.69.119:3306)`, - } - newNode := parseConfigNodeLink(node) - t.Assert(newNode.User, `root`) - t.Assert(newNode.Pass, `CxzhD*624:27jh`) - t.Assert(newNode.Host, `9.135.69.119`) - t.Assert(newNode.Port, `3306`) - t.Assert(newNode.Name, ``) - t.Assert(newNode.Extra, ``) - t.Assert(newNode.Charset, defaultCharset) - t.Assert(newNode.Protocol, `udp`) + t.Assert(newNode.Protocol, `file`) }) } diff --git a/version.go b/version.go index 0c9540a38..6c10583e5 100644 --- a/version.go +++ b/version.go @@ -1,4 +1,4 @@ package gf -const VERSION = "v2.2.0" +const VERSION = "v2.2.0-beta" const AUTHORS = "john"