From e2e87016ad9dccfe8ab3509dc0d5a1129ce99467 Mon Sep 17 00:00:00 2001 From: Lars Gebhardt-Kusche Date: Sat, 11 Apr 2026 03:11:45 +0200 Subject: [PATCH] importer 3 --- .../src/Infrastructure/SchemaManager.php | 73 ++++++++++++++++++- 1 file changed, 71 insertions(+), 2 deletions(-) diff --git a/modules/mining-checker/src/Infrastructure/SchemaManager.php b/modules/mining-checker/src/Infrastructure/SchemaManager.php index 54b8291..2bd049d 100644 --- a/modules/mining-checker/src/Infrastructure/SchemaManager.php +++ b/modules/mining-checker/src/Infrastructure/SchemaManager.php @@ -436,8 +436,9 @@ final class SchemaManager continue; } - $currentStatement = $trimmed; - $this->pdo->exec($trimmed); + $normalizedStatement = $this->normalizeImportStatement($trimmed); + $currentStatement = $normalizedStatement; + $this->pdo->exec($normalizedStatement); $executed++; } @@ -463,6 +464,74 @@ final class SchemaManager } } + private function normalizeImportStatement(string $statement): string + { + if ($this->driver !== 'pgsql') { + return $statement; + } + + $resolvedSetval = $this->normalizePgsqlSetvalStatement($statement); + return $resolvedSetval ?? $statement; + } + + private function normalizePgsqlSetvalStatement(string $statement): ?string + { + $pattern = "/^SELECT\\s+setval\\(\\s*'([^']+)'\\s*,\\s*([0-9]+)\\s*,\\s*(true|false)\\s*\\)$/i"; + if (!preg_match($pattern, trim($statement), $matches)) { + return null; + } + + $sequenceReference = $matches[1]; + $nextValue = $matches[2]; + $isCalled = strtolower($matches[3]); + + if ($this->pgsqlRelationExists($sequenceReference)) { + return $statement; + } + + $sequenceName = $sequenceReference; + $schemaName = 'public'; + if (str_contains($sequenceReference, '.')) { + [$schemaName, $sequenceName] = explode('.', $sequenceReference, 2); + } + + $schemaName = trim($schemaName, "\"'"); + $sequenceName = trim($sequenceName, "\"'"); + + if (!preg_match('/^(.*)_([A-Za-z0-9]+)_seq\d*$/', $sequenceName, $parts)) { + return null; + } + + $tableName = $parts[1]; + $columnName = $parts[2]; + $actualSequence = $this->resolvePgsqlSerialSequence($schemaName, $tableName, $columnName); + if ($actualSequence === null) { + return null; + } + + return sprintf("SELECT setval('%s', %s, %s)", $actualSequence, $nextValue, $isCalled); + } + + private function pgsqlRelationExists(string $qualifiedName): bool + { + $statement = $this->pdo->prepare('SELECT to_regclass(:name) IS NOT NULL'); + $statement->execute(['name' => $qualifiedName]); + return (bool) $statement->fetchColumn(); + } + + private function resolvePgsqlSerialSequence(string $schemaName, string $tableName, string $columnName): ?string + { + $qualifiedTable = sprintf('"%s"."%s"', str_replace('"', '""', $schemaName), str_replace('"', '""', $tableName)); + $statement = $this->pdo->prepare('SELECT pg_get_serial_sequence(:table_name, :column_name)'); + $statement->execute([ + 'table_name' => $qualifiedTable, + 'column_name' => $columnName, + ]); + + $result = $statement->fetchColumn(); + return is_string($result) && $result !== '' ? $result : null; + } + /** * @return list */