You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/tdesu/tdesud/repo.cpp

189 lines
4.3 KiB

/* vi: ts=8 sts=4 sw=4
*
* This file is part of the KDE project, module tdesu.
* Copyright (C) 1999,2000 Geert Jansen <g.t.jansen@stud.tue.nl>
*/
#include <time.h>
#include <assert.h>
#include <tqcstring.h>
#include <tqmap.h>
#include <tqvaluestack.h>
#include <kdebug.h>
#include "repo.h"
Repository::Repository()
{
head_time = (unsigned) -1;
}
Repository::~Repository()
{}
void Repository::add(const TQCString &key, Data_entry &data)
{
RepoIterator it = repo.find(key);
if (it != repo.end())
remove(key);
if (data.timeout == 0)
data.timeout = (unsigned) -1;
else
data.timeout += time(0L);
head_time = TQMIN(head_time, data.timeout);
repo.insert(key, data);
}
int Repository::remove(const TQCString &key)
{
if( key.isEmpty() )
return -1;
RepoIterator it = repo.find(key);
if (it == repo.end())
return -1;
it.data().value.fill('x');
it.data().group.fill('x');
repo.remove(it);
return 0;
}
int Repository::removeSpecialKey(const TQCString &key)
{
int found = -1;
if ( !key.isEmpty() )
{
TQValueStack<TQCString> rm_keys;
for (RepoCIterator it=repo.begin(); it!=repo.end(); ++it)
{
if ( key.find( static_cast<const char *>(it.data().group) ) == 0 &&
it.key().find( static_cast<const char *>(key) ) >= 0 )
{
rm_keys.push(it.key());
found = 0;
}
}
while (!rm_keys.isEmpty())
{
kdDebug(1205) << "Removed key: " << rm_keys.top() << endl;
remove(rm_keys.pop());
}
}
return found;
}
int Repository::removeGroup(const TQCString &group)
{
int found = -1;
if ( !group.isEmpty() )
{
TQValueStack<TQCString> rm_keys;
for (RepoCIterator it=repo.begin(); it!=repo.end(); ++it)
{
if (it.data().group == group)
{
rm_keys.push(it.key());
found = 0;
}
}
while (!rm_keys.isEmpty())
{
kdDebug(1205) << "Removed key: " << rm_keys.top() << endl;
remove(rm_keys.pop());
}
}
return found;
}
int Repository::hasGroup(const TQCString &group) const
{
if ( !group.isEmpty() )
{
RepoCIterator it;
for (it=repo.begin(); it!=repo.end(); ++it)
{
if (it.data().group == group)
return 0;
}
}
return -1;
}
TQCString Repository::findKeys(const TQCString &group, const char *sep ) const
{
TQCString list="";
if( !group.isEmpty() )
{
kdDebug(1205) << "Looking for matching key with group key: " << group << endl;
int pos;
TQCString key;
RepoCIterator it;
for (it=repo.begin(); it!=repo.end(); ++it)
{
if (it.data().group == group)
{
key = it.key().copy();
kdDebug(1205) << "Matching key found: " << key << endl;
pos = key.findRev(sep);
key.truncate( pos );
key.remove(0, 2);
if (!list.isEmpty())
{
// Add the same keys only once please :)
if( !list.contains(static_cast<const char *>(key)) )
{
kdDebug(1205) << "Key added to list: " << key << endl;
list += '\007'; // I do not know
list.append(key);
}
}
else
list = key;
}
}
}
return list;
}
TQCString Repository::find(const TQCString &key) const
{
if( key.isEmpty() )
return 0;
RepoCIterator it = repo.find(key);
if (it == repo.end())
return 0;
return it.data().value;
}
int Repository::expire()
{
unsigned current = time(0L);
if (current < head_time)
return 0;
unsigned t;
TQValueStack<TQCString> keys;
head_time = (unsigned) -1;
RepoIterator it;
for (it=repo.begin(); it!=repo.end(); ++it)
{
t = it.data().timeout;
if (t <= current)
keys.push(it.key());
else
head_time = TQMIN(head_time, t);
}
int n = keys.count();
while (!keys.isEmpty())
remove(keys.pop());
return n;
}