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.php

Zuletzt modifiziert: 09.10.2024, 12:54 - Dateigröße: 9.80 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  * MSSQL Database Abstraction Layer
018  * Minimum Requirement is MSSQL 2000+
019  */
020  class mssql extends \phpbb\db\driver\driver
021  {
022      var $connect_error = '';
023   
024      /**
025      * {@inheritDoc}
026      */
027      function sql_connect($sqlserver, $sqluser, $sqlpassword, $database, $port = false, $persistency = false, $new_link = false)
028      {
029          if (!function_exists('mssql_connect'))
030          {
031              $this->connect_error = 'mssql_connect function does not exist, is mssql extension installed?';
032              return $this->sql_error('');
033          }
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          @ini_set('mssql.charset', 'UTF-8');
043          @ini_set('mssql.textlimit', 2147483647);
044          @ini_set('mssql.textsize', 2147483647);
045   
046          $this->db_connect_id = ($this->persistency) ? @mssql_pconnect($this->server, $this->user, $sqlpassword, $new_link) : @mssql_connect($this->server, $this->user, $sqlpassword, $new_link);
047   
048          if ($this->db_connect_id && $this->dbname != '')
049          {
050              if (!@mssql_select_db($this->dbname, $this->db_connect_id))
051              {
052                  @mssql_close($this->db_connect_id);
053                  return false;
054              }
055          }
056   
057          return ($this->db_connect_id) ? $this->db_connect_id : $this->sql_error('');
058      }
059   
060      /**
061      * {@inheritDoc}
062      */
063      function sql_server_info($raw = false, $use_cache = true)
064      {
065          global $cache;
066   
067          if (!$use_cache || empty($cache) || ($this->sql_server_version = $cache->get('mssql_version')) === false)
068          {
069              $result_id = @mssql_query("SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY('productlevel'), SERVERPROPERTY('edition')", $this->db_connect_id);
070   
071              $row = false;
072              if ($result_id)
073              {
074                  $row = @mssql_fetch_assoc($result_id);
075                  @mssql_free_result($result_id);
076              }
077   
078              $this->sql_server_version = ($row) ? trim(implode(' ', $row)) : 0;
079   
080              if (!empty($cache) && $use_cache)
081              {
082                  $cache->put('mssql_version', $this->sql_server_version);
083              }
084          }
085   
086          if ($raw)
087          {
088              return $this->sql_server_version;
089          }
090   
091          return ($this->sql_server_version) ? 'MSSQL<br />' . $this->sql_server_version : 'MSSQL';
092      }
093   
094      /**
095      * {@inheritDoc}
096      */
097      public function sql_concatenate($expr1, $expr2)
098      {
099          return $expr1 . ' + ' . $expr2;
100      }
101   
102      /**
103      * SQL Transaction
104      * @access private
105      */
106      function _sql_transaction($status = 'begin')
107      {
108          switch ($status)
109          {
110              case 'begin':
111                  return @mssql_query('BEGIN TRANSACTION', $this->db_connect_id);
112              break;
113   
114              case 'commit':
115                  return @mssql_query('COMMIT TRANSACTION', $this->db_connect_id);
116              break;
117   
118              case 'rollback':
119                  return @mssql_query('ROLLBACK TRANSACTION', $this->db_connect_id);
120              break;
121          }
122   
123          return true;
124      }
125   
126      /**
127      * {@inheritDoc}
128      */
129      function sql_query($query = '', $cache_ttl = 0)
130      {
131          if ($query != '')
132          {
133              global $cache;
134   
135              // EXPLAIN only in extra debug mode
136              if (defined('DEBUG'))
137              {
138                  $this->sql_report('start', $query);
139              }
140              else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
141              {
142                  $this->curtime = microtime(true);
143              }
144   
145              $this->query_result = ($cache && $cache_ttl) ? $cache->sql_load($query) : false;
146              $this->sql_add_num_queries($this->query_result);
147   
148              if ($this->query_result === false)
149              {
150                  if (($this->query_result = @mssql_query($query, $this->db_connect_id)) === false)
151                  {
152                      $this->sql_error($query);
153                  }
154   
155                  if (defined('DEBUG'))
156                  {
157                      $this->sql_report('stop', $query);
158                  }
159                  else if (defined('PHPBB_DISPLAY_LOAD_TIME'))
160                  {
161                      $this->sql_time += microtime(true) - $this->curtime;
162                  }
163   
164                  if ($cache && $cache_ttl)
165                  {
166                      $this->open_queries[(int) $this->query_result] = $this->query_result;
167                      $this->query_result = $cache->sql_save($this, $query, $this->query_result, $cache_ttl);
168                  }
169                  else if (strpos($query, 'SELECT') === 0 && $this->query_result)
170                  {
171                      $this->open_queries[(int) $this->query_result] = $this->query_result;
172                  }
173              }
174              else if (defined('DEBUG'))
175              {
176                  $this->sql_report('fromcache', $query);
177              }
178          }
179          else
180          {
181              return false;
182          }
183   
184          return $this->query_result;
185      }
186   
187      /**
188      * Build LIMIT query
189      */
190      function _sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0)
191      {
192          $this->query_result = false;
193   
194          // Since TOP is only returning a set number of rows we won't need it if total is set to 0 (return all rows)
195          if ($total)
196          {
197              // We need to grab the total number of rows + the offset number of rows to get the correct result
198              if (strpos($query, 'SELECT DISTINCT') === 0)
199              {
200                  $query = 'SELECT DISTINCT TOP ' . ($total + $offset) . ' ' . substr($query, 15);
201              }
202              else
203              {
204                  $query = 'SELECT TOP ' . ($total + $offset) . ' ' . substr($query, 6);
205              }
206          }
207   
208          $result = $this->sql_query($query, $cache_ttl);
209   
210          // Seek by $offset rows
211          if ($offset)
212          {
213              $this->sql_rowseek($offset, $result);
214          }
215   
216          return $result;
217      }
218   
219      /**
220      * {@inheritDoc}
221      */
222      function sql_affectedrows()
223      {
224          return ($this->db_connect_id) ? @mssql_rows_affected($this->db_connect_id) : false;
225      }
226   
227      /**
228      * {@inheritDoc}
229      */
230      function sql_fetchrow($query_id = false)
231      {
232          global $cache;
233   
234          if ($query_id === false)
235          {
236              $query_id = $this->query_result;
237          }
238   
239          if ($cache && $cache->sql_exists($query_id))
240          {
241              return $cache->sql_fetchrow($query_id);
242          }
243   
244          if ($query_id === false)
245          {
246              return false;
247          }
248   
249          $row = @mssql_fetch_assoc($query_id);
250   
251          // I hope i am able to remove this later... hopefully only a PHP or MSSQL bug
252          if ($row)
253          {
254              foreach ($row as $key => $value)
255              {
256                  $row[$key] = ($value === ' ' || $value === null) ? '' : $value;
257              }
258          }
259   
260          return $row;
261      }
262   
263      /**
264      * {@inheritDoc}
265      */
266      function sql_rowseek($rownum, &$query_id)
267      {
268          global $cache;
269   
270          if ($query_id === false)
271          {
272              $query_id = $this->query_result;
273          }
274   
275          if ($cache && $cache->sql_exists($query_id))
276          {
277              return $cache->sql_rowseek($rownum, $query_id);
278          }
279   
280          return ($query_id !== false) ? @mssql_data_seek($query_id, $rownum) : false;
281      }
282   
283      /**
284      * {@inheritDoc}
285      */
286      function sql_nextid()
287      {
288          $result_id = @mssql_query('SELECT SCOPE_IDENTITY()', $this->db_connect_id);
289          if ($result_id)
290          {
291              if ($row = @mssql_fetch_assoc($result_id))
292              {
293                  @mssql_free_result($result_id);
294                  return $row['computed'];
295              }
296              @mssql_free_result($result_id);
297          }
298   
299          return false;
300      }
301   
302      /**
303      * {@inheritDoc}
304      */
305      function sql_freeresult($query_id = false)
306      {
307          global $cache;
308   
309          if ($query_id === false)
310          {
311              $query_id = $this->query_result;
312          }
313   
314          if ($cache && !is_object($query_id) && $cache->sql_exists($query_id))
315          {
316              return $cache->sql_freeresult($query_id);
317          }
318   
319          if (isset($this->open_queries[(int) $query_id]))
320          {
321              unset($this->open_queries[(int) $query_id]);
322              return @mssql_free_result($query_id);
323          }
324   
325          return false;
326      }
327   
328      /**
329      * {@inheritDoc}
330      */
331      function sql_escape($msg)
332      {
333          return str_replace(array("'", "\0"), array("''", ''), $msg);
334      }
335   
336      /**
337      * {@inheritDoc}
338      */
339      function sql_lower_text($column_name)
340      {
341          return "LOWER(SUBSTRING($column_name, 1, DATALENGTH($column_name)))";
342      }
343   
344      /**
345      * Build LIKE expression
346      * @access private
347      */
348      function _sql_like_expression($expression)
349      {
350          return $expression . " ESCAPE '\\'";
351      }
352   
353      /**
354      * Build NOT LIKE expression
355      * @access private
356      */
357      function _sql_not_like_expression($expression)
358      {
359          return $expression . " ESCAPE '\\'";
360      }
361   
362      /**
363      * return sql error array
364      * @access private
365      */
366      function _sql_error()
367      {
368          if (function_exists('mssql_get_last_message'))
369          {
370              $error = array(
371                  'message'    => @mssql_get_last_message(),
372                  'code'        => '',
373              );
374   
375              // Get error code number
376              $result_id = @mssql_query('SELECT @@ERROR as code', $this->db_connect_id);
377              if ($result_id)
378              {
379                  $row = @mssql_fetch_assoc($result_id);
380                  $error['code'] = $row['code'];
381                  @mssql_free_result($result_id);
382              }
383   
384              // Get full error message if possible
385              $sql = 'SELECT CAST(description as varchar(255)) as message
386                  FROM master.dbo.sysmessages
387                  WHERE error = ' . $error['code'];
388              $result_id = @mssql_query($sql);
389   
390              if ($result_id)
391              {
392                  $row = @mssql_fetch_assoc($result_id);
393                  if (!empty($row['message']))
394                  {
395                      $error['message'] .= '<br />' . $row['message'];
396                  }
397                  @mssql_free_result($result_id);
398              }
399          }
400          else
401          {
402              $error = array(
403                  'message'    => $this->connect_error,
404                  'code'        => '',
405              );
406          }
407   
408          return $error;
409      }
410   
411      /**
412      * Build db-specific query data
413      * @access private
414      */
415      function _sql_custom_build($stage, $data)
416      {
417          return $data;
418      }
419   
420      /**
421      * Close sql connection
422      * @access private
423      */
424      function _sql_close()
425      {
426          return @mssql_close($this->db_connect_id);
427      }
428   
429      /**
430      * Build db-specific report
431      * @access private
432      */
433      function _sql_report($mode, $query = '')
434      {
435          switch ($mode)
436          {
437              case 'start':
438                  $html_table = false;
439                  @mssql_query('SET SHOWPLAN_TEXT ON;', $this->db_connect_id);
440                  if ($result = @mssql_query($query, $this->db_connect_id))
441                  {
442                      @mssql_next_result($result);
443                      while ($row = @mssql_fetch_row($result))
444                      {
445                          $html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
446                      }
447                  }
448                  @mssql_query('SET SHOWPLAN_TEXT OFF;', $this->db_connect_id);
449                  @mssql_free_result($result);
450   
451                  if ($html_table)
452                  {
453                      $this->html_hold .= '</table>';
454                  }
455              break;
456   
457              case 'fromcache':
458                  $endtime = explode(' ', microtime());
459                  $endtime = $endtime[0] + $endtime[1];
460   
461                  $result = @mssql_query($query, $this->db_connect_id);
462                  while ($void = @mssql_fetch_assoc($result))
463                  {
464                      // Take the time spent on parsing rows into account
465                  }
466                  @mssql_free_result($result);
467   
468                  $splittime = explode(' ', microtime());
469                  $splittime = $splittime[0] + $splittime[1];
470   
471                  $this->sql_report('record_fromcache', $query, $endtime, $splittime);
472   
473              break;
474          }
475      }
476  }
477