You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

v175.go 1.5KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package v1_14 //nolint
  4. import (
  5. "fmt"
  6. "regexp"
  7. "code.gitea.io/gitea/modules/log"
  8. "code.gitea.io/gitea/modules/setting"
  9. "xorm.io/xorm"
  10. )
  11. func FixPostgresIDSequences(x *xorm.Engine) error {
  12. if !setting.Database.Type.IsPostgreSQL() {
  13. return nil
  14. }
  15. sess := x.NewSession()
  16. defer sess.Close()
  17. if err := sess.Begin(); err != nil {
  18. return err
  19. }
  20. var sequences []string
  21. schema := sess.Engine().Dialect().URI().Schema
  22. sess.Engine().SetSchema("")
  23. 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 {
  24. log.Error("Unable to find sequences: %v", err)
  25. return err
  26. }
  27. sess.Engine().SetSchema(schema)
  28. sequenceRegexp := regexp.MustCompile(`tmp_recreate__(\w+)_id_seq.*`)
  29. for _, sequence := range sequences {
  30. tableName := sequenceRegexp.FindStringSubmatch(sequence)[1]
  31. newSequenceName := tableName + "_id_seq"
  32. if _, err := sess.Exec(fmt.Sprintf("ALTER SEQUENCE `%s` RENAME TO `%s`", sequence, newSequenceName)); err != nil {
  33. log.Error("Unable to rename %s to %s. Error: %v", sequence, newSequenceName, err)
  34. return err
  35. }
  36. if _, err := sess.Exec(fmt.Sprintf("SELECT setval('%s', COALESCE((SELECT MAX(id)+1 FROM `%s`), 1), false)", newSequenceName, tableName)); err != nil {
  37. log.Error("Unable to reset sequence %s for %s. Error: %v", newSequenceName, tableName, err)
  38. return err
  39. }
  40. }
  41. return sess.Commit()
  42. }