-- Gochan master template for new database script -- Contains macros in the form [curlybrace open]macro text[curlybrace close] -- Macros are substituted by build_initdb.py to the supported database files. Must not contain extra spaces -- Versioning numbering goes by whole numbers. Upgrade script migrate existing databases between versions -- Foreign and unique constraints must be named so they can be dropped. -- MYSQL requires constraint names to be unique globally, hence the long constraint names. -- Database version: 1 CREATE TABLE DBPREFIXdatabase_version( version INT NOT NULL ); CREATE TABLE DBPREFIXsections( id BIGSERIAL PRIMARY KEY, name TEXT NOT NULL, abbreviation TEXT NOT NULL, position SMALLINT NOT NULL, hidden BOOL NOT NULL ); CREATE TABLE DBPREFIXboards( id BIGSERIAL PRIMARY KEY, section_id BIGINT NOT NULL, uri VARCHAR(45) NOT NULL, dir VARCHAR(45) NOT NULL, navbar_position SMALLINT NOT NULL, title VARCHAR(45) NOT NULL, subtitle VARCHAR(64) NOT NULL, description VARCHAR(64) NOT NULL, max_file_size INT NOT NULL, max_threads SMALLINT NOT NULL, default_style VARCHAR(45) NOT NULL, locked BOOL NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, anonymous_name VARCHAR(45) NOT NULL DEFAULT 'Anonymous', force_anonymous BOOL NOT NULL, autosage_after SMALLINT NOT NULL, no_images_after SMALLINT NOT NULL, max_message_length SMALLINT NOT NULL, min_message_length SMALLINT NOT NULL, allow_embeds BOOL NOT NULL, redirect_to_thread BOOL NOT NULL, require_file BOOL NOT NULL, enable_catalog BOOL NOT NULL, CONSTRAINT boards_section_id_fk FOREIGN KEY(section_id) REFERENCES DBPREFIXsections(id), CONSTRAINT boards_dir_unique UNIQUE(dir), CONSTRAINT boards_uri_unique UNIQUE(uri) ); CREATE TABLE DBPREFIXthreads( id BIGSERIAL PRIMARY KEY, board_id BIGINT NOT NULL, locked BOOL NOT NULL DEFAULT FALSE, stickied BOOL NOT NULL DEFAULT FALSE, anchored BOOL NOT NULL DEFAULT FALSE, cyclical BOOL NOT NULL DEFAULT FALSE, last_bump TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, deleted_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, is_deleted BOOL NOT NULL DEFAULT FALSE, CONSTRAINT threads_board_id_fk FOREIGN KEY(board_id) REFERENCES DBPREFIXboards(id) ); CREATE INDEX thread_deleted_index ON DBPREFIXthreads(is_deleted); CREATE TABLE DBPREFIXposts( id BIGSERIAL PRIMARY KEY, thread_id BIGINT NOT NULL, is_top_post BOOL NOT NULL DEFAULT FALSE, ip VARCHAR(45) NOT NULL, created_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, name VARCHAR(50) NOT NULL DEFAULT '', tripcode VARCHAR(10) NOT NULL DEFAULT '', is_role_signature BOOL NOT NULL DEFAULT FALSE, email VARCHAR(50) NOT NULL DEFAULT '', subject VARCHAR(100) NOT NULL DEFAULT '', message TEXT NOT NULL, message_raw TEXT NOT NULL, password TEXT NOT NULL, deleted_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, is_deleted BOOL NOT NULL DEFAULT FALSE, banned_message TEXT, CONSTRAINT posts_thread_id_fk FOREIGN KEY(thread_id) REFERENCES DBPREFIXthreads(id) ); CREATE INDEX top_post_index ON DBPREFIXposts(is_top_post); CREATE TABLE DBPREFIXfiles( id BIGSERIAL PRIMARY KEY, post_id BIGINT NOT NULL, file_order INT NOT NULL, original_filename VARCHAR(255) NOT NULL, filename VARCHAR(45) NOT NULL, checksum TEXT NOT NULL, file_size INT NOT NULL, is_spoilered BOOL NOT NULL, thumbnail_width INT NOT NULL, thumbnail_height INT NOT NULL, width INT NOT NULL, height INT NOT NULL, CONSTRAINT files_post_id_fk FOREIGN KEY(post_id) REFERENCES DBPREFIXposts(id), CONSTRAINT files_post_id_file_order_unique UNIQUE(post_id, file_order) ); CREATE TABLE DBPREFIXstaff( id BIGSERIAL PRIMARY KEY, username VARCHAR(45) NOT NULL, password_checksum VARCHAR(120) NOT NULL, global_rank INT, added_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, last_login TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, is_active BOOL NOT NULL DEFAULT TRUE, CONSTRAINT staff_username_unique UNIQUE(username) ); CREATE TABLE DBPREFIXsessions( id BIGSERIAL PRIMARY KEY, staff_id BIGINT NOT NULL, expires TIMESTAMP NOT NULL, data VARCHAR(45) NOT NULL, CONSTRAINT sessions_staff_id_fk FOREIGN KEY(staff_id) REFERENCES DBPREFIXstaff(id) ); CREATE TABLE DBPREFIXboard_staff( board_id BIGINT NOT NULL, staff_id BIGINT NOT NULL, CONSTRAINT board_staff_board_id_fk FOREIGN KEY(board_id) REFERENCES DBPREFIXboards(id), CONSTRAINT board_staff_staff_id_fk FOREIGN KEY(staff_id) REFERENCES DBPREFIXstaff(id), CONSTRAINT board_staff_pk PRIMARY KEY (board_id,staff_id) ); CREATE TABLE DBPREFIXannouncements( id BIGSERIAL PRIMARY KEY, staff_id BIGINT NOT NULL, subject VARCHAR(45) NOT NULL, message TEXT NOT NULL, timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT announcements_staff_id_fk FOREIGN KEY(staff_id) REFERENCES DBPREFIXstaff(id) ); CREATE TABLE DBPREFIXip_ban( id BIGSERIAL PRIMARY KEY, staff_id BIGINT NOT NULL, board_id BIGINT, banned_for_post_id BIGINT, copy_post_text TEXT NOT NULL, is_thread_ban BOOL NOT NULL, is_active BOOL NOT NULL, ip VARCHAR(45) NOT NULL, issued_at TIMESTAMP NOT NULL, appeal_at TIMESTAMP NOT NULL, expires_at TIMESTAMP NOT NULL, permanent BOOL NOT NULL, staff_note VARCHAR(255) NOT NULL, message TEXT NOT NULL, can_appeal BOOL NOT NULL, CONSTRAINT ip_ban_board_id_fk FOREIGN KEY(board_id) REFERENCES DBPREFIXboards(id), CONSTRAINT ip_ban_staff_id_fk FOREIGN KEY(staff_id) REFERENCES DBPREFIXstaff(id), CONSTRAINT ip_ban_banned_for_post_id_fk FOREIGN KEY(banned_for_post_id) REFERENCES DBPREFIXposts(id) ); CREATE TABLE DBPREFIXip_ban_audit( ip_ban_id BIGINT NOT NULL, timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, staff_id BIGINT NOT NULL, is_active BOOL NOT NULL, is_thread_ban BOOL NOT NULL, expires_at TIMESTAMP NOT NULL, appeal_at TIMESTAMP NOT NULL, permanent BOOL NOT NULL, staff_note VARCHAR(255) NOT NULL, message TEXT NOT NULL, can_appeal BOOL NOT NULL, PRIMARY KEY(ip_ban_id, timestamp), CONSTRAINT ip_ban_audit_ip_ban_id_fk FOREIGN KEY(ip_ban_id) REFERENCES DBPREFIXip_ban(id), CONSTRAINT ip_ban_audit_staff_id_fk FOREIGN KEY(staff_id) REFERENCES DBPREFIXstaff(id) ); CREATE TABLE DBPREFIXip_ban_appeals( id BIGSERIAL PRIMARY KEY, staff_id BIGINT, ip_ban_id BIGINT NOT NULL, appeal_text TEXT NOT NULL, staff_response TEXT, is_denied BOOL NOT NULL, CONSTRAINT ip_ban_appeals_staff_id_fk FOREIGN KEY(staff_id) REFERENCES DBPREFIXstaff(id), CONSTRAINT ip_ban_appeals_ip_ban_id_fk FOREIGN KEY(ip_ban_id) REFERENCES DBPREFIXip_ban(id) ); CREATE TABLE DBPREFIXip_ban_appeals_audit( appeal_id BIGINT NOT NULL, timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, staff_id BIGINT, appeal_text TEXT NOT NULL, staff_response TEXT, is_denied BOOL NOT NULL, PRIMARY KEY(appeal_id, timestamp), CONSTRAINT ip_ban_appeals_audit_staff_id_fk FOREIGN KEY(staff_id) REFERENCES DBPREFIXstaff(id), CONSTRAINT ip_ban_appeals_audit_appeal_id_fk FOREIGN KEY(appeal_id) REFERENCES DBPREFIXip_ban_appeals(id) ); CREATE TABLE DBPREFIXreports( id BIGSERIAL PRIMARY KEY, handled_by_staff_id BIGINT, post_id BIGINT NOT NULL, ip VARCHAR(45) NOT NULL, reason TEXT NOT NULL, is_cleared BOOL NOT NULL, CONSTRAINT reports_handled_by_staff_id_fk FOREIGN KEY(handled_by_staff_id) REFERENCES DBPREFIXstaff(id), CONSTRAINT reports_post_id_fk FOREIGN KEY(post_id) REFERENCES DBPREFIXposts(id) ); CREATE TABLE DBPREFIXreports_audit( report_id BIGINT NOT NULL, timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, handled_by_staff_id BIGINT, is_cleared BOOL NOT NULL, CONSTRAINT reports_audit_handled_by_staff_id_fk FOREIGN KEY(handled_by_staff_id) REFERENCES DBPREFIXstaff(id), CONSTRAINT reports_audit_report_id_fk FOREIGN KEY(report_id) REFERENCES DBPREFIXreports(id) ); CREATE TABLE DBPREFIXfilename_ban( id BIGSERIAL PRIMARY KEY, board_id BIGINT, staff_id BIGINT NOT NULL, staff_note VARCHAR(255) NOT NULL, issued_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, filename VARCHAR(255) NOT NULL, is_regex BOOL NOT NULL, CONSTRAINT filename_ban_board_id_fk FOREIGN KEY(board_id) REFERENCES DBPREFIXboards(id), CONSTRAINT filename_ban_staff_id_fk FOREIGN KEY(staff_id) REFERENCES DBPREFIXstaff(id) ); CREATE TABLE DBPREFIXusername_ban( id BIGSERIAL PRIMARY KEY, board_id BIGINT, staff_id BIGINT NOT NULL, staff_note VARCHAR(255) NOT NULL, issued_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, username VARCHAR(255) NOT NULL, is_regex BOOL NOT NULL, CONSTRAINT username_ban_board_id_fk FOREIGN KEY(board_id) REFERENCES DBPREFIXboards(id), CONSTRAINT username_ban_staff_id_fk FOREIGN KEY(staff_id) REFERENCES DBPREFIXstaff(id) ); CREATE TABLE DBPREFIXfile_ban( id BIGSERIAL PRIMARY KEY, board_id BIGINT, staff_id BIGINT NOT NULL, staff_note VARCHAR(255) NOT NULL, issued_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, checksum TEXT NOT NULL, CONSTRAINT file_ban_board_id_fk FOREIGN KEY(board_id) REFERENCES DBPREFIXboards(id), CONSTRAINT file_ban_staff_id_fk FOREIGN KEY(staff_id) REFERENCES DBPREFIXstaff(id) ); CREATE TABLE DBPREFIXwordfilters( id BIGSERIAL PRIMARY KEY, board_id BIGINT, staff_id BIGINT, staff_note VARCHAR(255) NOT NULL, issued_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, search VARCHAR(75) NOT NULL, is_regex BOOL NOT NULL, change_to VARCHAR(75) NOT NULL, CONSTRAINT wordfilters_board_id_fk FOREIGN KEY(board_id) REFERENCES DBPREFIXboards(id), CONSTRAINT wordfilters_staff_id_fk FOREIGN KEY(staff_id) REFERENCES DBPREFIXstaff(id), CONSTRAINT wordfilters_search_check CHECK (search <> '') ); INSERT INTO DBPREFIXdatabase_version(version) VALUES(1);