/* * This file is a part of Winix * and is not publicly distributed * * Copyright (c) 2008-2011, Tomasz Sowa * All rights reserved. * */ #include "patterncacher.h" #include "core/log.h" PatternCacher::PatternCacher() { when_delete_patterns = 13; how_many_delete = 3; ezc_fun = 0; } void PatternCacher::SetEzcFunctions(TemplatesFunctions::EzcFun * fun) { ezc_fun = fun; } void PatternCacher::SetWhenDelete(size_t when_delete, size_t how_many_del) { when_delete_patterns = when_delete; how_many_delete = how_many_del; } void PatternCacher::DeleteOldPatterns() { if( pattern_tab.size() < when_delete_patterns ) return; PatternTab::iterator i; PatternErase pe; size_t erase_index; erase_tab.resize(pattern_tab.size()); for( i=pattern_tab.begin(), erase_index=0 ; i!=pattern_tab.end() ; ++i, ++erase_index) { pe.used = i->second.used; pe.iter = i; erase_tab[erase_index] = pe; } // sorting through 'used' std::sort(erase_tab.begin(), erase_tab.end()); for(erase_index = 0 ; erase_indexsecond.item_id << ", item used: " << erase_tab[erase_index].used << " time(s)" << logend; pattern_tab.erase(erase_tab[erase_index].iter); } } void PatternCacher::CreatePattern(const Item & item, Ezc::Pattern & pattern) { pattern.AllowInclude(false); pattern.ParseString(item.content); if( ezc_fun ) pattern.CacheFunctions(*ezc_fun); } Ezc::Pattern * PatternCacher::AddPattern(const Item & item) { // don't call DeleteOldPatterns() here // because you can delete a pattern which is in use // (think about ezc functions: item run, insert_page etc) PatternUsed pu; CreatePattern(item, pu.pattern); pu.used = 1; pu.item_id = item.id; std::pair res = pattern_tab.insert( std::make_pair(item.id, pu) ); log << log2 << "PC: added ezc pattern, item_id: " << item.id << ", url: " << item.url << logend; return &(res.first->second.pattern); } Ezc::Pattern * PatternCacher::GetPattern(const Item & item) { PatternTab::iterator i; i = pattern_tab.find(item.id); if( i == pattern_tab.end() ) return AddPattern(item); else { log << log2 << "PC: taking pattern from the cache, id: " << item.id << ", url: " << item.url << logend; ++(i->second.used); return &(i->second.pattern); } } void PatternCacher::UpdatePattern(const Item & item) { PatternTab::iterator i; i = pattern_tab.find(item.id); if( i == pattern_tab.end() ) return; ++(i->second.used); CreatePattern(item, i->second.pattern); log << log2 << "PC: updated pattern, id: " << item.id << ", url: " << item.url << logend; } void PatternCacher::DeletePattern(const Item & item) { PatternTab::iterator i; i = pattern_tab.find(item.id); if( i == pattern_tab.end() ) return; log << log2 << "PC: deleted pattern, id: " << item.id << ", url: " << item.url << logend; pattern_tab.erase(i); } size_t PatternCacher::Size() { return pattern_tab.size(); }