From 6c2a0a5ed15343b34b94440b8bcbb3a599cc9188 Mon Sep 17 00:00:00 2001 From: David Grudl Date: Thu, 19 Mar 2020 18:45:08 +0100 Subject: [PATCH] SqlPreprocessor: added mode ?list --- src/Database/SqlPreprocessor.php | 11 +++++++++-- tests/Database/SqlPreprocessor.phpt | 4 ++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/Database/SqlPreprocessor.php b/src/Database/SqlPreprocessor.php index 1939c5e3c..149fad67f 100644 --- a/src/Database/SqlPreprocessor.php +++ b/src/Database/SqlPreprocessor.php @@ -25,9 +25,10 @@ class SqlPreprocessor MODE_SET = 'set', // key=value, key=value, ... MODE_VALUES = 'values', // (key, key, ...) VALUES (value, value, ...) MODE_ORDER = 'order', // key, key DESC, ... + MODE_LIST = 'list', // value, value, ... | (tuple), (tuple), ... MODE_AUTO = 'auto'; // arrayMode for arrays - private const MODES = [self::MODE_AND, self::MODE_OR, self::MODE_SET, self::MODE_VALUES, self::MODE_ORDER]; + private const MODES = [self::MODE_AND, self::MODE_OR, self::MODE_SET, self::MODE_VALUES, self::MODE_ORDER, self::MODE_LIST]; private const ARRAY_MODES = [ 'INSERT' => self::MODE_VALUES, @@ -67,7 +68,7 @@ class SqlPreprocessor /** @var bool */ private $useParams; - /** @var string|null values|set|and|order */ + /** @var string|null values|set|and|order|items */ private $arrayMode; @@ -238,6 +239,12 @@ private function formatValue($value, string $mode = null): string } return implode(', ', $vx); + } elseif ($mode === self::MODE_LIST) { // value, value, ... | (tuple), (tuple), ... + foreach ($value as $k => $v) { + $vx[] = is_array($v) ? '(' . $this->formatValue($v, self::MODE_LIST) . ')' : $this->formatValue($v); + } + return implode(', ', $vx); + } elseif ($mode === self::MODE_AND || $mode === self::MODE_OR) { // (key [operator] value) AND ... foreach ($value as $k => $v) { if (is_int($k)) { diff --git a/tests/Database/SqlPreprocessor.phpt b/tests/Database/SqlPreprocessor.phpt index d6cf7314d..02fe938e8 100644 --- a/tests/Database/SqlPreprocessor.phpt +++ b/tests/Database/SqlPreprocessor.phpt @@ -347,10 +347,10 @@ test(function () use ($preprocessor) { // ?values }); -test(function () use ($preprocessor) { // automatic detection faild +test(function () use ($preprocessor) { // automatic detection failed Assert::exception(function () use ($preprocessor) { $preprocessor->process(['INSERT INTO author (name) SELECT name FROM user WHERE id IN (?)', [11, 12]]); - }, Nette\InvalidArgumentException::class, 'Automaticaly detected multi-insert, but values aren\'t array. If you need try to change mode like "?[and|or|set|values|order]". Mode "values" was used.'); + }, Nette\InvalidArgumentException::class, 'Automaticaly detected multi-insert, but values aren\'t array. If you need try to change mode like "?[and|or|set|values|order|list]". Mode "values" was used.'); });