Parcourir la source

Merge pull request #14709 from tpetr/extra-connection-string-args

add support for defining additonal database connection string args
Marcus Efraimsson il y a 7 ans
Parent
commit
a067862a0a
1 fichiers modifiés avec 25 ajouts et 1 suppressions
  1. 25 1
      pkg/services/sqlstore/sqlstore.go

+ 25 - 1
pkg/services/sqlstore/sqlstore.go

@@ -196,6 +196,23 @@ func (ss *SqlStore) ensureAdminUser() error {
 	return err
 	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) {
 func (ss *SqlStore) buildConnectionString() (string, error) {
 	cnnstr := ss.dbCfg.ConnectionString
 	cnnstr := ss.dbCfg.ConnectionString
 
 
@@ -222,6 +239,8 @@ func (ss *SqlStore) buildConnectionString() (string, error) {
 			mysql.RegisterTLSConfig("custom", tlsCert)
 			mysql.RegisterTLSConfig("custom", tlsCert)
 			cnnstr += "&tls=custom"
 			cnnstr += "&tls=custom"
 		}
 		}
+
+		cnnstr += ss.buildExtraConnectionString('&')
 	case migrator.POSTGRES:
 	case migrator.POSTGRES:
 		host, port, err := util.SplitIpPort(ss.dbCfg.Host, "5432")
 		host, port, err := util.SplitIpPort(ss.dbCfg.Host, "5432")
 		if err != nil {
 		if err != nil {
@@ -234,13 +253,15 @@ func (ss *SqlStore) buildConnectionString() (string, error) {
 			ss.dbCfg.User = "''"
 			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)
 		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)
+
+		cnnstr += ss.buildExtraConnectionString(' ')
 	case migrator.SQLITE:
 	case migrator.SQLITE:
 		// special case for tests
 		// special case for tests
 		if !filepath.IsAbs(ss.dbCfg.Path) {
 		if !filepath.IsAbs(ss.dbCfg.Path) {
 			ss.dbCfg.Path = filepath.Join(ss.Cfg.DataPath, ss.dbCfg.Path)
 			ss.dbCfg.Path = filepath.Join(ss.Cfg.DataPath, ss.dbCfg.Path)
 		}
 		}
 		os.MkdirAll(path.Dir(ss.dbCfg.Path), os.ModePerm)
 		os.MkdirAll(path.Dir(ss.dbCfg.Path), os.ModePerm)
-		cnnstr = fmt.Sprintf("file:%s?cache=%s&mode=rwc", ss.dbCfg.Path, ss.dbCfg.CacheMode)
+		cnnstr += ss.buildExtraConnectionString('&')
 	default:
 	default:
 		return "", fmt.Errorf("Unknown database type: %s", ss.dbCfg.Type)
 		return "", fmt.Errorf("Unknown database type: %s", ss.dbCfg.Type)
 	}
 	}
@@ -297,6 +318,8 @@ func (ss *SqlStore) readConfig() {
 			ss.dbCfg.User = userInfo.Username()
 			ss.dbCfg.User = userInfo.Username()
 			ss.dbCfg.Pwd, _ = userInfo.Password()
 			ss.dbCfg.Pwd, _ = userInfo.Password()
 		}
 		}
+
+		ss.dbCfg.UrlQueryParams = dbURL.Query()
 	} else {
 	} else {
 		ss.dbCfg.Type = sec.Key("type").String()
 		ss.dbCfg.Type = sec.Key("type").String()
 		ss.dbCfg.Host = sec.Key("host").String()
 		ss.dbCfg.Host = sec.Key("host").String()
@@ -406,4 +429,5 @@ type DatabaseConfig struct {
 	MaxIdleConn      int
 	MaxIdleConn      int
 	ConnMaxLifetime  int
 	ConnMaxLifetime  int
 	CacheMode        string
 	CacheMode        string
+	UrlQueryParams   map[string][]string
 }
 }