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

Fix database locked error in announcement migration

This commit is contained in:
Eggbertx 2025-02-02 15:35:57 -08:00
parent cbd1dd8a99
commit a38a519e4e
3 changed files with 22 additions and 31 deletions

View file

@ -2,12 +2,16 @@ package pre2021
import (
"errors"
"time"
"github.com/gochan-org/gochan/cmd/gochan-migration/internal/common"
"github.com/gochan-org/gochan/pkg/gcsql"
)
type migrationAnnouncement struct {
gcsql.Announcement
oldPoster string
}
func (m *Pre2021Migrator) MigrateAnnouncements() error {
errEv := common.LogError()
defer errEv.Discard()
@ -23,29 +27,33 @@ func (m *Pre2021Migrator) MigrateAnnouncements() error {
return err
}
var oldAnnouncements []migrationAnnouncement
for rows.Next() {
var id int
var subject, message, staff string
var timestamp time.Time
if err = rows.Scan(&id, &subject, &message, &staff, &timestamp); err != nil {
var announcement migrationAnnouncement
if err = rows.Scan(&announcement.ID, &announcement.Subject, &announcement.Message, &announcement.oldPoster, &announcement.Timestamp); err != nil {
errEv.Err(err).Caller().Msg("Failed to scan announcement row")
return err
}
staffID, err := gcsql.GetStaffID(staff)
oldAnnouncements = append(oldAnnouncements, announcement)
}
for _, announcement := range oldAnnouncements {
announcement.StaffID, err = gcsql.GetStaffID(announcement.oldPoster)
if errors.Is(err, gcsql.ErrUnrecognizedUsername) {
// user doesn't exist, use migration user
common.LogWarning().Str("staff", staff).Msg("Staff username not found in database")
message += "\n(originally by " + staff + ")"
staffID = m.migrationUser.ID
common.LogWarning().Str("staff", announcement.oldPoster).Msg("Staff username not found in database")
announcement.Message += "\n(originally by " + announcement.oldPoster + ")"
announcement.StaffID = m.migrationUser.ID
} else if err != nil {
errEv.Err(err).Caller().Str("staff", staff).Msg("Failed to get staff ID")
errEv.Err(err).Caller().Str("staff", announcement.oldPoster).Msg("Failed to get staff ID")
return err
}
if _, err = gcsql.ExecSQL(
"INSERT INTO DBPREFIXannouncements(staff_id,subject,message,timestamp) values(?,?,?,?)",
staffID, subject, message, timestamp,
announcement.StaffID, announcement.Subject, announcement.Message, announcement.Timestamp,
); err != nil {
errEv.Err(err).Caller().Str("staff", staff).Msg("Failed to migrate announcement")
errEv.Err(err).Caller().Str("staff", announcement.oldPoster).Msg("Failed to migrate announcement")
return err
}
}

View file

@ -25,23 +25,6 @@ timestamp, expires, permaban, reason, type, staff_note, appeal_at, can_appeal FR
)
var (
boardAlterStatements = []string{
"ALTER TABLE DBPREFIXboards RENAME COLUMN section TO section_id",
"ALTER TABLE DBPREFIXboards RENAME COLUMN list_order TO navbar_position",
"ALTER TABLE DBPREFIXboards RENAME COLUMN created_on TO created_at",
"ALTER TABLE DBPREFIXboards RENAME COLUMN anonymous TO anonymous_name",
"ALTER TABLE DBPREFIXboards RENAME COLUMN forced_anon TO force_anonymous",
"ALTER TABLE DBPREFIXboards RENAME COLUMN embeds_allowed TO allow_embeds",
"ALTER TABLE DBPREFIXboards ADD COLUMN uri VARCHAR(45) NOT NULL DEFAULT ''",
"ALTER TABLE DBPREFIXboards ADD COLUMN min_message_length SMALLINT NOT NULL DEFAULT 0",
"ALTER TABLE DBPREFIXboards ADD COLUMN max_threads SMALLINT NOT NULL DEFAULT 65535",
// the following statements don't work in SQLite since it doesn't support adding foreign keys after table creation.
// "in-place" migration support for SQLite may be removed
"ALTER TABLE DBPREFIXboards ADD CONSTRAINT boards_section_id_fk FOREIGN KEY (section_id) REFERENCES DBPREFIXsections(id)",
"ALTER TABLE DBPREFIXboards ADD CONSTRAINT boards_dir_unique UNIQUE (dir)",
"ALTER TABLE DBPREFIXboards ADD CONSTRAINT boards_uri_unique UNIQUE (uri)",
}
// tables to be renamed to _tmp_DBPREFIX* to work around SQLite's lack of support for changing/removing columns
renameTables = []string{
"DBPREFIXannouncements", "DBPREFIXappeals", "DBPREFIXbanlist", "DBPREFIXboards", "DBPREFIXembeds", "DBPREFIXlinks",

View file

@ -13,8 +13,8 @@ import (
// table: DBPREFIXannouncements
type Announcement struct {
ID uint // sql: id
StaffID uint // sql: staff_id
ID int // sql: id
StaffID int // sql: staff_id
Subject string // sql: subject
Message string // sql: message
Timestamp time.Time // sql: timestamp