KumbiaPHP  beta2
Framework PHP
 Todo Estructuras de Datos Namespaces Archivos Funciones Variables Páginas
firebird.php
Ir a la documentación de este archivo.
1 <?php
29 class DbFirebird extends DbBase implements DbBaseInterface
30 {
31 
49  protected $last_query;
55  public $last_error;
56 
61  const DB_ASSOC = MYSQL_ASSOC;
62 
67  const DB_BOTH = MYSQL_BOTH;
68 
73  const DB_NUM = MYSQL_NUM;
74 
79  const TYPE_INTEGER = 'INTEGER';
80 
85  const TYPE_DATE = 'DATE';
86 
91  const TYPE_VARCHAR = 'VARCHAR';
92 
97  const TYPE_DECIMAL = 'DECIMAL';
98 
103  const TYPE_DATETIME = 'DATETIME';
104 
109  const TYPE_CHAR = 'CHAR';
110 
117  public function connect($config)
118  {
119 
120  if (!extension_loaded('interbase')) {
121  throw new KumbiaException('Debe cargar la extensión de PHP llamada php_interbase');
122  }
123 
124  if (isset($config['host']) && $config['host']) {
125  $id_con = ibase_connect("{$config['host']}:{$config['name']}", $config['username'], $config['password']);
126  } else {
127  $id_con = ibase_connect($config['name'], $config['username'], $config['password']);
128  }
129 
130  if ($this->id_connection = $id_con) {
131  return true;
132  } else {
133  throw new KumbiaException($this->error());
134  }
135  }
136 
143  public function query($sql_query)
144  {
145  $this->debug($sql_query);
146  if ($this->logger) {
147  Logger::debug($sql_query);
148  }
149 
150  $this->last_query = $sql_query;
151  if ($result_query = ibase_query($this->id_connection, $sql_query)) {
152  $this->last_result_query = $result_query;
153  return $result_query;
154  } else {
155  throw new KumbiaException($this->error(" al ejecutar <em>\"$sql_query\"</em>"));
156  }
157  }
158 
163  public function close()
164  {
165  if ($this->id_connection) {
166  return ibase_close();
167  }
168  return false;
169  }
170 
178  public function fetch_array($result_query=NULL, $opt=MYSQL_BOTH)
179  {
180  $result=array();
181  if (!$result_query) {
182  $result_query = $this->last_result_query;
183  if (!$result_query) {
184  return false;
185  }
186  }
187  if ($opt == db::DB_BOTH) {
188  $fetch = ibase_fetch_assoc($result_query);
189  $result = array();
190  $i = 0;
191  foreach ($fetch as $key => $value) {
192  $result[$key] = $value;
193  $result[$i++] = $value;
194  }
195  return $result;
196  }
197  if ($opt == db::DB_ASSOC) {
198  return ibase_fetch_assoc($result_query);
199  }
200  if ($opt == db::DB_NUM) {
201  return ibase_fetch_row($result_query);
202  }
203  return $result;
204  }
205 
211  public function __construct($config)
212  {
213  $this->connect($config);
214  }
215 
219  public function num_rows($result_query='')
220  {
221  // GDS Interbase no soporta esta funcion (No debe ser usada)
222  return false;
223  }
224 
232  public function field_name($number, $result_query='')
233  {
234 
235  if (!$result_query) {
236  $result_query = $this->last_result_query;
237  if (!$result_query) {
238  return false;
239  }
240  }
241  if (($fieldName = ibase_field_name($result_query, $number)) !== false) {
242  return $fieldName;
243  } else {
244  throw new KumbiaException($this->error());
245  }
246  }
247 
255  public function data_seek($number, $result_query=NULL)
256  {
257  if (!$result_query) {
258  $result_query = $this->last_result_query;
259  if (!$result_query) {
260  return false;
261  }
262  }
263  if (($success = ibase_data_seek($result_query, $number)) !== false) {
264  return $success;
265  } else {
266  throw new KumbiaException($this->error());
267  }
268  }
269 
276  public function affected_rows($result_query=NULL)
277  {
278  if (($numberRows = ibase_affected_rows()) !== false) {
279  return $numberRows;
280  } else {
281  throw new KumbiaException($this->error());
282  }
283  }
284 
290  public function error($err='')
291  {
292  if (!$this->id_connection) {
293  $this->last_error = ibase_errmsg() ? ibase_errmsg() : "[Error Desconocido en Firebird: $err]";
294  if ($this->logger) {
295  Logger::error($this->last_error);
296  }
297  return $this->last_error;
298  }
299  $this->last_error = ibase_errmsg() ? ibase_errmsg() : "[Error Desconocido en Firebird: $err]";
300  $this->last_error.= $err;
301  if ($this->logger) {
302  Logger::error($this->last_error);
303  }
304  return $this->last_error;
305  }
306 
314  public function fetch_one($sql)
315  {
316  $q = $this->query($sql);
317  if ($q) {
318  return $this->fetch_array($q);
319  } else {
320  return array();
321  }
322  }
323 
329  public function no_error()
330  {
331  return ibase_errcode();
332  }
333 
339  public function last_insert_id($table='', $primary_key='')
340  {
341  return ibase_insert_id($this->id_connection);
342  }
343 
350  public function table_exists($table, $schema='')
351  {
352  $table = strtoupper(addslashes("$table"));
353  // NOT LIKE 'RDB\$%'
354  $num = $this->fetch_one("SELECT COUNT(*) FROM rdb\$relations WHERE rdb\$relation_name = '$table'");
355  return $num[0];
356  }
357 
364  public function limit($sql)
365  {
366  $params = Util::getParams(func_get_args());
367  $sql_new = $sql;
368 
369  if (isset($params['limit']) && is_numeric($params['limit'])) {
370  $sql_new.=" FIRST $params[limit]";
371  }
372 
373  if (isset($params['offset']) && is_numeric($params['offset'])) {
374  $sql_new.=" SKIP $params[offset]";
375  }
376 
377  return $sql_new;
378  }
379 
386  public function drop_table($table, $if_exists=true)
387  {
388  if ($if_exists) {
389  if ($this->table_exists($table)) {
390  return $this->query("DROP TABLE $table");
391  } else {
392  return true;
393  }
394  } else {
395  return $this->query("DROP TABLE $table");
396  }
397  }
398 
412  public function create_table($table, $definition, $index=array())
413  {
414  $create_sql = "CREATE TABLE $table (";
415  if (!is_array($definition)) {
416  throw new KumbiaException("Definición invalida para crear la tabla '$table'");
417  }
418  $create_lines = array();
419  $index = array();
420  $unique_index = array();
421  $primary = array();
422  //$not_null = "";
423  //$size = "";
424  foreach ($definition as $field => $field_def) {
425  if (isset($field_def['not_null'])) {
426  $not_null = $field_def['not_null'] ? 'NOT NULL' : '';
427  } else {
428  $not_null = "";
429  }
430  if (isset($field_def['size'])) {
431  $size = $field_def['size'] ? '(' . $field_def['size'] . ')' : '';
432  } else {
433  $size = "";
434  }
435  if (isset($field_def['index'])) {
436  if ($field_def['index']) {
437  $index[] = "INDEX($field)";
438  }
439  }
440  if (isset($field_def['unique_index'])) {
441  if ($field_def['unique_index']) {
442  $index[] = "UNIQUE($field)";
443  }
444  }
445  if (isset($field_def['primary'])) {
446  if ($field_def['primary']) {
447  $primary[] = "$field";
448  }
449  }
450  if (isset($field_def['auto'])) {
451  if ($field_def['auto']) {
452  $gen = $this->fetch_one("SELECT COUNT(*) FROM RDB\$GENERATORS WHERE RDB\$GENERATOR_NAME = UPPER('{$table}_{$field}_seq')");
453  if (!$gen[0]) {
454  $this->query("INSERT INTO RDB\$GENERATORS (RDB\$GENERATOR_NAME) VALUES (UPPER('{$table}_{$field}_seq'))");
455  }
456  $this->query("SET GENERATOR {$table}_{$field}_seq TO 1;");
457  }
458  }
459  if (isset($field_def['extra'])) {
460  $extra = $field_def['extra'];
461  } else {
462  $extra = "";
463  }
464  $create_lines[] = "$field " . $field_def['type'] . $size . ' ' . $not_null . ' ' . $extra;
465  }
466  $create_sql.= join(',', $create_lines);
467  $last_lines = array();
468  if (count($primary)) {
469  $last_lines[] = 'PRIMARY KEY(' . join(",", $primary) . ')';
470  }
471  if (count($index)) {
472  $last_lines[] = join(',', $index);
473  }
474  if (count($unique_index)) {
475  $last_lines[] = join(',', $unique_index);
476  }
477  if (count($last_lines)) {
478  $create_sql.= ',' . join(',', $last_lines) . ')';
479  }
480  return $this->query($create_sql);
481  }
482 
488  public function list_tables()
489  {
490  return $this->fetch_all("SHOW TABLES");
491  }
492 
499  public function describe_table($table, $schema='')
500  {
501  if ($schema == '') {
502  return $this->fetch_all("DESCRIBE $table");
503  } else {
504  return $this->fetch_all("DESCRIBE $schema.$table");
505  }
506  }
507 
513  public function last_sql_query()
514  {
515  return $this->last_query;
516  }
517 
518 }