|
|
@@ -24,111 +24,119 @@ var ( |
|
|
|
EnableSQLite3 bool |
|
|
|
|
|
|
|
// Database holds the database settings |
|
|
|
Database = struct { |
|
|
|
Type string |
|
|
|
Host string |
|
|
|
Name string |
|
|
|
User string |
|
|
|
Passwd string |
|
|
|
Schema string |
|
|
|
SSLMode string |
|
|
|
Path string |
|
|
|
LogSQL bool |
|
|
|
Charset string |
|
|
|
Timeout int // seconds |
|
|
|
UseSQLite3 bool |
|
|
|
UseMySQL bool |
|
|
|
UseMSSQL bool |
|
|
|
UsePostgreSQL bool |
|
|
|
DBConnectRetries int |
|
|
|
DBConnectBackoff time.Duration |
|
|
|
MaxIdleConns int |
|
|
|
MaxOpenConns int |
|
|
|
ConnMaxLifetime time.Duration |
|
|
|
IterateBufferSize int |
|
|
|
}{ |
|
|
|
Timeout: 500, |
|
|
|
} |
|
|
|
Database *DBInfo |
|
|
|
DatabaseStatistic *DBInfo |
|
|
|
) |
|
|
|
|
|
|
|
type DBInfo struct { |
|
|
|
Type string |
|
|
|
Host string |
|
|
|
Name string |
|
|
|
User string |
|
|
|
Passwd string |
|
|
|
Schema string |
|
|
|
SSLMode string |
|
|
|
Path string |
|
|
|
LogSQL bool |
|
|
|
Charset string |
|
|
|
Timeout int // seconds |
|
|
|
UseSQLite3 bool |
|
|
|
UseMySQL bool |
|
|
|
UseMSSQL bool |
|
|
|
UsePostgreSQL bool |
|
|
|
DBConnectRetries int |
|
|
|
DBConnectBackoff time.Duration |
|
|
|
MaxIdleConns int |
|
|
|
MaxOpenConns int |
|
|
|
ConnMaxLifetime time.Duration |
|
|
|
IterateBufferSize int |
|
|
|
} |
|
|
|
|
|
|
|
// GetDBTypeByName returns the dataase type as it defined on XORM according the given name |
|
|
|
func GetDBTypeByName(name string) string { |
|
|
|
return dbTypes[name] |
|
|
|
} |
|
|
|
|
|
|
|
// InitDBConfig loads the database settings |
|
|
|
func InitDBConfig() { |
|
|
|
sec := Cfg.Section("database") |
|
|
|
Database.Type = sec.Key("DB_TYPE").String() |
|
|
|
switch Database.Type { |
|
|
|
// initDBConfig loads the database settings |
|
|
|
func initDBConfig(section string, database *DBInfo) { |
|
|
|
sec := Cfg.Section(section) |
|
|
|
database.Type = sec.Key("DB_TYPE").String() |
|
|
|
switch database.Type { |
|
|
|
case "sqlite3": |
|
|
|
Database.UseSQLite3 = true |
|
|
|
database.UseSQLite3 = true |
|
|
|
case "mysql": |
|
|
|
Database.UseMySQL = true |
|
|
|
database.UseMySQL = true |
|
|
|
case "postgres": |
|
|
|
Database.UsePostgreSQL = true |
|
|
|
database.UsePostgreSQL = true |
|
|
|
case "mssql": |
|
|
|
Database.UseMSSQL = true |
|
|
|
database.UseMSSQL = true |
|
|
|
} |
|
|
|
Database.Host = sec.Key("HOST").String() |
|
|
|
Database.Name = sec.Key("NAME").String() |
|
|
|
Database.User = sec.Key("USER").String() |
|
|
|
if len(Database.Passwd) == 0 { |
|
|
|
Database.Passwd = sec.Key("PASSWD").String() |
|
|
|
database.Host = sec.Key("HOST").String() |
|
|
|
database.Name = sec.Key("NAME").String() |
|
|
|
database.User = sec.Key("USER").String() |
|
|
|
if len(database.Passwd) == 0 { |
|
|
|
database.Passwd = sec.Key("PASSWD").String() |
|
|
|
} |
|
|
|
Database.Schema = sec.Key("SCHEMA").String() |
|
|
|
Database.SSLMode = sec.Key("SSL_MODE").MustString("disable") |
|
|
|
Database.Charset = sec.Key("CHARSET").In("utf8", []string{"utf8", "utf8mb4"}) |
|
|
|
Database.Path = sec.Key("PATH").MustString(filepath.Join(AppDataPath, "gitea.db")) |
|
|
|
Database.Timeout = sec.Key("SQLITE_TIMEOUT").MustInt(500) |
|
|
|
Database.MaxIdleConns = sec.Key("MAX_IDLE_CONNS").MustInt(2) |
|
|
|
if Database.UseMySQL { |
|
|
|
Database.ConnMaxLifetime = sec.Key("CONN_MAX_LIFE_TIME").MustDuration(3 * time.Second) |
|
|
|
database.Schema = sec.Key("SCHEMA").String() |
|
|
|
database.SSLMode = sec.Key("SSL_MODE").MustString("disable") |
|
|
|
database.Charset = sec.Key("CHARSET").In("utf8", []string{"utf8", "utf8mb4"}) |
|
|
|
database.Path = sec.Key("PATH").MustString(filepath.Join(AppDataPath, "gitea.db")) |
|
|
|
database.Timeout = sec.Key("SQLITE_TIMEOUT").MustInt(500) |
|
|
|
database.MaxIdleConns = sec.Key("MAX_IDLE_CONNS").MustInt(2) |
|
|
|
if database.UseMySQL { |
|
|
|
database.ConnMaxLifetime = sec.Key("CONN_MAX_LIFE_TIME").MustDuration(3 * time.Second) |
|
|
|
} else { |
|
|
|
Database.ConnMaxLifetime = sec.Key("CONN_MAX_LIFE_TIME").MustDuration(0) |
|
|
|
database.ConnMaxLifetime = sec.Key("CONN_MAX_LIFE_TIME").MustDuration(0) |
|
|
|
} |
|
|
|
Database.MaxOpenConns = sec.Key("MAX_OPEN_CONNS").MustInt(0) |
|
|
|
database.MaxOpenConns = sec.Key("MAX_OPEN_CONNS").MustInt(0) |
|
|
|
|
|
|
|
Database.IterateBufferSize = sec.Key("ITERATE_BUFFER_SIZE").MustInt(50) |
|
|
|
Database.LogSQL = sec.Key("LOG_SQL").MustBool(true) |
|
|
|
Database.DBConnectRetries = sec.Key("DB_RETRIES").MustInt(10) |
|
|
|
Database.DBConnectBackoff = sec.Key("DB_RETRY_BACKOFF").MustDuration(3 * time.Second) |
|
|
|
database.IterateBufferSize = sec.Key("ITERATE_BUFFER_SIZE").MustInt(50) |
|
|
|
database.LogSQL = sec.Key("LOG_SQL").MustBool(true) |
|
|
|
database.DBConnectRetries = sec.Key("DB_RETRIES").MustInt(10) |
|
|
|
database.DBConnectBackoff = sec.Key("DB_RETRY_BACKOFF").MustDuration(3 * time.Second) |
|
|
|
} |
|
|
|
|
|
|
|
func InitDBConfig() { |
|
|
|
Database = new(DBInfo) |
|
|
|
DatabaseStatistic = new(DBInfo) |
|
|
|
initDBConfig("database", Database) |
|
|
|
initDBConfig("database_statistic", DatabaseStatistic) |
|
|
|
} |
|
|
|
|
|
|
|
// DBConnStr returns database connection string |
|
|
|
func DBConnStr() (string, error) { |
|
|
|
func DBConnStr(database *DBInfo) (string, error) { |
|
|
|
connStr := "" |
|
|
|
var Param = "?" |
|
|
|
if strings.Contains(Database.Name, Param) { |
|
|
|
if strings.Contains(database.Name, Param) { |
|
|
|
Param = "&" |
|
|
|
} |
|
|
|
switch Database.Type { |
|
|
|
switch database.Type { |
|
|
|
case "mysql": |
|
|
|
connType := "tcp" |
|
|
|
if Database.Host[0] == '/' { // looks like a unix socket |
|
|
|
if database.Host[0] == '/' { // looks like a unix socket |
|
|
|
connType = "unix" |
|
|
|
} |
|
|
|
tls := Database.SSLMode |
|
|
|
tls := database.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", |
|
|
|
Database.User, Database.Passwd, connType, Database.Host, Database.Name, Param, Database.Charset, tls) |
|
|
|
database.User, database.Passwd, connType, database.Host, database.Name, Param, database.Charset, tls) |
|
|
|
case "postgres": |
|
|
|
connStr = getPostgreSQLConnectionString(Database.Host, Database.User, Database.Passwd, Database.Name, Param, Database.SSLMode) |
|
|
|
connStr = getPostgreSQLConnectionString(database.Host, database.User, database.Passwd, database.Name, Param, database.SSLMode) |
|
|
|
case "mssql": |
|
|
|
host, port := ParseMSSQLHostPort(Database.Host) |
|
|
|
connStr = fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;", host, port, Database.Name, Database.User, Database.Passwd) |
|
|
|
host, port := ParseMSSQLHostPort(database.Host) |
|
|
|
connStr = fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;", host, port, database.Name, database.User, database.Passwd) |
|
|
|
case "sqlite3": |
|
|
|
if !EnableSQLite3 { |
|
|
|
return "", errors.New("this binary version does not build support for SQLite3") |
|
|
|
} |
|
|
|
if err := os.MkdirAll(path.Dir(Database.Path), os.ModePerm); err != nil { |
|
|
|
if err := os.MkdirAll(path.Dir(database.Path), os.ModePerm); err != nil { |
|
|
|
return "", fmt.Errorf("Failed to create directories: %v", err) |
|
|
|
} |
|
|
|
connStr = fmt.Sprintf("file:%s?cache=shared&mode=rwc&_busy_timeout=%d&_txlock=immediate", Database.Path, Database.Timeout) |
|
|
|
connStr = fmt.Sprintf("file:%s?cache=shared&mode=rwc&_busy_timeout=%d&_txlock=immediate", database.Path, database.Timeout) |
|
|
|
default: |
|
|
|
return "", fmt.Errorf("Unknown database type: %s", Database.Type) |
|
|
|
return "", fmt.Errorf("Unknown database type: %s", database.Type) |
|
|
|
} |
|
|
|
|
|
|
|
return connStr, nil |
|
|
|