PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_TIMEOUT => 5 ]); // Enable WAL mode for concurrency and performance $pdo->exec('PRAGMA journal_mode = WAL;'); $pdo->exec('PRAGMA foreign_keys = ON;'); // Initialize tables if needed init_db_schema($pdo); return $pdo; } function init_db_schema(PDO $pdo): void { $pdo->exec(" CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL, password_hash TEXT NOT NULL, role TEXT NOT NULL DEFAULT 'admin', created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS announcements ( id INTEGER PRIMARY KEY AUTOINCREMENT, is_active INTEGER NOT NULL DEFAULT 1, type TEXT NOT NULL DEFAULT 'holiday', headline TEXT NOT NULL, message TEXT NOT NULL, start_date TEXT NULL, end_date TEXT NULL, show_banner INTEGER NOT NULL DEFAULT 1, show_in_hours INTEGER NOT NULL DEFAULT 1, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ); "); // Seed default admin user if table is empty (username: admin / password: password) $stmt = $pdo->query("SELECT COUNT(*) as count FROM users"); $userCount = $stmt->fetchColumn(); if ($userCount == 0) { $defaultPassHash = password_hash('password', PASSWORD_DEFAULT); $insert = $pdo->prepare("INSERT INTO users (username, password_hash, role) VALUES (?, ?, 'admin')"); $insert->execute(['admin', $defaultPassHash]); } // Seed default Labor Day announcement row if table is empty $stmtAnn = $pdo->query("SELECT COUNT(*) as count FROM announcements"); $annCount = $stmtAnn->fetchColumn(); if ($annCount == 0) { $insertAnn = $pdo->prepare(" INSERT INTO announcements ( is_active, type, headline, message, start_date, end_date, show_banner, show_in_hours ) VALUES ( 1, 'holiday', 'Labor Day Closure', 'The Old Fitz will be closed Thursday, Sept 3 through Saturday, Sept 5 for the holiday weekend. Doors reopen Thursday, Sept 10 at 4:00 PM!', NULL, NULL, 1, 1 ) "); $insertAnn->execute(); } }