winix/templates/patterncacher.cpp

140 lines
2.8 KiB
C++
Executable File

/*
* This file is a part of CMSLU -- Content Management System like Unix
* and is not publicly distributed
*
* Copyright (c) 2008-2009, Tomasz Sowa
* All rights reserved.
*
*/
#include "patterncacher.h"
#include "../core/data.h"
#include "../core/log.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_index<how_many_delete && erase_index<erase_tab.size() ; ++erase_index)
{
log << log2 << "PC: deleting from cache, id: " << erase_tab[erase_index].iter->second.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<PatternTab::iterator, bool> 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);
}