KumbiaPHP beta2-dev
Framework PHP en español
informix.php
Ir a la documentación de este archivo.
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 }
 Todo Estructuras de Datos Namespaces Archivos Funciones Variables Enumeraciones