From 58f561a4e2d785a1b87e52fe910d2e8a62474391 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Thu, 2 May 2024 23:08:23 +0400 Subject: [PATCH] modifs.mineures sans commentaires --- src/db/sqlite/_Query.php | 79 ++++++++++++++++++++++++++-------------- 1 file changed, 51 insertions(+), 28 deletions(-) diff --git a/src/db/sqlite/_Query.php b/src/db/sqlite/_Query.php index 5ef0295..d66ae15 100644 --- a/src/db/sqlite/_Query.php +++ b/src/db/sqlite/_Query.php @@ -37,6 +37,22 @@ class _Query { return true; } + /** fusionner toutes les parties séquentielles d'une requête */ + static function merge_seq(array $query): string { + $index = 0; + $sql = ""; + foreach ($query as $key => $value) { + if ($key === $index) { + $index++; + if ($sql && !str::ends_with(" ", $sql) && !str::starts_with(" ", $value)) { + $sql .= " "; + } + $sql .= $value; + } + } + return $sql; + } + const create_SCHEMA = [ "prefix" => "string", "table" => "string", @@ -64,6 +80,26 @@ class _Query { return false; } static function parse_select(array $query, ?array &$params=null): string { + # fusionner d'abord toutes les parties séquentielles + $usersql = $tmpsql = self::merge_seq($query); + # vérifier la présence des parties nécessaires + $sql = []; + if (($prefix = $query["prefix"] ?? null) !== null) $sql[] = $prefix; + self::consume('select\s*', $tmpsql); $sql[] = "select"; + if (self::consume('(.*)\s*(?:\s+(from)\s*(?:\s+([a-z_][a-z0-9_]*)\s*(?:(\S+.*)\s*(?:\s+(where)\s*)?)?)?)?', $tmpsql, $ms)) { + $usercols = $ms[1]; + $userfrom = $ms[2]; + $usertable = $ms[3]; + $userjoins = $ms[4]; + $userwhere = $ms[5]; + } else { + throw new ValueException("expected select query: $usersql"); + } + self::consume(';\s*', $tmpsql); + if ($tmpsql) { + throw new ValueException("unexpected value at end: $usersql"); + } + return implode(" ", $sql); } const insert_SCHEMA = [ @@ -78,23 +114,10 @@ class _Query { } static function parse_insert(array $query, ?array &$params=null): string { # fusionner d'abord toutes les parties séquentielles - $index = 0; - $tmpsql = ""; - foreach ($query as $key => $value) { - if ($key === $index) { - $index++; - if ($tmpsql && !str::ends_with(" ", $tmpsql) && !str::starts_with(" ", $value)) { - $tmpsql .= " "; - } - $tmpsql .= $value; - } - } - $usersql = $tmpsql; + $usersql = $tmpsql = self::merge_seq($query); # vérifier la présence des parties nécessaires $sql = []; - if (($prefix = $query["prefix"] ?? null) !== null) { - $sql["prefix"] = $prefix; - } + if (($prefix = $query["prefix"] ?? null) !== null) $sql[] = $prefix; self::consume('insert\s*', $tmpsql); $sql[] = "insert"; self::consume('into\s*', $tmpsql); $sql[] = "into"; if (self::consume('([a-z_][a-z0-9_]*)\s*', $tmpsql, $ms)) { @@ -104,42 +127,42 @@ class _Query { } else { throw new ValueException("expected table name: $usersql"); } - $xcols = []; - $xvalues = []; + $usercols = []; + $uservalues = []; if (self::consume('\(([^)]*)\)\s*', $tmpsql, $ms)) { - $xcols = array_merge($xcols, preg_split("/\s*,\s*/", $ms[1])); + $usercols = array_merge($usercols, preg_split("/\s*,\s*/", $ms[1])); } $cols = cl::withn($query["cols"] ?? null); $values = cl::withn($query["values"] ?? null); $schema = $query["schema"] ?? null; if ($cols === null) { - if ($xcols) { - $cols = $xcols; + if ($usercols) { + $cols = $usercols; } elseif ($values) { $cols = array_keys($values); - $xcols = array_merge($xcols, $cols); + $usercols = array_merge($usercols, $cols); } elseif ($schema && is_array($schema)) { #XXX implémenter support AssocSchema $cols = array_keys($schema); - $xcols = array_merge($xcols, $cols); + $usercols = array_merge($usercols, $cols); } } if (self::consume('values\s+\(\s*(.*)\s*\)\s*', $tmpsql, $ms)) { - if ($ms[1]) $xvalues[] = $ms[1]; + if ($ms[1]) $uservalues[] = $ms[1]; } self::consume(';\s*', $tmpsql); if ($tmpsql) { throw new ValueException("unexpected value at end: $usersql"); } - if ($cols !== null && !$xvalues) { - if (!$xcols) $xcols = $cols; + if ($cols !== null && !$uservalues) { + if (!$usercols) $usercols = $cols; foreach ($cols as $col) { - $xvalues[] = ":$col"; + $uservalues[] = ":$col"; $params[$col] = $values[$col] ?? null; } } - $sql[] = "(".implode(", ", $xcols).")"; - $sql[] = "values (".implode(", ", $xvalues).")"; + $sql[] = "(".implode(", ", $usercols).")"; + $sql[] = "values (".implode(", ", $uservalues).")"; return implode(" ", $sql); }