# Databases ## How to setup DB We are using MariaDB, but any MySQL-compatible database should be enough. There are instructions how to setup it for using with E949. 1. Login to your SQL database with admin account: ```bash mysql -u root -p ``` 2. Setup new user and database: ```mysql CREATE USER e949@localhost IDENTIFIED BY 'password'; CREATE DATABASE e949 CHARACTER SET = 'utf8'; GRANT ALL PRIVILEGES ON e949.* TO e949@localhost; FLUSH PRIVILEGES; EXIT ``` 3. Login with new account: ```bash mysql -u e949 -p ``` 4. Create tables: ```mysql USE e949; CREATE TABLE users ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Unique identifier of user', created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'When account was created', login VARCHAR(255) NOT NULL COMMENT 'User login', email VARCHAR(255) NULL COMMENT 'User e-mail address', password_hash BINARY(32) NOT NULL COMMENT 'User password hash', salt VARCHAR(8) NOT NULL COMMENT 'User salt, used for password hash', avatar_path VARCHAR(255) NULL COMMENT 'Path or URL to avatar picture', role ENUM('newbie', 'verified', 'mod', 'admin') NOT NULL COMMENT 'Assigned role', banned BOOL NOT NULL DEFAULT FALSE COMMENT 'If user is banned', invite_id CHAR(32) NULL COMMENT 'Invite ID used for account registration' ); CREATE TABLE posts ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Unique identifier of post', author_id INT UNSIGNED NOT NULL COMMENT 'Identifier of post author', comment_section_id INT UNSIGNED NULL COMMENT 'Identifier of post comment section', created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'When post was published', tags VARCHAR(2048) NOT NULL COMMENT 'Comma-delimited list of post tags', title VARCHAR(8192) NULL COMMENT 'Caption for the post', votes_up INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Amount of positive reactions', votes_down INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Amount of negative reactions', views INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Amount of post views', pic_path VARCHAR(255) NOT NULL COMMENT 'Path or URL of picture', preview_path VARCHAR(255) NULL COMMENT 'Path or URL of preview version of picture', comments_enabled BOOL NOT NULL COMMENT 'If comments are enabled', edit_lock BOOL NOT NULL DEFAULT FALSE COMMENT 'If redaction of post is locked for anyone, except mods and admins' ); CREATE TABLE comments ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Unique identifier of comment', author_id INT UNSIGNED NOT NULL COMMENT 'Identifier of comment author', comment_section_id INT UNSIGNED NOT NULL COMMENT 'Identifier of comment section to which the comment belongs', created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'When comment was published', contents VARCHAR(8192) NOT NULL COMMENT 'Text of comment', needs_check BOOL NOT NULL DEFAULT FALSE COMMENT 'If comment needs approval of moderation' ); CREATE TABLE actions ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Unique identifier of action', author_id INT UNSIGNED NULL COMMENT 'ID of user, who performed action', created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'When action was performed', category ENUM('acc_mod', 'publ_mod', 'post', 'comment', 'admin', 'other') NOT NULL COMMENT 'Category of performed action: accounts/publications moderation, etc.', description VARCHAR(8192) NOT NULL COMMENT 'Description of action' ); CREATE TABLE invites ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Unique identifier of invite', author_id INT UNSIGNED NULL COMMENT 'ID of user, who created invite', uses_last SMALLINT UNSIGNED NOT NULL COMMENT 'Remaining uses of invite' ); CREATE TABLE approved_tags ( value VARCHAR(255) NOT NULL COMMENT 'The tag itself' ); ``` 5. Profit!!!