Filenames already applied, keyed by filename */ public function getAppliedFilenames(string $moduleId): array { $applied = []; $rows = DB::select('SELECT filename FROM module_migrations WHERE module_id = ?', $moduleId); foreach ((array) $rows as $row) { if (!is_array($row)) { continue; } $filename = trim((string) (($row['module_migrations']['filename'] ?? $row['filename'] ?? ''))); if ($filename !== '') { $applied[$filename] = true; } } return $applied; } public function recordApplied(string $moduleId, string $filename): void { DB::query( 'INSERT INTO module_migrations (module_id, filename) VALUES (?, ?)', $moduleId, $filename ); } public function beginTransaction(): void { DB::query('START TRANSACTION'); } public function commit(): void { DB::query('COMMIT'); } public function rollback(): void { DB::query('ROLLBACK'); } public function executeStatement(string $sql): void { DB::query($sql); } }