OciAdapter.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <?php
  2. /**
  3. * @package ActiveRecord
  4. */
  5. namespace ActiveRecord;
  6. use PDO;
  7. /**
  8. * Adapter for OCI (not completed yet).
  9. *
  10. * @package ActiveRecord
  11. */
  12. class OciAdapter extends Connection
  13. {
  14. static $QUOTE_CHARACTER = '';
  15. static $DEFAULT_PORT = 1521;
  16. public $dsn_params;
  17. protected function __construct($info)
  18. {
  19. try {
  20. $this->dsn_params = isset($info->charset) ? ";charset=$info->charset" : "";
  21. $this->connection = new PDO("oci:dbname=//$info->host/$info->db$this->dsn_params",$info->user,$info->pass,static::$PDO_OPTIONS);
  22. } catch (PDOException $e) {
  23. throw new DatabaseException($e);
  24. }
  25. }
  26. public function supports_sequences() { return true; }
  27. public function get_next_sequence_value($sequence_name)
  28. {
  29. return $this->query_and_fetch_one('SELECT ' . $this->next_sequence_value($sequence_name) . ' FROM dual');
  30. }
  31. public function next_sequence_value($sequence_name)
  32. {
  33. return "$sequence_name.nextval";
  34. }
  35. public function date_to_string($datetime)
  36. {
  37. return $datetime->format('d-M-Y');
  38. }
  39. public function datetime_to_string($datetime)
  40. {
  41. return $datetime->format('d-M-Y h:i:s A');
  42. }
  43. // $string = DD-MON-YYYY HH12:MI:SS(\.[0-9]+) AM
  44. public function string_to_datetime($string)
  45. {
  46. return parent::string_to_datetime(str_replace('.000000','',$string));
  47. }
  48. public function limit($sql, $offset, $limit)
  49. {
  50. $offset = intval($offset);
  51. $stop = $offset + intval($limit);
  52. return
  53. "SELECT * FROM (SELECT a.*, rownum ar_rnum__ FROM ($sql) a " .
  54. "WHERE rownum <= $stop) WHERE ar_rnum__ > $offset";
  55. }
  56. public function query_column_info($table)
  57. {
  58. $sql =
  59. "SELECT c.column_name, c.data_type, c.data_length, c.data_scale, c.data_default, c.nullable, " .
  60. "(SELECT a.constraint_type " .
  61. "FROM all_constraints a, all_cons_columns b " .
  62. "WHERE a.constraint_type='P' " .
  63. "AND a.constraint_name=b.constraint_name " .
  64. "AND a.table_name = t.table_name AND b.column_name=c.column_name) AS pk " .
  65. "FROM user_tables t " .
  66. "INNER JOIN user_tab_columns c on(t.table_name=c.table_name) " .
  67. "WHERE t.table_name=?";
  68. $values = array(strtoupper($table));
  69. return $this->query($sql,$values);
  70. }
  71. public function query_for_tables()
  72. {
  73. return $this->query("SELECT table_name FROM user_tables");
  74. }
  75. public function create_column(&$column)
  76. {
  77. $column['column_name'] = strtolower($column['column_name']);
  78. $column['data_type'] = strtolower(preg_replace('/\(.*?\)/','',$column['data_type']));
  79. if ($column['data_default'] !== null)
  80. $column['data_default'] = trim($column['data_default'],"' ");
  81. if ($column['data_type'] == 'number')
  82. {
  83. if ($column['data_scale'] > 0)
  84. $column['data_type'] = 'decimal';
  85. elseif ($column['data_scale'] == 0)
  86. $column['data_type'] = 'int';
  87. }
  88. $c = new Column();
  89. $c->inflected_name = Inflector::instance()->variablize($column['column_name']);
  90. $c->name = $column['column_name'];
  91. $c->nullable = $column['nullable'] == 'Y' ? true : false;
  92. $c->pk = $column['pk'] == 'P' ? true : false;
  93. $c->length = $column['data_length'];
  94. if ($column['data_type'] == 'timestamp')
  95. $c->raw_type = 'datetime';
  96. else
  97. $c->raw_type = $column['data_type'];
  98. $c->map_raw_type();
  99. $c->default = $c->cast($column['data_default'],$this);
  100. return $c;
  101. }
  102. public function set_encoding($charset)
  103. {
  104. // is handled in the constructor
  105. }
  106. public function native_database_types()
  107. {
  108. return array(
  109. 'primary_key' => "NUMBER(38) NOT NULL PRIMARY KEY",
  110. 'string' => array('name' => 'VARCHAR2', 'length' => 255),
  111. 'text' => array('name' => 'CLOB'),
  112. 'integer' => array('name' => 'NUMBER', 'length' => 38),
  113. 'float' => array('name' => 'NUMBER'),
  114. 'datetime' => array('name' => 'DATE'),
  115. 'timestamp' => array('name' => 'DATE'),
  116. 'time' => array('name' => 'DATE'),
  117. 'date' => array('name' => 'DATE'),
  118. 'binary' => array('name' => 'BLOB'),
  119. 'boolean' => array('name' => 'NUMBER', 'length' => 1)
  120. );
  121. }
  122. }
  123. ?>