<?php
interface Aspire_Dbo_Statement
{
function __construct($initialQuery, $initialParameters = null);
function exec($parameters = null);
function fetch($fetchType = Aspire_Dbo::FETCH_ASSOC);
function fetchAll($fetchType = Aspire_Dbo::FETCH_ASSOC);
function fetchEntity($sender);
function fetchAllEntitys($sender);
}
class Aspire_Dbo_Mysql_Statement implements Aspire_Dbo_Statement
{
private $initialQuery = null;
private $query = null;
private $queryResult = null;
function __construct($initialQuery, $initialParameters = null)
{
$this->initialQuery = $initialQuery;
if ($initialParameters !== null) {
$this->query = $this->prepareQuery($initialParameters);
}
}
private function prepareQuery($parameters)
{
$resultingQuery = '';
$query = $this->initialQuery;
$qlen = strlen($query);
$lastBlock = 0;
$ptr = 0;
$lastParam = 0;
while ($ptr < $qlen) {
if ($query[$ptr] == ':') {
$ptr++;
$pstart = $ptr;
while($ptr < $qlen && ctype_alnum($query[$ptr])) {
$ptr++;
}
$paramId = substr($query, $pstart, $ptr - $pstart);
if (isset($parameters[$paramId])) {
$pstrLen = strlen($paramId);
$paramValue = $this->parseParameter($parameters[$paramId]);
$resultingQuery .= substr($query, $lastBlock, $ptr - $lastBlock - $pstrLen - 1);
$resultingQuery .= $paramValue;
$lastBlock = $ptr;
} else {
Aspire_Log::log('Undefined parameter ' . $paramId, Aspire_Log::Error);
return false;
}
} else if ($query[$ptr] == '?') {
if ($lastParam <= count($parameters)) {
$paramValue = $this->parseParameter($parameters[$lastParam]);
$resultingQuery .= substr($query, $lastBlock, $ptr - $lastBlock);
$resultingQuery .= $paramValue;
$lastBlock = $ptr + 1;
$lastParam++;
} else {
Aspire_Log::log('Undefined parameter #' . $lastParam, Aspire_Log::Error);
return false;
}
}
$ptr++;
}
return $resultingQuery;
}
private function parseParameter($param)
{
$paramValue = '';
switch ($param[1]) {
case Aspire_Dbo::PARAM_KEY:
$paramValue = '`' . mysql_real_escape_string($param[0]) . '`';
break;
case Aspire_Dbo::PARAM_STR:
$paramValue = '\'' . mysql_real_escape_string($param[0]) . '\'';
break;
case Aspire_Dbo::PARAM_INT:
$paramValue = intval($param[0]);
break;
default:
$paramValue = $param[0];
break;
}
return $paramValue;
}
/**
* Executes query and returns affected rows
*/
function exec($parameters = null)
{
if ($parameters !== null) {
$this->query = $this->prepareQuery($parameters);
}
$this->queryResult = @mysql_query($this->query);
if ($this->queryResult !== false) {
return true;
} else {
Aspire_Log::log('Query failed: ' . $this->query . '; ' . mysql_error(), Aspire_Log::Error);
return false;
}
}
private function getFetchFunction($fetchType)
{
switch ($fetchType)
{
case Aspire_Dbo::FETCH_ARRAY:
return 'mysql_fetch_array';
break;
case Aspire_Dbo::FETCH_OBJECT:
return 'mysql_fetch_object';
break;
default:
return 'mysql_fetch_assoc';
break;
}
}
function fetchAll($fetchType = Aspire_Dbo::FETCH_ASSOC)
{
if (!$this->queryResult) {
return false;
}
$results = array();
$fetchFunc = $this->getFetchFunction($fetchType);
while ($r = $fetchFunc($this->queryResult)) {
$results[] = $r;
}
return $results;
}
function fetch($fetchType = Aspire_Dbo::FETCH_ASSOC)
{
if (!$this->queryResult) {
return false;
}
$fetchFunc = $this->getFetchFunction($fetchType);
return $fetchFunc($this->queryResult);
}
function fetchEntity($sender)
{
if (!$this->queryResult) {
return false;
}
$entityClass = Aspire_Model::getEntityClass($sender);
return new $entityClass($this->fetch(Aspire_Dbo::FETCH_ASSOC));
}
function fetchAllEntitys($sender)
{
if (!$this->queryResult) {
return false;
}
$entityClass = Aspire_Model::getEntityClass($sender);
$results = array();
while ($r = mysql_fetch_assoc($this->queryResult)) {
$results[] = new $entityClass($r);
}
return $results;
}
}