File indexing completed on 2024-05-12 05:25:59

0001 #include "index.h"
0002 
0003 #include "log.h"
0004 
0005 using Sink::Storage::Identifier;
0006 
0007 Index::Index(const QString &storageRoot, const QString &dbName, const QString &indexName, Sink::Storage::DataStore::AccessMode mode)
0008     : mTransaction(Sink::Storage::DataStore(storageRoot, dbName, mode).createTransaction(mode)),
0009       mDb(mTransaction.openDatabase(indexName.toLatin1(), std::function<void(const Sink::Storage::DataStore::Error &)>(), Sink::Storage::AllowDuplicates)),
0010       mName(indexName),
0011       mLogCtx("index." + indexName.toLatin1())
0012 {
0013 }
0014 
0015 Index::Index(const QString &storageRoot, const QString &name, Sink::Storage::DataStore::AccessMode mode)
0016     : mTransaction(Sink::Storage::DataStore(storageRoot, name, mode).createTransaction(mode)),
0017       mDb(mTransaction.openDatabase(name.toLatin1(), std::function<void(const Sink::Storage::DataStore::Error &)>(), Sink::Storage::AllowDuplicates)),
0018       mName(name),
0019       mLogCtx("index." + name.toLatin1())
0020 {
0021 }
0022 
0023 Index::Index(const QString &storageRoot, const Sink::Storage::DbLayout &layout, Sink::Storage::DataStore::AccessMode mode)
0024     : mTransaction(Sink::Storage::DataStore(storageRoot, layout, mode).createTransaction(mode)),
0025       mDb(mTransaction.openDatabase(layout.name, std::function<void(const Sink::Storage::DataStore::Error &)>(), Sink::Storage::AllowDuplicates)),
0026       mName(layout.name),
0027       mLogCtx("index." + layout.name)
0028 {
0029 }
0030 
0031 Index::Index(const QByteArray &name, Sink::Storage::DataStore::Transaction &transaction)
0032     : mDb(transaction.openDatabase(name, std::function<void(const Sink::Storage::DataStore::Error &)>(), Sink::Storage::AllowDuplicates)), mName(name),
0033       mLogCtx("index." + name)
0034 {
0035 }
0036 
0037 void Index::add(const Identifier &key, const QByteArray &value)
0038 {
0039     add(key.toInternalByteArray(), value);
0040 }
0041 
0042 void Index::add(const QByteArray &key, const QByteArray &value)
0043 {
0044     Q_ASSERT(!key.isEmpty());
0045     mDb.write(key, value, [&] (const Sink::Storage::DataStore::Error &error) {
0046         SinkWarningCtx(mLogCtx) << "Error while writing value" << error;
0047     });
0048 }
0049 
0050 void Index::remove(const Identifier &key, const QByteArray &value, bool ignoreRemovalFailure)
0051 {
0052     remove(key.toInternalByteArray(), value, ignoreRemovalFailure);
0053 }
0054 
0055 void Index::remove(const QByteArray &key, const QByteArray &value, bool ignoreRemovalFailure)
0056 {
0057     mDb.remove(key, value, [&] (const Sink::Storage::DataStore::Error &error) {
0058         if (!ignoreRemovalFailure || error.code != Sink::Storage::DataStore::NotFound) {
0059             SinkWarningCtx(mLogCtx) << "Error while removing value: " << key << value << error;
0060         }
0061     });
0062 }
0063 
0064 void Index::lookup(const QByteArray &key, const std::function<bool(const QByteArray &value)> &resultHandler, const std::function<void(const Error &error)> &errorHandler, bool matchSubStringKeys)
0065 {
0066     mDb.scan(key,
0067         [&](const QByteArray &key, const QByteArray &value) -> bool {
0068             return resultHandler(value);
0069         },
0070         [&](const Sink::Storage::DataStore::Error &error) {
0071             SinkWarningCtx(mLogCtx) << "Error while retrieving value:" << error << mName;
0072             errorHandler(Error(error.store, error.code, error.message));
0073         },
0074         matchSubStringKeys);
0075 }
0076 
0077 QByteArray Index::lookup(const QByteArray &key)
0078 {
0079     QByteArray result;
0080     //We have to create a deep copy, otherwise the returned data may become invalid when the transaction ends.
0081     lookup(key, [&](const QByteArray &value) { result = QByteArray(value.constData(), value.size()); return false; }, [](const Index::Error &) { });
0082     return result;
0083 }
0084 
0085 void Index::rangeLookup(const QByteArray &lowerBound, const QByteArray &upperBound,
0086         const std::function<void(const QByteArray &value)> &resultHandler,
0087         const std::function<void(const Error &error)> &errorHandler)
0088 {
0089     mDb.findAllInRange(lowerBound, upperBound,
0090             [&](const QByteArray &key, const QByteArray &value) {
0091                 resultHandler(value);
0092             },
0093             [&](const Sink::Storage::DataStore::Error &error) {
0094                 SinkWarningCtx(mLogCtx) << "Error while retrieving value:" << error << mName;
0095                 errorHandler(Error(error.store, error.code, error.message));
0096             });
0097 }