mirror of
https://github.com/Eggbertx/gochan.git
synced 2025-09-13 09:26:23 -07:00
Add more views
This commit is contained in:
parent
046068fadf
commit
c7fa173d3a
4 changed files with 62 additions and 52 deletions
|
@ -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))
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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';
|
||||
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
|
Loading…
Add table
Add a link
Reference in a new issue