]> source.dussan.org Git - gitea.git/commitdiff
Fix incorrect pgsql conn builder behavior (#28085)
authorwxiaoguang <wxiaoguang@gmail.com>
Fri, 17 Nov 2023 02:30:57 +0000 (10:30 +0800)
committerGitHub <noreply@github.com>
Fri, 17 Nov 2023 02:30:57 +0000 (02:30 +0000)
Fix #28083 and fix the tests

modules/setting/database.go
modules/setting/database_test.go

index aa42f506bc51b83606c7031457a8e82f19d98abe..761e767e8f5f74b77b1b2b0b4141672bbcaaa7f0 100644 (file)
@@ -109,7 +109,7 @@ func DBConnStr() (string, error) {
                connStr = fmt.Sprintf("%s:%s@%s(%s)/%s%scharset=%s&parseTime=true&tls=%s",
                        Database.User, Database.Passwd, connType, Database.Host, Database.Name, paramSep, Database.MysqlCharset, tls)
        case "postgres":
-               connStr = getPostgreSQLConnectionString(Database.Host, Database.User, Database.Passwd, Database.Name, paramSep, Database.SSLMode)
+               connStr = getPostgreSQLConnectionString(Database.Host, Database.User, Database.Passwd, Database.Name, Database.SSLMode)
        case "mssql":
                host, port := ParseMSSQLHostPort(Database.Host)
                connStr = fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;", host, port, Database.Name, Database.User, Database.Passwd)
@@ -157,7 +157,8 @@ func parsePostgreSQLHostPort(info string) (host, port string) {
        return host, port
 }
 
-func getPostgreSQLConnectionString(dbHost, dbUser, dbPasswd, dbName, dbParam, dbsslMode string) (connStr string) {
+func getPostgreSQLConnectionString(dbHost, dbUser, dbPasswd, dbName, dbsslMode string) (connStr string) {
+       dbName, dbParam, _ := strings.Cut(dbName, "?")
        host, port := parsePostgreSQLHostPort(dbHost)
        connURL := url.URL{
                Scheme:   "postgres",
index 85271c36cb38803b132e3e3caac8ad26ffa7d359..1d5b416504b18f7a4e0ced8d56b12d42a5d6cbda 100644 (file)
@@ -59,38 +59,39 @@ func Test_parsePostgreSQLHostPort(t *testing.T) {
 func Test_getPostgreSQLConnectionString(t *testing.T) {
        tests := []struct {
                Host    string
-               Port    string
                User    string
                Passwd  string
                Name    string
-               Param   string
                SSLMode string
                Output  string
        }{
                {
                        Host:    "/tmp/pg.sock",
-                       Port:    "4321",
                        User:    "testuser",
                        Passwd:  "space space !#$%^^%^```-=?=",
                        Name:    "gitea",
-                       Param:   "",
                        SSLMode: "false",
                        Output:  "postgres://testuser:space%20space%20%21%23$%25%5E%5E%25%5E%60%60%60-=%3F=@:5432/gitea?host=%2Ftmp%2Fpg.sock&sslmode=false",
                },
                {
                        Host:    "localhost",
-                       Port:    "1234",
                        User:    "pgsqlusername",
                        Passwd:  "I love Gitea!",
                        Name:    "gitea",
-                       Param:   "",
                        SSLMode: "true",
                        Output:  "postgres://pgsqlusername:I%20love%20Gitea%21@localhost:5432/gitea?sslmode=true",
                },
+               {
+                       Host:   "localhost:1234",
+                       User:   "user",
+                       Passwd: "pass",
+                       Name:   "gitea?param=1",
+                       Output: "postgres://user:pass@localhost:1234/gitea?param=1&sslmode=",
+               },
        }
 
        for _, test := range tests {
-               connStr := getPostgreSQLConnectionString(test.Host, test.User, test.Passwd, test.Name, test.Param, test.SSLMode)
+               connStr := getPostgreSQLConnectionString(test.Host, test.User, test.Passwd, test.Name, test.SSLMode)
                assert.Equal(t, test.Output, connStr)
        }
 }