Вход Регистрация
Файл: onlinepoisk.wm-scripts.ru/vendor/AR/lib/adapters/PgsqlAdapter.php
Строк: 124
<?php
/**
 * @package ActiveRecord
 */
namespace ActiveRecord;

/**
 * Adapter for Postgres (not completed yet)
 * 
 * @package ActiveRecord
 */
class PgsqlAdapter extends Connection
{
    static 
$QUOTE_CHARACTER    '"';
    static 
$DEFAULT_PORT    5432;

    public function 
supports_sequences() { return true; }

    public function 
get_sequence_name($table$column_name)
    {
        return 
"{$table}_{$column_name}_seq";
    }

    public function 
next_sequence_value($sequence_name)
    {
        return 
"nextval('" str_replace("'","\'",$sequence_name) . "')";
    }

    public function 
limit($sql$offset$limit)
    {
        return 
$sql ' LIMIT ' intval($limit) . ' OFFSET ' intval($offset);
    }

    public function 
query_column_info($table)
    {
        
$sql = <<<SQL
SELECT a.attname AS field, a.attlen,
REPLACE(pg_catalog.format_type(a.atttypid, a.atttypmod),'character varying','varchar') AS type,
a.attnotnull AS not_nullable, 
i.indisprimary as pk,
REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(s.column_default,'::[a-z_ ]+',''),''$',''),'^'','') AS default
FROM pg_catalog.pg_attribute a
LEFT JOIN pg_catalog.pg_class c ON(a.attrelid=c.oid)
LEFT JOIN pg_catalog.pg_index i ON(c.oid=i.indrelid AND a.attnum=any(i.indkey))
LEFT JOIN information_schema.columns s ON(s.table_name=? AND a.attname=s.column_name)
WHERE a.attrelid = (select c.oid from pg_catalog.pg_class c inner join pg_catalog.pg_namespace n on(n.oid=c.relnamespace) where c.relname=? and pg_catalog.pg_table_is_visible(c.oid))
AND a.attnum > 0
AND NOT a.attisdropped
ORDER BY a.attnum
SQL;
        
$values = array($table,$table);
        return 
$this->query($sql,$values);
    }

    public function 
query_for_tables()
    {
        return 
$this->query("SELECT tablename FROM pg_tables WHERE schemaname NOT IN('information_schema','pg_catalog')");
    }

    public function 
create_column(&$column)
    {
        
$c = new Column();
        
$c->inflected_name    Inflector::instance()->variablize($column['field']);
        
$c->name            $column['field'];
        
$c->nullable        = ($column['not_nullable'] ? false true);
        
$c->pk                = ($column['pk'] ? true false);
        
$c->auto_increment    false;

        if (
substr($column['type'],0,9) == 'timestamp')
        {
            
$c->raw_type 'datetime';
            
$c->length 19;
        }
        elseif (
$column['type'] == 'date')
        {
            
$c->raw_type 'date';
            
$c->length 10;
        }
        else
        {
            
preg_match('/^([A-Za-z0-9_]+)((([0-9]+(,[0-9]+)?)))?/',$column['type'],$matches);

            
$c->raw_type = (count($matches) > $matches[1] : $column['type']);
            
$c->length count($matches) >= intval($matches[3]) : intval($column['attlen']);

            if (
$c->length 0)
                
$c->length null;
        }

        
$c->map_raw_type();

        if (
$column['default'])
        {
            
preg_match("/^nextval('(.*)')$/",$column['default'],$matches);

            if (
count($matches) == 2)
                
$c->sequence $matches[1];
            else
                
$c->default $c->cast($column['default'],$this);
        }
        return 
$c;
    }
};
?>
Онлайн: 0
Реклама