Browse Source

...

tags/2.0.0-beta
Qiang Xue 13 years ago
parent
commit
4ba05468a0
  1. 2
      framework/db/dao/ColumnSchema.php
  2. 11
      framework/db/dao/Command.php
  3. 3
      framework/db/dao/Connection.php
  4. 4
      framework/db/dao/Query.php
  5. 17
      framework/db/dao/QueryBuilder.php
  6. 22
      framework/db/dao/Schema.php
  7. 10
      framework/db/dao/TableSchema.php
  8. 3
      framework/db/dao/Transaction.php
  9. 32
      framework/db/dao/mysql/QueryBuilder.php
  10. 10
      framework/db/dao/mysql/Schema.php
  11. 12
      tests/unit/data/mysql.sql
  12. 339
      tests/unit/framework/db/dao/CommandTest.php

2
framework/db/dao/ColumnSchema.php

@ -32,7 +32,7 @@ class ColumnSchema extends \yii\base\Component
public $allowNull; public $allowNull;
/** /**
* @var string logical type of this column. Possible logic types include: * @var string logical type of this column. Possible logic types include:
* string, text, boolean, smallint, integer, bigint, float, decimal, datetime, timestamp, time, date, binary * string, text, boolean, smallint, integer, bigint, float, decimal, datetime, timestamp, time, date, binary, money
*/ */
public $type; public $type;
/** /**

11
framework/db/dao/Command.php

@ -163,8 +163,7 @@ class Command extends \yii\base\Component
$sql = $this->getSql(); $sql = $this->getSql();
try { try {
$this->pdoStatement = $this->connection->pdo->prepare($sql); $this->pdoStatement = $this->connection->pdo->prepare($sql);
} } catch (\Exception $e) {
catch (\Exception $e) {
\Yii::error($e->getMessage() . "\nFailed to prepare SQL: $sql", __CLASS__); \Yii::error($e->getMessage() . "\nFailed to prepare SQL: $sql", __CLASS__);
$errorInfo = $e instanceof \PDOException ? $e->errorInfo : null; $errorInfo = $e instanceof \PDOException ? $e->errorInfo : null;
throw new Exception($e->getMessage(), (int)$e->getCode(), $errorInfo); throw new Exception($e->getMessage(), (int)$e->getCode(), $errorInfo);
@ -289,8 +288,7 @@ class Command extends \yii\base\Component
\Yii::endProfile(__METHOD__ . "($sql)", __CLASS__); \Yii::endProfile(__METHOD__ . "($sql)", __CLASS__);
} }
return $n; return $n;
} } catch (\Exception $e) {
catch (Exception $e) {
if ($this->connection->enableProfiling) { if ($this->connection->enableProfiling) {
\Yii::endProfile(__METHOD__ . "($sql)", __CLASS__); \Yii::endProfile(__METHOD__ . "($sql)", __CLASS__);
} }
@ -360,7 +358,7 @@ class Command extends \yii\base\Component
*/ */
public function queryScalar($params = array()) public function queryScalar($params = array())
{ {
$result = $this->queryInternal('fetchColumn', $params); $result = $this->queryInternal('fetchColumn', $params, 0);
if (is_resource($result) && get_resource_type($result) === 'stream') { if (is_resource($result) && get_resource_type($result) === 'stream') {
return stream_get_contents($result); return stream_get_contents($result);
} else { } else {
@ -452,8 +450,7 @@ class Command extends \yii\base\Component
} }
return $result; return $result;
} } catch (\Exception $e) {
catch (Exception $e) {
if ($db->enableProfiling) { if ($db->enableProfiling) {
\Yii::endProfile(__METHOD__ . "($sql)", __CLASS__); \Yii::endProfile(__METHOD__ . "($sql)", __CLASS__);
} }

3
framework/db/dao/Connection.php

@ -61,8 +61,7 @@ use yii\db\Exception;
* $connection->createCommand($sql2)->execute(); * $connection->createCommand($sql2)->execute();
* // ... executing other SQL statements ... * // ... executing other SQL statements ...
* $transaction->commit(); * $transaction->commit();
* } * } catch(Exception $e) {
* catch(Exception $e) {
* $transaction->rollBack(); * $transaction->rollBack();
* } * }
* ~~~ * ~~~

4
framework/db/dao/Query.php

@ -77,6 +77,10 @@ class Query extends \yii\base\Object
public $union; public $union;
/**
* @param Connection $connection
* @return string
*/
public function getSql($connection) public function getSql($connection)
{ {
return $connection->getQueryBuilder()->build($this); return $connection->getQueryBuilder()->build($this);

17
framework/db/dao/QueryBuilder.php

@ -22,22 +22,9 @@ class QueryBuilder extends \yii\base\Object
{ {
/** /**
* @var array the abstract column types mapped to physical column types. * @var array the abstract column types mapped to physical column types.
* Child classes should override this property to declare possible type mappings.
*/ */
public $typeMap = array( public $typeMap = array();
'pk' => 'int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY',
'string' => 'varchar(255)',
'text' => 'text',
'integer' => 'int(11)',
'float' => 'float',
'decimal' => 'decimal',
'datetime' => 'datetime',
'timestamp' => 'timestamp',
'time' => 'time',
'date' => 'date',
'binary' => 'blob',
'boolean' => 'tinyint(1)',
'money' => 'decimal(19,4)',
);
/** /**
* @var Connection the database connection. * @var Connection the database connection.
*/ */

22
framework/db/dao/Schema.php

@ -4,7 +4,7 @@
* *
* @author Qiang Xue <qiang.xue@gmail.com> * @author Qiang Xue <qiang.xue@gmail.com>
* @link http://www.yiiframework.com/ * @link http://www.yiiframework.com/
* @copyright Copyright &copy; 2008-2011 Yii Software LLC * @copyright Copyright &copy; 2008-2012 Yii Software LLC
* @license http://www.yiiframework.com/license/ * @license http://www.yiiframework.com/license/
*/ */
@ -20,6 +20,22 @@ use yii\db\Exception;
*/ */
abstract class Schema extends \yii\base\Object abstract class Schema extends \yii\base\Object
{ {
const TYPE_PK = 'pk';
const TYPE_STRING = 'string';
const TYPE_TEXT = 'text';
const TYPE_SMALLINT = 'smallint';
const TYPE_INTEGER = 'integer';
const TYPE_BIGINT = 'bigint';
const TYPE_FLOAT = 'float';
const TYPE_DECIMAL = 'decimal';
const TYPE_DATETIME = 'datetime';
const TYPE_TIMESTAMP = 'timestamp';
const TYPE_TIME = 'time';
const TYPE_DATE = 'date';
const TYPE_BINARY = 'binary';
const TYPE_BOOLEAN = 'boolean';
const TYPE_MONEY = 'money';
/** /**
* @var \yii\db\dao\Connection the database connection * @var \yii\db\dao\Connection the database connection
*/ */
@ -38,7 +54,7 @@ abstract class Schema extends \yii\base\Object
/** /**
* Constructor. * Constructor.
* @param CDbConnection $connection database connection. * @param Connection $connection database connection.
*/ */
public function __construct($connection) public function __construct($connection)
{ {
@ -48,7 +64,7 @@ abstract class Schema extends \yii\base\Object
/** /**
* Obtains the metadata for the named table. * Obtains the metadata for the named table.
* @param string $name table name. The table name may contain schema name if any. Do not quote the table name. * @param string $name table name. The table name may contain schema name if any. Do not quote the table name.
* @return CDbTableSchema table metadata. Null if the named table does not exist. * @return TableSchema table metadata. Null if the named table does not exist.
*/ */
public function getTableSchema($name) public function getTableSchema($name)
{ {

10
framework/db/dao/TableSchema.php

@ -15,16 +15,6 @@ namespace yii\db\dao;
* *
* It may be extended by different DBMS driver to provide DBMS-specific table metadata. * It may be extended by different DBMS driver to provide DBMS-specific table metadata.
* *
* TableSchema provides the following information about a table:
* <ul>
* <li>{@link name}</li>
* <li>{@link rawName}</li>
* <li>{@link columns}</li>
* <li>{@link primaryKey}</li>
* <li>{@link foreignKeys}</li>
* <li>{@link sequenceName}</li>
* </ul>
*
* @author Qiang Xue <qiang.xue@gmail.com> * @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0 * @since 2.0
*/ */

3
framework/db/dao/Transaction.php

@ -27,8 +27,7 @@ use yii\db\Exception;
* $connection->createCommand($sql2)->execute(); * $connection->createCommand($sql2)->execute();
* //.... other SQL executions * //.... other SQL executions
* $transaction->commit(); * $transaction->commit();
* } * } catch(Exception $e) {
* catch(Exception $e) {
* $transaction->rollBack(); * $transaction->rollBack();
* } * }
* ~~~ * ~~~

32
framework/db/dao/mysql/QueryBuilder.php

@ -21,22 +21,22 @@ class QueryBuilder extends \yii\db\dao\QueryBuilder
/** /**
* @var array the abstract column types mapped to physical column types. * @var array the abstract column types mapped to physical column types.
*/ */
public $columnTypes = array( public $typeMap = array(
'pk' => 'int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY', Schema::TYPE_PK => 'int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY',
'string' => 'varchar(255)', Schema::TYPE_STRING => 'varchar(255)',
'text' => 'text', Schema::TYPE_TEXT => 'text',
'smallint' => 'smallint', Schema::TYPE_SMALLINT => 'smallint(6)',
'integer' => 'int(11)', Schema::TYPE_INTEGER => 'int(11)',
'bigint'=> 'bigint', Schema::TYPE_BIGINT => 'bigint(20)',
'boolean' => 'tinyint(1)', Schema::TYPE_FLOAT => 'float',
'float' => 'float', Schema::TYPE_DECIMAL => 'decimal',
'decimal' => 'decimal', Schema::TYPE_DATETIME => 'datetime',
'money' => 'decimal(19,4)', Schema::TYPE_TIMESTAMP => 'timestamp',
'datetime' => 'datetime', Schema::TYPE_TIME => 'time',
'timestamp' => 'timestamp', Schema::TYPE_DATE => 'date',
'time' => 'time', Schema::TYPE_BINARY => 'blob',
'date' => 'date', Schema::TYPE_BOOLEAN => 'tinyint(1)',
'binary' => 'blob', Schema::TYPE_MONEY => 'decimal(19,4)',
); );
/** /**

10
framework/db/dao/mysql/Schema.php

@ -10,6 +10,8 @@
namespace yii\db\dao\mysql; namespace yii\db\dao\mysql;
use yii\db\dao\TableSchema;
/** /**
* Schema is the class for retrieving metadata information from a MySQL database (version 4.1.x and 5.x). * Schema is the class for retrieving metadata information from a MySQL database (version 4.1.x and 5.x).
* *
@ -43,7 +45,7 @@ class Schema extends \yii\db\dao\Schema
/** /**
* Loads the metadata for the specified table. * Loads the metadata for the specified table.
* @param string $name table name * @param string $name table name
* @return TableSchema driver dependent table metadata. Null if the table does not exist. * @return \yii\db\dao\TableSchema driver dependent table metadata. Null if the table does not exist.
*/ */
protected function loadTableSchema($name) protected function loadTableSchema($name)
{ {
@ -58,7 +60,7 @@ class Schema extends \yii\db\dao\Schema
/** /**
* Generates various kinds of table names. * Generates various kinds of table names.
* @param CMysqlTableSchema $table the table instance * @param \yii\db\dao\TableSchema $table the table instance
* @param string $name the unquoted table name * @param string $name the unquoted table name
*/ */
protected function resolveTableNames($table, $name) protected function resolveTableNames($table, $name)
@ -96,7 +98,7 @@ class Schema extends \yii\db\dao\Schema
/** /**
* Collects the table column metadata. * Collects the table column metadata.
* @param CMysqlTableSchema $table the table metadata * @param \yii\db\dao\TableSchema $table the table metadata
* @return boolean whether the table exists in the database * @return boolean whether the table exists in the database
*/ */
protected function findColumns($table) protected function findColumns($table)
@ -128,7 +130,7 @@ class Schema extends \yii\db\dao\Schema
/** /**
* Collects the foreign key column details for the given table. * Collects the foreign key column details for the given table.
* @param CMysqlTableSchema $table the table metadata * @param \yii\db\dao\TableSchema $table the table metadata
*/ */
protected function findConstraints($table) protected function findConstraints($table)
{ {

12
tests/unit/data/mysql.sql

@ -43,18 +43,18 @@ CREATE TABLE yii_post
( (
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(128) NOT NULL, title VARCHAR(128) NOT NULL,
create_time TIMESTAMP NOT NULL, create_time INTEGER NOT NULL,
author_id INTEGER NOT NULL, author_id INTEGER NOT NULL,
content TEXT, content TEXT,
CONSTRAINT FK_post_author FOREIGN KEY (author_id) CONSTRAINT FK_post_author FOREIGN KEY (author_id)
REFERENCES yii_user (id) ON DELETE CASCADE ON UPDATE RESTRICT REFERENCES yii_user (id) ON DELETE CASCADE ON UPDATE RESTRICT
) TYPE=INNODB; ) TYPE=INNODB;
INSERT INTO yii_post (title, create_time, author_id, content) VALUES ('post 1','2000-01-01',1,'content 1'); INSERT INTO yii_post (title, create_time, author_id, content) VALUES ('post 1','1324854194',1,'content 1');
INSERT INTO yii_post (title, create_time, author_id, content) VALUES ('post 2','2000-01-02',2,'content 2'); INSERT INTO yii_post (title, create_time, author_id, content) VALUES ('post 2','1324855194',2,'content 2');
INSERT INTO yii_post (title, create_time, author_id, content) VALUES ('post 3','2000-01-03',2,'content 3'); INSERT INTO yii_post (title, create_time, author_id, content) VALUES ('post 3','1324856194',2,'content 3');
INSERT INTO yii_post (title, create_time, author_id, content) VALUES ('post 4','2000-01-04',2,'content 4'); INSERT INTO yii_post (title, create_time, author_id, content) VALUES ('post 4','1324857194',2,'content 4');
INSERT INTO yii_post (title, create_time, author_id, content) VALUES ('post 5','2000-01-05',3,'content 5'); INSERT INTO yii_post (title, create_time, author_id, content) VALUES ('post 5','1324858194',3,'content 5');
CREATE TABLE yii_comment CREATE TABLE yii_comment
( (

339
tests/unit/framework/db/dao/CommandTest.php

@ -5,6 +5,7 @@ namespace yiiunit\framework\db\dao;
use yii\db\dao\Connection; use yii\db\dao\Connection;
use yii\db\dao\Command; use yii\db\dao\Command;
use yii\db\dao\Query; use yii\db\dao\Query;
use yii\db\dao\DataReader;
class CommandTest extends \yiiunit\MysqlTestCase class CommandTest extends \yiiunit\MysqlTestCase
{ {
@ -15,7 +16,7 @@ class CommandTest extends \yiiunit\MysqlTestCase
$command = $db->createCommand(); $command = $db->createCommand();
$this->assertEquals("SELECT *\nFROM ", $command->sql); $this->assertEquals("SELECT *\nFROM ", $command->sql);
$sql='SELECT * FROM posts'; $sql = 'SELECT * FROM yii_post';
$command = $db->createCommand($sql); $command = $db->createCommand($sql);
$this->assertEquals($sql, $command->sql); $this->assertEquals($sql, $command->sql);
@ -23,7 +24,7 @@ class CommandTest extends \yiiunit\MysqlTestCase
$command = $db->createCommand($query); $command = $db->createCommand($query);
$this->assertEquals($query, $command->query); $this->assertEquals($query, $command->query);
$query = array('select'=>'id', 'from'=>'posts'); $query = array('select' => 'id', 'from' => 'yii_post');
$command = $db->createCommand($query); $command = $db->createCommand($query);
$this->assertEquals($query, $command->query->toArray()); $this->assertEquals($query, $command->query->toArray());
} }
@ -44,248 +45,190 @@ class CommandTest extends \yiiunit\MysqlTestCase
function testGetSetSql() function testGetSetSql()
{ {
$db = $this->getConnection(false);
} $sql = 'SELECT * FROM yii_user';
$command = $db->createCommand($sql);
function testPrepare() $this->assertEquals($sql, $command->sql);
{
}
function testBindParam()
{
$sql2 = 'SELECT * FROM yii_yii_post';
$command->sql = $sql2;
$this->assertEquals($sql2, $command->sql);
} }
function testBindValue() function testPrepareCancel()
{ {
$db = $this->getConnection(false);
$command = $db->createCommand('SELECT * FROM yii_user');
$this->assertEquals(null, $command->pdoStatement);
$command->prepare();
$this->assertNotEquals(null, $command->pdoStatement);
$command->cancel();
$this->assertEquals(null, $command->pdoStatement);
} }
function testExecute() function testExecute()
{ {
$db = $this->getConnection();
} $sql = 'INSERT INTO yii_comment(content,post_id,author_id) VALUES (\'test comment\', 1, 1)';
$command = $db->createCommand($sql);
function testQuery() $this->assertEquals(1, $command->execute());
{
}
function testQueryRow()
{
}
function testQueryAll() $sql = 'SELECT COUNT(*) FROM yii_comment WHERE content=\'test comment\'';
{ $command = $db->createCommand($sql);
$this->assertEquals(1, $command->queryScalar());
$command = $db->createCommand('bad SQL');
$this->setExpectedException('\yii\db\Exception');
$command->execute();
} }
function testQueryColumn() function testQuery()
{ {
$db = $this->getConnection();
} // query
$sql = 'SELECT * FROM yii_post';
$reader = $db->createCommand($sql)->query();
$this->assertTrue($reader instanceof DataReader);
function testQueryScalar() // queryAll
{ $rows = $db->createCommand('SELECT * FROM yii_post')->queryAll();
$this->assertEquals(5, count($rows));
$row = $rows[2];
$this->assertEquals(3, $row['id']);
$this->assertEquals($row['title'], 'post 3');
} $rows = $db->createCommand('SELECT * FROM yii_post WHERE id=10')->queryAll();
$this->assertEquals(array(), $rows);
function testFetchMode() // queryRow
{ $sql = 'SELECT * FROM yii_post';
$row = $db->createCommand($sql)->queryRow();
} $this->assertEquals(1, $row['id']);
$this->assertEquals('post 1', $row['title'], 'post 1');
/* $sql = 'SELECT * FROM yii_post';
function testPrepare() $command = $db->createCommand($sql);
{
$sql='SELECT title FROM posts';
$command=$db->createCommand($sql);
$this->assertEquals($command->pdoStatement,null);
$command->prepare(); $command->prepare();
$this->assertTrue($command->pdoStatement instanceof PDOStatement); $row = $command->queryRow();
$this->assertEquals($command->queryScalar(),'post 1'); $this->assertEquals(1, $row['id']);
$this->assertEquals('post 1', $row['title']);
$command->text='Bad SQL'; $sql = 'SELECT * FROM yii_post WHERE id=10';
$this->setExpectedException('CException'); $command = $db->createCommand($sql);
$command->prepare(); $this->assertFalse($command->queryRow());
}
function testCancel() // queryColumn
{ $sql = 'SELECT * FROM yii_post';
$sql='SELECT title FROM posts'; $column = $db->createCommand($sql)->queryColumn();
$command=$db->createCommand($sql); $this->assertEquals(range(1, 5), $column);
$command->prepare();
$this->assertTrue($command->pdoStatement instanceof PDOStatement);
$command->cancel();
$this->assertEquals($command->pdoStatement,null);
}
function testExecute() $command = $db->createCommand('SELECT id FROM yii_post WHERE id=10');
{ $this->assertEquals(array(), $command->queryColumn());
$sql='INSERT INTO comments(content,post_id,author_id) VALUES (\'test comment\', 1, 1)';
$command=$db->createCommand($sql);
$this->assertEquals($command->execute(),1);
$this->assertEquals($command->execute(),1);
$command=$db->createCommand('SELECT * FROM comments WHERE content=\'test comment\'');
$this->assertEquals($command->execute(),0);
$command=$db->createCommand('SELECT COUNT(*) FROM comments WHERE content=\'test comment\'');
$this->assertEquals($command->queryScalar(),2);
$command=$db->createCommand('bad SQL');
$this->setExpectedException('CException');
$command->execute();
}
function testQuery() // queryScalar
{ $sql = 'SELECT * FROM yii_post';
$sql='SELECT * FROM posts'; $this->assertEquals($db->createCommand($sql)->queryScalar(), 1);
$reader=$db->createCommand($sql)->query();
$this->assertTrue($reader instanceof CDbDataReader);
$sql='SELECT * FROM posts'; $sql = 'SELECT id FROM yii_post';
$command=$db->createCommand($sql); $command = $db->createCommand($sql);
$command->prepare(); $command->prepare();
$reader=$command->query(); $this->assertEquals(1, $command->queryScalar());
$this->assertTrue($reader instanceof CDbDataReader);
$command = $db->createCommand('SELECT id FROM yii_post WHERE id=10');
$this->assertFalse($command->queryScalar());
$command=$db->createCommand('bad SQL'); $command = $db->createCommand('bad SQL');
$this->setExpectedException('CException'); $this->setExpectedException('\yii\db\Exception');
$command->query(); $command->query();
} }
function testBindParam() function testBindParamValue()
{ {
$sql='INSERT INTO posts(title,create_time,author_id) VALUES (:title, :create_time, 1)'; $db = $this->getConnection();
$command=$db->createCommand($sql);
$title='test title';
$createTime=time();
$command->bindParam(':title',$title);
$command->bindParam(':create_time',$createTime);
$command->execute();
$sql='SELECT create_time FROM posts WHERE title=:title';
$command=$db->createCommand($sql);
$command->bindParam(':title',$title);
$this->assertEquals($command->queryScalar(),$createTime);
$sql='INSERT INTO types (int_col, char_col, float_col, blob_col, numeric_col, bool_col) VALUES (:int_col, :char_col, :float_col, :blob_col, :numeric_col, :bool_col)';
$command=$db->createCommand($sql);
$intCol=123;
$charCol='abc';
$floatCol=1.23;
$blobCol="\x10\x11\x12";
$numericCol='1.23';
$boolCol=false;
$command->bindParam(':int_col',$intCol);
$command->bindParam(':char_col',$charCol);
$command->bindParam(':float_col',$floatCol);
$command->bindParam(':blob_col',$blobCol);
$command->bindParam(':numeric_col',$numericCol);
$command->bindParam(':bool_col',$boolCol);
$this->assertEquals(1,$command->execute());
$sql='SELECT * FROM types';
$row=$db->createCommand($sql)->queryRow();
$this->assertEquals($row['int_col'],$intCol);
$this->assertEquals($row['char_col'],$charCol);
$this->assertEquals($row['float_col'],$floatCol);
$this->assertEquals($row['blob_col'],$blobCol);
$this->assertEquals($row['numeric_col'],$numericCol);
}
function testBindValue() // bindParam
{ $sql = 'INSERT INTO yii_post(title,create_time,author_id) VALUES (:title, :create_time, 1)';
$sql='INSERT INTO comments(content,post_id,author_id) VALUES (:content, 1, 1)'; $command = $db->createCommand($sql);
$command=$db->createCommand($sql); $title = 'test title';
$command->bindValue(':content','test comment'); $createTime = time();
$command->bindParam(':title', $title);
$command->bindParam(':create_time', $createTime);
$command->execute(); $command->execute();
$sql='SELECT post_id FROM comments WHERE content=:content'; $sql = 'SELECT create_time FROM yii_post WHERE title=:title';
$command=$db->createCommand($sql); $command = $db->createCommand($sql);
$command->bindValue(':content','test comment'); $command->bindParam(':title', $title);
$this->assertEquals($command->queryScalar(),1); $this->assertEquals($createTime, $command->queryScalar());
}
function testQueryAll()
{
$rows=$db->createCommand('SELECT * FROM posts')->queryAll();
$this->assertEquals(count($rows),5);
$row=$rows[2];
$this->assertEquals($row['id'],3);
$this->assertEquals($row['title'],'post 3');
$rows=$db->createCommand('SELECT * FROM posts WHERE id=10')->queryAll();
$this->assertEquals($rows,array());
}
function testQueryRow()
{
$sql='SELECT * FROM posts';
$row=$db->createCommand($sql)->queryRow();
$this->assertEquals($row['id'],1);
$this->assertEquals($row['title'],'post 1');
$sql='SELECT * FROM posts';
$command=$db->createCommand($sql);
$command->prepare();
$row=$command->queryRow();
$this->assertEquals($row['id'],1);
$this->assertEquals($row['title'],'post 1');
$sql='SELECT * FROM posts WHERE id=10';
$command=$db->createCommand($sql);
$this->assertFalse($command->queryRow());
$command=$db->createCommand('bad SQL');
$this->setExpectedException('CException');
$command->queryRow();
}
function testQueryColumn() $sql = 'INSERT INTO yii_type (int_col, char_col, float_col, blob_col, numeric_col, bool_col) VALUES (:int_col, :char_col, :float_col, :blob_col, :numeric_col, :bool_col)';
{ $command = $db->createCommand($sql);
$sql='SELECT * FROM posts'; $intCol = 123;
$column=$db->createCommand($sql)->queryColumn(); $charCol = 'abc';
$this->assertEquals($column,range(1,5)); $floatCol = 1.23;
$blobCol = "\x10\x11\x12";
$numericCol = '1.23';
$boolCol = false;
$command->bindParam(':int_col', $intCol);
$command->bindParam(':char_col', $charCol);
$command->bindParam(':float_col', $floatCol);
$command->bindParam(':blob_col', $blobCol);
$command->bindParam(':numeric_col', $numericCol);
$command->bindParam(':bool_col', $boolCol);
$this->assertEquals(1, $command->execute());
$sql = 'SELECT * FROM yii_type';
$row = $db->createCommand($sql)->queryRow();
$this->assertEquals($intCol, $row['int_col']);
$this->assertEquals($charCol, $row['char_col']);
$this->assertEquals($floatCol, $row['float_col']);
$this->assertEquals($blobCol, $row['blob_col']);
$this->assertEquals($numericCol, $row['numeric_col']);
// bindValue
$sql = 'INSERT INTO yii_comment(content,post_id,author_id) VALUES (:content, 1, 1)';
$command = $db->createCommand($sql);
$command->bindValue(':content', 'test comment');
$command->execute();
$command=$db->createCommand('SELECT id FROM posts WHERE id=10'); $sql = 'SELECT post_id FROM yii_comment WHERE content=:content';
$this->assertEquals($command->queryColumn(),array()); $command = $db->createCommand($sql);
$command->bindValue(':content', 'test comment');
$this->assertEquals(1, $command->queryScalar());
$command=$db->createCommand('bad SQL'); // bind value via query or execute method
$this->setExpectedException('CException'); $sql = 'INSERT INTO yii_comment(content,post_id,author_id) VALUES (:content, 1, 1)';
$command->queryColumn(); $command = $db->createCommand($sql);
$command->execute(array(':content' => 'test comment2'));
$sql = 'SELECT post_id FROM yii_comment WHERE content=:content';
$command = $db->createCommand($sql);
$this->assertEquals(1, $command->queryScalar(array(':content' => 'test comment2')));
} }
function testQueryScalar() function testFetchMode()
{ {
$sql='SELECT * FROM posts'; $db = $this->getConnection();
$this->assertEquals($db->createCommand($sql)->queryScalar(),1);
$sql='SELECT id FROM posts';
$command=$db->createCommand($sql);
$command->prepare();
$this->assertEquals($command->queryScalar(),1);
$command=$db->createCommand('SELECT id FROM posts WHERE id=10');
$this->assertFalse($command->queryScalar());
$command=$db->createCommand('bad SQL');
$this->setExpectedException('CException');
$command->queryScalar();
}
function testFetchMode(){ // default: FETCH_ASSOC
$sql='SELECT * FROM posts'; $sql = 'SELECT * FROM yii_post';
$command=$db->createCommand($sql); $command = $db->createCommand($sql);
$result = $command->queryRow(); $result = $command->queryRow();
$this->assertTrue(is_array($result)); $this->assertTrue(is_array($result) && isset($result['id']));
$sql='SELECT * FROM posts'; // FETCH_OBJ, customized via fetchMode property
$command=$db->createCommand($sql); $sql = 'SELECT * FROM yii_post';
$command->setFetchMode(PDO::FETCH_OBJ); $command = $db->createCommand($sql);
$command->fetchMode = \PDO::FETCH_OBJ;
$result = $command->queryRow(); $result = $command->queryRow();
$this->assertTrue(is_object($result)); $this->assertTrue(is_object($result));
// FETCH_NUM, customized in query method
$sql = 'SELECT * FROM yii_post';
$command = $db->createCommand($sql);
$result = $command->queryRow(array(), \PDO::FETCH_NUM);
$this->assertTrue(is_array($result) && isset($result[0]));
} }
*/
} }
Loading…
Cancel
Save