10#include "transaction.h"
12#include "documentdb.h"
13#include "documenturldb.h"
14#include "documentiddb.h"
15#include "positiondb.h"
16#include "documenttimedb.h"
17#include "documentdatadb.h"
20#include "enginequery.h"
22#include "andpostingiterator.h"
23#include "orpostingiterator.h"
24#include "phraseanditerator.h"
26#include "writetransaction.h"
30#include "enginedebug.h"
35#if defined _MSC_VER && !defined NVALGRIND
43#include <QMutexLocker>
47Database::Database(
const QString& path)
62Database::OpenResult Database::open(OpenMode mode)
64 QMutexLocker locker(&m_mutex);
68 return OpenResult::Success;
71 MDB_env* env =
nullptr;
75 dir.mkpath(QStringLiteral(
"."));
78 QFileInfo indexInfo(dir, QStringLiteral(
"index"));
80 if ((mode != CreateDatabase) && !indexInfo.exists()) {
81 return OpenResult::InvalidPath;
84 if (mode == CreateDatabase) {
86 qCCritical(ENGINE) << m_path <<
"does not have write permissions. Aborting";
87 return OpenResult::InvalidPath;
90 if (!indexInfo.exists()) {
91 FSUtils::disableCoW(m_path);
95 int rc = mdb_env_create(&env);
97 return OpenResult::InternalError;
104 mdb_env_set_maxdbs(env, 12);
112 size_t sizeInGByte = 256;
113 if (
sizeof(
void*) == 4) {
115 qCWarning(ENGINE) <<
"Running on 32 bit arch, limiting DB mmap to" << sizeInGByte <<
"GByte";
116 }
else if (RUNNING_ON_VALGRIND) {
119 qCWarning(ENGINE) <<
"Valgrind detected, limiting DB mmap to" << sizeInGByte <<
"GByte";
121 const size_t maximalSizeInBytes = sizeInGByte * size_t(1024) * size_t(1024) * size_t(1024);
122 mdb_env_set_mapsize(env, maximalSizeInBytes);
125 auto mdbEnvFlags = MDB_NOSUBDIR | MDB_NOMEMINIT;
126 if (mode == ReadOnlyDatabase) {
127 mdbEnvFlags |= MDB_RDONLY;
132 rc = mdb_env_open(env, arr.
constData(), mdbEnvFlags, 0664);
136 if ((rc == ENOENT) || (rc == EACCES)) {
137 return OpenResult::InvalidPath;
139 return OpenResult::InternalError;
142 rc = mdb_reader_check(env,
nullptr);
145 qCWarning(ENGINE) <<
"Database::open reader_check" << mdb_strerror(rc);
147 return OpenResult::InternalError;
154 if (mode != CreateDatabase) {
155 int rc = mdb_txn_begin(env,
nullptr, MDB_RDONLY, &txn);
157 qCWarning(ENGINE) <<
"Database::transaction ro begin" << mdb_strerror(rc);
159 return OpenResult::InternalError;
162 m_dbis.postingDbi = PostingDB::open(txn);
163 m_dbis.positionDBi = PositionDB::open(txn);
165 m_dbis.docTermsDbi = DocumentDB::open(
"docterms", txn);
166 m_dbis.docFilenameTermsDbi = DocumentDB::open(
"docfilenameterms", txn);
167 m_dbis.docXattrTermsDbi = DocumentDB::open(
"docxatrrterms", txn);
169 m_dbis.idTreeDbi = IdTreeDB::open(txn);
170 m_dbis.idFilenameDbi = IdFilenameDB::open(txn);
172 m_dbis.docTimeDbi = DocumentTimeDB::open(txn);
173 m_dbis.docDataDbi = DocumentDataDB::open(txn);
175 m_dbis.contentIndexingDbi = DocumentIdDB::open(
"indexingleveldb", txn);
176 m_dbis.failedIdDbi = DocumentIdDB::open(
"failediddb", txn);
178 m_dbis.mtimeDbi = MTimeDB::open(txn);
180 if (!m_dbis.isValid()) {
181 qCWarning(ENGINE) <<
"dbis is invalid";
184 return OpenResult::InvalidDatabase;
187 rc = mdb_txn_commit(txn);
189 qCWarning(ENGINE) <<
"Database::transaction ro commit" << mdb_strerror(rc);
191 return OpenResult::InternalError;
194 int rc = mdb_txn_begin(env,
nullptr, 0, &txn);
196 qCWarning(ENGINE) <<
"Database::transaction begin" << mdb_strerror(rc);
198 return OpenResult::InternalError;
201 m_dbis.postingDbi = PostingDB::create(txn);
202 m_dbis.positionDBi = PositionDB::create(txn);
204 m_dbis.docTermsDbi = DocumentDB::create(
"docterms", txn);
205 m_dbis.docFilenameTermsDbi = DocumentDB::create(
"docfilenameterms", txn);
206 m_dbis.docXattrTermsDbi = DocumentDB::create(
"docxatrrterms", txn);
208 m_dbis.idTreeDbi = IdTreeDB::create(txn);
209 m_dbis.idFilenameDbi = IdFilenameDB::create(txn);
211 m_dbis.docTimeDbi = DocumentTimeDB::create(txn);
212 m_dbis.docDataDbi = DocumentDataDB::create(txn);
214 m_dbis.contentIndexingDbi = DocumentIdDB::create(
"indexingleveldb", txn);
215 m_dbis.failedIdDbi = DocumentIdDB::create(
"failediddb", txn);
217 m_dbis.mtimeDbi = MTimeDB::create(txn);
219 if (!m_dbis.isValid()) {
220 qCWarning(ENGINE) <<
"dbis is invalid";
223 return OpenResult::InvalidDatabase;
226 rc = mdb_txn_commit(txn);
228 qCWarning(ENGINE) <<
"Database::transaction commit" << mdb_strerror(rc);
230 return OpenResult::InternalError;
236 return OpenResult::Success;
Implements storage for docIds without any associated data Instantiated for:
QString path(const QString &relativePath)
KIOCORE_EXPORT QString dir(const QString &fileClass)
const char * constData() const const
QByteArray encodeName(const QString &fileName)