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
|
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
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user