Commit 19793f7a by gevik

Removed unused columsn from find constraint sql. Fixed typo. Added extra schema…

Removed unused columsn from find constraint sql. Fixed typo. Added extra schema check for when a foreign table is not in the same schema. Updated indentation to conform to other classes.
parent 004a069c
...@@ -73,7 +73,7 @@ class Schema extends \yii\db\Schema ...@@ -73,7 +73,7 @@ class Schema extends \yii\db\Schema
); );
/** /**
* Creates a query builder for the MySQL database. * Creates a query builder for the PostgreSQL database.
* @return QueryBuilder query builder instance * @return QueryBuilder query builder instance
*/ */
public function createQueryBuilder() public function createQueryBuilder()
...@@ -89,13 +89,16 @@ class Schema extends \yii\db\Schema ...@@ -89,13 +89,16 @@ class Schema extends \yii\db\Schema
protected function resolveTableNames($table, $name) protected function resolveTableNames($table, $name)
{ {
$parts = explode('.', str_replace('"', '', $name)); $parts = explode('.', str_replace('"', '', $name));
if (isset($parts[1])) { if (isset($parts[1]))
{
$table->schemaName = $parts[0]; $table->schemaName = $parts[0];
$table->name = $parts[1]; $table->name = $parts[1];
} else { } else
{
$table->name = $parts[0]; $table->name = $parts[0];
} }
if ($table->schemaName === null) { if ($table->schemaName === null)
{
$table->schemaName = $this->defaultSchema; $table->schemaName = $this->defaultSchema;
} }
} }
...@@ -120,11 +123,10 @@ class Schema extends \yii\db\Schema ...@@ -120,11 +123,10 @@ class Schema extends \yii\db\Schema
{ {
$table = new TableSchema(); $table = new TableSchema();
$this->resolveTableNames($table, $name); $this->resolveTableNames($table, $name);
if ($this->findColumns($table)) { if ($this->findColumns($table))
{
$this->findConstraints($table); $this->findConstraints($table);
return $table; return $table;
} else {
return null;
} }
} }
...@@ -143,14 +145,9 @@ class Schema extends \yii\db\Schema ...@@ -143,14 +145,9 @@ class Schema extends \yii\db\Schema
$sql = <<<SQL $sql = <<<SQL
select select
ct.conname as containst,
c.relname as table_name,
ns.nspname as table_schema,
current_database() as table_catalog,
(select string_agg(attname,',') attname from pg_attribute where attrelid=ct.conrelid and attnum = any(ct.conkey)) as columns, (select string_agg(attname,',') attname from pg_attribute where attrelid=ct.conrelid and attnum = any(ct.conkey)) as columns,
fc.relname as foreign_table_name, fc.relname as foreign_table_name,
fns.nspname as foreign_table_schema, fns.nspname as foreign_table_schema,
current_database() as foreign_table_catalog,
(select string_agg(attname,',') attname from pg_attribute where attrelid=ct.confrelid and attnum = any(ct.confkey)) as foreign_columns (select string_agg(attname,',') attname from pg_attribute where attrelid=ct.confrelid and attnum = any(ct.confkey)) as foreign_columns
from from
pg_constraint ct pg_constraint ct
...@@ -169,7 +166,14 @@ SQL; ...@@ -169,7 +166,14 @@ SQL;
foreach ($constraints as $constraint) { foreach ($constraints as $constraint) {
$columns = explode(',', $constraint['columns']); $columns = explode(',', $constraint['columns']);
$fcolumns = explode(',', $constraint['foreign_columns']); $fcolumns = explode(',', $constraint['foreign_columns']);
$citem = array($constraint['foreign_table_name']); if ($constraint['foreign_table_schema'] !== $this->defaultSchema)
{
$foreign_table = $constraint['foreign_table_schema'] . '.' . $constraint['foreign_table_name'];
} else
{
$foreign_table = $constraint['foreign_table_name'];
}
$citem = array($foreign_table);
foreach ($columns as $idx => $column) { foreach ($columns as $idx => $column) {
$citem[] = array($fcolumns[$idx] => $column); $citem[] = array($fcolumns[$idx] => $column);
} }
...@@ -242,17 +246,21 @@ ORDER BY ...@@ -242,17 +246,21 @@ ORDER BY
a.attnum; a.attnum;
SQL; SQL;
try
{
$columns = $this->db->createCommand($sql)->queryAll(); $columns = $this->db->createCommand($sql)->queryAll();
if (empty($columns)) { } catch (\Exception $e)
{
return false; return false;
} }
foreach ($columns as $column) { foreach ($columns as $column) {
$column = $this->loadColumnSchema($column); $column = $this->loadColumnSchema($column);
$table->columns[$column->name] = $column; $table->columns[$column->name] = $column;
if ($column->isPrimaryKey === true) { if ($column->isPrimaryKey === true)
{
$table->primaryKey[] = $column->name; $table->primaryKey[] = $column->name;
if ($table->sequenceName === null && preg_match("/nextval\('\w+'(::regclass)?\)/", $column->defaultValue) === 1) { if ($table->sequenceName === null && preg_match("/nextval\('\w+'(::regclass)?\)/", $column->defaultValue) === 1)
{
$table->sequenceName = preg_replace(array('/nextval/', '/::/', '/regclass/', '/\'\)/', '/\(\'/'), '', $column->defaultValue); $table->sequenceName = preg_replace(array('/nextval/', '/::/', '/regclass/', '/\'\)/', '/\(\'/'), '', $column->defaultValue);
} }
} }
...@@ -281,12 +289,15 @@ SQL; ...@@ -281,12 +289,15 @@ SQL;
$column->scale = $info['numeric_scale']; $column->scale = $info['numeric_scale'];
$column->size = $info['size']; $column->size = $info['size'];
if (isset($this->typeMap[$column->dbType])) { if (isset($this->typeMap[$column->dbType]))
{
$column->type = $this->typeMap[$column->dbType]; $column->type = $this->typeMap[$column->dbType];
} else { } else
{
$column->type = self::TYPE_STRING; $column->type = self::TYPE_STRING;
} }
$column->phpType = $this->getColumnPhpType($column); $column->phpType = $this->getColumnPhpType($column);
return $column; return $column;
} }
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment