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

Fix some issues with views (not getting the expected data, columns not matching, etc)

This commit is contained in:
Eggbertx 2024-10-20 01:01:13 -07:00
parent 184d7a1701
commit 658ee0f41d
6 changed files with 42 additions and 28 deletions

View file

@ -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
}

View file

@ -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 {

View file

@ -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)
@ -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

View file

@ -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 = ?`
// 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, err := QuerySQL(query, boardID)
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

View file

@ -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())

View file

@ -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;
@ -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
@ -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;