forked from qt-creator/qt-creator
Clang: Move transactions to storage
We call the function anyway only isolated from other queries, so we can move the transaction guards to the project storage. Change-Id: I7cca26b25c2258856c68821671085c0a68044693 Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
@@ -233,16 +233,36 @@ public:
|
||||
|
||||
Utils::optional<ProjectPartArtefact> fetchProjectPartArtefact(FilePathId sourceId) const override
|
||||
{
|
||||
ReadStatement &statement = getProjectPartArtefactsBySourceId;
|
||||
try {
|
||||
Sqlite::DeferredTransaction transaction{database};
|
||||
|
||||
return statement.template value<ProjectPartArtefact, 8>(sourceId.filePathId);
|
||||
ReadStatement &statement = getProjectPartArtefactsBySourceId;
|
||||
|
||||
auto value = statement.template value<ProjectPartArtefact, 8>(sourceId.filePathId);
|
||||
|
||||
transaction.commit();
|
||||
|
||||
return value;
|
||||
} catch (const Sqlite::StatementIsBusy &) {
|
||||
return fetchProjectPartArtefact(sourceId);
|
||||
}
|
||||
}
|
||||
|
||||
Utils::optional<ProjectPartArtefact> fetchProjectPartArtefact(ProjectPartId projectPartId) const override
|
||||
{
|
||||
ReadStatement &statement = getProjectPartArtefactsByProjectPartId;
|
||||
try {
|
||||
Sqlite::DeferredTransaction transaction{database};
|
||||
|
||||
return statement.template value<ProjectPartArtefact, 8>(projectPartId.projectPathId);
|
||||
ReadStatement &statement = getProjectPartArtefactsByProjectPartId;
|
||||
|
||||
auto value = statement.template value<ProjectPartArtefact, 8>(projectPartId.projectPathId);
|
||||
|
||||
transaction.commit();
|
||||
|
||||
return value;
|
||||
} catch (const Sqlite::StatementIsBusy &) {
|
||||
return fetchProjectPartArtefact(projectPartId);
|
||||
}
|
||||
}
|
||||
|
||||
void resetIndexingTimeStamps(const ProjectPartContainers &projectsParts) override
|
||||
|
@@ -183,12 +183,10 @@ void SymbolIndexer::updateChangedPath(FilePathId filePathId,
|
||||
{
|
||||
m_fileStatusCache.update(filePathId);
|
||||
|
||||
Sqlite::DeferredTransaction transaction{m_transactionInterface};
|
||||
const Utils::optional<ProjectPartArtefact>
|
||||
optionalArtefact = m_projectPartsStorage.fetchProjectPartArtefact(filePathId);
|
||||
if (!optionalArtefact)
|
||||
return;
|
||||
transaction.commit();
|
||||
|
||||
ProjectPartId projectPartId = optionalArtefact->projectPartId;
|
||||
|
||||
|
@@ -392,12 +392,31 @@ TEST_F(ProjectPartsStorage, UpdateProjectPartsIsBusy)
|
||||
|
||||
TEST_F(ProjectPartsStorage, FetchProjectPartArtefactBySourceIdCallsValueInStatement)
|
||||
{
|
||||
InSequence s;
|
||||
|
||||
EXPECT_CALL(mockDatabase, deferredBegin());
|
||||
EXPECT_CALL(getProjectPartArtefactsBySourceId, valueReturnProjectPartArtefact(1))
|
||||
.WillRepeatedly(Return(artefact));
|
||||
EXPECT_CALL(mockDatabase, commit());
|
||||
|
||||
storage.fetchProjectPartArtefact(FilePathId{1});
|
||||
}
|
||||
|
||||
TEST_F(ProjectPartsStorage, FetchProjectPartArtefactBySourceIdCallsValueInStatementIsBusy)
|
||||
{
|
||||
InSequence s;
|
||||
|
||||
EXPECT_CALL(mockDatabase, deferredBegin());
|
||||
EXPECT_CALL(getProjectPartArtefactsBySourceId, valueReturnProjectPartArtefact(1))
|
||||
.WillOnce(Throw(Sqlite::StatementIsBusy{""}));
|
||||
EXPECT_CALL(mockDatabase, rollback());
|
||||
EXPECT_CALL(mockDatabase, deferredBegin());
|
||||
EXPECT_CALL(getProjectPartArtefactsBySourceId, valueReturnProjectPartArtefact(1))
|
||||
.WillRepeatedly(Return(artefact));
|
||||
EXPECT_CALL(mockDatabase, commit());
|
||||
|
||||
storage.fetchProjectPartArtefact(FilePathId{1});
|
||||
}
|
||||
TEST_F(ProjectPartsStorage, FetchProjectPartArtefactBySourceIdReturnArtefact)
|
||||
{
|
||||
EXPECT_CALL(getProjectPartArtefactsBySourceId, valueReturnProjectPartArtefact(1))
|
||||
@@ -410,8 +429,12 @@ TEST_F(ProjectPartsStorage, FetchProjectPartArtefactBySourceIdReturnArtefact)
|
||||
|
||||
TEST_F(ProjectPartsStorage, FetchProjectPartArtefactByProjectPartIdCallsValueInStatement)
|
||||
{
|
||||
InSequence s;
|
||||
|
||||
EXPECT_CALL(mockDatabase, deferredBegin());
|
||||
EXPECT_CALL(getProjectPartArtefactsByProjectPartId, valueReturnProjectPartArtefact(74))
|
||||
.WillRepeatedly(Return(artefact));
|
||||
EXPECT_CALL(mockDatabase, commit());
|
||||
|
||||
storage.fetchProjectPartArtefact(ProjectPartId{74});
|
||||
}
|
||||
@@ -426,6 +449,22 @@ TEST_F(ProjectPartsStorage, FetchProjectPartArtefactByProjectPartIdReturnArtefac
|
||||
ASSERT_THAT(result, Eq(artefact));
|
||||
}
|
||||
|
||||
TEST_F(ProjectPartsStorage, FetchProjectPartArtefactByProjectPartIdReturnArtefactIsBusy)
|
||||
{
|
||||
InSequence s;
|
||||
|
||||
EXPECT_CALL(mockDatabase, deferredBegin());
|
||||
EXPECT_CALL(getProjectPartArtefactsByProjectPartId, valueReturnProjectPartArtefact(74))
|
||||
.WillOnce(Throw(Sqlite::StatementIsBusy{""}));
|
||||
EXPECT_CALL(mockDatabase, rollback());
|
||||
EXPECT_CALL(mockDatabase, deferredBegin());
|
||||
EXPECT_CALL(getProjectPartArtefactsByProjectPartId, valueReturnProjectPartArtefact(74))
|
||||
.WillRepeatedly(Return(artefact));
|
||||
EXPECT_CALL(mockDatabase, commit());
|
||||
|
||||
storage.fetchProjectPartArtefact(ProjectPartId{74});
|
||||
}
|
||||
|
||||
TEST_F(ProjectPartsStorage, ResetDependentIndexingTimeStamps)
|
||||
{
|
||||
InSequence s;
|
||||
|
Reference in New Issue
Block a user