From a693d42e31e8db1432efea1f86cc24d29f643915 Mon Sep 17 00:00:00 2001 From: tpetr Date: Wed, 2 Jan 2019 13:02:20 -0500 Subject: [PATCH 1/4] add support for defining additonal database connection string args via extra_connection_string_args --- pkg/services/sqlstore/sqlstore.go | 45 ++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/pkg/services/sqlstore/sqlstore.go b/pkg/services/sqlstore/sqlstore.go index d0e93177d8b..2db317556bc 100644 --- a/pkg/services/sqlstore/sqlstore.go +++ b/pkg/services/sqlstore/sqlstore.go @@ -221,6 +221,10 @@ func (ss *SqlStore) buildConnectionString() (string, error) { mysql.RegisterTLSConfig("custom", tlsCert) cnnstr += "&tls=custom" } + + if ss.dbCfg.ExtraConnectionStringArgs != "" { + cnnstr += "&" + ss.dbCfg.ExtraConnectionStringArgs + } case migrator.POSTGRES: var host, port = "127.0.0.1", "5432" fields := strings.Split(ss.dbCfg.Host, ":") @@ -237,6 +241,9 @@ func (ss *SqlStore) buildConnectionString() (string, error) { ss.dbCfg.User = "''" } cnnstr = fmt.Sprintf("user=%s password=%s host=%s port=%s dbname=%s sslmode=%s sslcert=%s sslkey=%s sslrootcert=%s", ss.dbCfg.User, ss.dbCfg.Pwd, host, port, ss.dbCfg.Name, ss.dbCfg.SslMode, ss.dbCfg.ClientCertPath, ss.dbCfg.ClientKeyPath, ss.dbCfg.CaCertPath) + if ss.dbCfg.ExtraConnectionStringArgs != "" { + cnnstr += " " + ss.dbCfg.ExtraConnectionStringArgs + } case migrator.SQLITE: // special case for tests if !filepath.IsAbs(ss.dbCfg.Path) { @@ -244,6 +251,9 @@ func (ss *SqlStore) buildConnectionString() (string, error) { } os.MkdirAll(path.Dir(ss.dbCfg.Path), os.ModePerm) cnnstr = fmt.Sprintf("file:%s?cache=%s&mode=rwc", ss.dbCfg.Path, ss.dbCfg.CacheMode) + if ss.dbCfg.ExtraConnectionStringArgs != "" { + cnnstr += "&" + ss.dbCfg.ExtraConnectionStringArgs + } default: return "", fmt.Errorf("Unknown database type: %s", ss.dbCfg.Type) } @@ -321,6 +331,8 @@ func (ss *SqlStore) readConfig() { ss.dbCfg.Path = sec.Key("path").MustString("data/grafana.db") ss.dbCfg.CacheMode = sec.Key("cache_mode").MustString("private") + + ss.dbCfg.ExtraConnectionStringArgs = sec.Key("extra_connection_string_args").String() } func InitTestDB(t *testing.T) *SqlStore { @@ -393,20 +405,21 @@ func IsTestDbPostgres() bool { } type DatabaseConfig struct { - Type string - Host string - Name string - User string - Pwd string - Path string - SslMode string - CaCertPath string - ClientKeyPath string - ClientCertPath string - ServerCertName string - ConnectionString string - MaxOpenConn int - MaxIdleConn int - ConnMaxLifetime int - CacheMode string + Type string + Host string + Name string + User string + Pwd string + Path string + SslMode string + CaCertPath string + ClientKeyPath string + ClientCertPath string + ServerCertName string + ConnectionString string + MaxOpenConn int + MaxIdleConn int + ConnMaxLifetime int + CacheMode string + ExtraConnectionStringArgs string } From 5bc8d5086498e60d4234b1fa21847dd340b7cb70 Mon Sep 17 00:00:00 2001 From: tpetr Date: Fri, 4 Jan 2019 23:52:36 -0500 Subject: [PATCH 2/4] pull connection string args from url instead --- pkg/services/sqlstore/sqlstore.go | 37 ++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/pkg/services/sqlstore/sqlstore.go b/pkg/services/sqlstore/sqlstore.go index 2db317556bc..b12277b48cc 100644 --- a/pkg/services/sqlstore/sqlstore.go +++ b/pkg/services/sqlstore/sqlstore.go @@ -195,6 +195,23 @@ func (ss *SqlStore) ensureAdminUser() error { return err } +func (ss *SqlStore) buildExtraConnectionString(sep rune) string { + if ss.dbCfg.UrlQueryParams == nil { + return "" + } + + var sb strings.Builder + for key, values := range ss.dbCfg.UrlQueryParams { + for _, value := range values { + sb.WriteRune(sep) + sb.WriteString(key) + sb.WriteRune('=') + sb.WriteString(value) + } + } + return sb.String() +} + func (ss *SqlStore) buildConnectionString() (string, error) { cnnstr := ss.dbCfg.ConnectionString @@ -222,9 +239,7 @@ func (ss *SqlStore) buildConnectionString() (string, error) { cnnstr += "&tls=custom" } - if ss.dbCfg.ExtraConnectionStringArgs != "" { - cnnstr += "&" + ss.dbCfg.ExtraConnectionStringArgs - } + cnnstr += ss.buildExtraConnectionString('&') case migrator.POSTGRES: var host, port = "127.0.0.1", "5432" fields := strings.Split(ss.dbCfg.Host, ":") @@ -241,19 +256,15 @@ func (ss *SqlStore) buildConnectionString() (string, error) { ss.dbCfg.User = "''" } cnnstr = fmt.Sprintf("user=%s password=%s host=%s port=%s dbname=%s sslmode=%s sslcert=%s sslkey=%s sslrootcert=%s", ss.dbCfg.User, ss.dbCfg.Pwd, host, port, ss.dbCfg.Name, ss.dbCfg.SslMode, ss.dbCfg.ClientCertPath, ss.dbCfg.ClientKeyPath, ss.dbCfg.CaCertPath) - if ss.dbCfg.ExtraConnectionStringArgs != "" { - cnnstr += " " + ss.dbCfg.ExtraConnectionStringArgs - } + + cnnstr += ss.buildExtraConnectionString(' ') case migrator.SQLITE: // special case for tests if !filepath.IsAbs(ss.dbCfg.Path) { ss.dbCfg.Path = filepath.Join(ss.Cfg.DataPath, ss.dbCfg.Path) } os.MkdirAll(path.Dir(ss.dbCfg.Path), os.ModePerm) - cnnstr = fmt.Sprintf("file:%s?cache=%s&mode=rwc", ss.dbCfg.Path, ss.dbCfg.CacheMode) - if ss.dbCfg.ExtraConnectionStringArgs != "" { - cnnstr += "&" + ss.dbCfg.ExtraConnectionStringArgs - } + cnnstr += ss.buildExtraConnectionString('&') default: return "", fmt.Errorf("Unknown database type: %s", ss.dbCfg.Type) } @@ -310,6 +321,8 @@ func (ss *SqlStore) readConfig() { ss.dbCfg.User = userInfo.Username() ss.dbCfg.Pwd, _ = userInfo.Password() } + + ss.dbCfg.UrlQueryParams = dbURL.Query() } else { ss.dbCfg.Type = sec.Key("type").String() ss.dbCfg.Host = sec.Key("host").String() @@ -331,8 +344,6 @@ func (ss *SqlStore) readConfig() { ss.dbCfg.Path = sec.Key("path").MustString("data/grafana.db") ss.dbCfg.CacheMode = sec.Key("cache_mode").MustString("private") - - ss.dbCfg.ExtraConnectionStringArgs = sec.Key("extra_connection_string_args").String() } func InitTestDB(t *testing.T) *SqlStore { @@ -421,5 +432,5 @@ type DatabaseConfig struct { MaxIdleConn int ConnMaxLifetime int CacheMode string - ExtraConnectionStringArgs string + UrlQueryParams map[string][]string } From 32dfc4e8b14b26988f51a6e4979d5e84455d2265 Mon Sep 17 00:00:00 2001 From: tpetr Date: Sat, 5 Jan 2019 00:02:15 -0500 Subject: [PATCH 3/4] forgot go fmt --- pkg/services/sqlstore/sqlstore.go | 34 +++++++++++++++---------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/pkg/services/sqlstore/sqlstore.go b/pkg/services/sqlstore/sqlstore.go index b12277b48cc..cd12075b479 100644 --- a/pkg/services/sqlstore/sqlstore.go +++ b/pkg/services/sqlstore/sqlstore.go @@ -416,21 +416,21 @@ func IsTestDbPostgres() bool { } type DatabaseConfig struct { - Type string - Host string - Name string - User string - Pwd string - Path string - SslMode string - CaCertPath string - ClientKeyPath string - ClientCertPath string - ServerCertName string - ConnectionString string - MaxOpenConn int - MaxIdleConn int - ConnMaxLifetime int - CacheMode string - UrlQueryParams map[string][]string + Type string + Host string + Name string + User string + Pwd string + Path string + SslMode string + CaCertPath string + ClientKeyPath string + ClientCertPath string + ServerCertName string + ConnectionString string + MaxOpenConn int + MaxIdleConn int + ConnMaxLifetime int + CacheMode string + UrlQueryParams map[string][]string } From db61fc1dd128dab94a82fcdb819d02885f494f2e Mon Sep 17 00:00:00 2001 From: tpetr Date: Sat, 5 Jan 2019 00:17:31 -0500 Subject: [PATCH 4/4] EqualFold() --- pkg/services/dashboards/dashboard_service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/services/dashboards/dashboard_service.go b/pkg/services/dashboards/dashboard_service.go index 6aa1276b093..59ceefa0be5 100644 --- a/pkg/services/dashboards/dashboard_service.go +++ b/pkg/services/dashboards/dashboard_service.go @@ -76,7 +76,7 @@ func (dr *dashboardServiceImpl) buildSaveDashboardCommand(dto *SaveDashboardDTO, return nil, models.ErrDashboardFolderCannotHaveParent } - if dash.IsFolder && strings.ToLower(dash.Title) == strings.ToLower(models.RootFolderName) { + if dash.IsFolder && strings.EqualFold(dash.Title, models.RootFolderName) { return nil, models.ErrDashboardFolderNameExists }