KumbiaPHP  beta2
Framework PHP
 Todo Estructuras de Datos Namespaces Archivos Funciones Variables Páginas
informix.php
Ir a la documentación de este archivo.
1 <?php
29 class DbInformix extends DbBase implements DbBaseInterface
30 {
31 
49  protected $last_query;
55  public $last_error;
61  private $return_rows = true;
67  private $limit = -1;
73  private $actual_limit = 0;
74 
79  const DB_ASSOC = 1;
80 
85  const DB_BOTH = 2;
86 
91  const DB_NUM = 3;
92 
97  const TYPE_INTEGER = 'INTEGER';
98 
103  const TYPE_DATE = 'DATE';
104 
109  const TYPE_VARCHAR = 'VARCHAR';
110 
115  const TYPE_DECIMAL = 'DECIMAL';
116 
121  const TYPE_DATETIME = 'DATETIME';
122 
127  const TYPE_CHAR = 'CHAR';
128 
135  public function connect($config)
136  {
137  if (!extension_loaded('informix')) {
138  throw new KumbiaException('Debe cargar la extensión de PHP llamada php_ifx');
139  }
140 
141  if ($this->id_connection = ifx_connect("{$config['name']}@{$config['host']}", $config['username'], $config['password'])) {
142  return true;
143  } else {
144  throw new KumbiaException($this->error());
145  }
146  }
147 
154  public function query($sql_query)
155  {
156  $this->debug($sql_query);
157  if ($this->logger) {
158  Logger::debug($sql_query);
159  }
160 
161  $this->last_query = $sql_query;
162 
163  // Los resultados que devuelven filas usan cursores tipo SCROLL
164  if ($this->return_rows) {
165  $result_query = ifx_query($sql_query, $this->id_connection, IFX_HOLD);
166  } else {
167  $result_query = ifx_query($sql_query, $this->id_connection);
168  }
169  $this->set_return_rows(true);
170  if ($result_query === false) {
171  throw new KumbiaException($this->error(" al ejecutar <em>\"$sql_query\"</em>"));
172  } else {
173  $this->last_result_query = $result_query;
174  return $result_query;
175  }
176  }
177 
182  public function close()
183  {
184  if ($this->id_connection) {
185  return ifx_close($this->id_connection);
186  }
187  return false;
188  }
189 
197  public function fetch_array($result_query=NULL, $opt=2)
198  {
199 
200  if (!$result_query) {
201  $result_query = $this->last_result_query;
202  if (!$result_query) {
203  return false;
204  }
205  }
206  $fetch = ifx_fetch_row($result_query, $opt);
207 
208  // Informix no soporta limit por eso hay que emularlo
209  if ($this->limit != -1) {
210  if ($this->actual_limit >= $this->limit) {
211  $this->limit = -1;
212  $this->actual_limit = 0;
213  return false;
214  } else {
215  $this->actual_limit++;
216  if ($this->actual_limit == $this->limit) {
217  $this->limit = -1;
218  $this->actual_limit = 0;
219  }
220  }
221  }
222 
223  // Informix no soporta fetch numerico, solo asociativo
224  if (!is_array($fetch) || ($opt == self::DB_ASSOC)) {
225  return $fetch;
226  }
227  if ($opt == self::DB_BOTH) {
228  $result = array();
229  $i = 0;
230  foreach ($fetch as $key => $value) {
231  $result[$key] = $value;
232  $result[$i++] = $value;
233  }
234  return $result;
235  }
236  if ($opt == self::DB_NUM) {
237  return array_values($fetch);
238  }
239  }
240 
246  public function __construct($config)
247  {
248  $this->connect($config);
249  }
250 
257  public function num_rows($result_query=NULL)
258  {
259 
260  if (!$result_query) {
261  $result_query = $this->last_result_query;
262  if (!$result_query) {
263  return false;
264  }
265  }
266  if (($number_rows = ifx_num_rows($result_query)) !== false) {
267 
268  // Emula un limit a nivel de adaptador
269  if ($this->limit == -1) {
270  return $number_rows;
271  } else {
272  return $this->limit < $number_rows ? $this->limit : $number_rows;
273  }
274  } else {
275  throw new KumbiaException($this->error());
276  }
277  }
278 
286  public function field_name($number, $result_query=NULL)
287  {
288 
289  if (!$result_query) {
290  $result_query = $this->last_result_query;
291  if (!$result_query) {
292  return false;
293  }
294  }
295  $fields = ifx_fieldproperties($result_query);
296  if (!is_array($fields)) {
297  return false;
298  }
299 
300  $fields = array_keys($fields);
301  return $fields[$number];
302  }
303 
312  public function data_seek($number, $result_query=NULL)
313  {
314  if (!$result_query) {
315  $result_query = $this->last_result_query;
316  if (!$result_query) {
317  return false;
318  }
319  }
320  if (($success = ifx_fetch_row($result_query, $number)) !== false) {
321  return $success;
322  } else {
323  throw new KumbiaException($this->error());
324  }
325  }
326 
333  public function affected_rows($result_query=NULL)
334  {
335  if (!$result_query) {
336  $result_query = $this->last_result_query;
337  if (!$result_query) {
338  return false;
339  }
340  }
341  if (($numberRows = ifx_affected_rows($result_query)) !== false) {
342  return $numberRows;
343  } else {
344  throw new KumbiaException($this->error());
345  }
346  }
347 
353  public function error($err='')
354  {
355  if (!$this->id_connection) {
356  $this->last_error = ifx_errormsg() ? ifx_errormsg() : "[Error Desconocido en Informix: $err]";
357  if ($this->logger) {
358  Logger::error($this->last_error);
359  }
360  return $this->last_error;
361  }
362  $this->last_error = ifx_errormsg($this->id_connection) ? ifx_errormsg($this->id_connection) : "[Error Desconocido en Informix: $err]";
363  $this->last_error.= $err;
364  if ($this->logger) {
365  Logger::error($this->last_error);
366  }
367  return $this->last_error;
368  }
369 
375  public function no_error()
376  {
377  return ifx_error();
378  }
379 
385  public function last_insert_id($table='', $primary_key='')
386  {
387  $sqlca = ifx_getsqlca($this->last_result_query);
388  return $sqlca["sqlerrd1"];
389  }
390 
397  public function table_exists($table, $schema='')
398  {
399  // Informix no soporta schemas
400  $table = addslashes("$table");
401  $num = $this->fetch_one("SELECT COUNT(*) FROM systables WHERE tabname = '$table'");
402  return (int) $num[0];
403  }
404 
411  public function limit($sql){
415  return "$sql \n";
416  }
417 
418 
425  public function drop_table($table, $if_exists=true)
426  {
427  if ($if_exists) {
428  if ($this->table_exists($table)) {
429  $this->set_return_rows(false);
430  return $this->query("DROP TABLE $table");
431  } else {
432  return true;
433  }
434  } else {
435  $this->set_return_rows(false);
436  return $this->query("DROP TABLE $table");
437  }
438  }
439 
453  public function create_table($table, $definition, $index=array())
454  {
455  $create_sql = "CREATE TABLE $table (";
456  if (!is_array($definition)) {
457  throw new KumbiaException("Definición invalida para crear la tabla '$table'");
458  }
459  $create_lines = array();
460  $index = array();
461  $unique_index = array();
462  $primary = array();
463  //$not_null = "";
464  //$size = "";
465  foreach ($definition as $field => $field_def) {
466  if (isset($field_def['not_null'])) {
467  $not_null = $field_def['not_null'] ? 'NOT NULL' : '';
468  } else {
469  $not_null = "";
470  }
471  if (isset($field_def['size'])) {
472  $size = $field_def['size'] ? '(' . $field_def['size'] . ')' : '';
473  } else {
474  $size = "";
475  }
476  if (isset($field_def['index'])) {
477  if ($field_def['index']) {
478  $index[] = "INDEX($field)";
479  }
480  }
481  if (isset($field_def['unique_index'])) {
482  if ($field_def['unique_index']) {
483  $index[] = "UNIQUE($field)";
484  }
485  }
486  if (isset($field_def['primary'])) {
487  if ($field_def['primary']) {
488  $primary[] = "$field";
489  }
490  }
491  if (isset($field_def['auto'])) {
492  if ($field_def['auto']) {
493  $field_def['type'] = "SERIAL";
494  }
495  }
496  if (isset($field_def['extra'])) {
497  $extra = $field_def['extra'];
498  } else {
499  $extra = "";
500  }
501  $create_lines[] = "$field " . $field_def['type'] . $size . ' ' . $not_null . ' ' . $extra;
502  }
503  $create_sql.= join(',', $create_lines);
504  $last_lines = array();
505  if (count($primary)) {
506  $last_lines[] = 'PRIMARY KEY(' . join(",", $primary) . ')';
507  }
508  if (count($index)) {
509  $last_lines[] = join(',', $index);
510  }
511  if (count($unique_index)) {
512  $last_lines[] = join(',', $unique_index);
513  }
514  if (count($last_lines)) {
515  $create_sql.= ',' . join(',', $last_lines) . ')';
516  }
517  $this->set_return_rows(false);
518  return $this->query($create_sql);
519  }
520 
526  public function list_tables()
527  {
528  return $this->fetch_all("SELECT tabname FROM systables WHERE tabtype = 'T' AND version <> 65537");
529  }
530 
537  public function describe_table($table, $schema='')
538  {
539 
540  // Informix no soporta schemas
541  // TODO: No hay un metodo identificable para obtener llaves primarias
542  // no nulos y tamaños reales de campos
543  // Primary Key, Null
544  $describe = $this->fetch_all("SELECT c.colname AS Field, c.coltype AS Type,
545  'YES' AS NULL FROM systables t, syscolumns c WHERE
546  c.tabid = t.tabid AND t.tabname = '$table' ORDER BY c.colno");
547  $final_describe = array();
548  foreach ($describe as $field) {
549  //Serial
550  if ($field['field'] == 'id') {
551  $field["key"] = 'PRI';
552  $field["null"] = 'NO';
553  } else {
554  $field["key"] = '';
555  }
556  if (substr($field['field'], -3) == '_id') {
557  $field["null"] = 'NO';
558  }
559  if ($field['type'] == 262) {
560  $field['type'] = "serial";
561  }
562  if ($field['type'] == 13) {
563  $field['type'] = "varchar";
564  }
565  if ($field['type'] == 7) {
566  $field['type'] = "date";
567  }
568  $final_describe[] = array(
569  "Field" => $field["field"],
570  "Type" => $field["type"],
571  "Null" => $field["null"],
572  "Key" => $field["key"]
573  );
574  }
575  return $final_describe;
576  }
577 
586  public function insert($table, $values, $fields=null)
587  {
588  $this->set_return_rows(false);
589  return parent::insert($table, $values, $fields);
590  }
591 
601  public function update($table, $fields, $values, $where_condition=null)
602  {
603  $this->set_return_rows(false);
604  return parent::update($table, $fields, $values, $where_condition);
605  }
606 
613  public function delete($table, $where_condition)
614  {
615  $this->set_return_rows(false);
616  return parent::delete($table, $where_condition);
617  }
618 
624  public function set_return_rows($value=true)
625  {
626  $this->return_rows = $value;
627  }
628 
633  public function begin()
634  {
635  $this->set_return_rows(false);
636  return $this->query("BEGIN WORK");
637  }
638 
643  public function rollback()
644  {
645  $this->set_return_rows(false);
646  return $this->query("ROLLBACK");
647  }
648 
653  public function commit()
654  {
655  $this->set_return_rows(false);
656  return $this->query("COMMIT");
657  }
658 
664  public function last_sql_query()
665  {
666  return $this->last_query;
667  }
668 
669 }