Spec-Zone.ru › Yii 1.1

CPgsqlSchema

Пакет system.db.schema.pgsql
Наследование class CPgsqlSchema » CDbSchema » CComponent
С момента 1.0
Исходный код framework/db/schema/pgsql/CPgsqlSchema.php
CPgsqlSchema — класс для получения метаданных из базы данных PostgreSQL.

Общественные свойства

Свойство Тип Описание Определено
columnTypes массив абстрактные типы столбцов, сопоставленные с физическими типами столбцов. CPgsqlSchema
commandBuilder CDbCommandBuilder построитель SQL-команд для данного подключения. CDbSchema
dbConnection CDbConnection подключение к базе данных. CDbSchema
tableNames массив Возвращает все имена таблиц в базе данных. CDbSchema
tables массив Возвращает метаданные для всех таблиц в базе данных. CDbSchema

Общедоступные методы

Метод Описание Определено в
__call() Вызывает именованный метод, который не является методом класса. CComponent
__construct() Конструктор. CDbSchema
__get() Возвращает значение свойства, список обработчиков событий или поведение по его имени. CComponent
__isset() Проверяет, является ли значение свойства нулевым. CComponent
__set() Устанавливает значение свойства компонента. CComponent
__unset() Устанавливает свойство компонента в значение null. CComponent
addColumn() Создаёт SQL-запрос для добавления нового столбца БД. CPgsqlSchema
addForeignKey() Создаёт SQL-запрос для добавления внешнего ключа к существующей таблице. CDbSchema
addPrimaryKey() Создаёт SQL-запрос для добавления ограничения первичного ключа к существующей таблице. CDbSchema
alterColumn() Создаёт SQL-запрос для изменения определения столбца. CPgsqlSchema
asa() Возвращает объект поведения с указанным именем. CComponent
attachBehavior() Прикрепляет поведение к этому компоненту. CComponent
attachBehaviors() Прикрепляет список поведений к компоненту. CComponent
attachEventHandler() Прикрепляет обработчик событий к событию. CComponent
canGetProperty() Определяет, можно ли прочитать свойство. CComponent
canSetProperty() Определяет, можно ли установить свойство. CComponent
checkIntegrity() Включает или отключает проверку целостности. CPgsqlSchema
compareTableNames() Сравнивает два имени таблиц. CDbSchema
createIndex() Создаёт SQL-запрос для создания нового индекса. CDbSchema
createTable() Создаёт SQL-запрос для создания новой таблицы БД. CDbSchema
detachBehavior() Открепляет поведение от компонента. CComponent
detachBehaviors() Открепляет все поведения от компонента. CComponent
detachEventHandler() Открепляет существующий обработчик событий. CComponent
disableBehavior() Отключает прикреплённое поведение. CComponent
disableBehaviors() Отключает все прикреплённые к этому компоненту поведения. CComponent
dropColumn() Создаёт SQL-запрос для удаления столбца БД. CDbSchema
dropForeignKey() Создаёт SQL-запрос для удаления внешнего ключа. CDbSchema
dropIndex() Создаёт SQL-запрос для удаления индекса. CPgsqlSchema
dropPrimaryKey() Создаёт SQL-запрос для удаления ограничения первичного ключа из существующей таблицы. CDbSchema
dropTable() Создаёт SQL-запрос для удаления таблицы БД. CDbSchema
enableBehavior() Включает прикреплённое поведение. CComponent
enableBehaviors() Включает все прикреплённые к этому компоненту поведения. CComponent
evaluateExpression() Вычисляет выражение PHP или обратный вызов в контексте этого компонента. CComponent
getColumnType() Преобразует абстрактный тип столбца в физический тип столбца. CDbSchema
getCommandBuilder() Возвращает генератор SQL-команд для этого соединения. CDbSchema
getDbConnection() Возвращает соединение с базой данных. Соединение активно. CDbSchema
getEventHandlers() Возвращает список прикрепленных обработчиков событий для события. CComponent
getTable() Получает метаданные для указанной таблицы. CDbSchema
getTableNames() Возвращает все имена таблиц в базе данных. CDbSchema
getTables() Возвращает метаданные для всех таблиц в базе данных. CDbSchema
hasEvent() Определяет, задано ли событие. CComponent
hasEventHandler() Проверяет, есть ли для указанного события прикреплённые обработчики. CComponent
hasProperty() Определяет, задано ли свойство. CComponent
quoteColumnName() Приводит имя столбца к виду, пригодного для использования в запросе. CDbSchema
quoteSimpleColumnName() Приводит простое имя столбца к виду, пригодного для использования в запросе. CDbSchema
quoteSimpleTableName() Приводит имя таблицы к виду, пригодного для использования в запросе. CPgsqlSchema
quoteTableName() Приводит имя таблицы к виду, пригодного для использования в запросе. CDbSchema
raiseEvent() Вызывает событие. CComponent
refresh() Обновляет схему. CDbSchema
renameColumn() Создаёт SQL-запрос для переименования столбца. CDbSchema
renameTable() Создаёт SQL-запрос для переименования таблицы БД. CPgsqlSchema
resetSequence() Сбрасывает значение последовательности первичного ключа таблицы. CPgsqlSchema
truncateTable() Создаёт SQL-запрос для обнуления таблицы БД. CDbSchema

Защищённые методы

Метод Описание Определён в
createColumn() Создаёт столбец таблицы. CPgsqlSchema
createCommandBuilder() Создаёт билдер команд для базы данных. CPgsqlSchema
findColumns() Сбор метаданных столбцов таблицы. CPgsqlSchema
findConstraints() Сбор данных о столбцах первичного и внешнего ключей для заданной таблицы. CPgsqlSchema
findForeignKey() Сбор информации о внешних ключах. CPgsqlSchema
findPrimaryKey() Сбор информации о первичном ключе. CPgsqlSchema
findTableNames() Возвращает все имена таблиц в базе данных. CPgsqlSchema
loadTable() Загрузка метаданных для указанной таблицы. CPgsqlSchema
resolveTableNames() Генерирует различные типы имён таблиц. CPgsqlSchema

Подробное описание свойств

columnTypes свойство (доступно начиная с версии v1.1.6)

public array $columnTypes;

отображаемые абстрактные типы столбцов в физические типы столбцов.

Подробное описание методов

addColumn() метод (доступен начиная с версии v1.1.6)

public string addColumn(string $table, string $column, string $type)
$table string таблица, к которой будет добавлен новый столбец. Имя таблицы будет корректно обрамлено кавычками методом.
$column string имя нового столбца. Имя будет корректно обрамлено кавычками методом.
$type string тип столбца. Метод getColumnType будет вызван для преобразования абстрактного типа столбца (если таковой имеется) в физический. Всё, что не распознаётся как абстрактный тип, будет сохранено в сгенерированном SQL. Например, 'string' будет преобразовано в 'varchar(255)', а 'string not null' станет 'varchar(255) not null'.
{return} string SQL-запрос для добавления нового столбца.
Исходный код: framework/db/schema/pgsql/CPgsqlSchema.php#391 (показать)
public function addColumn($table, $column, $type)
{
    
$type=$this->getColumnType($type);
    
$sql='ALTER TABLE ' . $this->quoteTableName($table)
        . 
' ADD COLUMN ' . $this->quoteColumnName($column) . ' '
        
. $type;
    return 
$sql;
}

Создаёт SQL-запрос для добавления нового столбца БД.

alterColumn() метод (доступен начиная с версии v1.1.6)

public string alterColumn(string $table, string $column, string $type)
$table string таблица, столбец которой требуется изменить. Имя таблицы будет корректно обрамлено кавычками методом.
$column string имя столбца, который требуется изменить. Имя будет корректно обрамлено кавычками методом.
$type string новый тип столбца. Метод getColumnType будет вызван для преобразования абстрактного типа столбца (если таковой имеется) в физический. Всё, что не распознаётся как абстрактный тип, будет сохранено в сгенерированном SQL. Например, 'string' будет преобразовано в 'varchar(255)', а 'string not null' станет 'varchar(255) not null'.
{return} string SQL-запрос для изменения определения столбца.
Исходный код: framework/db/schema/pgsql/CPgsqlSchema.php#410 (показать)
public function alterColumn($table, $column, $type)
{
    
$type=$this->getColumnType($type);
    
$sql='ALTER TABLE ' . $this->quoteTableName($table) . ' ALTER COLUMN '
        
. $this->quoteColumnName($column) . ' TYPE ' . $this->getColumnType($type);
    return 
$sql;
}

Создаёт SQL-запрос для изменения определения столбца.

checkIntegrity() метод (доступен начиная с версии v1.1)

public void checkIntegrity(boolean $check=true, string $schema='')
$check boolean включить или выключить проверку целостности.
$schema string схема таблиц. По умолчанию пустая строка, что означает текущую или по умолчанию схему.
Исходный код: framework/db/schema/pgsql/CPgsqlSchema.php#90 (показать)
public function checkIntegrity($check=true,$schema='')
{
    
$enable=$check ? 'ENABLE' : 'DISABLE';
    
$tableNames=$this->getTableNames($schema);
    
$db=$this->getDbConnection();
    foreach(
$tableNames as $tableName)
    {
        
$tableName='"'.$tableName.'"';
        if(
strpos($tableName,'.')!==false)
            
$tableName=str_replace('.','"."',$tableName);
        
$db->createCommand("ALTER TABLE $tableName$enable TRIGGER ALL")->execute();
    }
}

Включает или отключает проверку целостности.

createColumn() метод

protected CDbColumnSchema createColumn(array $column)
$column array метаданные столбца
{return} CDbColumnSchema нормализованные метаданные столбца
Исходный код: framework/db/schema/pgsql/CPgsqlSchema.php#206 (показать)
protected function createColumn($column)
{
    
$c=new CPgsqlColumnSchema;
    
$c->name=$column['attname'];
    
$c->rawName=$this->quoteColumnName($c->name);
    
$c->allowNull=!$column['attnotnull'];
    
$c->isPrimaryKey=false;
    
$c->isForeignKey=false;
    
$c->comment=$column['comment']===null ? '' : $column['comment'];

    
$c->init($column['type'],$column['atthasdef'] ? $column['adsrc'] : null);

    return 
$c;
}

Создаёт столбец таблицы.

createCommandBuilder() метод

protected CPgsqlCommandBuilder createCommandBuilder()
{return} CPgsqlCommandBuilder экземпляр билдера команд.
Исходный код: framework/db/schema/pgsql/CPgsqlSchema.php#435 (показать)
protected function createCommandBuilder()
{
    return new 
CPgsqlCommandBuilder($this);
}

Создаёт билдер команд для базы данных. Этот метод может быть переопределён дочерними классами для создания билдера команд, специфичного для СУБД.

dropIndex() метод (доступен начиная с версии v1.1.6)

public string dropIndex(string $name, string $table)
$name string имя индекса, который требуется удалить. Имя будет корректно обрамлено кавычками методом.
$table string таблица, индекс которой требуется удалить. Имя будет корректно обрамлено кавычками методом.
{return} string SQL-запрос для удаления индекса.
Исходный код: framework/db/schema/pgsql/CPgsqlSchema.php#425 (показать)
public function dropIndex($name, $table)
{
    return 
'DROP INDEX '.$this->quoteTableName($name);
}

Создаёт SQL-запрос для удаления индекса.

findColumns() метод

protected boolean findColumns(CPgsqlTableSchema $table)
$table CPgsqlTableSchema метаданные таблицы
{return} boolean существует ли таблица в базе данных
Исходный код: framework/db/schema/pgsql/CPgsqlSchema.php#166 (показать)
protected function findColumns($table)
{
    
$sql=<<<EOD
SELECT a.attname, LOWER(format_type(a.atttypid, a.atttypmod)) AS type, d.adsrc, a.attnotnull, a.atthasdef,
pg_catalog.col_description(a.attrelid, a.attnum) AS comment
FROM pg_attribute a LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
WHERE a.attnum > 0 AND NOT a.attisdropped
AND a.attrelid = (SELECT oid FROM pg_catalog.pg_class WHERE relname=:table
    AND relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = :schema))
ORDER BY a.attnum
EOD;
    
$command=$this->getDbConnection()->createCommand($sql);
    
$command->bindValue(':table',$table->name);
    
$command->bindValue(':schema',$table->schemaName);

    if((
$columns=$command->queryAll())===array())
        return 
false;

    foreach(
$columns as $column)
    {
        
$c=$this->createColumn($column);
        
$table->columns[$c->name]=$c;

        if(
stripos($column['adsrc'],'nextval')===0 && preg_match('/nextval\([^\']*\'([^\']+)\'[^\)]*\)/i',$column['adsrc'],$matches))
        {
            if(
strpos($matches[1],'.')!==false || $table->schemaName===self::DEFAULT_SCHEMA)
                
$this->_sequences[$table->rawName.'.'.$c->name]=$matches[1];
            else
                
$this->_sequences[$table->rawName.'.'.$c->name]=$table->schemaName.'.'.$matches[1];
            
$c->autoIncrement=true;
        }
    }
    return 
true;
}

Сбор метаданных столбцов таблицы.

findConstraints() метод

protected void findConstraints(CPgsqlTableSchema $table)
$table CPgsqlTableSchema метаданные таблицы
Исходный код: framework/db/schema/pgsql/CPgsqlSchema.php#225 (показать)
protected function findConstraints($table)
{
    
$sql=<<<EOD
SELECT conname, consrc, contype, indkey FROM (
SELECT
    conname,
    CASE WHEN contype='f' THEN
        pg_catalog.pg_get_constraintdef(oid)
    ELSE
        'CHECK (' || consrc || ')'
    END AS consrc,
    contype,
    conrelid AS relid,
    NULL AS indkey
FROM
    pg_catalog.pg_constraint
WHERE
    contype IN ('f', 'c')
UNION ALL
SELECT
    pc.relname,
    NULL,
    CASE WHEN indisprimary THEN
            'p'
    ELSE
            'u'
    END,
    pi.indrelid,
    indkey
FROM
    pg_catalog.pg_class pc,
    pg_catalog.pg_index pi
WHERE
    pc.oid=pi.indexrelid
    AND EXISTS (
        SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c
        ON (d.refclassid = c.tableoid AND d.refobjid = c.oid)
        WHERE d.classid = pc.tableoid AND d.objid = pc.oid AND d.deptype = 'i' AND c.contype IN ('u', 'p')
)
) AS sub
WHERE relid = (SELECT oid FROM pg_catalog.pg_class WHERE relname=:table
AND relnamespace = (SELECT oid FROM pg_catalog.pg_namespace
WHERE nspname=:schema))
EOD;
    
$command=$this->getDbConnection()->createCommand($sql);
    
$command->bindValue(':table',$table->name);
    
$command->bindValue(':schema',$table->schemaName);
    foreach(
$command->queryAll() as $row)
    {
        if(
$row['contype']==='p') // primary key
            
$this->findPrimaryKey($table,$row['indkey']);
        elseif(
$row['contype']==='f') // foreign key
            
$this->findForeignKey($table,$row['consrc']);
    }
}

Сбор данных о столбцах первичного и внешнего ключей для заданной таблицы.

findForeignKey() метод

protected void findForeignKey(CPgsqlTableSchema $table, string $src)
$table CPgsqlTableSchema метаданные таблицы
$src string определение внешнего ключа PostgreSQL
Исходный код: framework/db/schema/pgsql/CPgsqlSchema.php#322 (показать)
protected function findForeignKey($table,$src)
{
    
$matches=array();
    
$brackets='\(([^\)]+)\)';
    
$pattern="/FOREIGN\s+KEY\s+{$brackets}\s+REFERENCES\s+([^\(]+){$brackets}/i";
    if(
preg_match($pattern,str_replace('"','',$src),$matches))
    {
        
$keys=preg_split('/,\s+/', $matches[1]);
        
$tableName=$matches[2];
        
$fkeys=preg_split('/,\s+/', $matches[3]);
        foreach(
$keys as $i=>$key)
        {
            
$table->foreignKeys[$key]=array($tableName,$fkeys[$i]);
            if(isset(
$table->columns[$key]))
                
$table->columns[$key]->isForeignKey=true;
        }
    }
}

Сбор информации о внешних ключах.

findPrimaryKey() метод

protected void findPrimaryKey(CPgsqlTableSchema $table, string $indices)
$table CPgsqlTableSchema метаданные таблицы
$indices строка список индексов первичного ключа PostgreSQL
Исходный код: framework/db/schema/pgsql/CPgsqlSchema.php#286 (показать)
protected function findPrimaryKey($table,$indices)
{
    
$indices=implode(', ',preg_split('/\s+/',$indices));
    
$sql=<<<EOD
SELECT attnum, attname FROM pg_catalog.pg_attribute WHERE
attrelid=(
    SELECT oid FROM pg_catalog.pg_class WHERE relname=:table AND relnamespace=(
        SELECT oid FROM pg_catalog.pg_namespace WHERE nspname=:schema
    )
)
AND attnum IN (
{$indices})
EOD;
    
$command=$this->getDbConnection()->createCommand($sql);
    
$command->bindValue(':table',$table->name);
    
$command->bindValue(':schema',$table->schemaName);
    foreach(
$command->queryAll() as $row)
    {
        
$name=$row['attname'];
        if(isset(
$table->columns[$name]))
        {
            
$table->columns[$name]->isPrimaryKey=true;
            if(
$table->primaryKey===null)
                
$table->primaryKey=$name;
            elseif(
is_string($table->primaryKey))
                
$table->primaryKey=array($table->primaryKey,$name);
            else
                
$table->primaryKey[]=$name;
        }
    }
}

Сбор информации о первичном ключе.

findTableNames() метод

protected array findTableNames(string $schema='')
$schema строка схема таблиц. По умолчанию пустая строка, означающая текущую или по умолчанию схему. Если не пустая, возвращаемые имена таблиц будут иметь префикс имени схемы.
{return} массив все имена таблиц в базе данных.
Исходный код: framework/db/schema/pgsql/CPgsqlSchema.php#347 (показать)
protected function findTableNames($schema='')
{
    if(
$schema==='')
        
$schema=self::DEFAULT_SCHEMA;
    
$sql=<<<EOD
SELECT table_name, table_schema FROM information_schema.tables
WHERE table_schema=:schema AND table_type='BASE TABLE'
EOD;
    
$command=$this->getDbConnection()->createCommand($sql);
    
$command->bindParam(':schema',$schema);
    
$rows=$command->queryAll();
    
$names=array();
    foreach(
$rows as $row)
    {
        if(
$schema===self::DEFAULT_SCHEMA)
            
$names[]=$row['table_name'];
        else
            
$names[]=$row['table_schema'].'.'.$row['table_name'];
    }
    return 
$names;
}

Возвращает все имена таблиц в базе данных.

loadTable() метод

protected CDbTableSchema loadTable(string $name)
$name строка имя таблицы
{return} CDbTableSchema зависимые от драйвера метаданные таблицы.
Исходный код: framework/db/schema/pgsql/CPgsqlSchema.php#109 (показать)
protected function loadTable($name)
{
    
$table=new CPgsqlTableSchema;
    
$this->resolveTableNames($table,$name);
    if(!
$this->findColumns($table))
        return 
null;
    
$this->findConstraints($table);

    if(
is_string($table->primaryKey) && isset($this->_sequences[$table->rawName.'.'.$table->primaryKey]))
        
$table->sequenceName=$this->_sequences[$table->rawName.'.'.$table->primaryKey];
    elseif(
is_array($table->primaryKey))
    {
        foreach(
$table->primaryKey as $pk)
        {
            if(isset(
$this->_sequences[$table->rawName.'.'.$pk]))
            {
                
$table->sequenceName=$this->_sequences[$table->rawName.'.'.$pk];
                break;
            }
        }
    }

    return 
$table;
}

Загружает метаданные для указанной таблицы.

quoteSimpleTableName() метод (доступно с версии v1.1.6)

public string quoteSimpleTableName(string $name)
$name строка имя таблицы
{return} строка правильно обрамлённое имя таблицы
Исходный код: framework/db/schema/pgsql/CPgsqlSchema.php#53 (показать)
public function quoteSimpleTableName($name)
{
    return 
'"'.$name.'"';
}

Обрамляет имя таблицы для использования в запросе. Простое имя таблицы не имеет префикса схемы.

renameTable() метод (доступно с версии v1.1.6)

public string renameTable(string $table, string $newName)
$table строка переименовываемая таблица. Имя будет корректно обрамлено методом.
$newName строка новое имя таблицы. Имя будет корректно обрамлено методом.
{return} строка SQL-запрос для переименования таблицы БД.
Исходный код: framework/db/schema/pgsql/CPgsqlSchema.php#376 (показать)
public function renameTable($table, $newName)
{
    return 
'ALTER TABLE ' . $this->quoteTableName($table) . ' RENAME TO ' . $this->quoteTableName($newName);
}

Создаёт SQL-запрос для переименования таблицы БД.

resetSequence() метод (доступно с версии v1.1)

public void resetSequence(CDbTableSchema $table, integer|null $value=NULL)
$table CDbTableSchema схема таблицы, последовательность первичного ключа которой будет сброшена
$value целое число|null значение для первичного ключа следующей новой строки. Если не установлено, первичный ключ следующей новой строки будет иметь максимальное значение первичного ключа плюс один (т.е. обрезка последовательности).
Исходный код: framework/db/schema/pgsql/CPgsqlSchema.php#68 (показать)
public function resetSequence($table,$value=null)
{
    if(
$table->sequenceName===null)
        return;
    
$sequence='"'.$table->sequenceName.'"';
    if(
strpos($sequence,'.')!==false)
        
$sequence=str_replace('.','"."',$sequence);
    if(
$value!==null)
        
$value=(int)$value;
    else
        
$value="(SELECT COALESCE(MAX(\"{$table->primaryKey}\"),0) FROM {$table->rawName})+1";
    
$this->getDbConnection()
        ->
createCommand("SELECT SETVAL('$sequence',$value,false)")
        ->
execute();
}

Сбрасывает значение последовательности первичного ключа таблицы. Последовательность будет сброшена таким образом, что первичный ключ следующей новой вставленной строки будет иметь заданное значение или максимальное значение первичного ключа плюс один (т.е. обрезка последовательности).

resolveTableNames() метод

protected void resolveTableNames(CPgsqlTableSchema $table, string $name)
$table CPgsqlTableSchema экземпляр таблицы
$name строка имя таблицы без кавычек
Исходный код: framework/db/schema/pgsql/CPgsqlSchema.php#139 (показать)
protected function resolveTableNames($table,$name)
{
    
$parts=explode('.',str_replace('"','',$name));
    if(isset(
$parts[1]))
    {
        
$schemaName=$parts[0];
        
$tableName=$parts[1];
    }
    else
    {
        
$schemaName=self::DEFAULT_SCHEMA;
        
$tableName=$parts[0];
    }

    
$table->name=$tableName;
    
$table->schemaName=$schemaName;
    if(
$schemaName===self::DEFAULT_SCHEMA)
        
$table->rawName=$this->quoteTableName($tableName);
    else
        
$table->rawName=$this->quoteTableName($schemaName).'.'.$this->quoteTableName($tableName);
}

Генерирует различные виды имён таблиц.

© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc/api/1.1/CPgsqlSchema

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API