CREATE TABLE messages ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, message TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, signature TEXT, is_encrypted BOOLEAN DEFAULT FALSE, INDEX idx_created_at (created_at) ); CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, pgp_key TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, is_moderator TINYINT(1) NOT NULL DEFAULT 0, login_attempts INT NOT NULL DEFAULT 0, last_attempt TIMESTAMP NULL, is_blocked TINYINT(1) NOT NULL DEFAULT 0, block_reason TEXT, INDEX idx_username (username) ); CREATE TABLE registrations ( id INT AUTO_INCREMENT PRIMARY KEY, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_created_at (created_at) ); DELIMITER // CREATE PROCEDURE migrate_if_needed() BEGIN IF NOT EXISTS (SELECT * FROM information_schema.tables WHERE table_name = 'messages') THEN CREATE TABLE messages ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, message TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, signature TEXT, is_encrypted BOOLEAN DEFAULT FALSE, INDEX idx_created_at (created_at) ); END IF; IF NOT EXISTS (SELECT * FROM information_schema.tables WHERE table_name = 'users') THEN CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, pgp_key TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, is_moderator TINYINT(1) NOT NULL DEFAULT 0, login_attempts INT NOT NULL DEFAULT 0, last_attempt TIMESTAMP NULL, is_blocked TINYINT(1) NOT NULL DEFAULT 0, block_reason TEXT, INDEX idx_username (username) ); END IF; IF NOT EXISTS (SELECT * FROM information_schema.tables WHERE table_name = 'registrations') THEN CREATE TABLE registrations ( id INT AUTO_INCREMENT PRIMARY KEY, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_created_at (created_at) ); END IF; IF EXISTS ( SELECT * FROM information_schema.columns WHERE table_name = 'registrations' AND column_name = 'ip' ) THEN DROP INDEX IF EXISTS idx_ip_created ON registrations; ALTER TABLE registrations DROP COLUMN ip; END IF; END // DELIMITER ; CALL migrate_if_needed(); DROP PROCEDURE IF EXISTS migrate_if_needed;