. namespace hoplite\data; use \hoplite\base\Profiling; require_once HOPLITE_ROOT . '/base/profiling.php'; /*! A wrapper class around PDO that profiles all calls to the database. This can be used as a drop-in for \PDO, though it sets the PDO::ATTR_STATEMENT_CLASS to a custom instance. */ class ProfilingPDO extends \PDO { private $traces = array(); private $statements = array(); public function __construct() { $args = func_get_args(); call_user_func_array('parent::__construct', $args); $this->SetAttribute(\PDO::ATTR_STATEMENT_CLASS, array('\\hoplite\\data\\ProfilingPDOStatement', array($this))); } public function exec() { $start = microtime(true); $args = func_get_args(); $r = call_user_func_array('parent::exec', $args); $this->traces[] = array( 'start' => $start, 'end' => microtime(true), 'trace' => debug_backtrace(), 'query' => $statement, ); return $r; } public function query() { $start = microtime(true); $args = func_get_args(); $r = call_user_func_array('parent::query', $args); $this->traces[] = array( 'start' => $start, 'end' => microtime(true), 'trace' => debug_backtrace(), 'query' => $args[0], ); return $r; } public function prepare() { $start = microtime(true); $args = func_get_args(); $r = call_user_func_array('parent::prepare', $args); $this->traces[] = array( 'start' => $start, 'end' => microtime(true), 'trace' => debug_backtrace(), 'query' => $args[0], 'prepare' => TRUE, ); return $r; } /*! Returns the array of all the traces. */ public function GetTraces() { return $this->traces; } /*! Generates a block of HTML that displays information about the query traces. */ public function ConstructHTMLDebugBlock() { $debug = ''; $debug .= "
\n"; $debug .= '' . "\n\t"; $debug .= ''; foreach ($this->traces as $query) { $italic = isset($query['prepare']) && $query['prepare'] ? 'font-style: italic' : ''; $debug .= "\n\t"; $debug .= "\n\t\t\n\t"; } $debug .= "\n
Query Debug: ' . sizeof($this->traces) . ' Total
"; $debug .= "\n\t\t\t$query[query]\n\n"; if (isset($query['params'])) { $debug .= "\t\t\t
    \n\t\t\t\t
  1. "; $debug .= implode("
  2. \n\t\t\t\t
  3. ", $query['params']); $debug .= "
  4. \n\t\t\t
\n"; } $debug .= "\n\t\t\t
(" . ($query['end'] - $query['start']) . ")
\n"; $debug .= "\n\t\t
\n\n\n"; return $debug; } /*! Internal function that records a query trace. This is public only for use b ProfilingPDOStatement. */ public function RecordTrace(array $trace) { $this->traces[] = $trace; } } /*! A companion to ProfilingPDO that profiles prepared statements. */ class ProfilingPDOStatement extends \PDOStatement { private $pdo = NULL; protected function __construct(ProfilingPDO $pdo) { $this->pdo = $pdo; } public function execute() { $start = microtime(true); $args = func_get_args(); $r = call_user_func_array('parent::execute', $args); $this->pdo->RecordTrace(array( 'start' => $start, 'end' => microtime(true), 'trace' => debug_backtrace(), 'query' => $this->queryString, 'params' => $args[0], )); } }