Skip to content

Commit

Permalink
Add more views
Browse files Browse the repository at this point in the history
  • Loading branch information
Eggbertx committed Oct 17, 2024
1 parent 046068f commit c7fa173
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 52 deletions.
39 changes: 10 additions & 29 deletions pkg/gcsql/posts.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import (
"context"
"database/sql"
"errors"
"fmt"
"html/template"
"strconv"
"time"

"github.com/gochan-org/gochan/pkg/config"
Expand Down Expand Up @@ -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})
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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))
}
4 changes: 4 additions & 0 deletions pkg/gcsql/tables.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
9 changes: 1 addition & 8 deletions pkg/manage/actionsAdminPerm.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
62 changes: 47 additions & 15 deletions sql/db_views.sql
Original file line number Diff line number Diff line change
@@ -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;


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


Expand Down Expand Up @@ -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

0 comments on commit c7fa173

Please sign in to comment.