From 0856de65fc608e8e557c0ef666b4086e15f09992 Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Thu, 8 Mar 2012 12:37:33 -0500 Subject: [PATCH] Some Query Builder tests --- sys/db/drivers/firebird-ibase.php | 26 ++++++++----------- sys/db/drivers/firebird_sql.php | 2 +- sys/db/query_builder.php | 40 +++++++++++------------------- tests/databases/firebird.php | 25 +++++++++++++++++-- tests/databases/sqlite.php | 27 ++++++++++++++++++++ tests/test_dbs/FB_TEST_DB.FDB | Bin 802816 -> 802816 bytes 6 files changed, 77 insertions(+), 43 deletions(-) diff --git a/sys/db/drivers/firebird-ibase.php b/sys/db/drivers/firebird-ibase.php index eec03b6..a54789b 100644 --- a/sys/db/drivers/firebird-ibase.php +++ b/sys/db/drivers/firebird-ibase.php @@ -19,7 +19,7 @@ */ class firebird extends DB_PDO { - protected $statement, $trans, $count, $result; + protected $statement, $trans, $count, $result, $conn; /** * Open the link to the database @@ -30,14 +30,10 @@ class firebird extends DB_PDO { */ public function __construct($dbpath, $user='sysdba', $pass='masterkey') { - // More a pain than it is worth to actually - // pass around the resource that this provides. - // Since the resource is not required by the - // functions that would use it, I'm dumping it. - $conn = @ibase_connect($dbpath, $user, $pass, 'utf-8'); + $this->conn = @ibase_connect($dbpath, $user, $pass, 'utf-8'); // Throw an exception to make this match other pdo classes - if ( ! is_resource($conn)) + if ( ! is_resource($this->conn)) { throw new PDOException(ibase_errmsg()); die(); @@ -87,18 +83,18 @@ class firebird extends DB_PDO { if (isset($this->trans)) { - $this->statement = @ibase_query($this->trans, $sql); + $this->statement = ibase_query($this->trans, $sql); } else { - $this->statement = @ibase_query($sql); + $this->statement = ibase_query($this->conn, $sql); } // Throw the error as a exception - if ($this->statement === FALSE) + /*if ($this->statement === FALSE) { throw new PDOException(ibase_errmsg()); - } + }*/ return $this->statement; } @@ -161,13 +157,13 @@ class firebird extends DB_PDO { */ public function prepare($query, $options=NULL) { - $this->statement = @ibase_prepare($query); + $this->statement = ibase_prepare($this->conn, $query); // Throw the error as an exception - if ($this->statement === FALSE) + /*if ($this->statement === FALSE) { throw new PDOException(ibase_errmsg()); - } + }*/ return $this->statement; } @@ -268,7 +264,7 @@ SQL; */ public function beginTransaction() { - if(($this->trans = ibase_trans()) !== NULL) + if(($this->trans = ibase_trans($this->conn)) !== NULL) { return TRUE; } diff --git a/sys/db/drivers/firebird_sql.php b/sys/db/drivers/firebird_sql.php index e1a1be1..6fd1a5d 100644 --- a/sys/db/drivers/firebird_sql.php +++ b/sys/db/drivers/firebird_sql.php @@ -103,7 +103,7 @@ class Firebird_SQL extends DB_SQL { if ($offset > 0) { - $sql .= ' SKIP'. (int) $offset; + $sql .= ' SKIP '. (int) $offset; } $sql = preg_replace("`SELECT`i", "SELECT {$sql}", $orig_sql); diff --git a/sys/db/query_builder.php b/sys/db/query_builder.php index 1745ce0..f2eac8d 100644 --- a/sys/db/query_builder.php +++ b/sys/db/query_builder.php @@ -18,7 +18,7 @@ */ class Query_Builder { - private $table, $where_array; + private $table, $where_array, $sql; /** * Constructor @@ -52,24 +52,9 @@ class Query_Builder { $this->db = new $dbtype("{$params->host}:{$params->file}", $params->user, $params->pass); break; } - } - - // -------------------------------------------------------------------------- - - /** - * Shortcut to directly access database class properties - * - * @param string $key - * @return mixed - */ - public function __get($key) - { - if (isset($this->db->$key)) - { - return $this->db->$key; - } - - return NULL; + + // Make things just slightly shorter + $this->sql =& $this->db->sql; } // -------------------------------------------------------------------------- @@ -83,7 +68,7 @@ class Query_Builder { */ public function __call($name, $params) { - if (isset($this->db->$name)) + if (method_exists($this->db, $name)) { if (is_callable($this->db->$name)) { @@ -107,19 +92,24 @@ class Query_Builder { */ public function get($table='', $limit=FALSE, $offset=FALSE) { - $sql = 'SELECT * FROM ' . $this->quote_ident($table); + // @todo Only add in the table name when using the select method + // @tood Only execute combined query when using other query methods and empty parameters + + $sql = 'SELECT * FROM ' . $this->db->quote_ident($table); if ( ! empty($table) && $limit === FALSE && $offset === FALSE) { - $result = $this->query($sql); + $result = $this->db->query($sql); } else { - $result = $this->query($this->sql->limit($sql, $limit, $offset)); + $sql = $this->sql->limit($sql, $limit, $offset); + $result = $this->db->query($sql); } + + //echo $sql."
"; - // For the firebird class, return $this so you can act on the result - return (is_resource($result)) ? $this : $result; + return $result; } // -------------------------------------------------------------------------- diff --git a/tests/databases/firebird.php b/tests/databases/firebird.php index 08cde46..9c4272f 100644 --- a/tests/databases/firebird.php +++ b/tests/databases/firebird.php @@ -100,11 +100,11 @@ class FirebirdTest extends UnitTestCase { //This test fails for an unknown reason, when clearly the table exists //Reset - /*$this->tearDown(); + $this->tearDown(); $this->setUp(); //Check - $table_exists = (bool)in_array('create_test', $this->tables); + /*$table_exists = (bool)in_array('create_test', $this->tables); echo "create_test exists :".(int)$table_exists.'
'; @@ -133,6 +133,27 @@ class FirebirdTest extends UnitTestCase { $this->assertTrue($res); } + function TestQBGet() + { + $query = $this->qb->get('create_test'); + + $this->assertTrue(is_resource($query)); + } + + function TestQBGetLimit() + { + $query = $this->qb->get('create_test', 2); + + $this->assertTrue(is_resource($query)); + } + + function TestQBGetLimitSkip() + { + $query = $this->qb->get('create_test', 2, 1); + + $this->assertTrue(is_resource($query)); + } + function TestPreparedStatements() { $sql = <<db = new SQLite($path); + + $params = new Stdclass(); + $params->type = 'sqlite'; + $params->file = $path; + $params->host = 'localhost'; + $this->qb = new Query_Builder($params); } function tearDown() @@ -125,6 +131,27 @@ SQL; $this->assertTrue($res); } + function TestQBGet() + { + $query = $this->qb->get('create_test'); + + $this->assertIsA($query, 'PDOStatement'); + } + + function TestQBGetLimit() + { + $query = $this->qb->get('create_test', 2); + + $this->assertIsA($query, 'PDOStatement'); + } + + function TestQBGetLimitSkip() + { + $query = $this->qb->get('create_test', 2, 1); + + $this->assertIsA($query, 'PDOStatement'); + } + function TestDeleteTable() { //Make sure the table exists to delete diff --git a/tests/test_dbs/FB_TEST_DB.FDB b/tests/test_dbs/FB_TEST_DB.FDB index 90a4ba46518b7a3cbccb76aef50a5d137b7ac8d6..24b583a355e0325c1d3b85c14300ff7429372cbd 100755 GIT binary patch delta 14555 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