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
|
||||
protected $_connection_id;
|
||||
|
||||
// DB2 uses a " for identifiers
|
||||
protected $_identifier = '"';
|
||||
// DB2 doesnt use identifies identifiers
|
||||
protected $_identifier = '';
|
||||
|
||||
// Required Abstract Classes
|
||||
public function begin($mode = NULL) {}
|
||||
@ -229,6 +229,59 @@ class Kohana_Database_DB2 extends Database {
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -299,7 +352,7 @@ class Kohana_Database_DB2 extends Database {
|
||||
|
||||
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' => '',
|
||||
'persistent' => FALSE,
|
||||
'database' => '',
|
||||
'schema' => '',
|
||||
),
|
||||
'table_prefix' => '',
|
||||
'charset' => 'utf8',
|
||||
|
Reference in New Issue
Block a user