/var/www/(Del)gepgroup.hk/php-activerecord/lib/adapters/OciAdapter.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
<?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;

    public 
$dsn_params;

    protected function 
__construct($info)
    {
        try {
            
$this->dsn_params = isset($info->charset) ? ";charset=$info->charset"";
            
$this->connection = new PDO("oci:dbname=//$info->host/$info->db$this->dsn_params",$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;
    }

    public function 
set_encoding($charset)
    {
        
// is handled in the constructor
    
}

    public function 
native_database_types()
    {
        return array(
            
'primary_key' => "NUMBER(38) NOT NULL PRIMARY KEY",
            
'string' => array('name' => 'VARCHAR2''length' => 255),
            
'text' => array('name' => 'CLOB'),
            
'integer' => array('name' => 'NUMBER''length' => 38),
            
'float' => array('name' => 'NUMBER'),
            
'datetime' => array('name' => 'DATE'),
            
'timestamp' => array('name' => 'DATE'),
            
'time' => array('name' => 'DATE'),
            
'date' => array('name' => 'DATE'),
            
'binary' => array('name' => 'BLOB'),
            
'boolean' => array('name' => 'NUMBER''length' => 1)
        );
    }
}
?>