Browse Source

moved getPdoType() to Schema.

tags/2.0.0-beta
Qiang Xue 11 years ago
parent
commit
8899aaeb5b
  1. 31
      framework/yii/db/Command.php
  2. 20
      framework/yii/db/Schema.php
  3. 23
      tests/unit/framework/db/CommandTest.php
  4. 23
      tests/unit/framework/db/SchemaTest.php

31
framework/yii/db/Command.php

@ -181,8 +181,9 @@ class Command extends \yii\base\Component
{ {
$this->prepare(); $this->prepare();
if ($dataType === null) { if ($dataType === null) {
$this->pdoStatement->bindParam($name, $value, $this->getPdoType($value)); $dataType = $this->db->getSchema()->getPdoType($value);
} elseif ($length === null) { }
if ($length === null) {
$this->pdoStatement->bindParam($name, $value, $dataType); $this->pdoStatement->bindParam($name, $value, $dataType);
} elseif ($driverOptions === null) { } elseif ($driverOptions === null) {
$this->pdoStatement->bindParam($name, $value, $dataType, $length); $this->pdoStatement->bindParam($name, $value, $dataType, $length);
@ -208,10 +209,9 @@ class Command extends \yii\base\Component
{ {
$this->prepare(); $this->prepare();
if ($dataType === null) { if ($dataType === null) {
$this->pdoStatement->bindValue($name, $value, $this->getPdoType($value)); $dataType = $this->db->getSchema()->getPdoType($value);
} else {
$this->pdoStatement->bindValue($name, $value, $dataType);
} }
$this->pdoStatement->bindValue($name, $value, $dataType);
$this->_params[$name] = $value; $this->_params[$name] = $value;
return $this; return $this;
} }
@ -236,7 +236,7 @@ class Command extends \yii\base\Component
$type = $value[1]; $type = $value[1];
$value = $value[0]; $value = $value[0];
} else { } else {
$type = $this->getPdoType($value); $type = $this->db->getSchema()->getPdoType($value);
} }
$this->pdoStatement->bindValue($name, $value, $type); $this->pdoStatement->bindValue($name, $value, $type);
$this->_params[$name] = $value; $this->_params[$name] = $value;
@ -246,25 +246,6 @@ class Command extends \yii\base\Component
} }
/** /**
* Determines the PDO type for the given PHP data value.
* @param mixed $data the data whose PDO type is to be determined
* @return integer the PDO type
* @see http://www.php.net/manual/en/pdo.constants.php
*/
protected function getPdoType($data)
{
static $typeMap = array( // php type => PDO type
'boolean' => \PDO::PARAM_BOOL,
'integer' => \PDO::PARAM_INT,
'string' => \PDO::PARAM_STR,
'resource' => \PDO::PARAM_LOB,
'NULL' => \PDO::PARAM_NULL,
);
$type = gettype($data);
return isset($typeMap[$type]) ? $typeMap[$type] : \PDO::PARAM_STR;
}
/**
* Executes the SQL statement. * Executes the SQL statement.
* This method should only be used for executing non-query SQL statement, such as `INSERT`, `DELETE`, `UPDATE` SQLs. * This method should only be used for executing non-query SQL statement, such as `INSERT`, `DELETE`, `UPDATE` SQLs.
* No result set will be returned. * No result set will be returned.

20
framework/yii/db/Schema.php

@ -187,6 +187,26 @@ abstract class Schema extends Object
} }
/** /**
* Determines the PDO type for the given PHP data value.
* @param mixed $data the data whose PDO type is to be determined
* @return integer the PDO type
* @see http://www.php.net/manual/en/pdo.constants.php
*/
public function getPdoType($data)
{
static $typeMap = array(
// php type => PDO type
'boolean' => \PDO::PARAM_BOOL,
'integer' => \PDO::PARAM_INT,
'string' => \PDO::PARAM_STR,
'resource' => \PDO::PARAM_LOB,
'NULL' => \PDO::PARAM_NULL,
);
$type = gettype($data);
return isset($typeMap[$type]) ? $typeMap[$type] : \PDO::PARAM_STR;
}
/**
* Refreshes the schema. * Refreshes the schema.
* This method cleans up all cached table schemas so that they can be re-created later * This method cleans up all cached table schemas so that they can be re-created later
* to reflect the database schema change. * to reflect the database schema change.

23
tests/unit/framework/db/CommandTest.php

@ -219,29 +219,6 @@ class CommandTest extends DatabaseTestCase
$this->assertTrue(is_array($result) && isset($result[0])); $this->assertTrue(is_array($result) && isset($result[0]));
} }
// getPDOType is currently private
// public function testGetPDOType()
// {
// $values = array(
// array(null, \PDO::PARAM_NULL),
// array('', \PDO::PARAM_STR),
// array('hello', \PDO::PARAM_STR),
// array(0, \PDO::PARAM_INT),
// array(1, \PDO::PARAM_INT),
// array(1337, \PDO::PARAM_INT),
// array(true, \PDO::PARAM_BOOL),
// array(false, \PDO::PARAM_BOOL),
// array($fp=fopen(__FILE__, 'rb'), \PDO::PARAM_LOB),
// );
//
// $command = $this->getConnection()->createCommand();
//
// foreach($values as $value) {
// $this->assertEquals($value[1], $command->getPdoType($value[0]));
// }
// fclose($fp);
// }
public function testInsert() public function testInsert()
{ {
} }

23
tests/unit/framework/db/SchemaTest.php

@ -67,4 +67,27 @@ class SchemaTest extends DatabaseTestCase
$this->assertEquals('order_id', $table->foreignKeys[0]['order_id']); $this->assertEquals('order_id', $table->foreignKeys[0]['order_id']);
$this->assertEquals('item_id', $table->foreignKeys[0]['item_id']); $this->assertEquals('item_id', $table->foreignKeys[0]['item_id']);
} }
public function testGetPDOType()
{
$values = array(
array(null, \PDO::PARAM_NULL),
array('', \PDO::PARAM_STR),
array('hello', \PDO::PARAM_STR),
array(0, \PDO::PARAM_INT),
array(1, \PDO::PARAM_INT),
array(1337, \PDO::PARAM_INT),
array(true, \PDO::PARAM_BOOL),
array(false, \PDO::PARAM_BOOL),
array($fp=fopen(__FILE__, 'rb'), \PDO::PARAM_LOB),
);
/** @var Schema $schema */
$schema = $this->getConnection()->schema;
foreach($values as $value) {
$this->assertEquals($value[1], $schema->getPdoType($value[0]));
}
fclose($fp);
}
} }

Loading…
Cancel
Save