diff options
Diffstat (limited to 'models/models.go')
-rw-r--r-- | models/models.go | 148 |
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 |