1
0
Fork 0
mirror of https://github.com/Eggbertx/gochan.git synced 2025-09-13 09:26:23 -07:00

Add timeouts to ban and board SQL operations

This commit is contained in:
Eggbertx 2024-05-31 11:37:09 -07:00
parent f5e7084263
commit 8be391ba5c
4 changed files with 52 additions and 30 deletions

View file

@ -1,6 +1,7 @@
package gcsql
import (
"context"
"database/sql"
"errors"
"regexp"
@ -451,16 +452,20 @@ func GetChecksumBans(boardID int, limit int) ([]FileBan, error) {
}
query += " LIMIT " + strconv.Itoa(limit)
var rows *sql.Rows
var cancel context.CancelFunc
var err error
if boardID > 0 {
rows, err = QuerySQL(query, boardID)
rows, cancel, err = QueryTimeoutSQL(nil, query, boardID)
} else {
rows, err = QuerySQL(query)
rows, cancel, err = QueryTimeoutSQL(nil, query)
}
if err != nil {
return nil, err
}
defer rows.Close()
defer func() {
rows.Close()
cancel()
}()
var bans []FileBan
for rows.Next() {
var ban FileBan
@ -471,7 +476,7 @@ func GetChecksumBans(boardID int, limit int) ([]FileBan, error) {
}
bans = append(bans, ban)
}
return bans, nil
return bans, rows.Close()
}
func NewFileChecksumBan(checksum string, fingerprinter string, boardID int, staffID int, staffNote string, banIP bool, banReason string) (*FileBan, error) {
@ -491,17 +496,15 @@ func NewFileChecksumBan(checksum string, fingerprinter string, boardID int, staf
*ban.BanIPMessage = banReason
}
tx, err := BeginTx()
ctx, cancel := context.WithTimeout(context.Background(), gcdb.defaultTimeout)
defer cancel()
tx, err := BeginContextTx(ctx)
if err != nil {
return nil, err
}
defer tx.Rollback()
stmt, err := PrepareSQL(query, tx)
if err != nil {
return nil, err
}
defer stmt.Close()
if _, err = stmt.Exec(
if _, err = ExecContextSQL(ctx, tx, query,
ban.BoardID, staffID, staffNote, checksum, fingerprinter, banIP, banReason,
); err != nil {
return nil, err
@ -515,7 +518,7 @@ func NewFileChecksumBan(checksum string, fingerprinter string, boardID int, staf
ban.StaffID = staffID
ban.StaffNote = staffNote
ban.Checksum = checksum
return &ban, stmt.Close()
return &ban, nil
}
func (fb *FileBan) IsGlobalBan() bool {
@ -524,12 +527,12 @@ func (fb *FileBan) IsGlobalBan() bool {
func (fb FileBan) Deactivate(_ int) error {
const deleteQuery = `DELETE FROM DBPREFIXfile_ban WHERE id = ?`
_, err := ExecSQL(deleteQuery, fb.ID)
_, err := ExecTimeoutSQL(nil, deleteQuery, fb.ID)
return err
}
// DeleteFileBanByID deletes the ban, given the id column value
func DeleteFileBanByID(id int) error {
_, err := ExecSQL("DELETE FROM DBPREFIXfile_ban WHERE id = ?", id)
_, err := ExecTimeoutSQL(nil, "DELETE FROM DBPREFIXfile_ban WHERE id = ?", id)
return err
}

View file

@ -1,6 +1,7 @@
package gcsql
import (
"context"
"database/sql"
"errors"
"fmt"
@ -254,7 +255,11 @@ func CreateBoard(board *Board, appendToAllBoards bool) error {
if board.Title == "" {
return errors.New("board title string must not be empty")
}
_, err := ExecSQL(sqlINSERT,
ctx, cancel := context.WithTimeout(context.Background(), gcdb.defaultTimeout)
defer cancel()
_, err := ExecContextSQL(ctx, nil, sqlINSERT,
&board.SectionID, &board.URI, &board.Dir, &board.NavbarPosition, &board.Title, &board.Subtitle,
&board.Description, &board.MaxFilesize, &board.MaxThreads, &board.DefaultStyle, &board.Locked,
&board.AnonymousName, &board.ForceAnonymous, &board.AutosageAfter, &board.NoImagesAfter, &board.MaxMessageLength,
@ -262,7 +267,9 @@ func CreateBoard(board *Board, appendToAllBoards bool) error {
if err != nil {
return err
}
if err = QueryRowSQL(`SELECT id FROM DBPREFIXboards WHERE dir = ?`, []any{board.Dir}, []any{&board.ID}); err != nil {
if err = QueryRowContextSQL(ctx, nil,
`SELECT id FROM DBPREFIXboards WHERE dir = ?`,
[]any{board.Dir}, []any{&board.ID}); err != nil {
return err
}
board.CreatedAt = time.Now()
@ -309,13 +316,16 @@ func (board *Board) DeleteOldThreads() ([]int, error) {
if board.MaxThreads < 1 {
return nil, nil
}
tx, err := BeginTx()
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
tx, err := BeginContextTx(ctx)
if err != nil {
return nil, err
}
defer tx.Rollback()
rows, stmt, err := QueryTxSQL(tx,
rows, err := QueryContextSQL(ctx, nil,
`SELECT id FROM DBPREFIXthreads
WHERE board_id = ? AND is_deleted = FALSE AND stickied = FALSE
ORDER BY last_bump DESC`,
@ -325,7 +335,6 @@ func (board *Board) DeleteOldThreads() ([]int, error) {
}
defer func() {
rows.Close()
stmt.Close()
}()
var threadIDs []interface{}
@ -347,17 +356,16 @@ func (board *Board) DeleteOldThreads() ([]int, error) {
}
idSetStr := createArrayPlaceholder(threadIDs)
if _, err = ExecTxSQL(tx, `UPDATE DBPREFIXthreads SET is_deleted = TRUE WHERE id in `+idSetStr,
if _, err = ExecContextSQL(ctx, tx, `UPDATE DBPREFIXthreads SET is_deleted = TRUE WHERE id in `+idSetStr,
threadIDs...); err != nil {
return nil, err
}
if rows, stmt, err = QueryTxSQL(tx, `SELECT id FROM DBPREFIXposts WHERE thread_id in `+idSetStr,
if rows, err = QueryContextSQL(ctx, tx, `SELECT id FROM DBPREFIXposts WHERE thread_id in `+idSetStr,
threadIDs...); err != nil {
return nil, err
}
defer func() {
stmt.Close()
rows.Close()
}()
@ -369,7 +377,7 @@ func (board *Board) DeleteOldThreads() ([]int, error) {
postIDs = append(postIDs, id)
}
if _, err = ExecTxSQL(tx, `UPDATE DBPREFIXposts SET is_deleted = TRUE WHERE thread_id in `+idSetStr,
if _, err = ExecContextSQL(ctx, tx, `UPDATE DBPREFIXposts SET is_deleted = TRUE WHERE thread_id in `+idSetStr,
threadIDs...); err != nil {
return nil, err
}
@ -394,11 +402,14 @@ func (board *Board) GetThreads(onlyNotDeleted bool, orderLastByBump bool, sticki
if orderLastByBump {
query += " last_bump DESC"
}
rows, err := QuerySQL(query, board.ID)
rows, cancel, err := QueryTimeoutSQL(nil, query, board.ID)
if err != nil {
return nil, err
}
defer rows.Close()
defer func() {
rows.Close()
cancel()
}()
var threads []Thread
for rows.Next() {
var thread Thread
@ -411,7 +422,7 @@ func (board *Board) GetThreads(onlyNotDeleted bool, orderLastByBump bool, sticki
}
threads = append(threads, thread)
}
return threads, nil
return threads, rows.Close()
}
// IsHidden returns true if the board is in a section that is hidden, otherwise false. If it is in a section

View file

@ -350,7 +350,11 @@ func (db *GCDB) QueryTxSQL(tx *sql.Tx, query string, a ...any) (*sql.Rows, error
return nil, err
}
defer stmt.Close()
return stmt.Query(a...)
rows, err := stmt.Query(a...)
if err != nil {
return nil, err
}
return rows, stmt.Close()
}
func setupDBConn(cfg *config.SQLConfig) (db *GCDB, err error) {

View file

@ -302,14 +302,18 @@ Example:
}
}
*/
func QueryTxSQL(tx *sql.Tx, query string, a ...any) (*sql.Rows, *sql.Stmt, error) {
func QueryTxSQL(tx *sql.Tx, query string, a ...any) (*sql.Rows, error) {
stmt, err := PrepareSQL(query, tx)
if err != nil {
return nil, nil, err
return nil, err
}
defer stmt.Close()
rows, err := stmt.Query(a...)
return rows, stmt, err
if err != nil {
return nil, err
}
return rows, stmt.Close()
}
func ParseSQLTimeString(str string) (time.Time, error) {