KumbiaPHP beta2-dev
Framework PHP en español
firebird.php
Ir a la documentación de este archivo.
00001 <?php
00023 class DbFirebird 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 
00056         const DB_ASSOC = MYSQL_ASSOC;
00057 
00062         const DB_BOTH = MYSQL_BOTH;
00063 
00068         const DB_NUM = MYSQL_NUM;
00069 
00074         const TYPE_INTEGER = 'INTEGER';
00075 
00080         const TYPE_DATE = 'DATE';
00081 
00086         const TYPE_VARCHAR = 'VARCHAR';
00087 
00092         const TYPE_DECIMAL = 'DECIMAL';
00093 
00098         const TYPE_DATETIME = 'DATETIME';
00099 
00104         const TYPE_CHAR = 'CHAR';
00105 
00112         public function connect($config){
00113 
00114                 if(!extension_loaded('interbase')){
00115                         throw new KumbiaException('Debe cargar la extensión de PHP llamada php_interbase');
00116                 }
00117                 
00118                 if(isset($config['host']) && $config['host']){
00119                         $id_con = ibase_connect("{$config['host']}:{$config['name']}", $config['username'], $config['password']);
00120                 } else {
00121                         $id_con = ibase_connect($config['name'], $config['username'], $config['password']);
00122                 }
00123 
00124                 if($this->id_connection = $id_con){
00125                         return true;
00126                 } else {
00127                         throw new KumbiaException($this->error());
00128                 }
00129         }
00130 
00137         public function query($sql_query){
00138                 $this->debug($sql_query);
00139         if($this->logger){
00140             Logger::debug($sql_query);
00141         }
00142                 if(!$this->id_connection){
00143                         $this->connect();
00144                         if(!$this->id_connection){
00145                                 return false;
00146                         }
00147                 }
00148                 $this->last_query = $sql_query;
00149                 if($result_query = @ibase_query($sql_query)){
00150                         $this->last_result_query = $result_query;
00151                         return $result_query;
00152                 } else {
00153                         $this->last_result_query = false;
00154                         throw new KumbiaException($this->error(" al ejecutar <em>\"$sql_query\"</em>"));
00155                 }
00156         }
00157 
00162         public function close(){
00163                 if($this->id_connection) {
00164                         return ibase_close();
00165                 }
00166                 return false;
00167         }
00168 
00176         public function fetch_array($result_query='', $opt=MYSQL_BOTH){
00177                 if(!$this->id_connection){
00178                         return false;
00179                 }
00180                 if(!$result_query){
00181                         $result_query = $this->last_result_query;
00182                         if(!$result_query){
00183                                 return false;
00184                         }
00185 
00186                 }
00187                 if($opt==db::DB_BOTH){
00188                         $fetch = ibase_fetch_assoc($result_query);
00189                         $result = array();
00190                         $i = 0;
00191                         foreach($fetch as $key => $value){
00192                                 $result[$key] = $value;
00193                                 $result[$i++] = $value;
00194                         }
00195                         return $result;
00196                 }
00197                 if($opt==db::DB_ASSOC){
00198                         return ibase_fetch_assoc($result_query);
00199                 }
00200                 if($opt==db::DB_NUM){
00201                         return ibase_fetch_row($result_query);
00202                 }
00203                 return $result;
00204         }
00205 
00211         public function __construct($config){
00212                 $this->connect($config);
00213         }
00214 
00218         public function num_rows($result_query=''){
00219                  // GDS Interbase no soporta esta funcion (No debe ser usada)
00220                 return false;
00221         }
00222 
00230         public function field_name($number, $result_query=''){
00231                 if(!$this->id_connection){
00232                         return false;
00233                 }
00234                 if(!$result_query){
00235                         $result_query = $this->last_result_query;
00236                         if(!$result_query){
00237                                 return false;
00238                         }
00239                 }
00240                 if(($fieldName = ibase_field_name($result_query, $number))!==false){
00241                         return $fieldName;
00242                 } else {
00243                         throw new KumbiaException($this->error());
00244                 }
00245                 return false;
00246         }
00247 
00248 
00256         public function data_seek($number, $result_query=''){
00257                 if(!$result_query){
00258                         $result_query = $this->last_result_query;
00259                         if(!$result_query){
00260                                 return false;
00261                         }
00262                 }
00263                 if(($success = ibase_data_seek($result_query, $number))!==false){
00264                         return $success;
00265                 } else {
00266                         throw new KumbiaException($this->error());
00267                 }
00268                 return false;
00269         }
00270 
00277         public function affected_rows($result_query=''){
00278                 if(($numberRows = ibase_affected_rows())!==false){
00279                         return $numberRows;
00280                 } else {
00281                         $this->lastError = $this->error();
00282                         throw new KumbiaException($this->error());
00283                 }
00284                 return false;
00285         }
00286 
00292         public function error($err=''){
00293                 if(!$this->id_connection){
00294                         $this->last_error = ibase_errmsg() ? ibase_errmsg() : "[Error Desconocido en Firebird: $err]";
00295             if($this->logger){
00296                 Logger::error($this->last_error);
00297             }
00298                         return $this->last_error;
00299                 }
00300                 $this->last_error = ibase_errmsg() ? ibase_errmsg() : "[Error Desconocido en Firebird: $err]";
00301                 $this->last_error.= $err;
00302         if($this->logger){
00303             Logger::error($this->last_error);
00304         }
00305                 return $this->last_error;
00306         }
00307 
00315         public function fetch_one($sql){
00316                 $q = $this->query($sql);
00317                 if($q){
00318                         return $this->fetch_array($q);
00319                 } else {
00320                         return array();
00321                 }
00322         }
00323 
00329         public function no_error(){
00330                 return ibase_errcode();
00331         }
00332 
00338         public function last_insert_id($table='', $primary_key=''){
00339                 if(!$this->id_connection){
00340                         return false;
00341                 }
00342                 return ibase_insert_id($this->id_connection);
00343         }
00344 
00351         public function table_exists($table, $schema=''){
00352                 $table = strtoupper(addslashes("$table"));
00353                 // NOT LIKE 'RDB\$%'
00354                 $num = $this->fetch_one("SELECT COUNT(*) FROM rdb\$relations WHERE rdb\$relation_name = '$table'");
00355                 return $num[0];
00356         }
00357 
00364         public function limit($sql){
00365                 $params = Util::getParams(func_get_args());
00366                 $sql_new = $sql;
00367         
00368                 if(isset($params['limit']) && is_numeric($params['limit'])){
00369                         $sql_new.=" FIRST $params[limit]";
00370                 }
00371                 
00372                 if(isset($params['offset']) && is_numeric($params['offset'])){
00373                         $sql_new.=" SKIP $params[offset]";
00374                 }
00375                 
00376                 return $sql_new;
00377         }
00378 
00385         public function drop_table($table, $if_exists=true){
00386                 if($if_exists){
00387                         if($this->table_exists($table)){
00388                                 return $this->query("DROP TABLE $table");
00389                         } else {
00390                                 return true;
00391                         }
00392                 } else {
00393                         return $this->query("DROP TABLE $table");
00394                 }
00395         }
00396 
00410         public function create_table($table, $definition, $index=array()){
00411                 $create_sql = "CREATE TABLE $table (";
00412                 if(!is_array($definition)){
00413                         throw new KumbiaException("Definición invalida para crear la tabla '$table'");
00414                 }
00415                 $create_lines = array();
00416                 $index = array();
00417                 $unique_index = array();
00418                 $primary = array();
00419                 $not_null = "";
00420                 $size = "";
00421                 foreach($definition as $field => $field_def){
00422                         if(isset($field_def['not_null'])){
00423                                 $not_null = $field_def['not_null'] ? 'NOT NULL' : '';
00424                         } else {
00425                                 $not_null = "";
00426                         }
00427                         if(isset($field_def['size'])){
00428                                 $size = $field_def['size'] ? '('.$field_def['size'].')' : '';
00429                         } else {
00430                                 $size = "";
00431                         }
00432                         if(isset($field_def['index'])){
00433                                 if($field_def['index']){
00434                                         $index[] = "INDEX($field)";
00435                                 }
00436                         }
00437                         if(isset($field_def['unique_index'])){
00438                                 if($field_def['unique_index']){
00439                                         $index[] = "UNIQUE($field)";
00440                                 }
00441                         }
00442                         if(isset($field_def['primary'])){
00443                                 if($field_def['primary']){
00444                                         $primary[] = "$field";
00445                                 }
00446                         }
00447                         if(isset($field_def['auto'])){
00448                                 if($field_def['auto']){
00449                                         $gen = $this->fetch_one("SELECT COUNT(*) FROM RDB\$GENERATORS WHERE RDB\$GENERATOR_NAME = UPPER('{$table}_{$field}_seq')");
00450                                         if(!$gen[0]){
00451                                                 $this->query("INSERT INTO RDB\$GENERATORS (RDB\$GENERATOR_NAME) VALUES (UPPER('{$table}_{$field}_seq'))");
00452                                         }
00453                                         $this->query("SET GENERATOR {$table}_{$field}_seq TO 1;");
00454                                 }
00455                         }
00456                         if(isset($field_def['extra'])){
00457                                 $extra = $field_def['extra'];
00458                         } else {
00459                                 $extra = "";
00460                         }
00461                         $create_lines[] = "$field ".$field_def['type'].$size.' '.$not_null.' '.$extra;
00462                 }
00463                 $create_sql.= join(',', $create_lines);
00464                 $last_lines = array();
00465                 if(count($primary)){
00466                         $last_lines[] = 'PRIMARY KEY('.join(",", $primary).')';
00467                 }
00468                 if(count($index)){
00469                         $last_lines[] = join(',', $index);
00470                 }
00471                 if(count($unique_index)){
00472                         $last_lines[] = join(',', $unique_index);
00473                 }
00474                 if(count($last_lines)){
00475                         $create_sql.= ','.join(',', $last_lines).')';
00476                 }
00477                 return $this->query($create_sql);
00478 
00479         }
00480 
00486         public function list_tables(){
00487                 return $this->fetch_all("SHOW TABLES");
00488         }
00489 
00496         public function describe_table($table, $schema=''){
00497                 if($schema==''){
00498                         return $this->fetch_all("DESCRIBE $table");
00499                 } else {
00500                         return $this->fetch_all("DESCRIBE $schema.$table");
00501                 }
00502         }
00503 }
 Todo Estructuras de Datos Namespaces Archivos Funciones Variables Enumeraciones