Verzeichnisstruktur phpBB-3.1.0


Veröffentlicht
27.10.2014

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

postgres.php

Zuletzt modifiziert: 09.10.2024, 12:54 - Dateigröße: 9.92 KiB


001  <?php
002  /**
003  *
004  * This file is part of the phpBB Forum Software package.
005  *
006  * @copyright (c) phpBB Limited <https://www.phpbb.com>
007  * @license GNU General Public License, version 2 (GPL-2.0)
008  *
009  * For full copyright and license information, please see
010  * the docs/CREDITS.txt file.
011  *
012  */
013   
014  namespace phpbb\db\driver;
015   
016  /**
017  * PostgreSQL Database Abstraction Layer
018  * Minimum Requirement is Version 8.3+
019  */
020  class postgres extends \phpbb\db\driver\driver
021  {
022      var $multi_insert = true;
023      var $last_query_text = '';
024      var $connect_error = '';
025   
026      /**
027      * {@inheritDoc}
028      */
029      function sql_connect($sqlserver, $sqluser, $sqlpassword, $database, $port = false, $persistency = false, $new_link = false)
030      {
031          $connect_string = '';
032   
033          if ($sqluser)
034          {
035              $connect_string .= "user=$sqluser ";
036          }
037   
038          if ($sqlpassword)
039          {
040              $connect_string .= "password=$sqlpassword ";
041          }
042   
043          if ($sqlserver)
044          {
045              // $sqlserver can carry a port separated by : for compatibility reasons
046              // If $sqlserver has more than one : it's probably an IPv6 address.
047              // In this case we only allow passing a port via the $port variable.
048              if (substr_count($sqlserver, ':') === 1)
049              {
050                  list($sqlserver, $port) = explode(':', $sqlserver);
051              }
052   
053              if ($sqlserver !== 'localhost')
054              {
055                  $connect_string .= "host=$sqlserver ";
056              }
057   
058              if ($port)
059              {
060                  $connect_string .= "port=$port ";
061              }
062          }
063   
064          $schema = '';
065   
066          if ($database)
067          {
068              $this->dbname = $database;
069              if (strpos($database, '.') !== false)
070              {
071                  list($database, $schema) = explode('.', $database);
072              }
073              $connect_string .= "dbname=$database";
074          }
075   
076          $this->persistency = $persistency;
077   
078          if ($this->persistency)
079          {
080              if (!function_exists('pg_pconnect'))
081              {
082                  $this->connect_error = 'pg_pconnect function does not exist, is pgsql extension installed?';
083                  return $this->sql_error('');
084              }
085              $collector = new \phpbb\error_collector;
086              $collector->install();
087              $this->db_connect_id = (!$new_link) ? @pg_pconnect($connect_string) : @pg_pconnect($connect_string, PGSQL_CONNECT_FORCE_NEW);
088          }
089          else
090          {
091              if (!function_exists('pg_connect'))
092              {
093                  $this->connect_error = 'pg_connect function does not exist, is pgsql extension installed?';
094                  return $this->sql_error('');
095              }
096              $collector = new \phpbb\error_collector;
097              $collector->install();
098              $this->db_connect_id = (!$new_link) ? @pg_connect($connect_string) : @pg_connect($connect_string, PGSQL_CONNECT_FORCE_NEW);
099          }
100   
101          $collector->uninstall();
102   
103          if ($this->db_connect_id)
104          {
105              if ($schema !== '')
106              {
107                  @pg_query($this->db_connect_id, 'SET search_path TO ' . $schema);
108              }
109              return $this->db_connect_id;
110          }
111   
112          $this->connect_error = $collector->format_errors();
113          return $this->sql_error('');
114      }
115   
116      /**
117      * {@inheritDoc}
118      */
119      function sql_server_info($raw = false, $use_cache = true)
120      {
121          global $cache;
122   
123          if (!$use_cache || empty($cache) || ($this->sql_server_version = $cache->get('pgsql_version')) === false)
124          {
125              $query_id = @pg_query($this->db_connect_id, 'SELECT VERSION() AS version');
126              $row = @pg_fetch_assoc($query_id, null);
127              @pg_free_result($query_id);
128   
129              $this->sql_server_version = (!empty($row['version'])) ? trim(substr($row['version'], 10)) : 0;
130   
131              if (!empty($cache) && $use_cache)
132              {
133                  $cache->put('pgsql_version', $this->sql_server_version);
134              }
135          }
136   
137          return ($raw) ? $this->sql_server_version : 'PostgreSQL ' . $this->sql_server_version;
138      }
139   
140      /**
141      * SQL Transaction
142      * @access private
143      */
144      function _sql_transaction($status = 'begin')
145      {
146          switch ($status)
147          {
148              case 'begin':
149                  return @pg_query($this->db_connect_id, 'BEGIN');
150              break;
151   
152              case 'commit':
153                  return @pg_query($this->db_connect_id, 'COMMIT');
154              break;
155   
156              case 'rollback':
157                  return @pg_query($this->db_connect_id, 'ROLLBACK');
158              break;
159          }
160   
161          return true;
162      }
163   
164      /**
165      * {@inheritDoc}
166      */
167      function sql_query($query = '', $cache_ttl = 0)
168      {
169          if ($query != '')
170          {
171              global $cache;
172   
173              // EXPLAIN only in extra debug mode
174              if (defined('DEBUG'))
175              {
176                  $this->sql_report('start', $query);
177              }
178              else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
179              {
180                  $this->curtime = microtime(true);
181              }
182   
183              $this->last_query_text = $query;
184              $this->query_result = ($cache && $cache_ttl) ? $cache->sql_load($query) : false;
185              $this->sql_add_num_queries($this->query_result);
186   
187              if ($this->query_result === false)
188              {
189                  if (($this->query_result = @pg_query($this->db_connect_id, $query)) === false)
190                  {
191                      $this->sql_error($query);
192                  }
193   
194                  if (defined('DEBUG'))
195                  {
196                      $this->sql_report('stop', $query);
197                  }
198                  else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
199                  {
200                      $this->sql_time += microtime(true) - $this->curtime;
201                  }
202   
203                  if ($cache && $cache_ttl)
204                  {
205                      $this->open_queries[(int) $this->query_result] = $this->query_result;
206                      $this->query_result = $cache->sql_save($this, $query, $this->query_result, $cache_ttl);
207                  }
208                  else if (strpos($query, 'SELECT') === 0 && $this->query_result)
209                  {
210                      $this->open_queries[(int) $this->query_result] = $this->query_result;
211                  }
212              }
213              else if (defined('DEBUG'))
214              {
215                  $this->sql_report('fromcache', $query);
216              }
217          }
218          else
219          {
220              return false;
221          }
222   
223          return $this->query_result;
224      }
225   
226      /**
227      * Build db-specific query data
228      * @access private
229      */
230      function _sql_custom_build($stage, $data)
231      {
232          return $data;
233      }
234   
235      /**
236      * Build LIMIT query
237      */
238      function _sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0)
239      {
240          $this->query_result = false;
241   
242          // if $total is set to 0 we do not want to limit the number of rows
243          if ($total == 0)
244          {
245              $total = 'ALL';
246          }
247   
248          $query .= "\n LIMIT $total OFFSET $offset";
249   
250          return $this->sql_query($query, $cache_ttl);
251      }
252   
253      /**
254      * {@inheritDoc}
255      */
256      function sql_affectedrows()
257      {
258          return ($this->query_result) ? @pg_affected_rows($this->query_result) : false;
259      }
260   
261      /**
262      * {@inheritDoc}
263      */
264      function sql_fetchrow($query_id = false)
265      {
266          global $cache;
267   
268          if ($query_id === false)
269          {
270              $query_id = $this->query_result;
271          }
272   
273          if ($cache && $cache->sql_exists($query_id))
274          {
275              return $cache->sql_fetchrow($query_id);
276          }
277   
278          return ($query_id !== false) ? @pg_fetch_assoc($query_id, null) : false;
279      }
280   
281      /**
282      * {@inheritDoc}
283      */
284      function sql_rowseek($rownum, &$query_id)
285      {
286          global $cache;
287   
288          if ($query_id === false)
289          {
290              $query_id = $this->query_result;
291          }
292   
293          if ($cache && $cache->sql_exists($query_id))
294          {
295              return $cache->sql_rowseek($rownum, $query_id);
296          }
297   
298          return ($query_id !== false) ? @pg_result_seek($query_id, $rownum) : false;
299      }
300   
301      /**
302      * {@inheritDoc}
303      */
304      function sql_nextid()
305      {
306          $query_id = $this->query_result;
307   
308          if ($query_id !== false && $this->last_query_text != '')
309          {
310              if (preg_match("/^INSERT[\t\n ]+INTO[\t\n ]+([a-z0-9\_\-]+)/is", $this->last_query_text, $tablename))
311              {
312                  $query = "SELECT currval('" . $tablename[1] . "_seq') AS last_value";
313                  $temp_q_id = @pg_query($this->db_connect_id, $query);
314   
315                  if (!$temp_q_id)
316                  {
317                      return false;
318                  }
319   
320                  $temp_result = @pg_fetch_assoc($temp_q_id, null);
321                  @pg_free_result($query_id);
322   
323                  return ($temp_result) ? $temp_result['last_value'] : false;
324              }
325          }
326   
327          return false;
328      }
329   
330      /**
331      * {@inheritDoc}
332      */
333      function sql_freeresult($query_id = false)
334      {
335          global $cache;
336   
337          if ($query_id === false)
338          {
339              $query_id = $this->query_result;
340          }
341   
342          if ($cache && !is_object($query_id) && $cache->sql_exists($query_id))
343          {
344              return $cache->sql_freeresult($query_id);
345          }
346   
347          if (isset($this->open_queries[(int) $query_id]))
348          {
349              unset($this->open_queries[(int) $query_id]);
350              return @pg_free_result($query_id);
351          }
352   
353          return false;
354      }
355   
356      /**
357      * {@inheritDoc}
358      */
359      function sql_escape($msg)
360      {
361          return @pg_escape_string($msg);
362      }
363   
364      /**
365      * Build LIKE expression
366      * @access private
367      */
368      function _sql_like_expression($expression)
369      {
370          return $expression;
371      }
372   
373      /**
374      * Build NOT LIKE expression
375      * @access private
376      */
377      function _sql_not_like_expression($expression)
378      {
379          return $expression;
380      }
381   
382      /**
383      * {@inheritDoc}
384      */
385      function cast_expr_to_bigint($expression)
386      {
387          return 'CAST(' . $expression . ' as DECIMAL(255, 0))';
388      }
389   
390      /**
391      * {@inheritDoc}
392      */
393      function cast_expr_to_string($expression)
394      {
395          return 'CAST(' . $expression . ' as VARCHAR(255))';
396      }
397   
398      /**
399      * return sql error array
400      * @access private
401      */
402      function _sql_error()
403      {
404          // pg_last_error only works when there is an established connection.
405          // Connection errors have to be tracked by us manually.
406          if ($this->db_connect_id)
407          {
408              $message = @pg_last_error($this->db_connect_id);
409          }
410          else
411          {
412              $message = $this->connect_error;
413          }
414   
415          return array(
416              'message'    => $message,
417              'code'        => ''
418          );
419      }
420   
421      /**
422      * Close sql connection
423      * @access private
424      */
425      function _sql_close()
426      {
427          return @pg_close($this->db_connect_id);
428      }
429   
430      /**
431      * Build db-specific report
432      * @access private
433      */
434      function _sql_report($mode, $query = '')
435      {
436          switch ($mode)
437          {
438              case 'start':
439   
440                  $explain_query = $query;
441                  if (preg_match('/UPDATE ([a-z0-9_]+).*?WHERE(.*)/s', $query, $m))
442                  {
443                      $explain_query = 'SELECT * FROM ' . $m[1] . ' WHERE ' . $m[2];
444                  }
445                  else if (preg_match('/DELETE FROM ([a-z0-9_]+).*?WHERE(.*)/s', $query, $m))
446                  {
447                      $explain_query = 'SELECT * FROM ' . $m[1] . ' WHERE ' . $m[2];
448                  }
449   
450                  if (preg_match('/^SELECT/', $explain_query))
451                  {
452                      $html_table = false;
453   
454                      if ($result = @pg_query($this->db_connect_id, "EXPLAIN $explain_query"))
455                      {
456                          while ($row = @pg_fetch_assoc($result, null))
457                          {
458                              $html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
459                          }
460                      }
461                      @pg_free_result($result);
462   
463                      if ($html_table)
464                      {
465                          $this->html_hold .= '</table>';
466                      }
467                  }
468   
469              break;
470   
471              case 'fromcache':
472                  $endtime = explode(' ', microtime());
473                  $endtime = $endtime[0] + $endtime[1];
474   
475                  $result = @pg_query($this->db_connect_id, $query);
476                  while ($void = @pg_fetch_assoc($result, null))
477                  {
478                      // Take the time spent on parsing rows into account
479                  }
480                  @pg_free_result($result);
481   
482                  $splittime = explode(' ', microtime());
483                  $splittime = $splittime[0] + $splittime[1];
484   
485                  $this->sql_report('record_fromcache', $query, $endtime, $splittime);
486   
487              break;
488          }
489      }
490  }
491