diff --git a/autoload.php b/autoload.php
index d8ef8e2..28d0d0b 100644
--- a/autoload.php
+++ b/autoload.php
@@ -27,34 +27,8 @@ define('QBASE_PATH', dirname(__FILE__).'/');
*/
define('QDRIVER_PATH', QBASE_PATH.'drivers/');
-if ( ! function_exists('do_include'))
-{
- /**
- * Bulk directory loading workaround for use
- * with array_map and glob
- *
- * @param string $path
- * @return void
- */
- function do_include($path)
- {
- require_once($path);
- }
-}
-
-if ( ! function_exists('mb_trim'))
-{
- /**
- * Multibyte-safe trim function
- *
- * @param string
- * @return string
- */
- function mb_trim($string)
- {
- return preg_replace("/(^\s+)|(\s+$)/us", "", $string);
- }
-}
+// Require some common functions
+require(QBASE_PATH.'common.php');
/**
* Load a Query class
@@ -92,25 +66,4 @@ function query_autoload($class)
// Set up autoloader
spl_autoload_register('query_autoload');
-// --------------------------------------------------------------------------
-
-/**
- * Filter out db rows into one array
- *
- * @param array $array
- * @param mixed $index
- * @return array
- */
-function db_filter($array, $index)
-{
- $new_array = array();
-
- foreach($array as $a)
- {
- $new_array[] = $a[$index];
- }
-
- return $new_array;
-}
-
// End of autoload.php
\ No newline at end of file
diff --git a/classes/db_sql.php b/classes/db_sql.php
index 016b530..b41e046 100644
--- a/classes/db_sql.php
+++ b/classes/db_sql.php
@@ -21,72 +21,6 @@
*/
abstract class DB_SQL {
- // --------------------------------------------------------------------------
- // ! Methods to override
- // --------------------------------------------------------------------------
-
- /**
- * Get the max keyword sql
- *
- * @return string
- */
- public function max()
- {
- return ' MAX';
- }
-
- // --------------------------------------------------------------------------
-
- /**
- * Get the min keyword sql
- *
- * @return string
- */
- public function min()
- {
- return ' MIN';
- }
-
- // --------------------------------------------------------------------------
-
- /**
- * Get the 'distinct' keyword
- *
- * @return string
- */
- public function distinct()
- {
- return ' DISTINCT ';
- }
-
- // --------------------------------------------------------------------------
-
- /**
- * Get the 'average' keyword
- *
- * @return string
- */
- public function avg()
- {
- return ' AVG';
- }
-
- // --------------------------------------------------------------------------
-
- /**
- * Get the 'sum' keyword
- *
- * @return string
- */
- public function sum()
- {
- return ' SUM';
- }
-
- // --------------------------------------------------------------------------
- // ! Abstract Methods
- // --------------------------------------------------------------------------
-
/**
* Get database specific sql for limit clause
*
diff --git a/classes/query_builder.php b/classes/query_builder.php
index f494a87..6e060e1 100644
--- a/classes/query_builder.php
+++ b/classes/query_builder.php
@@ -13,26 +13,6 @@
// --------------------------------------------------------------------------
-/**
- * Generic exception for bad drivers
- *
- * @package Query
- * @subpackage Query
- */
-class BadDBDriverException extends InvalidArgumentException {}
-
-// --------------------------------------------------------------------------
-
-/**
- * Generic exception for bad connection strings
- *
- * @package Query
- * @subpackage Query
- */
-class BadConnectionException extends UnexpectedValueException {}
-
-// --------------------------------------------------------------------------
-
/**
* Convienience class for creating sql queries - also the class that
* instantiates the specific db driver
@@ -130,33 +110,59 @@ class Query_Builder {
// Convert array to object
if (is_array($params))
{
- $p = new stdClass();
+ $params = new ArrayObject($params, ArrayObject::STD_PROP_LIST | ArrayObject::ARRAY_AS_PROPS);
+ }
+
+ $params->type = strtolower($params->type);
+ $dbtype = ($params->type !== 'postgresql') ? $params->type : 'pgsql';
- foreach($params as $k => $v)
- {
- $p->$k = $v;
- }
+ // Generate dsn
+ $dsn = $this->_connect($dbtype, $params);
- $params = $p;
+ try
+ {
+ // Create the database connection
+ $this->db = ( ! empty($params->user))
+ ? new $dbtype($dsn, $params->user, $params->pass)
+ : new $dbtype($dsn);
+ }
+ catch(Exception $e)
+ {
+ throw new BadConnectionException('Connection failed, invalid arguments', 2);
}
+ // Set the connection name property, if applicable
+ if (isset($params->name))
+ {
+ $this->conn_name = $params->name;
+ }
+
+ // Instantiate the Query Parser
+ $this->parser = new Query_Parser();
+
+ // Make things just slightly shorter
+ $this->sql =& $this->db->sql;
+ }
+
+ /**
+ * Create the dsn for connection to the database
+ *
+ * @param string $dbtype
+ * @param object $params
+ * @return string
+ */
+ private function _connect($dbtype, &$params)
+ {
// Let the connection work with 'conn_db' or 'database'
if (isset($params->database))
{
$params->conn_db = $params->database;
}
-
- $params->type = strtolower($params->type);
- $dbtype = ($params->type !== 'postgresql') ? $params->type : 'pgsql';
-
- $dsn = '';
-
// Add the driver type to the dsn
- if ($dbtype !== 'firebird' && $dbtype !== 'sqlite')
- {
- $dsn = strtolower($dbtype).':'.$dsn;
- }
+ $dsn = ($dbtype !== 'firebird' && $dbtype !== 'sqlite')
+ ? strtolower($dbtype).':'
+ : '';
// Make sure the class exists
if ( ! class_exists($dbtype))
@@ -196,31 +202,8 @@ class Query_Builder {
$dsn = "{$params->host}:{$params->file}";
break;
}
-
-
- try
- {
- // Create the database connection
- $this->db = ( ! empty($params->user))
- ? new $dbtype($dsn, $params->user, $params->pass)
- : new $dbtype($dsn);
- }
- catch(Exception $e)
- {
- throw new BadConnectionException('Connection failed, invalid arguments', 2);
- }
-
- // Set the connection name property, if applicable
- if (isset($params->name))
- {
- $this->conn_name = $params->name;
- }
-
- // Instantiate the Query Parser
- $this->parser = new Query_Parser();
-
- // Make things just slightly shorter
- $this->sql =& $this->db->sql;
+
+ return $dsn;
}
// --------------------------------------------------------------------------
@@ -303,7 +286,7 @@ class Query_Builder {
public function select_max($field, $as=FALSE)
{
// Create the select string
- $this->select_string .= $this->sql->max().$this->_select($field, $as);
+ $this->select_string .= ' MAX'.$this->_select($field, $as);
return $this;
}
@@ -319,7 +302,7 @@ class Query_Builder {
public function select_min($field, $as=FALSE)
{
// Create the select string
- $this->select_string .= $this->sql->min().$this->_select($field, $as);
+ $this->select_string .= ' MIN'.$this->_select($field, $as);
return $this;
}
@@ -335,7 +318,7 @@ class Query_Builder {
public function select_avg($field, $as=FALSE)
{
// Create the select string
- $this->select_string .= $this->sql->avg().$this->_select($field, $as);
+ $this->select_string .= ' AVG'.$this->_select($field, $as);
return $this;
}
@@ -351,7 +334,7 @@ class Query_Builder {
public function select_sum($field, $as=FALSE)
{
// Create the select string
- $this->select_string .= $this->sql->sum().$this->_select($field, $as);
+ $this->select_string .= ' SUM'.$this->_select($field, $as);
return $this;
}
@@ -365,7 +348,7 @@ class Query_Builder {
public function distinct()
{
// Prepend the keyword to the select string
- $this->select_string = $this->sql->distinct() . $this->select_string;
+ $this->select_string = ' DISTINCT '.$this->select_string;
return $this;
}
@@ -807,10 +790,8 @@ class Query_Builder {
{
$table = implode(' ', array_map(array($this->db, 'quote_ident'), explode(' ', trim($table))));
- $parser = new query_parser();
-
// Parse out the join condition
- $parts = $parser->parse_join($condition);
+ $parts = $this->parser->parse_join($condition);
$count = count($parts['identifiers']);
// Go through and quote the identifiers
@@ -1253,12 +1234,9 @@ class Query_Builder {
*/
public function reset_query()
{
- // Only unset class variables that
- // are not callable. Otherwise, we'll
- // delete class methods!
foreach($this as $name => $var)
{
- $skip = array('db','sql','queries','table_prefix');
+ $skip = array('db','sql','queries','table_prefix','parser','conn_name');
// Skip properties that are needed for every query
if (in_array($name, $skip))
@@ -1267,10 +1245,7 @@ class Query_Builder {
}
// Nothing query-generation related is safe!
- if ( ! is_callable($this->$name))
- {
- $this->$name = NULL;
- }
+ $this->$name = NULL;
// Set empty arrays
$this->values = array();
@@ -1412,7 +1387,7 @@ class Query_Builder {
// Set the last query to get rowcounts properly
$this->db->last_query = $sql;
- // echo $sql . '
';
+ //echo $sql . '
';
return $sql;
}
diff --git a/common.php b/common.php
new file mode 100644
index 0000000..f54b3c2
--- /dev/null
+++ b/common.php
@@ -0,0 +1,92 @@
+