ClangPchManager: Fix transactions in precompiled header storage

Change-Id: Ia0333ef7110c97a42d73c70c33157849323fb34d
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Marco Bubke
2019-07-25 15:30:46 +02:00
parent 578b70e998
commit d086bbdc9a
2 changed files with 50 additions and 3 deletions

View File

@@ -133,10 +133,11 @@ public:
auto value = fetchSystemPrecompiledHeaderPathStatement.template value<FilePath>( auto value = fetchSystemPrecompiledHeaderPathStatement.template value<FilePath>(
projectPartId.projectPathId); projectPartId.projectPathId);
transaction.commit();
if (value) if (value)
return *value; return *value;
transaction.commit();
} catch (const Sqlite::StatementIsBusy) { } catch (const Sqlite::StatementIsBusy) {
return fetchSystemPrecompiledHeaderPath(projectPartId); return fetchSystemPrecompiledHeaderPath(projectPartId);
} }
@@ -152,10 +153,11 @@ public:
auto value = fetchPrecompiledHeaderStatement.template value<FilePath>( auto value = fetchPrecompiledHeaderStatement.template value<FilePath>(
projectPartId.projectPathId); projectPartId.projectPathId);
transaction.commit();
if (value) if (value)
return *value; return *value;
transaction.commit();
} catch (const Sqlite::StatementIsBusy) { } catch (const Sqlite::StatementIsBusy) {
return fetchPrecompiledHeader(projectPartId); return fetchPrecompiledHeader(projectPartId);
} }
@@ -171,10 +173,11 @@ public:
auto value = fetchPrecompiledHeadersStatement.template value<PchPaths, 2>( auto value = fetchPrecompiledHeadersStatement.template value<PchPaths, 2>(
projectPartId.projectPathId); projectPartId.projectPathId);
transaction.commit();
if (value) if (value)
return *value; return *value;
transaction.commit();
} catch (const Sqlite::StatementIsBusy) { } catch (const Sqlite::StatementIsBusy) {
return fetchPrecompiledHeaders(projectPartId); return fetchPrecompiledHeaders(projectPartId);
} }

View File

@@ -224,6 +224,18 @@ TEST_F(PrecompiledHeaderStorage, FetchSystemPrecompiledHeaderCalls)
storage.fetchSystemPrecompiledHeaderPath(1); storage.fetchSystemPrecompiledHeaderPath(1);
} }
TEST_F(PrecompiledHeaderStorage, FetchSystemPrecompiledHeaderCallsWithReturnValue)
{
InSequence s;
EXPECT_CALL(database, deferredBegin());
EXPECT_CALL(fetchSystemPrecompiledHeaderPathStatement, valueReturnFilePath(TypedEq<int>(1)))
.WillOnce(Return(ClangBackEnd::FilePath{}));
EXPECT_CALL(database, commit());
storage.fetchSystemPrecompiledHeaderPath(1);
}
TEST_F(PrecompiledHeaderStorage, FetchSystemPrecompiledHeader) TEST_F(PrecompiledHeaderStorage, FetchSystemPrecompiledHeader)
{ {
EXPECT_CALL(fetchSystemPrecompiledHeaderPathStatement, valueReturnFilePath(TypedEq<int>(1))) EXPECT_CALL(fetchSystemPrecompiledHeaderPathStatement, valueReturnFilePath(TypedEq<int>(1)))
@@ -263,6 +275,16 @@ TEST_F(PrecompiledHeaderStorage, FetchPrecompiledHeaderCallsValueInStatement)
storage.fetchPrecompiledHeader(25); storage.fetchPrecompiledHeader(25);
} }
TEST_F(PrecompiledHeaderStorage, FetchPrecompiledHeaderCallsWithValue)
{
EXPECT_CALL(database, deferredBegin());
EXPECT_CALL(fetchPrecompiledHeaderStatement, valueReturnFilePath(Eq(25)))
.WillOnce(Return(ClangBackEnd::FilePath{}));
EXPECT_CALL(database, commit());
storage.fetchPrecompiledHeader(25);
}
TEST_F(PrecompiledHeaderStorage, FetchPrecompiledHeaderIsBusy) TEST_F(PrecompiledHeaderStorage, FetchPrecompiledHeaderIsBusy)
{ {
InSequence s; InSequence s;
@@ -305,6 +327,16 @@ TEST_F(PrecompiledHeaderStorage, FetchPrecompiledHeaderCalls)
storage.fetchPrecompiledHeaders(25); storage.fetchPrecompiledHeaders(25);
} }
TEST_F(PrecompiledHeaderStorage, FetchPrecompiledHeaderCallsWithReturnValue)
{
EXPECT_CALL(database, deferredBegin());
EXPECT_CALL(fetchPrecompiledHeadersStatement, valueReturnPchPaths(Eq(25)))
.WillOnce(Return(ClangBackEnd::PchPaths{}));
EXPECT_CALL(database, commit());
storage.fetchPrecompiledHeaders(25);
}
TEST_F(PrecompiledHeaderStorage, FetchPrecompiledHeadersIsBusy) TEST_F(PrecompiledHeaderStorage, FetchPrecompiledHeadersIsBusy)
{ {
InSequence s; InSequence s;
@@ -373,6 +405,18 @@ TEST_F(PrecompiledHeaderStorage, FetchTimeStampsCalls)
storage.fetchTimeStamps(23); storage.fetchTimeStamps(23);
} }
TEST_F(PrecompiledHeaderStorage, FetchTimeStampsCallsWithReturnValue)
{
InSequence s;
EXPECT_CALL(database, deferredBegin());
EXPECT_CALL(fetchTimeStampsStatement, valuesReturnPrecompiledHeaderTimeStamps(Eq(23)))
.WillOnce(Return(ClangBackEnd::PrecompiledHeaderTimeStamps{}));
EXPECT_CALL(database, commit());
storage.fetchTimeStamps(23);
}
TEST_F(PrecompiledHeaderStorage, FetchTimeStampsBusy) TEST_F(PrecompiledHeaderStorage, FetchTimeStampsBusy)
{ {
InSequence s; InSequence s;