diff --git a/pkg/building/boards.go b/pkg/building/boards.go index fd64d349..ac8233c4 100644 --- a/pkg/building/boards.go +++ b/pkg/building/boards.go @@ -282,19 +282,22 @@ func BuildBoardPages(board *gcsql.Board) error { func BuildBoards(verbose bool, which ...int) error { var boards []gcsql.Board var err error + errEv := gcutil.LogError(nil) + defer errEv.Discard() if which == nil { boards, err = gcsql.GetAllBoards(false) if err != nil { + errEv.Err(err).Caller().Send() return err } } else { for _, boardID := range which { board, err := gcsql.GetBoardFromID(boardID) if err != nil { - gcutil.LogError(err). + errEv.Err(err).Caller(). Int("boardid", boardID). - Caller().Msg("Unable to get board information") + Msg("Unable to get board information") return fmt.Errorf("unable to get board information (ID: %d): %s", boardID, err.Error()) } boards = append(boards, *board) @@ -314,6 +317,7 @@ func BuildBoards(verbose bool, which ...int) error { gcutil.LogInfo().Str("board", board.Dir). Msg("Built board successfully") } else if err == nil { + gcutil.LogError(err).Caller().Str("board", board.Dir).Msg("Unable to build board") err = tmpErr } wg.Done() diff --git a/pkg/building/posts.go b/pkg/building/posts.go index 4d6c8850..786afccf 100644 --- a/pkg/building/posts.go +++ b/pkg/building/posts.go @@ -1,6 +1,7 @@ package building import ( + "context" "fmt" "html/template" "net" @@ -128,18 +129,21 @@ func (p *Post) Stickied() bool { } func QueryPosts(query string, params []any, cb func(*Post) error) error { - rows, err := gcsql.QuerySQL(query, params...) + sqlCfg := config.GetSQLConfig() + ctx, cancel := context.WithTimeout(context.Background(), time.Duration(sqlCfg.DBTimeoutSeconds)*time.Second) + defer cancel() + + rows, err := gcsql.QueryContextSQL(ctx, nil, query, params...) if err != nil { return err } defer rows.Close() - dbType := config.GetSystemCriticalConfig().DBtype for rows.Next() { var post Post dest := []any{&post.ID, &post.thread.ID} var ip string - if dbType == "mysql" { + if sqlCfg.DBtype == "mysql" { dest = append(dest, &post.IP) } else { dest = append(dest, &ip) @@ -155,7 +159,7 @@ func QueryPosts(query string, params []any, cb func(*Post) error) error { if err = rows.Scan(dest...); err != nil { return err } - if dbType != "mysql" { + if sqlCfg.DBtype != "mysql" { post.IP = net.ParseIP(ip) if post.IP == nil { return fmt.Errorf("invalid IP address %q", ip) diff --git a/pkg/gcsql/bans.go b/pkg/gcsql/bans.go index bfceeca2..b57d2565 100644 --- a/pkg/gcsql/bans.go +++ b/pkg/gcsql/bans.go @@ -238,6 +238,7 @@ func NewNameBan(name string, isRegex bool, boardID int, staffID int, staffNote s if err != nil { return nil, err } + defer stmt.Close() if _, err = stmt.Exec(ban.BoardID, staffID, staffNote, name, isRegex); err != nil { return nil, err } @@ -252,7 +253,7 @@ func NewNameBan(name string, isRegex bool, boardID int, staffID int, staffNote s ban.StaffNote = staffNote ban.Username = name ban.IsRegex = isRegex - return &ban, nil + return &ban, stmt.Close() } func GetNameBans(boardID int, limit int) ([]UsernameBan, error) { @@ -373,6 +374,7 @@ func NewFilenameBan(filename string, isRegex bool, boardID int, staffID int, sta if err != nil { return nil, err } + defer stmt.Close() if _, err = stmt.Exec(ban.BoardID, staffID, staffNote, filename, isRegex); err != nil { return nil, err } @@ -387,7 +389,7 @@ func NewFilenameBan(filename string, isRegex bool, boardID int, staffID int, sta ban.StaffNote = staffNote ban.Filename = filename ban.IsRegex = isRegex - return &ban, nil + return &ban, stmt.Close() } func (ub filenameOrUsernameBanBase) IsGlobalBan() bool { @@ -498,6 +500,7 @@ func NewFileChecksumBan(checksum string, fingerprinter string, boardID int, staf if err != nil { return nil, err } + defer stmt.Close() if _, err = stmt.Exec( ban.BoardID, staffID, staffNote, checksum, fingerprinter, banIP, banReason, ); err != nil { @@ -512,7 +515,7 @@ func NewFileChecksumBan(checksum string, fingerprinter string, boardID int, staf ban.StaffID = staffID ban.StaffNote = staffNote ban.Checksum = checksum - return &ban, nil + return &ban, stmt.Close() } func (fb *FileBan) IsGlobalBan() bool { diff --git a/pkg/gcsql/boards.go b/pkg/gcsql/boards.go index bb701da6..46ddf82c 100644 --- a/pkg/gcsql/boards.go +++ b/pkg/gcsql/boards.go @@ -65,6 +65,8 @@ func GetAllBoards(onlyNonHidden bool) ([]Board, error) { if err != nil { return nil, err } + defer rows.Close() + var boards []Board for rows.Next() { var board Board @@ -75,7 +77,6 @@ func GetAllBoards(onlyNonHidden bool) ([]Board, error) { &board.MaxMessageLength, &board.MinMessageLength, &board.AllowEmbeds, &board.RedirectToThread, &board.RequireFile, &board.EnableCatalog, ); err != nil { - rows.Close() return nil, err } boards = append(boards, board) diff --git a/pkg/gcsql/database.go b/pkg/gcsql/database.go index 8224ee04..6d602b0e 100644 --- a/pkg/gcsql/database.go +++ b/pkg/gcsql/database.go @@ -129,9 +129,9 @@ func (db *GCDB) ExecSQL(query string, values ...any) (sql.Result, error) { if err != nil { return nil, err } + defer stmt.Close() result, err := stmt.Exec(values...) if err != nil { - stmt.Close() return nil, err } return result, stmt.Close() @@ -154,9 +154,10 @@ func (db *GCDB) ExecContextSQL(ctx context.Context, tx *sql.Tx, sqlStr string, v if err != nil { return nil, err } + defer stmt.Close() + result, err := stmt.ExecContext(ctx, values...) if err != nil { - stmt.Close() return nil, err } return result, stmt.Close() @@ -180,7 +181,12 @@ func (db *GCDB) ExecTxSQL(tx *sql.Tx, query string, values ...any) (sql.Result, if err != nil { return nil, err } - return stmt.Exec(values...) + defer stmt.Close() + res, err := stmt.Exec(values...) + if err != nil { + return res, err + } + return res, stmt.Close() } /* @@ -240,8 +246,9 @@ func (db *GCDB) QueryRowContextSQL(ctx context.Context, tx *sql.Tx, query string if err != nil { return err } + defer stmt.Close() + if err = stmt.QueryRowContext(ctx, values...).Scan(out...); err != nil { - stmt.Close() return err } return stmt.Close() @@ -268,8 +275,9 @@ func (db *GCDB) QueryRowTxSQL(tx *sql.Tx, query string, values, out []any) error if err != nil { return err } + defer stmt.Close() + if err = stmt.QueryRow(values...).Scan(out...); err != nil { - stmt.Close() return err } return stmt.Close() @@ -314,7 +322,13 @@ func (db *GCDB) QueryContextSQL(ctx context.Context, tx *sql.Tx, query string, a if err != nil { return nil, err } - return stmt.QueryContext(ctx, a...) + defer stmt.Close() + + rows, err := stmt.QueryContext(ctx, a...) + if err != nil { + return rows, err + } + return rows, stmt.Close() } /* diff --git a/pkg/gcsql/posts.go b/pkg/gcsql/posts.go index 59737388..d452cba0 100644 --- a/pkg/gcsql/posts.go +++ b/pkg/gcsql/posts.go @@ -384,6 +384,8 @@ func (p *Post) Insert(bumpThread bool, boardID int, locked bool, stickied bool, if err != nil { return err } + defer stmt.Close() + if _, err = stmt.Exec( p.ThreadID, p.IsTopPost, p.IP, p.Name, p.Tripcode, p.IsRoleSignature, p.Email, p.Subject, p.Message, p.MessageRaw, p.Password, p.Flag, p.Country, @@ -398,11 +400,19 @@ func (p *Post) Insert(bumpThread bool, boardID int, locked bool, stickied bool, if err != nil { return err } + defer stmt2.Close() + if _, err = stmt2.Exec(p.ThreadID); err != nil { return err } + if err = stmt2.Close(); err != nil { + return err + } } - return tx.Commit() + if err = tx.Commit(); err != nil { + return err + } + return stmt.Close() } func (p *Post) WebPath() string { diff --git a/pkg/gcsql/uploads.go b/pkg/gcsql/uploads.go index 6b9944f3..88679666 100644 --- a/pkg/gcsql/uploads.go +++ b/pkg/gcsql/uploads.go @@ -68,6 +68,7 @@ func (p *Post) AttachFile(upload *Upload) error { if err != nil { return err } + defer stmt.Close() if upload.FileOrder < 1 { upload.FileOrder, err = p.nextFileOrder() @@ -85,7 +86,10 @@ func (p *Post) AttachFile(upload *Upload) error { if upload.ID, err = getLatestID("DBPREFIXfiles", tx); err != nil { return err } - return tx.Commit() + if err = tx.Commit(); err != nil { + return err + } + return stmt.Close() } // GetUploadFilenameAndBoard returns the filename (or an empty string) and diff --git a/pkg/gcsql/util.go b/pkg/gcsql/util.go index 5dfc0a26..32366900 100644 --- a/pkg/gcsql/util.go +++ b/pkg/gcsql/util.go @@ -143,7 +143,12 @@ func ExecTxSQL(tx *sql.Tx, sqlStr string, values ...any) (sql.Result, error) { if err != nil { return nil, err } - return stmt.Exec(values...) + defer stmt.Close() + res, err := stmt.Exec(values...) + if err != nil { + return res, err + } + return res, stmt.Close() } /* @@ -271,7 +276,13 @@ func QueryTxSQL(tx *sql.Tx, query string, a ...any) (*sql.Rows, error) { if err != nil { return nil, err } - return stmt.Query(a...) + defer stmt.Close() + + rows, err := stmt.Query(a...) + if err != nil { + return rows, err + } + return rows, stmt.Close() } func ParseSQLTimeString(str string) (time.Time, error) { @@ -294,7 +305,11 @@ func getLatestID(tableName string, tx *sql.Tx) (id int, err error) { if err != nil { return 0, err } - err = stmt.QueryRow().Scan(&id) + defer stmt.Close() + if err = stmt.QueryRow().Scan(&id); err != nil { + return + } + err = stmt.Close() } else { err = QueryRowSQL(query, nil, []any{&id}) } diff --git a/pkg/gcsql/util_test.go b/pkg/gcsql/util_test.go index 2af87837..d1b7ebb1 100644 --- a/pkg/gcsql/util_test.go +++ b/pkg/gcsql/util_test.go @@ -75,10 +75,15 @@ func tcPrepareContextSQL(t *testing.T, mock sqlmock.Sqlmock, tC *testCase[prepar } func TestPrepareContextSQL(t *testing.T) { - _, err := PrepareContextSQL(context.Background(), "", nil) + stmt, err := PrepareContextSQL(context.Background(), "", nil) if !assert.Error(t, err) { return } + defer func() { + if stmt != nil { + assert.NoError(t, stmt.Close()) + } + }() mock := setupMockDB(t) testCases := []testCase[prepareFunc]{ diff --git a/pkg/manage/actionsModPerm.go b/pkg/manage/actionsModPerm.go index cb5ff266..846b26c7 100644 --- a/pkg/manage/actionsModPerm.go +++ b/pkg/manage/actionsModPerm.go @@ -425,10 +425,9 @@ func reportsCallback(_ http.ResponseWriter, request *http.Request, staff *gcsql. dismissID := gcutil.HackyStringToInt(dismissIDstr) block := request.FormValue("block") if block != "" && staff.Rank != 3 { - errEv. + errEv.Caller(). Int("postID", dismissID). - Str("rejected", "not an admin"). - Caller().Send() + Str("rejected", "not an admin").Send() return "", errors.New("only the administrator can block reports") } found, err := gcsql.ClearReport(dismissID, staff.ID, block != "" && staff.Rank == 3) diff --git a/pkg/manage/announcements.go b/pkg/manage/announcements.go index d5a5f1fb..cac56f3f 100644 --- a/pkg/manage/announcements.go +++ b/pkg/manage/announcements.go @@ -26,6 +26,7 @@ func getAllAnnouncements() ([]announcementWithName, error) { if err != nil { return nil, err } + defer rows.Close() var announcements []announcementWithName for rows.Next() { var announcement announcementWithName diff --git a/pkg/manage/util.go b/pkg/manage/util.go index 9833c920..eaa9b187 100644 --- a/pkg/manage/util.go +++ b/pkg/manage/util.go @@ -77,10 +77,10 @@ func createSession(key, username, password string, request *http.Request, writer }) if err = staff.CreateLoginSession(key); err != nil { - gcutil.LogError(err). + errEv.Err(err).Caller(). Str("staff", username). Str("sessionKey", key). - Caller().Msg("Error creating new staff session") + Msg("Error creating new staff session") return ErrUnableToCreateSession }