diff options
| -rw-r--r-- | framework/Data/TDbDataReader.php | 42 | ||||
| -rw-r--r-- | tests/unit/Data/TDbCommandTest.php | 3 | ||||
| -rw-r--r-- | tests/unit/Data/TDbDataReaderTest.php | 291 | 
3 files changed, 209 insertions, 127 deletions
| diff --git a/framework/Data/TDbDataReader.php b/framework/Data/TDbDataReader.php index ad3132b0..1d846839 100644 --- a/framework/Data/TDbDataReader.php +++ b/framework/Data/TDbDataReader.php @@ -80,8 +80,8 @@ class TDbDataReader extends TComponent implements Iterator  	}
  	/**
 -	 * Advances the reader to the next record in a result set.
 -	 * @return array|false the current record, false if no more row available
 +	 * Advances the reader to the next row in a result set.
 +	 * @return array|false the current row, false if no more row available
  	 */
  	public function read()
  	{
 @@ -89,8 +89,30 @@ class TDbDataReader extends TComponent implements Iterator  	}
  	/**
 +	 * Returns a single column from the next row of a result set.
 +	 * @param int zero-based column index
 +	 * @return mixed|false the column of the current row, false if no more row available
 +	 */
 +	public function readColumn($columnIndex)
 +	{
 +		return $this->_statement->fetchColumn($columnIndex);
 +	}
 +
 +	/**
 +	 * Returns a single column from the next row of a result set.
 +	 * @param string class name of the object to be created and populated
 +	 * @param array list of column names whose values are to be passed as parameters in the constructor of the class being created
 +	 * @return mixed|false the populated object, false if no more row of data available
 +	 */
 +	public function readObject($className,$fields)
 +	{
 +		return $this->_statement->fetchObject($className,$fields);
 +	}
 +
 +	/**
  	 * Reads the whole result set into an array.
 -	 * @return array|false the result set (each array element represents a row of data), false if no data is available.
 +	 * @return array the result set (each array element represents a row of data).
 +	 * An empty array will be returned if the result contains no row.
  	 */
  	public function readAll()
  	{
 @@ -126,16 +148,9 @@ class TDbDataReader extends TComponent implements Iterator  	}
  	/**
 -	 * @return boolean whether the result contains any row of data
 -	 */
 -	public function getHasRows()
 -	{
 -		return $this->getRowCount()>0;
 -	}
 -
 -	/**
  	 * @return int number of rows contained in the result.
 -	 * Note, some DBMS may not give a meaningful count.
 +	 * Note, most DBMS may not give a meaningful count.
 +	 * In this case, use "SELECT COUNT(*) FROM tableName" to obtain the number of rows.
  	 */
  	public function getRowCount()
  	{
 @@ -143,7 +158,8 @@ class TDbDataReader extends TComponent implements Iterator  	}
  	/**
 -	 * @return int the number of columns in the result set, 0 if the result is empty
 +	 * @return int the number of columns in the result set.
 +	 * Note, even there's no row in the reader, this still gives correct column number.
  	 */
  	public function getColumnCount()
  	{
 diff --git a/tests/unit/Data/TDbCommandTest.php b/tests/unit/Data/TDbCommandTest.php index 40d871e3..9023e6b6 100644 --- a/tests/unit/Data/TDbCommandTest.php +++ b/tests/unit/Data/TDbCommandTest.php @@ -112,7 +112,8 @@ class TDbCommandTest extends PHPUnit2_Framework_TestCase  		// test unprepared SQL execution  		$sql='INSERT INTO foo (name) VALUES (\'new name\')';  		$command=$this->_connection->createCommand($sql); -		$command->execute(); +		$n=$command->execute(); +		$this->assertEquals($n,1);  		$command->execute();  		$count=$this->_connection->createCommand('SELECT COUNT(id) AS id_count FROM foo')->queryScalar();  		$this->assertEquals('4',$count); diff --git a/tests/unit/Data/TDbDataReaderTest.php b/tests/unit/Data/TDbDataReaderTest.php index 21d6730b..68f9bfe8 100644 --- a/tests/unit/Data/TDbDataReaderTest.php +++ b/tests/unit/Data/TDbDataReaderTest.php @@ -1,114 +1,179 @@ -<?php - -require_once(dirname(__FILE__).'/../phpunit2.php'); - -Prado::using('System.Data.*'); - -define('TEST_DB_FILE',dirname(__FILE__).'/db/test.db'); -define('TEST_DB_FILE2',dirname(__FILE__).'/db/test2.db'); - -/** - * @package System.Data.PDO - */ -class TDbConnectionTest extends PHPUnit2_Framework_TestCase -{ -	private $_connection1; -	private $_connection2; - -	public function setUp() -	{ -		@unlink(TEST_DB_FILE); -		@unlink(TEST_DB_FILE2); -		$this->_connection1=new TDbConnection('sqlite:'.TEST_DB_FILE); -		$this->_connection1->Active=true; -		$this->_connection1->createCommand('CREATE TABLE foo (id INTEGER NOT NULL PRIMARY KEY, name VARCHAR(8))')->execute(); -		$this->_connection2=new TDbConnection('sqlite:'.TEST_DB_FILE2); -	} - -	public function tearDown() -	{ -		$this->_connection1=null; -		$this->_connection2=null; -	} - -	public function testActive() -	{ -	    $this->assertFalse($this->_connection2->Active); - -	    $this->_connection2->Active=true; -	    $this->assertTrue($this->_connection2->Active); -	    $pdo=$this->_connection2->PdoInstance; -	    // test setting Active repeatedly doesn't re-connect DB -	    $this->_connection2->Active=true; -	    $this->assertTrue($pdo===$this->_connection2->PdoInstance); - -		$this->_connection2->Active=false; -	    $this->assertFalse($this->_connection2->Active); -	} - -	public function testCreateCommand() -	{ -		$sql='CREATE TABLE foo (id INTEGER NOT NULL PRIMARY KEY, name VARCHAR(8))'; -		try -		{ -			$this->_connection2->createCommand($sql); -			$this->fail('Expected exception is not raised'); -		} -		catch(TDbException $e) -		{ -		} - -		$command=$this->_connection1->createCommand($sql); -		$this->assertTrue($command instanceof TDbCommand); -	} - -	public function testBeginTransaction() -	{ -		$sql='INSERT INTO foo(id,name) VALUES (1,\'my name\')'; -		$transaction=$this->_connection1->beginTransaction(); -		try -		{ -			$this->_connection1->createCommand($sql)->execute(); -			$this->_connection1->createCommand($sql)->execute(); -			$this->fail('Expected exception not raised'); -			$transaction->commit(); -		} -		catch(Exception $e) -		{ -			$transaction->rollBack(); -			$reader=$this->_connection1->createCommand('SELECT * FROM foo')->query(); -			$this->assertFalse($reader->read()); -		} -	} - -	public function testLastInsertID() -	{ -		$sql='INSERT INTO foo(name) VALUES (\'my name\')'; -		$this->_connection1->createCommand($sql)->execute(); -		$value=$this->_connection1->LastInsertID; -		$this->assertEquals($this->_connection1->LastInsertID,'1'); -	} - -	public function testQuoteString() -	{ -		$str="this is 'my' name"; -		$expectedStr="'this is ''my'' name'"; -		$this->assertEquals($expectedStr,$this->_connection1->quoteString($str)); -	} - -	public function testColumnNameCase() -	{ -		$this->assertEquals(TDbColumnCaseMode::Preserved,$this->_connection1->ColumnCase); -		$this->_connection1->ColumnCase=TDbColumnCaseMode::LowerCase; -		$this->assertEquals(TDbColumnCaseMode::LowerCase,$this->_connection1->ColumnCase); -	} - -	public function testNullConversion() -	{ -		$this->assertEquals(TDbNullConversionMode::Preserved,$this->_connection1->NullConversion); -		$this->_connection1->NullConversion=TDbNullConversionMode::NullToEmptyString; -		$this->assertEquals(TDbNullConversionMode::NullToEmptyString,$this->_connection1->NullConversion); -	} -} - +<?php
 +
 +require_once(dirname(__FILE__).'/../phpunit2.php');
 +
 +Prado::using('System.Data.*');
 +
 +define('TEST_DB_FILE',dirname(__FILE__).'/db/test.db');
 +
 +class FooRecord extends TComponent
 +{
 +	public $id;
 +	private $_name;
 +	public $param;
 +
 +	public function __construct($param)
 +	{
 +		$this->param=$param;
 +	}
 +
 +	public function getName()
 +	{
 +		return $this->_name;
 +	}
 +
 +	public function setName($value)
 +	{
 +		$this->_name=$value;
 +	}
 +}
 +
 +/**
 + * @package System.Data.PDO
 + */
 +class TDbDataReaderTest extends PHPUnit2_Framework_TestCase
 +{
 +	private $_connection;
 +
 +	public function setUp()
 +	{
 +		@unlink(TEST_DB_FILE);
 +		$this->_connection=new TDbConnection('sqlite:'.TEST_DB_FILE);
 +		$this->_connection->Active=true;
 +		$this->_connection->createCommand('CREATE TABLE foo (id INTEGER NOT NULL PRIMARY KEY, name VARCHAR(8))')->execute();
 +		$this->_connection->createCommand('INSERT INTO foo (name) VALUES (\'my name\')')->execute();
 +		$this->_connection->createCommand('INSERT INTO foo (name) VALUES (\'my name 2\')')->execute();
 +	}
 +
 +	public function tearDown()
 +	{
 +		$this->_connection=null;
 +	}
 +
 +	public function testRead()
 +	{
 +		$reader=$this->_connection->createCommand('SELECT * FROM foo')->query();
 +		$row=$reader->read();
 +		$this->assertTrue($row['id']==='1' && $row['name']==='my name');
 +		$row=$reader->read();
 +		$this->assertTrue($row['id']==='2' && $row['name']==='my name 2');
 +		$row=$reader->read();
 +		$this->assertFalse($row);
 +	}
 +
 +	public function testReadColumn()
 +	{
 +		$reader=$this->_connection->createCommand('SELECT * FROM foo')->query();
 +		$this->assertEquals($reader->readColumn(0),'1');
 +		$this->assertEquals($reader->readColumn(1),'my name 2');
 +		$this->assertFalse($reader->readColumn(0));
 +	}
 +
 +	public function testReadObject()
 +	{
 +		$reader=$this->_connection->createCommand('SELECT * FROM foo')->query();
 +		$object=$reader->readObject('FooRecord',array('object'));
 +		$this->assertEquals($object->id,'1');
 +		$this->assertEquals($object->Name,'my name');
 +		$this->assertEquals($object->param,'object');
 +	}
 +
 +	public function testReadAll()
 +	{
 +		$reader=$this->_connection->createCommand('SELECT * FROM foo')->query();
 +		$rows=$reader->readAll();
 +		$this->assertEquals(count($rows),2);
 +		$row=$rows[0];
 +		$this->assertTrue($row['id']==='1' && $row['name']==='my name');
 +		$row=$rows[1];
 +		$this->assertTrue($row['id']==='2' && $row['name']==='my name 2');
 +
 +		$reader=$this->_connection->createCommand('SELECT * FROM foo WHERE id=3')->query();
 +		$rows=$reader->readAll();
 +		$this->assertEquals($rows,array());
 +	}
 +
 +	public function testClose()
 +	{
 +		$reader=$this->_connection->createCommand('SELECT * FROM foo')->query();
 +		$row=$reader->read();
 +		$this->assertFalse($reader->IsClosed);
 +		$reader->close();
 +		$this->assertTrue($reader->IsClosed);
 +		try
 +		{
 +			$reader->read();
 +			$this->fail('Expected exception is not raised');
 +		}
 +		catch(Exception $e)
 +		{
 +		}
 +	}
 +
 +	public function testRowCount()
 +	{
 +		// unable to test because SQLite doesn't support row count
 +	}
 +
 +	public function testColumnCount()
 +	{
 +		$reader=$this->_connection->createCommand('SELECT * FROM foo')->query();
 +		$this->assertEquals($reader->ColumnCount,2);
 +
 +		$reader=$this->_connection->createCommand('SELECT * FROM foo WHERE id=11')->query();
 +		$this->assertEquals($reader->ColumnCount,2);
 +	}
 +
 +	public function testForeach()
 +	{
 +		$ids=array();
 +		$reader=$this->_connection->createCommand('SELECT * FROM foo')->query();
 +		foreach($reader as $row)
 +			$ids[]=$row['id'];
 +		$this->assertEquals(count($ids),2);
 +		$this->assertTrue($ids[0]==='1' && $ids[1]==='2');
 +
 +		try
 +		{
 +			foreach($reader as $row)
 +				$ids[]=$row['id'];
 +			$this->fail('Expected exception is not raised');
 +		}
 +		catch(TDbException $e)
 +		{
 +		}
 +	}
 +
 +	public function testFetchMode()
 +	{
 +		$reader=$this->_connection->createCommand('SELECT * FROM foo')->query();
 +
 +		$reader->FetchMode=PDO::FETCH_NUM;
 +		$row=$reader->read();
 +		$this->assertFalse(isset($row['id']));
 +		$this->assertTrue(isset($row[0]));
 +
 +		$reader->FetchMode=PDO::FETCH_ASSOC;
 +		$row=$reader->read();
 +		$this->assertTrue(isset($row['id']));
 +		$this->assertFalse(isset($row[0]));
 +	}
 +
 +	public function testBindColumn()
 +	{
 +		$reader=$this->_connection->createCommand('SELECT * FROM foo')->query();
 +		$reader->bindColumn(1,$id);
 +		$reader->bindColumn(2,$name);
 +		$reader->read();
 +		$this->assertEquals($id,'1');
 +		$this->assertEquals($name,'my name');
 +		$reader->read();
 +		$this->assertEquals($id,'2');
 +		$this->assertEquals($name,'my name 2');
 +		$reader->read();
 +		$this->assertEquals($id,'2');
 +		$this->assertEquals($name,'my name 2');
 +	}
 +}
 +
  ?>
\ No newline at end of file | 
