mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Move database settings from models to setting (#7806)
* move database settings from models to setting * update docs * fix checkout pr * fix tests * fix lint * remove unsupported tidb options * correct wrong variable name * remove tidb totally
This commit is contained in:
		
				
					committed by
					
						
						Antoine GIRARD
					
				
			
			
				
	
			
			
			
						parent
						
							26af3401c3
						
					
				
				
					commit
					f83db078f0
				
			
							
								
								
									
										148
									
								
								models/models.go
									
									
									
									
									
								
							
							
						
						
									
										148
									
								
								models/models.go
									
									
									
									
									
								
							@@ -9,12 +9,6 @@ import (
 | 
			
		||||
	"database/sql"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
 | 
			
		||||
@@ -52,24 +46,11 @@ type Engine interface {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	x                  *xorm.Engine
 | 
			
		||||
	supportedDatabases = []string{"mysql", "postgres", "mssql"}
 | 
			
		||||
	tables             []interface{}
 | 
			
		||||
	x      *xorm.Engine
 | 
			
		||||
	tables []interface{}
 | 
			
		||||
 | 
			
		||||
	// HasEngine specifies if we have a xorm.Engine
 | 
			
		||||
	HasEngine bool
 | 
			
		||||
 | 
			
		||||
	// DbCfg holds the database settings
 | 
			
		||||
	DbCfg struct {
 | 
			
		||||
		Type, Host, Name, User, Passwd, Path, SSLMode, Charset string
 | 
			
		||||
		Timeout                                                int
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// EnableSQLite3 use SQLite3
 | 
			
		||||
	EnableSQLite3 bool
 | 
			
		||||
 | 
			
		||||
	// EnableTiDB enable TiDB
 | 
			
		||||
	EnableTiDB bool
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
@@ -139,120 +120,13 @@ func init() {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LoadConfigs loads the database settings
 | 
			
		||||
func LoadConfigs() {
 | 
			
		||||
	sec := setting.Cfg.Section("database")
 | 
			
		||||
	DbCfg.Type = sec.Key("DB_TYPE").String()
 | 
			
		||||
	switch DbCfg.Type {
 | 
			
		||||
	case "sqlite3":
 | 
			
		||||
		setting.UseSQLite3 = true
 | 
			
		||||
	case "mysql":
 | 
			
		||||
		setting.UseMySQL = true
 | 
			
		||||
	case "postgres":
 | 
			
		||||
		setting.UsePostgreSQL = true
 | 
			
		||||
	case "tidb":
 | 
			
		||||
		setting.UseTiDB = true
 | 
			
		||||
	case "mssql":
 | 
			
		||||
		setting.UseMSSQL = true
 | 
			
		||||
	}
 | 
			
		||||
	DbCfg.Host = sec.Key("HOST").String()
 | 
			
		||||
	DbCfg.Name = sec.Key("NAME").String()
 | 
			
		||||
	DbCfg.User = sec.Key("USER").String()
 | 
			
		||||
	if len(DbCfg.Passwd) == 0 {
 | 
			
		||||
		DbCfg.Passwd = sec.Key("PASSWD").String()
 | 
			
		||||
	}
 | 
			
		||||
	DbCfg.SSLMode = sec.Key("SSL_MODE").MustString("disable")
 | 
			
		||||
	DbCfg.Charset = sec.Key("CHARSET").In("utf8", []string{"utf8", "utf8mb4"})
 | 
			
		||||
	DbCfg.Path = sec.Key("PATH").MustString(filepath.Join(setting.AppDataPath, "gitea.db"))
 | 
			
		||||
	DbCfg.Timeout = sec.Key("SQLITE_TIMEOUT").MustInt(500)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// parsePostgreSQLHostPort parses given input in various forms defined in
 | 
			
		||||
// https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING
 | 
			
		||||
// and returns proper host and port number.
 | 
			
		||||
func parsePostgreSQLHostPort(info string) (string, string) {
 | 
			
		||||
	host, port := "127.0.0.1", "5432"
 | 
			
		||||
	if strings.Contains(info, ":") && !strings.HasSuffix(info, "]") {
 | 
			
		||||
		idx := strings.LastIndex(info, ":")
 | 
			
		||||
		host = info[:idx]
 | 
			
		||||
		port = info[idx+1:]
 | 
			
		||||
	} else if len(info) > 0 {
 | 
			
		||||
		host = info
 | 
			
		||||
	}
 | 
			
		||||
	return host, port
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getPostgreSQLConnectionString(dbHost, dbUser, dbPasswd, dbName, dbParam, dbsslMode string) (connStr string) {
 | 
			
		||||
	host, port := parsePostgreSQLHostPort(dbHost)
 | 
			
		||||
	if host[0] == '/' { // looks like a unix socket
 | 
			
		||||
		connStr = fmt.Sprintf("postgres://%s:%s@:%s/%s%ssslmode=%s&host=%s",
 | 
			
		||||
			url.PathEscape(dbUser), url.PathEscape(dbPasswd), port, dbName, dbParam, dbsslMode, host)
 | 
			
		||||
	} else {
 | 
			
		||||
		connStr = fmt.Sprintf("postgres://%s:%s@%s:%s/%s%ssslmode=%s",
 | 
			
		||||
			url.PathEscape(dbUser), url.PathEscape(dbPasswd), host, port, dbName, dbParam, dbsslMode)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ParseMSSQLHostPort splits the host into host and port
 | 
			
		||||
func ParseMSSQLHostPort(info string) (string, string) {
 | 
			
		||||
	host, port := "127.0.0.1", "1433"
 | 
			
		||||
	if strings.Contains(info, ":") {
 | 
			
		||||
		host = strings.Split(info, ":")[0]
 | 
			
		||||
		port = strings.Split(info, ":")[1]
 | 
			
		||||
	} else if strings.Contains(info, ",") {
 | 
			
		||||
		host = strings.Split(info, ",")[0]
 | 
			
		||||
		port = strings.TrimSpace(strings.Split(info, ",")[1])
 | 
			
		||||
	} else if len(info) > 0 {
 | 
			
		||||
		host = info
 | 
			
		||||
	}
 | 
			
		||||
	return host, port
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getEngine() (*xorm.Engine, error) {
 | 
			
		||||
	connStr := ""
 | 
			
		||||
	var Param = "?"
 | 
			
		||||
	if strings.Contains(DbCfg.Name, Param) {
 | 
			
		||||
		Param = "&"
 | 
			
		||||
	}
 | 
			
		||||
	switch DbCfg.Type {
 | 
			
		||||
	case "mysql":
 | 
			
		||||
		connType := "tcp"
 | 
			
		||||
		if DbCfg.Host[0] == '/' { // looks like a unix socket
 | 
			
		||||
			connType = "unix"
 | 
			
		||||
		}
 | 
			
		||||
		tls := DbCfg.SSLMode
 | 
			
		||||
		if tls == "disable" { // allow (Postgres-inspired) default value to work in MySQL
 | 
			
		||||
			tls = "false"
 | 
			
		||||
		}
 | 
			
		||||
		connStr = fmt.Sprintf("%s:%s@%s(%s)/%s%scharset=%s&parseTime=true&tls=%s",
 | 
			
		||||
			DbCfg.User, DbCfg.Passwd, connType, DbCfg.Host, DbCfg.Name, Param, DbCfg.Charset, tls)
 | 
			
		||||
	case "postgres":
 | 
			
		||||
		connStr = getPostgreSQLConnectionString(DbCfg.Host, DbCfg.User, DbCfg.Passwd, DbCfg.Name, Param, DbCfg.SSLMode)
 | 
			
		||||
	case "mssql":
 | 
			
		||||
		host, port := ParseMSSQLHostPort(DbCfg.Host)
 | 
			
		||||
		connStr = fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;", host, port, DbCfg.Name, DbCfg.User, DbCfg.Passwd)
 | 
			
		||||
	case "sqlite3":
 | 
			
		||||
		if !EnableSQLite3 {
 | 
			
		||||
			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("Failed to create directories: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
		connStr = fmt.Sprintf("file:%s?cache=shared&mode=rwc&_busy_timeout=%d", DbCfg.Path, DbCfg.Timeout)
 | 
			
		||||
	case "tidb":
 | 
			
		||||
		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("Failed to create directories: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
		connStr = "goleveldb://" + DbCfg.Path
 | 
			
		||||
	default:
 | 
			
		||||
		return nil, fmt.Errorf("Unknown database type: %s", DbCfg.Type)
 | 
			
		||||
	connStr, err := setting.DBConnStr()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return xorm.NewEngine(DbCfg.Type, connStr)
 | 
			
		||||
	return xorm.NewEngine(setting.Database.Type, connStr)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewTestEngine sets a new test xorm.Engine
 | 
			
		||||
@@ -280,11 +154,11 @@ func SetEngine() (err error) {
 | 
			
		||||
	x.SetMapper(core.GonicMapper{})
 | 
			
		||||
	// WARNING: for serv command, MUST remove the output to os.stdout,
 | 
			
		||||
	// so use log file to instead print to stdout.
 | 
			
		||||
	x.SetLogger(NewXORMLogger(setting.LogSQL))
 | 
			
		||||
	x.ShowSQL(setting.LogSQL)
 | 
			
		||||
	if DbCfg.Type == "mysql" {
 | 
			
		||||
		x.SetMaxIdleConns(0)
 | 
			
		||||
		x.SetConnMaxLifetime(3 * time.Second)
 | 
			
		||||
	x.SetLogger(NewXORMLogger(setting.Database.LogSQL))
 | 
			
		||||
	x.ShowSQL(setting.Database.LogSQL)
 | 
			
		||||
	if setting.Database.UseMySQL {
 | 
			
		||||
		x.SetMaxIdleConns(setting.Database.MaxIdleConns)
 | 
			
		||||
		x.SetConnMaxLifetime(setting.Database.ConnMaxLifetime)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user