123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- <?php
- /**
- * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
- * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
- *
- * Licensed under The MIT License
- * For full copyright and license information, please see the LICENSE.txt
- * Redistributions of files must retain the above copyright notice.
- *
- * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
- * @link https://cakephp.org CakePHP(tm) Project
- * @since 3.0.0
- * @license https://opensource.org/licenses/mit-license.php MIT License
- */
- namespace Cake\Database\Dialect;
- use Cake\Database\Expression\FunctionExpression;
- use Cake\Database\Schema\SqliteSchema;
- use Cake\Database\SqlDialectTrait;
- use Cake\Database\SqliteCompiler;
- /**
- * SQLite dialect trait
- *
- * @internal
- */
- trait SqliteDialectTrait
- {
- use SqlDialectTrait;
- use TupleComparisonTranslatorTrait;
- /**
- * String used to start a database identifier quoting to make it safe
- *
- * @var string
- */
- protected $_startQuote = '"';
- /**
- * String used to end a database identifier quoting to make it safe
- *
- * @var string
- */
- protected $_endQuote = '"';
- /**
- * The schema dialect class for this driver
- *
- * @var \Cake\Database\Schema\SqliteSchema
- */
- protected $_schemaDialect;
- /**
- * Mapping of date parts.
- *
- * @var array
- */
- protected $_dateParts = [
- 'day' => 'd',
- 'hour' => 'H',
- 'month' => 'm',
- 'minute' => 'M',
- 'second' => 'S',
- 'week' => 'W',
- 'year' => 'Y'
- ];
- /**
- * Returns a dictionary of expressions to be transformed when compiling a Query
- * to SQL. Array keys are method names to be called in this class
- *
- * @return array
- */
- protected function _expressionTranslators()
- {
- $namespace = 'Cake\Database\Expression';
- return [
- $namespace . '\FunctionExpression' => '_transformFunctionExpression',
- $namespace . '\TupleComparison' => '_transformTupleComparison'
- ];
- }
- /**
- * Receives a FunctionExpression and changes it so that it conforms to this
- * SQL dialect.
- *
- * @param \Cake\Database\Expression\FunctionExpression $expression The function expression
- * to translate for SQLite.
- * @return void
- */
- protected function _transformFunctionExpression(FunctionExpression $expression)
- {
- switch ($expression->getName()) {
- case 'CONCAT':
- // CONCAT function is expressed as exp1 || exp2
- $expression->setName('')->setConjunction(' ||');
- break;
- case 'DATEDIFF':
- $expression
- ->setName('ROUND')
- ->setConjunction('-')
- ->iterateParts(function ($p) {
- return new FunctionExpression('JULIANDAY', [$p['value']], [$p['type']]);
- });
- break;
- case 'NOW':
- $expression->setName('DATETIME')->add(["'now'" => 'literal']);
- break;
- case 'RAND':
- $expression
- ->setName('ABS')
- ->add(["RANDOM() % 1" => 'literal'], [], true);
- break;
- case 'CURRENT_DATE':
- $expression->setName('DATE')->add(["'now'" => 'literal']);
- break;
- case 'CURRENT_TIME':
- $expression->setName('TIME')->add(["'now'" => 'literal']);
- break;
- case 'EXTRACT':
- $expression
- ->setName('STRFTIME')
- ->setConjunction(' ,')
- ->iterateParts(function ($p, $key) {
- if ($key === 0) {
- $value = rtrim(strtolower($p), 's');
- if (isset($this->_dateParts[$value])) {
- $p = ['value' => '%' . $this->_dateParts[$value], 'type' => null];
- }
- }
- return $p;
- });
- break;
- case 'DATE_ADD':
- $expression
- ->setName('DATE')
- ->setConjunction(',')
- ->iterateParts(function ($p, $key) {
- if ($key === 1) {
- $p = ['value' => $p, 'type' => null];
- }
- return $p;
- });
- break;
- case 'DAYOFWEEK':
- $expression
- ->setName('STRFTIME')
- ->setConjunction(' ')
- ->add(["'%w', " => 'literal'], [], true)
- ->add([') + (1' => 'literal']); // Sqlite starts on index 0 but Sunday should be 1
- break;
- }
- }
- /**
- * Get the schema dialect.
- *
- * Used by Cake\Database\Schema package to reflect schema and
- * generate schema.
- *
- * @return \Cake\Database\Schema\SqliteSchema
- */
- public function schemaDialect()
- {
- if (!$this->_schemaDialect) {
- $this->_schemaDialect = new SqliteSchema($this);
- }
- return $this->_schemaDialect;
- }
- /**
- * {@inheritDoc}
- */
- public function disableForeignKeySQL()
- {
- return 'PRAGMA foreign_keys = OFF';
- }
- /**
- * {@inheritDoc}
- */
- public function enableForeignKeySQL()
- {
- return 'PRAGMA foreign_keys = ON';
- }
- /**
- * {@inheritDoc}
- *
- * @return \Cake\Database\SqliteCompiler
- */
- public function newCompiler()
- {
- return new SqliteCompiler();
- }
- }
|