KumbiaPHP beta2-dev
Framework PHP en español
|
00001 <?php 00023 class DbInformix extends DbBase implements DbBaseInterface { 00024 00030 public $id_connection; 00031 00037 public $last_result_query; 00038 00044 private $last_query; 00050 public $last_error; 00051 00057 private $return_rows = true; 00058 00064 private $limit = -1; 00065 00071 private $actual_limit = 0; 00072 00077 const DB_ASSOC = 1; 00078 00083 const DB_BOTH = 2; 00084 00089 const DB_NUM = 3; 00090 00095 const TYPE_INTEGER = 'INTEGER'; 00096 00101 const TYPE_DATE = 'DATE'; 00102 00107 const TYPE_VARCHAR = 'VARCHAR'; 00108 00113 const TYPE_DECIMAL = 'DECIMAL'; 00114 00119 const TYPE_DATETIME = 'DATETIME'; 00120 00125 const TYPE_CHAR = 'CHAR'; 00126 00133 public function connect($config){ 00134 if(!extension_loaded('informix')){ 00135 throw new KumbiaException('Debe cargar la extensión de PHP llamada php_ifx'); 00136 } 00137 00138 if($this->id_connection = ifx_connect("{$config['name']}@{$config['host']}", $config['username'], $config['password'])){ 00139 return true; 00140 } else { 00141 throw new KumbiaException($this->error()); 00142 } 00143 00144 } 00145 00152 public function query($sql_query){ 00153 $this->debug($sql_query); 00154 if($this->logger){ 00155 Logger::debug($sql_query); 00156 } 00157 if(!$this->id_connection){ 00158 $this->connect(); 00159 if(!$this->id_connection){ 00160 return false; 00161 } 00162 } 00163 $this->last_query = $sql_query; 00164 00165 // Los resultados que devuelven filas usan cursores tipo SCROLL 00166 if($this->return_rows){ 00167 $result_query = ifx_query($sql_query, $this->id_connection, IFX_HOLD); 00168 } else { 00169 $result_query = ifx_query($sql_query, $this->id_connection); 00170 } 00171 $this->set_return_rows(true); 00172 if($result_query===false){ 00173 $this->last_result_query = false; 00174 throw new KumbiaException($this->error(" al ejecutar <em>\"$sql_query\"</em>")); 00175 } else { 00176 $this->last_result_query = $result_query; 00177 return $result_query; 00178 } 00179 } 00180 00185 public function close(){ 00186 if($this->id_connection) { 00187 return ifx_close($this->id_connection); 00188 } 00189 return false; 00190 } 00191 00199 public function fetch_array($result_query='', $opt=2){ 00200 if(!$this->id_connection){ 00201 return false; 00202 } 00203 if(!$result_query){ 00204 $result_query = $this->last_result_query; 00205 if(!$result_query){ 00206 return false; 00207 } 00208 } 00209 $fetch = ifx_fetch_row($result_query, $opt); 00210 00211 // Informix no soporta limit por eso hay que emularlo 00212 if($this->limit!=-1){ 00213 if($this->actual_limit>=$this->limit){ 00214 $this->limit = -1; 00215 $this->actual_limit = 0; 00216 return false; 00217 } else { 00218 $this->actual_limit++; 00219 if($this->actual_limit==$this->limit){ 00220 $this->limit = -1; 00221 $this->actual_limit = 0; 00222 } 00223 } 00224 } 00225 00226 // Informix no soporta fecth numerico, solo asociativo 00227 if(!is_array($fetch)||($opt==db::DB_ASSOC)){ 00228 return $fetch; 00229 } 00230 if($opt==db::DB_BOTH){ 00231 $result = array(); 00232 $i = 0; 00233 foreach($fetch as $key => $value){ 00234 $result[$key] = $value; 00235 $result[$i++] = $value; 00236 } 00237 return $result; 00238 } 00239 if($opt==db::DB_NUM){ 00240 return array_values($fetch); 00241 } 00242 } 00243 00249 public function __construct($config){ 00250 $this->connect($config); 00251 } 00252 00259 public function num_rows($result_query=''){ 00260 if(!$this->id_connection){ 00261 return false; 00262 } 00263 if(!$result_query){ 00264 $result_query = $this->last_result_query; 00265 if(!$result_query){ 00266 return false; 00267 } 00268 } 00269 if(($number_rows = ifx_num_rows($result_query))!==false){ 00270 00271 // Emula un limit a nivel de adaptador 00272 if($this->limit==-1){ 00273 return $number_rows; 00274 } else { 00275 return $this->limit < $number_rows ? $this->limit : $number_rows; 00276 } 00277 } else { 00278 throw new KumbiaException($this->error()); 00279 } 00280 return false; 00281 } 00282 00290 public function field_name($number, $result_query=''){ 00291 if(!$this->id_connection){ 00292 return false; 00293 } 00294 if(!$result_query){ 00295 $result_query = $this->last_result_query; 00296 if(!$result_query){ 00297 return false; 00298 } 00299 } 00300 $fields = ifx_fieldproperties($result_query); 00301 if(!is_array($fields)){ 00302 return false; 00303 } 00304 00305 $fields = array_keys($fields); 00306 return $fields[$number]; 00307 } 00308 00309 00318 public function data_seek($number, $result_query=''){ 00319 if(!$result_query){ 00320 $result_query = $this->last_result_query; 00321 if(!$result_query){ 00322 return false; 00323 } 00324 } 00325 if(($success = ifx_fetch_row($result_query, $number))!==false){ 00326 return $success; 00327 } else { 00328 throw new KumbiaException($this->error()); 00329 } 00330 return false; 00331 } 00332 00339 public function affected_rows($result_query=''){ 00340 if(!$result_query){ 00341 $result_query = $this->last_result_query; 00342 if(!$result_query){ 00343 return false; 00344 } 00345 } 00346 if(($numberRows = ifx_affected_rows($result_query))!==false){ 00347 return $numberRows; 00348 } else { 00349 $this->lastError = $this->error(); 00350 throw new KumbiaException($this->error()); 00351 } 00352 return false; 00353 } 00354 00360 public function error($err=''){ 00361 if(!$this->id_connection){ 00362 $this->last_error = ifx_errormsg() ? ifx_errormsg() : "[Error Desconocido en Informix: $err]"; 00363 if($this->logger){ 00364 Logger::error($this->last_error); 00365 } 00366 return $this->last_error; 00367 } 00368 $this->last_error = ifx_errormsg($this->id_connection) ? ifx_errormsg($this->id_connection) : "[Error Desconocido en Informix: $err]"; 00369 $this->last_error.= $err; 00370 if($this->logger){ 00371 Logger::error($this->last_error); 00372 } 00373 return $this->last_error; 00374 } 00375 00381 public function no_error(){ 00382 if(!$this->id_connection){ 00383 return ifx_error(); 00384 } 00385 return ifx_error(); 00386 } 00387 00393 public function last_insert_id($table='', $primary_key=''){ 00394 if(!$this->id_connection){ 00395 return false; 00396 } 00397 $sqlca = ifx_getsqlca($this->last_result_query); 00398 return $sqlca["sqlerrd1"]; 00399 } 00400 00407 public function table_exists($table, $schema=''){ 00408 // Informix no soporta schemas 00409 $table = addslashes("$table"); 00410 $num = $this->fetch_one("SELECT COUNT(*) FROM systables WHERE tabname = '$table'"); 00411 return (int) $num[0]; 00412 } 00413 00420 public function limit($sql, $number){ 00424 $number = (int) $number; 00425 $this->limit = $number; 00426 return "$sql -- LIMIT $number\n"; 00427 } 00428 00435 public function drop_table($table, $if_exists=true){ 00436 if($if_exists){ 00437 if($this->table_exists($table)){ 00438 $this->set_return_rows(false); 00439 return $this->query("DROP TABLE $table"); 00440 } else { 00441 return true; 00442 } 00443 } else { 00444 $this->set_return_rows(false); 00445 return $this->query("DROP TABLE $table"); 00446 } 00447 } 00448 00462 public function create_table($table, $definition, $index=array()){ 00463 $create_sql = "CREATE TABLE $table ("; 00464 if(!is_array($definition)){ 00465 throw new KumbiaException("Definición invalida para crear la tabla '$table'"); 00466 } 00467 $create_lines = array(); 00468 $index = array(); 00469 $unique_index = array(); 00470 $primary = array(); 00471 $not_null = ""; 00472 $size = ""; 00473 foreach($definition as $field => $field_def){ 00474 if(isset($field_def['not_null'])){ 00475 $not_null = $field_def['not_null'] ? 'NOT NULL' : ''; 00476 } else { 00477 $not_null = ""; 00478 } 00479 if(isset($field_def['size'])){ 00480 $size = $field_def['size'] ? '('.$field_def['size'].')' : ''; 00481 } else { 00482 $size = ""; 00483 } 00484 if(isset($field_def['index'])){ 00485 if($field_def['index']){ 00486 $index[] = "INDEX($field)"; 00487 } 00488 } 00489 if(isset($field_def['unique_index'])){ 00490 if($field_def['unique_index']){ 00491 $index[] = "UNIQUE($field)"; 00492 } 00493 } 00494 if(isset($field_def['primary'])){ 00495 if($field_def['primary']){ 00496 $primary[] = "$field"; 00497 } 00498 } 00499 if(isset($field_def['auto'])){ 00500 if($field_def['auto']){ 00501 $field_def['type'] = "SERIAL"; 00502 } 00503 } 00504 if(isset($field_def['extra'])){ 00505 $extra = $field_def['extra']; 00506 } else { 00507 $extra = ""; 00508 } 00509 $create_lines[] = "$field ".$field_def['type'].$size.' '.$not_null.' '.$extra; 00510 } 00511 $create_sql.= join(',', $create_lines); 00512 $last_lines = array(); 00513 if(count($primary)){ 00514 $last_lines[] = 'PRIMARY KEY('.join(",", $primary).')'; 00515 } 00516 if(count($index)){ 00517 $last_lines[] = join(',', $index); 00518 } 00519 if(count($unique_index)){ 00520 $last_lines[] = join(',', $unique_index); 00521 } 00522 if(count($last_lines)){ 00523 $create_sql.= ','.join(',', $last_lines).')'; 00524 } 00525 $this->set_return_rows(false); 00526 return $this->query($create_sql); 00527 00528 } 00529 00535 public function list_tables(){ 00536 return $this->fetch_all("SELECT tabname FROM systables WHERE tabtype = 'T' AND version <> 65537"); 00537 } 00538 00545 public function describe_table($table, $schema=''){ 00546 00547 // Informix no soporta schemas 00548 // TODO: No hay un metodo identificable para obtener llaves primarias 00549 // no nulos y tamaños reales de campos 00550 // Primary Key, Null? 00551 $describe = $this->fetch_all("SELECT c.colname AS Field, c.coltype AS Type, 00552 'YES' AS NULL FROM systables t, syscolumns c WHERE 00553 c.tabid = t.tabid AND t.tabname = '$table' ORDER BY c.colno"); 00554 $final_describe = array(); 00555 foreach($describe as $field){ 00556 //Serial 00557 if($field['field']=='id'){ 00558 $field["key"] = 'PRI'; 00559 $field["null"] = 'NO'; 00560 } else { 00561 $field["key"] = ''; 00562 } 00563 if(substr($field['field'], -3)=='_id'){ 00564 $field["null"] = 'NO'; 00565 } 00566 if($field['type']==262){ 00567 $field['type'] = "serial"; 00568 } 00569 if($field['type']==13){ 00570 $field['type'] = "varchar"; 00571 } 00572 if($field['type']==7){ 00573 $field['type'] = "date"; 00574 } 00575 $final_describe[] = array( 00576 "Field" => $field["field"], 00577 "Type" => $field["type"], 00578 "Null" => $field["null"], 00579 "Key" => $field["key"] 00580 ); 00581 } 00582 return $final_describe; 00583 00584 } 00585 00594 public function insert($table, $values, $fields=null){ 00595 $this->set_return_rows(false); 00596 return parent::insert($table, $values, $fields); 00597 } 00598 00608 public function update($table, $fields, $values, $where_condition=null){ 00609 $this->set_return_rows(false); 00610 return parent::update($table, $fields, $values, $where_condition); 00611 } 00612 00619 public function delete($table, $where_condition){ 00620 $this->set_return_rows(false); 00621 return parent::delete($table, $where_condition); 00622 } 00623 00629 public function set_return_rows($value=true){ 00630 $this->return_rows = $value; 00631 } 00632 00637 public function begin(){ 00638 $this->set_return_rows(false); 00639 return $this->query("BEGIN WORK"); 00640 } 00641 00642 00647 public function rollback(){ 00648 $this->set_return_rows(false); 00649 return $this->query("ROLLBACK"); 00650 } 00651 00656 public function commit(){ 00657 $this->set_return_rows(false); 00658 return $this->query("COMMIT"); 00659 } 00660 00661 }