forked from yiisoft/yii2
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request yiisoft#1406 from p0larbeer/master
DB Schema OCI
- Loading branch information
Showing
3 changed files
with
534 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
<?php | ||
namespace yii\db\oci; | ||
|
||
class ColumnSchema extends \yii\db\ColumnSchema | ||
{ | ||
|
||
/** | ||
* Initializes the column with its DB type and default value. | ||
* This sets up the column's PHP type, size, precision, scale as well as default value. | ||
* | ||
* @param string $dbType | ||
* the column's DB type | ||
* @param mixed $defaultValue | ||
* the default value | ||
*/ | ||
public function extract($dbType, $defaultValue) | ||
{ | ||
$this->dbType = $dbType; | ||
$this->extractType($dbType); | ||
$this->extractLimit($dbType); | ||
if ($defaultValue !== null) | ||
$this->extractDefault($defaultValue); | ||
} | ||
|
||
/** | ||
* Extracts the PHP type from DB type. | ||
* | ||
* @param string $dbType | ||
* DB type | ||
* @return string | ||
*/ | ||
protected function extractOraType($dbType) | ||
{ | ||
if (strpos($dbType, 'FLOAT') !== false) | ||
return 'double'; | ||
|
||
if (strpos($dbType, 'NUMBER') !== false || strpos($dbType, 'INTEGER') !== false) { | ||
if (strpos($dbType, '(') && preg_match('/\((.*)\)/', $dbType, $matches)) { | ||
$values = explode(',', $matches[1]); | ||
if (isset($values[1]) and (((int) $values[1]) > 0)) | ||
return 'double'; | ||
else | ||
return 'integer'; | ||
} else | ||
return 'double'; | ||
} else | ||
return 'string'; | ||
} | ||
|
||
/** | ||
* Extracts the PHP type from DB type. | ||
* | ||
* @param string $dbType | ||
* DB type | ||
*/ | ||
protected function extractType($dbType) | ||
{ | ||
$this->type = $this->extractOraType($dbType); | ||
} | ||
|
||
/** | ||
* Extracts size, precision and scale information from column's DB type. | ||
* | ||
* @param string $dbType | ||
* the column's DB type | ||
*/ | ||
protected function extractLimit($dbType) | ||
{ | ||
if (strpos($dbType, '(') && preg_match('/\((.*)\)/', $dbType, $matches)) { | ||
$values = explode(',', $matches[1]); | ||
$this->size = $this->precision = (int) $values[0]; | ||
if (isset($values[1])) | ||
$this->scale = (int) $values[1]; | ||
} | ||
} | ||
|
||
/** | ||
* Extracts the default value for the column. | ||
* The value is typecasted to correct PHP type. | ||
* | ||
* @param mixed $defaultValue | ||
* the default value obtained from metadata | ||
*/ | ||
protected function extractDefault($defaultValue) | ||
{ | ||
if (stripos($defaultValue, 'timestamp') !== false) { | ||
$this->defaultValue = null; | ||
} else { | ||
$this->defaultValue = $this->typecast($defaultValue); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
<?php | ||
namespace yii\db\oci; | ||
|
||
use yii\db\Exception; | ||
use yii\base\InvalidParamException; | ||
|
||
/** | ||
* QueryBuilder is the query builder for Oracle databases. | ||
* | ||
*/ | ||
class QueryBuilder extends \yii\db\QueryBuilder | ||
{ | ||
|
||
private $sql; | ||
|
||
public function build($query) | ||
{ | ||
// var_dump($query);exit; | ||
$params = $query->params; | ||
$clauses = [ | ||
$this->buildSelect ( $query->select, $query->distinct, $query->selectOption ), | ||
$this->buildFrom ( $query->from ), | ||
$this->buildJoin ( $query->join, $params ), | ||
$this->buildWhere ( $query->where, $params ), | ||
$this->buildGroupBy ( $query->groupBy ), | ||
$this->buildHaving ( $query->having, $params ), | ||
$this->buildUnion ( $query->union, $params ), | ||
$this->buildOrderBy ( $query->orderBy ) | ||
// $this->buildLimit($query->limit, $query->offset), | ||
|
||
; | ||
// var_dump( [implode($this->separator, array_filter($clauses)), $params]);exit; | ||
$this->sql = implode($this->separator, array_filter($clauses)); | ||
|
||
if (! is_null($query->limit) && ! is_null($query->offset)) { | ||
$this->sql = $this->buildLimit($query->limit, $query->offset); | ||
} | ||
return [ | ||
$this->sql, | ||
$params | ||
]; | ||
// return [implode($this->separator, array_filter($clauses)), $params]; | ||
} | ||
|
||
public function buildLimit($limit, $offset) | ||
{ | ||
// var_dump($limit >= 0); | ||
// var_dump($offset);exit; | ||
// var_dump($limit, $offset); | ||
if (($limit < 0) && ($offset < 0)) { | ||
return $this->sql; | ||
} | ||
$filters = array(); | ||
if ($offset > 0) { | ||
$filters[] = 'rowNumId > ' . (int) $offset; | ||
} | ||
|
||
if ($limit >= 0) { | ||
$filters[] = 'rownum <= ' . (int) $limit; | ||
} | ||
|
||
if (count($filters) > 0) { | ||
$filter = implode(' and ', $filters); | ||
$filter = " WHERE " . $filter; | ||
} else { | ||
$filter = ''; | ||
} | ||
|
||
$sql = <<<EOD | ||
WITH USER_SQL AS ({$this->sql}), | ||
PAGINATION AS (SELECT USER_SQL.*, rownum as rowNumId FROM USER_SQL) | ||
SELECT * | ||
FROM PAGINATION | ||
{$filter} | ||
EOD; | ||
return $sql; | ||
} | ||
} |
Oops, something went wrong.