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

mssqlnative.php

Zuletzt modifiziert: 09.10.2024, 12:54 - Dateigröße: 9.48 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  /**
 015  * This is the MS SQL Server Native database abstraction layer.
 016  * PHP mssql native driver required.
 017  * @author Chris Pucci
 018  *
 019  */
 020   
 021  namespace phpbb\db\driver;
 022   
 023  class mssqlnative extends \phpbb\db\driver\mssql_base
 024  {
 025      var $m_insert_id = null;
 026      var $last_query_text = '';
 027      var $query_options = array();
 028      var $connect_error = '';
 029   
 030      /**
 031      * {@inheritDoc}
 032      */
 033      function sql_connect($sqlserver, $sqluser, $sqlpassword, $database, $port = false, $persistency = false, $new_link = false)
 034      {
 035          // Test for driver support, to avoid suppressed fatal error
 036          if (!function_exists('sqlsrv_connect'))
 037          {
 038              $this->connect_error = 'Native MS SQL Server driver for PHP is missing or needs to be updated. Version 1.1 or later is required to install phpBB3. You can download the driver from: http://www.microsoft.com/sqlserver/2005/en/us/PHP-Driver.aspx';
 039              return $this->sql_error('');
 040          }
 041   
 042          //set up connection variables
 043          $this->persistency = $persistency;
 044          $this->user = $sqluser;
 045          $this->dbname = $database;
 046          $port_delimiter = (defined('PHP_OS') && substr(PHP_OS, 0, 3) === 'WIN') ? ',' : ':';
 047          $this->server = $sqlserver . (($port) ? $port_delimiter . $port : '');
 048   
 049          //connect to database
 050          $this->db_connect_id = sqlsrv_connect($this->server, array(
 051              'Database' => $this->dbname,
 052              'UID' => $this->user,
 053              'PWD' => $sqlpassword
 054          ));
 055   
 056          return ($this->db_connect_id) ? $this->db_connect_id : $this->sql_error('');
 057      }
 058   
 059      /**
 060      * {@inheritDoc}
 061      */
 062      function sql_server_info($raw = false, $use_cache = true)
 063      {
 064          global $cache;
 065   
 066          if (!$use_cache || empty($cache) || ($this->sql_server_version = $cache->get('mssql_version')) === false)
 067          {
 068              $arr_server_info = sqlsrv_server_info($this->db_connect_id);
 069              $this->sql_server_version = $arr_server_info['SQLServerVersion'];
 070   
 071              if (!empty($cache) && $use_cache)
 072              {
 073                  $cache->put('mssql_version', $this->sql_server_version);
 074              }
 075          }
 076   
 077          if ($raw)
 078          {
 079              return $this->sql_server_version;
 080          }
 081   
 082          return ($this->sql_server_version) ? 'MSSQL<br />' . $this->sql_server_version : 'MSSQL';
 083      }
 084   
 085      /**
 086      * {@inheritDoc}
 087      */
 088      function sql_buffer_nested_transactions()
 089      {
 090          return true;
 091      }
 092   
 093      /**
 094      * SQL Transaction
 095      * @access private
 096      */
 097      function _sql_transaction($status = 'begin')
 098      {
 099          switch ($status)
 100          {
 101              case 'begin':
 102                  return sqlsrv_begin_transaction($this->db_connect_id);
 103              break;
 104   
 105              case 'commit':
 106                  return sqlsrv_commit($this->db_connect_id);
 107              break;
 108   
 109              case 'rollback':
 110                  return sqlsrv_rollback($this->db_connect_id);
 111              break;
 112          }
 113          return true;
 114      }
 115   
 116      /**
 117      * {@inheritDoc}
 118      */
 119      function sql_query($query = '', $cache_ttl = 0)
 120      {
 121          if ($query != '')
 122          {
 123              global $cache;
 124   
 125              // EXPLAIN only in extra debug mode
 126              if (defined('DEBUG'))
 127              {
 128                  $this->sql_report('start', $query);
 129              }
 130              else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
 131              {
 132                  $this->curtime = microtime(true);
 133              }
 134   
 135              $this->last_query_text = $query;
 136              $this->query_result = ($cache && $cache_ttl) ? $cache->sql_load($query) : false;
 137              $this->sql_add_num_queries($this->query_result);
 138   
 139              if ($this->query_result === false)
 140              {
 141                  if (($this->query_result = @sqlsrv_query($this->db_connect_id, $query, array(), $this->query_options)) === false)
 142                  {
 143                      $this->sql_error($query);
 144                  }
 145                  // reset options for next query
 146                  $this->query_options = array();
 147   
 148                  if (defined('DEBUG'))
 149                  {
 150                      $this->sql_report('stop', $query);
 151                  }
 152                  else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
 153                  {
 154                      $this->sql_time += microtime(true) - $this->curtime;
 155                  }
 156   
 157                  if (!$this->query_result)
 158                  {
 159                      return false;
 160                  }
 161   
 162                  if ($cache && $cache_ttl)
 163                  {
 164                      $this->open_queries[(int) $this->query_result] = $this->query_result;
 165                      $this->query_result = $cache->sql_save($this, $query, $this->query_result, $cache_ttl);
 166                  }
 167                  else if (strpos($query, 'SELECT') === 0)
 168                  {
 169                      $this->open_queries[(int) $this->query_result] = $this->query_result;
 170                  }
 171              }
 172              else if (defined('DEBUG'))
 173              {
 174                  $this->sql_report('fromcache', $query);
 175              }
 176          }
 177          else
 178          {
 179              return false;
 180          }
 181          return $this->query_result;
 182      }
 183   
 184      /**
 185      * Build LIMIT query
 186      */
 187      function _sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0)
 188      {
 189          $this->query_result = false;
 190   
 191          // total == 0 means all results - not zero results
 192          if ($offset == 0 && $total !== 0)
 193          {
 194              if (strpos($query, "SELECT") === false)
 195              {
 196                  $query = "TOP {$total} " . $query;
 197              }
 198              else
 199              {
 200                  $query = preg_replace('/SELECT(\s*DISTINCT)?/Dsi', 'SELECT$1 TOP '.$total, $query);
 201              }
 202          }
 203          else if ($offset > 0)
 204          {
 205              $query = preg_replace('/SELECT(\s*DISTINCT)?/Dsi', 'SELECT$1 TOP(10000000) ', $query);
 206              $query = 'SELECT *
 207                      FROM (SELECT sub2.*, ROW_NUMBER() OVER(ORDER BY sub2.line2) AS line3
 208                      FROM (SELECT 1 AS line2, sub1.* FROM (' . $query . ') AS sub1) as sub2) AS sub3';
 209   
 210              if ($total > 0)
 211              {
 212                  $query .= ' WHERE line3 BETWEEN ' . ($offset+1) . ' AND ' . ($offset + $total);
 213              }
 214              else
 215              {
 216                  $query .= ' WHERE line3 > ' . $offset;
 217              }
 218          }
 219   
 220          $result = $this->sql_query($query, $cache_ttl);
 221   
 222          return $result;
 223      }
 224   
 225      /**
 226      * {@inheritDoc}
 227      */
 228      function sql_affectedrows()
 229      {
 230          return ($this->db_connect_id) ? @sqlsrv_rows_affected($this->query_result) : false;
 231      }
 232   
 233      /**
 234      * {@inheritDoc}
 235      */
 236      function sql_fetchrow($query_id = false)
 237      {
 238          global $cache;
 239   
 240          if ($query_id === false)
 241          {
 242              $query_id = $this->query_result;
 243          }
 244   
 245          if ($cache && $cache->sql_exists($query_id))
 246          {
 247              return $cache->sql_fetchrow($query_id);
 248          }
 249   
 250          if (!$query_id)
 251          {
 252              return false;
 253          }
 254   
 255          $row = sqlsrv_fetch_array($query_id, SQLSRV_FETCH_ASSOC);
 256   
 257          if ($row)
 258          {
 259              foreach ($row as $key => $value)
 260              {
 261                  $row[$key] = ($value === ' ' || $value === null) ? '' : $value;
 262              }
 263   
 264              // remove helper values from LIMIT queries
 265              if (isset($row['line2']))
 266              {
 267                  unset($row['line2'], $row['line3']);
 268              }
 269          }
 270          return (sizeof($row)) ? $row : false;
 271      }
 272   
 273      /**
 274      * {@inheritDoc}
 275      */
 276      function sql_nextid()
 277      {
 278          $result_id = @sqlsrv_query($this->db_connect_id, 'SELECT @@IDENTITY');
 279   
 280          if ($result_id)
 281          {
 282              $row = sqlsrv_fetch_array($result_id);
 283              $id = $row[0];
 284              sqlsrv_free_stmt($result_id);
 285              return $id;
 286          }
 287          else
 288          {
 289              return false;
 290          }
 291      }
 292   
 293      /**
 294      * {@inheritDoc}
 295      */
 296      function sql_freeresult($query_id = false)
 297      {
 298          global $cache;
 299   
 300          if ($query_id === false)
 301          {
 302              $query_id = $this->query_result;
 303          }
 304   
 305          if ($cache && !is_object($query_id) && $cache->sql_exists($query_id))
 306          {
 307              return $cache->sql_freeresult($query_id);
 308          }
 309   
 310          if (isset($this->open_queries[(int) $query_id]))
 311          {
 312              unset($this->open_queries[(int) $query_id]);
 313              return sqlsrv_free_stmt($query_id);
 314          }
 315   
 316          return false;
 317      }
 318   
 319      /**
 320      * return sql error array
 321      * @access private
 322      */
 323      function _sql_error()
 324      {
 325          if (function_exists('sqlsrv_errors'))
 326          {
 327              $errors = @sqlsrv_errors(SQLSRV_ERR_ERRORS);
 328              $error_message = '';
 329              $code = 0;
 330   
 331              if ($errors != null)
 332              {
 333                  foreach ($errors as $error)
 334                  {
 335                      $error_message .= "SQLSTATE: " . $error['SQLSTATE'] . "\n";
 336                      $error_message .= "code: " . $error['code'] . "\n";
 337                      $code = $error['code'];
 338                      $error_message .= "message: " . $error['message'] . "\n";
 339                  }
 340                  $this->last_error_result = $error_message;
 341                  $error = $this->last_error_result;
 342              }
 343              else
 344              {
 345                  $error = (isset($this->last_error_result) && $this->last_error_result) ? $this->last_error_result : array();
 346              }
 347   
 348              $error = array(
 349                  'message'    => $error,
 350                  'code'        => $code,
 351              );
 352          }
 353          else
 354          {
 355              $error = array(
 356                  'message'    => $this->connect_error,
 357                  'code'        => '',
 358              );
 359          }
 360   
 361          return $error;
 362      }
 363   
 364      /**
 365      * Close sql connection
 366      * @access private
 367      */
 368      function _sql_close()
 369      {
 370          return @sqlsrv_close($this->db_connect_id);
 371      }
 372   
 373      /**
 374      * Build db-specific report
 375      * @access private
 376      */
 377      function _sql_report($mode, $query = '')
 378      {
 379          switch ($mode)
 380          {
 381              case 'start':
 382                  $html_table = false;
 383                  @sqlsrv_query($this->db_connect_id, 'SET SHOWPLAN_TEXT ON;');
 384                  if ($result = @sqlsrv_query($this->db_connect_id, $query))
 385                  {
 386                      sqlsrv_next_result($result);
 387                      while ($row = sqlsrv_fetch_array($result))
 388                      {
 389                          $html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
 390                      }
 391                      sqlsrv_free_stmt($result);
 392                  }
 393                  @sqlsrv_query($this->db_connect_id, 'SET SHOWPLAN_TEXT OFF;');
 394   
 395                  if ($html_table)
 396                  {
 397                      $this->html_hold .= '</table>';
 398                  }
 399              break;
 400   
 401              case 'fromcache':
 402                  $endtime = explode(' ', microtime());
 403                  $endtime = $endtime[0] + $endtime[1];
 404   
 405                  $result = @sqlsrv_query($this->db_connect_id, $query);
 406                  if ($result)
 407                  {
 408                      while ($void = sqlsrv_fetch_array($result))
 409                      {
 410                          // Take the time spent on parsing rows into account
 411                      }
 412                      sqlsrv_free_stmt($result);
 413                  }
 414   
 415                  $splittime = explode(' ', microtime());
 416                  $splittime = $splittime[0] + $splittime[1];
 417   
 418                  $this->sql_report('record_fromcache', $query, $endtime, $splittime);
 419   
 420              break;
 421          }
 422      }
 423   
 424      /**
 425      * Utility method used to retrieve number of rows
 426      * Emulates mysql_num_rows
 427      * Used in acp_database.php -> write_data_mssqlnative()
 428      * Requires a static or keyset cursor to be definde via
 429      * mssqlnative_set_query_options()
 430      */
 431      function mssqlnative_num_rows($res)
 432      {
 433          if ($res !== false)
 434          {
 435              return sqlsrv_num_rows($res);
 436          }
 437          else
 438          {
 439              return false;
 440          }
 441      }
 442   
 443      /**
 444      * Allows setting mssqlnative specific query options passed to sqlsrv_query as 4th parameter.
 445      */
 446      function mssqlnative_set_query_options($options)
 447      {
 448          $this->query_options = $options;
 449      }
 450  }
 451