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 return false;
00117 }
00118
00119 if(isset($config['host']) && $config['host']){
00120 $id_con = ibase_connect("{$config['host']}:{$config['name']}", $config['username'], $config['password']);
00121 } else {
00122 $id_con = ibase_connect($config['name'], $config['username'], $config['password']);
00123 }
00124
00125 if($this->id_connection = $id_con){
00126 return true;
00127 } else {
00128 throw new KumbiaException($this->error(), $this->no_error(), false);
00129 }
00130 }
00131
00138 public function query($sql_query){
00139 $this->debug($sql_query);
00140 if($this->logger){
00141 Logger::debug($sql_query);
00142 }
00143 if(!$this->id_connection){
00144 $this->connect();
00145 if(!$this->id_connection){
00146 return false;
00147 }
00148 }
00149 $this->last_query = $sql_query;
00150 if($result_query = @ibase_query($sql_query)){
00151 $this->last_result_query = $result_query;
00152 return $result_query;
00153 } else {
00154 $this->last_result_query = false;
00155 throw new KumbiaException($this->error(" al ejecutar <i>\"$sql_query\"</i>"), $this->no_error());
00156 return false;
00157 }
00158 }
00159
00163 public function close(){
00164 if($this->id_connection) {
00165 return ibase_close();
00166 }
00167 return false;
00168 }
00169
00177 public function fetch_array($result_query='', $opt=''){
00178 if($opt==='') {
00179 $opt = db::DB_BOTH;
00180 }
00181 if(!$this->id_connection){
00182 return false;
00183 }
00184 if(!$result_query){
00185 $result_query = $this->last_result_query;
00186 if(!$result_query){
00187 return false;
00188 }
00189
00190 }
00191 if($opt==db::DB_BOTH){
00192 $fetch = ibase_fetch_assoc($result_query);
00193 $result = array();
00194 $i = 0;
00195 foreach($fetch as $key => $value){
00196 $result[$key] = $value;
00197 $result[$i++] = $value;
00198 }
00199 return $result;
00200 }
00201 if($opt==db::DB_ASSOC){
00202 return ibase_fetch_assoc($result_query);
00203 }
00204 if($opt==db::DB_NUM){
00205 return ibase_fetch_row($result_query);
00206 }
00207 return $result;
00208 }
00209
00215 public function __construct($config){
00216 $this->connect($config);
00217 }
00218
00222 public function num_rows($result_query=''){
00226 return false;
00227 }
00228
00236 public function field_name($number, $result_query=''){
00237 if(!$this->id_connection){
00238 return false;
00239 }
00240 if(!$result_query){
00241 $result_query = $this->last_result_query;
00242 if(!$result_query){
00243 return false;
00244 }
00245 }
00246 if(($fieldName = ibase_field_name($result_query, $number))!==false){
00247 return $fieldName;
00248 } else {
00249 throw new KumbiaException($this->error(), $this->no_error());
00250 return false;
00251 }
00252 return false;
00253 }
00254
00255
00263 public function data_seek($number, $result_query=''){
00264 if(!$result_query){
00265 $result_query = $this->last_result_query;
00266 if(!$result_query){
00267 return false;
00268 }
00269 }
00270 if(($success = ibase_data_seek($result_query, $number))!==false){
00271 return $success;
00272 } else {
00273 throw new KumbiaException($this->error(), $this->no_error());
00274 return false;
00275 }
00276 return false;
00277 }
00278
00285 public function affected_rows($result_query=''){
00286 if(($numberRows = ibase_affected_rows())!==false){
00287 return $numberRows;
00288 } else {
00289 $this->lastError = $this->error();
00290 throw new KumbiaException($this->error(), $this->no_error());
00291 return false;
00292 }
00293 return false;
00294 }
00295
00301 public function error($err=''){
00302 if(!$this->id_connection){
00303 $this->last_error = ibase_errmsg() ? ibase_errmsg() : "[Error Desconocido en Firebird: $err]";
00304 if($this->logger){
00305 Logger::error($this->last_error);
00306 }
00307 return $this->last_error;
00308 }
00309 $this->last_error = ibase_errmsg() ? ibase_errmsg() : "[Error Desconocido en Firebird: $err]";
00310 $this->last_error.= $err;
00311 if($this->logger){
00312 Logger::error($this->last_error);
00313 }
00314 return $this->last_error;
00315 }
00316
00324 public function fetch_one($sql){
00325 $q = $this->query($sql);
00326 if($q){
00327 return $this->fetch_array($q);
00328 } else {
00329 return array();
00330 }
00331 }
00332
00338 public function no_error(){
00339 return ibase_errcode();
00340 }
00341
00347 public function last_insert_id($table='', $primary_key=''){
00348 if(!$this->id_connection){
00349 return false;
00350 }
00351 return ibase_insert_id($this->id_connection);
00352 }
00353
00360 public function table_exists($table, $schema=''){
00361 $table = strtoupper(addslashes("$table"));
00362
00363 $num = $this->fetch_one("SELECT COUNT(*) FROM rdb\$relations WHERE rdb\$relation_name = '$table'");
00364 return $num[0];
00365 }
00366
00373 public function limit($sql){
00374 $params = Util::getParams(func_get_args());
00375 $sql_new = $sql;
00376
00377 if(isset($params['limit']) && is_numeric($params['limit'])){
00378 $sql_new.=" FIRST $params[limit]";
00379 }
00380
00381 if(isset($params['offset']) && is_numeric($params['offset'])){
00382 $sql_new.=" SKIP $params[offset]";
00383 }
00384
00385 return $sql_new;
00386 }
00387
00394 public function drop_table($table, $if_exists=true){
00395 if($if_exists){
00396 if($this->table_exists($table)){
00397 return $this->query("DROP TABLE $table");
00398 } else {
00399 return true;
00400 }
00401 } else {
00402 return $this->query("DROP TABLE $table");
00403 }
00404 }
00405
00419 public function create_table($table, $definition, $index=array()){
00420 $create_sql = "CREATE TABLE $table (";
00421 if(!is_array($definition)){
00422 new KumbiaException("Definición invalida para crear la tabla '$table'");
00423 return false;
00424 }
00425 $create_lines = array();
00426 $index = array();
00427 $unique_index = array();
00428 $primary = array();
00429 $not_null = "";
00430 $size = "";
00431 foreach($definition as $field => $field_def){
00432 if(isset($field_def['not_null'])){
00433 $not_null = $field_def['not_null'] ? 'NOT NULL' : '';
00434 } else {
00435 $not_null = "";
00436 }
00437 if(isset($field_def['size'])){
00438 $size = $field_def['size'] ? '('.$field_def['size'].')' : '';
00439 } else {
00440 $size = "";
00441 }
00442 if(isset($field_def['index'])){
00443 if($field_def['index']){
00444 $index[] = "INDEX($field)";
00445 }
00446 }
00447 if(isset($field_def['unique_index'])){
00448 if($field_def['unique_index']){
00449 $index[] = "UNIQUE($field)";
00450 }
00451 }
00452 if(isset($field_def['primary'])){
00453 if($field_def['primary']){
00454 $primary[] = "$field";
00455 }
00456 }
00457 if(isset($field_def['auto'])){
00458 if($field_def['auto']){
00459 $gen = $this->fetch_one("SELECT COUNT(*) FROM RDB\$GENERATORS WHERE RDB\$GENERATOR_NAME = UPPER('{$table}_{$field}_seq')");
00460 if(!$gen[0]){
00461 $this->query("INSERT INTO RDB\$GENERATORS (RDB\$GENERATOR_NAME) VALUES (UPPER('{$table}_{$field}_seq'))");
00462 }
00463 $this->query("SET GENERATOR {$table}_{$field}_seq TO 1;");
00464 }
00465 }
00466 if(isset($field_def['extra'])){
00467 $extra = $field_def['extra'];
00468 } else {
00469 $extra = "";
00470 }
00471 $create_lines[] = "$field ".$field_def['type'].$size.' '.$not_null.' '.$extra;
00472 }
00473 $create_sql.= join(',', $create_lines);
00474 $last_lines = array();
00475 if(count($primary)){
00476 $last_lines[] = 'PRIMARY KEY('.join(",", $primary).')';
00477 }
00478 if(count($index)){
00479 $last_lines[] = join(',', $index);
00480 }
00481 if(count($unique_index)){
00482 $last_lines[] = join(',', $unique_index);
00483 }
00484 if(count($last_lines)){
00485 $create_sql.= ','.join(',', $last_lines).')';
00486 }
00487 return $this->query($create_sql);
00488
00489 }
00490
00496 public function list_tables(){
00497 return $this->fetch_all("SHOW TABLES");
00498 }
00499
00506 public function describe_table($table, $schema=''){
00507 if($schema==''){
00508 return $this->fetch_all("DESCRIBE $table");
00509 } else {
00510 return $this->fetch_all("DESCRIBE $schema.$table");
00511 }
00512 }
00513 }