/* * 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 "sessioncontainer.h" void SessionContainer::Clear() { table.clear(); index_id.clear(); index_time.clear(); } SessionContainer::Iterator SessionContainer::Begin() { return table.begin(); } SessionContainer::Iterator SessionContainer::End() { return table.end(); } Session & SessionContainer::Back() { return table.back(); } bool SessionContainer::PushBack(const Session & session) { if( index_id.find(session.id) != index_id.end() ) // that element already exists return false; Iterator last = table.insert(table.end(), session); index_id.insert( std::make_pair(session.id, last) ); index_time.insert( std::make_pair(session.last_time, last) ); log << log3 << "SC: added session, id: " << session.id << logend; return true; } SessionContainer::Iterator SessionContainer::FindById(long id) { IndexId::iterator i; i = index_id.find(id); if( i == index_id.end() ) return table.end(); return i->second; } void SessionContainer::DelFirstByTimeInterval(time_t interval) { IndexTime::iterator i = index_time.begin(); IndexTime::iterator iold; time_t limit = std::time(0) - interval; for( ; i != index_time.end() && i->second->last_time < limit ; ) { long id = i->second->id; iold = i; ++i; // we're logging session.id (call this before table.erase()) DelFromIdIndex(iold->second); table.erase(iold->second); index_time.erase(iold); log << log3 << "SC: deleted index_time for session id: " << id << logend; log << log3 << "SC: deleted session, id: " << id << logend; } } void SessionContainer::DelFromIdIndex(SessionContainer::Iterator iter) { IndexId::iterator i; for( i = index_id.begin() ; i!=index_id.end() ; ++i) { if( i->second == iter ) { index_id.erase(i); log << log3 << "SC: deleted index_id for session id: " << iter->id << logend; break; } } } void SessionContainer::UpdateLastTime(SessionContainer::Iterator iter, time_t new_time) { IndexTime::iterator i = index_time.lower_bound(iter->last_time); bool found = false; for( ; i != index_time.end() ; ++i) { if( i->second == iter ) { index_time.erase(i); index_time.insert( std::make_pair(new_time, iter) ); iter->last_time = new_time; iter->tm_last_time = *std::localtime(&new_time); log << log3 << "SC: last time and the time index for session id: " << iter->id << " updated" << logend; found = true; break; } } if( !found ) log << log1 << "SC: cannot update the time, time index not found for session id: " << iter->id << logend; }