Completed
Push — work-fleets ( 6b7253...c0452c )
by SuperNova.WS
06:17
created

db_mysql::replaceTablePlaceholders()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 3
eloc 6
c 2
b 0
f 0
nc 2
nop 1
dl 0
loc 10
ccs 0
cts 8
cp 0
crap 12
rs 9.4285
1
<?php
2
3
/**
4
 * User: Gorlum
5
 * Date: 01.09.2015
6
 * Time: 15:58
7
 */
8
class db_mysql {
9
  const TRANSACTION_SERIALIZABLE = 'SERIALIZABLE';
10
  const TRANSACTION_REPEATABLE_READ = 'REPEATABLE READ';
11
  const TRANSACTION_READ_COMMITTED = 'READ COMMITTED';
12
  const TRANSACTION_READ_UNCOMMITTED = 'READ UNCOMMITTED';
13
14
  /**
15
   * Статус соеднения с MySQL
16
   *
17
   * @var bool
18
   */
19
  public $connected = false;
20
  /**
21
   * Префикс названий таблиц в БД
22
   *
23
   * @var string
24
   */
25
  public $db_prefix = '';
26
  /**
27
   * Список таблиц в БД
28
   *
29
   * @var array
30
   */
31
  public $table_list = array();
32
33
  /**
34
   * Настройки БД
35
   *
36
   * @var array
37
   */
38
  protected $dbsettings = array();
39
  /**
40
   * Драйвер для прямого обращения к MySQL
41
   *
42
   * @var db_mysql_v5 $driver
43
   */
44
  public $driver = null;
45
46
  /**
47
   * Общее время запросов
48
   *
49
   * @var float $time_mysql_total
50
   */
51
  public $time_mysql_total = 0.0;
52
53
  /**
54
   * Amount of queries on this DB
55
   *
56
   * @var int
57
   */
58
  public $queryCount = 0;
59
60
  public $isWatching = false;
61
62
  public function __construct() {
63
  }
64
65
  public function load_db_settings() {
66
    $dbsettings = array();
67
68
    require(SN_ROOT_PHYSICAL . "config" . DOT_PHP_EX);
69
70
    $this->dbsettings = $dbsettings;
71
  }
72
73
  public function sn_db_connect($external_db_settings = null) {
74
    $this->db_disconnect();
75
76
    if (!empty($external_db_settings) && is_array($external_db_settings)) {
77
      $this->dbsettings = $external_db_settings;
78
    }
79
80
    if (empty($this->dbsettings)) {
81
      $this->load_db_settings();
82
    }
83
84
    // TODO - фатальные (?) ошибки на каждом шагу. Хотя - скорее Эксепшны
85
    if (!empty($this->dbsettings)) {
86
      $driver_name = empty($this->dbsettings['sn_driver']) ? 'db_mysql_v5' : $this->dbsettings['sn_driver'];
87
      $this->driver = new $driver_name();
88
      $this->db_prefix = $this->dbsettings['prefix'];
89
90
      $this->connected = $this->connected || $this->driver_connect();
91
92
      if ($this->connected) {
93
        $this->table_list = $this->db_get_table_list();
94
        // TODO Проверка на пустоту
95
      }
96
    } else {
97
      $this->connected = false;
98
    }
99
100
    return $this->connected;
101
  }
102
103
  protected function driver_connect() {
104
    if (!is_object($this->driver)) {
105
      classSupernova::$debug->error_fatal('DB Error - No driver for MySQL found!');
106
    }
107
108
    if (!method_exists($this->driver, 'mysql_connect')) {
109
      classSupernova::$debug->error_fatal('DB Error - WRONG MySQL driver!');
110
    }
111
112
    return $this->driver->mysql_connect($this->dbsettings);
113
  }
114
115
  public function db_disconnect() {
116
    if ($this->connected) {
117
      $this->connected = !$this->driver_disconnect();
118
      $this->connected = false;
119
    }
120
121
    return !$this->connected;
122
  }
123
124
  /**
125
   * @param string $query
126
   *
127
   * @return mixed|string
128
   */
129
  public function replaceTablePlaceholders($query) {
130
    $sql = $query;
131
    if (strpos($sql, '{{') !== false) {
132
      foreach ($this->table_list as $tableName) {
133
        $sql = str_replace("{{{$tableName}}}", $this->db_prefix . $tableName, $sql);
134
      }
135
    }
136
137
    return $sql;
138
  }
139
140
  /**
141
   * @param       $query
142
   * @param       $fetch
143
   */
144
  protected function logQuery($query, $fetch) {
145
    if (!classSupernova::$config->debug) {
146
      return;
147
    }
148
149
    $this->queryCount++;
150
    $arr = debug_backtrace();
151
    $file = end(explode('/', $arr[0]['file']));
0 ignored issues
show
Bug introduced by
explode('/', $arr[0]['file']) cannot be passed to end() as the parameter $array expects a reference.
Loading history...
152
    $line = $arr[0]['line'];
153
    classSupernova::$debug->add("<tr><th>Query {$this->queryCount}: </th><th>$query</th><th>{$file} @ {$line}</th><th>&nbsp;</th><th> " . ($fetch ? '+' : '&nbsp;') . " </th></tr>");
154
  }
155
156
157
  /**
158
   * @return string
159
   */
160
  public function queryTrace() {
161
    if (!defined('DEBUG_SQL_COMMENT') || constant('DEBUG_SQL_ERROR') !== true) {
162
      return '';
163
    }
164
165
    $backtrace = debug_backtrace();
166
    $sql_comment = classSupernova::$debug->compact_backtrace($backtrace, defined('DEBUG_SQL_COMMENT_LONG'));
167
168
    if (defined('DEBUG_SQL_ERROR') && constant('DEBUG_SQL_ERROR') === true) {
169
      classSupernova::$debug->add_to_array($sql_comment);
170
    }
171
172
    $sql_commented = implode("\r\n", $sql_comment);
173
    if (defined('DEBUG_SQL_ONLINE') && constant('DEBUG_SQL_ONLINE') === true) {
174
      classSupernova::$debug->warning($sql_commented, 'SQL Debug', LOG_DEBUG_SQL);
175
    }
176
177
    return $sql_commented;
178
  }
179
180
  /**
181
   * @param string|DbSqlPrepare $query
182
   * @param string              $table
183
   * @param bool                $fetch
184
   * @param bool                $skip_query_check
185
   *
186
   * @return array|bool|mysqli_result|null
187
   */
188
  public function doquery($query, $table = '', $fetch = false, $skip_query_check = false) {
189
    if (!is_string($table)) {
190
      $fetch = $table;
191
    }
192
193
    if (!$this->connected) {
194
      $this->sn_db_connect();
195
    }
196
197
    $stringQuery = $query instanceof DbSqlPrepare ? $query->query : $query;
198
    $stringQuery = trim($stringQuery);
199
    // You can't do it - 'cause you can break commented statement with line-end comments
200
    // $stringQuery = preg_replace("/\s+/", ' ', $stringQuery);
0 ignored issues
show
Unused Code Comprehensibility introduced by
57% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
201
202
    $this->security_watch_user_queries($stringQuery);
203
    $this->security_query_check_bad_words($stringQuery, $skip_query_check);
204
    $this->logQuery($stringQuery, $fetch);
205
206
    $stringQuery = $this->replaceTablePlaceholders($stringQuery);
207
208
    $queryTrace = $this->queryTrace();
209
210
    $queryResult = null;
211
    try {
212
      if ($query instanceof DbSqlPrepare) {
213
        // MYSQLI ONLY!!!
214
        $queryResult = $query
215
          ->setQuery($stringQuery)
216
          ->comment($queryTrace)
217
          ->compileMySqlI()
218
          ->statementGet($this)
219
          ->execute()
220
          ->getResult();
221
      } else {
222
        $queryResult = $this->db_sql_query($stringQuery . DbSqlHelper::quoteComment($queryTrace));
223
      }
224
      if (!$queryResult) {
225
        throw new Exception();
226
      }
227
    } catch (Exception $e) {
228
      classSupernova::$debug->error($this->db_error() . "<br />{$query}<br />", 'SQL Error');
229
    }
230
231
    if ($fetch) {
232
      $queryResult = $this->db_fetch($queryResult);
0 ignored issues
show
Bug introduced by
It seems like $queryResult defined by $this->db_fetch($queryResult) on line 232 can also be of type boolean; however, db_mysql::db_fetch() does only seem to accept object<mysqli_result>, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
233
      // DO NOT CLOSE STATEMENT HERE TO MAKE STATEMENT CACHING WORK!
234
    }
235
236
    return $queryResult;
237
  }
238
239
240
  /**
241
   * @param string|DbQueryConstructor $query
242
   * @param bool                      $skip_query_check
243
   *
244
   * @return bool|DbResultIterator
245
   */
246
  public function selectIterator($query, $skip_query_check = false) {
247
    if (!$this->connected) {
248
      $this->sn_db_connect();
249
    }
250
251
    $stringQuery = $query instanceof DbQueryConstructor ? $query->__toString() : $query;
252
    $stringQuery = trim($stringQuery);
253
    // You can't do it - 'cause you can break commented statement with line-end comments
254
    // $stringQuery = preg_replace("/\s+/", ' ', $stringQuery);
0 ignored issues
show
Unused Code Comprehensibility introduced by
57% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
255
256
    $this->security_watch_user_queries($stringQuery);
257
    $this->security_query_check_bad_words($stringQuery, $skip_query_check);
258
    $this->logQuery($stringQuery, false);
259
    $stringQuery = $this->replaceTablePlaceholders($stringQuery);
260
261
    $queryTrace = $this->queryTrace();
262
263
    $result = false;
264
    try {
265
      // If variables not empty - running PREPARE
266
      if ($query instanceof DbQueryConstructor && !empty($query->variables)) {
267
        // MYSQLI ONLY!!!
0 ignored issues
show
Unused Code Comprehensibility introduced by
43% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
268
        $result = DbSqlPrepare::build($stringQuery, $query->variables)
269
          ->comment($queryTrace)
270
          ->compileMySqlI()
271
          ->statementGet($this)
272
          ->execute()
273
          ->getIterator();
274
      } else {
275
        $queryResult = $this->db_sql_query($stringQuery . DbSqlHelper::quoteComment($queryTrace));
276
277
        if (!$queryResult) {
278
          throw new Exception();
279
        }
280
281
        if ($queryResult instanceof mysqli_result) {
282
          $result = new DbMysqliResultIterator($queryResult);
283
        } else {
284
          $result = $queryResult;
285
        }
286
      }
287
    } catch (Exception $e) {
288
      classSupernova::$debug->error($this->db_error() . "<br />{$query}<br />", 'SQL Error');
289
    }
290
291
    return $result;
292
  }
293
294
  /**
295
   * Returns iterator to iterate through mysqli_result
296
   *
297
   * @param string|DbSqlPrepare|DbQueryConstructor $query
298
   * @param bool                                   $skip_query_check
299
   * @param array                                  $variables
300
   *
301
   * return DbResultIterator
302
   *
303
   * @return DbEmptyIterator|DbMysqliResultIterator
304
   */
305
  public function select($query, $skip_query_check = false, $variables = array()) {
0 ignored issues
show
Unused Code introduced by
The parameter $variables is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
306
    if ($queryResult = $this->selectIterator($query, $skip_query_check)) {
0 ignored issues
show
Bug introduced by
It seems like $query defined by parameter $query on line 305 can also be of type object<DbSqlPrepare>; however, db_mysql::selectIterator() does only seem to accept string|object<DbQueryConstructor>, maybe add an additional type check?

This check looks at variables that have been passed in as parameters and are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
307
      $result = $queryResult;
308
    } else {
309
      $result = new DbEmptyIterator();
310
    }
311
312
    return $result;
313
  }
314
315
  /**
316
   * @param string|DbSqlPrepare $query
317
   * @param bool                $skip_query_check
318
   * @param array               $variables
319
   *
320
   * @return array
321
   */
322
  public function selectRow($query, $skip_query_check = false, $variables = array()) {
323
    // TODO - ... LIMIT 1 FOR UPDATE
324
    if (!is_array($row = $this->select($query, $skip_query_check, $variables)->current())) {
325
      $row = array();
326
    }
327
328
    return $row;
329
  }
330
331
  /**
332
   * @param string|DbSqlPrepare|DbQueryConstructor $query
333
   * @param bool                                   $skip_query_check
334
   * @param array                                  $variables
335
   *
336
   * @return mixed
337
   */
338
  public function selectValue($query, $skip_query_check = false, $variables = array()) {
339
    $array = $this->selectRow($query, $skip_query_check, $variables);
0 ignored issues
show
Bug introduced by
It seems like $query defined by parameter $query on line 338 can also be of type object<DbQueryConstructor>; however, db_mysql::selectRow() does only seem to accept string|object<DbSqlPrepare>, maybe add an additional type check?

This check looks at variables that have been passed in as parameters and are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
340
341
    return reset($array);
342
  }
343
344
  // TODO Заменить это на новый логгер
345
  protected function security_watch_user_queries($query) {
346
    global $user;
347
348
    if (
349
      !$this->isWatching // Not already watching
350
      && !empty(classSupernova::$config->game_watchlist_array) // There is some players in watchlist
351
      && in_array($user['id'], classSupernova::$config->game_watchlist_array) // Current player is in watchlist
352
      && !preg_match('/^(select|commit|rollback|start transaction)/i', $query) // Current query should be watched
353
    ) {
354
      $this->isWatching = true;
355
      $msg = "\$query = \"{$query}\"\n\r";
356
      if (!empty($_POST)) {
357
        $msg .= "\n\r" . dump($_POST, '$_POST');
358
      }
359
      if (!empty($_GET)) {
360
        $msg .= "\n\r" . dump($_GET, '$_GET');
361
      }
362
      classSupernova::$debug->warning($msg, "Watching user {$user['id']}", 399, array('base_dump' => true));
0 ignored issues
show
Documentation introduced by
array('base_dump' => true) is of type array<string,boolean,{"base_dump":"boolean"}>, but the function expects a boolean.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
363
      $this->isWatching = false;
364
    }
365
  }
366
367
368
  public function security_query_check_bad_words($query, $skip_query_check = false) {
369
    if ($skip_query_check) {
370
      return;
371
    }
372
373
    global $user, $dm_change_legit, $mm_change_legit;
374
375
    switch(true) {
376
      case stripos($query, 'RUNCATE TABL') != false:
0 ignored issues
show
Bug Best Practice introduced by
It seems like you are loosely comparing stripos($query, 'RUNCATE TABL') of type integer to the boolean false. If you are specifically checking for non-zero, consider using something more explicit like > 0 or !== 0 instead.
Loading history...
377
      case stripos($query, 'ROP TABL') != false:
0 ignored issues
show
Bug Best Practice introduced by
It seems like you are loosely comparing stripos($query, 'ROP TABL') of type integer to the boolean false. If you are specifically checking for non-zero, consider using something more explicit like > 0 or !== 0 instead.
Loading history...
378
      case stripos($query, 'ENAME TABL') != false:
0 ignored issues
show
Bug Best Practice introduced by
It seems like you are loosely comparing stripos($query, 'ENAME TABL') of type integer to the boolean false. If you are specifically checking for non-zero, consider using something more explicit like > 0 or !== 0 instead.
Loading history...
379
      case stripos($query, 'REATE DATABAS') != false:
0 ignored issues
show
Bug Best Practice introduced by
It seems like you are loosely comparing stripos($query, 'REATE DATABAS') of type integer to the boolean false. If you are specifically checking for non-zero, consider using something more explicit like > 0 or !== 0 instead.
Loading history...
380
      case stripos($query, 'REATE TABL') != false:
0 ignored issues
show
Bug Best Practice introduced by
It seems like you are loosely comparing stripos($query, 'REATE TABL') of type integer to the boolean false. If you are specifically checking for non-zero, consider using something more explicit like > 0 or !== 0 instead.
Loading history...
381
      case stripos($query, 'ET PASSWOR') != false:
0 ignored issues
show
Bug Best Practice introduced by
It seems like you are loosely comparing stripos($query, 'ET PASSWOR') of type integer to the boolean false. If you are specifically checking for non-zero, consider using something more explicit like > 0 or !== 0 instead.
Loading history...
382
      case stripos($query, 'EOAD DAT') != false:
0 ignored issues
show
Bug Best Practice introduced by
It seems like you are loosely comparing stripos($query, 'EOAD DAT') of type integer to the boolean false. If you are specifically checking for non-zero, consider using something more explicit like > 0 or !== 0 instead.
Loading history...
383
      case stripos($query, 'RPG_POINTS') != false && stripos(trim($query), 'UPDATE ') === 0 && !$dm_change_legit:
0 ignored issues
show
Bug Best Practice introduced by
It seems like you are loosely comparing stripos($query, 'RPG_POINTS') of type integer to the boolean false. If you are specifically checking for non-zero, consider using something more explicit like > 0 or !== 0 instead.
Loading history...
384
      case stripos($query, 'METAMATTER') != false && stripos(trim($query), 'UPDATE ') === 0 && !$mm_change_legit:
0 ignored issues
show
Bug Best Practice introduced by
It seems like you are loosely comparing stripos($query, 'METAMATTER') of type integer to the boolean false. If you are specifically checking for non-zero, consider using something more explicit like > 0 or !== 0 instead.
Loading history...
385
      case stripos($query, 'AUTHLEVEL') != false && $user['authlevel'] < 3 && stripos($query, 'SELECT') !== 0:
0 ignored issues
show
Bug Best Practice introduced by
It seems like you are loosely comparing stripos($query, 'AUTHLEVEL') of type integer to the boolean false. If you are specifically checking for non-zero, consider using something more explicit like > 0 or !== 0 instead.
Loading history...
386
        $report = "Hacking attempt (" . date("d.m.Y H:i:s") . " - [" . time() . "]):\n";
387
        $report .= ">Database Inforamation\n";
388
        $report .= "\tID - " . $user['id'] . "\n";
389
        $report .= "\tUser - " . $user['username'] . "\n";
390
        $report .= "\tAuth level - " . $user['authlevel'] . "\n";
391
        $report .= "\tAdmin Notes - " . $user['adminNotes'] . "\n";
392
        $report .= "\tCurrent Planet - " . $user['current_planet'] . "\n";
393
        $report .= "\tUser IP - " . $user['user_lastip'] . "\n";
394
        $report .= "\tUser IP at Reg - " . $user['ip_at_reg'] . "\n";
395
        $report .= "\tUser Agent- " . $_SERVER['HTTP_USER_AGENT'] . "\n";
396
        $report .= "\tCurrent Page - " . $user['current_page'] . "\n";
397
        $report .= "\tRegister Time - " . $user['register_time'] . "\n";
398
        $report .= "\n";
399
400
        $report .= ">Query Information\n";
401
        $report .= "\tQuery - " . $query . "\n";
402
        $report .= "\n";
403
404
        $report .= ">\$_SERVER Information\n";
405
        $report .= "\tIP - " . $_SERVER['REMOTE_ADDR'] . "\n";
406
        $report .= "\tHost Name - " . $_SERVER['HTTP_HOST'] . "\n";
407
        $report .= "\tUser Agent - " . $_SERVER['HTTP_USER_AGENT'] . "\n";
408
        $report .= "\tRequest Method - " . $_SERVER['REQUEST_METHOD'] . "\n";
409
        $report .= "\tCame From - " . $_SERVER['HTTP_REFERER'] . "\n";
410
        $report .= "\tPage is - " . $_SERVER['SCRIPT_NAME'] . "\n";
411
        $report .= "\tUses Port - " . $_SERVER['REMOTE_PORT'] . "\n";
412
        $report .= "\tServer Protocol - " . $_SERVER['SERVER_PROTOCOL'] . "\n";
413
414
        $report .= "\n--------------------------------------------------------------------------------------------------\n";
415
416
        $fp = fopen(SN_ROOT_PHYSICAL . 'badqrys.txt', 'a');
417
        fwrite($fp, $report);
0 ignored issues
show
Security File Manipulation introduced by
$report can contain request data and is used in file manipulation context(s) leading to a potential security vulnerability.

General Strategies to prevent injection

In general, it is advisable to prevent any user-data to reach this point. This can be done by white-listing certain values:

if ( ! in_array($value, array('this-is-allowed', 'and-this-too'), true)) {
    throw new \InvalidArgumentException('This input is not allowed.');
}

For numeric data, we recommend to explicitly cast the data:

$sanitized = (integer) $tainted;
Loading history...
418
        fclose($fp);
419
420
        $message = 'Привет, я не знаю то, что Вы пробовали сделать, но команда, которую Вы только послали базе данных, не выглядела очень дружественной и она была заблокированна.<br /><br />Ваш IP, и другие данные переданны администрации сервера. Удачи!.';
421
        die($message);
422
      break;
0 ignored issues
show
Unused Code introduced by
break; does not seem to be reachable.

This check looks for unreachable code. It uses sophisticated control flow analysis techniques to find statements which will never be executed.

Unreachable code is most often the result of return, die or exit statements that have been added for debug purposes.

function fx() {
    try {
        doSomething();
        return true;
    }
    catch (\Exception $e) {
        return false;
    }

    return false;
}

In the above example, the last return false will never be executed, because a return statement has already been met in every possible execution path.

Loading history...
423
    }
424
  }
425
426
  /**
427
   * @param bool $prefixed_only
428
   *
429
   * @return array
430
   */
431
  public function db_get_table_list($prefixed_only = true) {
432
    $query = $this->mysql_get_table_list();
433
434
    $prefix_length = strlen($this->db_prefix);
435
436
    $tl = array();
437
    while($row = $this->db_fetch($query)) {
0 ignored issues
show
Bug introduced by
It seems like $query defined by $this->mysql_get_table_list() on line 432 can also be of type boolean; however, db_mysql::db_fetch() does only seem to accept object<mysqli_result>, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
438
      foreach ($row as $table_name) {
439
        if (strpos($table_name, $this->db_prefix) === 0) {
440
          $table_name = substr($table_name, $prefix_length);
441
        } elseif ($prefixed_only) {
442
          continue;
443
        }
444
        // $table_name = str_replace($db_prefix, '', $table_name);
0 ignored issues
show
Unused Code Comprehensibility introduced by
57% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
445
        $tl[$table_name] = $table_name;
446
      }
447
    }
448
449
    return $tl;
450
  }
451
452
  /**
453
   * @param string $statement
454
   *
455
   * @return bool|mysqli_stmt
456
   */
457 View Code Duplication
  public function db_prepare($statement) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
458
    $microtime = microtime(true);
459
    $result = $this->driver->mysql_prepare($statement);
460
    $this->time_mysql_total += microtime(true) - $microtime;
461
462
    return $result;
463
  }
464
465
466
  /**
467
   * L1 perform the query
468
   *
469
   * @param $query_string
470
   *
471
   * @return bool|mysqli_result
472
   */
473 View Code Duplication
  public function db_sql_query($query_string) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
474
    $microtime = microtime(true);
475
    $result = $this->driver->mysql_query($query_string);
476
    $this->time_mysql_total += microtime(true) - $microtime;
477
478
    return $result;
479
  }
480
481
  /**
482
   * L1 fetch assoc array
483
   *
484
   * @param mysqli_result $query
485
   *
486
   * @return array|null
487
   */
488 View Code Duplication
  public function db_fetch(&$query) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
489
    $microtime = microtime(true);
490
    $result = $this->driver->mysql_fetch_assoc($query);
491
    $this->time_mysql_total += microtime(true) - $microtime;
492
493
    return $result;
494
  }
495
496
  public function db_fetch_row(&$query) {
497
    return $this->driver->mysql_fetch_row($query);
498
  }
499
500
  public function db_escape($unescaped_string) {
501
    return $this->driver->mysql_real_escape_string($unescaped_string);
502
  }
503
504
  public function driver_disconnect() {
505
    return $this->driver->mysql_close_link();
506
  }
507
508
  public function db_error() {
509
    return $this->driver->mysql_error();
510
  }
511
512
  public function db_insert_id() {
513
    return $this->driver->mysql_insert_id();
514
  }
515
516
  public function db_num_rows(&$result) {
517
    return $this->driver->mysql_num_rows($result);
518
  }
519
520
  public function db_affected_rows() {
521
    return $this->driver->mysql_affected_rows();
522
  }
523
524
  /**
525
   * @return string
526
   */
527
  public function db_get_client_info() {
528
    return $this->driver->mysql_get_client_info();
529
  }
530
531
  /**
532
   * @return string
533
   */
534
  public function db_get_server_info() {
535
    return $this->driver->mysql_get_server_info();
536
  }
537
538
  /**
539
   * @return string
540
   */
541
  public function db_get_host_info() {
542
    return $this->driver->mysql_get_host_info();
543
  }
544
545
  public function db_get_server_stat() {
546
    $result = array();
547
548
    $status = explode('  ', $this->driver->mysql_stat());
549
    foreach ($status as $value) {
550
      $row = explode(': ', $value);
551
      $result[$row[0]] = $row[1];
552
    }
553
554
    return $result;
555
  }
556
557
  /**
558
   * @return array
559
   * @throws Exception
560
   */
561
  public function db_core_show_status() {
562
    $result = array();
563
564
    $query = $this->db_sql_query('SHOW STATUS;');
565
    if (is_bool($query)) {
566
      throw new Exception('Result of SHOW STATUS command is boolean - which should never happen. Connection to DB is lost?');
567
    }
568
    while($row = db_fetch($query)) {
569
      $result[$row['Variable_name']] = $row['Value'];
570
    }
571
572
    return $result;
573
  }
574
575
  public function mysql_get_table_list() {
576
    return $this->db_sql_query('SHOW TABLES;');
577
  }
578
579
  public function mysql_get_innodb_status() {
580
    return $this->db_sql_query('SHOW ENGINE INNODB STATUS;');
581
  }
582
583
}
584