query("SELECT 1 FROM `$table` LIMIT 0"); } foreach (['001_admin.sql', '002_admin_identity.sql', '003_exam_attempts.sql'] as $file) { // Only migrate the historical rec_admin schema, preserving identities. if ($file === '002_admin_identity.sql' && $conn->query("SHOW COLUMNS FROM rec_admin LIKE 'name'")->num_rows === 0) { continue; } $sql = file_get_contents('/var/www/html/dashboard/migrations/' . $file); $conn->multi_query($sql); do { $result = $conn->store_result(); if ($result instanceof mysqli_result) { $result->free(); } } while ($conn->more_results() && $conn->next_result()); fwrite(STDOUT, "Applied: $file\n"); } // Fail the one-shot service before starting Apache if setup is incomplete. foreach (['rec_admin', 'rec_exam_attempt', 'rec_exam_event', 'rec_candidate_login_guard'] as $table) { $conn->query("SELECT 1 FROM `$table` LIMIT 0"); } $conn->query('SELECT email, nama_de, nama_be, idkar, password_hash FROM rec_admin LIMIT 0'); fwrite(STDOUT, "Database ready. Existing accounts and test data were preserved.\n"); } catch (Throwable $error) { fwrite(STDERR, 'Migration failed: ' . $error->getMessage() . "\nReview setup logs and docs/deployment.md before retrying.\n"); exit(1); }