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:
Marco Bubke
2019-07-15 11:24:58 +02:00
parent 19580ab203
commit eadd37572a
3 changed files with 63 additions and 6 deletions

View File

@@ -233,16 +233,36 @@ public:
Utils::optional<ProjectPartArtefact> fetchProjectPartArtefact(FilePathId sourceId) const override Utils::optional<ProjectPartArtefact> fetchProjectPartArtefact(FilePathId sourceId) const override
{ {
try {
Sqlite::DeferredTransaction transaction{database};
ReadStatement &statement = getProjectPartArtefactsBySourceId; ReadStatement &statement = getProjectPartArtefactsBySourceId;
return statement.template value<ProjectPartArtefact, 8>(sourceId.filePathId); 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 Utils::optional<ProjectPartArtefact> fetchProjectPartArtefact(ProjectPartId projectPartId) const override
{ {
try {
Sqlite::DeferredTransaction transaction{database};
ReadStatement &statement = getProjectPartArtefactsByProjectPartId; ReadStatement &statement = getProjectPartArtefactsByProjectPartId;
return statement.template value<ProjectPartArtefact, 8>(projectPartId.projectPathId); 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 void resetIndexingTimeStamps(const ProjectPartContainers &projectsParts) override

View File

@@ -183,12 +183,10 @@ void SymbolIndexer::updateChangedPath(FilePathId filePathId,
{ {
m_fileStatusCache.update(filePathId); m_fileStatusCache.update(filePathId);
Sqlite::DeferredTransaction transaction{m_transactionInterface};
const Utils::optional<ProjectPartArtefact> const Utils::optional<ProjectPartArtefact>
optionalArtefact = m_projectPartsStorage.fetchProjectPartArtefact(filePathId); optionalArtefact = m_projectPartsStorage.fetchProjectPartArtefact(filePathId);
if (!optionalArtefact) if (!optionalArtefact)
return; return;
transaction.commit();
ProjectPartId projectPartId = optionalArtefact->projectPartId; ProjectPartId projectPartId = optionalArtefact->projectPartId;

View File

@@ -392,12 +392,31 @@ TEST_F(ProjectPartsStorage, UpdateProjectPartsIsBusy)
TEST_F(ProjectPartsStorage, FetchProjectPartArtefactBySourceIdCallsValueInStatement) TEST_F(ProjectPartsStorage, FetchProjectPartArtefactBySourceIdCallsValueInStatement)
{ {
InSequence s;
EXPECT_CALL(mockDatabase, deferredBegin());
EXPECT_CALL(getProjectPartArtefactsBySourceId, valueReturnProjectPartArtefact(1)) EXPECT_CALL(getProjectPartArtefactsBySourceId, valueReturnProjectPartArtefact(1))
.WillRepeatedly(Return(artefact)); .WillRepeatedly(Return(artefact));
EXPECT_CALL(mockDatabase, commit());
storage.fetchProjectPartArtefact(FilePathId{1}); 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) TEST_F(ProjectPartsStorage, FetchProjectPartArtefactBySourceIdReturnArtefact)
{ {
EXPECT_CALL(getProjectPartArtefactsBySourceId, valueReturnProjectPartArtefact(1)) EXPECT_CALL(getProjectPartArtefactsBySourceId, valueReturnProjectPartArtefact(1))
@@ -410,8 +429,12 @@ TEST_F(ProjectPartsStorage, FetchProjectPartArtefactBySourceIdReturnArtefact)
TEST_F(ProjectPartsStorage, FetchProjectPartArtefactByProjectPartIdCallsValueInStatement) TEST_F(ProjectPartsStorage, FetchProjectPartArtefactByProjectPartIdCallsValueInStatement)
{ {
InSequence s;
EXPECT_CALL(mockDatabase, deferredBegin());
EXPECT_CALL(getProjectPartArtefactsByProjectPartId, valueReturnProjectPartArtefact(74)) EXPECT_CALL(getProjectPartArtefactsByProjectPartId, valueReturnProjectPartArtefact(74))
.WillRepeatedly(Return(artefact)); .WillRepeatedly(Return(artefact));
EXPECT_CALL(mockDatabase, commit());
storage.fetchProjectPartArtefact(ProjectPartId{74}); storage.fetchProjectPartArtefact(ProjectPartId{74});
} }
@@ -426,6 +449,22 @@ TEST_F(ProjectPartsStorage, FetchProjectPartArtefactByProjectPartIdReturnArtefac
ASSERT_THAT(result, Eq(artefact)); 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) TEST_F(ProjectPartsStorage, ResetDependentIndexingTimeStamps)
{ {
InSequence s; InSequence s;