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

mssql_odbc.php

Zuletzt modifiziert: 09.10.2024, 12:54 - Dateigröße: 8.17 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 (!$this->query_result)
185                  {
186                      return false;
187                  }
188   
189                  if ($cache && $cache_ttl)
190                  {
191                      $this->open_queries[(int) $this->query_result] = $this->query_result;
192                      $this->query_result = $cache->sql_save($this, $query, $this->query_result, $cache_ttl);
193                  }
194                  else if (strpos($query, 'SELECT') === 0)
195                  {
196                      $this->open_queries[(int) $this->query_result] = $this->query_result;
197                  }
198              }
199              else if (defined('DEBUG'))
200              {
201                  $this->sql_report('fromcache', $query);
202              }
203          }
204          else
205          {
206              return false;
207          }
208   
209          return $this->query_result;
210      }
211   
212      /**
213      * Build LIMIT query
214      */
215      function _sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0)
216      {
217          $this->query_result = false;
218   
219          // Since TOP is only returning a set number of rows we won't need it if total is set to 0 (return all rows)
220          if ($total)
221          {
222              // We need to grab the total number of rows + the offset number of rows to get the correct result
223              if (strpos($query, 'SELECT DISTINCT') === 0)
224              {
225                  $query = 'SELECT DISTINCT TOP ' . ($total + $offset) . ' ' . substr($query, 15);
226              }
227              else
228              {
229                  $query = 'SELECT TOP ' . ($total + $offset) . ' ' . substr($query, 6);
230              }
231          }
232   
233          $result = $this->sql_query($query, $cache_ttl);
234   
235          // Seek by $offset rows
236          if ($offset)
237          {
238              $this->sql_rowseek($offset, $result);
239          }
240   
241          return $result;
242      }
243   
244      /**
245      * {@inheritDoc}
246      */
247      function sql_affectedrows()
248      {
249          return ($this->db_connect_id) ? @odbc_num_rows($this->query_result) : false;
250      }
251   
252      /**
253      * {@inheritDoc}
254      */
255      function sql_fetchrow($query_id = false)
256      {
257          global $cache;
258   
259          if ($query_id === false)
260          {
261              $query_id = $this->query_result;
262          }
263   
264          if ($cache && $cache->sql_exists($query_id))
265          {
266              return $cache->sql_fetchrow($query_id);
267          }
268   
269          return ($query_id) ? odbc_fetch_array($query_id) : false;
270      }
271   
272      /**
273      * {@inheritDoc}
274      */
275      function sql_nextid()
276      {
277          $result_id = @odbc_exec($this->db_connect_id, 'SELECT @@IDENTITY');
278   
279          if ($result_id)
280          {
281              if (odbc_fetch_array($result_id))
282              {
283                  $id = odbc_result($result_id, 1);
284                  odbc_free_result($result_id);
285                  return $id;
286              }
287              odbc_free_result($result_id);
288          }
289   
290          return false;
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 odbc_free_result($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('odbc_errormsg'))
326          {
327              $error = array(
328                  'message'    => @odbc_errormsg(),
329                  'code'        => @odbc_error(),
330              );
331          }
332          else
333          {
334              $error = array(
335                  'message'    => $this->connect_error,
336                  'code'        => '',
337              );
338          }
339   
340          return $error;
341      }
342   
343      /**
344      * Close sql connection
345      * @access private
346      */
347      function _sql_close()
348      {
349          return @odbc_close($this->db_connect_id);
350      }
351   
352      /**
353      * Build db-specific report
354      * @access private
355      */
356      function _sql_report($mode, $query = '')
357      {
358          switch ($mode)
359          {
360              case 'start':
361              break;
362   
363              case 'fromcache':
364                  $endtime = explode(' ', microtime());
365                  $endtime = $endtime[0] + $endtime[1];
366   
367                  $result = @odbc_exec($this->db_connect_id, $query);
368                  if ($result)
369                  {
370                      while ($void = odbc_fetch_array($result))
371                      {
372                          // Take the time spent on parsing rows into account
373                      }
374                      odbc_free_result($result);
375                  }
376   
377                  $splittime = explode(' ', microtime());
378                  $splittime = $splittime[0] + $splittime[1];
379   
380                  $this->sql_report('record_fromcache', $query, $endtime, $splittime);
381   
382              break;
383          }
384      }
385  }
386