From c7fa173d3a32d9721a0fb31e1ae2435ff02d116b Mon Sep 17 00:00:00 2001 From: Eggbertx Date: Thu, 17 Oct 2024 12:36:26 -0700 Subject: [PATCH] Add more views --- pkg/gcsql/posts.go | 39 ++++++--------------- pkg/gcsql/tables.go | 4 +++ pkg/manage/actionsAdminPerm.go | 9 +---- sql/db_views.sql | 62 ++++++++++++++++++++++++++-------- 4 files changed, 62 insertions(+), 52 deletions(-) diff --git a/pkg/gcsql/posts.go b/pkg/gcsql/posts.go index e99c5d5c..1613a70e 100644 --- a/pkg/gcsql/posts.go +++ b/pkg/gcsql/posts.go @@ -4,8 +4,8 @@ import ( "context" "database/sql" "errors" - "fmt" "html/template" + "strconv" "time" "github.com/gochan-org/gochan/pkg/config" @@ -91,11 +91,7 @@ func GetPostsFromIP(ip string, limit int, onlyNotDeleted bool) ([]Post, error) { // GetTopPostAndBoardDirFromPostID returns the ID of the top post and the board dir in postID's thread func GetTopPostAndBoardDirFromPostID(postID int) (int, string, error) { - const query = `SELECT op.id AS op_id, b.dir FROM DBPREFIXposts p - INNER JOIN DBPREFIXthreads t ON p.thread_id = t.id - INNER JOIN DBPREFIXboards b ON t.board_id = b.id - INNER JOIN DBPREFIXposts op ON op.thread_id = t.id AND op.is_top_post = TRUE - WHERE p.id = ?` + const query = "SELECT * FROM DBPREFIXv_top_post_board_dir WHERE p.id = ?" var opID int var dir string err := QueryRowTimeoutSQL(nil, query, []any{postID}, []any{&opID, &dir}) @@ -144,14 +140,7 @@ func GetThreadTopPost(threadID int) (*Post, error) { } func GetBoardTopPosts(boardID int) ([]*Post, error) { - query := `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 ( - SELECT id, board_id from DBPREFIXthreads - ) t on t.id = DBPREFIXposts.thread_id - WHERE is_deleted = FALSE AND is_top_post AND t.board_id = ?` + const query = `SELECT * FROM DBPREFIXv_board_top_posts WHERE t.board_id = ?` rows, err := QuerySQL(query, boardID) if err != nil { @@ -409,23 +398,15 @@ func (p *Post) Insert(bumpThread bool, boardID int, locked bool, stickied bool, } func (p *Post) WebPath() string { + if p.opID > 0 && p.boardDir != "" { + return config.WebPath(p.boardDir, "res/", strconv.Itoa(p.opID)+".html#"+strconv.Itoa(p.ID)) + } webRoot := config.GetSystemCriticalConfig().WebRoot - var opID int - var boardDir string - const query = `SELECT - op.id, - (SELECT dir FROM DBPREFIXboards WHERE id = t.board_id) AS dir - FROM DBPREFIXposts - LEFT JOIN ( - SELECT id, board_id FROM DBPREFIXthreads - ) t ON t.id = DBPREFIXposts.thread_id - INNER JOIN ( - SELECT id, thread_id FROM DBPREFIXposts WHERE is_top_post - ) op on op.thread_id = DBPREFIXposts.thread_id - WHERE DBPREFIXposts.id = ?` - err := QueryRowSQL(query, []any{p.ID}, []any{&opID, &boardDir}) + + const query = "SELECT * FROM DBPREFIXv_top_post_board_dir WHERE DBPREFIXposts.id = ?" + err := QueryRowSQL(query, []any{p.ID}, []any{&p.opID, &p.boardDir}) if err != nil { return webRoot } - return webRoot + boardDir + fmt.Sprintf("/res/%d.html#%d", opID, p.ID) + return config.WebPath(p.boardDir, "res/", strconv.Itoa(p.opID)+".html#"+strconv.Itoa(p.ID)) } diff --git a/pkg/gcsql/tables.go b/pkg/gcsql/tables.go index 4f79633e..3c6ae7fb 100644 --- a/pkg/gcsql/tables.go +++ b/pkg/gcsql/tables.go @@ -213,6 +213,10 @@ type Post struct { BannedMessage string `json:"-"` // sql: banned_message Flag string `json:"-"` // sql: flag Country string `json:"-"` // sql: country + + // used for convenience to avoid needing to do multiple queries + opID int + boardDir string } // table: DBPREFIXreports diff --git a/pkg/manage/actionsAdminPerm.go b/pkg/manage/actionsAdminPerm.go index 19e1b112..fcc7c369 100644 --- a/pkg/manage/actionsAdminPerm.go +++ b/pkg/manage/actionsAdminPerm.go @@ -357,14 +357,7 @@ func fixThumbnailsCallback(_ http.ResponseWriter, request *http.Request, _ *gcsq board := request.FormValue("board") var uploads []uploadInfo if board != "" { - const query = `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 - FROM DBPREFIXposts p1 - JOIN DBPREFIXthreads t ON t.id = p1.thread_id - JOIN DBPREFIXboards b ON b.id = t.board_id - LEFT JOIN DBPREFIXfiles f ON f.post_id = p1.id - WHERE dir = ? AND p1.is_deleted = FALSE AND filename IS NOT NULL AND filename != 'deleted' - ORDER BY created_on DESC` + const query = "SELECT * FROM DBPREFIXv_upload_info WHERE dir = ? ORDER BY created_on DESC" rows, err := gcsql.QuerySQL(query, board) if err != nil { return "", err diff --git a/sql/db_views.sql b/sql/db_views.sql index e6dea8c1..64fd42a9 100644 --- a/sql/db_views.sql +++ b/sql/db_views.sql @@ -1,16 +1,24 @@ -- 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_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; DROP VIEW IF EXISTS DBPREFIXv_posts_to_delete; DROP VIEW IF EXISTS DBPREFIXv_recent_posts; DROP VIEW IF EXISTS DBPREFIXv_building_posts; -DROP VIEW IF EXISTS DBPREFIXv_top_posts; +DROP VIEW IF EXISTS DBPREFIXv_top_post_thread_ids; +DROP VIEW IF EXISTS DBPREFIXv_thread_board_ids; + -- create views -CREATE VIEW DBPREFIXv_top_posts AS +CREATE VIEW DBPREFIXv_thread_board_ids AS +SELECT id, board_id from DBPREFIXthreads; + +CREATE VIEW DBPREFIXv_top_post_thread_ids AS SELECT id, thread_id FROM DBPREFIXposts WHERE is_top_post; @@ -19,24 +27,24 @@ SELECT DBPREFIXposts.id AS id, DBPREFIXposts.thread_id AS thread_id, ip, name, t email, subject, created_on, created_on as last_modified, p.id AS parent_id, t.last_bump as last_bump, message, message_raw, (SELECT dir FROM DBPREFIXboards WHERE id = t.board_id LIMIT 1) AS dir, -coalesce(DBPREFIXfiles.original_filename, '') as original_filename, -coalesce(DBPREFIXfiles.filename, '') AS filename, -coalesce(DBPREFIXfiles.checksum, '') AS checksum, -coalesce(DBPREFIXfiles.file_size, 0) AS filesize, -coalesce(DBPREFIXfiles.thumbnail_width, 0) AS tw, -coalesce(DBPREFIXfiles.thumbnail_height, 0) AS th, -coalesce(DBPREFIXfiles.width, 0) AS width, -coalesce(DBPREFIXfiles.height, 0) AS height, +coalesce(f.original_filename, '') as original_filename, +coalesce(f.filename, '') AS filename, +coalesce(f.checksum, '') AS checksum, +coalesce(f.file_size, 0) AS filesize, +coalesce(f.thumbnail_width, 0) AS tw, +coalesce(f.thumbnail_height, 0) AS th, +coalesce(f.width, 0) AS width, +coalesce(f.height, 0) AS height, t.locked as locked, t.stickied as stickied, t.cyclical as cyclical, flag, country FROM DBPREFIXposts -LEFT JOIN DBPREFIXfiles ON DBPREFIXfiles.post_id = DBPREFIXposts.id AND is_deleted = FALSE +LEFT JOIN DBPREFIXfiles f ON f.post_id = DBPREFIXposts.id AND is_deleted = FALSE LEFT JOIN ( SELECT id, board_id, last_bump, locked, stickied, cyclical FROM DBPREFIXthreads ) t ON t.id = DBPREFIXposts.thread_id -INNER JOIN DBPREFIXv_top_posts p ON p.thread_id = DBPREFIXposts.thread_id +INNER JOIN DBPREFIXv_top_post_thread_ids p ON p.thread_id = DBPREFIXposts.thread_id WHERE is_deleted = FALSE; @@ -66,12 +74,36 @@ SELECT DBPREFIXposts.id, DBPREFIXposts.message_raw, (SELECT dir FROM DBPREFIXboards WHERE id = t.board_id) as dir, COALESCE(f.filename, '') as filename, op.id as opid FROM DBPREFIXposts -LEFT JOIN (SELECT id, board_id FROM DBPREFIXthreads) t ON t.id = DBPREFIXposts.thread_id +LEFT JOIN DBPREFIXv_thread_board_ids t ON t.id = DBPREFIXposts.thread_id LEFT JOIN (SELECT post_id, filename FROM DBPREFIXfiles) f on f.post_id = DBPREFIXposts.id -INNER JOIN (SELECT id, thread_id FROM DBPREFIXposts WHERE is_top_post) op ON op.thread_id = DBPREFIXposts.thread_id +INNER JOIN DBPREFIXv_top_post_thread_ids op ON op.thread_id = DBPREFIXposts.thread_id WHERE DBPREFIXposts.is_deleted = FALSE; CREATE VIEW DBPREFIXv_front_page_posts_with_file AS SELECT * FROM DBPREFIXv_front_page_posts -WHERE filename IS NOT NULL AND filename != '' AND filename != 'deleted'; \ No newline at end of file +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 +FROM DBPREFIXposts p1 +JOIN DBPREFIXthreads t ON t.id = p1.thread_id +JOIN DBPREFIXboards b ON b.id = t.board_id +LEFT JOIN DBPREFIXfiles f ON f.post_id = p1.id +WHERE p1.is_deleted = FALSE AND filename IS NOT NULL AND filename != 'deleted' + +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 \ No newline at end of file