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