Work in Progress

This commit is contained in:
Deon George 2015-09-30 21:46:03 +10:00
parent 68cbb74506
commit 83c6429c4c
3 changed files with 182 additions and 3 deletions

View File

@ -0,0 +1,125 @@
<?php defined('SYSPATH') OR die('No direct script access.');
/**
* Database query builder for SELECT statements. See [Query Builder](/database/query/builder) for usage and examples.
*
* @package Kohana/Database
* @category Query
* @author Kohana Team
* @copyright (c) 2008-2009 Kohana Team
* @license http://kohanaphp.com/license
*/
class Database_Query_Builder_Select extends Kohana_Database_Query_Builder_Select {
/**
* Compile the SQL query and return it.
*
* For DB2 we need to override the LIMIT parameter.
*
* @param mixed $db Database instance or name of instance
* @return string
*/
public function compile($db = NULL)
{
if ( ! is_object($db))
{
// Get the database instance
$db = Database::instance($db);
}
if (! $db instanceof Database_DB2)
return parent::compile($db);
// Callback to quote columns
$quote_column = array($db, 'quote_column');
// Callback to quote tables
$quote_table = array($db, 'quote_table');
// Start a selection query
$query = 'SELECT ';
if ($this->_distinct === TRUE)
{
// Select only unique results
$query .= 'DISTINCT ';
}
if (empty($this->_select))
{
// Select all columns
$query .= '*';
}
else
{
// Select all columns
$query .= implode(', ', array_unique(array_map($quote_column, $this->_select)));
}
if ( ! empty($this->_from))
{
// Set tables to select from
$query .= ' FROM '.implode(', ', array_unique(array_map($quote_table, $this->_from)));
}
if ( ! empty($this->_join))
{
// Add tables to join
$query .= ' '.$this->_compile_join($db, $this->_join);
}
if ( ! empty($this->_where))
{
// Add selection conditions
$query .= ' WHERE '.$this->_compile_conditions($db, $this->_where);
}
if ( ! empty($this->_group_by))
{
// Add grouping
$query .= ' '.$this->_compile_group_by($db, $this->_group_by);
}
if ( ! empty($this->_having))
{
// Add filtering conditions
$query .= ' HAVING '.$this->_compile_conditions($db, $this->_having);
}
if ( ! empty($this->_order_by))
{
// Add sorting
$query .= ' '.$this->_compile_order_by($db, $this->_order_by);
}
if ($this->_limit !== NULL)
{
// Add limiting
$query .= ' FETCH FIRST '.$this->_limit.' ROWS ONLY';
}
if ($this->_offset !== NULL)
{
// Add offsets
$query .= ' OFFSET '.$this->_offset;
}
if ( ! empty($this->_union))
{
foreach ($this->_union as $u) {
$query .= ' UNION ';
if ($u['all'] === TRUE)
{
$query .= 'ALL ';
}
$query .= $u['select']->compile($db);
}
}
$this->_sql = $query;
// Cant run through parent, as it overwrites our LIMIT syntax.
// return parent::compile($db);
return $query;
}
} // End Database_Query_Select
?>

View File

@ -16,8 +16,8 @@ class Kohana_Database_DB2 extends Database {
// Identifier for this connection within the PHP driver // Identifier for this connection within the PHP driver
protected $_connection_id; protected $_connection_id;
// DB2 uses a " for identifiers // DB2 doesnt use identifies identifiers
protected $_identifier = '"'; protected $_identifier = '';
// Required Abstract Classes // Required Abstract Classes
public function begin($mode = NULL) {} public function begin($mode = NULL) {}
@ -229,6 +229,59 @@ class Kohana_Database_DB2 extends Database {
public function quote_column($column) public function quote_column($column)
{ {
// Identifiers are escaped by repeating them
$escaped_identifier = $this->_identifier.$this->_identifier;
if (is_array($column)) {
list($column, $alias) = $column;
$alias = str_replace($this->_identifier, $escaped_identifier, $alias);
}
if ($column instanceof Database_Query) {
// Create a sub-query
$column = '('.$column->compile($this).')';
} elseif ($column instanceof Database_Expression) {
// Compile the expression
$column = $column->compile($this);
} else {
// Convert to a string
$column = (string) $column;
$column = str_replace($this->_identifier, $escaped_identifier, $column);
if ($column === '*') {
return $column;
} elseif (strpos($column, '.') !== FALSE) {
$parts = explode('.', $column);
if ($prefix = $this->table_prefix()) {
// Get the offset of the table name, 2nd-to-last part
$offset = count($parts) - 2;
// Add the table prefix to the table name
$parts[$offset] = $prefix.$parts[$offset];
}
foreach ($parts as & $part) {
if ($part !== '*') {
// Quote each of the parts
$part = $this->_identifier.$part.$this->_identifier;
}
}
$column = implode('.', $parts);
} else {
$column = $this->_identifier.$column.$this->_identifier;
}
}
if (isset($alias))
$column .= ' AS '.$this->_identifier.$alias.$this->_identifier;
return $column; return $column;
} }
@ -299,7 +352,7 @@ class Kohana_Database_DB2 extends Database {
public function table_prefix($schema=FALSE) public function table_prefix($schema=FALSE)
{ {
return ($schema === TRUE ? $this->_config['connection']['database'].'.' : '').$this->_config['table_prefix']; return ($schema === TRUE ? $this->_config['connection']['schema'].'.' : '').$this->_config['table_prefix'];
} }
} }
?> ?>

View File

@ -23,6 +23,7 @@ return array
'password' => '', 'password' => '',
'persistent' => FALSE, 'persistent' => FALSE,
'database' => '', 'database' => '',
'schema' => '',
), ),
'table_prefix' => '', 'table_prefix' => '',
'charset' => 'utf8', 'charset' => 'utf8',