Skip to content

Commit

Permalink
Fix some issues with views (not getting the expected data, columns no…
Browse files Browse the repository at this point in the history
…t matching, etc)
  • Loading branch information
Eggbertx committed Oct 20, 2024
1 parent 184d7a1 commit 658ee0f
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 29 deletions.
2 changes: 1 addition & 1 deletion pkg/building/boards.go
Original file line number Diff line number Diff line change
Expand Up @@ -525,7 +525,7 @@ func buildBoard(board *gcsql.Board, force bool) error {
if err = BuildBoardPages(board, errEv); err != nil {
return err
}
if err = BuildThreads(true, board.ID, 0); err != nil {
if err = BuildThreads(true, board.Dir, 0); err != nil {
errEv.Err(err).Caller().Send()
return err
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/building/catalog.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ func (catalog *boardCatalog) fillPages(threadsPerPage int, threads []catalogThre
}

func getBoardTopPosts(board string) ([]*Post, error) {
const query = "SELECT * FROM DBPREFIXv_board_top_posts WHERE DIR = ?"
const query = "SELECT * FROM DBPREFIXv_building_posts WHERE id = parent_id AND dir = ?"
var posts []*Post

err := QueryPosts(query, []any{board}, func(p *Post) error {
Expand Down
5 changes: 3 additions & 2 deletions pkg/building/threads.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ import (
// BuildThreads builds thread(s) given a boardid, or if all = false, also given a threadid.
// if all is set to true, ignore which, otherwise, which = build only specified boardid
// TODO: make it variadic
func BuildThreads(all bool, boardid, threadid int) error {
func BuildThreads(all bool, board string, threadid int) error {
var threads []*gcsql.Post
var err error
if all {
threads, err = gcsql.GetBoardTopPosts(boardid)
threads, err = gcsql.GetBoardTopPosts(board)
} else {
var post *gcsql.Post
post, err = gcsql.GetThreadTopPost(threadid)
Expand Down Expand Up @@ -91,6 +91,7 @@ func BuildThreadPages(op *gcsql.Post) error {
errEv.Err(err).Caller().Send()
return fmt.Errorf("unable to set file permissions for /%s/res/%d.html: %s", board.Dir, op.ID, err.Error())
}
fmt.Println(thread.ID, thread.BoardID)
errEv.Int("op", posts[0].ID)

// render thread page
Expand Down
37 changes: 22 additions & 15 deletions pkg/gcsql/posts.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,31 +139,38 @@ func GetThreadTopPost(threadID int) (*Post, error) {
return post, err
}

func GetBoardTopPosts(boardID int) ([]*Post, error) {
const query = `SELECT * FROM DBPREFIXv_board_top_posts WHERE t.board_id = ?`

rows, err := QuerySQL(query, boardID)
// GetBoardTopPosts gets the top posts of the given
func GetBoardTopPosts[B intOrStringConstraint](board B) ([]*Post, error) {
query := `SELECT id, thread_id, is_top_post, ip, created_on, name, tripcode, is_role_signature,
email, subject, message, message_raw, password, deleted_at, is_deleted, coalesce(banned_message,''),
flag, country
FROM DBPREFIXv_post_with_board WHERE is_top_post AND is_deleted = FALSE`
switch any(board).(type) {
case int:
query += " AND id = ?"
case string:
query += " AND dir = ?"
}

rows, cancel, err := QueryTimeoutSQL(nil, query, board)
if err != nil {
return nil, err
}
defer rows.Close()
defer func() {
rows.Close()
cancel()
}()
var posts []*Post
for rows.Next() {
var post Post
// var tmp int // only needed for WHERE clause in query

bannedMessage := new(string)
err = rows.Scan(
if err = rows.Scan(
&post.ID, &post.ThreadID, &post.IsTopPost, &post.IP, &post.CreatedOn, &post.Name,
&post.Tripcode, &post.IsRoleSignature, &post.Email, &post.Subject, &post.Message,
&post.MessageRaw, &post.Password, &post.DeletedAt, &post.IsDeleted, &bannedMessage,
)
if err != nil {
&post.MessageRaw, &post.Password, &post.DeletedAt, &post.IsDeleted, &post.BannedMessage,
&post.Flag, &post.Country,
); err != nil {
return posts, err
}
if bannedMessage != nil {
post.BannedMessage = *bannedMessage
}
posts = append(posts, &post)
}
return posts, nil
Expand Down
6 changes: 6 additions & 0 deletions pkg/gcsql/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,12 @@ func (af BooleanFilter) whereClause(columnName string, and bool) string {
return ""
}

// intOrStringConstraint can be used to make using/creating query functions easier and to reduce the amount of reused code
// i.e., so we don't need GetPostsOnBoardByID() and GetPostsOnBoardByDir()
type intOrStringConstraint interface {
int | string
}

// BeginTx begins a new transaction for the gochan database. It uses a background context
func BeginTx() (*sql.Tx, error) {
return BeginContextTx(context.Background())
Expand Down
20 changes: 10 additions & 10 deletions sql/reset_views.sql
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
-- SQL views for simplifying queries in gochan

-- First drop views if they exist in reverse order to avoid dependency issues
DROP VIEW IF EXISTS DBPREFIXv_post_with_board;
DROP VIEW IF EXISTS DBPREFIXv_top_post_board_dir;
DROP VIEW IF EXISTS DBPREFIXv_upload_info;
DROP VIEW IF EXISTS DBPREFIXv_board_top_posts;
DROP VIEW IF EXISTS DBPREFIXv_front_page_posts_with_file;
DROP VIEW IF EXISTS DBPREFIXv_front_page_posts;
DROP VIEW IF EXISTS DBPREFIXv_posts_to_delete_file_only;
Expand Down Expand Up @@ -85,14 +85,6 @@ SELECT * FROM DBPREFIXv_front_page_posts
WHERE filename IS NOT NULL AND filename <> '' AND filename <> 'deleted';


CREATE VIEW DBPREFIXv_board_top_posts AS
SELECT DBPREFIXposts.id, thread_id, is_top_post, ip, created_on, name,
tripcode, is_role_signature, email, subject, message, message_raw,
password, deleted_at, is_deleted, banned_message
FROM DBPREFIXposts
LEFT JOIN DBPREFIXv_thread_board_ids t on t.id = DBPREFIXposts.thread_id
WHERE is_deleted = FALSE AND is_top_post;

CREATE VIEW DBPREFIXv_upload_info AS
SELECT p1.id as id, (SELECT id FROM DBPREFIXposts p2 WHERE p2.is_top_post AND p1.thread_id = p2.thread_id LIMIT 1) AS op,
filename, is_spoilered, width, height, thumbnail_width, thumbnail_height
Expand All @@ -106,4 +98,12 @@ CREATE VIEW DBPREFIXv_top_post_board_dir AS
SELECT op.id, (SELECT dir FROM DBPREFIXboards WHERE id = t.board_id) AS dir
FROM DBPREFIXposts
LEFT JOIN DBPREFIXv_thread_board_ids t ON t.id = DBPREFIXposts.thread_id
INNER JOIN DBPREFIXv_top_post_thread_ids op on op.thread_id = DBPREFIXposts.thread_id;
INNER JOIN DBPREFIXv_top_post_thread_ids op on op.thread_id = DBPREFIXposts.thread_id;

CREATE VIEW DBPREFIXv_post_with_board AS
SELECT p.id AS id, thread_id, is_top_post, created_on, name, tripcode, is_role_signature, email,
subject, message, message_raw, password, p.deleted_at AS deleted_at, p.is_deleted AS is_deleted,
banned_message, ip, flag, country, dir, board_id
FROM DBPREFIXposts p
LEFT JOIN DBPREFIXthreads t ON t.id = p.thread_id
LEFT JOIN DBPREFIXboards b ON b.id = t.board_id;

0 comments on commit 658ee0f

Please sign in to comment.