/** * Execute the query and log some informations * * @see DbCore::query() */ public function query($sql) { $explain = false; if (preg_match('/^\\s*explain\\s+/i', $sql) || strpos($sql, _DB_PREFIX_ . 'modules_perfs')) { $explain = true; } if (!$explain) { $uniqSql = preg_replace('/[\'"][a-f0-9]{32}[\'"]/', '<span style="color:blue">XX</span>', $sql); $uniqSql = preg_replace('/[0-9]+/', '<span style="color:blue">XX</span>', $uniqSql); if (!isset($this->uniqQueries[$uniqSql])) { $this->uniqQueries[$uniqSql] = 0; } $this->uniqQueries[$uniqSql]++; // No cache for query if ($this->disableCache && !stripos($sql, 'SQL_NO_CACHE')) { $sql = preg_replace('/^\\s*select\\s+/i', 'SELECT SQL_NO_CACHE ', trim($sql)); } // Get tables in query preg_match_all('/(from|join)\\s+`?' . _DB_PREFIX_ . '([a-z0-9_-]+)/ui', $sql, $matches); foreach ($matches[2] as $table) { if (!isset($this->tables[$table])) { $this->tables[$table] = 0; } $this->tables[$table]++; } $start = microtime(true); } // Execute query $result = parent::query($sql); if (!$explain) { $end = microtime(true); $stack = debug_backtrace(false); while (preg_match('@[/\\\\]classes[/\\\\]db[/\\\\]@i', $stack[0]['file'])) { array_shift($stack); } $stack_light = array(); foreach ($stack as $call) { $stack_light[] = array('file' => isset($call['file']) ? $call['file'] : 'undefined', 'line' => isset($call['line']) ? $call['line'] : 'undefined'); } $this->queries[] = array('query' => $sql, 'time' => $end - $start, 'stack' => $stack_light); } return $result; }
/** * Execute the query and log some informations * * @see DbCore::query() */ public function query($sql) { $explain = false; if (preg_match('/^\\s*explain\\s+/i', $sql)) { $explain = true; } if (!$explain) { $uniqSql = preg_replace('/[0-9]+/', '<span style="color:blue">XX</span>', $sql); if (!isset($this->uniqQueries[$uniqSql])) { $this->uniqQueries[$uniqSql] = 0; } $this->uniqQueries[$uniqSql]++; // No cache for query if ($this->disableCache) { $sql = preg_replace('/^\\s*select\\s+/i', 'SELECT SQL_NO_CACHE ', trim($sql)); } // Get tables in quer preg_match_all('/(from|join)\\s+`?' . _DB_PREFIX_ . '([a-z0-9_-]+)/ui', $sql, $matches); foreach ($matches[2] as $table) { if (!isset($this->tables[$table])) { $this->tables[$table] = 0; } $this->tables[$table]++; } // Execute query $start = microtime(true); } $result = parent::query($sql); if (!$explain) { $end = microtime(true); // Save details $timeSpent = $end - $start; $trace = debug_backtrace(false); while (preg_match('@[/\\\\]classes[/\\\\]db[/\\\\]@i', $trace[0]['file'])) { array_shift($trace); } $this->queries[] = array('query' => $sql, 'time' => $timeSpent, 'file' => $trace[0]['file'], 'line' => $trace[0]['line']); } return $result; }