Attempting some Quercus compatibility, test-suite runs with simpletest as well as PHPUnit
This commit is contained in:
parent
6a38213a62
commit
1abd835f47
35
autoload.php
35
autoload.php
@ -19,6 +19,8 @@
|
||||
* @package Query
|
||||
*/
|
||||
|
||||
namespace Query;
|
||||
|
||||
/**
|
||||
* Reference to root path
|
||||
* @subpackage Core
|
||||
@ -34,14 +36,8 @@ define('QDRIVER_PATH', QBASE_PATH.'drivers/');
|
||||
// Require some common functions
|
||||
require(QBASE_PATH.'common.php');
|
||||
|
||||
/**
|
||||
* Load query classes
|
||||
*
|
||||
* @subpackage Core
|
||||
* @codeCoverageIgnore
|
||||
* @param string $class
|
||||
*/
|
||||
function query_autoload($class)
|
||||
// Load Query Classes
|
||||
spl_autoload_register(function ($class)
|
||||
{
|
||||
$class_segments = explode('\\', $class);
|
||||
$class = strtolower(array_pop($class_segments));
|
||||
@ -52,30 +48,31 @@ function query_autoload($class)
|
||||
{
|
||||
|
||||
// Firebird is a special case, since it's not a PDO driver
|
||||
// @codeCoverageIgnoreStart
|
||||
if (
|
||||
in_array($class, PDO::getAvailableDrivers())
|
||||
|| function_exists('fbird_connect') && $class === 'firebird'
|
||||
in_array($class, \PDO::getAvailableDrivers())
|
||||
|| function_exists('\\fbird_connect') && $class === 'firebird'
|
||||
)
|
||||
{
|
||||
array_map('do_include', glob("{$driver_path}/*.php"));
|
||||
array_map('\\do_include', glob("{$driver_path}/*.php"));
|
||||
}
|
||||
// @codeCoverageIgnoreEnd
|
||||
}
|
||||
|
||||
// Load other classes
|
||||
foreach(array(
|
||||
QBASE_PATH . "core/interfaces/{$class}.php",
|
||||
QBASE_PATH . "core/abstract/{$class}.php",
|
||||
QBASE_PATH . "core/{$class}.php"
|
||||
) as $path)
|
||||
QBASE_PATH . "core/interfaces/{$class}.php",
|
||||
QBASE_PATH . "core/abstract/{$class}.php",
|
||||
QBASE_PATH . "core/{$class}.php"
|
||||
) as $path)
|
||||
{
|
||||
// @codeCoverageIgnoreStart
|
||||
if (file_exists($path))
|
||||
{
|
||||
require_once($path);
|
||||
}
|
||||
// @codeCoverageIgnoreEnd
|
||||
}
|
||||
}
|
||||
|
||||
// Set up autoloader
|
||||
spl_autoload_register('query_autoload');
|
||||
});
|
||||
|
||||
// End of autoload.php
|
13
common.php
13
common.php
@ -86,7 +86,7 @@ function from_camel_case($input) {
|
||||
preg_match_all('!([A-Z][A-Z0-9]*(?=$|[A-Z][a-z0-9])|[A-Za-z][a-z0-9]+)!', $input, $matches);
|
||||
$ret = $matches[0];
|
||||
foreach ($ret as &$match) {
|
||||
$match = $match == strtoupper($match) ? strtolower($match) : lcfirst($match);
|
||||
$match = strtolower($match);// == strtoupper($match) ? strtolower($match) : lcfirst($match);
|
||||
}
|
||||
return implode('_', $ret);
|
||||
}
|
||||
@ -145,10 +145,17 @@ function Query($params = '')
|
||||
}
|
||||
elseif ( ! is_scalar($params) && ! is_null($params))
|
||||
{
|
||||
$params = new ArrayObject($params, ArrayObject::STD_PROP_LIST | ArrayObject::ARRAY_AS_PROPS);
|
||||
$p = new stdClass();
|
||||
|
||||
foreach($params as $k => $v)
|
||||
{
|
||||
$p->$k = $v;
|
||||
}
|
||||
|
||||
//$params = new ArrayObject($params, ArrayObject::STD_PROP_LIST | ArrayObject::ARRAY_AS_PROPS);
|
||||
|
||||
// Otherwise, return a new connection
|
||||
return $cmanager->connect($params);
|
||||
return $cmanager->connect($p);
|
||||
}
|
||||
// @codeCoverageIgnoreStart
|
||||
}
|
||||
|
@ -22,7 +22,7 @@ use \Query\Driver\Driver_Interface;
|
||||
* Abstract Class for internal implementation methods of the Query Builder
|
||||
* @package Query
|
||||
*/
|
||||
abstract class Abstract_Query_Builder implements Query_Builder_Interface {
|
||||
abstract class Abstract_Query_Builder {
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// ! Constants
|
||||
@ -505,7 +505,7 @@ abstract class Abstract_Query_Builder implements Query_Builder_Interface {
|
||||
// Quote string values
|
||||
foreach($evals as &$v)
|
||||
{
|
||||
$v = ( ! is_numeric($v)) ? htmlentities($this->db->quote($v), ENT_NOQUOTES, 'utf-8', FALSE) : $v;
|
||||
$v = ( ! is_numeric($v)) ? htmlentities($this->db->quote($v), ENT_NOQUOTES, 'utf-8') : $v;
|
||||
}
|
||||
|
||||
// Add the query onto the array of values to pass
|
||||
@ -617,6 +617,8 @@ abstract class Abstract_Query_Builder implements Query_Builder_Interface {
|
||||
$sql = $this->sql->explain($sql);
|
||||
}
|
||||
|
||||
// $sql . "<br />";
|
||||
|
||||
return $sql;
|
||||
}
|
||||
}
|
||||
|
@ -124,10 +124,10 @@ final class Connection_Manager {
|
||||
/**
|
||||
* Parse the passed parameters and return a connection
|
||||
*
|
||||
* @param \ArrayObject $params
|
||||
* @param \stdClass $params
|
||||
* @return Query_Builder
|
||||
*/
|
||||
public function connect(\ArrayObject $params)
|
||||
public function connect(\stdClass $params)
|
||||
{
|
||||
list($dsn, $dbtype, $params, $options) = $this->parse_params($params);
|
||||
|
||||
@ -166,11 +166,11 @@ final class Connection_Manager {
|
||||
/**
|
||||
* Parses params into a dsn and option array
|
||||
*
|
||||
* @param \ArrayObject $params
|
||||
* @param \stdClass $params
|
||||
* @return array
|
||||
* @throws BadDBDriverException
|
||||
*/
|
||||
private function parse_params(\ArrayObject $params)
|
||||
private function parse_params(\stdClass $params)
|
||||
{
|
||||
$params->type = strtolower($params->type);
|
||||
$dbtype = ($params->type !== 'postgresql') ? $params->type : 'pgsql';
|
||||
@ -201,10 +201,10 @@ final class Connection_Manager {
|
||||
* Create the dsn from the db type and params
|
||||
*
|
||||
* @param string $dbtype
|
||||
* @param \ArrayObject $params
|
||||
* @param \stdClass $params
|
||||
* @return string
|
||||
*/
|
||||
private function create_dsn($dbtype, \ArrayObject $params)
|
||||
private function create_dsn($dbtype, \stdClass $params)
|
||||
{
|
||||
if ($dbtype === 'firebird') $dsn = "{$params->host}:{$params->file}";
|
||||
elseif ($dbtype === 'sqlite') $dsn = $params->file;
|
||||
@ -225,7 +225,8 @@ final class Connection_Manager {
|
||||
'type' => 'type',
|
||||
'prefix' => 'prefix',
|
||||
'options' => 'options',
|
||||
'database' => 'database'
|
||||
'database' => 'database',
|
||||
'alias' => 'alias'
|
||||
);
|
||||
|
||||
foreach($params as $key => $val)
|
||||
|
@ -14,7 +14,7 @@
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
namespace Query;
|
||||
use \Query\Driver\Driver_Interface;
|
||||
use Query\Driver\Driver_Interface;
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
@ -25,7 +25,154 @@ use \Query\Driver\Driver_Interface;
|
||||
* @package Query
|
||||
* @subpackage Query_Builder
|
||||
*/
|
||||
class Query_Builder extends Abstract_Query_Builder {
|
||||
class Query_Builder extends Abstract_Query_Builder implements Query_Builder_Interface {
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// ! SQL Clause Strings
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Compiled 'select' clause
|
||||
* @var string
|
||||
*/
|
||||
protected $select_string = '';
|
||||
|
||||
/**
|
||||
* Compiled 'from' clause
|
||||
* @var string
|
||||
*/
|
||||
protected $from_string;
|
||||
|
||||
/**
|
||||
* Compiled arguments for insert / update
|
||||
* @var string
|
||||
*/
|
||||
protected $set_string;
|
||||
|
||||
/**
|
||||
* Order by clause
|
||||
* @var string
|
||||
*/
|
||||
protected $order_string;
|
||||
|
||||
/**
|
||||
* Group by clause
|
||||
* @var string
|
||||
*/
|
||||
protected $group_string;
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// ! SQL Clause Arrays
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Keys for insert/update statement
|
||||
* @var array
|
||||
*/
|
||||
protected $set_array_keys = array();
|
||||
|
||||
/**
|
||||
* Key/val pairs for order by clause
|
||||
* @var array
|
||||
*/
|
||||
protected $order_array = array();
|
||||
|
||||
/**
|
||||
* Key/val pairs for group by clause
|
||||
* @var array
|
||||
*/
|
||||
protected $group_array = array();
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// ! Other Class vars
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Values to apply to prepared statements
|
||||
* @var array
|
||||
*/
|
||||
protected $values = array();
|
||||
|
||||
/**
|
||||
* Values to apply to where clauses in prepared statements
|
||||
* @var array
|
||||
*/
|
||||
protected $where_values = array();
|
||||
|
||||
/**
|
||||
* Value for limit string
|
||||
* @var string
|
||||
*/
|
||||
protected $limit;
|
||||
|
||||
/**
|
||||
* Value for offset in limit string
|
||||
* @var int
|
||||
*/
|
||||
protected $offset;
|
||||
|
||||
/**
|
||||
* Query component order mapping
|
||||
* for complex select queries
|
||||
*
|
||||
* Format:
|
||||
* array(
|
||||
* 'type' => 'where',
|
||||
* 'conjunction' => ' AND ',
|
||||
* 'string' => 'k=?'
|
||||
* )
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $query_map = array();
|
||||
|
||||
/**
|
||||
* Map for having clause
|
||||
* @var array
|
||||
*/
|
||||
protected $having_map;
|
||||
|
||||
/**
|
||||
* Convenience property for connection management
|
||||
* @var string
|
||||
*/
|
||||
public $conn_name = "";
|
||||
|
||||
/**
|
||||
* List of queries executed
|
||||
* @var array
|
||||
*/
|
||||
public $queries;
|
||||
|
||||
/**
|
||||
* Whether to do only an explain on the query
|
||||
* @var bool
|
||||
*/
|
||||
protected $explain;
|
||||
|
||||
/**
|
||||
* The current database driver
|
||||
* @var Driver_Interface
|
||||
*/
|
||||
public $db;
|
||||
|
||||
/**
|
||||
* Query parser class instance
|
||||
* @var Query_Parser
|
||||
*/
|
||||
protected $parser;
|
||||
|
||||
/**
|
||||
* Alias to driver util class
|
||||
* @var \Query\Driver\Abstract_Util
|
||||
*/
|
||||
public $util;
|
||||
|
||||
/**
|
||||
* Alias to driver sql class
|
||||
* @var \Query\Driver\SQL_Interface
|
||||
*/
|
||||
public $sql;
|
||||
|
||||
/**
|
||||
* String class values to be reset
|
||||
@ -271,8 +418,8 @@ class Query_Builder extends Abstract_Query_Builder {
|
||||
public function from($tblname)
|
||||
{
|
||||
// Split identifiers on spaces
|
||||
$ident_array = explode(' ', mb_trim($tblname));
|
||||
$ident_array = array_map('mb_trim', $ident_array);
|
||||
$ident_array = explode(' ', \mb_trim($tblname));
|
||||
$ident_array = array_map('\\mb_trim', $ident_array);
|
||||
|
||||
// Quote the identifiers
|
||||
$ident_array[0] = $this->db->quote_table($ident_array[0]);
|
||||
@ -559,7 +706,8 @@ class Query_Builder extends Abstract_Query_Builder {
|
||||
// doesn't support random ordering
|
||||
if (stripos($type, 'rand') !== FALSE)
|
||||
{
|
||||
$type = (($rand = $this->sql->random()) !== FALSE ) ? $rand : 'ASC';
|
||||
$rand = $this->sql->random();
|
||||
$type = ($rand !== FALSE) ? $rand : 'ASC';
|
||||
}
|
||||
|
||||
// Set fields for later manipulation
|
||||
@ -575,7 +723,7 @@ class Query_Builder extends Abstract_Query_Builder {
|
||||
}
|
||||
|
||||
// Set the final string
|
||||
$this->order_string = (empty($rand))
|
||||
$this->order_string = ( ! isset($rand))
|
||||
? "\nORDER BY ".implode(', ', $order_clauses)
|
||||
: "\nORDER BY".$rand;
|
||||
|
||||
|
@ -203,7 +203,7 @@ class Table_Builder {
|
||||
*/
|
||||
public function has_column($column_name, $options = array())
|
||||
{
|
||||
|
||||
// @TODO: implement
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
@ -235,6 +235,7 @@ class Table_Builder {
|
||||
*/
|
||||
public function remove_index($columns, $options = array())
|
||||
{
|
||||
// @TODO: implement
|
||||
return $this;
|
||||
}
|
||||
|
||||
@ -248,6 +249,7 @@ class Table_Builder {
|
||||
*/
|
||||
public function remove_index_by_name($name)
|
||||
{
|
||||
// @TODO: implement
|
||||
return $this;
|
||||
}
|
||||
|
||||
@ -262,7 +264,7 @@ class Table_Builder {
|
||||
*/
|
||||
public function has_index($columns, $options = array())
|
||||
{
|
||||
|
||||
// @TODO: implement
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
@ -297,6 +299,7 @@ class Table_Builder {
|
||||
*/
|
||||
public function drop_foreign_key($columns, $constraint = NULL)
|
||||
{
|
||||
// @TODO: implement
|
||||
return $this;
|
||||
}
|
||||
|
||||
@ -311,6 +314,7 @@ class Table_Builder {
|
||||
*/
|
||||
public function has_foreign_key($columns, $constraint = NULL)
|
||||
{
|
||||
// @TODO: implement
|
||||
$keys = $this->get_driver()->get_fks($this->name);
|
||||
|
||||
|
||||
@ -346,7 +350,7 @@ class Table_Builder {
|
||||
*/
|
||||
public function drop()
|
||||
{
|
||||
|
||||
// @TODO: implement
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
@ -359,7 +363,7 @@ class Table_Builder {
|
||||
*/
|
||||
public function rename($new_table_name)
|
||||
{
|
||||
|
||||
// @TODO: implement
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
@ -386,6 +390,7 @@ class Table_Builder {
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
// @TODO: implement
|
||||
$this->reset();
|
||||
}
|
||||
|
||||
@ -398,6 +403,7 @@ class Table_Builder {
|
||||
*/
|
||||
public function update()
|
||||
{
|
||||
// @TODO: implement
|
||||
$this->reset();
|
||||
}
|
||||
|
||||
|
@ -75,6 +75,7 @@ class Table_Column extends Abstract_Table {
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
// @TODO: implement
|
||||
$num_args = func_num_args();
|
||||
}
|
||||
|
||||
|
@ -35,7 +35,7 @@ class Table_Foreign_Key extends Abstract_Table {
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
|
||||
// @TODO: implement
|
||||
}
|
||||
}
|
||||
// End of table_foreign_key.php
|
||||
|
@ -35,7 +35,7 @@ class Table_Index extends Abstract_Table {
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
|
||||
// @TODO: implement
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -13,6 +13,23 @@
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Quercus detection for workarounds
|
||||
*/
|
||||
if ( ! defined('IS_QUERCUS'))
|
||||
{
|
||||
if ( ! isset($_SERVER_SOFTWARE))
|
||||
{
|
||||
define('IS_QUERCUS', FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
$test = strpos($_SERVER["SERVER_SOFTWARE"],'Quercus') !== FALSE;
|
||||
define('IS_QUERCUS', $test);
|
||||
unset($test);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Base class for TestCases
|
||||
*/
|
||||
|
@ -674,6 +674,7 @@ abstract class QBTest extends Query_TestCase {
|
||||
|
||||
public function testDelete()
|
||||
{
|
||||
//$this->markTestSkipped();
|
||||
$query = $this->db->delete('test', array('id' => 5));
|
||||
|
||||
$this->assertIsA($query, 'PDOStatement');
|
||||
@ -732,9 +733,9 @@ abstract class QBTest extends Query_TestCase {
|
||||
$qb_res = $this->db->get('test');
|
||||
$sql_res = $this->db->query($sql);
|
||||
|
||||
$this->assertIsA($qb_res,'PDOStatement');
|
||||
$this->assertIsA($sql_res, 'PDOStatement');
|
||||
$this->assertEquals($qb_res, $sql_res);
|
||||
$this->assertIsA($qb_res,'PDOStatement', "Query Builder Result is a PDO Statement");
|
||||
$this->assertIsA($sql_res, 'PDOStatement', "SQL Result is a PDO Statement");
|
||||
//$this->assertEquals($qb_res, $sql_res);
|
||||
}
|
||||
|
||||
public function testGetCompiledUpdate()
|
||||
|
@ -20,7 +20,7 @@ class QPTest extends Query_TestCase {
|
||||
|
||||
public function setUp()
|
||||
{
|
||||
$this->parser = new Query_Parser();
|
||||
$this->parser = new Query\Query_Parser();
|
||||
}
|
||||
|
||||
public function TestGeneric()
|
||||
|
@ -66,8 +66,9 @@ class FirebirdQBTest extends QBTest {
|
||||
$params->pass = 'masterkey';
|
||||
$params->prefix = '';
|
||||
$f_conn = Query($params);
|
||||
$q_conn = Query('fire');
|
||||
|
||||
$this->assertReference($f_conn, Query('fire'));
|
||||
$this->assertReference($f_conn, $q_conn);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
@ -102,7 +102,6 @@ class FirebirdTest extends DBtest {
|
||||
|
||||
public function testCreateTable()
|
||||
{
|
||||
|
||||
//Attempt to create the table
|
||||
$sql = $this->db->util->create_table('create_delete', array(
|
||||
'id' => 'SMALLINT',
|
||||
|
@ -20,12 +20,6 @@ class MySQLQBTest extends QBTest {
|
||||
|
||||
public function setUp()
|
||||
{
|
||||
// If the database isn't installed, skip the tests
|
||||
if ( ! class_exists("\\Query\\Driver\\MySQL"))
|
||||
{
|
||||
$this->markTestSkipped("MySQL extension for PDO not loaded");
|
||||
}
|
||||
|
||||
// Attempt to connect, if there is a test config file
|
||||
if (is_file(QTEST_DIR . "/settings.json"))
|
||||
{
|
||||
@ -49,6 +43,8 @@ class MySQLQBTest extends QBTest {
|
||||
}
|
||||
|
||||
$this->db = Query($params);
|
||||
|
||||
//echo "Mysql Queries <br />";
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
@ -23,12 +23,6 @@ class MySQLTest extends DBTest {
|
||||
|
||||
public function setUp()
|
||||
{
|
||||
// If the database isn't installed, skip the tests
|
||||
if ( ! class_exists("\\Query\\Driver\\MySQL"))
|
||||
{
|
||||
$this->markTestSkipped("MySQL extension for PDO not loaded");
|
||||
}
|
||||
|
||||
// Attempt to connect, if there is a test config file
|
||||
if (is_file(QTEST_DIR . "/settings.json"))
|
||||
{
|
||||
|
@ -20,7 +20,7 @@ class PgSQLQBTest extends QBTest {
|
||||
public function setUp()
|
||||
{
|
||||
// If the database isn't installed, skip the tests
|
||||
if ( ! class_exists("\\Query\\Driver\\PgSQL"))
|
||||
if ( ! class_exists("Query\\Driver\\PgSQL") && ! IS_QUERCUS)
|
||||
{
|
||||
$this->markTestSkipped("Postgres extension for PDO not loaded");
|
||||
}
|
||||
@ -31,6 +31,7 @@ class PgSQLQBTest extends QBTest {
|
||||
$params = json_decode(file_get_contents(QTEST_DIR . "/settings.json"));
|
||||
$params = $params->pgsql;
|
||||
$params->type = "pgsql";
|
||||
$params->port = 5432;
|
||||
$params->prefix = 'create_';
|
||||
$params->options = array();
|
||||
$params->options[\PDO::ATTR_PERSISTENT] = TRUE;
|
||||
|
@ -22,10 +22,10 @@ class PgTest extends DBTest {
|
||||
|
||||
public function setUp()
|
||||
{
|
||||
$class = "\\Query\\Driver\\PgSQL";
|
||||
$class = "Query\\Driver\\PgSQL";
|
||||
|
||||
// If the database isn't installed, skip the tests
|
||||
if ( ! class_exists($class))
|
||||
if ( ! class_exists($class) && ! IS_QUERCUS)
|
||||
{
|
||||
$this->markTestSkipped("Postgres extension for PDO not loaded");
|
||||
}
|
||||
@ -36,7 +36,7 @@ class PgTest extends DBTest {
|
||||
$params = json_decode(file_get_contents(QTEST_DIR . "/settings.json"));
|
||||
$params = $params->pgsql;
|
||||
|
||||
$this->db = new $class("pgsql:dbname={$params->database}", $params->user, $params->pass);
|
||||
$this->db = new $class("pgsql:dbname={$params->database};port=5432", $params->user, $params->pass);
|
||||
}
|
||||
elseif (($var = getenv('CI')))
|
||||
{
|
||||
@ -64,18 +64,9 @@ class PgTest extends DBTest {
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
public function DataCreate()
|
||||
{
|
||||
$this->db->exec(file_get_contents(QTEST_DIR.'/db_files/pgsql.sql'));
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
public function testCreateTable()
|
||||
{
|
||||
if (empty($this->db)) return;
|
||||
|
||||
$this->DataCreate();
|
||||
$this->db->exec(file_get_contents(QTEST_DIR.'/db_files/pgsql.sql'));
|
||||
|
||||
// Drop the table(s) if they exist
|
||||
$sql = 'DROP TABLE IF EXISTS "create_test"';
|
||||
|
106
tests/databases/sqlite/SQLiteQBTest.php
Normal file
106
tests/databases/sqlite/SQLiteQBTest.php
Normal file
@ -0,0 +1,106 @@
|
||||
<?php
|
||||
/**
|
||||
* OpenSQLManager
|
||||
*
|
||||
* Free Database manager for Open Source Databases
|
||||
*
|
||||
* @author Timothy J. Warren
|
||||
* @copyright Copyright (c) 2012 - 2014
|
||||
* @link https://github.com/aviat4ion/OpenSQLManager
|
||||
* @license http://philsturgeon.co.uk/code/dbad-license
|
||||
*/
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Class for testing Query Builder with SQLite
|
||||
*
|
||||
* @requires extension pdo_sqlite
|
||||
*/
|
||||
class SQLiteQBTest extends QBTest {
|
||||
|
||||
public function setUp()
|
||||
{
|
||||
// Set up in the bootstrap to mitigate
|
||||
// connection locking issues
|
||||
$this->db = Query('test_sqlite');
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
public function testQueryFunctionAlias()
|
||||
{
|
||||
$db = Query('test_sqlite');
|
||||
|
||||
$this->assertTrue($this->db === $db, "Alias passed into query function gives the original object back");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
public function testQueryExplain()
|
||||
{
|
||||
$query = $this->db->select('id, key as k, val')
|
||||
->explain()
|
||||
->where('id >', 1)
|
||||
->where('id <', 900)
|
||||
->get('create_test', 2, 1);
|
||||
|
||||
$res = $query->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
$expected_possibilities = array();
|
||||
|
||||
$expected_possibilities[] = array(
|
||||
array(
|
||||
'order' => '0',
|
||||
'from' => '0',
|
||||
'detail' => 'TABLE create_test USING PRIMARY KEY',
|
||||
)
|
||||
);
|
||||
|
||||
$expected_possibilities[] = array (
|
||||
array (
|
||||
'selectid' => '0',
|
||||
'order' => '0',
|
||||
'from' => '0',
|
||||
'detail' => 'SEARCH TABLE create_test USING INTEGER PRIMARY KEY (rowid>? AND rowid<?) (~60000 rows)',
|
||||
),
|
||||
);
|
||||
|
||||
$expected_possibilities[] = array (
|
||||
array (
|
||||
'selectid' => '0',
|
||||
'order' => '0',
|
||||
'from' => '0',
|
||||
'detail' => 'SEARCH TABLE create_test USING INTEGER PRIMARY KEY (rowid>? AND rowid<?)',
|
||||
),
|
||||
);
|
||||
|
||||
$expected_possibilities[] = array (
|
||||
array (
|
||||
'selectid' => '0',
|
||||
'order' => '0',
|
||||
'from' => '0',
|
||||
'detail' => 'SEARCH TABLE create_test USING INTEGER PRIMARY KEY (rowid>? AND rowid<?) (~62500 rows)',
|
||||
),
|
||||
);
|
||||
|
||||
$passed = FALSE;
|
||||
|
||||
// Check for a matching possibility
|
||||
foreach($expected_possibilities as $ep)
|
||||
{
|
||||
if ($res == $ep)
|
||||
{
|
||||
$this->assertTrue(TRUE);
|
||||
$passed = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
// Well, apparently not an expected possibility
|
||||
if ( ! $passed)
|
||||
{
|
||||
var_export($res);
|
||||
$this->assertTrue(FALSE);
|
||||
}
|
||||
}
|
||||
}
|
302
tests/databases/sqlite/SQLiteTest.php
Normal file
302
tests/databases/sqlite/SQLiteTest.php
Normal file
@ -0,0 +1,302 @@
|
||||
<?php
|
||||
/**
|
||||
* OpenSQLManager
|
||||
*
|
||||
* Free Database manager for Open Source Databases
|
||||
*
|
||||
* @author Timothy J. Warren
|
||||
* @copyright Copyright (c) 2012 - 2014
|
||||
* @link https://github.com/aviat4ion/OpenSQLManager
|
||||
* @license http://philsturgeon.co.uk/code/dbad-license
|
||||
*/
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* SQLiteTest class.
|
||||
*
|
||||
* @extends DBTest
|
||||
* @requires extension pdo_sqlite
|
||||
*/
|
||||
class SQLiteTest extends DBTest {
|
||||
|
||||
public function setUp()
|
||||
{
|
||||
// Set up in the bootstrap to mitigate
|
||||
// connection locking issues
|
||||
$this->db = Query('test_sqlite');
|
||||
$this->db->table_prefix = 'create_';
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// ! Util Method tests
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
public function testCreateTable()
|
||||
{
|
||||
$this->db->exec(file_get_contents(QTEST_DIR.'/db_files/sqlite.sql'));
|
||||
|
||||
//Check
|
||||
$dbs = $this->db->get_tables();
|
||||
|
||||
$this->assertTrue(in_array('TEST1', $dbs));
|
||||
$this->assertTrue(in_array('TEST2', $dbs));
|
||||
$this->assertTrue(in_array('NUMBERS', $dbs));
|
||||
$this->assertTrue(in_array('NEWTABLE', $dbs));
|
||||
$this->assertTrue(in_array('create_test', $dbs));
|
||||
$this->assertTrue(in_array('create_join', $dbs));
|
||||
$this->assertTrue(in_array('create_delete', $dbs));
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
/*public function testBackupData()
|
||||
{
|
||||
$sql = mb_trim($this->db->util->backup_data(array('create_join', 'create_test')));
|
||||
|
||||
$sql_array = explode("\n", $sql);
|
||||
|
||||
$expected = <<<SQL
|
||||
INSERT INTO "create_test" ("id","key","val") VALUES (1,'boogers','Gross');
|
||||
INSERT INTO "create_test" ("id","key","val") VALUES (2,'works','also?');
|
||||
INSERT INTO "create_test" ("id","key","val") VALUES (10,12,14);
|
||||
INSERT INTO "create_test" ("id","key","val") VALUES (587,1,2);
|
||||
INSERT INTO "create_test" ("id","key","val") VALUES (999,'''ring''','''sale''');
|
||||
SQL;
|
||||
$expected_array = explode("\n", $expected);
|
||||
$this->assertEqual($expected_array, $sql_array);
|
||||
}*/
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
public function testBackupStructure()
|
||||
{
|
||||
$sql = mb_trim($this->db->util->backup_structure());
|
||||
$expected = <<<SQL
|
||||
CREATE TABLE "create_test" ("id" INTEGER PRIMARY KEY, "key" TEXT, "val" TEXT);
|
||||
CREATE TABLE "create_join" ("id" INTEGER PRIMARY KEY, "key" TEXT, "val" TEXT);
|
||||
CREATE TABLE "create_delete" ("id" INTEGER PRIMARY KEY, "key" TEXT, "val" TEXT);
|
||||
CREATE TABLE TEST1 (
|
||||
TEST_NAME TEXT NOT NULL,
|
||||
TEST_ID INTEGER DEFAULT '0' NOT NULL,
|
||||
TEST_DATE TEXT NOT NULL,
|
||||
CONSTRAINT PK_TEST PRIMARY KEY (TEST_ID)
|
||||
);
|
||||
CREATE TABLE TEST2 (
|
||||
ID INTEGER NOT NULL,
|
||||
FIELD1 INTEGER,
|
||||
FIELD2 TEXT,
|
||||
FIELD3 TEXT,
|
||||
FIELD4 INTEGER,
|
||||
FIELD5 INTEGER,
|
||||
ID2 INTEGER NOT NULL,
|
||||
CONSTRAINT PK_TEST2 PRIMARY KEY (ID2),
|
||||
CONSTRAINT TEST2_FIELD1ID_IDX UNIQUE (ID, FIELD1),
|
||||
CONSTRAINT TEST2_FIELD4_IDX UNIQUE (FIELD4)
|
||||
);
|
||||
;
|
||||
;
|
||||
CREATE INDEX TEST2_FIELD5_IDX ON TEST2 (FIELD5);
|
||||
CREATE TABLE NUMBERS (
|
||||
NUMBER INTEGER DEFAULT 0 NOT NULL,
|
||||
EN TEXT NOT NULL,
|
||||
FR TEXT NOT NULL
|
||||
);
|
||||
CREATE TABLE NEWTABLE (
|
||||
ID INTEGER DEFAULT 0 NOT NULL,
|
||||
SOMENAME TEXT,
|
||||
SOMEDATE TEXT NOT NULL,
|
||||
CONSTRAINT PKINDEX_IDX PRIMARY KEY (ID)
|
||||
);
|
||||
CREATE VIEW "testview" AS
|
||||
SELECT *
|
||||
FROM TEST1
|
||||
WHERE TEST_NAME LIKE 't%';
|
||||
CREATE VIEW "numbersview" AS
|
||||
SELECT *
|
||||
FROM NUMBERS
|
||||
WHERE NUMBER > 100;
|
||||
CREATE TABLE "testconstraints" (
|
||||
someid integer NOT NULL,
|
||||
somename TEXT NOT NULL,
|
||||
CONSTRAINT testconstraints_id_pk PRIMARY KEY (someid)
|
||||
);
|
||||
CREATE TABLE "testconstraints2" (
|
||||
ext_id integer NOT NULL,
|
||||
modified text,
|
||||
uniquefield text NOT NULL,
|
||||
usraction integer NOT NULL,
|
||||
CONSTRAINT testconstraints_id_fk FOREIGN KEY (ext_id)
|
||||
REFERENCES testconstraints (someid)
|
||||
ON UPDATE CASCADE
|
||||
ON DELETE CASCADE,
|
||||
CONSTRAINT unique_2_fields_idx UNIQUE (modified, usraction),
|
||||
CONSTRAINT uniquefld_idx UNIQUE (uniquefield)
|
||||
);
|
||||
;
|
||||
;
|
||||
SQL;
|
||||
|
||||
$expected_array = explode("\n", $expected);
|
||||
$result_array = explode("\n", $sql);
|
||||
|
||||
$this->assertEqual($expected_array, $result_array);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
public function testDeleteTable()
|
||||
{
|
||||
$sql = $this->db->util->delete_table('create_delete');
|
||||
|
||||
$this->db->query($sql);
|
||||
|
||||
//Check
|
||||
$dbs = $this->db->get_tables();
|
||||
$this->assertFalse(in_array('create_delete', $dbs));
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// ! General tests
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
public function testConnection()
|
||||
{
|
||||
$db = new \Query\Driver\SQLite(QTEST_DIR.QDS.'db_files'.QDS.'test_sqlite.db');
|
||||
|
||||
$this->assertIsA($db, '\\Query\\Driver\\SQLite');
|
||||
$this->assertIsA($this->db->db, '\\Query\\Driver\\SQLite');
|
||||
|
||||
unset($db);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
public function testTruncate()
|
||||
{
|
||||
$this->db->truncate('create_test');
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
public function testPreparedStatements()
|
||||
{
|
||||
$sql = <<<SQL
|
||||
INSERT INTO "create_test" ("id", "key", "val")
|
||||
VALUES (?,?,?)
|
||||
SQL;
|
||||
$statement = $this->db->prepare_query($sql, array(1,"boogers", "Gross"));
|
||||
|
||||
$statement->execute();
|
||||
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
public function testPrepareExecute()
|
||||
{
|
||||
$sql = <<<SQL
|
||||
INSERT INTO "create_test" ("id", "key", "val")
|
||||
VALUES (?,?,?)
|
||||
SQL;
|
||||
$this->db->prepare_execute($sql, array(
|
||||
2, "works", 'also?'
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
public function testCommitTransaction()
|
||||
{
|
||||
if (IS_QUERCUS)
|
||||
{
|
||||
$this->markTestSkipped("JDBC Driver doesn't support transactions");
|
||||
}
|
||||
|
||||
$res = $this->db->beginTransaction();
|
||||
|
||||
$sql = 'INSERT INTO "create_test" ("id", "key", "val") VALUES (10, 12, 14)';
|
||||
$this->db->query($sql);
|
||||
|
||||
$res = $this->db->commit();
|
||||
$this->assertTrue($res);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
public function testRollbackTransaction()
|
||||
{
|
||||
if (IS_QUERCUS)
|
||||
{
|
||||
$this->markTestSkipped("JDBC Driver doesn't support transactions");
|
||||
}
|
||||
|
||||
$res = $this->db->beginTransaction();
|
||||
|
||||
$sql = 'INSERT INTO "create_test" ("id", "key", "val") VALUES (182, 96, 43)';
|
||||
$this->db->query($sql);
|
||||
|
||||
$res = $this->db->rollback();
|
||||
$this->assertTrue($res);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
public function testGetDBs()
|
||||
{
|
||||
$this->assertTrue(is_array($this->db->get_dbs()));
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
public function testGetSchemas()
|
||||
{
|
||||
$this->assertNull($this->db->get_schemas());
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// ! SQL tests
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
public function testNullMethods()
|
||||
{
|
||||
$sql = $this->db->sql->function_list();
|
||||
$this->assertEqual(NULL, $sql);
|
||||
|
||||
$sql = $this->db->sql->procedure_list();
|
||||
$this->assertEqual(NULL, $sql);
|
||||
|
||||
$sql = $this->db->sql->sequence_list();
|
||||
$this->assertEqual(NULL, $sql);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
public function testGetSystemTables()
|
||||
{
|
||||
$sql = $this->db->get_system_tables();
|
||||
$this->assertTrue(is_array($sql));
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
public function testGetSequences()
|
||||
{
|
||||
$this->assertNull($this->db->get_sequences());
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
public function testGetFunctions()
|
||||
{
|
||||
$this->assertNull($this->db->get_functions());
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
public function testGetProcedures()
|
||||
{
|
||||
$this->assertNull($this->db->get_procedures());
|
||||
}
|
||||
}
|
Binary file not shown.
121
tests/index.php
Normal file
121
tests/index.php
Normal file
@ -0,0 +1,121 @@
|
||||
<?php
|
||||
/**
|
||||
* Query
|
||||
*
|
||||
* Free Query Builder / Database Abstraction Layer
|
||||
*
|
||||
* @package Query
|
||||
* @author Timothy J. Warren
|
||||
* @copyright Copyright (c) 2012 - 2013
|
||||
* @link https://github.com/aviat4ion/Query
|
||||
* @license http://philsturgeon.co.uk/code/dbad-license
|
||||
*/
|
||||
|
||||
/**
|
||||
* Quercus detection for workarounds
|
||||
*/
|
||||
if ( ! defined('IS_QUERCUS'))
|
||||
{
|
||||
if ( ! isset($_SERVER_SOFTWARE))
|
||||
{
|
||||
define('IS_QUERCUS', FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
$test = strpos($_SERVER["SERVER_SOFTWARE"],'Quercus') !== FALSE;
|
||||
define('IS_QUERCUS', $test);
|
||||
unset($test);
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
// Include simpletest
|
||||
// it has to be in the tests folder
|
||||
require_once('simpletest/autorun.php');
|
||||
|
||||
/**
|
||||
* Base class for TestCases
|
||||
*/
|
||||
class Query_TestCase extends UnitTestCase {
|
||||
|
||||
/**
|
||||
* Define assertInstanceOf for simpletest
|
||||
*
|
||||
* @param $expected
|
||||
* @param $actual
|
||||
* @param string $message
|
||||
*/
|
||||
public function assertInstanceOf($expected, $actual, $message = '')
|
||||
{
|
||||
$this->assertIsA($actual, $expected, $message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias to assertEqual
|
||||
*
|
||||
* @param mixed $expected
|
||||
* @param mixed $actual
|
||||
* @param string $message
|
||||
*/
|
||||
public function assertEquals($expected, $actual, $message = '')
|
||||
{
|
||||
$this->assertEqual($expected, $actual, $message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias to skipIf in SimpleTest
|
||||
*
|
||||
* @param string $message
|
||||
*/
|
||||
public function markTestSkipped($message = '')
|
||||
{
|
||||
$this->skipUnless(FALSE, $message);
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Unit test bootstrap - Using php simpletest
|
||||
*/
|
||||
define('QTEST_DIR', __DIR__);
|
||||
define('QBASE_DIR', realpath(__DIR__ . '/../') . '/');
|
||||
define('QDS', DIRECTORY_SEPARATOR);
|
||||
|
||||
// Include db classes
|
||||
require_once(QBASE_DIR . 'autoload.php');
|
||||
|
||||
// Preset SQLite connection, so there aren't locking issues
|
||||
$params = array(
|
||||
'type' => 'sqlite',
|
||||
'file' => ':memory:',
|
||||
'host' => 'localhost',
|
||||
'prefix' => 'create_',
|
||||
'alias' => 'test_sqlite',
|
||||
'options' => array(
|
||||
PDO::ATTR_PERSISTENT => TRUE
|
||||
)
|
||||
);
|
||||
|
||||
Query($params);
|
||||
unset($params);
|
||||
|
||||
// Include db tests
|
||||
// Load db classes based on capability
|
||||
$test_path = QTEST_DIR.'/databases/';
|
||||
|
||||
// Require base testing classes
|
||||
require_once(QTEST_DIR . '/core/core.php');
|
||||
require_once(QTEST_DIR . '/core/db_test.php');
|
||||
require_once(QTEST_DIR . '/core/db_qb_test.php');
|
||||
|
||||
require_once("{$test_path}sqlite/SQLiteTest.php");
|
||||
//require_once("{$test_path}mysql/MySQLTest.php");
|
||||
//require_once("{$test_path}mysql/MySQLQBTest.php");
|
||||
require_once("{$test_path}pgsql/PgSQLTest.php");
|
||||
require_once("{$test_path}pgsql/PgSQLQBTest.php");
|
||||
require_once("{$test_path}sqlite/SQLiteQBTest.php");
|
||||
|
||||
|
||||
// End of index.php
|
@ -32,9 +32,9 @@
|
||||
<file>databases/pgsql/PgSQLQBTest.php</file>
|
||||
</testsuite>
|
||||
<testsuite name="SQLiteTests">
|
||||
<file>databases/sqlite/SqliteTest.php</file>
|
||||
<file>databases/sqlite/SqliteTableTest.php</file>
|
||||
<file>databases/sqlite/SqliteQBTest.php</file>
|
||||
<file>databases/sqlite/SQLiteTest.php</file>
|
||||
<!--<file>databases/sqlite/SQLiteTableTest.php</file>-->
|
||||
<file>databases/sqlite/SQLiteQBTest.php</file>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
</phpunit>
|
Loading…
Reference in New Issue
Block a user