Файл: 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) > 0 ? $matches[1] : $column['type']);
            $c->length = count($matches) >= 4 ? 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;
    }
};
?>