Файл: onlinepoisk.wm-scripts.ru/vendor/AR/lib/adapters/OciAdapter.php
Строк: 162
<?php
/**
 * @package ActiveRecord
 */
namespace ActiveRecord;
use PDO;
/**
 * Adapter for OCI (not completed yet).
 * 
 * @package ActiveRecord
 */
class OciAdapter extends Connection
{
    static $QUOTE_CHARACTER = '';
    static $DEFAULT_PORT = 1521;
    protected function __construct($info)
    {
        try {
            $this->connection = new PDO("oci:dbname=//$info->host/$info->db",$info->user,$info->pass,static::$PDO_OPTIONS);
        } catch (PDOException $e) {
            throw new DatabaseException($e);
        }
    }
    public function supports_sequences() { return true; }
    
    public function get_next_sequence_value($sequence_name)
    {
        return $this->query_and_fetch_one('SELECT ' . $this->next_sequence_value($sequence_name) . ' FROM dual');
    }
    public function next_sequence_value($sequence_name)
    {
        return "$sequence_name.nextval";
    }
    public function date_to_string($datetime)
    {
        return $datetime->format('d-M-Y');
    }
    public function datetime_to_string($datetime)
    {
        return $datetime->format('d-M-Y h:i:s A');
    }
    // $string = DD-MON-YYYY HH12:MI:SS(.[0-9]+) AM
    public function string_to_datetime($string)
    {
        return parent::string_to_datetime(str_replace('.000000','',$string));
    }
    public function limit($sql, $offset, $limit)
    {
        $offset = intval($offset);
        $stop = $offset + intval($limit);
        return 
            "SELECT * FROM (SELECT a.*, rownum ar_rnum__ FROM ($sql) a " .
            "WHERE rownum <= $stop) WHERE ar_rnum__ > $offset";
    }
    public function query_column_info($table)
    {
        $sql = 
            "SELECT c.column_name, c.data_type, c.data_length, c.data_scale, c.data_default, c.nullable, " .
                "(SELECT a.constraint_type " .
                "FROM all_constraints a, all_cons_columns b " .
                "WHERE a.constraint_type='P' " .
                "AND a.constraint_name=b.constraint_name " .
                "AND a.table_name = t.table_name AND b.column_name=c.column_name) AS pk " .
            "FROM user_tables t " .
            "INNER JOIN user_tab_columns c on(t.table_name=c.table_name) " .
            "WHERE t.table_name=?";
        $values = array(strtoupper($table));
        return $this->query($sql,$values);
    }
    public function query_for_tables()
    {
        return $this->query("SELECT table_name FROM user_tables");
    }
    public function create_column(&$column)
    {
        $column['column_name'] = strtolower($column['column_name']);
        $column['data_type'] = strtolower(preg_replace('/(.*?)/','',$column['data_type']));
        if ($column['data_default'] !== null)
            $column['data_default'] = trim($column['data_default'],"' ");
        if ($column['data_type'] == 'number')
        {
            if ($column['data_scale'] > 0)
                $column['data_type'] = 'decimal';
            elseif ($column['data_scale'] == 0)
                $column['data_type'] = 'int';
        }
        $c = new Column();
        $c->inflected_name    = Inflector::instance()->variablize($column['column_name']);
        $c->name            = $column['column_name'];
        $c->nullable        = $column['nullable'] == 'Y' ? true : false;
        $c->pk                = $column['pk'] == 'P' ? true : false;
        $c->length            = $column['data_length'];
    
        if ($column['data_type'] == 'timestamp')
            $c->raw_type = 'datetime';
        else
            $c->raw_type = $column['data_type'];
        $c->map_raw_type();
        $c->default    = $c->cast($column['data_default'],$this);
        return $c;
    }
};
?>