Verzeichnisstruktur phpBB-3.0.0


Veröffentlicht
12.12.2007

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

firebird.php

Zuletzt modifiziert: 09.10.2024, 12:51 - Dateigröße: 10.92 KiB


001  <?php
002  /**
003  *
004  * @package dbal
005  * @version $Id$
006  * @copyright (c) 2005 phpBB Group
007  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
008  *
009  */
010   
011  /**
012  * @ignore
013  */
014  if (!defined('IN_PHPBB'))
015  {
016      exit;
017  }
018   
019  include_once($phpbb_root_path . 'includes/db/dbal.' . $phpEx);
020   
021  /**
022  * Firebird/Interbase Database Abstraction Layer
023  * Minimum Requirement is Firebird 2.0
024  * @package dbal
025  */
026  class dbal_firebird extends dbal
027  {
028      var $last_query_text = '';
029      var $service_handle = false;
030      var $affected_rows = 0;
031   
032      /**
033      * Connect to server
034      */
035      function sql_connect($sqlserver, $sqluser, $sqlpassword, $database, $port = false, $persistency = false, $new_link = false)
036      {
037          $this->persistency = $persistency;
038          $this->user = $sqluser;
039          $this->server = $sqlserver . (($port) ? ':' . $port : '');
040          $this->dbname = $database;
041   
042          $this->db_connect_id = ($this->persistency) ? @ibase_pconnect($this->server . ':' . $this->dbname, $this->user, $sqlpassword, false, false, 3) : @ibase_connect($this->server . ':' . $this->dbname, $this->user, $sqlpassword, false, false, 3);
043   
044          $this->service_handle = (function_exists('ibase_service_attach')) ? @ibase_service_attach($this->server, $this->user, $sqlpassword) : false;
045   
046          return ($this->db_connect_id) ? $this->db_connect_id : $this->sql_error('');
047      }
048   
049      /**
050      * Version information about used database
051      */
052      function sql_server_info()
053      {
054          if ($this->service_handle !== false && function_exists('ibase_server_info'))
055          {
056              return @ibase_server_info($this->service_handle, IBASE_SVC_SERVER_VERSION);
057          }
058   
059          return 'Firebird/Interbase';
060      }
061   
062      /**
063      * SQL Transaction
064      * @access private
065      */
066      function _sql_transaction($status = 'begin')
067      {
068          switch ($status)
069          {
070              case 'begin':
071                  return true;
072              break;
073   
074              case 'commit':
075                  return @ibase_commit();
076              break;
077   
078              case 'rollback':
079                  return @ibase_rollback();
080              break;
081          }
082   
083          return true;
084      }
085   
086      /**
087      * Base query method
088      *
089      * @param    string    $query        Contains the SQL query which shall be executed
090      * @param    int        $cache_ttl    Either 0 to avoid caching or the time in seconds which the result shall be kept in cache
091      * @return    mixed                When casted to bool the returned value returns true on success and false on failure
092      *
093      * @access    public
094      */
095      function sql_query($query = '', $cache_ttl = 0)
096      {
097          if ($query != '')
098          {
099              global $cache;
100   
101              // EXPLAIN only in extra debug mode
102              if (defined('DEBUG_EXTRA'))
103              {
104                  $this->sql_report('start', $query);
105              }
106   
107              $this->last_query_text = $query;
108              $this->query_result = ($cache_ttl && method_exists($cache, 'sql_load')) ? $cache->sql_load($query) : false;
109              $this->sql_add_num_queries($this->query_result);
110   
111              if ($this->query_result === false)
112              {
113                  $array = array();
114                  // We overcome Firebird's 32767 char limit by binding vars
115                  if (strlen($query) > 32767)
116                  {
117                      if (preg_match('/^(INSERT INTO[^(]++)\\(([^()]+)\\) VALUES[^(]++\\((.*?)\\)$/s', $query, $regs))
118                      {
119                          if (strlen($regs[3]) > 32767)
120                          {
121                              preg_match_all('/\'(?:[^\']++|\'\')*+\'|[\d-.]+/', $regs[3], $vals, PREG_PATTERN_ORDER);
122   
123                              $inserts = $vals[0];
124                              unset($vals);
125   
126                              foreach ($inserts as $key => $value)
127                              {
128                                  if (!empty($value) && $value[0] === "'" && strlen($value) > 32769) // check to see if this thing is greater than the max + 'x2
129                                  {
130                                      $inserts[$key] = '?';
131                                      $array[] = str_replace("''", "'", substr($value, 1, -1));
132                                  }
133                              }
134   
135                              $query = $regs[1] . '(' . $regs[2] . ') VALUES (' . implode(', ', $inserts) . ')';
136                          }
137                      }
138                      else if (preg_match('/^(UPDATE ([\\w_]++)\\s+SET )([\\w_]++\\s*=\\s*(?:\'(?:[^\']++|\'\')*+\'|\\d+)(?:,\\s*[\\w_]++\\s*=\\s*(?:\'(?:[^\']++|\'\')*+\'|[\d-.]+))*+)\\s+(WHERE.*)$/s', $query, $data))
139                      {
140                          if (strlen($data[3]) > 32767)
141                          {
142                              $update = $data[1];
143                              $where = $data[4];
144                              preg_match_all('/(\\w++)\\s*=\\s*(\'(?:[^\']++|\'\')*+\'|[\d-.]++)/', $data[3], $temp, PREG_SET_ORDER);
145                              unset($data);
146   
147                              $cols = array();
148                              foreach ($temp as $value)
149                              {
150                                  if (!empty($value[2]) && $value[2][0] === "'" && strlen($value[2]) > 32769) // check to see if this thing is greater than the max + 'x2
151                                  {
152                                      $array[] = str_replace("''", "'", substr($value[2], 1, -1));
153                                      $cols[] = $value[1] . '=?';
154                                  }
155                                  else
156                                  {
157                                      $cols[] = $value[1] . '=' . $value[2];
158                                  }
159                              }
160   
161                              $query = $update . implode(', ', $cols) . ' ' . $where;
162                              unset($cols);
163                          }
164                      }
165                  }
166   
167                  if (!function_exists('ibase_affected_rows') && (preg_match('/^UPDATE ([\w_]++)\s+SET [\w_]++\s*=\s*(?:\'(?:[^\']++|\'\')*+\'|[\d-.]+)(?:,\s*[\w_]++\s*=\s*(?:\'(?:[^\']++|\'\')*+\'|[\d-.]+))*+\s+(WHERE.*)?$/s', $query, $regs) || preg_match('/^DELETE FROM ([\w_]++)\s*(WHERE\s*.*)?$/s', $query, $regs)))
168                  {
169                      $affected_sql = 'SELECT COUNT(*) as num_rows_affected FROM ' . $regs[1];
170                      if (!empty($regs[2]))
171                      {
172                          $affected_sql .= ' ' . $regs[2];
173                      }
174   
175                      if (!($temp_q_id = @ibase_query($this->db_connect_id, $affected_sql)))
176                      {
177                          return false;
178                      }
179   
180                      $temp_result = @ibase_fetch_assoc($temp_q_id);
181                      @ibase_free_result($temp_q_id);
182   
183                      $this->affected_rows = ($temp_result) ? $temp_result['NUM_ROWS_AFFECTED'] : false;
184                  }
185   
186                  if (sizeof($array))
187                  {
188                      $p_query = @ibase_prepare($this->db_connect_id, $query);
189                      array_unshift($array, $p_query);
190                      $this->query_result = call_user_func_array('ibase_execute', $array);
191                      unset($array);
192   
193                      if ($this->query_result === false)
194                      {
195                          $this->sql_error($query);
196                      }
197                  }
198                  else if (($this->query_result = @ibase_query($this->db_connect_id, $query)) === false)
199                  {
200                      $this->sql_error($query);
201                  }
202   
203                  if (defined('DEBUG_EXTRA'))
204                  {
205                      $this->sql_report('stop', $query);
206                  }
207   
208                  if (!$this->transaction)
209                  {
210                      if (function_exists('ibase_commit_ret'))
211                      {
212                          @ibase_commit_ret();
213                      }
214                      else
215                      {
216                          // way cooler than ibase_commit_ret :D
217                          @ibase_query('COMMIT RETAIN;');
218                      }
219                  }
220   
221                  if ($cache_ttl && method_exists($cache, 'sql_save'))
222                  {
223                      $this->open_queries[(int) $this->query_result] = $this->query_result;
224                      $cache->sql_save($query, $this->query_result, $cache_ttl);
225                  }
226                  else if (strpos($query, 'SELECT') === 0 && $this->query_result)
227                  {
228                      $this->open_queries[(int) $this->query_result] = $this->query_result;
229                  }
230              }
231              else if (defined('DEBUG_EXTRA'))
232              {
233                  $this->sql_report('fromcache', $query);
234              }
235          }
236          else
237          {
238              return false;
239          }
240   
241          return ($this->query_result) ? $this->query_result : false;
242      }
243   
244      /**
245      * Build LIMIT query
246      */
247      function _sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0)
248      {
249          $this->query_result = false;
250   
251          $query = 'SELECT FIRST ' . $total . ((!empty($offset)) ? ' SKIP ' . $offset : '') . substr($query, 6);
252   
253          return $this->sql_query($query, $cache_ttl);
254      }
255   
256      /**
257      * Return number of affected rows
258      */
259      function sql_affectedrows()
260      {
261          // PHP 5+ function
262          if (function_exists('ibase_affected_rows'))
263          {
264              return ($this->db_connect_id) ? @ibase_affected_rows($this->db_connect_id) : false;
265          }
266          else
267          {
268              return $this->affected_rows;
269          }
270      }
271   
272      /**
273      * Fetch current row
274      */
275      function sql_fetchrow($query_id = false)
276      {
277          global $cache;
278   
279          if ($query_id === false)
280          {
281              $query_id = $this->query_result;
282          }
283   
284          if (isset($cache->sql_rowset[$query_id]))
285          {
286              return $cache->sql_fetchrow($query_id);
287          }
288   
289          if ($query_id === false)
290          {
291              return false;
292          }
293   
294          $row = array();
295          $cur_row = @ibase_fetch_object($query_id, IBASE_TEXT);
296   
297          if (!$cur_row)
298          {
299              return false;
300          }
301   
302          foreach (get_object_vars($cur_row) as $key => $value)
303          {
304              $row[strtolower($key)] = (is_string($value)) ? trim(str_replace(array("\\0", "\\n"), array("\0", "\n"), $value)) : $value;
305          }
306   
307          return (sizeof($row)) ? $row : false;
308      }
309   
310      /**
311      * Seek to given row number
312      * rownum is zero-based
313      */
314      function sql_rowseek($rownum, &$query_id)
315      {
316          global $cache;
317   
318          if ($query_id === false)
319          {
320              $query_id = $this->query_result;
321          }
322   
323          if (isset($cache->sql_rowset[$query_id]))
324          {
325              return $cache->sql_rowseek($rownum, $query_id);
326          }
327   
328          if ($query_id === false)
329          {
330              return;
331          }
332   
333          $this->sql_freeresult($query_id);
334          $query_id = $this->sql_query($this->last_query_text);
335   
336          if ($query_id === false)
337          {
338              return false;
339          }
340   
341          // We do not fetch the row for rownum == 0 because then the next resultset would be the second row
342          for ($i = 0; $i < $rownum; $i++)
343          {
344              if (!$this->sql_fetchrow($query_id))
345              {
346                  return false;
347              }
348          }
349   
350          return true;
351      }
352   
353      /**
354      * Get last inserted id after insert statement
355      */
356      function sql_nextid()
357      {
358          $query_id = $this->query_result;
359   
360          if ($query_id !== false && $this->last_query_text != '')
361          {
362              if ($this->query_result && preg_match('#^INSERT[\t\n ]+INTO[\t\n ]+([a-z0-9\_\-]+)#i', $this->last_query_text, $tablename))
363              {
364                  $sql = 'SELECT GEN_ID(' . $tablename[1] . '_gen, 0) AS new_id FROM RDB$DATABASE';
365   
366                  if (!($temp_q_id = @ibase_query($this->db_connect_id, $sql)))
367                  {
368                      return false;
369                  }
370   
371                  $temp_result = @ibase_fetch_assoc($temp_q_id);
372                  @ibase_free_result($temp_q_id);
373   
374                  return ($temp_result) ? $temp_result['NEW_ID'] : false;
375              }
376          }
377   
378          return false;
379      }
380   
381      /**
382      * Free sql result
383      */
384      function sql_freeresult($query_id = false)
385      {
386          global $cache;
387   
388          if ($query_id === false)
389          {
390              $query_id = $this->query_result;
391          }
392   
393          if (isset($cache->sql_rowset[$query_id]))
394          {
395              return $cache->sql_freeresult($query_id);
396          }
397   
398          if (isset($this->open_queries[(int) $query_id]))
399          {
400              unset($this->open_queries[(int) $query_id]);
401              return @ibase_free_result($query_id);
402          }
403   
404          return false;
405      }
406   
407      /**
408      * Escape string used in sql query
409      */
410      function sql_escape($msg)
411      {
412          return str_replace("'", "''", $msg);
413      }
414   
415      /**
416      * Build LIKE expression
417      * @access private
418      */
419      function _sql_like_expression($expression)
420      {
421          return $expression . " ESCAPE '\\'";
422      }
423   
424      /**
425      * Build db-specific query data
426      * @access private
427      */
428      function _sql_custom_build($stage, $data)
429      {
430          return $data;
431      }
432   
433      /**
434      * return sql error array
435      * @access private
436      */
437      function _sql_error()
438      {
439          return array(
440              'message'    => @ibase_errmsg(),
441              'code'        => (@function_exists('ibase_errcode') ? @ibase_errcode() : '')
442          );
443      }
444   
445      /**
446      * Close sql connection
447      * @access private
448      */
449      function _sql_close()
450      {
451          if ($this->service_handle !== false)
452          {
453              @ibase_service_detach($this->service_handle);
454          }
455   
456          return @ibase_close($this->db_connect_id);
457      }
458   
459      /**
460      * Build db-specific report
461      * @access private
462      */
463      function _sql_report($mode, $query = '')
464      {
465          switch ($mode)
466          {
467              case 'start':
468              break;
469   
470              case 'fromcache':
471                  $endtime = explode(' ', microtime());
472                  $endtime = $endtime[0] + $endtime[1];
473   
474                  $result = @ibase_query($this->db_connect_id, $query);
475                  while ($void = @ibase_fetch_object($result, IBASE_TEXT))
476                  {
477                      // Take the time spent on parsing rows into account
478                  }
479                  @ibase_free_result($result);
480   
481                  $splittime = explode(' ', microtime());
482                  $splittime = $splittime[0] + $splittime[1];
483   
484                  $this->sql_report('record_fromcache', $query, $endtime, $splittime);
485   
486              break;
487          }
488      }
489  }
490   
491  ?>