24
24
#include <QSqlQuery>
25
25
#include <QThreadStorage>
26
26
#include <QtCore/QHash>
27
#include <QtCore/QTimer>
28
29
using namespace Akonadi;
30
static QThreadStorage< QHash<QString, QSqlQuery>* > g_queryCache;
32
static QHash<QString, QSqlQuery>* cache()
32
// After these seconds without activity the cache is cleaned
33
CLEANUP_TIMEOUT = 30 // seconds
36
class Cache : public QObject
43
connect( &m_cleanupTimer, SIGNAL(timeout()), SLOT(cleanup()));
44
m_cleanupTimer.setSingleShot(true);
47
QSqlQuery query( const QString &queryStatement)
49
m_cleanupTimer.start( CLEANUP_TIMEOUT*1000 );
50
return m_cache.value( queryStatement );
59
public: // public, this is just a helper class
60
QHash<QString, QSqlQuery> m_cache;
61
QTimer m_cleanupTimer;
64
static QThreadStorage<Cache*> g_queryCache;
66
static Cache* perThreadCache()
34
68
if ( !g_queryCache.hasLocalData() )
35
g_queryCache.setLocalData( new QHash<QString, QSqlQuery>() );
69
g_queryCache.setLocalData( new Cache() );
36
71
return g_queryCache.localData();
39
bool QueryCache::contains(const QString& queryStatement)
74
bool QueryCache::contains(const QString &queryStatement)
41
76
if ( DbType::type( DataStore::self()->database() ) == DbType::Sqlite ) {
44
return cache()->contains( queryStatement );
79
return perThreadCache()->m_cache.contains( queryStatement );
48
QSqlQuery QueryCache::query(const QString& queryStatement)
83
QSqlQuery QueryCache::query(const QString &queryStatement)
50
return cache()->value( queryStatement );
85
return perThreadCache()->query( queryStatement );
53
void QueryCache::insert(const QString& queryStatement, const QSqlQuery& query)
88
void QueryCache::insert(const QString &queryStatement, const QSqlQuery &query)
55
90
if ( DbType::type( DataStore::self()->database() ) != DbType::Sqlite ) {
56
cache()->insert( queryStatement, query );
91
perThreadCache()->m_cache.insert( queryStatement, query );
96
#include <querycache.moc>