<?php
/**
* This file is part of Soloproyectos common library.
*
* @author Gonzalo Chumillas <gchumillas@email.com>
* @license https://github.com/soloproyectos/php.common-libs/blob/master/LICENSE BSD 2-Clause License
* @link https://github.com/soloproyectos/php.common-libs
*/
namespace com\soloproyectos\common\db;
use \ArrayAccess;
use \Countable;
use \Iterator;
/**
* Class DbDataSource.
*
* @package Db
* @author Gonzalo Chumillas <gchumillas@email.com>
* @license https://github.com/soloproyectos/php.common-libs/blob/master/LICENSE BSD 2-Clause License
* @link https://github.com/soloproyectos/php.common-libs
*/
class DbDataSource implements ArrayAccess, Iterator, Countable
{
/**
* List of rows.
* @var array of array
*/
private $_rows = array();
/**
* Constructor.
*
* @param Db $db Database connection
* @param string $sql DDL statement (select, show, describe...)
* @param arrray $arguments List of arguments passed the the statement (not required)
*/
public function __construct($db, $sql, $arguments = array())
{
$this->_db = $db;
$this->_rows = $this->_db->query($sql, $arguments);
}
/***************************
* Implements ArrayAccess. *
***************************/
/**
* Does the column exist?
*
* @param string $columnName Column name
*
* @return boolean
*/
public function offsetExists($columnName)
{
$row = current($this->_rows);
return array_key_exists($columnName, $row);
}
/**
* Gets the column value.
*
* @param string $columnName Column name
*
* @return string|null
*/
public function offsetGet($columnName)
{
$row = current($this->_rows);
return $row !== false? $row[$columnName] : null;
}
/**
* Sets the column value.
*
* @param string $columnName Column name
* @param mixed $value Value
*
* @return void
*/
public function offsetSet($columnName, $value)
{
$this->_rows[key($this->_rows)][$columnName] = "$value";
}
/**
* Removes a column.
*
* @param string $columnName Column name
*
* @return void
*/
public function offsetUnset($columnName)
{
unset($this->_rows[key($this->_rows)][$columnName]);
}
/************************
* Implements Iterator. *
************************/
/**
* Gets the current row.
*
* This function returns 'false' if the internal pointer has exceeded the end of the list.
*
* @return array|boolean
*/
public function current()
{
return current($this->_rows);
}
/**
* Gets the next row.
*
* This function returns 'false' if the internal pointer has reached the end of the list.
*
* @return array|boolean
*/
public function next()
{
return next($this->_rows);
}
/**
* Gets the internal pointer.
*
* @return integer
*/
public function key()
{
return key($this->_rows);
}
/**
* Rewinds the internal pointer.
*
* @return void
*/
public function rewind()
{
reset($this->_rows);
}
/**
* Is the current internal pointer valid?
*
* @return bool
*/
public function valid()
{
return key($this->_rows) !== null;
}
/*************************
* Implements Countable. *
*************************/
/**
* Gets the number of rows.
*
* @return integer
*/
public function count()
{
return count($this->_rows);
}
}
|