KumbiaPHP beta2-dev
Framework PHP en español
|
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 }