code.gitea.io/gitea@v1.21.7/models/migrations/v1_14/v175.go (about) 1 // Copyright 2021 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package v1_14 //nolint 5 6 import ( 7 "fmt" 8 "regexp" 9 10 "code.gitea.io/gitea/modules/log" 11 "code.gitea.io/gitea/modules/setting" 12 13 "xorm.io/xorm" 14 ) 15 16 func FixPostgresIDSequences(x *xorm.Engine) error { 17 if !setting.Database.Type.IsPostgreSQL() { 18 return nil 19 } 20 21 sess := x.NewSession() 22 defer sess.Close() 23 if err := sess.Begin(); err != nil { 24 return err 25 } 26 27 var sequences []string 28 schema := sess.Engine().Dialect().URI().Schema 29 30 sess.Engine().SetSchema("") 31 if err := sess.Table("information_schema.sequences").Cols("sequence_name").Where("sequence_name LIKE 'tmp_recreate__%_id_seq%' AND sequence_catalog = ?", setting.Database.Name).Find(&sequences); err != nil { 32 log.Error("Unable to find sequences: %v", err) 33 return err 34 } 35 sess.Engine().SetSchema(schema) 36 37 sequenceRegexp := regexp.MustCompile(`tmp_recreate__(\w+)_id_seq.*`) 38 39 for _, sequence := range sequences { 40 tableName := sequenceRegexp.FindStringSubmatch(sequence)[1] 41 newSequenceName := tableName + "_id_seq" 42 if _, err := sess.Exec(fmt.Sprintf("ALTER SEQUENCE `%s` RENAME TO `%s`", sequence, newSequenceName)); err != nil { 43 log.Error("Unable to rename %s to %s. Error: %v", sequence, newSequenceName, err) 44 return err 45 } 46 if _, err := sess.Exec(fmt.Sprintf("SELECT setval('%s', COALESCE((SELECT MAX(id)+1 FROM `%s`), 1), false)", newSequenceName, tableName)); err != nil { 47 log.Error("Unable to reset sequence %s for %s. Error: %v", newSequenceName, tableName, err) 48 return err 49 } 50 } 51 52 return sess.Commit() 53 }