1
0
Fork 0
mirror of https://github.com/Eggbertx/gochan.git synced 2025-08-18 11:46:23 -07:00

Implement in-place announcement migration

This commit is contained in:
Eggbertx 2025-01-26 17:01:27 -08:00
parent d3c985bd50
commit 5c4e200631
2 changed files with 77 additions and 2 deletions

View file

@ -8,12 +8,85 @@ import (
"github.com/gochan-org/gochan/pkg/gcsql"
)
func (*Pre2021Migrator) migrateAnnouncementsInPlace() error {
return common.NewMigrationError("pre2021", "migrateAnnouncementsInPlace not implemented")
func (m *Pre2021Migrator) migrateAnnouncementsInPlace() error {
errEv := common.LogError()
defer errEv.Discard()
if _, err := gcsql.ExecSQL(announcementsAlterStatement); err != nil {
errEv.Err(err).Caller().Msg("Failed to alter announcements table")
return err
}
var staffIDs []int
rows, err := m.db.QuerySQL("SELECT id FROM DBPREFIXstaff")
if err != nil {
errEv.Err(err).Caller().Msg("Failed to get staff IDs")
return err
}
defer rows.Close()
for rows.Next() {
var id int
if err = rows.Scan(&id); err != nil {
errEv.Err(err).Caller().Msg("Failed to scan staff ID")
return err
}
staffIDs = append(staffIDs, id)
}
if err = rows.Close(); err != nil {
errEv.Err(err).Caller().Msg("Failed to close staff ID rows")
return err
}
m.migrationUser, err = m.getMigrationUser(errEv)
if err != nil {
errEv.Err(err).Caller().Msg("Failed to get migration user")
return err
}
rows, err = m.db.QuerySQL("SELECT poster FROM DBPREFIXannouncements")
if err != nil {
errEv.Err(err).Caller().Msg("Failed to get announcements")
return err
}
defer rows.Close()
var announcementPosters []string
for rows.Next() {
var poster string
if err = rows.Scan(&poster); err != nil {
errEv.Err(err).Caller().Msg("Failed to scan announcement row")
return err
}
announcementPosters = append(announcementPosters, poster)
}
if err = rows.Close(); err != nil {
errEv.Err(err).Caller().Msg("Failed to close announcement rows")
return err
}
for _, poster := range announcementPosters {
id, err := gcsql.GetStaffID(poster)
if errors.Is(err, gcsql.ErrUnrecognizedUsername) {
// user doesn't exist, use migration user
common.LogWarning().Str("staff", poster).Msg("Staff username not found in database")
id = m.migrationUser.ID
} else if err != nil {
errEv.Err(err).Caller().Str("staff", poster).Msg("Failed to get staff ID")
return err
}
if _, err = gcsql.ExecSQL("UPDATE DBPREFIXannouncements SET staff_id = ? WHERE poster = ?", id, poster); err != nil {
errEv.Err(err).Caller().Str("staff", poster).Msg("Failed to update announcement poster")
return err
}
}
return nil
}
func (m *Pre2021Migrator) migrateAnnouncementsToNewDB() error {
errEv := common.LogError()
defer errEv.Discard()
rows, err := m.db.QuerySQL(announcementsQuery)
if err != nil {
errEv.Err(err).Caller().Msg("Failed to get announcements")

View file

@ -20,6 +20,8 @@ bumped, stickied, locked FROM DBPREFIXposts WHERE deleted_timestamp IS NULL`
timestamp, expires, permaban, reason, type, staff_note, appeal_at, can_appeal FROM DBPREFIXbanlist`
announcementsQuery = "SELECT id, subject, message, poster, timestamp FROM DBPREFIXannouncements"
announcementsAlterStatement = "ALTER TABLE DBPREFIXannouncements ADD COLUMN staff_id INT NOT NULL DEFAULT 1"
)
var (