Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

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.99 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              if ($query_id)
 127              {
 128                  $row = pg_fetch_assoc($query_id, null);
 129                  pg_free_result($query_id);
 130   
 131                  $this->sql_server_version = (!empty($row['version'])) ? trim(substr($row['version'], 10)) : 0;
 132   
 133                  if (!empty($cache) && $use_cache)
 134                  {
 135                      $cache->put('pgsql_version', $this->sql_server_version);
 136                  }
 137              }
 138          }
 139   
 140          return ($raw) ? $this->sql_server_version : 'PostgreSQL ' . $this->sql_server_version;
 141      }
 142   
 143      /**
 144      * SQL Transaction
 145      * @access private
 146      */
 147      function _sql_transaction($status = 'begin')
 148      {
 149          switch ($status)
 150          {
 151              case 'begin':
 152                  return @pg_query($this->db_connect_id, 'BEGIN');
 153              break;
 154   
 155              case 'commit':
 156                  return @pg_query($this->db_connect_id, 'COMMIT');
 157              break;
 158   
 159              case 'rollback':
 160                  return @pg_query($this->db_connect_id, 'ROLLBACK');
 161              break;
 162          }
 163   
 164          return true;
 165      }
 166   
 167      /**
 168      * {@inheritDoc}
 169      */
 170      function sql_query($query = '', $cache_ttl = 0)
 171      {
 172          if ($query != '')
 173          {
 174              global $cache;
 175   
 176              // EXPLAIN only in extra debug mode
 177              if (defined('DEBUG'))
 178              {
 179                  $this->sql_report('start', $query);
 180              }
 181              else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
 182              {
 183                  $this->curtime = microtime(true);
 184              }
 185   
 186              $this->last_query_text = $query;
 187              $this->query_result = ($cache && $cache_ttl) ? $cache->sql_load($query) : false;
 188              $this->sql_add_num_queries($this->query_result);
 189   
 190              if ($this->query_result === false)
 191              {
 192                  if (($this->query_result = @pg_query($this->db_connect_id, $query)) === false)
 193                  {
 194                      $this->sql_error($query);
 195                  }
 196   
 197                  if (defined('DEBUG'))
 198                  {
 199                      $this->sql_report('stop', $query);
 200                  }
 201                  else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
 202                  {
 203                      $this->sql_time += microtime(true) - $this->curtime;
 204                  }
 205   
 206                  if (!$this->query_result)
 207                  {
 208                      return false;
 209                  }
 210   
 211                  if ($cache && $cache_ttl)
 212                  {
 213                      $this->open_queries[(int) $this->query_result] = $this->query_result;
 214                      $this->query_result = $cache->sql_save($this, $query, $this->query_result, $cache_ttl);
 215                  }
 216                  else if (strpos($query, 'SELECT') === 0)
 217                  {
 218                      $this->open_queries[(int) $this->query_result] = $this->query_result;
 219                  }
 220              }
 221              else if (defined('DEBUG'))
 222              {
 223                  $this->sql_report('fromcache', $query);
 224              }
 225          }
 226          else
 227          {
 228              return false;
 229          }
 230   
 231          return $this->query_result;
 232      }
 233   
 234      /**
 235      * Build db-specific query data
 236      * @access private
 237      */
 238      function _sql_custom_build($stage, $data)
 239      {
 240          return $data;
 241      }
 242   
 243      /**
 244      * Build LIMIT query
 245      */
 246      function _sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0)
 247      {
 248          $this->query_result = false;
 249   
 250          // if $total is set to 0 we do not want to limit the number of rows
 251          if ($total == 0)
 252          {
 253              $total = 'ALL';
 254          }
 255   
 256          $query .= "\n LIMIT $total OFFSET $offset";
 257   
 258          return $this->sql_query($query, $cache_ttl);
 259      }
 260   
 261      /**
 262      * {@inheritDoc}
 263      */
 264      function sql_affectedrows()
 265      {
 266          return ($this->query_result) ? @pg_affected_rows($this->query_result) : false;
 267      }
 268   
 269      /**
 270      * {@inheritDoc}
 271      */
 272      function sql_fetchrow($query_id = false)
 273      {
 274          global $cache;
 275   
 276          if ($query_id === false)
 277          {
 278              $query_id = $this->query_result;
 279          }
 280   
 281          if ($cache && $cache->sql_exists($query_id))
 282          {
 283              return $cache->sql_fetchrow($query_id);
 284          }
 285   
 286          return ($query_id) ? pg_fetch_assoc($query_id, null) : false;
 287      }
 288   
 289      /**
 290      * {@inheritDoc}
 291      */
 292      function sql_rowseek($rownum, &$query_id)
 293      {
 294          global $cache;
 295   
 296          if ($query_id === false)
 297          {
 298              $query_id = $this->query_result;
 299          }
 300   
 301          if ($cache && $cache->sql_exists($query_id))
 302          {
 303              return $cache->sql_rowseek($rownum, $query_id);
 304          }
 305   
 306          return ($query_id) ? @pg_result_seek($query_id, $rownum) : false;
 307      }
 308   
 309      /**
 310      * {@inheritDoc}
 311      */
 312      function sql_nextid()
 313      {
 314          $query_id = $this->query_result;
 315   
 316          if ($query_id !== false && $this->last_query_text != '')
 317          {
 318              if (preg_match("/^INSERT[\t\n ]+INTO[\t\n ]+([a-z0-9\_\-]+)/is", $this->last_query_text, $tablename))
 319              {
 320                  $query = "SELECT currval('" . $tablename[1] . "_seq') AS last_value";
 321                  $temp_q_id = @pg_query($this->db_connect_id, $query);
 322   
 323                  if (!$temp_q_id)
 324                  {
 325                      return false;
 326                  }
 327   
 328                  $temp_result = pg_fetch_assoc($temp_q_id, null);
 329                  pg_free_result($query_id);
 330   
 331                  return ($temp_result) ? $temp_result['last_value'] : false;
 332              }
 333          }
 334   
 335          return false;
 336      }
 337   
 338      /**
 339      * {@inheritDoc}
 340      */
 341      function sql_freeresult($query_id = false)
 342      {
 343          global $cache;
 344   
 345          if ($query_id === false)
 346          {
 347              $query_id = $this->query_result;
 348          }
 349   
 350          if ($cache && !is_object($query_id) && $cache->sql_exists($query_id))
 351          {
 352              return $cache->sql_freeresult($query_id);
 353          }
 354   
 355          if (isset($this->open_queries[(int) $query_id]))
 356          {
 357              unset($this->open_queries[(int) $query_id]);
 358              return pg_free_result($query_id);
 359          }
 360   
 361          return false;
 362      }
 363   
 364      /**
 365      * {@inheritDoc}
 366      */
 367      function sql_escape($msg)
 368      {
 369          return @pg_escape_string($msg);
 370      }
 371   
 372      /**
 373      * Build LIKE expression
 374      * @access private
 375      */
 376      function _sql_like_expression($expression)
 377      {
 378          return $expression;
 379      }
 380   
 381      /**
 382      * Build NOT LIKE expression
 383      * @access private
 384      */
 385      function _sql_not_like_expression($expression)
 386      {
 387          return $expression;
 388      }
 389   
 390      /**
 391      * {@inheritDoc}
 392      */
 393      function cast_expr_to_bigint($expression)
 394      {
 395          return 'CAST(' . $expression . ' as DECIMAL(255, 0))';
 396      }
 397   
 398      /**
 399      * {@inheritDoc}
 400      */
 401      function cast_expr_to_string($expression)
 402      {
 403          return 'CAST(' . $expression . ' as VARCHAR(255))';
 404      }
 405   
 406      /**
 407      * return sql error array
 408      * @access private
 409      */
 410      function _sql_error()
 411      {
 412          // pg_last_error only works when there is an established connection.
 413          // Connection errors have to be tracked by us manually.
 414          if ($this->db_connect_id)
 415          {
 416              $message = @pg_last_error($this->db_connect_id);
 417          }
 418          else
 419          {
 420              $message = $this->connect_error;
 421          }
 422   
 423          return array(
 424              'message'    => $message,
 425              'code'        => ''
 426          );
 427      }
 428   
 429      /**
 430      * Close sql connection
 431      * @access private
 432      */
 433      function _sql_close()
 434      {
 435          return @pg_close($this->db_connect_id);
 436      }
 437   
 438      /**
 439      * Build db-specific report
 440      * @access private
 441      */
 442      function _sql_report($mode, $query = '')
 443      {
 444          switch ($mode)
 445          {
 446              case 'start':
 447   
 448                  $explain_query = $query;
 449                  if (preg_match('/UPDATE ([a-z0-9_]+).*?WHERE(.*)/s', $query, $m))
 450                  {
 451                      $explain_query = 'SELECT * FROM ' . $m[1] . ' WHERE ' . $m[2];
 452                  }
 453                  else if (preg_match('/DELETE FROM ([a-z0-9_]+).*?WHERE(.*)/s', $query, $m))
 454                  {
 455                      $explain_query = 'SELECT * FROM ' . $m[1] . ' WHERE ' . $m[2];
 456                  }
 457   
 458                  if (preg_match('/^SELECT/', $explain_query))
 459                  {
 460                      $html_table = false;
 461   
 462                      if ($result = @pg_query($this->db_connect_id, "EXPLAIN $explain_query"))
 463                      {
 464                          while ($row = pg_fetch_assoc($result, null))
 465                          {
 466                              $html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
 467                          }
 468                          pg_free_result($result);
 469                      }
 470   
 471                      if ($html_table)
 472                      {
 473                          $this->html_hold .= '</table>';
 474                      }
 475                  }
 476   
 477              break;
 478   
 479              case 'fromcache':
 480                  $endtime = explode(' ', microtime());
 481                  $endtime = $endtime[0] + $endtime[1];
 482   
 483                  $result = @pg_query($this->db_connect_id, $query);
 484                  if ($result)
 485                  {
 486                      while ($void = pg_fetch_assoc($result, null))
 487                      {
 488                          // Take the time spent on parsing rows into account
 489                      }
 490                      pg_free_result($result);
 491                  }
 492   
 493                  $splittime = explode(' ', microtime());
 494                  $splittime = $splittime[0] + $splittime[1];
 495   
 496                  $this->sql_report('record_fromcache', $query, $endtime, $splittime);
 497   
 498              break;
 499          }
 500      }
 501  }
 502