Browse Source

#3013 support connect PostgreSQL via unix socket

Unknwon 7 years ago
parent
commit
5850308a37
1 changed files with 19 additions and 12 deletions
  1. 19 12
      models/models.go

+ 19 - 12
models/models.go

@@ -6,6 +6,7 @@ package models
 
 import (
 	"database/sql"
+	"errors"
 	"fmt"
 	"net/url"
 	"os"
@@ -97,7 +98,7 @@ func LoadConfigs() {
 }
 
 func getEngine() (*xorm.Engine, error) {
-	cnnstr := ""
+	connStr := ""
 	var Param string = "?"
 	if strings.Contains(DbCfg.Name, Param) {
 		Param = "&"
@@ -105,14 +106,14 @@ func getEngine() (*xorm.Engine, error) {
 	switch DbCfg.Type {
 	case "mysql":
 		if DbCfg.Host[0] == '/' { // looks like a unix socket
-			cnnstr = fmt.Sprintf("%s:%s@unix(%s)/%s%scharset=utf8&parseTime=true",
+			connStr = fmt.Sprintf("%s:%s@unix(%s)/%s%scharset=utf8&parseTime=true",
 				DbCfg.User, DbCfg.Passwd, DbCfg.Host, DbCfg.Name, Param)
 		} else {
-			cnnstr = fmt.Sprintf("%s:%s@tcp(%s)/%s%scharset=utf8&parseTime=true",
+			connStr = fmt.Sprintf("%s:%s@tcp(%s)/%s%scharset=utf8&parseTime=true",
 				DbCfg.User, DbCfg.Passwd, DbCfg.Host, DbCfg.Name, Param)
 		}
 	case "postgres":
-		var host, port = "127.0.0.1", "5432"
+		host, port := "127.0.0.1", "5432"
 		fields := strings.Split(DbCfg.Host, ":")
 		if len(fields) > 0 && len(strings.TrimSpace(fields[0])) > 0 {
 			host = fields[0]
@@ -120,28 +121,34 @@ func getEngine() (*xorm.Engine, error) {
 		if len(fields) > 1 && len(strings.TrimSpace(fields[1])) > 0 {
 			port = fields[1]
 		}
-		cnnstr = fmt.Sprintf("postgres://%s:%s@%s:%s/%s%ssslmode=%s",
-			url.QueryEscape(DbCfg.User), url.QueryEscape(DbCfg.Passwd), host, port, DbCfg.Name, Param, DbCfg.SSLMode)
+
+		if host[0] == '/' { // looks like a unix socket
+			connStr = fmt.Sprintf("postgres://%s:%s@:%s/%s%ssslmode=%s&host=%s",
+				url.QueryEscape(DbCfg.User), url.QueryEscape(DbCfg.Passwd), port, DbCfg.Name, Param, DbCfg.SSLMode, host)
+		} else {
+			connStr = fmt.Sprintf("postgres://%s:%s@%s:%s/%s%ssslmode=%s",
+				url.QueryEscape(DbCfg.User), url.QueryEscape(DbCfg.Passwd), host, port, DbCfg.Name, Param, DbCfg.SSLMode)
+		}
 	case "sqlite3":
 		if !EnableSQLite3 {
-			return nil, fmt.Errorf("Unknown database type: %s", DbCfg.Type)
+			return nil, errors.New("This binary version does not build support for SQLite3.")
 		}
 		if err := os.MkdirAll(path.Dir(DbCfg.Path), os.ModePerm); err != nil {
 			return nil, fmt.Errorf("Fail to create directories: %v", err)
 		}
-		cnnstr = "file:" + DbCfg.Path + "?cache=shared&mode=rwc"
+		connStr = "file:" + DbCfg.Path + "?cache=shared&mode=rwc"
 	case "tidb":
-		if !EnableTidb {
-			return nil, fmt.Errorf("Unknown database type: %s", DbCfg.Type)
+		if !EnableTiDB {
+			return nil, errors.New("This binary version does not build support for TiDB.")
 		}
 		if err := os.MkdirAll(path.Dir(DbCfg.Path), os.ModePerm); err != nil {
 			return nil, fmt.Errorf("Fail to create directories: %v", err)
 		}
-		cnnstr = "goleveldb://" + DbCfg.Path
+		connStr = "goleveldb://" + DbCfg.Path
 	default:
 		return nil, fmt.Errorf("Unknown database type: %s", DbCfg.Type)
 	}
-	return xorm.NewEngine(DbCfg.Type, cnnstr)
+	return xorm.NewEngine(DbCfg.Type, connStr)
 }
 
 func NewTestEngine(x *xorm.Engine) (err error) {