Work in Progress
This commit is contained in:
parent
68cbb74506
commit
83c6429c4c
125
classes/Database/Query/Builder/Select.php
Normal file
125
classes/Database/Query/Builder/Select.php
Normal 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
|
||||||
|
?>
|
@ -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'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
@ -23,6 +23,7 @@ return array
|
|||||||
'password' => '',
|
'password' => '',
|
||||||
'persistent' => FALSE,
|
'persistent' => FALSE,
|
||||||
'database' => '',
|
'database' => '',
|
||||||
|
'schema' => '',
|
||||||
),
|
),
|
||||||
'table_prefix' => '',
|
'table_prefix' => '',
|
||||||
'charset' => 'utf8',
|
'charset' => 'utf8',
|
||||||
|
Reference in New Issue
Block a user