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

mssqlnative.php

Zuletzt modifiziert: 09.10.2024, 12:54 - Dateigröße: 9.43 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 ($cache && $cache_ttl)
158                  {
159                      $this->open_queries[(int) $this->query_result] = $this->query_result;
160                      $this->query_result = $cache->sql_save($this, $query, $this->query_result, $cache_ttl);
161                  }
162                  else if (strpos($query, 'SELECT') === 0 && $this->query_result)
163                  {
164                      $this->open_queries[(int) $this->query_result] = $this->query_result;
165                  }
166              }
167              else if (defined('DEBUG'))
168              {
169                  $this->sql_report('fromcache', $query);
170              }
171          }
172          else
173          {
174              return false;
175          }
176          return $this->query_result;
177      }
178   
179      /**
180      * Build LIMIT query
181      */
182      function _sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0)
183      {
184          $this->query_result = false;
185   
186          // total == 0 means all results - not zero results
187          if ($offset == 0 && $total !== 0)
188          {
189              if (strpos($query, "SELECT") === false)
190              {
191                  $query = "TOP {$total} " . $query;
192              }
193              else
194              {
195                  $query = preg_replace('/SELECT(\s*DISTINCT)?/Dsi', 'SELECT$1 TOP '.$total, $query);
196              }
197          }
198          else if ($offset > 0)
199          {
200              $query = preg_replace('/SELECT(\s*DISTINCT)?/Dsi', 'SELECT$1 TOP(10000000) ', $query);
201              $query = 'SELECT *
202                      FROM (SELECT sub2.*, ROW_NUMBER() OVER(ORDER BY sub2.line2) AS line3
203                      FROM (SELECT 1 AS line2, sub1.* FROM (' . $query . ') AS sub1) as sub2) AS sub3';
204   
205              if ($total > 0)
206              {
207                  $query .= ' WHERE line3 BETWEEN ' . ($offset+1) . ' AND ' . ($offset + $total);
208              }
209              else
210              {
211                  $query .= ' WHERE line3 > ' . $offset;
212              }
213          }
214   
215          $result = $this->sql_query($query, $cache_ttl);
216   
217          return $result;
218      }
219   
220      /**
221      * {@inheritDoc}
222      */
223      function sql_affectedrows()
224      {
225          return ($this->db_connect_id) ? @sqlsrv_rows_affected($this->query_result) : false;
226      }
227   
228      /**
229      * {@inheritDoc}
230      */
231      function sql_fetchrow($query_id = false)
232      {
233          global $cache;
234   
235          if ($query_id === false)
236          {
237              $query_id = $this->query_result;
238          }
239   
240          if ($cache && $cache->sql_exists($query_id))
241          {
242              return $cache->sql_fetchrow($query_id);
243          }
244   
245          if ($query_id === false)
246          {
247              return false;
248          }
249   
250          $row = @sqlsrv_fetch_array($query_id, SQLSRV_FETCH_ASSOC);
251   
252          if ($row)
253          {
254              foreach ($row as $key => $value)
255              {
256                  $row[$key] = ($value === ' ' || $value === null) ? '' : $value;
257              }
258   
259              // remove helper values from LIMIT queries
260              if (isset($row['line2']))
261              {
262                  unset($row['line2'], $row['line3']);
263              }
264          }
265          return (sizeof($row)) ? $row : false;
266      }
267   
268      /**
269      * {@inheritDoc}
270      */
271      function sql_nextid()
272      {
273          $result_id = @sqlsrv_query($this->db_connect_id, 'SELECT @@IDENTITY');
274   
275          if ($result_id !== false)
276          {
277              $row = @sqlsrv_fetch_array($result_id);
278              $id = $row[0];
279              @sqlsrv_free_stmt($result_id);
280              return $id;
281          }
282          else
283          {
284              return false;
285          }
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 @sqlsrv_free_stmt($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('sqlsrv_errors'))
321          {
322              $errors = @sqlsrv_errors(SQLSRV_ERR_ERRORS);
323              $error_message = '';
324              $code = 0;
325   
326              if ($errors != null)
327              {
328                  foreach ($errors as $error)
329                  {
330                      $error_message .= "SQLSTATE: " . $error['SQLSTATE'] . "\n";
331                      $error_message .= "code: " . $error['code'] . "\n";
332                      $code = $error['code'];
333                      $error_message .= "message: " . $error['message'] . "\n";
334                  }
335                  $this->last_error_result = $error_message;
336                  $error = $this->last_error_result;
337              }
338              else
339              {
340                  $error = (isset($this->last_error_result) && $this->last_error_result) ? $this->last_error_result : array();
341              }
342   
343              $error = array(
344                  'message'    => $error,
345                  'code'        => $code,
346              );
347          }
348          else
349          {
350              $error = array(
351                  'message'    => $this->connect_error,
352                  'code'        => '',
353              );
354          }
355   
356          return $error;
357      }
358   
359      /**
360      * Close sql connection
361      * @access private
362      */
363      function _sql_close()
364      {
365          return @sqlsrv_close($this->db_connect_id);
366      }
367   
368      /**
369      * Build db-specific report
370      * @access private
371      */
372      function _sql_report($mode, $query = '')
373      {
374          switch ($mode)
375          {
376              case 'start':
377                  $html_table = false;
378                  @sqlsrv_query($this->db_connect_id, 'SET SHOWPLAN_TEXT ON;');
379                  if ($result = @sqlsrv_query($this->db_connect_id, $query))
380                  {
381                      @sqlsrv_next_result($result);
382                      while ($row = @sqlsrv_fetch_array($result))
383                      {
384                          $html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
385                      }
386                  }
387                  @sqlsrv_query($this->db_connect_id, 'SET SHOWPLAN_TEXT OFF;');
388                  @sqlsrv_free_stmt($result);
389   
390                  if ($html_table)
391                  {
392                      $this->html_hold .= '</table>';
393                  }
394              break;
395   
396              case 'fromcache':
397                  $endtime = explode(' ', microtime());
398                  $endtime = $endtime[0] + $endtime[1];
399   
400                  $result = @sqlsrv_query($this->db_connect_id, $query);
401                  while ($void = @sqlsrv_fetch_array($result))
402                  {
403                      // Take the time spent on parsing rows into account
404                  }
405                  @sqlsrv_free_stmt($result);
406   
407                  $splittime = explode(' ', microtime());
408                  $splittime = $splittime[0] + $splittime[1];
409   
410                  $this->sql_report('record_fromcache', $query, $endtime, $splittime);
411   
412              break;
413          }
414      }
415   
416      /**
417      * Utility method used to retrieve number of rows
418      * Emulates mysql_num_rows
419      * Used in acp_database.php -> write_data_mssqlnative()
420      * Requires a static or keyset cursor to be definde via
421      * mssqlnative_set_query_options()
422      */
423      function mssqlnative_num_rows($res)
424      {
425          if ($res !== false)
426          {
427              return sqlsrv_num_rows($res);
428          }
429          else
430          {
431              return false;
432          }
433      }
434   
435      /**
436      * Allows setting mssqlnative specific query options passed to sqlsrv_query as 4th parameter.
437      */
438      function mssqlnative_set_query_options($options)
439      {
440          $this->query_options = $options;
441      }
442  }
443