summaryrefslogtreecommitdiffstats
path: root/models/models.go
diff options
context:
space:
mode:
Diffstat (limited to 'models/models.go')
-rw-r--r--models/models.go148
1 files changed, 11 insertions, 137 deletions
diff --git a/models/models.go b/models/models.go
index 4c925fa570..04acc77aa9 100644
--- a/models/models.go
+++ b/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