gitea源码

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package v1_15
  4. import (
  5. "strings"
  6. "xorm.io/xorm"
  7. )
  8. func AddPrimaryEmail2EmailAddress(x *xorm.Engine) error {
  9. type User struct {
  10. ID int64 `xorm:"pk autoincr"`
  11. Email string `xorm:"NOT NULL"`
  12. IsActive bool `xorm:"INDEX"` // Activate primary email
  13. }
  14. type EmailAddress1 struct {
  15. ID int64 `xorm:"pk autoincr"`
  16. UID int64 `xorm:"INDEX NOT NULL"`
  17. Email string `xorm:"UNIQUE NOT NULL"`
  18. LowerEmail string
  19. IsActivated bool
  20. IsPrimary bool `xorm:"DEFAULT(false) NOT NULL"`
  21. }
  22. // Add lower_email and is_primary columns
  23. if err := x.Table("email_address").Sync(new(EmailAddress1)); err != nil {
  24. return err
  25. }
  26. if _, err := x.Exec("UPDATE email_address SET lower_email=LOWER(email), is_primary=?", false); err != nil {
  27. return err
  28. }
  29. type EmailAddress struct {
  30. ID int64 `xorm:"pk autoincr"`
  31. UID int64 `xorm:"INDEX NOT NULL"`
  32. Email string `xorm:"UNIQUE NOT NULL"`
  33. LowerEmail string `xorm:"UNIQUE NOT NULL"`
  34. IsActivated bool
  35. IsPrimary bool `xorm:"DEFAULT(false) NOT NULL"`
  36. }
  37. // change lower_email as unique
  38. if err := x.Sync(new(EmailAddress)); err != nil {
  39. return err
  40. }
  41. sess := x.NewSession()
  42. defer sess.Close()
  43. const batchSize = 100
  44. for start := 0; ; start += batchSize {
  45. users := make([]*User, 0, batchSize)
  46. if err := sess.Limit(batchSize, start).Find(&users); err != nil {
  47. return err
  48. }
  49. if len(users) == 0 {
  50. break
  51. }
  52. for _, user := range users {
  53. exist, err := sess.Where("email=?", user.Email).Table("email_address").Exist()
  54. if err != nil {
  55. return err
  56. }
  57. if !exist {
  58. if _, err := sess.Insert(&EmailAddress{
  59. UID: user.ID,
  60. Email: user.Email,
  61. LowerEmail: strings.ToLower(user.Email),
  62. IsActivated: user.IsActive,
  63. IsPrimary: true,
  64. }); err != nil {
  65. return err
  66. }
  67. } else {
  68. if _, err := sess.Where("email=?", user.Email).Cols("is_primary").Update(&EmailAddress{
  69. IsPrimary: true,
  70. }); err != nil {
  71. return err
  72. }
  73. }
  74. }
  75. }
  76. return nil
  77. }