1
0
www.mikescher.com/framework/db/schema/sqlite/CSqliteCommandBuilder.php

64 lines
2.3 KiB
PHP
Raw Permalink Normal View History

2014-05-13 12:40:42 +02:00
<?php
/**
* CSqliteCommandBuilder class file.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @link http://www.yiiframework.com/
* @copyright 2008-2013 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
/**
* CSqliteCommandBuilder provides basic methods to create query commands for SQLite tables.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @package system.db.schema.sqlite
* @since 1.0
*/
class CSqliteCommandBuilder extends CDbCommandBuilder
{
/**
* Generates the expression for selecting rows with specified composite key values.
* This method is overridden because SQLite does not support the default
* IN expression with composite columns.
* @param CDbTableSchema $table the table schema
* @param array $values list of primary key values to be selected within
* @param string $prefix column prefix (ended with dot)
* @return string the expression for selection
*/
protected function createCompositeInCondition($table,$values,$prefix)
{
$keyNames=array();
foreach(array_keys($values[0]) as $name)
$keyNames[]=$prefix.$table->columns[$name]->rawName;
$vs=array();
foreach($values as $value)
$vs[]=implode("||','||",$value);
return implode("||','||",$keyNames).' IN ('.implode(', ',$vs).')';
}
/**
* Creates a multiple INSERT command.
* This method could be used to achieve better performance during insertion of the large
* amount of data into the database tables.
* Note that SQLite does not keep original order of the inserted rows.
* @param mixed $table the table schema ({@link CDbTableSchema}) or the table name (string).
* @param array[] $data list data to be inserted, each value should be an array in format (column name=>column value).
* If a key is not a valid column name, the corresponding value will be ignored.
* @return CDbCommand multiple insert command
* @since 1.1.14
*/
public function createMultipleInsertCommand($table,array $data)
{
$templates=array(
'main'=>'INSERT INTO {{tableName}} ({{columnInsertNames}}) {{rowInsertValues}}',
'columnInsertValue'=>'{{value}} AS {{column}}',
'columnInsertValueGlue'=>', ',
'rowInsertValue'=>'SELECT {{columnInsertValues}}',
'rowInsertValueGlue'=>' UNION ',
'columnInsertNameGlue'=>', ',
);
return $this->composeMultipleInsertCommand($table,$data,$templates);
}
}