From cf1e12ad118a2a322e2cbc9a845955791af136c7 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Sat, 8 Jun 2013 12:37:39 -0400 Subject: [PATCH] Fixes issue #514. --- framework/yii/db/pgsql/Schema.php | 114 ++++++++++++++++++++------------------ 1 file changed, 61 insertions(+), 53 deletions(-) diff --git a/framework/yii/db/pgsql/Schema.php b/framework/yii/db/pgsql/Schema.php index 50d01aa..bec1803 100644 --- a/framework/yii/db/pgsql/Schema.php +++ b/framework/yii/db/pgsql/Schema.php @@ -12,7 +12,7 @@ use yii\db\TableSchema; use yii\db\ColumnSchema; /** - * Schema is the class for retrieving metadata from a PostgreSQL database + * Schema is the class for retrieving metadata from a PostgreSQL database * (version 9.x and above). * * @author Gevik Babakhani @@ -23,60 +23,61 @@ class Schema extends \yii\db\Schema /** * The default schema used for the current session. - * @var string + * @var string */ public $defaultSchema = 'public'; /** - * @var array mapping from physical column types (keys) to abstract + * @var array mapping from physical column types (keys) to abstract * column types (values) */ public $typeMap = array( - 'abstime' => self::TYPE_TIMESTAMP, - 'bit' => self::TYPE_STRING, - 'boolean' => self::TYPE_BOOLEAN, - 'box' => self::TYPE_STRING, - 'character' => self::TYPE_STRING, - 'bytea' => self::TYPE_BINARY, - 'char' => self::TYPE_STRING, - 'cidr' => self::TYPE_STRING, - 'circle' => self::TYPE_STRING, - 'date' => self::TYPE_DATE, - 'real' => self::TYPE_FLOAT, - 'double precision' => self::TYPE_DECIMAL, - 'inet' => self::TYPE_STRING, - 'smallint' => self::TYPE_SMALLINT, - 'integer' => self::TYPE_INTEGER, - 'bigint' => self::TYPE_BIGINT, - 'interval' => self::TYPE_STRING, - 'json' => self::TYPE_STRING, - 'line' => self::TYPE_STRING, - 'macaddr' => self::TYPE_STRING, - 'money' => self::TYPE_MONEY, - 'name' => self::TYPE_STRING, - 'numeric' => self::TYPE_STRING, - 'numrange' => self::TYPE_DECIMAL, - 'oid' => self::TYPE_BIGINT, // should not be used. it's pg internal! - 'path' => self::TYPE_STRING, - 'point' => self::TYPE_STRING, - 'polygon' => self::TYPE_STRING, - 'text' => self::TYPE_TEXT, - 'time without time zone' => self::TYPE_TIME, - 'timestamp without time zone' => self::TYPE_TIMESTAMP, - 'timestamp with time zone' => self::TYPE_TIMESTAMP, - 'time with time zone' => self::TYPE_TIMESTAMP, - 'unknown' => self::TYPE_STRING, - 'uuid' => self::TYPE_STRING, - 'bit varying' => self::TYPE_STRING, - 'character varying' => self::TYPE_STRING, - 'xml' => self::TYPE_STRING + 'abstime' => self::TYPE_TIMESTAMP, + 'bit' => self::TYPE_STRING, + 'boolean' => self::TYPE_BOOLEAN, + 'box' => self::TYPE_STRING, + 'character' => self::TYPE_STRING, + 'bytea' => self::TYPE_BINARY, + 'char' => self::TYPE_STRING, + 'cidr' => self::TYPE_STRING, + 'circle' => self::TYPE_STRING, + 'date' => self::TYPE_DATE, + 'real' => self::TYPE_FLOAT, + 'double precision' => self::TYPE_DECIMAL, + 'inet' => self::TYPE_STRING, + 'smallint' => self::TYPE_SMALLINT, + 'integer' => self::TYPE_INTEGER, + 'bigint' => self::TYPE_BIGINT, + 'interval' => self::TYPE_STRING, + 'json' => self::TYPE_STRING, + 'line' => self::TYPE_STRING, + 'macaddr' => self::TYPE_STRING, + 'money' => self::TYPE_MONEY, + 'name' => self::TYPE_STRING, + 'numeric' => self::TYPE_STRING, + 'numrange' => self::TYPE_DECIMAL, + 'oid' => self::TYPE_BIGINT, // should not be used. it's pg internal! + 'path' => self::TYPE_STRING, + 'point' => self::TYPE_STRING, + 'polygon' => self::TYPE_STRING, + 'text' => self::TYPE_TEXT, + 'time without time zone' => self::TYPE_TIME, + 'timestamp without time zone' => self::TYPE_TIMESTAMP, + 'timestamp with time zone' => self::TYPE_TIMESTAMP, + 'time with time zone' => self::TYPE_TIMESTAMP, + 'unknown' => self::TYPE_STRING, + 'uuid' => self::TYPE_STRING, + 'bit varying' => self::TYPE_STRING, + 'character varying' => self::TYPE_STRING, + 'xml' => self::TYPE_STRING ); /** * Creates a query builder for the MySQL database. * @return QueryBuilder query builder instance */ - public function createQueryBuilder() { + public function createQueryBuilder() + { return new QueryBuilder($this->db); } @@ -85,7 +86,8 @@ class Schema extends \yii\db\Schema * @param TableSchema $table the table metadata object * @param string $name the table name */ - protected function resolveTableNames($table, $name) { + protected function resolveTableNames($table, $name) + { $parts = explode('.', str_replace('"', '', $name)); if (isset($parts[1])) { $table->schemaName = $parts[0]; @@ -104,7 +106,8 @@ class Schema extends \yii\db\Schema * @param string $name table name * @return string the properly quoted table name */ - public function quoteSimpleTableName($name) { + public function quoteSimpleTableName($name) + { return strpos($name, '"') !== false ? $name : '"' . $name . '"'; } @@ -113,12 +116,15 @@ class Schema extends \yii\db\Schema * @param string $name table name * @return TableSchema|null driver dependent table metadata. Null if the table does not exist. */ - public function loadTableSchema($name) { + public function loadTableSchema($name) + { $table = new TableSchema(); $this->resolveTableNames($table, $name); if ($this->findColumns($table)) { $this->findConstraints($table); return $table; + } else { + return null; } } @@ -126,7 +132,8 @@ class Schema extends \yii\db\Schema * Collects the foreign key column details for the given table. * @param TableSchema $table the table metadata */ - protected function findConstraints($table) { + protected function findConstraints($table) + { $tableName = $this->quoteValue($table->name); $tableSchema = $this->quoteValue($table->schemaName); @@ -175,7 +182,8 @@ SQL; * @param TableSchema $table the table metadata * @return boolean whether the table exists in the database */ - protected function findColumns($table) { + protected function findColumns($table) + { $tableName = $this->db->quoteValue($table->name); $schemaName = $this->db->quoteValue($table->schemaName); $sql = <<db->createCommand($sql)->queryAll(); - } catch (\Exception $e) { + $columns = $this->db->createCommand($sql)->queryAll(); + if (empty($columns)) { return false; } + foreach ($columns as $column) { $column = $this->loadColumnSchema($column); $table->columns[$column->name] = $column; @@ -257,7 +265,8 @@ SQL; * @param array $info column information * @return ColumnSchema the column schema object */ - protected function loadColumnSchema($info) { + protected function loadColumnSchema($info) + { $column = new ColumnSchema(); $column->allowNull = $info['is_nullable']; $column->autoIncrement = $info['is_autoinc']; @@ -280,5 +289,4 @@ SQL; $column->phpType = $this->getColumnPhpType($column); return $column; } - -} \ No newline at end of file +}