From 23a827923e74e1c10f98a85007d10d1e727ee4d6 Mon Sep 17 00:00:00 2001 From: Kijin Sung Date: Sat, 24 Dec 2022 22:38:18 +0900 Subject: [PATCH] Support timestamp() with customizable format in XML query --- common/framework/parsers/dbquery/variablebase.php | 7 ++++++- tests/_data/dbquery/updateTest.xml | 2 ++ tests/unit/framework/parsers/DBQueryParserTest.php | 14 ++++++++------ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/common/framework/parsers/dbquery/variablebase.php b/common/framework/parsers/dbquery/variablebase.php index 7dc3e1a3c..03c796960 100644 --- a/common/framework/parsers/dbquery/variablebase.php +++ b/common/framework/parsers/dbquery/variablebase.php @@ -346,6 +346,9 @@ class VariableBase return [false, \RX_CLIENT_IP]; case 'unixtime()': return [false, time()]; + case 'timestamp()': + case 'now()': + return [false, date('Y-m-d H:i:s')]; case 'curdate()': case 'datetime()': return [false, date('YmdHis')]; @@ -362,7 +365,7 @@ class VariableBase } // If the default value is a calculation based on the current value, return a query string. - if (isset($column) && preg_match('/^(plus|minus|multiply)\(([0-9]+)\)$/', $this->default, $matches)) + if (isset($column) && preg_match('/^(plus|minus|multiply|divide|timestamp)\(([^)]+)\)$/', $this->default, $matches)) { switch ($matches[1]) { @@ -372,6 +375,8 @@ class VariableBase return [true, sprintf('%s - %d', Query::quoteName($column), $matches[2])]; case 'multiply': return [true, sprintf('%s * %d', Query::quoteName($column), $matches[2])]; + case 'timestamp': + return [false, date($matches[2])]; } } diff --git a/tests/_data/dbquery/updateTest.xml b/tests/_data/dbquery/updateTest.xml index fab489fa4..40f7163ea 100644 --- a/tests/_data/dbquery/updateTest.xml +++ b/tests/_data/dbquery/updateTest.xml @@ -8,6 +8,8 @@ + + diff --git a/tests/unit/framework/parsers/DBQueryParserTest.php b/tests/unit/framework/parsers/DBQueryParserTest.php index d970b7416..9a3c7c61a 100644 --- a/tests/unit/framework/parsers/DBQueryParserTest.php +++ b/tests/unit/framework/parsers/DBQueryParserTest.php @@ -399,7 +399,7 @@ class DBQueryParserTest extends \Codeception\TestCase\Test $this->assertNull($query->tables['documents']->alias); $this->assertEquals('comments', $query->tables['c']->name); $this->assertEquals('c', $query->tables['c']->alias); - $this->assertEquals(4, count($query->columns)); + $this->assertEquals(6, count($query->columns)); $this->assertTrue($query->columns[0] instanceof Rhymix\Framework\Parsers\DBQuery\ColumnWrite); $this->assertEquals('member_srl', $query->columns[0]->name); $this->assertEquals('member_srl', $query->columns[0]->var); @@ -421,15 +421,17 @@ class DBQueryParserTest extends \Codeception\TestCase\Test $sql = $query->getQueryString('rx_', $args); $params = $query->getQueryParams(); - $this->assertEquals('UPDATE `rx_documents`, `rx_comments` AS `c` SET `member_srl` = ?, `nick_name` = ?, `voted_count` = `voted_count` + ? WHERE `document_srl` = ?', $sql); - $this->assertEquals(['456', '닉네임', '5', '123'], $params); + $this->assertEquals('UPDATE `rx_documents`, `rx_comments` AS `c` SET `member_srl` = ?, `nick_name` = ?, `voted_count` = `voted_count` + ?, `regdate` = ?, `last_update` = ? WHERE `document_srl` = ?', $sql); + $this->assertEquals(['456', '닉네임', '5'], array_slice($params, 0, 3)); + $this->assertRegexp('/^20[0-9]{2}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$/', $params[3]); + $this->assertRegexp('/^[0-9]{2}.[0-9]{2}.[0-9]{2}$/', $params[4]); - $args = array('document_srl' => 123, 'member_srl' => 456, 'voted_count' => 5); + $args = array('document_srl' => 123, 'member_srl' => 456, 'voted_count' => 5, 'regdate' => 'foo', 'last_update' => 'bar'); $sql = $query->getQueryString('rx_', $args); $params = $query->getQueryParams(); - $this->assertEquals('UPDATE `rx_documents`, `rx_comments` AS `c` SET `member_srl` = ?, `nick_name` = NULL, `voted_count` = `voted_count` + ? WHERE `document_srl` = ?', $sql); - $this->assertEquals(['456', '5', '123'], $params); + $this->assertEquals('UPDATE `rx_documents`, `rx_comments` AS `c` SET `member_srl` = ?, `nick_name` = NULL, `voted_count` = `voted_count` + ?, `regdate` = ?, `last_update` = ? WHERE `document_srl` = ?', $sql); + $this->assertEquals(['456', '5', 'foo', 'bar', '123'], $params); } public function testDeleteQuery()