|  | @@ -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) {
 |