function exec($query_name, $params, $cache_id_prefix = '', $b_count_only = false, $to_reset = CCACHE_USE_MEMORY_CACHE) { global $application; CProfiler::DBLayerStart($query_name); $cache_query_id = $this->__getCacheKey($query_name, $params, $cache_id_prefix, $b_count_only); $cache_query_result = $this->cache->read($cache_query_id); CProfiler::DBQueryStatistics($query_name, $params, $cache_query_id, $cache_query_result !== NULL); if ($cache_query_result !== NULL) { //CTrace::dbg(sprintf('Found: %s', $cache_query_id)); CProfiler::DBLayerStop($query_name); CProfiler::DBCacheQueryRead(); return $cache_query_result; } else { //CTrace::dbg(sprintf('Missing: %s', $cache_query_id)); // Create query object if (!class_exists($query_name)) { _fatal(__FUNCTION__ . ': Class does not exist: ' . $query_name); } $query_obj = new $query_name(); $query_obj->initQuery($params); $query_type = $query_obj->getQueryType(); if ($query_type == DBQUERY_TYPE_SELECT) { $table_list_of_query = $this->__getTablesOfQuery($query_obj); $application->enterCriticalSection('database'); } CProfiler::DBLayerStop($query_name); if ($b_count_only === true) { $cache_query_result = $application->db->getDB_Result_num_rows($query_obj); } else { $cache_query_result = $application->db->getDB_Result($query_obj); } CProfiler::DBLayerStart($query_name); // If it is SELECT query then save all related tables if ($query_type == DBQUERY_TYPE_SELECT && $query_obj->isCachable() == true) { # - , , # , # foreach ($table_list_of_query as $table) { $this->cache->add($table, uniqid('table', true)); } $this->cache->write($cache_query_id, $cache_query_result, 0, $table_list_of_query); CProfiler::DBCacheQuerySaved(); } if ($query_type == DBQUERY_TYPE_SELECT) { $application->leaveCriticalSection(); } CProfiler::DBLayerStop($query_name); return $cache_query_result; } }