summaryrefslogtreecommitdiffstats
path: root/modules/database/classes
diff options
context:
space:
mode:
Diffstat (limited to 'modules/database/classes')
-rw-r--r--modules/database/classes/database/expression.php46
-rw-r--r--modules/database/classes/database/query.php818
-rw-r--r--modules/database/classes/database/result.php200
-rw-r--r--modules/database/classes/db.php252
-rw-r--r--modules/database/classes/driver/mysql/db.php214
-rw-r--r--modules/database/classes/driver/mysql/query.php5
-rw-r--r--modules/database/classes/driver/mysql/result.php90
-rw-r--r--modules/database/classes/driver/pdo/db.php228
-rw-r--r--modules/database/classes/driver/pdo/query.php443
-rw-r--r--modules/database/classes/driver/pdo/result.php90
10 files changed, 1198 insertions, 1188 deletions
diff --git a/modules/database/classes/database/expression.php b/modules/database/classes/database/expression.php
index a041967..1d4de19 100644
--- a/modules/database/classes/database/expression.php
+++ b/modules/database/classes/database/expression.php
@@ -7,27 +7,29 @@
*/
class Expression_Database
{
- /**
- * Part of query that should not be escaped
- * @var mixed
- * @access public
- */
- public $value;
- /**
- * Marks a part of query as a database specific expression,
- * e.g. calls to SQL functions like MAX(), SUBSTR() etc.
- * Example
- * <code>
- * $q->fields(DB::expr('COUNT(*)'));
- * </code>
- *
- * @param mixed $value Part of query that should not be escaped
- * @return Expression_Database
- * @access public
- */
- public function __construct($value)
- {
- $this->value = $value;
- }
+ /**
+ * Part of query that should not be escaped
+ * @var mixed
+ * @access public
+ */
+ public $value;
+
+ /**
+ * Marks a part of query as a database specific expression,
+ * e.g. calls to SQL functions like MAX(), SUBSTR() etc.
+ * Example
+ * <code>
+ * $q->fields(DB::expr('COUNT(*)'));
+ * </code>
+ *
+ * @param mixed $value Part of query that should not be escaped
+ * @return Expression_Database
+ * @access public
+ */
+ public function __construct($value)
+ {
+ $this->value = $value;
+ }
+
}
diff --git a/modules/database/classes/database/query.php b/modules/database/classes/database/query.php
index 23b9876..e83a4bd 100644
--- a/modules/database/classes/database/query.php
+++ b/modules/database/classes/database/query.php
@@ -5,7 +5,7 @@
* Database drivers extend this class so that they can generate database specific queries.
* The idea is to provide a database agnostic interface to query writing.
*
- * @method mixed table(string $table = null) Set table to query.
+ * @method mixed table(string $table = null) Set table to query.
* Without arguments returns current table, returns self otherwise.
*
* @method mixed data(array $data = null) Set data for insert or update queries.
@@ -29,103 +29,104 @@
*/
abstract class Query_Database
{
- /**
- * Array of conditions that rows must meet
- * @var array
- * @access protected
- */
- protected $_conditions = array();
-
- /**
- * Table to query
- * @var unknown
- * @access protected
- */
- protected $_table;
-
- /**
- * Fields to return in the query
- * @var array
- * @access protected
- */
- protected $_fields;
-
- /**
- * Data for row insertion or update
- * @var unknown
- * @access protected
- */
- protected $_data;
-
- /**
- * Query type. Available types: select, update, insert, delete, count
- * @var string
- * @access protected
- */
- protected $_type;
-
- /**
- * Parameters for tables to join
- * @var array
- * @access protected
- */
- protected $_joins = array();
-
- /**
- * Number of rows to return
- * @var int
- * @access protected
- */
- protected $_limit;
-
- /**
- * Offset of the first row
- * @var int
- * @access protected
- */
- protected $_offset;
-
- /**
- * Columns and directions to order by
- * @var array
- * @access protected
- */
- protected $_orderby = array();
-
- /**
- * Database connection
- * @var DB
- * @access protected
- */
- protected $_db;
-
- /**
- * Conditions for aggregator functions
- * @var array
- * @access protected
- */
- protected $_having = array();
-
- /**
- * Column to group by for aggregator functions
- * @var string
- * @access protected
- */
- protected $_group_by;
-
- /**
- * Last alias used on the table
- * @var string
- * @access protected
- */
- protected $_alias = null;
-
- /**
- * Methods and type of value they allow that are available via __call
- * @var array
- * @access protected
- */
- protected $methods = array('data' => 'array','limit' => array('integer','NULL'),'offset' => array('integer','NULL'),'group_by' => array('string','NULL'),'type' => 'string');
+
+ /**
+ * Array of conditions that rows must meet
+ * @var array
+ * @access protected
+ */
+ protected $_conditions = array();
+
+ /**
+ * Table to query
+ * @var unknown
+ * @access protected
+ */
+ protected $_table;
+
+ /**
+ * Fields to return in the query
+ * @var array
+ * @access protected
+ */
+ protected $_fields;
+
+ /**
+ * Data for row insertion or update
+ * @var unknown
+ * @access protected
+ */
+ protected $_data;
+
+ /**
+ * Query type. Available types: select, update, insert, delete, count
+ * @var string
+ * @access protected
+ */
+ protected $_type;
+
+ /**
+ * Parameters for tables to join
+ * @var array
+ * @access protected
+ */
+ protected $_joins = array();
+
+ /**
+ * Number of rows to return
+ * @var int
+ * @access protected
+ */
+ protected $_limit;
+
+ /**
+ * Offset of the first row
+ * @var int
+ * @access protected
+ */
+ protected $_offset;
+
+ /**
+ * Columns and directions to order by
+ * @var array
+ * @access protected
+ */
+ protected $_orderby = array();
+
+ /**
+ * Database connection
+ * @var DB
+ * @access protected
+ */
+ protected $_db;
+
+ /**
+ * Conditions for aggregator functions
+ * @var array
+ * @access protected
+ */
+ protected $_having = array();
+
+ /**
+ * Column to group by for aggregator functions
+ * @var string
+ * @access protected
+ */
+ protected $_group_by;
+
+ /**
+ * Last alias used on the table
+ * @var string
+ * @access protected
+ */
+ protected $_alias = null;
+
+ /**
+ * Methods and type of value they allow that are available via __call
+ * @var array
+ * @access protected
+ */
+ protected $methods = array('data' => 'array', 'limit' => array('integer', 'NULL'), 'offset' => array('integer', 'NULL'), 'group_by' => array('string', 'NULL'), 'type' => 'string');
/**
* UNION queries
@@ -133,323 +134,326 @@ abstract class Query_Database
* @access protected
*/
protected $_union = array();
-
- /**
- * Generates a query in format that can be executed on current database implementation
- *
- * @access public
- */
- public abstract function query();
-
- /**
- * Creates a new query
- *
- * @param DB $db Database connection
- * @param string $type Query type. Available types: select, update, insert, delete, count
- * @return void
- * @access public
- */
- public function __construct($db, $type)
- {
- $this->_db = $db;
- $this->_type = $type;
- }
-
- /**
- * Sets fields to be queried from the database. You can add aliases to the fields
- * by passing them as:
- *
- * array('field_name','alias')
- *
- * Example: $query->fields('id', array('name', 'fairy_name'))
- *
- * @param mixed $field,... Fields to be selected from the table
- * @return mixed If no parameters are passed returns current array of fields,
- * otherwise returns self.
- * @access public
- */
- public function fields()
- {
- $p = func_get_args();
- if (empty($p))
- {
- return $this->_fields;
- }
- else
- {
- $this->_fields=$p;
- }
- return $this;
- }
/**
- * Sets the table to perform operations on, also supports subqueries
- *
+ * Generates a query in format that can be executed on current database implementation
+ *
+ * @access public
+ */
+ public abstract function query();
+
+ /**
+ * Creates a new query
+ *
+ * @param DB $db Database connection
+ * @param string $type Query type. Available types: select, update, insert, delete, count
+ * @return void
+ * @access public
+ */
+ public function __construct($db, $type)
+ {
+ $this->_db = $db;
+ $this->_type = $type;
+ }
+
+ /**
+ * Sets fields to be queried from the database. You can add aliases to the fields
+ * by passing them as:
+ *
+ * array('field_name','alias')
+ *
+ * Example: $query->fields('id', array('name', 'fairy_name'))
+ *
+ * @param mixed $field,... Fields to be selected from the table
+ * @return mixed If no parameters are passed returns current array of fields,
+ * otherwise returns self.
+ * @access public
+ */
+ public function fields()
+ {
+ $p = func_get_args();
+ if (empty($p))
+ {
+ return $this->_fields;
+ }
+ else
+ {
+ $this->_fields = $p;
+ }
+ return $this;
+ }
+
+ /**
+ * Sets the table to perform operations on, also supports subqueries
+ *
* @param string|Query_database|Expression_database $table table to select from
* @param string $alias Alias for this table
- * @return mixed Returns self if a table is passed, otherwise returns the table
- * @access public
- */
- public function table($table=null,$alias=null)
- {
+ * @return mixed Returns self if a table is passed, otherwise returns the table
+ * @access public
+ */
+ public function table($table = null, $alias = null)
+ {
if ($table == null)
- {
- return is_array($this->_table)?$this->_table[1]:$this->_table;
- }
-
- if (!is_string($table) && $alias==null)
- {
+ {
+ return is_array($this->_table) ? $this->_table[1] : $this->_table;
+ }
+
+ if (!is_string($table) && $alias == null)
+ {
$alias = $this->add_alias();
- }
- $this->_table = $alias == null?$table:array($table, $alias);
-
+ }
+ $this->_table = $alias == null ? $table : array($table, $alias);
+
return $this;
}
+
#
- /**
- * Magic methods to create methods for all generic query parts
- *
- * @param string $method Name of the method to call
- * @param array $args Array of parameters
- * @return mixed If no arguments are passed returns the current value of the property,
- * otherwise returns self.
- * @access public
- * @throws Exception If method doesn't exist
- * @throws Exception If value is of incorrect type
- * @see $methods
- */
- public function __call($method, $args)
- {
- if (isset($this->methods[$method]))
- {
- $property = '_'.$method;
-
- if (empty($args))
- {
- return $this->$property;
- }
- $val = $args[0];
- if (is_numeric($val))
- {
- $val = (int) $val;
- }
- $allowed_types = $this->methods[$method];
- if (!is_array($allowed_types))
- {
- $allowed_types=array($allowed_types);
- }
- if (!in_array(gettype($val), $allowed_types))
- {
- throw new Exception("Method '{$method}' only accepts values of type: ".implode(' or ',$allowed_types).", '{$val}' was passed");
- }
- $this->$property = $val;
- return $this;
- }
- throw new Exception("Method '{$method}' doesn't exist.");
- }
-
- /**
- * Executes the query
- *
- * @return object Executes current query on its database connection
- * @access public
- * @see DB
- */
- public function execute()
- {
- $query = $this->query();
- $result = $this->_db->execute($query[0], $query[1]);
- if ($this->_type == 'count')
- {
- return $result->get('count');
- }
- return $result;
- }
-
- /**
- * Adds a joined table to the query.
- *
- * @param string $table Table to join
- * @param array $conds Conditions to join tables on, same behavior as with where() method
- * @param string $type Type of join. Defaults to 'left'
- * @return Query_Database Returns self
- * @access public
- * @see where()
- */
- public function join($table,$conds,$type='left')
- {
- $this->_joins[] = array($table, $type, $this->get_condition_part($conds));
- return $this;
- }
-
- /**
- * Sets conditions for aggregate functions, same behavior as with where() method
- *
- * @return Query_Database Returns self
- * @access public
- * @see where()
- */
- public function having()
- {
- $p = func_get_args();
- $cond = $this->get_condition_part($p);
- $this->_having = array_merge($this->_having, array($cond));
- return $this;
- }
-
- /**
- * Adds a column to ordering parameters.
- *
- * @param string $column Column to order by
- * @param string $dir Ordering direction.
- * @return Query_Database Returns self
- * @throws Exception If ordering direction isn't DESC or ASC
- * @access public
- */
- public function order_by($column, $dir)
- {
- $dir = strtoupper($dir);
- if ($dir != 'DESC' && $dir != 'ASC')
- {
- throw new Exception("Invalid sorting direction {$dir} specified");
- }
- $this->_orderby[] = array($column,$dir);
- return $this;
- }
-
- /**
- * Sets conditions for the query.
- * Can be called in many ways, examples:
- * Shorthand equals condition:
- * <code>
- * $q->where('name', 'Tinkerbell')
- * </code>
- * Conditions with operator:
- * <code>
- * $q->where('id', '>', 3)
- * </code>
- * OR logic:
- * <code>
- * $q->where('or', array('name', 'Tinkerbell'))
- * </code>
- * OR logic with operator
- * <code>
- * ->where('or', array('id', '>', 3))
- * </code>
- * Arrays represent brackets. e.g
- * <code>
- * $q->where('name', 'Tinkerbell')
- * ->where('or', array(
- * array('id', '>', 7),
- * array('id', '<', 15)
- * );
- * //Will produce "WHERE `name`='Tinkerbell' OR (`id` > 7 AND `id` < 15)"
- * </code>
- * Multiple calls to where() append new conditions to previous ones
- *
- * @param mixed $column Column name, logic parameter 'OR' or 'AND' or an array of conditions
- * @param mixed $operator Condition value, operator or an array of parameters
- * @param mixed $val Condition value
- *
- * @return Query_Database Returns self
- * @access public
- */
- public function where()
- {
- $p = func_get_args();
- $cond = $this->get_condition_part($p);
- $this->_conditions = array_merge($this->_conditions, array($cond));
-
- return $this;
- }
-
- /**
- * Recursively builds condition arrays for methods like where(), having()
- *
- * @param array $p Parameters passed to the method
- * @return array Array in condition format
- * @access private
- * @throws Exception If condition format is incorrect
- */
- private function get_condition_part($p)
- {
- if (is_string($p[0]) && (strtolower($p[0]) == 'or' || strtolower($p[0]) == 'and') && isset($p[1]) && is_array($p[1]))
- {
- $cond = $this->get_condition_part($p[1]);
- $cond['logic'] = strtolower($p[0]);
- return $cond;
- }
-
- if (is_array($p[0]))
- {
- if (count($p) == 1)
- {
- return $this->get_condition_part($p[0]);
- }
- $conds = array();
- foreach($p as $q)
- {
- $conds[] = $this->get_condition_part($q);
- }
- if (count($conds) == 1)
- {
- return $conds;
- }
- return array('logic' => 'and', 'conditions' => $conds);
- }
-
- if ((is_string($p[0]) || get_class($p[0]) == 'Expression_Database') && isset($p[1]))
- {
- if (strpos($p[0], '.') === false)
- {
- $p[0]=$this->last_alias().'.'.$p[0];
- }
- return array(
- 'logic' => 'and',
- 'conditions' => array(
- 'field' => $p[0],
- 'operator' => isset($p[2]) ? $p[1] : '=',
- 'value' => isset($p[2]) ? $p[2] : $p[1]
- )
- );
- }
-
- throw new Exception('Incorrect conditional statement passed');
- }
-
- /**
- * Gets last generated alias
- *
- * @return string Last generated alias. If no alias were created returns table name.
- * @access public
- */
- public function last_alias()
- {
- if ($this->_alias === null)
- {
- return $this->_table;
- }
- return 'a'.$this->_alias;
- }
-
- /**
- * Generates new alias. Useful for dynamically adding aliases to joins.
- * Alias is just a letter 'a' with an incremented number.
- *
- * @return string New alias
- * @access public
- */
- public function add_alias()
- {
- if ($this->_alias === null)
- {
- $this->_alias = 0;
- }
- else
- {
- $this->_alias++;
- }
- return $this->last_alias();
- }
+ /**
+ * Magic methods to create methods for all generic query parts
+ *
+ * @param string $method Name of the method to call
+ * @param array $args Array of parameters
+ * @return mixed If no arguments are passed returns the current value of the property,
+ * otherwise returns self.
+ * @access public
+ * @throws Exception If method doesn't exist
+ * @throws Exception If value is of incorrect type
+ * @see $methods
+ */
+
+ public function __call($method, $args)
+ {
+ if (isset($this->methods[$method]))
+ {
+ $property = '_'.$method;
+
+ if (empty($args))
+ {
+ return $this->$property;
+ }
+ $val = $args[0];
+ if (is_numeric($val))
+ {
+ $val = (int) $val;
+ }
+ $allowed_types = $this->methods[$method];
+ if (!is_array($allowed_types))
+ {
+ $allowed_types = array($allowed_types);
+ }
+ if (!in_array(gettype($val), $allowed_types))
+ {
+ throw new Exception("Method '{$method}' only accepts values of type: ".implode(' or ', $allowed_types).", '{$val}' was passed");
+ }
+ $this->$property = $val;
+ return $this;
+ }
+ throw new Exception("Method '{$method}' doesn't exist.");
+ }
+
+ /**
+ * Executes the query
+ *
+ * @return object Executes current query on its database connection
+ * @access public
+ * @see DB
+ */
+ public function execute()
+ {
+ $query = $this->query();
+ $result = $this->_db->execute($query[0], $query[1]);
+ if ($this->_type == 'count')
+ {
+ return $result->get('count');
+ }
+ return $result;
+ }
+
+ /**
+ * Adds a joined table to the query.
+ *
+ * @param string $table Table to join
+ * @param array $conds Conditions to join tables on, same behavior as with where() method
+ * @param string $type Type of join. Defaults to 'left'
+ * @return Query_Database Returns self
+ * @access public
+ * @see where()
+ */
+ public function join($table, $conds, $type = 'left')
+ {
+ $this->_joins[] = array($table, $type, $this->get_condition_part($conds));
+ return $this;
+ }
+
+ /**
+ * Sets conditions for aggregate functions, same behavior as with where() method
+ *
+ * @return Query_Database Returns self
+ * @access public
+ * @see where()
+ */
+ public function having()
+ {
+ $p = func_get_args();
+ $cond = $this->get_condition_part($p);
+ $this->_having = array_merge($this->_having, array($cond));
+ return $this;
+ }
+
+ /**
+ * Adds a column to ordering parameters.
+ *
+ * @param string $column Column to order by
+ * @param string $dir Ordering direction.
+ * @return Query_Database Returns self
+ * @throws Exception If ordering direction isn't DESC or ASC
+ * @access public
+ */
+ public function order_by($column, $dir)
+ {
+ $dir = strtoupper($dir);
+ if ($dir != 'DESC' && $dir != 'ASC')
+ {
+ throw new Exception("Invalid sorting direction {$dir} specified");
+ }
+ $this->_orderby[] = array($column, $dir);
+ return $this;
+ }
+
+ /**
+ * Sets conditions for the query.
+ * Can be called in many ways, examples:
+ * Shorthand equals condition:
+ * <code>
+ * $q->where('name', 'Tinkerbell')
+ * </code>
+ * Conditions with operator:
+ * <code>
+ * $q->where('id', '>', 3)
+ * </code>
+ * OR logic:
+ * <code>
+ * $q->where('or', array('name', 'Tinkerbell'))
+ * </code>
+ * OR logic with operator
+ * <code>
+ * ->where('or', array('id', '>', 3))
+ * </code>
+ * Arrays represent brackets. e.g
+ * <code>
+ * $q->where('name', 'Tinkerbell')
+ * ->where('or', array(
+ * array('id', '>', 7),
+ * array('id', '<', 15)
+ * );
+ * //Will produce "WHERE `name`='Tinkerbell' OR (`id` > 7 AND `id` < 15)"
+ * </code>
+ * Multiple calls to where() append new conditions to previous ones
+ *
+ * @param mixed $column Column name, logic parameter 'OR' or 'AND' or an array of conditions
+ * @param mixed $operator Condition value, operator or an array of parameters
+ * @param mixed $val Condition value
+ *
+ * @return Query_Database Returns self
+ * @access public
+ */
+ public function where()
+ {
+ $p = func_get_args();
+ $cond = $this->get_condition_part($p);
+ $this->_conditions = array_merge($this->_conditions, array($cond));
+
+ return $this;
+ }
+
+ /**
+ * Recursively builds condition arrays for methods like where(), having()
+ *
+ * @param array $p Parameters passed to the method
+ * @return array Array in condition format
+ * @access private
+ * @throws Exception If condition format is incorrect
+ */
+ private function get_condition_part($p)
+ {
+ if (is_string($p[0]) && (strtolower($p[0]) == 'or' || strtolower($p[0]) == 'and') && isset($p[1]) && is_array($p[1]))
+ {
+ $cond = $this->get_condition_part($p[1]);
+ $cond['logic'] = strtolower($p[0]);
+ return $cond;
+ }
+
+ if (is_array($p[0]))
+ {
+ if (count($p) == 1)
+ {
+ return $this->get_condition_part($p[0]);
+ }
+ $conds = array();
+ foreach ($p as $q)
+ {
+ $conds[] = $this->get_condition_part($q);
+ }
+ if (count($conds) == 1)
+ {
+ return $conds;
+ }
+ return array('logic' => 'and', 'conditions' => $conds);
+ }
+
+ if ((is_string($p[0]) || get_class($p[0]) == 'Expression_Database') && isset($p[1]))
+ {
+ if (strpos($p[0], '.') === false)
+ {
+ $p[0] = $this->last_alias().'.'.$p[0];
+ }
+ return array(
+ 'logic' => 'and',
+ 'conditions' => array(
+ 'field' => $p[0],
+ 'operator' => isset($p[2]) ? $p[1] : '=',
+ 'value' => isset($p[2]) ? $p[2] : $p[1]
+ )
+ );
+ }
+
+ throw new Exception('Incorrect conditional statement passed');
+ }
+
+ /**
+ * Gets last generated alias
+ *
+ * @return string Last generated alias. If no alias were created returns table name.
+ * @access public
+ */
+ public function last_alias()
+ {
+ if ($this->_alias === null)
+ {
+ return $this->_table;
+ }
+ return 'a'.$this->_alias;
+ }
+
+ /**
+ * Generates new alias. Useful for dynamically adding aliases to joins.
+ * Alias is just a letter 'a' with an incremented number.
+ *
+ * @return string New alias
+ * @access public
+ */
+ public function add_alias()
+ {
+ if ($this->_alias === null)
+ {
+ $this->_alias = 0;
+ }
+ else
+ {
+ $this->_alias++;
+ }
+ return $this->last_alias();
+ }
+
}
diff --git a/modules/database/classes/database/result.php b/modules/database/classes/database/result.php
index 1c6b9fe..db58119 100644
--- a/modules/database/classes/database/result.php
+++ b/modules/database/classes/database/result.php
@@ -8,114 +8,114 @@
abstract class Result_Database implements Iterator
{
- /**
- * Current row number
- * @var integer
- * @access protected
- */
- protected $_position = -1;
+ /**
+ * Current row number
+ * @var integer
+ * @access protected
+ */
+ protected $_position = -1;
- /**
- * Database result object
- * @var mixed
- * @access protected
- */
- protected $_result;
+ /**
+ * Database result object
+ * @var mixed
+ * @access protected
+ */
+ protected $_result;
- /**
- * Current row
- * @var object
- * @access protected
- */
- protected $_row;
+ /**
+ * Current row
+ * @var object
+ * @access protected
+ */
+ protected $_row;
- /**
- * If at least one row has been fetched
- * @var object
- * @access protected
- */
- protected $_fetched = false;
+ /**
+ * If at least one row has been fetched
+ * @var object
+ * @access protected
+ */
+ protected $_fetched = false;
- /**
- * Returns current row
- *
- * @return object Current row in result set
- * @access public
- */
- public function current()
- {
- $this->check_fetched();
- return $this->_row;
- }
+ /**
+ * Returns current row
+ *
+ * @return object Current row in result set
+ * @access public
+ */
+ public function current()
+ {
+ $this->check_fetched();
+ return $this->_row;
+ }
- /**
- * Gets the number of the current row
- *
- * @return integer Row number
- * @access public
- */
- public function key()
- {
- $this->check_fetched();
- return $this->_position;
- }
+ /**
+ * Gets the number of the current row
+ *
+ * @return integer Row number
+ * @access public
+ */
+ public function key()
+ {
+ $this->check_fetched();
+ return $this->_position;
+ }
- /**
- * Check if current row exists.
- *
- * @return bool True if row exists
- * @access public
- */
- public function valid()
- {
- $this->check_fetched();
- return $this->_row != null;
- }
+ /**
+ * Check if current row exists.
+ *
+ * @return bool True if row exists
+ * @access public
+ */
+ public function valid()
+ {
+ $this->check_fetched();
+ return $this->_row != null;
+ }
- /**
- * Returns all rows as array
- *
- * @return array Array of rows
- * @access public
- */
- public function as_array()
- {
- $arr = array();
- foreach ($this as $row)
- {
- $arr[] = $row;
- }
- return $arr;
- }
+ /**
+ * Returns all rows as array
+ *
+ * @return array Array of rows
+ * @access public
+ */
+ public function as_array()
+ {
+ $arr = array();
+ foreach ($this as $row)
+ {
+ $arr[] = $row;
+ }
+ return $arr;
+ }
- /**
- * Checks if the rows from the result set have
- * been fetched at least once. If not fetches first row.
- *
- * @access public
- */
- protected function check_fetched()
- {
- if (!$this->_fetched)
- {
- $this->_fetched = true;
- $this->next();
- }
- }
+ /**
+ * Checks if the rows from the result set have
+ * been fetched at least once. If not fetches first row.
+ *
+ * @access public
+ */
+ protected function check_fetched()
+ {
+ if (!$this->_fetched)
+ {
+ $this->_fetched = true;
+ $this->next();
+ }
+ }
- /**
- * Gets a column from the current row in the set
- *
- * @param string $column Column name
- * @return mixed Column value
- * @access public
- */
- public function get($column)
- {
- if ($this->valid() && isset($this->_row->$column))
- {
- return $this->_row->$column;
- }
- }
+ /**
+ * Gets a column from the current row in the set
+ *
+ * @param string $column Column name
+ * @return mixed Column value
+ * @access public
+ */
+ public function get($column)
+ {
+ if ($this->valid() && isset($this->_row->$column))
+ {
+ return $this->_row->$column;
+ }
+ }
} \ No newline at end of file
diff --git a/modules/database/classes/db.php b/modules/database/classes/db.php
index 4979450..ee6d779 100644
--- a/modules/database/classes/db.php
+++ b/modules/database/classes/db.php
@@ -9,140 +9,140 @@
abstract class DB
{
- /**
- * An associative array of connections to databases
- * @var array
- * @access private
- * @static
- */
- private static $_instances = array();
+ /**
+ * An associative array of connections to databases
+ * @var array
+ * @access private
+ * @static
+ */
+ private static $_instances = array();
- /**
- * Executes a prepared statement query
- *
- * @param string $query A prepared statement query
- * @param array $params Parameters for the query
- * @return Result_Database
- * @access public
- * @see Result_Database
- */
- public abstract function execute($query, $params = array());
+ /**
+ * Executes a prepared statement query
+ *
+ * @param string $query A prepared statement query
+ * @param array $params Parameters for the query
+ * @return Result_Database
+ * @access public
+ * @see Result_Database
+ */
+ public abstract function execute($query, $params = array());
- /**
- * Builds a new Query to the database
- *
- * @param string $type Query type. Available types: select, update, insert, delete, count
- * @return Result_Database
- * @access public
- * @see Query_Database
- */
- public abstract function build_query($type);
+ /**
+ * Builds a new Query to the database
+ *
+ * @param string $type Query type. Available types: select, update, insert, delete, count
+ * @return Result_Database
+ * @access public
+ * @see Query_Database
+ */
+ public abstract function build_query($type);
- /**
- * Gets the id of the last inserted row.
- *
- * @return mixed The id of the last inserted row
- * @access public
- */
- public abstract function get_insert_id();
+ /**
+ * Gets the id of the last inserted row.
+ *
+ * @return mixed The id of the last inserted row
+ * @access public
+ */
+ public abstract function get_insert_id();
- /**
- * Gets column names for the specified table
- *
- * @param string $table Name of the table to get columns from
- * @return array Array of column names
- * @access public
- */
- public abstract function list_columns($table);
+ /**
+ * Gets column names for the specified table
+ *
+ * @param string $table Name of the table to get columns from
+ * @return array Array of column names
+ * @access public
+ */
+ public abstract function list_columns($table);
- /**
- * Executes a named query where parameters are passed as an associative array
- * Example:
- * <code>
- * $result=$db->namedQuery("SELECT * FROM fairies where name = :name",array('name'=>'Tinkerbell'));
- * </code>
- *
- * @param string $query A named query
- * @param array $params Associative array of parameters
- * @return Result_Database Current drivers implementation of Result_Database
- * @access public
- */
- public function named_query($query, $params = array())
- {
- $bind = array();
- preg_match_all('#:(\w+)#is', $query, $matches, PREG_SET_ORDER);
- foreach ($matches as $match)
- {
- if (isset($params[$match[1]]))
- {
- $query = preg_replace("#{$match[0]}#", '?', $query, 1);
- $bind[] = $params[$match[1]];
- }
- }
- return $this->execute($query, $bind);
- }
+ /**
+ * Executes a named query where parameters are passed as an associative array
+ * Example:
+ * <code>
+ * $result=$db->namedQuery("SELECT * FROM fairies where name = :name",array('name'=>'Tinkerbell'));
+ * </code>
+ *
+ * @param string $query A named query
+ * @param array $params Associative array of parameters
+ * @return Result_Database Current drivers implementation of Result_Database
+ * @access public
+ */
+ public function named_query($query, $params = array())
+ {
+ $bind = array();
+ preg_match_all('#:(\w+)#is', $query, $matches, PREG_SET_ORDER);
+ foreach ($matches as $match)
+ {
+ if (isset($params[$match[1]]))
+ {
+ $query = preg_replace("#{$match[0]}#", '?', $query, 1);
+ $bind[] = $params[$match[1]];
+ }
+ }
+ return $this->execute($query, $bind);
+ }
- /**
- * Returns an Expression_Database representation of the value.
- * Values wrapped inside Expression_Database are not escaped in queries
- *
- * @param mixed $value Value to be wrapped
- * @return Expression_Database Raw value that will not be escaped during query building
- * @access public
- * @static
- */
- public static function expr($value)
- {
- return new Expression_Database($value);
- }
+ /**
+ * Returns an Expression_Database representation of the value.
+ * Values wrapped inside Expression_Database are not escaped in queries
+ *
+ * @param mixed $value Value to be wrapped
+ * @return Expression_Database Raw value that will not be escaped during query building
+ * @access public
+ * @static
+ */
+ public static function expr($value)
+ {
+ return new Expression_Database($value);
+ }
- /**
- * Builds a query for specified connection.
- *
- * @param string $type Query type. Available types: select,update,insert,delete,count
- * @param string $config Configuration name of the connection.
- * Defaults to 'default'.
- * @return Query_Database Driver implementation of the Query_Database class.
- * @access public
- * @static
- */
- public static function query($type, $config = 'default')
- {
- return DB::instance($config)->build_query($type);
- }
+ /**
+ * Builds a query for specified connection.
+ *
+ * @param string $type Query type. Available types: select,update,insert,delete,count
+ * @param string $config Configuration name of the connection.
+ * Defaults to 'default'.
+ * @return Query_Database Driver implementation of the Query_Database class.
+ * @access public
+ * @static
+ */
+ public static function query($type, $config = 'default')
+ {
+ return DB::instance($config)->build_query($type);
+ }
- /**
- * Gets the id of the last inserted row
- *
- * @param string $config Configuration name of the connection.
- * Defaults to 'default'.
- * @return mixed Id of the last inserted row
- * @access public
- * @static
- */
- public static function insert_id($config = 'default')
- {
- return DB::instance($config)->get_insert_id();
- }
+ /**
+ * Gets the id of the last inserted row
+ *
+ * @param string $config Configuration name of the connection.
+ * Defaults to 'default'.
+ * @return mixed Id of the last inserted row
+ * @access public
+ * @static
+ */
+ public static function insert_id($config = 'default')
+ {
+ return DB::instance($config)->get_insert_id();
+ }
- /**
- * Gets an instance of a connection to the database
- *
- * @param string $config Configuration name of the connection.
- * Defaults to 'default'.
- * @return DB Driver implementation of the DB class.
- * @access public
- * @static
- */
- public static function instance($config = 'default')
- {
- if (!isset(DB::$_instances[$config]))
- {
- $driver = Config::get("database.{$config}.driver");
- $driver = "DB_{$driver}_Driver";
- DB::$_instances[$config] = new $driver($config);
- }
- return DB::$_instances[$config];
- }
+ /**
+ * Gets an instance of a connection to the database
+ *
+ * @param string $config Configuration name of the connection.
+ * Defaults to 'default'.
+ * @return DB Driver implementation of the DB class.
+ * @access public
+ * @static
+ */
+ public static function instance($config = 'default')
+ {
+ if (!isset(DB::$_instances[$config]))
+ {
+ $driver = Config::get("database.{$config}.driver");
+ $driver = "DB_{$driver}_Driver";
+ DB::$_instances[$config] = new $driver($config);
+ }
+ return DB::$_instances[$config];
+ }
}
diff --git a/modules/database/classes/driver/mysql/db.php b/modules/database/classes/driver/mysql/db.php
index 88df9b8..1d49acf 100644
--- a/modules/database/classes/driver/mysql/db.php
+++ b/modules/database/classes/driver/mysql/db.php
@@ -7,120 +7,120 @@
class DB_Mysql_Driver extends DB
{
- /**
- * Mysqli database connection object
- * @var mysqli
- * @access public
- * @link http://php.net/manual/en/class.mysqli.php
- */
- public $conn;
+ /**
+ * Mysqli database connection object
+ * @var mysqli
+ * @access public
+ * @link http://php.net/manual/en/class.mysqli.php
+ */
+ public $conn;
- /**
- * Type of the database, mysql.
- * @var string
- * @access public
- */
- public $db_type = 'mysql';
+ /**
+ * Type of the database, mysql.
+ * @var string
+ * @access public
+ */
+ public $db_type = 'mysql';
- /**
- * Initializes database connection
- *
- * @param string $config Name of the connection to initialize
- * @return void
- * @access public
- */
- public function __construct($config)
- {
- $this->conn = mysqli_connect(
- Config::get("database.{$config}.host", 'localhost'), Config::get("database.{$config}.user", ''), Config::get("database.{$config}.password", ''), Config::get("database.{$config}.db")
- );
- $this->conn->set_charset("utf8");
- }
+ /**
+ * Initializes database connection
+ *
+ * @param string $config Name of the connection to initialize
+ * @return void
+ * @access public
+ */
+ public function __construct($config)
+ {
+ $this->conn = mysqli_connect(
+ Config::get("database.{$config}.host", 'localhost'), Config::get("database.{$config}.user", ''), Config::get("database.{$config}.password", ''), Config::get("database.{$config}.db")
+ );
+ $this->conn->set_charset("utf8");
+ }
- /**
- * Gets column names for the specified table
- *
- * @param string $table Name of the table to get columns from
- * @return array Array of column names
- * @throw Exception if table doesn't exist
- * @access public
- */
- public function list_columns($table)
- {
- $columns = array();
- $table_desc = $this->execute("DESCRIBE `$table`");
- Debug::log($table_desc);
- if (!$table_desc->valid())
- {
- throw new Exception("Table '{$table}' doesn't exist");
- }
- foreach ($table_desc as $column)
- {
- $columns[] = $column->Field;
- }
+ /**
+ * Gets column names for the specified table
+ *
+ * @param string $table Name of the table to get columns from
+ * @return array Array of column names
+ * @throw Exception if table doesn't exist
+ * @access public
+ */
+ public function list_columns($table)
+ {
+ $columns = array();
+ $table_desc = $this->execute("DESCRIBE `$table`");
+ Debug::log($table_desc);
+ if (!$table_desc->valid())
+ {
+ throw new Exception("Table '{$table}' doesn't exist");
+ }
+ foreach ($table_desc as $column)
+ {
+ $columns[] = $column->Field;
+ }
- return $columns;
- }
+ return $columns;
+ }
- /**
- * Builds a new Query implementation
- *
- * @param string $type Query type. Available types: select,update,insert,delete,count
- * @return Query_Mysql_Driver Returns a Mysqli implementation of a Query.
- * @access public
- * @see Query_Database
- */
- public function build_query($type)
- {
- return new Query_Mysql_Driver($this, $type);
- }
+ /**
+ * Builds a new Query implementation
+ *
+ * @param string $type Query type. Available types: select,update,insert,delete,count
+ * @return Query_Mysql_Driver Returns a Mysqli implementation of a Query.
+ * @access public
+ * @see Query_Database
+ */
+ public function build_query($type)
+ {
+ return new Query_Mysql_Driver($this, $type);
+ }
- /**
- * Gets the id of the last inserted row.
- *
- * @return mixed Row id
- * @access public
- */
- public function get_insert_id()
- {
- return $this->conn->insert_id;
- }
+ /**
+ * Gets the id of the last inserted row.
+ *
+ * @return mixed Row id
+ * @access public
+ */
+ public function get_insert_id()
+ {
+ return $this->conn->insert_id;
+ }
- /**
- * Executes a prepared statement query
- *
- * @param string $query A prepared statement query
- * @param array $params Parameters for the query
- * @return Result_Mysql_Driver Mysqli implementation of a database result
- * @access public
- * @throws Exception If the query resulted in an error
- * @see Database_Result
- */
- public function execute($query, $params = array())
- {
- $cursor = $this->conn->prepare($query);
- if (!$cursor)
- {
- throw new Exception("Database error: {$this->conn->error} \n in query:\n{$query}");
- }
- $types = '';
- $bind = array();
- $refs = array();
- if (!empty($params))
- {
- foreach ($params as $key => $param)
- {
- $refs[$key] = is_array($param) ? $param[0] : $param;
- $bind[] = &$refs[$key];
- $types .= is_array($param) ? $param[1] : 's';
- }
- array_unshift($bind, $types);
+ /**
+ * Executes a prepared statement query
+ *
+ * @param string $query A prepared statement query
+ * @param array $params Parameters for the query
+ * @return Result_Mysql_Driver Mysqli implementation of a database result
+ * @access public
+ * @throws Exception If the query resulted in an error
+ * @see Database_Result
+ */
+ public function execute($query, $params = array())
+ {
+ $cursor = $this->conn->prepare($query);
+ if (!$cursor)
+ {
+ throw new Exception("Database error: {$this->conn->error} \n in query:\n{$query}");
+ }
+ $types = '';
+ $bind = array();
+ $refs = array();
+ if (!empty($params))
+ {
+ foreach ($params as $key => $param)
+ {
+ $refs[$key] = is_array($param) ? $param[0] : $param;
+ $bind[] = &$refs[$key];
+ $types .= is_array($param) ? $param[1] : 's';
+ }
+ array_unshift($bind, $types);
- call_user_func_array(array($cursor, 'bind_param'), $bind);
- }
- $cursor->execute();
- $res = $cursor->get_result();
- return new Result_Mysql_Driver($res);
- }
+ call_user_func_array(array($cursor, 'bind_param'), $bind);
+ }
+ $cursor->execute();
+ $res = $cursor->get_result();
+ return new Result_Mysql_Driver($res);
+ }
} \ No newline at end of file
diff --git a/modules/database/classes/driver/mysql/query.php b/modules/database/classes/driver/mysql/query.php
index 803f932..b880338 100644
--- a/modules/database/classes/driver/mysql/query.php
+++ b/modules/database/classes/driver/mysql/query.php
@@ -4,4 +4,7 @@
* Mysqli implementation of the database Query
* @package Database
*/
-class Query_Mysql_Driver extends Query_PDO_Driver {} \ No newline at end of file
+class Query_Mysql_Driver extends Query_PDO_Driver
+{
+
+}
diff --git a/modules/database/classes/driver/mysql/result.php b/modules/database/classes/driver/mysql/result.php
index e9de4a5..2927192 100644
--- a/modules/database/classes/driver/mysql/result.php
+++ b/modules/database/classes/driver/mysql/result.php
@@ -7,52 +7,52 @@
class Result_Mysql_Driver extends Result_Database
{
- /**
- * Initializes new result object
- *
- * @param mysqli_result $result Mysqli Result
- * @return void
- * @access public
- * @link http://php.net/manual/en/class.mysqli-result.php
- */
- public function __construct($result)
- {
- $this->_result = $result;
- }
+ /**
+ * Initializes new result object
+ *
+ * @param mysqli_result $result Mysqli Result
+ * @return void
+ * @access public
+ * @link http://php.net/manual/en/class.mysqli-result.php
+ */
+ public function __construct($result)
+ {
+ $this->_result = $result;
+ }
- /**
- * Throws exception if rewind is attempted.
- *
- * @return void
- * @access public
- * @throws Exception If rewind is attempted
- */
- public function rewind()
- {
- if ($this->_position > 0)
- {
- throw new Exception('Mysqli result cannot be rewound for unbuffered queries.');
- }
- }
+ /**
+ * Throws exception if rewind is attempted.
+ *
+ * @return void
+ * @access public
+ * @throws Exception If rewind is attempted
+ */
+ public function rewind()
+ {
+ if ($this->_position > 0)
+ {
+ throw new Exception('Mysqli result cannot be rewound for unbuffered queries.');
+ }
+ }
- /**
- * Iterates to the next row in the result set
- *
- * @return void
- * @access public
- */
- public function next()
- {
- $this->check_fetched();
- $this->_row = $this->_result->fetch_object();
- if ($this->_row)
- {
- $this->_position++;
- }
- else
- {
- $this->_result->free();
- }
- }
+ /**
+ * Iterates to the next row in the result set
+ *
+ * @return void
+ * @access public
+ */
+ public function next()
+ {
+ $this->check_fetched();
+ $this->_row = $this->_result->fetch_object();
+ if ($this->_row)
+ {
+ $this->_position++;
+ }
+ else
+ {
+ $this->_result->free();
+ }
+ }
} \ No newline at end of file
diff --git a/modules/database/classes/driver/pdo/db.php b/modules/database/classes/driver/pdo/db.php
index 5b81d66..5a920ec 100644
--- a/modules/database/classes/driver/pdo/db.php
+++ b/modules/database/classes/driver/pdo/db.php
@@ -7,125 +7,125 @@
class DB_PDO_Driver extends DB
{
- /**
- * Connection object
- * @var PDO
- * @access public
- * @link http://php.net/manual/en/class.pdo.php
- */
- public $conn;
+ /**
+ * Connection object
+ * @var PDO
+ * @access public
+ * @link http://php.net/manual/en/class.pdo.php
+ */
+ public $conn;
- /**
- * Type of the database, e.g. mysql, pgsql etc.
- * @var string
- * @access public
- */
- public $db_type;
+ /**
+ * Type of the database, e.g. mysql, pgsql etc.
+ * @var string
+ * @access public
+ */
+ public $db_type;
- /**
- * Initializes database connection
- *
- * @param string $config Name of the connection to initialize
- * @return void
- * @access public
- */
- public function __construct($config)
- {
- $this->conn = new PDO(
- Config::get("database.{$config}.connection"), Config::get("database.{$config}.user", ''), Config::get("database.{$config}.password", '')
- );
- $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
- $this->db_type = strtolower(str_replace('PDO_', '', $this->conn->getAttribute(PDO::ATTR_DRIVER_NAME)));
- if ($this->db_type != 'sqlite')
- {
- $this->conn->exec("SET NAMES utf8");
- }
- }
+ /**
+ * Initializes database connection
+ *
+ * @param string $config Name of the connection to initialize
+ * @return void
+ * @access public
+ */
+ public function __construct($config)
+ {
+ $this->conn = new PDO(
+ Config::get("database.{$config}.connection"), Config::get("database.{$config}.user", ''), Config::get("database.{$config}.password", '')
+ );
+ $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+ $this->db_type = strtolower(str_replace('PDO_', '', $this->conn->getAttribute(PDO::ATTR_DRIVER_NAME)));
+ if ($this->db_type != 'sqlite')
+ {
+ $this->conn->exec("SET NAMES utf8");
+ }
+ }
- /**
- * Builds a new Query implementation
- *
- * @param string $type Query type. Available types: select,update,insert,delete,count
- * @return Query_PDO_Driver Returns a PDO implementation of a Query.
- * @access public
- * @see Query_Database
- */
- public function build_query($type)
- {
- return new Query_PDO_Driver($this, $type);
- }
+ /**
+ * Builds a new Query implementation
+ *
+ * @param string $type Query type. Available types: select,update,insert,delete,count
+ * @return Query_PDO_Driver Returns a PDO implementation of a Query.
+ * @access public
+ * @see Query_Database
+ */
+ public function build_query($type)
+ {
+ return new Query_PDO_Driver($this, $type);
+ }
- /**
- * Gets the id of the last inserted row.
- *
- * @return mixed Row id
- * @access public
- */
- public function get_insert_id()
- {
- if ($this->db_type == 'pgsql')
- {
- return $this->execute('SELECT lastval() as id')->current()->id;
- }
- return $this->conn->lastInsertId();
- }
+ /**
+ * Gets the id of the last inserted row.
+ *
+ * @return mixed Row id
+ * @access public
+ */
+ public function get_insert_id()
+ {
+ if ($this->db_type == 'pgsql')
+ {
+ return $this->execute('SELECT lastval() as id')->current()->id;
+ }
+ return $this->conn->lastInsertId();
+ }
- /**
- * Gets column names for the specified table
- *
- * @param string $table Name of the table to get columns from
- * @return array Array of column names
- * @access public
- */
- public function list_columns($table)
- {
- $columns = array();
- if ($this->db_type == 'mysql')
- {
- $table_desc = $this->execute("DESCRIBE `$table`");
- foreach ($table_desc as $column)
- {
- $columns[] = $column->Field;
- }
- }
- if ($this->db_type == 'pgsql')
- {
- $table_desc = $this->execute("select column_name from information_schema.columns where table_name = '{$table}' and table_catalog=current_database();");
- foreach ($table_desc as $column)
- {
- $columns[] = $column->column_name;
- }
- }
- if ($this->db_type == 'sqlite')
- {
- $table_desc = $this->execute("PRAGMA table_info('$table')");
- foreach ($table_desc as $column)
- {
- $columns[] = $column->name;
- }
- }
- return $columns;
- }
+ /**
+ * Gets column names for the specified table
+ *
+ * @param string $table Name of the table to get columns from
+ * @return array Array of column names
+ * @access public
+ */
+ public function list_columns($table)
+ {
+ $columns = array();
+ if ($this->db_type == 'mysql')
+ {
+ $table_desc = $this->execute("DESCRIBE `$table`");
+ foreach ($table_desc as $column)
+ {
+ $columns[] = $column->Field;
+ }
+ }
+ if ($this->db_type == 'pgsql')
+ {
+ $table_desc = $this->execute("select column_name from information_schema.columns where table_name = '{$table}' and table_catalog=current_database();");
+ foreach ($table_desc as $column)
+ {
+ $columns[] = $column->column_name;
+ }
+ }
+ if ($this->db_type == 'sqlite')
+ {
+ $table_desc = $this->execute("PRAGMA table_info('$table')");
+ foreach ($table_desc as $column)
+ {
+ $columns[] = $column->name;
+ }
+ }
+ return $columns;
+ }
- /**
- * Executes a prepared statement query
- *
- * @param string $query A prepared statement query
- * @param array $params Parameters for the query
- * @return Result_PDO_Driver PDO implementation of a database result
- * @access public
- * @throws Exception If the query resulted in an error
- * @see Database_Result
- */
- public function execute($query, $params = array())
- {
- $cursor = $this->conn->prepare($query);
- if (!$cursor->execute($params))
- {
- $error = $cursor->errorInfo();
- throw new Exception("Database error:\n".$error[2]." \n in query:\n{$query}");
- }
- return new Result_PDO_Driver($cursor);
- }
+ /**
+ * Executes a prepared statement query
+ *
+ * @param string $query A prepared statement query
+ * @param array $params Parameters for the query
+ * @return Result_PDO_Driver PDO implementation of a database result
+ * @access public
+ * @throws Exception If the query resulted in an error
+ * @see Database_Result
+ */
+ public function execute($query, $params = array())
+ {
+ $cursor = $this->conn->prepare($query);
+ if (!$cursor->execute($params))
+ {
+ $error = $cursor->errorInfo();
+ throw new Exception("Database error:\n".$error[2]." \n in query:\n{$query}");
+ }
+ return new Result_PDO_Driver($cursor);
+ }
} \ No newline at end of file
diff --git a/modules/database/classes/driver/pdo/query.php b/modules/database/classes/driver/pdo/query.php
index d78316d..5d82cbf 100644
--- a/modules/database/classes/driver/pdo/query.php
+++ b/modules/database/classes/driver/pdo/query.php
@@ -7,96 +7,96 @@
class Query_PDO_Driver extends Query_Database
{
- /**
- * Type of the database, e.g. mysql, pgsql etc.
- * @var string
- * @access public
- */
- protected $_db_type;
+ /**
+ * Type of the database, e.g. mysql, pgsql etc.
+ * @var string
+ * @access public
+ */
+ protected $_db_type;
- /**
- * Character to use for quoting fields
- * @var string
- * @access public
- */
- protected $_quote;
+ /**
+ * Character to use for quoting fields
+ * @var string
+ * @access public
+ */
+ protected $_quote;
- /**
- * Creates a new query object, checks which driver we are using and set the character used for quoting
- *
- * @param DB $db Database connection
- * @param string $type Query type. Available types: select, update, insert, delete, count
- * @return void
- * @access public
- * @see Query_Database::__construct()
- */
- public function __construct($db, $type)
- {
- parent::__construct($db, $type);
- $this->_db_type = $this->_db->db_type;
- $this->_quote = $this->_db_type == 'mysql' ? '`' : '"';
- }
+ /**
+ * Creates a new query object, checks which driver we are using and set the character used for quoting
+ *
+ * @param DB $db Database connection
+ * @param string $type Query type. Available types: select, update, insert, delete, count
+ * @return void
+ * @access public
+ * @see Query_Database::__construct()
+ */
+ public function __construct($db, $type)
+ {
+ parent::__construct($db, $type);
+ $this->_db_type = $this->_db->db_type;
+ $this->_quote = $this->_db_type == 'mysql' ? '`' : '"';
+ }
- /**
- * Puts quotes around a string
- *
- * @param string $str String to be enclosed in quotes
- * @return string String surrounded with quotes
- * @access protected
- */
- protected function quote($str)
- {
- return $this->_quote.$str.$this->_quote;
- }
+ /**
+ * Puts quotes around a string
+ *
+ * @param string $str String to be enclosed in quotes
+ * @return string String surrounded with quotes
+ * @access protected
+ */
+ protected function quote($str)
+ {
+ return $this->_quote.$str.$this->_quote;
+ }
- /**
- * If a string is passed escapes a field by enclosing it in specified quotes.
- * If you pass an Expression_Database object the value will be inserted into the query unescaped
- *
- * @param mixed $field Field to be escaped or an Expression_Database object
- * if the field must not be escaped
- * @return string Escaped field representation
- * @access public
- * @see Expression_Database
- */
- public function escape_field($field)
- {
- if (is_object($field) && get_class($field) == 'Expression_Database')
- {
- return $field->value;
- }
- $field = explode('.', $field);
- if (count($field) == 1)
- {
- array_unshift($field, $this->last_alias());
- }
- $str = $this->quote($field[0]).'.';
- if (trim($field[1]) == '*')
- {
- return $str.'*';
- }
- return $str.$this->quote($field[1]);
- }
+ /**
+ * If a string is passed escapes a field by enclosing it in specified quotes.
+ * If you pass an Expression_Database object the value will be inserted into the query unescaped
+ *
+ * @param mixed $field Field to be escaped or an Expression_Database object
+ * if the field must not be escaped
+ * @return string Escaped field representation
+ * @access public
+ * @see Expression_Database
+ */
+ public function escape_field($field)
+ {
+ if (is_object($field) && get_class($field) == 'Expression_Database')
+ {
+ return $field->value;
+ }
+ $field = explode('.', $field);
+ if (count($field) == 1)
+ {
+ array_unshift($field, $this->last_alias());
+ }
+ $str = $this->quote($field[0]).'.';
+ if (trim($field[1]) == '*')
+ {
+ return $str.'*';
+ }
+ return $str.$this->quote($field[1]);
+ }
- /**
- * Replaces the value with ? and appends it to the parameters array
- * If you pass an Expression_Database object the value will be inserted into the query unescaped
- * @param mixed $val Value to be escaped or an Expression_Database object
- * if the value must not be escaped
- * @param array &$params Reference to parameters array
- * @return string Escaped value representation
- * @access public
- */
- public function escape_value($val,&$params)
- {
+ /**
+ * Replaces the value with ? and appends it to the parameters array
+ * If you pass an Expression_Database object the value will be inserted into the query unescaped
+ * @param mixed $val Value to be escaped or an Expression_Database object
+ * if the value must not be escaped
+ * @param array &$params Reference to parameters array
+ * @return string Escaped value representation
+ * @access public
+ */
+ public function escape_value($val, &$params)
+ {
if ($val instanceof Expression_Database)
- {
+ {
return $val->value;
- }
+ }
if ($val instanceof Query_Database)
- {
- return $this->subquery($val,$params);
- }
+ {
+ return $this->subquery($val, $params);
+ }
$params[] = $val;
return '?';
}
@@ -106,295 +106,296 @@ class Query_PDO_Driver extends Query_Database
*
* @param Query_Database $query Query builder for the subquery
* @param array &$params Reference to parameters array
- * @return string Subquery SQL
- * @access public
+ * @return string Subquery SQL
+ * @access public
*/
- protected function subquery($query, &$params) {
+ protected function subquery($query, &$params)
+ {
$query = $query->query();
$params = array_merge($params, $query[1]);
return "({$query[0]}) ";
}
-
+
/**
* Gets the SQL for a table to select from
*
* @param string|Expression_Database|Query_Database|array $table Table representation
* @param array &$params Reference to parameters array
* @param string &alias Alias for this table
- * @return string Table SQL
- * @access public
+ * @return string Table SQL
+ * @access public
*/
- public function escape_table($table, &$params) {
- $alias=null;
- if (is_array($table)) {
+ public function escape_table($table, &$params)
+ {
+ $alias = null;
+ if (is_array($table))
+ {
$alias = $table[1];
$table = $table[0];
}
-
- if (is_string($table)){
+
+ if (is_string($table))
+ {
$table = $this->quote($table);
if ($alias != null)
$table.= " AS {$alias}";
return $table;
}
-
+
if ($alias == null)
$alias = $this->last_alias();
-
- if($table instanceof Query_Database)
- return "{$this->subquery($table,$params)} AS {$alias}";
-
- if($table instanceof Expression_Database)
+
+ if ($table instanceof Query_Database)
+ return "{$this->subquery($table, $params)} AS {$alias}";
+
+ if ($table instanceof Expression_Database)
return "({$table->value}) AS {$alias}";
-
+
throw new Exception("Parameter type {get_class($table)} cannot be used as a table");
}
- /**
- * Builds a query and fills the $params array with parameter values
- *
- * @return array An array with a prepared query string and an array of parameters
- * @access public
- */
+ /**
+ * Builds a query and fills the $params array with parameter values
+ *
+ * @return array An array with a prepared query string and an array of parameters
+ * @access public
+ */
public function query()
- {
-
+ {
+
$query = '';
$params = array();
-
+
if ($this->_type == 'insert')
- {
+ {
$query .= "INSERT INTO {$this->quote($this->_table)} ";
if (empty($this->_data) && $this->_db_type == 'pgsql')
- {
+ {
$query.= "DEFAULT VALUES ";
}
- else
- {
+ else
+ {
$columns = '';
$values = '';
$first = true;
- foreach($this->_data as $key => $val)
- {
+ foreach ($this->_data as $key => $val)
+ {
if (!$first)
- {
+ {
$values .= ', ';
$columns .= ', ';
}
- else
- {
+ else
+ {
$first = false;
}
$columns .= $this->quote($key);
- $values .= $this->escape_value($val,$params);
+ $values .= $this->escape_value($val, $params);
}
$query .= "({$columns}) VALUES({$values})";
}
- }
- else
- {
+ }
+ else
+ {
if ($this->_type == 'select')
- {
+ {
$query .= "SELECT ";
- if ($this->_fields==null)
- {
+ if ($this->_fields == null)
+ {
$query .= "* ";
}
- else
- {
+ else
+ {
$first = true;
foreach ($this->_fields as $f)
- {
+ {
if (!$first)
- {
+ {
$query .= ", ";
}
- else
- {
+ else
+ {
$first = false;
}
if (is_array($f))
- {
+ {
$query .= "{$this->escape_field($f[0])} AS {$f[1]} ";
}
- else
- {
+ else
+ {
$query .= "{$this->escape_field($f)} ";
}
}
}
- $query .= "FROM {$this->escape_table($this->_table,$params)} ";
+ $query .= "FROM {$this->escape_table($this->_table, $params)} ";
}
if ($this->_type == 'count')
- {
- $query .= "SELECT COUNT(*) as {$this->quote('count')} FROM {$this->escape_table($this->_table,$params)} ";
+ {
+ $query .= "SELECT COUNT(*) as {$this->quote('count')} FROM {$this->escape_table($this->_table, $params)} ";
}
-
+
if ($this->_type == 'delete')
- {
- if ($this->_db_type!='sqlite')
- {
+ {
+ if ($this->_db_type != 'sqlite')
+ {
$query .= "DELETE {$this->last_alias()}.* FROM {$this->quote($this->_table)} ";
}
- else
- {
+ else
+ {
if (!empty($this->_joins))
- {
+ {
throw new Exception("SQLite doesn't support deleting a table with JOIN in the query");
- }
+ }
$query .= "DELETE FROM {$this->quote($this->_table)} ";
}
}
- if ($this->_type=='update')
- {
+ if ($this->_type == 'update')
+ {
$query .= "UPDATE {$this->quote($this->_table)} SET ";
$first = true;
- foreach ($this->_data as $key=>$val){
+ foreach ($this->_data as $key => $val)
+ {
if (!$first)
- {
+ {
$query.=", ";
}
- else
- {
- $first=false;
+ else
+ {
+ $first = false;
}
- $query .= "{$this->quote($key)} = {$this->escape_value($val,$params)}";
+ $query .= "{$this->quote($key)} = {$this->escape_value($val, $params)}";
}
$query .= " ";
}
-
+
foreach ($this->_joins as $join)
- {
+ {
$table = $join[0];
- $table = $this->escape_table($table,$params);
- $query .= strtoupper($join[1])." JOIN {$table} ON {$this->get_condition_query($join[2],$params,true,true)} ";
+ $table = $this->escape_table($table, $params);
+ $query .= strtoupper($join[1])." JOIN {$table} ON {$this->get_condition_query($join[2], $params, true, true)} ";
}
if (!empty($this->_conditions))
- {
- $query .= "WHERE {$this->get_condition_query($this->_conditions,$params,true)} ";
+ {
+ $query .= "WHERE {$this->get_condition_query($this->_conditions, $params, true)} ";
}
- if (($this->_type == 'select' || $this->_type == 'count') && $this->_group_by!=null)
- {
+ if (($this->_type == 'select' || $this->_type == 'count') && $this->_group_by != null)
+ {
$query .= "GROUP BY {$this->escape_field($this->_group_by)} ";
}
- if (($this->_type == 'select' || $this->_type == 'count') && !empty($this->_having))
- {
- $query .= "HAVING {$this->get_condition_query($this->_having,$params,true)} ";
+ if (($this->_type == 'select' || $this->_type == 'count') && !empty($this->_having))
+ {
+ $query .= "HAVING {$this->get_condition_query($this->_having, $params, true)} ";
}
-
+
if ($this->_type == 'select' && !empty($this->_orderby))
- {
+ {
$query .= "ORDER BY ";
$first = true;
foreach ($this->_orderby as $order)
- {
+ {
if (!$first)
- {
+ {
$query .= ',';
}
- else
- {
+ else
+ {
$first = false;
}
$query .= $this->escape_field($order[0])." ";
if (isset($order[1]))
- {
+ {
$dir = strtoupper($order[1]);
$query .= $dir." ";
}
}
}
-
+
if (count($this->_union) > 0 && ($this->_type == 'select'))
- {
+ {
$query = "({$query}) ";
foreach ($this->_union as $union)
- {
- $query .= $union[1]?"UNION ALL ":"UNION ";
+ {
+ $query .= $union[1] ? "UNION ALL " : "UNION ";
if (is_subclass_of($union[0], 'Query_Database'))
- {
- $query .= $this->subquery($union[0],$params);
+ {
+ $query .= $this->subquery($union[0], $params);
}
- elseif(is_subclass_of($union[0], 'Expression_Database'))
- {
+ elseif (is_subclass_of($union[0], 'Expression_Database'))
+ {
$query .= "({$union[0]->value}) ";
}
- else
- {
+ else
+ {
throw new Exception("You can only use query builder instances or DB::expr for unions");
}
}
}
-
+
if ($this->_type != 'count')
- {
+ {
if ($this->_limit != null)
- {
+ {
$query .= "LIMIT {$this->_limit} ";
- }
+ }
if ($this->_offset != null)
- {
+ {
$query .= "OFFSET {$this->_offset} ";
- }
+ }
}
-
}
-
- return array($query,$params);
- }
+ return array($query, $params);
+ }
- /**
- * Recursively parses conditions array into a query string
- *
- * @param array $p Element of the cobditions array
- * @param array &$params Reference to parameters array
- * @param boolean $skip_first_operator Flag to skip the first logical operator in a query
- * to prevent AND or OR to be at the beginning of the query
- * @param boolean $value_is_field Flag if the the value in the logical operations should
- * be treated as a field. E.g. for joins where the fields are
- * compared between themselves and not with actual values
- * @return string String representation of the conditions
- * @access public
- * @throws Exception If condition cannot be parsed
- */
- public function get_condition_query($p,&$params,$skip_first_operator,$value_is_field = false)
- {
+ /**
+ * Recursively parses conditions array into a query string
+ *
+ * @param array $p Element of the cobditions array
+ * @param array &$params Reference to parameters array
+ * @param boolean $skip_first_operator Flag to skip the first logical operator in a query
+ * to prevent AND or OR to be at the beginning of the query
+ * @param boolean $value_is_field Flag if the the value in the logical operations should
+ * be treated as a field. E.g. for joins where the fields are
+ * compared between themselves and not with actual values
+ * @return string String representation of the conditions
+ * @access public
+ * @throws Exception If condition cannot be parsed
+ */
+ public function get_condition_query($p, &$params, $skip_first_operator, $value_is_field = false)
+ {
if (isset($p['field']))
- {
+ {
if ($value_is_field)
- {
+ {
$param = $this->escape_field($p['value']);
}
- else
- {
+ else
+ {
$param = $this->escape_value($p['value'], $params);
}
return $this->escape_field($p['field']).' '.$p['operator'].' '.$param;
}
if (isset($p['logic']))
- {
+ {
return ($skip_first_operator ? '' : strtoupper($p['logic']).' ')
- .$this->get_condition_query($p['conditions'], $params, false, $value_is_field);
+ .$this->get_condition_query($p['conditions'], $params, false, $value_is_field);
}
-
+
$conds = '';
$skip = $skip_first_operator || (count($p) > 1);
- foreach($p as $q)
- {
- $conds .= $this->get_condition_query($q,$params,$skip,$value_is_field).' ';
+ foreach ($p as $q)
+ {
+ $conds .= $this->get_condition_query($q, $params, $skip, $value_is_field).' ';
$skip = false;
}
if (count($p) > 1 && !$skip_first_operator)
- {
+ {
return "( ".$conds.")";
- }
+ }
return $conds;
throw new Exception("Cannot parse condition:\n".var_export($p, true));
}
-
-
} \ No newline at end of file
diff --git a/modules/database/classes/driver/pdo/result.php b/modules/database/classes/driver/pdo/result.php
index d64c479..fda813c 100644
--- a/modules/database/classes/driver/pdo/result.php
+++ b/modules/database/classes/driver/pdo/result.php
@@ -7,52 +7,52 @@
class Result_PDO_Driver extends Result_Database
{
- /**
- * Initializes new result object
- *
- * @param PDOStatement $stmt PDO Statement
- * @return void
- * @access public
- * @link http://php.net/manual/en/class.pdostatement.php
- */
- public function __construct($stmt)
- {
- $this->_result = $stmt;
- }
+ /**
+ * Initializes new result object
+ *
+ * @param PDOStatement $stmt PDO Statement
+ * @return void
+ * @access public
+ * @link http://php.net/manual/en/class.pdostatement.php
+ */
+ public function __construct($stmt)
+ {
+ $this->_result = $stmt;
+ }
- /**
- * Throws exception if rewind is attempted.
- *
- * @return void
- * @access public
- * @throws Exception If rewind is attempted
- */
- public function rewind()
- {
- if ($this->_position > 0)
- {
- throw new Exception('PDO statement cannot be rewound for unbuffered queries');
- }
- }
+ /**
+ * Throws exception if rewind is attempted.
+ *
+ * @return void
+ * @access public
+ * @throws Exception If rewind is attempted
+ */
+ public function rewind()
+ {
+ if ($this->_position > 0)
+ {
+ throw new Exception('PDO statement cannot be rewound for unbuffered queries');
+ }
+ }
- /**
- * Iterates to the next row in the result set
- *
- * @return void
- * @access public
- */
- public function next()
- {
- $this->check_fetched();
- $this->_row = $this->_result->fetchObject();
- if ($this->_row)
- {
- $this->_position++;
- }
- else
- {
- $this->_result->closeCursor();
- }
- }
+ /**
+ * Iterates to the next row in the result set
+ *
+ * @return void
+ * @access public
+ */
+ public function next()
+ {
+ $this->check_fetched();
+ $this->_row = $this->_result->fetchObject();
+ if ($this->_row)
+ {
+ $this->_position++;
+ }
+ else
+ {
+ $this->_result->closeCursor();
+ }
+ }
} \ No newline at end of file