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

mssql_odbc.php

Zuletzt modifiziert: 09.10.2024, 12:54 - Dateigröße: 8.12 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  * Unified ODBC functions
 018  * Unified ODBC functions support any database having ODBC driver, for example Adabas D, IBM DB2, iODBC, Solid, Sybase SQL Anywhere...
 019  * Here we only support MSSQL Server 2000+ because of the provided schema
 020  *
 021  * @note number of bytes returned for returning data depends on odbc.defaultlrl php.ini setting.
 022  * If it is limited to 4K for example only 4K of data is returned max, resulting in incomplete theme data for example.
 023  * @note odbc.defaultbinmode may affect UTF8 characters
 024  */
 025  class mssql_odbc extends \phpbb\db\driver\mssql_base
 026  {
 027      var $last_query_text = '';
 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          $this->persistency = $persistency;
 036          $this->user = $sqluser;
 037          $this->dbname = $database;
 038   
 039          $port_delimiter = (defined('PHP_OS') && substr(PHP_OS, 0, 3) === 'WIN') ? ',' : ':';
 040          $this->server = $sqlserver . (($port) ? $port_delimiter . $port : '');
 041   
 042          $max_size = @ini_get('odbc.defaultlrl');
 043          if (!empty($max_size))
 044          {
 045              $unit = strtolower(substr($max_size, -1, 1));
 046              $max_size = (int) $max_size;
 047   
 048              if ($unit == 'k')
 049              {
 050                  $max_size = floor($max_size / 1024);
 051              }
 052              else if ($unit == 'g')
 053              {
 054                  $max_size *= 1024;
 055              }
 056              else if (is_numeric($unit))
 057              {
 058                  $max_size = floor((int) ($max_size . $unit) / 1048576);
 059              }
 060              $max_size = max(8, $max_size) . 'M';
 061   
 062              @ini_set('odbc.defaultlrl', $max_size);
 063          }
 064   
 065          if ($this->persistency)
 066          {
 067              if (!function_exists('odbc_pconnect'))
 068              {
 069                  $this->connect_error = 'odbc_pconnect function does not exist, is odbc extension installed?';
 070                  return $this->sql_error('');
 071              }
 072              $this->db_connect_id = @odbc_pconnect($this->server, $this->user, $sqlpassword);
 073          }
 074          else
 075          {
 076              if (!function_exists('odbc_connect'))
 077              {
 078                  $this->connect_error = 'odbc_connect function does not exist, is odbc extension installed?';
 079                  return $this->sql_error('');
 080              }
 081              $this->db_connect_id = @odbc_connect($this->server, $this->user, $sqlpassword);
 082          }
 083   
 084          return ($this->db_connect_id) ? $this->db_connect_id : $this->sql_error('');
 085      }
 086   
 087      /**
 088      * {@inheritDoc}
 089      */
 090      function sql_server_info($raw = false, $use_cache = true)
 091      {
 092          global $cache;
 093   
 094          if (!$use_cache || empty($cache) || ($this->sql_server_version = $cache->get('mssqlodbc_version')) === false)
 095          {
 096              $result_id = @odbc_exec($this->db_connect_id, "SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY('productlevel'), SERVERPROPERTY('edition')");
 097   
 098              $row = false;
 099              if ($result_id)
 100              {
 101                  $row = @odbc_fetch_array($result_id);
 102                  @odbc_free_result($result_id);
 103              }
 104   
 105              $this->sql_server_version = ($row) ? trim(implode(' ', $row)) : 0;
 106   
 107              if (!empty($cache) && $use_cache)
 108              {
 109                  $cache->put('mssqlodbc_version', $this->sql_server_version);
 110              }
 111          }
 112   
 113          if ($raw)
 114          {
 115              return $this->sql_server_version;
 116          }
 117   
 118          return ($this->sql_server_version) ? 'MSSQL (ODBC)<br />' . $this->sql_server_version : 'MSSQL (ODBC)';
 119      }
 120   
 121      /**
 122      * SQL Transaction
 123      * @access private
 124      */
 125      function _sql_transaction($status = 'begin')
 126      {
 127          switch ($status)
 128          {
 129              case 'begin':
 130                  return @odbc_exec($this->db_connect_id, 'BEGIN TRANSACTION');
 131              break;
 132   
 133              case 'commit':
 134                  return @odbc_exec($this->db_connect_id, 'COMMIT TRANSACTION');
 135              break;
 136   
 137              case 'rollback':
 138                  return @odbc_exec($this->db_connect_id, 'ROLLBACK TRANSACTION');
 139              break;
 140          }
 141   
 142          return true;
 143      }
 144   
 145      /**
 146      * {@inheritDoc}
 147      */
 148      function sql_query($query = '', $cache_ttl = 0)
 149      {
 150          if ($query != '')
 151          {
 152              global $cache;
 153   
 154              // EXPLAIN only in extra debug mode
 155              if (defined('DEBUG'))
 156              {
 157                  $this->sql_report('start', $query);
 158              }
 159              else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
 160              {
 161                  $this->curtime = microtime(true);
 162              }
 163   
 164              $this->last_query_text = $query;
 165              $this->query_result = ($cache && $cache_ttl) ? $cache->sql_load($query) : false;
 166              $this->sql_add_num_queries($this->query_result);
 167   
 168              if ($this->query_result === false)
 169              {
 170                  if (($this->query_result = @odbc_exec($this->db_connect_id, $query)) === false)
 171                  {
 172                      $this->sql_error($query);
 173                  }
 174   
 175                  if (defined('DEBUG'))
 176                  {
 177                      $this->sql_report('stop', $query);
 178                  }
 179                  else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
 180                  {
 181                      $this->sql_time += microtime(true) - $this->curtime;
 182                  }
 183   
 184                  if ($cache && $cache_ttl)
 185                  {
 186                      $this->open_queries[(int) $this->query_result] = $this->query_result;
 187                      $this->query_result = $cache->sql_save($this, $query, $this->query_result, $cache_ttl);
 188                  }
 189                  else if (strpos($query, 'SELECT') === 0 && $this->query_result)
 190                  {
 191                      $this->open_queries[(int) $this->query_result] = $this->query_result;
 192                  }
 193              }
 194              else if (defined('DEBUG'))
 195              {
 196                  $this->sql_report('fromcache', $query);
 197              }
 198          }
 199          else
 200          {
 201              return false;
 202          }
 203   
 204          return $this->query_result;
 205      }
 206   
 207      /**
 208      * Build LIMIT query
 209      */
 210      function _sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0)
 211      {
 212          $this->query_result = false;
 213   
 214          // Since TOP is only returning a set number of rows we won't need it if total is set to 0 (return all rows)
 215          if ($total)
 216          {
 217              // We need to grab the total number of rows + the offset number of rows to get the correct result
 218              if (strpos($query, 'SELECT DISTINCT') === 0)
 219              {
 220                  $query = 'SELECT DISTINCT TOP ' . ($total + $offset) . ' ' . substr($query, 15);
 221              }
 222              else
 223              {
 224                  $query = 'SELECT TOP ' . ($total + $offset) . ' ' . substr($query, 6);
 225              }
 226          }
 227   
 228          $result = $this->sql_query($query, $cache_ttl);
 229   
 230          // Seek by $offset rows
 231          if ($offset)
 232          {
 233              $this->sql_rowseek($offset, $result);
 234          }
 235   
 236          return $result;
 237      }
 238   
 239      /**
 240      * {@inheritDoc}
 241      */
 242      function sql_affectedrows()
 243      {
 244          return ($this->db_connect_id) ? @odbc_num_rows($this->query_result) : false;
 245      }
 246   
 247      /**
 248      * {@inheritDoc}
 249      */
 250      function sql_fetchrow($query_id = false)
 251      {
 252          global $cache;
 253   
 254          if ($query_id === false)
 255          {
 256              $query_id = $this->query_result;
 257          }
 258   
 259          if ($cache && $cache->sql_exists($query_id))
 260          {
 261              return $cache->sql_fetchrow($query_id);
 262          }
 263   
 264          return ($query_id !== false) ? @odbc_fetch_array($query_id) : false;
 265      }
 266   
 267      /**
 268      * {@inheritDoc}
 269      */
 270      function sql_nextid()
 271      {
 272          $result_id = @odbc_exec($this->db_connect_id, 'SELECT @@IDENTITY');
 273   
 274          if ($result_id)
 275          {
 276              if (@odbc_fetch_array($result_id))
 277              {
 278                  $id = @odbc_result($result_id, 1);
 279                  @odbc_free_result($result_id);
 280                  return $id;
 281              }
 282              @odbc_free_result($result_id);
 283          }
 284   
 285          return false;
 286      }
 287   
 288      /**
 289      * {@inheritDoc}
 290      */
 291      function sql_freeresult($query_id = false)
 292      {
 293          global $cache;
 294   
 295          if ($query_id === false)
 296          {
 297              $query_id = $this->query_result;
 298          }
 299   
 300          if ($cache && !is_object($query_id) && $cache->sql_exists($query_id))
 301          {
 302              return $cache->sql_freeresult($query_id);
 303          }
 304   
 305          if (isset($this->open_queries[(int) $query_id]))
 306          {
 307              unset($this->open_queries[(int) $query_id]);
 308              return @odbc_free_result($query_id);
 309          }
 310   
 311          return false;
 312      }
 313   
 314      /**
 315      * return sql error array
 316      * @access private
 317      */
 318      function _sql_error()
 319      {
 320          if (function_exists('odbc_errormsg'))
 321          {
 322              $error = array(
 323                  'message'    => @odbc_errormsg(),
 324                  'code'        => @odbc_error(),
 325              );
 326          }
 327          else
 328          {
 329              $error = array(
 330                  'message'    => $this->connect_error,
 331                  'code'        => '',
 332              );
 333          }
 334   
 335          return $error;
 336      }
 337   
 338      /**
 339      * Close sql connection
 340      * @access private
 341      */
 342      function _sql_close()
 343      {
 344          return @odbc_close($this->db_connect_id);
 345      }
 346   
 347      /**
 348      * Build db-specific report
 349      * @access private
 350      */
 351      function _sql_report($mode, $query = '')
 352      {
 353          switch ($mode)
 354          {
 355              case 'start':
 356              break;
 357   
 358              case 'fromcache':
 359                  $endtime = explode(' ', microtime());
 360                  $endtime = $endtime[0] + $endtime[1];
 361   
 362                  $result = @odbc_exec($this->db_connect_id, $query);
 363                  while ($void = @odbc_fetch_array($result))
 364                  {
 365                      // Take the time spent on parsing rows into account
 366                  }
 367                  @odbc_free_result($result);
 368   
 369                  $splittime = explode(' ', microtime());
 370                  $splittime = $splittime[0] + $splittime[1];
 371   
 372                  $this->sql_report('record_fromcache', $query, $endtime, $splittime);
 373   
 374              break;
 375          }
 376      }
 377  }
 378