mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-11-18 15:21:04 +00:00
Backport #23354 Replace #23350. Refactor `setting.Database.UseMySQL` to `setting.Database.Type.IsMySQL()`. To avoid mismatching between `Type` and `UseXXX`. This refactor can fix the bug mentioned in #23350, so it should be backported. Co-authored-by: Jason Song <i@wolfogre.com>
This commit is contained in:
parent
e8e871b44e
commit
ecae62837c
36 changed files with 103 additions and 96 deletions
|
@ -35,7 +35,7 @@ func runConvert(ctx *cli.Context) error {
|
||||||
log.Info("Log path: %s", setting.Log.RootPath)
|
log.Info("Log path: %s", setting.Log.RootPath)
|
||||||
log.Info("Configuration file: %s", setting.CustomConf)
|
log.Info("Configuration file: %s", setting.CustomConf)
|
||||||
|
|
||||||
if !setting.Database.UseMySQL {
|
if !setting.Database.Type.IsMySQL() {
|
||||||
fmt.Println("This command can only be used with a MySQL database")
|
fmt.Println("This command can only be used with a MySQL database")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -279,7 +279,7 @@ func runDump(ctx *cli.Context) error {
|
||||||
}()
|
}()
|
||||||
|
|
||||||
targetDBType := ctx.String("database")
|
targetDBType := ctx.String("database")
|
||||||
if len(targetDBType) > 0 && targetDBType != setting.Database.Type {
|
if len(targetDBType) > 0 && targetDBType != setting.Database.Type.String() {
|
||||||
log.Info("Dumping database %s => %s...", setting.Database.Type, targetDBType)
|
log.Info("Dumping database %s => %s...", setting.Database.Type, targetDBType)
|
||||||
} else {
|
} else {
|
||||||
log.Info("Dumping database...")
|
log.Info("Dumping database...")
|
||||||
|
|
|
@ -99,7 +99,7 @@ func (a *Action) TableIndices() []*schemas.Index {
|
||||||
actUserIndex.AddColumn("act_user_id", "repo_id", "created_unix", "user_id", "is_deleted")
|
actUserIndex.AddColumn("act_user_id", "repo_id", "created_unix", "user_id", "is_deleted")
|
||||||
|
|
||||||
indices := []*schemas.Index{actUserIndex, repoIndex}
|
indices := []*schemas.Index{actUserIndex, repoIndex}
|
||||||
if setting.Database.UsePostgreSQL {
|
if setting.Database.Type.IsPostgreSQL() {
|
||||||
cudIndex := schemas.NewIndex("c_u_d", schemas.IndexType)
|
cudIndex := schemas.NewIndex("c_u_d", schemas.IndexType)
|
||||||
cudIndex.AddColumn("created_unix", "user_id", "is_deleted")
|
cudIndex.AddColumn("created_unix", "user_id", "is_deleted")
|
||||||
indices = append(indices, cudIndex)
|
indices = append(indices, cudIndex)
|
||||||
|
@ -640,7 +640,7 @@ func DeleteIssueActions(ctx context.Context, repoID, issueID int64) error {
|
||||||
|
|
||||||
// CountActionCreatedUnixString count actions where created_unix is an empty string
|
// CountActionCreatedUnixString count actions where created_unix is an empty string
|
||||||
func CountActionCreatedUnixString(ctx context.Context) (int64, error) {
|
func CountActionCreatedUnixString(ctx context.Context) (int64, error) {
|
||||||
if setting.Database.UseSQLite3 {
|
if setting.Database.Type.IsSQLite3() {
|
||||||
return db.GetEngine(ctx).Where(`created_unix = ""`).Count(new(Action))
|
return db.GetEngine(ctx).Where(`created_unix = ""`).Count(new(Action))
|
||||||
}
|
}
|
||||||
return 0, nil
|
return 0, nil
|
||||||
|
@ -648,7 +648,7 @@ func CountActionCreatedUnixString(ctx context.Context) (int64, error) {
|
||||||
|
|
||||||
// FixActionCreatedUnixString set created_unix to zero if it is an empty string
|
// FixActionCreatedUnixString set created_unix to zero if it is an empty string
|
||||||
func FixActionCreatedUnixString(ctx context.Context) (int64, error) {
|
func FixActionCreatedUnixString(ctx context.Context) (int64, error) {
|
||||||
if setting.Database.UseSQLite3 {
|
if setting.Database.Type.IsSQLite3() {
|
||||||
res, err := db.GetEngine(ctx).Exec(`UPDATE action SET created_unix = 0 WHERE created_unix = ""`)
|
res, err := db.GetEngine(ctx).Exec(`UPDATE action SET created_unix = 0 WHERE created_unix = ""`)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
|
|
|
@ -234,7 +234,7 @@ func TestGetFeedsCorrupted(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestConsistencyUpdateAction(t *testing.T) {
|
func TestConsistencyUpdateAction(t *testing.T) {
|
||||||
if !setting.Database.UseSQLite3 {
|
if !setting.Database.Type.IsSQLite3() {
|
||||||
t.Skip("Test is only for SQLite database.")
|
t.Skip("Test is only for SQLite database.")
|
||||||
}
|
}
|
||||||
assert.NoError(t, unittest.PrepareTestDatabase())
|
assert.NoError(t, unittest.PrepareTestDatabase())
|
||||||
|
|
|
@ -39,9 +39,9 @@ func getUserHeatmapData(user *user_model.User, team *organization.Team, doer *us
|
||||||
groupBy := "created_unix / 900 * 900"
|
groupBy := "created_unix / 900 * 900"
|
||||||
groupByName := "timestamp" // We need this extra case because mssql doesn't allow grouping by alias
|
groupByName := "timestamp" // We need this extra case because mssql doesn't allow grouping by alias
|
||||||
switch {
|
switch {
|
||||||
case setting.Database.UseMySQL:
|
case setting.Database.Type.IsMySQL():
|
||||||
groupBy = "created_unix DIV 900 * 900"
|
groupBy = "created_unix DIV 900 * 900"
|
||||||
case setting.Database.UseMSSQL:
|
case setting.Database.Type.IsMSSQL():
|
||||||
groupByName = groupBy
|
groupByName = groupBy
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ import (
|
||||||
// BuildCaseInsensitiveLike returns a condition to check if the given value is like the given key case-insensitively.
|
// BuildCaseInsensitiveLike returns a condition to check if the given value is like the given key case-insensitively.
|
||||||
// Handles especially SQLite correctly as UPPER there only transforms ASCII letters.
|
// Handles especially SQLite correctly as UPPER there only transforms ASCII letters.
|
||||||
func BuildCaseInsensitiveLike(key, value string) builder.Cond {
|
func BuildCaseInsensitiveLike(key, value string) builder.Cond {
|
||||||
if setting.Database.UseSQLite3 {
|
if setting.Database.Type.IsSQLite3() {
|
||||||
return builder.Like{"UPPER(" + key + ")", util.ToUpperASCII(value)}
|
return builder.Like{"UPPER(" + key + ")", util.ToUpperASCII(value)}
|
||||||
}
|
}
|
||||||
return builder.Like{"UPPER(" + key + ")", strings.ToUpper(value)}
|
return builder.Like{"UPPER(" + key + ")", strings.ToUpper(value)}
|
||||||
|
|
|
@ -100,12 +100,12 @@ func newXORMEngine() (*xorm.Engine, error) {
|
||||||
|
|
||||||
var engine *xorm.Engine
|
var engine *xorm.Engine
|
||||||
|
|
||||||
if setting.Database.UsePostgreSQL && len(setting.Database.Schema) > 0 {
|
if setting.Database.Type.IsPostgreSQL() && len(setting.Database.Schema) > 0 {
|
||||||
// OK whilst we sort out our schema issues - create a schema aware postgres
|
// OK whilst we sort out our schema issues - create a schema aware postgres
|
||||||
registerPostgresSchemaDriver()
|
registerPostgresSchemaDriver()
|
||||||
engine, err = xorm.NewEngine("postgresschema", connStr)
|
engine, err = xorm.NewEngine("postgresschema", connStr)
|
||||||
} else {
|
} else {
|
||||||
engine, err = xorm.NewEngine(setting.Database.Type, connStr)
|
engine, err = xorm.NewEngine(setting.Database.Type.String(), connStr)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -73,7 +73,7 @@ func postgresGetNextResourceIndex(ctx context.Context, tableName string, groupID
|
||||||
|
|
||||||
// GetNextResourceIndex generates a resource index, it must run in the same transaction where the resource is created
|
// GetNextResourceIndex generates a resource index, it must run in the same transaction where the resource is created
|
||||||
func GetNextResourceIndex(ctx context.Context, tableName string, groupID int64) (int64, error) {
|
func GetNextResourceIndex(ctx context.Context, tableName string, groupID int64) (int64, error) {
|
||||||
if setting.Database.UsePostgreSQL {
|
if setting.Database.Type.IsPostgreSQL() {
|
||||||
return postgresGetNextResourceIndex(ctx, tableName, groupID)
|
return postgresGetNextResourceIndex(ctx, tableName, groupID)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ import (
|
||||||
|
|
||||||
// CountBadSequences looks for broken sequences from recreate-table mistakes
|
// CountBadSequences looks for broken sequences from recreate-table mistakes
|
||||||
func CountBadSequences(_ context.Context) (int64, error) {
|
func CountBadSequences(_ context.Context) (int64, error) {
|
||||||
if !setting.Database.UsePostgreSQL {
|
if !setting.Database.Type.IsPostgreSQL() {
|
||||||
return 0, nil
|
return 0, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ func CountBadSequences(_ context.Context) (int64, error) {
|
||||||
|
|
||||||
// FixBadSequences fixes for broken sequences from recreate-table mistakes
|
// FixBadSequences fixes for broken sequences from recreate-table mistakes
|
||||||
func FixBadSequences(_ context.Context) error {
|
func FixBadSequences(_ context.Context) error {
|
||||||
if !setting.Database.UsePostgreSQL {
|
if !setting.Database.Type.IsPostgreSQL() {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -65,7 +65,7 @@ func postgresGetCommitStatusIndex(ctx context.Context, repoID int64, sha string)
|
||||||
|
|
||||||
// GetNextCommitStatusIndex retried 3 times to generate a resource index
|
// GetNextCommitStatusIndex retried 3 times to generate a resource index
|
||||||
func GetNextCommitStatusIndex(ctx context.Context, repoID int64, sha string) (int64, error) {
|
func GetNextCommitStatusIndex(ctx context.Context, repoID int64, sha string) (int64, error) {
|
||||||
if setting.Database.UsePostgreSQL {
|
if setting.Database.Type.IsPostgreSQL() {
|
||||||
return postgresGetCommitStatusIndex(ctx, repoID, sha)
|
return postgresGetCommitStatusIndex(ctx, repoID, sha)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -89,7 +89,7 @@ func RecreateTable(sess *xorm.Session, bean interface{}) error {
|
||||||
hasID = hasID || (column.IsPrimaryKey && column.IsAutoIncrement)
|
hasID = hasID || (column.IsPrimaryKey && column.IsAutoIncrement)
|
||||||
}
|
}
|
||||||
|
|
||||||
if hasID && setting.Database.UseMSSQL {
|
if hasID && setting.Database.Type.IsMSSQL() {
|
||||||
if _, err := sess.Exec(fmt.Sprintf("SET IDENTITY_INSERT `%s` ON", tempTableName)); err != nil {
|
if _, err := sess.Exec(fmt.Sprintf("SET IDENTITY_INSERT `%s` ON", tempTableName)); err != nil {
|
||||||
log.Error("Unable to set identity insert for table %s. Error: %v", tempTableName, err)
|
log.Error("Unable to set identity insert for table %s. Error: %v", tempTableName, err)
|
||||||
return err
|
return err
|
||||||
|
@ -143,7 +143,7 @@ func RecreateTable(sess *xorm.Session, bean interface{}) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if hasID && setting.Database.UseMSSQL {
|
if hasID && setting.Database.Type.IsMSSQL() {
|
||||||
if _, err := sess.Exec(fmt.Sprintf("SET IDENTITY_INSERT `%s` OFF", tempTableName)); err != nil {
|
if _, err := sess.Exec(fmt.Sprintf("SET IDENTITY_INSERT `%s` OFF", tempTableName)); err != nil {
|
||||||
log.Error("Unable to switch off identity insert for table %s. Error: %v", tempTableName, err)
|
log.Error("Unable to switch off identity insert for table %s. Error: %v", tempTableName, err)
|
||||||
return err
|
return err
|
||||||
|
@ -151,7 +151,7 @@ func RecreateTable(sess *xorm.Session, bean interface{}) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case setting.Database.UseSQLite3:
|
case setting.Database.Type.IsSQLite3():
|
||||||
// SQLite will drop all the constraints on the old table
|
// SQLite will drop all the constraints on the old table
|
||||||
if _, err := sess.Exec(fmt.Sprintf("DROP TABLE `%s`", tableName)); err != nil {
|
if _, err := sess.Exec(fmt.Sprintf("DROP TABLE `%s`", tableName)); err != nil {
|
||||||
log.Error("Unable to drop old table %s. Error: %v", tableName, err)
|
log.Error("Unable to drop old table %s. Error: %v", tableName, err)
|
||||||
|
@ -178,7 +178,7 @@ func RecreateTable(sess *xorm.Session, bean interface{}) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
case setting.Database.UseMySQL:
|
case setting.Database.Type.IsMySQL():
|
||||||
// MySQL will drop all the constraints on the old table
|
// MySQL will drop all the constraints on the old table
|
||||||
if _, err := sess.Exec(fmt.Sprintf("DROP TABLE `%s`", tableName)); err != nil {
|
if _, err := sess.Exec(fmt.Sprintf("DROP TABLE `%s`", tableName)); err != nil {
|
||||||
log.Error("Unable to drop old table %s. Error: %v", tableName, err)
|
log.Error("Unable to drop old table %s. Error: %v", tableName, err)
|
||||||
|
@ -205,7 +205,7 @@ func RecreateTable(sess *xorm.Session, bean interface{}) error {
|
||||||
log.Error("Unable to recreate uniques on table %s. Error: %v", tableName, err)
|
log.Error("Unable to recreate uniques on table %s. Error: %v", tableName, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
case setting.Database.UsePostgreSQL:
|
case setting.Database.Type.IsPostgreSQL():
|
||||||
var originalSequences []string
|
var originalSequences []string
|
||||||
type sequenceData struct {
|
type sequenceData struct {
|
||||||
LastValue int `xorm:"'last_value'"`
|
LastValue int `xorm:"'last_value'"`
|
||||||
|
@ -296,7 +296,7 @@ func RecreateTable(sess *xorm.Session, bean interface{}) error {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case setting.Database.UseMSSQL:
|
case setting.Database.Type.IsMSSQL():
|
||||||
// MSSQL will drop all the constraints on the old table
|
// MSSQL will drop all the constraints on the old table
|
||||||
if _, err := sess.Exec(fmt.Sprintf("DROP TABLE `%s`", tableName)); err != nil {
|
if _, err := sess.Exec(fmt.Sprintf("DROP TABLE `%s`", tableName)); err != nil {
|
||||||
log.Error("Unable to drop old table %s. Error: %v", tableName, err)
|
log.Error("Unable to drop old table %s. Error: %v", tableName, err)
|
||||||
|
@ -323,7 +323,7 @@ func DropTableColumns(sess *xorm.Session, tableName string, columnNames ...strin
|
||||||
// TODO: This will not work if there are foreign keys
|
// TODO: This will not work if there are foreign keys
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case setting.Database.UseSQLite3:
|
case setting.Database.Type.IsSQLite3():
|
||||||
// First drop the indexes on the columns
|
// First drop the indexes on the columns
|
||||||
res, errIndex := sess.Query(fmt.Sprintf("PRAGMA index_list(`%s`)", tableName))
|
res, errIndex := sess.Query(fmt.Sprintf("PRAGMA index_list(`%s`)", tableName))
|
||||||
if errIndex != nil {
|
if errIndex != nil {
|
||||||
|
@ -405,7 +405,7 @@ func DropTableColumns(sess *xorm.Session, tableName string, columnNames ...strin
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
case setting.Database.UsePostgreSQL:
|
case setting.Database.Type.IsPostgreSQL():
|
||||||
cols := ""
|
cols := ""
|
||||||
for _, col := range columnNames {
|
for _, col := range columnNames {
|
||||||
if cols != "" {
|
if cols != "" {
|
||||||
|
@ -416,7 +416,7 @@ func DropTableColumns(sess *xorm.Session, tableName string, columnNames ...strin
|
||||||
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` %s", tableName, cols)); err != nil {
|
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` %s", tableName, cols)); err != nil {
|
||||||
return fmt.Errorf("Drop table `%s` columns %v: %v", tableName, columnNames, err)
|
return fmt.Errorf("Drop table `%s` columns %v: %v", tableName, columnNames, err)
|
||||||
}
|
}
|
||||||
case setting.Database.UseMySQL:
|
case setting.Database.Type.IsMySQL():
|
||||||
// Drop indexes on columns first
|
// Drop indexes on columns first
|
||||||
sql := fmt.Sprintf("SHOW INDEX FROM %s WHERE column_name IN ('%s')", tableName, strings.Join(columnNames, "','"))
|
sql := fmt.Sprintf("SHOW INDEX FROM %s WHERE column_name IN ('%s')", tableName, strings.Join(columnNames, "','"))
|
||||||
res, err := sess.Query(sql)
|
res, err := sess.Query(sql)
|
||||||
|
@ -444,7 +444,7 @@ func DropTableColumns(sess *xorm.Session, tableName string, columnNames ...strin
|
||||||
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` %s", tableName, cols)); err != nil {
|
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` %s", tableName, cols)); err != nil {
|
||||||
return fmt.Errorf("Drop table `%s` columns %v: %v", tableName, columnNames, err)
|
return fmt.Errorf("Drop table `%s` columns %v: %v", tableName, columnNames, err)
|
||||||
}
|
}
|
||||||
case setting.Database.UseMSSQL:
|
case setting.Database.Type.IsMSSQL():
|
||||||
cols := ""
|
cols := ""
|
||||||
for _, col := range columnNames {
|
for _, col := range columnNames {
|
||||||
if cols != "" {
|
if cols != "" {
|
||||||
|
@ -543,13 +543,13 @@ func newXORMEngine() (*xorm.Engine, error) {
|
||||||
|
|
||||||
func deleteDB() error {
|
func deleteDB() error {
|
||||||
switch {
|
switch {
|
||||||
case setting.Database.UseSQLite3:
|
case setting.Database.Type.IsSQLite3():
|
||||||
if err := util.Remove(setting.Database.Path); err != nil {
|
if err := util.Remove(setting.Database.Path); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return os.MkdirAll(path.Dir(setting.Database.Path), os.ModePerm)
|
return os.MkdirAll(path.Dir(setting.Database.Path), os.ModePerm)
|
||||||
|
|
||||||
case setting.Database.UseMySQL:
|
case setting.Database.Type.IsMySQL():
|
||||||
db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s)/",
|
db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s)/",
|
||||||
setting.Database.User, setting.Database.Passwd, setting.Database.Host))
|
setting.Database.User, setting.Database.Passwd, setting.Database.Host))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -565,7 +565,7 @@ func deleteDB() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
case setting.Database.UsePostgreSQL:
|
case setting.Database.Type.IsPostgreSQL():
|
||||||
db, err := sql.Open("postgres", fmt.Sprintf("postgres://%s:%s@%s/?sslmode=%s",
|
db, err := sql.Open("postgres", fmt.Sprintf("postgres://%s:%s@%s/?sslmode=%s",
|
||||||
setting.Database.User, setting.Database.Passwd, setting.Database.Host, setting.Database.SSLMode))
|
setting.Database.User, setting.Database.Passwd, setting.Database.Host, setting.Database.SSLMode))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -612,7 +612,7 @@ func deleteDB() error {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
case setting.Database.UseMSSQL:
|
case setting.Database.Type.IsMSSQL():
|
||||||
host, port := setting.ParseMSSQLHostPort(setting.Database.Host)
|
host, port := setting.ParseMSSQLHostPort(setting.Database.Host)
|
||||||
db, err := sql.Open("mssql", fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;",
|
db, err := sql.Open("mssql", fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;",
|
||||||
host, port, "master", setting.Database.User, setting.Database.Passwd))
|
host, port, "master", setting.Database.User, setting.Database.Passwd))
|
||||||
|
|
|
@ -13,9 +13,9 @@ func PrependRefsHeadsToIssueRefs(x *xorm.Engine) error {
|
||||||
var query string
|
var query string
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case setting.Database.UseMSSQL:
|
case setting.Database.Type.IsMSSQL():
|
||||||
query = "UPDATE `issue` SET `ref` = 'refs/heads/' + `ref` WHERE `ref` IS NOT NULL AND `ref` <> '' AND `ref` NOT LIKE 'refs/%'"
|
query = "UPDATE `issue` SET `ref` = 'refs/heads/' + `ref` WHERE `ref` IS NOT NULL AND `ref` <> '' AND `ref` NOT LIKE 'refs/%'"
|
||||||
case setting.Database.UseMySQL:
|
case setting.Database.Type.IsMySQL():
|
||||||
query = "UPDATE `issue` SET `ref` = CONCAT('refs/heads/', `ref`) WHERE `ref` IS NOT NULL AND `ref` <> '' AND `ref` NOT LIKE 'refs/%';"
|
query = "UPDATE `issue` SET `ref` = CONCAT('refs/heads/', `ref`) WHERE `ref` IS NOT NULL AND `ref` <> '' AND `ref` NOT LIKE 'refs/%';"
|
||||||
default:
|
default:
|
||||||
query = "UPDATE `issue` SET `ref` = 'refs/heads/' || `ref` WHERE `ref` IS NOT NULL AND `ref` <> '' AND `ref` NOT LIKE 'refs/%'"
|
query = "UPDATE `issue` SET `ref` = 'refs/heads/' || `ref` WHERE `ref` IS NOT NULL AND `ref` <> '' AND `ref` NOT LIKE 'refs/%'"
|
||||||
|
|
|
@ -41,7 +41,7 @@ func FixLanguageStatsToSaveSize(x *xorm.Engine) error {
|
||||||
|
|
||||||
// Delete language stat statuses
|
// Delete language stat statuses
|
||||||
truncExpr := "TRUNCATE TABLE"
|
truncExpr := "TRUNCATE TABLE"
|
||||||
if setting.Database.UseSQLite3 {
|
if setting.Database.Type.IsSQLite3() {
|
||||||
truncExpr = "DELETE FROM"
|
truncExpr = "DELETE FROM"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ func IncreaseLanguageField(x *xorm.Engine) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if setting.Database.UseSQLite3 {
|
if setting.Database.Type.IsSQLite3() {
|
||||||
// SQLite maps VARCHAR to TEXT without size so we're done
|
// SQLite maps VARCHAR to TEXT without size so we're done
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -41,11 +41,11 @@ func IncreaseLanguageField(x *xorm.Engine) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case setting.Database.UseMySQL:
|
case setting.Database.Type.IsMySQL():
|
||||||
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE language_stat MODIFY COLUMN language %s", sqlType)); err != nil {
|
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE language_stat MODIFY COLUMN language %s", sqlType)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
case setting.Database.UseMSSQL:
|
case setting.Database.Type.IsMSSQL():
|
||||||
// Yet again MSSQL just has to be awkward.
|
// Yet again MSSQL just has to be awkward.
|
||||||
// Here we have to drop the constraints first and then rebuild them
|
// Here we have to drop the constraints first and then rebuild them
|
||||||
constraints := make([]string, 0)
|
constraints := make([]string, 0)
|
||||||
|
@ -71,7 +71,7 @@ func IncreaseLanguageField(x *xorm.Engine) error {
|
||||||
if err := sess.CreateUniques(new(LanguageStat)); err != nil {
|
if err := sess.CreateUniques(new(LanguageStat)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
case setting.Database.UsePostgreSQL:
|
case setting.Database.Type.IsPostgreSQL():
|
||||||
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE language_stat ALTER COLUMN language TYPE %s", sqlType)); err != nil {
|
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE language_stat ALTER COLUMN language TYPE %s", sqlType)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,13 +17,13 @@ import (
|
||||||
|
|
||||||
func SetDefaultPasswordToArgon2(x *xorm.Engine) error {
|
func SetDefaultPasswordToArgon2(x *xorm.Engine) error {
|
||||||
switch {
|
switch {
|
||||||
case setting.Database.UseMySQL:
|
case setting.Database.Type.IsMySQL():
|
||||||
_, err := x.Exec("ALTER TABLE `user` ALTER passwd_hash_algo SET DEFAULT 'argon2';")
|
_, err := x.Exec("ALTER TABLE `user` ALTER passwd_hash_algo SET DEFAULT 'argon2';")
|
||||||
return err
|
return err
|
||||||
case setting.Database.UsePostgreSQL:
|
case setting.Database.Type.IsPostgreSQL():
|
||||||
_, err := x.Exec("ALTER TABLE `user` ALTER COLUMN passwd_hash_algo SET DEFAULT 'argon2';")
|
_, err := x.Exec("ALTER TABLE `user` ALTER COLUMN passwd_hash_algo SET DEFAULT 'argon2';")
|
||||||
return err
|
return err
|
||||||
case setting.Database.UseMSSQL:
|
case setting.Database.Type.IsMSSQL():
|
||||||
// need to find the constraint and drop it, then recreate it.
|
// need to find the constraint and drop it, then recreate it.
|
||||||
sess := x.NewSession()
|
sess := x.NewSession()
|
||||||
defer sess.Close()
|
defer sess.Close()
|
||||||
|
@ -53,7 +53,7 @@ func SetDefaultPasswordToArgon2(x *xorm.Engine) error {
|
||||||
}
|
}
|
||||||
return sess.Commit()
|
return sess.Commit()
|
||||||
|
|
||||||
case setting.Database.UseSQLite3:
|
case setting.Database.Type.IsSQLite3():
|
||||||
// drop through
|
// drop through
|
||||||
default:
|
default:
|
||||||
log.Fatal("Unrecognized DB")
|
log.Fatal("Unrecognized DB")
|
||||||
|
|
|
@ -62,7 +62,7 @@ func UpdateCodeCommentReplies(x *xorm.Engine) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if setting.Database.UseMSSQL {
|
if setting.Database.Type.IsMSSQL() {
|
||||||
if _, err := sess.Exec(sqlSelect + " INTO #temp_comments" + sqlTail); err != nil {
|
if _, err := sess.Exec(sqlSelect + " INTO #temp_comments" + sqlTail); err != nil {
|
||||||
log.Error("unable to create temporary table")
|
log.Error("unable to create temporary table")
|
||||||
return err
|
return err
|
||||||
|
@ -72,13 +72,13 @@ func UpdateCodeCommentReplies(x *xorm.Engine) error {
|
||||||
comments := make([]*Comment, 0, batchSize)
|
comments := make([]*Comment, 0, batchSize)
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case setting.Database.UseMySQL:
|
case setting.Database.Type.IsMySQL():
|
||||||
sqlCmd = sqlSelect + sqlTail + " LIMIT " + strconv.Itoa(batchSize) + ", " + strconv.Itoa(start)
|
sqlCmd = sqlSelect + sqlTail + " LIMIT " + strconv.Itoa(batchSize) + ", " + strconv.Itoa(start)
|
||||||
case setting.Database.UsePostgreSQL:
|
case setting.Database.Type.IsPostgreSQL():
|
||||||
fallthrough
|
fallthrough
|
||||||
case setting.Database.UseSQLite3:
|
case setting.Database.Type.IsSQLite3():
|
||||||
sqlCmd = sqlSelect + sqlTail + " LIMIT " + strconv.Itoa(batchSize) + " OFFSET " + strconv.Itoa(start)
|
sqlCmd = sqlSelect + sqlTail + " LIMIT " + strconv.Itoa(batchSize) + " OFFSET " + strconv.Itoa(start)
|
||||||
case setting.Database.UseMSSQL:
|
case setting.Database.Type.IsMSSQL():
|
||||||
sqlCmd = "SELECT TOP " + strconv.Itoa(batchSize) + " * FROM #temp_comments WHERE " +
|
sqlCmd = "SELECT TOP " + strconv.Itoa(batchSize) + " * FROM #temp_comments WHERE " +
|
||||||
"(id NOT IN ( SELECT TOP " + strconv.Itoa(start) + " id FROM #temp_comments ORDER BY id )) ORDER BY id"
|
"(id NOT IN ( SELECT TOP " + strconv.Itoa(start) + " id FROM #temp_comments ORDER BY id )) ORDER BY id"
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -14,7 +14,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func FixPostgresIDSequences(x *xorm.Engine) error {
|
func FixPostgresIDSequences(x *xorm.Engine) error {
|
||||||
if !setting.Database.UsePostgreSQL {
|
if !setting.Database.Type.IsPostgreSQL() {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,11 +54,11 @@ func RenameTaskErrorsToMessage(x *xorm.Engine) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case setting.Database.UseMySQL:
|
case setting.Database.Type.IsMySQL():
|
||||||
if _, err := sess.Exec("ALTER TABLE `task` CHANGE errors message text"); err != nil {
|
if _, err := sess.Exec("ALTER TABLE `task` CHANGE errors message text"); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
case setting.Database.UseMSSQL:
|
case setting.Database.Type.IsMSSQL():
|
||||||
if _, err := sess.Exec("sp_rename 'task.errors', 'message', 'COLUMN'"); err != nil {
|
if _, err := sess.Exec("sp_rename 'task.errors', 'message', 'COLUMN'"); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ func AlterIssueAndCommentTextFieldsToLongText(x *xorm.Engine) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if setting.Database.UseMySQL {
|
if setting.Database.Type.IsMySQL() {
|
||||||
if _, err := sess.Exec("ALTER TABLE `issue` CHANGE `content` `content` LONGTEXT"); err != nil {
|
if _, err := sess.Exec("ALTER TABLE `issue` CHANGE `content` `content` LONGTEXT"); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ func AlterHookTaskTextFieldsToLongText(x *xorm.Engine) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if setting.Database.UseMySQL {
|
if setting.Database.Type.IsMySQL() {
|
||||||
if _, err := sess.Exec("ALTER TABLE `hook_task` CHANGE `payload_content` `payload_content` LONGTEXT, CHANGE `request_content` `request_content` LONGTEXT, change `response_content` `response_content` LONGTEXT"); err != nil {
|
if _, err := sess.Exec("ALTER TABLE `hook_task` CHANGE `payload_content` `payload_content` LONGTEXT, CHANGE `request_content` `request_content` LONGTEXT, change `response_content` `response_content` LONGTEXT"); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,7 @@ func (*improveActionTableIndicesAction) TableIndices() []*schemas.Index {
|
||||||
actUserIndex := schemas.NewIndex("au_r_c_u_d", schemas.IndexType)
|
actUserIndex := schemas.NewIndex("au_r_c_u_d", schemas.IndexType)
|
||||||
actUserIndex.AddColumn("act_user_id", "repo_id", "created_unix", "user_id", "is_deleted")
|
actUserIndex.AddColumn("act_user_id", "repo_id", "created_unix", "user_id", "is_deleted")
|
||||||
indices := []*schemas.Index{actUserIndex, repoIndex}
|
indices := []*schemas.Index{actUserIndex, repoIndex}
|
||||||
if setting.Database.UsePostgreSQL {
|
if setting.Database.Type.IsPostgreSQL() {
|
||||||
cudIndex := schemas.NewIndex("c_u_d", schemas.IndexType)
|
cudIndex := schemas.NewIndex("c_u_d", schemas.IndexType)
|
||||||
cudIndex.AddColumn("created_unix", "user_id", "is_deleted")
|
cudIndex.AddColumn("created_unix", "user_id", "is_deleted")
|
||||||
indices = append(indices, cudIndex)
|
indices = append(indices, cudIndex)
|
||||||
|
|
|
@ -65,11 +65,11 @@ func RenameCredentialIDBytes(x *xorm.Engine) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case setting.Database.UseMySQL:
|
case setting.Database.Type.IsMySQL():
|
||||||
if _, err := sess.Exec("ALTER TABLE `webauthn_credential` CHANGE credential_id_bytes credential_id VARBINARY(1024)"); err != nil {
|
if _, err := sess.Exec("ALTER TABLE `webauthn_credential` CHANGE credential_id_bytes credential_id VARBINARY(1024)"); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
case setting.Database.UseMSSQL:
|
case setting.Database.Type.IsMSSQL():
|
||||||
if _, err := sess.Exec("sp_rename 'webauthn_credential.credential_id_bytes', 'credential_id', 'COLUMN'"); err != nil {
|
if _, err := sess.Exec("sp_rename 'webauthn_credential.credential_id_bytes', 'credential_id', 'COLUMN'"); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ func AlterPublicGPGKeyContentFieldsToMediumText(x *xorm.Engine) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if setting.Database.UseMySQL {
|
if setting.Database.Type.IsMySQL() {
|
||||||
if _, err := sess.Exec("ALTER TABLE `gpg_key` CHANGE `content` `content` MEDIUMTEXT"); err != nil {
|
if _, err := sess.Exec("ALTER TABLE `gpg_key` CHANGE `content` `content` MEDIUMTEXT"); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ func AlterPackageVersionMetadataToLongText(x *xorm.Engine) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if setting.Database.UseMySQL {
|
if setting.Database.Type.IsMySQL() {
|
||||||
if _, err := sess.Exec("ALTER TABLE `package_version` MODIFY COLUMN `metadata_json` LONGTEXT"); err != nil {
|
if _, err := sess.Exec("ALTER TABLE `package_version` MODIFY COLUMN `metadata_json` LONGTEXT"); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ func AlterPublicGPGKeyImportContentFieldToMediumText(x *xorm.Engine) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if setting.Database.UseMySQL {
|
if setting.Database.Type.IsMySQL() {
|
||||||
if _, err := sess.Exec("ALTER TABLE `gpg_key_import` CHANGE `content` `content` MEDIUMTEXT"); err != nil {
|
if _, err := sess.Exec("ALTER TABLE `gpg_key_import` CHANGE `content` `content` MEDIUMTEXT"); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -416,7 +416,7 @@ func DeleteProjectByID(ctx context.Context, id int64) error {
|
||||||
|
|
||||||
func DeleteProjectByRepoID(ctx context.Context, repoID int64) error {
|
func DeleteProjectByRepoID(ctx context.Context, repoID int64) error {
|
||||||
switch {
|
switch {
|
||||||
case setting.Database.UseSQLite3:
|
case setting.Database.Type.IsSQLite3():
|
||||||
if _, err := db.GetEngine(ctx).Exec("DELETE FROM project_issue WHERE project_issue.id IN (SELECT project_issue.id FROM project_issue INNER JOIN project WHERE project.id = project_issue.project_id AND project.repo_id = ?)", repoID); err != nil {
|
if _, err := db.GetEngine(ctx).Exec("DELETE FROM project_issue WHERE project_issue.id IN (SELECT project_issue.id FROM project_issue INNER JOIN project WHERE project.id = project_issue.project_id AND project.repo_id = ?)", repoID); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -426,7 +426,7 @@ func DeleteProjectByRepoID(ctx context.Context, repoID int64) error {
|
||||||
if _, err := db.GetEngine(ctx).Table("project").Where("repo_id = ? ", repoID).Delete(&Project{}); err != nil {
|
if _, err := db.GetEngine(ctx).Table("project").Where("repo_id = ? ", repoID).Delete(&Project{}); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
case setting.Database.UsePostgreSQL:
|
case setting.Database.Type.IsPostgreSQL():
|
||||||
if _, err := db.GetEngine(ctx).Exec("DELETE FROM project_issue USING project WHERE project.id = project_issue.project_id AND project.repo_id = ? ", repoID); err != nil {
|
if _, err := db.GetEngine(ctx).Exec("DELETE FROM project_issue USING project WHERE project.id = project_issue.project_id AND project.repo_id = ? ", repoID); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -498,7 +498,7 @@ func SearchRepositoryCondition(opts *SearchRepoOptions) builder.Cond {
|
||||||
subQueryCond := builder.NewCond()
|
subQueryCond := builder.NewCond()
|
||||||
|
|
||||||
// Topic checking. Topics are present.
|
// Topic checking. Topics are present.
|
||||||
if setting.Database.UsePostgreSQL { // postgres stores the topics as json and not as text
|
if setting.Database.Type.IsPostgreSQL() { // postgres stores the topics as json and not as text
|
||||||
subQueryCond = subQueryCond.Or(builder.And(builder.NotNull{"topics"}, builder.Neq{"(topics)::text": "[]"}))
|
subQueryCond = subQueryCond.Or(builder.And(builder.NotNull{"topics"}, builder.Neq{"(topics)::text": "[]"}))
|
||||||
} else {
|
} else {
|
||||||
subQueryCond = subQueryCond.Or(builder.And(builder.Neq{"topics": "null"}, builder.Neq{"topics": "[]"}))
|
subQueryCond = subQueryCond.Or(builder.And(builder.Neq{"topics": "null"}, builder.Neq{"topics": "[]"}))
|
||||||
|
|
|
@ -76,7 +76,7 @@ func MainTest(m *testing.M, testOpts *TestOptions) {
|
||||||
setting.SSH.BuiltinServerUser = "builtinuser"
|
setting.SSH.BuiltinServerUser = "builtinuser"
|
||||||
setting.SSH.Port = 3000
|
setting.SSH.Port = 3000
|
||||||
setting.SSH.Domain = "try.gitea.io"
|
setting.SSH.Domain = "try.gitea.io"
|
||||||
setting.Database.UseSQLite3 = true
|
setting.Database.Type = "sqlite3"
|
||||||
setting.Repository.DefaultBranch = "master" // many test code still assume that default branch is called "master"
|
setting.Repository.DefaultBranch = "master" // many test code still assume that default branch is called "master"
|
||||||
repoRootPath, err := os.MkdirTemp(os.TempDir(), "repos")
|
repoRootPath, err := os.MkdirTemp(os.TempDir(), "repos")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -155,7 +155,7 @@ func checkDBConsistency(ctx context.Context, logger log.Logger, autofix bool) er
|
||||||
|
|
||||||
// TODO: function to recalc all counters
|
// TODO: function to recalc all counters
|
||||||
|
|
||||||
if setting.Database.UsePostgreSQL {
|
if setting.Database.Type.IsPostgreSQL() {
|
||||||
consistencyChecks = append(consistencyChecks, consistencyCheck{
|
consistencyChecks = append(consistencyChecks, consistencyCheck{
|
||||||
Name: "Sequence values",
|
Name: "Sequence values",
|
||||||
Counter: db.CountBadSequences,
|
Counter: db.CountBadSequences,
|
||||||
|
|
|
@ -27,7 +27,7 @@ var (
|
||||||
|
|
||||||
// Database holds the database settings
|
// Database holds the database settings
|
||||||
Database = struct {
|
Database = struct {
|
||||||
Type string
|
Type DatabaseType
|
||||||
Host string
|
Host string
|
||||||
Name string
|
Name string
|
||||||
User string
|
User string
|
||||||
|
@ -39,10 +39,6 @@ var (
|
||||||
Charset string
|
Charset string
|
||||||
Timeout int // seconds
|
Timeout int // seconds
|
||||||
SQLiteJournalMode string
|
SQLiteJournalMode string
|
||||||
UseSQLite3 bool
|
|
||||||
UseMySQL bool
|
|
||||||
UseMSSQL bool
|
|
||||||
UsePostgreSQL bool
|
|
||||||
DBConnectRetries int
|
DBConnectRetries int
|
||||||
DBConnectBackoff time.Duration
|
DBConnectBackoff time.Duration
|
||||||
MaxIdleConns int
|
MaxIdleConns int
|
||||||
|
@ -59,24 +55,13 @@ var (
|
||||||
// LoadDBSetting loads the database settings
|
// LoadDBSetting loads the database settings
|
||||||
func LoadDBSetting() {
|
func LoadDBSetting() {
|
||||||
sec := CfgProvider.Section("database")
|
sec := CfgProvider.Section("database")
|
||||||
Database.Type = sec.Key("DB_TYPE").String()
|
Database.Type = DatabaseType(sec.Key("DB_TYPE").String())
|
||||||
defaultCharset := "utf8"
|
defaultCharset := "utf8"
|
||||||
Database.UseMySQL = false
|
|
||||||
Database.UseSQLite3 = false
|
|
||||||
Database.UsePostgreSQL = false
|
|
||||||
Database.UseMSSQL = false
|
|
||||||
|
|
||||||
switch Database.Type {
|
if Database.Type.IsMySQL() {
|
||||||
case "sqlite3":
|
|
||||||
Database.UseSQLite3 = true
|
|
||||||
case "mysql":
|
|
||||||
Database.UseMySQL = true
|
|
||||||
defaultCharset = "utf8mb4"
|
defaultCharset = "utf8mb4"
|
||||||
case "postgres":
|
|
||||||
Database.UsePostgreSQL = true
|
|
||||||
case "mssql":
|
|
||||||
Database.UseMSSQL = true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Database.Host = sec.Key("HOST").String()
|
Database.Host = sec.Key("HOST").String()
|
||||||
Database.Name = sec.Key("NAME").String()
|
Database.Name = sec.Key("NAME").String()
|
||||||
Database.User = sec.Key("USER").String()
|
Database.User = sec.Key("USER").String()
|
||||||
|
@ -86,7 +71,7 @@ func LoadDBSetting() {
|
||||||
Database.Schema = sec.Key("SCHEMA").String()
|
Database.Schema = sec.Key("SCHEMA").String()
|
||||||
Database.SSLMode = sec.Key("SSL_MODE").MustString("disable")
|
Database.SSLMode = sec.Key("SSL_MODE").MustString("disable")
|
||||||
Database.Charset = sec.Key("CHARSET").In(defaultCharset, []string{"utf8", "utf8mb4"})
|
Database.Charset = sec.Key("CHARSET").In(defaultCharset, []string{"utf8", "utf8mb4"})
|
||||||
if Database.UseMySQL && defaultCharset != "utf8mb4" {
|
if Database.Type.IsMySQL() && defaultCharset != "utf8mb4" {
|
||||||
log.Error("Deprecated database mysql charset utf8 support, please use utf8mb4 or convert utf8 to utf8mb4.")
|
log.Error("Deprecated database mysql charset utf8 support, please use utf8mb4 or convert utf8 to utf8mb4.")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,7 +80,7 @@ func LoadDBSetting() {
|
||||||
Database.SQLiteJournalMode = sec.Key("SQLITE_JOURNAL_MODE").MustString("")
|
Database.SQLiteJournalMode = sec.Key("SQLITE_JOURNAL_MODE").MustString("")
|
||||||
|
|
||||||
Database.MaxIdleConns = sec.Key("MAX_IDLE_CONNS").MustInt(2)
|
Database.MaxIdleConns = sec.Key("MAX_IDLE_CONNS").MustInt(2)
|
||||||
if Database.UseMySQL {
|
if Database.Type.IsMySQL() {
|
||||||
Database.ConnMaxLifetime = sec.Key("CONN_MAX_LIFETIME").MustDuration(3 * time.Second)
|
Database.ConnMaxLifetime = sec.Key("CONN_MAX_LIFETIME").MustDuration(3 * time.Second)
|
||||||
} else {
|
} else {
|
||||||
Database.ConnMaxLifetime = sec.Key("CONN_MAX_LIFETIME").MustDuration(0)
|
Database.ConnMaxLifetime = sec.Key("CONN_MAX_LIFETIME").MustDuration(0)
|
||||||
|
@ -207,3 +192,25 @@ func ParseMSSQLHostPort(info string) (string, string) {
|
||||||
}
|
}
|
||||||
return host, port
|
return host, port
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type DatabaseType string
|
||||||
|
|
||||||
|
func (t DatabaseType) String() string {
|
||||||
|
return string(t)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t DatabaseType) IsSQLite3() bool {
|
||||||
|
return t == "sqlite3"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t DatabaseType) IsMySQL() bool {
|
||||||
|
return t == "mysql"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t DatabaseType) IsMSSQL() bool {
|
||||||
|
return t == "mssql"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t DatabaseType) IsPostgreSQL() bool {
|
||||||
|
return t == "postgres"
|
||||||
|
}
|
||||||
|
|
|
@ -141,7 +141,7 @@ func GlobalInitInstalled(ctx context.Context) {
|
||||||
|
|
||||||
if setting.EnableSQLite3 {
|
if setting.EnableSQLite3 {
|
||||||
log.Info("SQLite3 support is enabled")
|
log.Info("SQLite3 support is enabled")
|
||||||
} else if setting.Database.UseSQLite3 {
|
} else if setting.Database.Type.IsSQLite3() {
|
||||||
log.Fatal("SQLite3 support is disabled, but it is used for database setting. Please get or build a Gitea release with SQLite3 support.")
|
log.Fatal("SQLite3 support is disabled, but it is used for database setting. Please get or build a Gitea release with SQLite3 support.")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -104,7 +104,7 @@ func Install(ctx *context.Context) {
|
||||||
form.DbSchema = setting.Database.Schema
|
form.DbSchema = setting.Database.Schema
|
||||||
form.Charset = setting.Database.Charset
|
form.Charset = setting.Database.Charset
|
||||||
|
|
||||||
curDBType := setting.Database.Type
|
curDBType := setting.Database.Type.String()
|
||||||
var isCurDBTypeSupported bool
|
var isCurDBTypeSupported bool
|
||||||
for _, dbType := range setting.SupportedDatabaseTypes {
|
for _, dbType := range setting.SupportedDatabaseTypes {
|
||||||
if dbType == curDBType {
|
if dbType == curDBType {
|
||||||
|
@ -272,7 +272,7 @@ func SubmitInstall(ctx *context.Context) {
|
||||||
// ---- Basic checks are passed, now test configuration.
|
// ---- Basic checks are passed, now test configuration.
|
||||||
|
|
||||||
// Test database setting.
|
// Test database setting.
|
||||||
setting.Database.Type = form.DbType
|
setting.Database.Type = setting.DatabaseType(form.DbType)
|
||||||
setting.Database.Host = form.DbHost
|
setting.Database.Host = form.DbHost
|
||||||
setting.Database.User = form.DbUser
|
setting.Database.User = form.DbUser
|
||||||
setting.Database.Passwd = form.DbPasswd
|
setting.Database.Passwd = form.DbPasswd
|
||||||
|
@ -392,7 +392,7 @@ func SubmitInstall(ctx *context.Context) {
|
||||||
log.Error("Failed to load custom conf '%s': %v", setting.CustomConf, err)
|
log.Error("Failed to load custom conf '%s': %v", setting.CustomConf, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cfg.Section("database").Key("DB_TYPE").SetValue(setting.Database.Type)
|
cfg.Section("database").Key("DB_TYPE").SetValue(setting.Database.Type.String())
|
||||||
cfg.Section("database").Key("HOST").SetValue(setting.Database.Host)
|
cfg.Section("database").Key("HOST").SetValue(setting.Database.Host)
|
||||||
cfg.Section("database").Key("NAME").SetValue(setting.Database.Name)
|
cfg.Section("database").Key("NAME").SetValue(setting.Database.Name)
|
||||||
cfg.Section("database").Key("USER").SetValue(setting.Database.User)
|
cfg.Section("database").Key("USER").SetValue(setting.Database.User)
|
||||||
|
|
|
@ -100,7 +100,7 @@ func checkDatabase(checks checks) status {
|
||||||
st.Time = getCheckTime()
|
st.Time = getCheckTime()
|
||||||
}
|
}
|
||||||
|
|
||||||
if setting.Database.UseSQLite3 && st.Status == pass {
|
if setting.Database.Type.IsSQLite3() && st.Status == pass {
|
||||||
if !setting.EnableSQLite3 {
|
if !setting.EnableSQLite3 {
|
||||||
st.Status = fail
|
st.Status = fail
|
||||||
st.Time = getCheckTime()
|
st.Time = getCheckTime()
|
||||||
|
|
|
@ -19,7 +19,7 @@ import (
|
||||||
|
|
||||||
func TestExternalMarkupRenderer(t *testing.T) {
|
func TestExternalMarkupRenderer(t *testing.T) {
|
||||||
defer tests.PrepareTestEnv(t)()
|
defer tests.PrepareTestEnv(t)()
|
||||||
if !setting.Database.UseSQLite3 {
|
if !setting.Database.Type.IsSQLite3() {
|
||||||
t.Skip()
|
t.Skip()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,7 +94,7 @@ func availableVersions() ([]string, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer migrationsDir.Close()
|
defer migrationsDir.Close()
|
||||||
versionRE, err := regexp.Compile("gitea-v(?P<version>.+)\\." + regexp.QuoteMeta(setting.Database.Type) + "\\.sql.gz")
|
versionRE, err := regexp.Compile("gitea-v(?P<version>.+)\\." + regexp.QuoteMeta(setting.Database.Type.String()) + "\\.sql.gz")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -149,7 +149,7 @@ func restoreOldDB(t *testing.T, version string) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case setting.Database.UseSQLite3:
|
case setting.Database.Type.IsSQLite3():
|
||||||
util.Remove(setting.Database.Path)
|
util.Remove(setting.Database.Path)
|
||||||
err := os.MkdirAll(path.Dir(setting.Database.Path), os.ModePerm)
|
err := os.MkdirAll(path.Dir(setting.Database.Path), os.ModePerm)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
@ -162,7 +162,7 @@ func restoreOldDB(t *testing.T, version string) bool {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
db.Close()
|
db.Close()
|
||||||
|
|
||||||
case setting.Database.UseMySQL:
|
case setting.Database.Type.IsMySQL():
|
||||||
db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s)/",
|
db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s)/",
|
||||||
setting.Database.User, setting.Database.Passwd, setting.Database.Host))
|
setting.Database.User, setting.Database.Passwd, setting.Database.Host))
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
@ -184,7 +184,7 @@ func restoreOldDB(t *testing.T, version string) bool {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
db.Close()
|
db.Close()
|
||||||
|
|
||||||
case setting.Database.UsePostgreSQL:
|
case setting.Database.Type.IsPostgreSQL():
|
||||||
var db *sql.DB
|
var db *sql.DB
|
||||||
var err error
|
var err error
|
||||||
if setting.Database.Host[0] == '/' {
|
if setting.Database.Host[0] == '/' {
|
||||||
|
@ -252,7 +252,7 @@ func restoreOldDB(t *testing.T, version string) bool {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
db.Close()
|
db.Close()
|
||||||
|
|
||||||
case setting.Database.UseMSSQL:
|
case setting.Database.Type.IsMSSQL():
|
||||||
host, port := setting.ParseMSSQLHostPort(setting.Database.Host)
|
host, port := setting.ParseMSSQLHostPort(setting.Database.Host)
|
||||||
db, err := sql.Open("mssql", fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;",
|
db, err := sql.Open("mssql", fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;",
|
||||||
host, port, "master", setting.Database.User, setting.Database.Passwd))
|
host, port, "master", setting.Database.User, setting.Database.Passwd))
|
||||||
|
|
|
@ -72,7 +72,7 @@ func InitTest(requireGitea bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case setting.Database.UseMySQL:
|
case setting.Database.Type.IsMySQL():
|
||||||
connType := "tcp"
|
connType := "tcp"
|
||||||
if len(setting.Database.Host) > 0 && setting.Database.Host[0] == '/' { // looks like a unix socket
|
if len(setting.Database.Host) > 0 && setting.Database.Host[0] == '/' { // looks like a unix socket
|
||||||
connType = "unix"
|
connType = "unix"
|
||||||
|
@ -87,7 +87,7 @@ func InitTest(requireGitea bool) {
|
||||||
if _, err = db.Exec(fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s", setting.Database.Name)); err != nil {
|
if _, err = db.Exec(fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s", setting.Database.Name)); err != nil {
|
||||||
log.Fatal("db.Exec: %v", err)
|
log.Fatal("db.Exec: %v", err)
|
||||||
}
|
}
|
||||||
case setting.Database.UsePostgreSQL:
|
case setting.Database.Type.IsPostgreSQL():
|
||||||
var db *sql.DB
|
var db *sql.DB
|
||||||
var err error
|
var err error
|
||||||
if setting.Database.Host[0] == '/' {
|
if setting.Database.Host[0] == '/' {
|
||||||
|
@ -144,7 +144,7 @@ func InitTest(requireGitea bool) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case setting.Database.UseMSSQL:
|
case setting.Database.Type.IsMSSQL():
|
||||||
host, port := setting.ParseMSSQLHostPort(setting.Database.Host)
|
host, port := setting.ParseMSSQLHostPort(setting.Database.Host)
|
||||||
db, err := sql.Open("mssql", fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;",
|
db, err := sql.Open("mssql", fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;",
|
||||||
host, port, "master", setting.Database.User, setting.Database.Passwd))
|
host, port, "master", setting.Database.User, setting.Database.Passwd))
|
||||||
|
|
Loading…
Reference in a new issue