163 lines
3.1 KiB
C++
Executable File
163 lines
3.1 KiB
C++
Executable File
/*
|
|
* 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_index<how_many_delete && erase_index<erase_tab.size() ; ++erase_index)
|
|
{
|
|
log << log2 << "PC: deleting ezc pattern from the cache, id: "
|
|
<< erase_tab[erase_index].iter->second.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<PatternTab::iterator, bool> 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();
|
|
}
|
|
|
|
|