summaryrefslogtreecommitdiffstats
path: root/src/libraries/qmfclient/qmailstore_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libraries/qmfclient/qmailstore_p.h')
-rw-r--r--src/libraries/qmfclient/qmailstore_p.h646
1 files changed, 646 insertions, 0 deletions
diff --git a/src/libraries/qmfclient/qmailstore_p.h b/src/libraries/qmfclient/qmailstore_p.h
new file mode 100644
index 00000000..992ef833
--- /dev/null
+++ b/src/libraries/qmfclient/qmailstore_p.h
@@ -0,0 +1,646 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt Messaging Framework.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QMAILSTORE_P_H
+#define QMAILSTORE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt Extended API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qmailstoreimplementation_p.h"
+#include <QSqlDatabase>
+#include <QCache>
+
+//#define QMAILSTORE_LOG_SQL //define to enable SQL query logging
+//#define QMAILSTORE_USE_RTTI //define if RTTI is available to assist debugging
+
+#ifdef QMAILSTORE_USE_RTTI
+#include <typeinfo>
+#endif
+
+class ProcessMutex;
+class ProcessReadLock;
+
+
+class QMailStorePrivate : public QMailStoreImplementation
+{
+ Q_OBJECT
+
+public:
+ typedef QMap<QMailMessageKey::Property, QString> MessagePropertyMap;
+ typedef QList<QMailMessageKey::Property> MessagePropertyList;
+
+ class Transaction;
+ class ReadLock;
+ class Key;
+
+ struct ReadAccess {};
+ struct WriteAccess {};
+
+ QMailStorePrivate(QMailStore* parent);
+ ~QMailStorePrivate();
+
+ virtual bool initStore();
+ void clearContent();
+
+ bool addAccount(QMailAccount *account, QMailAccountConfiguration *config,
+ QMailAccountIdList *addedAccountIds);
+
+ bool addFolder(QMailFolder *f,
+ QMailFolderIdList *addedFolderIds, QMailAccountIdList *modifiedAccountIds);
+
+ bool addMessages(const QList<QMailMessage *> &m,
+ QMailMessageIdList *addedMessageIds, QMailMessageIdList *updatedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds);
+
+ bool addMessages(const QList<QMailMessageMetaData *> &m,
+ QMailMessageIdList *addedMessageIds, QMailMessageIdList *updatedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds);
+
+ bool removeAccounts(const QMailAccountKey &key,
+ QMailAccountIdList *deletedAccounts, QMailFolderIdList *deletedFolders, QMailMessageIdList *deletedMessages, QMailMessageIdList *updatedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds);
+
+ bool removeFolders(const QMailFolderKey &key, QMailStore::MessageRemovalOption option,
+ QMailFolderIdList *deletedFolders, QMailMessageIdList *deletedMessages, QMailMessageIdList *updatedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds);
+
+ bool removeMessages(const QMailMessageKey &key, QMailStore::MessageRemovalOption option,
+ QMailMessageIdList *deletedMessages, QMailMessageIdList *updatedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds);
+
+ bool updateAccount(QMailAccount *account, QMailAccountConfiguration* config,
+ QMailAccountIdList *updatedAccountIds);
+
+ bool updateAccountConfiguration(QMailAccountConfiguration* config,
+ QMailAccountIdList *updatedAccountIds);
+
+ bool updateFolder(QMailFolder* f,
+ QMailFolderIdList *updatedFolderIds, QMailAccountIdList *modifiedAccountIds);
+
+ bool updateMessages(const QList<QPair<QMailMessageMetaData *, QMailMessage *> > &m,
+ QMailMessageIdList *updatedMessageIds, QMailMessageIdList *modifiedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds);
+
+ bool updateMessagesMetaData(const QMailMessageKey &key, const QMailMessageKey::Properties &properties, const QMailMessageMetaData &data,
+ QMailMessageIdList *updatedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds);
+
+ bool updateMessagesMetaData(const QMailMessageKey &key, quint64 messageStatus, bool set,
+ QMailMessageIdList *updatedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds);
+
+ void lock();
+ void unlock();
+
+ bool restoreToPreviousFolder(const QMailMessageKey &key,
+ QMailMessageIdList *updatedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds);
+
+ bool purgeMessageRemovalRecords(const QMailAccountId &accountId, const QStringList &serverUids);
+
+ int countAccounts(const QMailAccountKey &key) const;
+ int countFolders(const QMailFolderKey &key) const;
+ int countMessages(const QMailMessageKey &key) const;
+
+ int sizeOfMessages(const QMailMessageKey &key) const;
+
+ QMailAccountIdList queryAccounts(const QMailAccountKey &key, const QMailAccountSortKey &sortKey, uint limit, uint offset) const;
+ QMailFolderIdList queryFolders(const QMailFolderKey &key, const QMailFolderSortKey &sortKey, uint limit, uint offset) const;
+ QMailMessageIdList queryMessages(const QMailMessageKey &key, const QMailMessageSortKey &sortKey, uint limit, uint offset) const;
+
+ QMailAccount account(const QMailAccountId &id) const;
+ QMailAccountConfiguration accountConfiguration(const QMailAccountId &id) const;
+
+ QMailFolder folder(const QMailFolderId &id) const;
+
+ QMailMessage message(const QMailMessageId &id) const;
+ QMailMessage message(const QString &uid, const QMailAccountId &accountId) const;
+
+ QMailMessageMetaData messageMetaData(const QMailMessageId &id) const;
+ QMailMessageMetaData messageMetaData(const QString &uid, const QMailAccountId &accountId) const;
+ QMailMessageMetaDataList messagesMetaData(const QMailMessageKey &key, const QMailMessageKey::Properties &properties, QMailStore::ReturnOption option) const;
+
+ QMailMessageRemovalRecordList messageRemovalRecords(const QMailAccountId &parentAccountId, const QMailFolderId &parentFolderId) const;
+
+ bool registerAccountStatusFlag(const QString &name);
+ quint64 accountStatusMask(const QString &name) const;
+
+ bool registerFolderStatusFlag(const QString &name);
+ quint64 folderStatusMask(const QString &name) const;
+
+ bool registerMessageStatusFlag(const QString &name);
+ quint64 messageStatusMask(const QString &name) const;
+
+ QString buildOrderClause(const Key& key) const;
+
+ QString buildWhereClause(const Key& key, bool nested = false, bool firstClause = true) const;
+ QVariantList whereClauseValues(const Key& key) const;
+
+ static QString expandValueList(const QVariantList& valueList);
+ static QString expandValueList(int valueCount);
+
+ static QString temporaryTableName(const QMailMessageKey::ArgumentType &arg);
+
+ QMap<QString, QString> messageCustomFields(const QMailMessageId &id);
+
+ template<typename ValueType>
+ static ValueType extractValue(const QVariant& var, const ValueType &defaultValue = ValueType());
+
+ enum AttemptResult { Success = 0, Failure, DatabaseFailure };
+
+private:
+ friend class Transaction;
+ friend class ReadLock;
+
+ static ProcessMutex& contentManagerMutex(void);
+
+ ProcessMutex& databaseMutex(void) const;
+ ProcessReadLock& databaseReadLock(void) const;
+
+ static const MessagePropertyMap& messagePropertyMap();
+ static const MessagePropertyList& messagePropertyList();
+
+ static const QMailMessageKey::Properties &updatableMessageProperties();
+ static const QMailMessageKey::Properties &allMessageProperties();
+
+ QString expandProperties(const QMailMessageKey::Properties& p, bool update = false) const;
+
+ QString databaseIdentifier() const;
+
+ bool ensureVersionInfo();
+ qint64 tableVersion(const QString &name) const;
+ bool setTableVersion(const QString &name, qint64 version);
+
+ qint64 incrementTableVersion(const QString &name, qint64 current);
+ bool upgradeTableVersion(const QString &name, qint64 current, qint64 final);
+
+ bool createTable(const QString &name);
+
+ typedef QPair<QString, qint64> TableInfo;
+ bool setupTables(const QList<TableInfo> &tableList);
+
+ typedef QPair<quint64, QString> FolderInfo;
+ bool setupFolders(const QList<FolderInfo> &folderList);
+
+ bool purgeMissingAncestors();
+ bool purgeObsoleteFiles();
+
+ bool performMaintenanceTask(const QString &task, uint secondsFrequency, bool (QMailStorePrivate::*func)(void));
+
+ bool performMaintenance();
+
+ void createTemporaryTable(const QMailMessageKey::ArgumentType &arg, const QString &dataType) const;
+ void destroyTemporaryTables(void);
+
+ bool transaction(void);
+ bool commit(void);
+ void rollback(void);
+
+ void setQueryError(const QSqlError&, const QString& description = QString(), const QString& statement = QString());
+ void clearQueryError(void);
+
+ QSqlQuery prepare(const QString& sql);
+ bool execute(QSqlQuery& q, bool batch = false);
+ int queryError(void) const;
+
+ QSqlQuery performQuery(const QString& statement, bool batch, const QVariantList& bindValues, const QList<Key>& keys, const QPair<uint, uint> &constraint, const QString& descriptor);
+
+ bool executeFile(QFile &file);
+
+ QSqlQuery simpleQuery(const QString& statement, const QString& descriptor);
+ QSqlQuery simpleQuery(const QString& statement, const QVariantList& bindValues, const QString& descriptor);
+
+ QSqlQuery simpleQuery(const QString& statement, const Key& key, const QString& descriptor);
+ QSqlQuery simpleQuery(const QString& statement, const QVariantList& bindValues, const Key& key, const QString& descriptor);
+ QSqlQuery simpleQuery(const QString& statement, const QVariantList& bindValues, const QList<Key>& keys, const QString& descriptor);
+ QSqlQuery simpleQuery(const QString& statement, const QVariantList& bindValues, const QList<Key>& keys, const QPair<uint, uint> &constraint, const QString& descriptor);
+
+ QSqlQuery batchQuery(const QString& statement, const QVariantList& bindValues, const QString& descriptor);
+ QSqlQuery batchQuery(const QString& statement, const QVariantList& bindValues, const Key& key, const QString& descriptor);
+ QSqlQuery batchQuery(const QString& statement, const QVariantList& bindValues, const QList<Key>& keys, const QString& descriptor);
+
+ bool idValueExists(quint64 id, const QString& table);
+
+ bool idExists(const QMailAccountId& id, const QString& table = QString());
+ bool idExists(const QMailFolderId& id, const QString& table = QString());
+ bool idExists(const QMailMessageId& id, const QString& table = QString());
+
+ bool messageExists(const QString &serveruid, const QMailAccountId &id);
+
+ bool checkPreconditions(const QMailFolder& folder, bool update = false);
+
+ void preloadHeaderCache(const QMailMessageId& id) const;
+
+ QMailFolderIdList folderAncestorIds(const QMailFolderIdList& ids, bool inTransaction, AttemptResult *result) const;
+
+ quint64 queryStatusMap(const QString &name, const QString &context, QMap<QString, quint64> &map) const;
+
+ bool deleteMessages(const QMailMessageKey& key,
+ QMailStore::MessageRemovalOption option,
+ QMailMessageIdList& deletedMessageIds,
+ QStringList& expiredMailfiles,
+ QMailMessageIdList& updatedMessageIds,
+ QMailFolderIdList& modifiedFolders,
+ QMailAccountIdList& modifiedAccounts);
+
+ bool deleteFolders(const QMailFolderKey& key,
+ QMailStore::MessageRemovalOption option,
+ QMailFolderIdList& deletedFolderIds,
+ QMailMessageIdList& deletedMessageIds,
+ QStringList& expiredMailfiles,
+ QMailMessageIdList& updatedMessageIds,
+ QMailFolderIdList& modifiedFolderIds,
+ QMailAccountIdList& modifiedAccountIds);
+
+ bool deleteAccounts(const QMailAccountKey& key,
+ QMailAccountIdList& deletedAccountIds,
+ QMailFolderIdList& deletedFolderIds,
+ QMailMessageIdList& deletedMessageIds,
+ QStringList& expiredMailfiles,
+ QMailMessageIdList& updatedMessageIds,
+ QMailFolderIdList& modifiedFolderIds,
+ QMailAccountIdList& modifiedAccountIds);
+
+ void removeExpiredData(const QMailMessageIdList& messageIds,
+ const QStringList& mailfiles,
+ const QMailFolderIdList& folderIds = QMailFolderIdList(),
+ const QMailAccountIdList& accountIds = QMailAccountIdList());
+
+ bool obsoleteContent(const QString& identifier);
+
+ template<typename AccessType, typename FunctionType>
+ bool repeatedly(FunctionType func, const QString &description, Transaction *t = 0) const;
+
+ AttemptResult addCustomFields(quint64 id, const QMap<QString, QString> &fields, const QString &tableName);
+ AttemptResult updateCustomFields(quint64 id, const QMap<QString, QString> &fields, const QString &tableName);
+ AttemptResult customFields(quint64 id, QMap<QString, QString> *fields, const QString &tableName);
+
+ AttemptResult attemptAddAccount(QMailAccount *account, QMailAccountConfiguration* config,
+ QMailAccountIdList *addedAccountIds,
+ Transaction &t, bool commitOnSuccess);
+
+ AttemptResult attemptAddFolder(QMailFolder *folder,
+ QMailFolderIdList *addedFolderIds, QMailAccountIdList *modifiedAccountIds,
+ Transaction &t, bool commitOnSuccess);
+
+ AttemptResult attemptAddMessage(QMailMessage *message, const QString &identifier, const QStringList &references,
+ QMailMessageIdList *addedMessageIds, QMailMessageIdList *updatedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds,
+ Transaction &t, bool commitOnSuccess);
+
+ AttemptResult attemptAddMessage(QMailMessageMetaData *metaData, const QString &identifier, const QStringList &references,
+ QMailMessageIdList *addedMessageIds, QMailMessageIdList *updatedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds,
+ Transaction &t, bool commitOnSuccess);
+
+ AttemptResult attemptRemoveAccounts(const QMailAccountKey &key,
+ QMailAccountIdList *deletedAccounts, QMailFolderIdList *deletedFolders, QMailMessageIdList *deletedMessages, QMailMessageIdList *updatedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds,
+ Transaction &t, bool commitOnSuccess);
+
+ AttemptResult attemptRemoveFolders(const QMailFolderKey &key, QMailStore::MessageRemovalOption option,
+ QMailFolderIdList *deletedFolders, QMailMessageIdList *deletedMessages, QMailMessageIdList *updatedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds,
+ Transaction &t, bool commitOnSuccess);
+
+ AttemptResult attemptRemoveMessages(const QMailMessageKey &key, QMailStore::MessageRemovalOption option,
+ QMailMessageIdList *deletedMessages, QMailMessageIdList *updatedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds,
+ Transaction &t, bool commitOnSuccess);
+
+ AttemptResult attemptUpdateAccount(QMailAccount *account, QMailAccountConfiguration *config,
+ QMailAccountIdList *updatedAccountIds,
+ Transaction &t, bool commitOnSuccess);
+
+ AttemptResult attemptUpdateAccountConfiguration(QMailAccountConfiguration *config,
+ QMailAccountIdList *updatedAccountIds,
+ Transaction &t, bool commitOnSuccess);
+
+ AttemptResult attemptUpdateFolder(QMailFolder *folder,
+ QMailFolderIdList *updatedFolderIds, QMailAccountIdList *modifiedAccountIds,
+ Transaction &t, bool commitOnSuccess);
+
+ AttemptResult attemptUpdateMessage(QMailMessageMetaData *metaData, QMailMessage *mail,
+ QMailMessageIdList *updatedMessageIds, QMailMessageIdList *modifiedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds,
+ Transaction &t, bool commitOnSuccess);
+
+ AttemptResult attemptUpdateMessagesMetaData(const QMailMessageKey &key, const QMailMessageKey::Properties &props, const QMailMessageMetaData &data,
+ QMailMessageIdList *updatedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds,
+ Transaction &t, bool commitOnSuccess);
+
+ AttemptResult attemptUpdateMessagesStatus(const QMailMessageKey &key, quint64 status, bool set,
+ QMailMessageIdList *updatedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds,
+ Transaction &t, bool commitOnSuccess);
+
+ AttemptResult attemptRestoreToPreviousFolder(const QMailMessageKey &key,
+ QMailMessageIdList *updatedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds,
+ Transaction &t, bool commitOnSuccess);
+
+ AttemptResult attemptPurgeMessageRemovalRecords(const QMailAccountId &accountId, const QStringList &serverUids,
+ Transaction &t, bool commitOnSuccess);
+
+ AttemptResult attemptCountAccounts(const QMailAccountKey &key, int *result,
+ ReadLock &);
+
+ AttemptResult attemptCountFolders(const QMailFolderKey &key, int *result,
+ ReadLock &);
+
+ AttemptResult attemptCountMessages(const QMailMessageKey &key,
+ int *result,
+ ReadLock &);
+
+ AttemptResult attemptSizeOfMessages(const QMailMessageKey &key,
+ int *result,
+ ReadLock &);
+
+ AttemptResult attemptQueryAccounts(const QMailAccountKey &key, const QMailAccountSortKey &sortKey, uint limit, uint offset,
+ QMailAccountIdList *ids,
+ ReadLock &);
+
+ AttemptResult attemptQueryFolders(const QMailFolderKey &key, const QMailFolderSortKey &sortKey, uint limit, uint offset,
+ QMailFolderIdList *ids,
+ ReadLock &);
+
+ AttemptResult attemptQueryMessages(const QMailMessageKey &key, const QMailMessageSortKey &sortKey, uint limit, uint offset,
+ QMailMessageIdList *ids,
+ ReadLock &);
+
+ AttemptResult attemptAccount(const QMailAccountId &id,
+ QMailAccount *result,
+ ReadLock &);
+
+ AttemptResult attemptAccountConfiguration(const QMailAccountId &id,
+ QMailAccountConfiguration *result,
+ ReadLock &);
+
+ AttemptResult attemptFolder(const QMailFolderId &id,
+ QMailFolder *result,
+ ReadLock &);
+
+ AttemptResult attemptMessage(const QMailMessageId &id,
+ QMailMessage *result,
+ ReadLock &);
+
+ AttemptResult attemptMessage(const QString &uid, const QMailAccountId &accountId,
+ QMailMessage *result,
+ ReadLock &);
+
+ AttemptResult attemptMessageMetaData(const QMailMessageId &id,
+ QMailMessageMetaData *result,
+ ReadLock &);
+
+ AttemptResult attemptMessageMetaData(const QString &uid, const QMailAccountId &accountId,
+ QMailMessageMetaData *result,
+ ReadLock &);
+
+ AttemptResult attemptMessagesMetaData(const QMailMessageKey& key, const QMailMessageKey::Properties &properties, QMailStore::ReturnOption option,
+ QMailMessageMetaDataList *result,
+ ReadLock &);
+
+ AttemptResult attemptMessageRemovalRecords(const QMailAccountId &accountId, const QMailFolderId &parentFolderId,
+ QMailMessageRemovalRecordList *result,
+ ReadLock &);
+
+ AttemptResult attemptMessageFolderIds(const QMailMessageKey &key,
+ QMailFolderIdList *result,
+ ReadLock &);
+
+ AttemptResult attemptFolderAccountIds(const QMailFolderKey &key,
+ QMailAccountIdList *result,
+ ReadLock &);
+
+ AttemptResult attemptFolderAncestorIds(const QMailFolderIdList &ids,
+ QMailFolderIdList *result,
+ ReadLock &);
+
+ AttemptResult attemptStatusBit(const QString &name, const QString &context,
+ int *result,
+ ReadLock &);
+
+ AttemptResult attemptRegisterStatusBit(const QString &name, const QString &context, int maximum,
+ Transaction &t, bool commitOnSuccess);
+
+ AttemptResult attemptMessageId(const QString &uid, const QMailAccountId &accountId,
+ quint64 *result,
+ ReadLock &);
+
+ AttemptResult affectedByMessageIds(const QMailMessageIdList &messages, QMailFolderIdList *folderIds, QMailAccountIdList *accountIds) const;
+
+ AttemptResult affectedByFolderIds(const QMailFolderIdList &folders, QMailFolderIdList *folderIds, QMailAccountIdList *accountIds) const;
+
+ AttemptResult messagePredecessor(QMailMessageMetaData *metaData, const QStringList &references, const QString &baseSubject, bool sameSubject, QStringList *missingReferences, bool *missingAncestor);
+
+ AttemptResult identifyAncestors(const QMailMessageId &predecessorId, const QMailMessageIdList &childIds, QMailMessageIdList *ancestorIds);
+
+ AttemptResult resolveMissingMessages(const QString &identifier, const QMailMessageId &predecessorId, const QString &baseSubject, quint64 messageId, QMailMessageIdList *updatedMessageIds);
+
+ AttemptResult registerSubject(const QString &baseSubject, quint64 messageId, const QMailMessageId &predecessorId, bool missingAncestor);
+
+ QMailAccount extractAccount(const QSqlRecord& r);
+ QMailFolder extractFolder(const QSqlRecord& r);
+ QMailMessageMetaData extractMessageMetaData(const QSqlRecord& r, QMailMessageKey::Properties recordProperties, const QMailMessageKey::Properties& properties = allMessageProperties());
+ QMailMessageMetaData extractMessageMetaData(const QSqlRecord& r, const QMap<QString, QString> &customFields, const QMailMessageKey::Properties& properties = allMessageProperties());
+ QMailMessage extractMessage(const QSqlRecord& r, const QMap<QString, QString> &customFields, const QMailMessageKey::Properties& properties = allMessageProperties());
+ QMailMessageRemovalRecord extractMessageRemovalRecord(const QSqlRecord& r);
+
+ virtual void emitIpcNotification(QMailStoreImplementation::AccountUpdateSignal signal, const QMailAccountIdList &ids);
+ virtual void emitIpcNotification(QMailStoreImplementation::FolderUpdateSignal signal, const QMailFolderIdList &ids);
+ virtual void emitIpcNotification(QMailStoreImplementation::MessageUpdateSignal signal, const QMailMessageIdList &ids);
+
+ static const int messageCacheSize = 100;
+ static const int uidCacheSize = 500;
+ static const int folderCacheSize = 100;
+ static const int accountCacheSize = 10;
+ static const int lookAhead = 5;
+
+ static QString parseSql(QTextStream& ts);
+
+ static QVariantList messageValues(const QMailMessageKey::Properties& properties, const QMailMessageMetaData& data);
+ static void updateMessageValues(const QMailMessageKey::Properties& properties, const QVariantList& values, const QMap<QString, QString>& customFields, QMailMessageMetaData& metaData);
+
+ static const QString &defaultContentScheme();
+ static const QString &messagesBodyPath();
+ static QString messageFilePath(const QString &fileName);
+
+ static void extractMessageMetaData(const QSqlRecord& r, QMailMessageKey::Properties recordProperties, const QMailMessageKey::Properties& properties, QMailMessageMetaData* metaData);
+
+private:
+ template <typename T, typename KeyType>
+ class Cache
+ {
+ public:
+ Cache(unsigned int size = 10);
+ ~Cache();
+
+ T lookup(const KeyType& key) const;
+ void insert(const KeyType& key, const T& item);
+ bool contains(const KeyType& key) const;
+ void remove(const KeyType& key);
+ void clear();
+
+ private:
+ QCache<KeyType,T> mCache;
+ };
+
+ template <typename T, typename ID>
+ class IdCache : public Cache<T, quint64>
+ {
+ public:
+ IdCache(unsigned int size = 10) : Cache<T, quint64>(size) {}
+
+ T lookup(const ID& id) const;
+ void insert(const T& item);
+ bool contains(const ID& id) const;
+ void remove(const ID& id);
+ };
+
+ mutable QSqlDatabase database;
+
+ mutable QMailMessageIdList lastQueryMessageResult;
+
+ mutable IdCache<QMailMessageMetaData, QMailMessageId> messageCache;
+ mutable Cache<QMailMessageId, QPair<QMailAccountId, QString> > uidCache;
+ mutable IdCache<QMailFolder, QMailFolderId> folderCache;
+ mutable IdCache<QMailAccount, QMailAccountId> accountCache;
+
+ mutable QList<QPair<const QMailMessageKey::ArgumentType*, QString> > requiredTableKeys;
+ mutable QList<const QMailMessageKey::ArgumentType*> temporaryTableKeys;
+ QList<const QMailMessageKey::ArgumentType*> expiredTableKeys;
+
+ bool inTransaction;
+ mutable int lastQueryError;
+
+ ProcessMutex *mutex;
+ ProcessReadLock *readLock;
+
+ static ProcessMutex *contentMutex;
+
+ int globalLocks;
+};
+
+template <typename ValueType>
+ValueType QMailStorePrivate::extractValue(const QVariant &var, const ValueType &defaultValue)
+{
+ if (!qVariantCanConvert<ValueType>(var)) {
+ qWarning() << "QMailStorePrivate::extractValue - Cannot convert variant to:"
+#ifdef QMAILSTORE_USE_RTTI
+ << typeid(ValueType).name();
+#else
+ << "requested type";
+#endif
+ return defaultValue;
+ }
+
+ return qVariantValue<ValueType>(var);
+}
+
+
+template <typename T, typename KeyType>
+QMailStorePrivate::Cache<T, KeyType>::Cache(unsigned int cacheSize)
+ : mCache(cacheSize)
+{
+}
+
+template <typename T, typename KeyType>
+QMailStorePrivate::Cache<T, KeyType>::~Cache()
+{
+}
+
+template <typename T, typename KeyType>
+T QMailStorePrivate::Cache<T, KeyType>::lookup(const KeyType& key) const
+{
+ if (T* cachedItem = mCache.object(key))
+ return *cachedItem;
+
+ return T();
+}
+
+template <typename T, typename KeyType>
+void QMailStorePrivate::Cache<T, KeyType>::insert(const KeyType& key, const T& item)
+{
+ mCache.insert(key,new T(item));
+}
+
+template <typename T, typename KeyType>
+bool QMailStorePrivate::Cache<T, KeyType>::contains(const KeyType& key) const
+{
+ return mCache.contains(key);
+}
+
+template <typename T, typename KeyType>
+void QMailStorePrivate::Cache<T, KeyType>::remove(const KeyType& key)
+{
+ mCache.remove(key);
+}
+
+template <typename T, typename KeyType>
+void QMailStorePrivate::Cache<T, KeyType>::clear()
+{
+ mCache.clear();
+}
+
+
+template <typename T, typename ID>
+T QMailStorePrivate::IdCache<T, ID>::lookup(const ID& id) const
+{
+ if (id.isValid()) {
+ return Cache<T, quint64>::lookup(id.toULongLong());
+ }
+
+ return T();
+}
+
+template <typename T, typename ID>
+void QMailStorePrivate::IdCache<T, ID>::insert(const T& item)
+{
+ if (item.id().isValid()) {
+ Cache<T, quint64>::insert(item.id().toULongLong(), item);
+ }
+}
+
+template <typename T, typename ID>
+bool QMailStorePrivate::IdCache<T, ID>::contains(const ID& id) const
+{
+ return Cache<T, quint64>::contains(id.toULongLong());
+}
+
+template <typename T, typename ID>
+void QMailStorePrivate::IdCache<T, ID>::remove(const ID& id)
+{
+ Cache<T, quint64>::remove(id.toULongLong());
+}
+
+#endif