예제 #1
0
 public static function initConnections()
 {
     static::$_data['db'] = array();
     static::$_data['db.queries'] = array();
     static::$_data['db.time'] = 0;
     static::$_data['db.invalid'] = 0;
     Connections::applyFilter('_initAdapter', function ($self, $params, $chain) {
         $adapter = $chain->next($self, $params, $chain);
         $adapter->applyFilter(array('read', 'create', 'update', 'delete'), function ($self, $params, $chain) {
             $options = $params['options'];
             $query = $params['query'];
             $data = array();
             $queries = array();
             $data['start'] = microtime(true);
             $data['memory'] = memory_get_usage(true);
             if (is_object($query) && method_exists($query, 'model')) {
                 $data['name'] = $query->model() . '::' . $query->type();
             } else {
                 $data['name'] = '?';
             }
             if ($result = $chain->next($self, $params, $chain)) {
                 switch (true) {
                     case method_exists($result, 'data'):
                         $queries[] = array('explain' => $result->result()->resource()->explain(), 'query' => $result->result()->resource()->info());
                         break;
                     case $query->calculate():
                         $queries[] = array('explain' => $result->explain(), 'query' => $result->info());
                         break;
                     default:
                 }
                 $data['name'] .= ' (' . count($result) . ')';
             } else {
                 Debugger::inc('db.invalid', 1);
             }
             $data['end'] = microtime(true);
             $data['memory'] = memory_get_usage(true) - $data['memory'];
             $data['time'] = $data['end'] - $data['start'];
             Debugger::push('events', $data);
             Debugger::inc('events.time', $data['time']);
             Debugger::push('db', $data);
             Debugger::push('db.queries', $queries);
             Debugger::inc('db.time', $data['time']);
             return $result;
         });
         return $adapter;
     });
 }