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

Fully refactor all (or at least most) uses of ExecSQL, QuerySQL, and QueryRowSQL, QueryContextSQL, etc with their replacement functions

This commit is contained in:
Eggbertx 2025-02-05 23:32:12 -08:00
parent 10e0da4492
commit 7ceda2b218
17 changed files with 79 additions and 52 deletions

View file

@ -88,7 +88,7 @@ func RunSQLFile(path string, db *gcsql.GCDB) error {
for _, statement := range sqlArr {
statement = strings.TrimSpace(statement)
if len(statement) > 0 {
if _, err = db.ExecSQL(statement); err != nil {
if _, err = db.Exec(nil, statement); err != nil {
return err
}
}

View file

@ -36,7 +36,7 @@ func (dbu *GCDatabaseUpdater) Init(options *common.MigrationOptions) error {
func (dbu *GCDatabaseUpdater) IsMigrated() (bool, error) {
var currentDatabaseVersion int
err := dbu.db.QueryRowSQL(`SELECT version FROM DBPREFIXdatabase_version WHERE component = 'gochan'`, nil,
err := dbu.db.QueryRow(nil, "SELECT version FROM DBPREFIXdatabase_version WHERE component = 'gochan'", nil,
[]any{&currentDatabaseVersion})
if err != nil {
return false, err

View file

@ -16,7 +16,7 @@ func (m *Pre2021Migrator) MigrateAnnouncements() error {
errEv := common.LogError()
defer errEv.Discard()
rows, err := m.db.QuerySQL(announcementsQuery)
rows, err := m.db.Query(nil, announcementsQuery)
if err != nil {
errEv.Err(err).Caller().Msg("Failed to get announcements")
return err
@ -49,7 +49,7 @@ func (m *Pre2021Migrator) MigrateAnnouncements() error {
errEv.Err(err).Caller().Str("staff", announcement.oldPoster).Msg("Failed to get staff ID")
return err
}
if _, err = gcsql.ExecSQL(
if _, err = gcsql.Exec(nil,
"INSERT INTO DBPREFIXannouncements(staff_id,subject,message,timestamp) values(?,?,?,?)",
announcement.StaffID, announcement.Subject, announcement.Message, announcement.Timestamp,
); err != nil {

View file

@ -27,6 +27,6 @@ func TestMigrateAnnouncements(t *testing.T) {
}
var numAnnouncements int
assert.NoError(t, gcsql.QueryRowSQL("SELECT COUNT(*) FROM DBPREFIXannouncements WHERE staff_id > 0", nil, []any{&numAnnouncements}))
assert.NoError(t, gcsql.QueryRow(nil, "SELECT COUNT(*) FROM DBPREFIXannouncements WHERE staff_id > 0", nil, []any{&numAnnouncements}))
assert.Equal(t, 2, numAnnouncements, "Expected to have two announcement")
}

View file

@ -53,7 +53,7 @@ func (m *Pre2021Migrator) migrateBansInPlace() error {
for _, stmt := range statements {
stmt = strings.TrimSpace(stmt)
if strings.HasPrefix(stmt, "CREATE TABLE DBPREFIXip_ban") || strings.HasPrefix(stmt, "CREATE TABLE DBPREFIXfilter") {
_, err = gcsql.ExecSQL(stmt)
_, err = gcsql.Exec(nil, stmt)
if err != nil {
errEv.Err(err).Caller().
Str("statement", stmt).
@ -99,7 +99,7 @@ func (m *Pre2021Migrator) migrateBansToNewDB() error {
}
defer tx.Rollback()
rows, err := m.db.QuerySQL(bansQuery)
rows, err := m.db.Query(nil, bansQuery)
if err != nil {
errEv.Err(err).Caller().Msg("Failed to get bans")
return err

View file

@ -42,7 +42,7 @@ func validateBanMigration(t *testing.T) {
assert.NotZero(t, bans[0].StaffID, "Expected ban staff ID field to be set")
var numInvalidBans int
assert.NoError(t, gcsql.QueryRowSQL("SELECT COUNT(*) FROM DBPREFIXip_ban WHERE message = ?", []any{"Full ban on 8.8.0.0/16"}, []any{&numInvalidBans}))
assert.NoError(t, gcsql.QueryRow(nil, "SELECT COUNT(*) FROM DBPREFIXip_ban WHERE message = ?", []any{"Full ban on 8.8.0.0/16"}, []any{&numInvalidBans}))
assert.Equal(t, 0, numInvalidBans, "Expected the invalid test to not be migrated")
filters, err := gcsql.GetAllFilters(gcsql.TrueOrFalse)

View file

@ -19,7 +19,7 @@ func TestMigratePosts(t *testing.T) {
}
var numThreads int
if !assert.NoError(t, migrator.db.QueryRowSQL("SELECT COUNT(*) FROM DBPREFIXposts WHERE parentid = 0 AND deleted_timestamp IS NULL", nil, []any{&numThreads}), "Failed to get number of threads") {
if !assert.NoError(t, migrator.db.QueryRow(nil, "SELECT COUNT(*) FROM DBPREFIXposts WHERE parentid = 0 AND deleted_timestamp IS NULL", nil, []any{&numThreads}), "Failed to get number of threads") {
t.FailNow()
}
assert.Equal(t, 2, numThreads, "Expected to have two threads pre-migration")
@ -32,27 +32,27 @@ func TestMigratePosts(t *testing.T) {
func validatePostMigration(t *testing.T) {
var numThreads int
if !assert.NoError(t, gcsql.QueryRowSQL("SELECT COUNT(*) FROM DBPREFIXthreads", nil, []any{&numThreads}), "Failed to get number of threads") {
if !assert.NoError(t, gcsql.QueryRow(nil, "SELECT COUNT(*) FROM DBPREFIXthreads", nil, []any{&numThreads}), "Failed to get number of threads") {
t.FailNow()
}
assert.Equal(t, 2, numThreads, "Expected to have two threads pre-migration")
var numUploadPosts int
assert.NoError(t, gcsql.QueryRowSQL("SELECT COUNT(*) FROM DBPREFIXfiles", nil, []any{&numUploadPosts}))
assert.NoError(t, gcsql.QueryRow(nil, "SELECT COUNT(*) FROM DBPREFIXfiles", nil, []any{&numUploadPosts}))
assert.Equal(t, 1, numUploadPosts, "Expected to have 1 upload post")
var ip string
assert.NoError(t, gcsql.QueryRowSQL("SELECT IP_NTOA FROM DBPREFIXposts WHERE id = 1", nil, []any{&ip}))
assert.NoError(t, gcsql.QueryRow(nil, "SELECT IP_NTOA FROM DBPREFIXposts WHERE id = 1", nil, []any{&ip}))
assert.Equal(t, "192.168.56.1", ip, "Expected to have the correct IP address")
var numMigratedThreads int
if !assert.NoError(t, gcsql.QueryRowSQL("SELECT COUNT(*) FROM DBPREFIXthreads", nil, []any{&numMigratedThreads}), "Failed to get number of migrated threads") {
if !assert.NoError(t, gcsql.QueryRow(nil, "SELECT COUNT(*) FROM DBPREFIXthreads", nil, []any{&numMigratedThreads}), "Failed to get number of migrated threads") {
t.FailNow()
}
assert.Equal(t, 2, numMigratedThreads, "Expected to have three migrated threads")
var locked bool
if !assert.NoError(t, gcsql.QueryRowSQL("SELECT locked FROM DBPREFIXthreads WHERE id = 1", nil, []any{&locked})) {
if !assert.NoError(t, gcsql.QueryRow(nil, "SELECT locked FROM DBPREFIXthreads WHERE id = 1", nil, []any{&locked})) {
t.FailNow()
}
assert.True(t, locked, "Expected thread ID 1 to be locked")

View file

@ -72,12 +72,12 @@ func (m *Pre2021Migrator) renameTablesForInPlace() error {
var err error
errEv := common.LogError()
defer errEv.Discard()
if _, err = m.db.ExecSQL("DROP TABLE DBPREFIXinfo"); err != nil {
if _, err = m.db.Exec(nil, "DROP TABLE DBPREFIXinfo"); err != nil {
errEv.Err(err).Caller().Msg("Error dropping info table")
return err
}
for _, table := range renameTables {
if _, err = m.db.ExecSQL(fmt.Sprintf(renameTableStatementTemplate, table, table)); err != nil {
if _, err = m.db.Exec(nil, fmt.Sprintf(renameTableStatementTemplate, table, table)); err != nil {
errEv.Caller().Err(err).
Str("table", table).
Msg("Error renaming table")

View file

@ -26,13 +26,13 @@ func (m *Pre2021Migrator) getMigrationUser(errEv *zerolog.Event) (*gcsql.Staff,
Username: "pre2021-migration" + gcutil.RandomString(8),
AddedOn: time.Now(),
}
_, err := gcsql.ExecSQL("INSERT INTO DBPREFIXstaff(username,password_checksum,global_rank,is_active) values(?,'',0,0)", user.Username)
_, err := gcsql.Exec(nil, "INSERT INTO DBPREFIXstaff(username,password_checksum,global_rank,is_active) values(?,'',0,0)", user.Username)
if err != nil {
errEv.Err(err).Caller().Str("username", user.Username).Msg("Failed to create migration user")
return nil, err
}
if err = gcsql.QueryRowSQL("SELECT id FROM DBPREFIXstaff WHERE username = ?", []any{user.Username}, []any{&user.ID}); err != nil {
if err = gcsql.QueryRow(nil, "SELECT id FROM DBPREFIXstaff WHERE username = ?", []any{user.Username}, []any{&user.ID}); err != nil {
errEv.Err(err).Caller().Str("username", user.Username).Msg("Failed to get migration user ID")
return nil, err
}
@ -50,7 +50,7 @@ func (m *Pre2021Migrator) MigrateStaff() error {
return err
}
rows, err := m.db.QuerySQL(staffQuery)
rows, err := m.db.Query(nil, staffQuery)
if err != nil {
errEv.Err(err).Caller().Msg("Failed to get ban rows")
return err
@ -73,7 +73,7 @@ func (m *Pre2021Migrator) MigrateStaff() error {
staff.ID = newStaff.ID
} else if errors.Is(err, gcsql.ErrUnrecognizedUsername) {
// staff doesn't exist, create it (with invalid checksum to be updated by the admin)
if _, err := gcsql.ExecSQL(
if _, err := gcsql.Exec(nil,
"INSERT INTO DBPREFIXstaff(username,password_checksum,global_rank,added_on,last_login,is_active) values(?,'',?,?,?,1)",
staff.Username, staff.Rank, staff.AddedOn, staff.LastLogin,
); err != nil {
@ -102,7 +102,7 @@ func (m *Pre2021Migrator) MigrateStaff() error {
Msg("Failed to get board ID")
return err
}
if _, err = gcsql.ExecSQL("INSERT INTO DBPREFIXboard_staff(board_id,staff_id) VALUES(?,?)", boardID, staff.ID); err != nil {
if _, err = gcsql.Exec(nil, "INSERT INTO DBPREFIXboard_staff(board_id,staff_id) VALUES(?,?)", boardID, staff.ID); err != nil {
errEv.Err(err).Caller().
Str("username", staff.Username).
Str("board", board).

View file

@ -125,16 +125,19 @@ func getAllPostsToDelete(postIDs []any, fileOnly bool) ([]delPost, []any, error)
query = "SELECT post_id, thread_id, op_id, is_top_post, filename, dir FROM DBPREFIXv_posts_to_delete WHERE post_id IN " +
setPart + " OR thread_id IN (SELECT thread_id from DBPREFIXposts op WHERE op_id IN " + setPart + " AND is_top_post)"
}
rows, err := gcsql.QuerySQL(query, params...)
rows, cancel, err := gcsql.QueryTimeoutSQL(nil, query, params...)
if err != nil {
return nil, nil, err
}
defer func() {
rows.Close()
cancel()
}()
var posts []delPost
var postIDsAny []any
for rows.Next() {
var post delPost
if err = rows.Scan(&post.postID, &post.threadID, &post.opID, &post.isOP, &post.filename, &post.boardDir); err != nil {
rows.Close()
return nil, nil, err
}
posts = append(posts, post)
@ -258,7 +261,7 @@ func validatePostPasswords(posts []any, passwordMD5 string) (bool, error) {
params = append(params, posts[p])
}
err := gcsql.QueryRowSQL(queryPosts, params, []any{&count})
err := gcsql.QueryRow(nil, queryPosts, params, []any{&count})
return count == len(posts), err
}
@ -281,21 +284,24 @@ func markPostsAsDeleted(posts []any, request *http.Request, writer http.Response
defer cancel()
tx, err := gcsql.BeginContextTx(ctx)
opts := &gcsql.RequestOptions{Context: ctx, Tx: tx, Cancel: cancel}
wantsJSON := serverutil.IsRequestingJSON(request)
if err != nil {
errEv.Err(err).Caller().Msg("Unable to start deletion transaction")
serveError(writer, "Unable to delete posts", http.StatusInternalServerError, wantsJSON, errEv.Err(err).Caller())
return false
}
defer tx.Rollback()
const postsError = "Unable to mark post(s) as deleted"
const threadsError = "Unable to mark thread(s) as deleted"
if _, err = gcsql.ExecTxSQL(tx, deletePostsSQL, posts...); err != nil {
const postsError = "Unable to delete post(s)"
const threadsError = "Unable to delete thread(s)"
if _, err = gcsql.Exec(opts, deletePostsSQL, posts...); err != nil {
serveError(writer, postsError, http.StatusInternalServerError, wantsJSON, errEv.Err(err).Caller())
return false
}
if _, err = gcsql.ExecTxSQL(tx, deleteThreadSQL, posts...); err != nil {
if _, err = gcsql.Exec(opts, deleteThreadSQL, posts...); err != nil {
errEv.Err(err).Caller().Msg("Unable to mark thread(s) as deleted")
serveError(writer, threadsError, http.StatusInternalServerError, wantsJSON, errEv.Err(err).Caller())
return false
}
@ -351,7 +357,7 @@ func deletePostFiles(posts []delPost, deleteIDs []any, permDelete bool, request
http.StatusInternalServerError, wantsJSON, errEv.Array("errors", errArr))
return false
}
_, err = gcsql.ExecSQL(deleteFilesSQL, deleteIDs...)
_, err = gcsql.ExecTimeoutSQL(nil, deleteFilesSQL, deleteIDs...)
if err != nil {
serveError(writer, "Unable to delete file entries from database",
http.StatusInternalServerError, wantsJSON, errEv.Err(err).Caller())