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:
parent
f5e7084263
commit
8be391ba5c
4 changed files with 52 additions and 30 deletions
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue