Skip to content

Commit

Permalink
Add boolean type converter.
Browse files Browse the repository at this point in the history
  • Loading branch information
markstory committed Mar 6, 2013
1 parent f18a11e commit 1989520
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 5 deletions.
25 changes: 22 additions & 3 deletions lib/Cake/Model/Datasource/Database/Type.php
Expand Up @@ -53,6 +53,10 @@ class Type {
'integer' => ['callback' => 'intval', 'pdo' => PDO::PARAM_INT],
'string' => ['callback' => 'strval'],
'text' => ['callback' => 'strval'],
'boolean' => [
'callback' => '\Cake\Model\Datasource\Database\Type::boolval',

This comment has been minimized.

Copy link
@lorenzo

lorenzo Mar 6, 2013

Member

that was clever!

This comment has been minimized.

Copy link
@markstory

markstory Mar 6, 2013

Author Member

I wanted to use boolval() but its php 5.5. only 😢

'pdo' => PDO::PARAM_BOOL
],
];

/**
Expand Down Expand Up @@ -142,7 +146,7 @@ public function getName() {
}

/**
* Casts given value to one acceptable by database
* Casts given value from a PHP type to one acceptable by database
*
* @param mixed $value value to be converted to database equivalent
* @param Driver $driver object from which database preferences and configuration will be extracted
Expand All @@ -153,7 +157,7 @@ public function toDatabase($value, Driver $driver) {
}

/**
* Casts given value to PHP equivalent
* Casts given value from a database type to PHP equivalent
*
* @param mixed $value value to be converted to PHP equivalent
* @param Driver $driver object from which database preferences and configuration will be extracted
Expand All @@ -179,7 +183,7 @@ protected function _basicTypeCast($value, Driver $driver) {
if (!empty(self::$_basicTypes[$this->_name])) {
$typeInfo = self::$_basicTypes[$this->_name];
if (isset($typeInfo['callback'])) {
return $typeInfo['callback']($value);
return call_user_func($typeInfo['callback'], $value);
}
}
return $value;
Expand All @@ -205,4 +209,19 @@ public function toStatement($value, Driver $driver) {
return PDO::PARAM_STR;
}

/**
* Type converter for boolean values.
*
* Will convert string true/false into booleans.
*
* @param mixed $value The value to convert to a boolean.
* @return boolean
*/
public static function boolval($value) {
if (is_string($value)) {
return strtolower($value) === 'true' ? true : false;
}
return !empty($value);
}

}
58 changes: 56 additions & 2 deletions lib/Cake/Test/TestCase/Model/Datasource/Database/TypeTest.php
Expand Up @@ -30,7 +30,6 @@ class FooType extends \Cake\Model\Datasource\Database\Type {

/**
* Tests Type class
*
*/
class TypeTest extends \Cake\TestSuite\TestCase {

Expand Down Expand Up @@ -82,7 +81,8 @@ public function basicTypesProvider() {
array('float'),
array('integer'),
array('string'),
array('text')
array('text'),
array('boolean')
);
}

Expand Down Expand Up @@ -252,4 +252,58 @@ public function testTextToStatement() {
$this->assertEquals(PDO::PARAM_STR, $type->toStatement($string, $driver));
}

/**
* Test convertring booleans to database types.
*
* @return void
*/
public function testBooleanToDatabase() {
$type = Type::build('boolean');
$driver = $this->getMock('\Cake\Model\Datasource\Database\Driver');
$this->assertTrue($type->toDatabase(true, $driver));

$driver = $this->getMock('\Cake\Model\Datasource\Database\Driver');
$this->assertFalse($type->toDatabase(false, $driver));

$driver = $this->getMock('\Cake\Model\Datasource\Database\Driver');
$this->assertTrue($type->toDatabase(1, $driver));

$driver = $this->getMock('\Cake\Model\Datasource\Database\Driver');
$this->assertFalse($type->toDatabase(0, $driver));
}

/**
* Test convertring booleans to PDO types.
*
* @return void
*/
public function testBooleanToStatement() {
$type = Type::build('boolean');
$driver = $this->getMock('\Cake\Model\Datasource\Database\Driver');
$this->assertEquals(PDO::PARAM_BOOL, $type->toStatement(true, $driver));

$driver = $this->getMock('\Cake\Model\Datasource\Database\Driver');
$this->assertEquals(PDO::PARAM_BOOL, $type->toStatement(false, $driver));
}

/**
* Test convertring string booleans to PHP values.
*
* @return void
*/
public function testBooleanToPHP() {
$type = Type::build('boolean');
$driver = $this->getMock('\Cake\Model\Datasource\Database\Driver');

$this->assertTrue($type->toPHP(true, $driver));
$this->assertTrue($type->toPHP(1, $driver));
$this->assertTrue($type->toPHP('TRUE', $driver));
$this->assertTrue($type->toPHP('true', $driver));

$this->assertFalse($type->toPHP(false, $driver));
$this->assertFalse($type->toPHP(0, $driver));
$this->assertFalse($type->toPHP('FALSE', $driver));
$this->assertFalse($type->toPHP('false', $driver));
}

}

0 comments on commit 1989520

Please sign in to comment.