From f52ed4fd64994985f1061c5fcd20dccaa61fbc67 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sat, 6 May 2017 12:37:30 +0200 Subject: A defined table layout --- common/storage.h | 7 +++++++ common/storage/entitystore.cpp | 33 ++++++++++++++++++++++++++++++--- common/storage_lmdb.cpp | 21 ++++++++++++++++----- 3 files changed, 53 insertions(+), 8 deletions(-) (limited to 'common') diff --git a/common/storage.h b/common/storage.h index d1dda3e..42cdcac 100644 --- a/common/storage.h +++ b/common/storage.h @@ -25,10 +25,16 @@ #include #include #include +#include namespace Sink { namespace Storage { +struct DbLayout { + QByteArray name; + QMap tables; +}; + class SINK_EXPORT DataStore { public: @@ -151,6 +157,7 @@ public: }; DataStore(const QString &storageRoot, const QString &name, AccessMode mode = ReadOnly); + DataStore(const QString &storageRoot, const DbLayout &layout, AccessMode mode = ReadOnly); ~DataStore(); Transaction createTransaction(AccessMode mode = ReadWrite, const std::function &errorHandler = std::function()); diff --git a/common/storage/entitystore.cpp b/common/storage/entitystore.cpp index 04760f7..9539bec 100644 --- a/common/storage/entitystore.cpp +++ b/common/storage/entitystore.cpp @@ -36,6 +36,33 @@ using namespace Sink; using namespace Sink::Storage; +static Sink::Storage::DbLayout dbLayout(const QByteArray &instanceId) +{ + return Sink::Storage::DbLayout { + instanceId, + { + {"folder.main", 0}, + {"folder.index.name", 1}, + {"folder.index.parent", 1}, + {"mail.main", 0}, + {"mail.index.date", 1}, + {"mail.index.folder", 1}, + {"mail.index.folder.sort.date", 0}, + {"mail.index.messageId", 1}, + {"mail.index.messageIdthreadId", 1}, + {"mail.index.parentMessageId", 1}, + {"mail.index.subjectthreadId", 1}, + {"mail.index.threadIdmessageId", 1}, + {"revisionType", 0}, + {"revisions", 0}, + {"uids", 0}, + {"default", 0}, + {"__flagtable", 0} + } + }; +} + + class EntityStore::Private { public: Private(const ResourceContext &context, const Sink::Log::Context &ctx) : resourceContext(context), logCtx(ctx.subContext("entitystore")) {} @@ -47,7 +74,7 @@ public: bool exists() { - return Sink::Storage::DataStore(Sink::storageLocation(), resourceContext.instanceId(), DataStore::ReadOnly).exists(); + return Sink::Storage::DataStore(Sink::storageLocation(), dbLayout(resourceContext.instanceId()), DataStore::ReadOnly).exists(); } DataStore::Transaction &getTransaction() @@ -56,7 +83,7 @@ public: return transaction; } - Sink::Storage::DataStore store(Sink::storageLocation(), resourceContext.instanceId(), DataStore::ReadOnly); + Sink::Storage::DataStore store(Sink::storageLocation(), dbLayout(resourceContext.instanceId()), DataStore::ReadOnly); transaction = store.createTransaction(DataStore::ReadOnly); return transaction; } @@ -110,7 +137,7 @@ void EntityStore::startTransaction(Sink::Storage::DataStore::AccessMode accessMo { SinkTraceCtx(d->logCtx) << "Starting transaction: " << accessMode; Q_ASSERT(!d->transaction); - Sink::Storage::DataStore store(Sink::storageLocation(), d->resourceContext.instanceId(), accessMode); + Sink::Storage::DataStore store(Sink::storageLocation(), dbLayout(d->resourceContext.instanceId()), accessMode); d->transaction = store.createTransaction(accessMode); } diff --git a/common/storage_lmdb.cpp b/common/storage_lmdb.cpp index cb7bca4..ef4bd17 100644 --- a/common/storage_lmdb.cpp +++ b/common/storage_lmdb.cpp @@ -711,7 +711,7 @@ QList DataStore::Transaction::getDatabaseNames() const class DataStore::Private { public: - Private(const QString &s, const QString &n, AccessMode m); + Private(const QString &s, const QString &n, AccessMode m, const DbLayout &layout = {}); ~Private(); QString storageRoot; @@ -721,7 +721,7 @@ public: AccessMode mode; }; -DataStore::Private::Private(const QString &s, const QString &n, AccessMode m) : storageRoot(s), name(n), env(0), mode(m) +DataStore::Private::Private(const QString &s, const QString &n, AccessMode m, const DbLayout &layout) : storageRoot(s), name(n), env(0), mode(m) { const QString fullPath(storageRoot + '/' + name); QFileInfo dirInfo(fullPath); @@ -772,9 +772,16 @@ DataStore::Private::Private(const QString &s, const QString &n, AccessMode m) : bool noLock = true; bool requestedRead = m == ReadOnly; auto t = Transaction(new Transaction::Private(requestedRead, nullptr, name, env, noLock)); - for (const auto &db : t.getDatabaseNames()) { - //Get dbi to store for future use. - t.openDatabase(db); + if (!layout.tables.isEmpty()) { + for (auto it = layout.tables.constBegin(); it != layout.tables.constEnd(); it++) { + bool allowDuplicates = it.value(); + t.openDatabase(it.key(), {}, allowDuplicates); + } + } else { + for (const auto &db : t.getDatabaseNames()) { + //Get dbi to store for future use. + t.openDatabase(db); + } } //To persist the dbis (this is also necessary for read-only transactions) t.commit(); @@ -794,6 +801,10 @@ DataStore::DataStore(const QString &storageRoot, const QString &name, AccessMode { } +DataStore::DataStore(const QString &storageRoot, const DbLayout &dbLayout, AccessMode mode) : d(new Private(storageRoot, dbLayout.name, mode, dbLayout)) +{ +} + DataStore::~DataStore() { delete d; -- cgit v1.2.3