/* * This file is a part of CMSLU -- Content Management System like Unix * and is not publicly distributed * * Copyright (c) 2008, Tomasz Sowa * All rights reserved. * */ #include "patterncacher.h" PatternCacher::PatternCacher() { // !! tymczasowe wartosci dla testow when_delete_patterns = 3; // 130 how_many_delete = 2; // 30 } void PatternCacher::CheckTableSize() { 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 << logend; pattern_tab.erase(erase_tab[erase_index].iter); } } void PatternCacher::CreatePattern(const Item & item, Ezc::Pattern & pattern) { pattern.allow_include = false; pattern.ParseString(item.content); } Ezc::Pattern * PatternCacher::AddPattern(const Item & item) { CheckTableSize(); 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 an 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 a 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() ) { log << log2 << "PC: there is no such an item to update, id: " << item.id << ", url: " << item.url << logend; 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() ) { log << log2 << "PC: there is no such an item to delete, id: " << item.id << ", url: " << item.url << logend; return; } log << log2 << "PC: deleted pattern, id: " << item.id << ", url: " << item.url << logend; pattern_tab.erase(i); }