public function collect()
 {
     /** @var Item[] $succeed */
     $succeed = (array) $this->profiler->getProfiles();
     /** @var Item[] $failed */
     $failed = (array) $this->profiler->getFailedProfiles();
     $data = array('nb_statements' => count($succeed) + count($failed), 'nb_failed_statements' => count($failed), 'accumulated_duration' => $this->profiler->getTotalElapsedSeconds(), 'statements' => array());
     $renderOrNot = $this->renderSqlWithParams;
     $show_conn = $this->showConnection;
     foreach ($failed as $profile) {
         $data['statements'][] = array('sql' => $renderOrNot ? $profile->getRealSQL() : $profile->getSQLStatement(), 'params' => $profile->getSqlVariables(), 'is_success' => false, 'stmt_id' => $profile->source, 'error_code' => $profile->err_code, 'error_message' => $profile->err_msg, 'connection' => $show_conn ? $profile->connection : null);
     }
     foreach ($succeed as $profile) {
         $data['statements'][] = array('sql' => $renderOrNot ? $profile->getRealSQL() : $profile->getSQLStatement(), 'params' => $profile->getSqlVariables(), 'row_count' => $profile->affect_rows, 'stmt_id' => $profile->source, 'connection' => $show_conn ? $profile->connection : null, 'is_success' => true, 'duration' => $profile->getTotalElapsedSeconds(), 'duration_str' => $this->getDataFormatter()->formatDuration($profile->getTotalElapsedSeconds()));
         if ($explains = $profile->explain) {
             foreach ($explains as $explain) {
                 $data['statements'][] = array('sql' => ' - EXPLAIN #' . $explain->id . ': `' . $explain->table . '` (' . $explain->select_type . ')', 'params' => (array) $explain, 'row_count' => $explain->rows, 'stmt_id' => $explain->id, 'is_success' => true);
             }
         }
     }
     $data['accumulated_duration_str'] = $this->getDataFormatter()->formatDuration($data['accumulated_duration']);
     return $data;
 }
 /**
  * @param Adapter $db
  */
 public function attachDb($db)
 {
     if ($this->shouldCollect('db', true)) {
         static $profiler, $eventsManager, $queryCollector;
         $config = $this->config;
         if (!$profiler) {
             $profiler = new Profiler();
         }
         try {
             if (!$queryCollector) {
                 $queryCollector = new QueryCollector($profiler);
                 if ($config->options->db->get('with_params', false)) {
                     $queryCollector->setRenderSqlWithParams();
                 }
                 if ($config->options->db->backtrace) {
                     $queryCollector->setFindSource(true);
                 }
                 if ($config->options->db->get('show_conn', false)) {
                     $queryCollector->setShowConnection(true);
                 }
                 if ($config->options->db->get('explain', false)) {
                     $profiler->setExplainQuery(true);
                 }
                 $this->addCollector($queryCollector);
             }
         } catch (\Exception $e) {
             $this->addException(new Exception('Cannot add listen to Queries for Phalcon Debugbar: ' . $e->getMessage(), $e->getCode(), $e));
         }
         if (is_string($db)) {
             $db = $this->di[$db];
         }
         $pdo = $db->getInternalHandler();
         $pdo->setAttribute(\PDO::ATTR_ERRMODE, $config->options->db->error_mode);
         if (!$eventsManager) {
             $eventsManager = $db->getEventsManager();
             if (!is_object($eventsManager)) {
                 $eventsManager = new Manager();
             }
             $eventsManager->attach('db', function (Event $event, Adapter $db, $params) use($profiler, $queryCollector) {
                 $profiler->setDb($db);
                 if ($event->getType() == 'beforeQuery') {
                     $sql = $db->getRealSQLStatement();
                     $bindTypes = $db->getSQLBindTypes();
                     if (stripos(strtr($sql, [' ' => '']), 'SELECTIF(COUNT(*)>0,1,0)FROM`INFORMATION_SCHEMA`.`TABLES`') === false && stripos($sql, 'DESCRIBE') !== 0) {
                         $profiler->startProfile($sql, $params, $bindTypes);
                         if ($queryCollector->getFindSource()) {
                             try {
                                 $source = $queryCollector->findSource();
                                 $profiler->setSource($source);
                             } catch (\Exception $e) {
                             }
                         }
                     }
                 }
                 if ($event->getType() == 'afterQuery') {
                     $sql = $db->getRealSQLStatement();
                     if (stripos(strtr($sql, [' ' => '']), 'SELECTIF(COUNT(*)>0,1,0)FROM`INFORMATION_SCHEMA`.`TABLES`') === false && stripos($sql, 'DESCRIBE') !== 0) {
                         $profiler->stopProfile();
                     }
                 }
             });
         }
         $db->setEventsManager($eventsManager);
     }
 }