forked from qt-creator/qt-creator
Clang: Store UsedDefines in the symbol database
We write the new defines in a temporary table and then write every new entry in the usedDefines table, followed by remove of every entry in usedDefines which are not in the temporary table but have a file entry in common with one of the entries in the temporary table. At last we clean up the temporary table. Change-Id: Idf11ce8d17ad9ccef490578059fac08409fcc5d9 Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
This commit is contained in:
@@ -41,8 +41,10 @@ public:
|
||||
using WriteStatementType = WriteStatement;
|
||||
|
||||
StorageSqliteStatementFactory(Database &database)
|
||||
: database(database)
|
||||
: transaction(database),
|
||||
database(database)
|
||||
{
|
||||
transaction.commit();
|
||||
}
|
||||
|
||||
Sqlite::Table createNewSymbolsTable() const
|
||||
@@ -57,9 +59,7 @@ public:
|
||||
table.addIndex({usrColumn, symbolNameColumn});
|
||||
table.addIndex({symbolIdColumn});
|
||||
|
||||
Sqlite::ImmediateTransaction transaction(database);
|
||||
table.initialize(database);
|
||||
transaction.commit();
|
||||
|
||||
return table;
|
||||
}
|
||||
@@ -76,17 +76,31 @@ public:
|
||||
const Sqlite::Column &sourceIdColumn = table.addColumn("sourceId", Sqlite::ColumnType::Integer);
|
||||
table.addIndex({sourceIdColumn});
|
||||
|
||||
Sqlite::ImmediateTransaction transaction(database);
|
||||
table.initialize(database);
|
||||
transaction.commit();
|
||||
|
||||
return table;
|
||||
}
|
||||
|
||||
Sqlite::Table createNewUsedDefinesTable() const
|
||||
{
|
||||
Sqlite::Table table;
|
||||
table.setName("newUsedDefines");
|
||||
table.setUseTemporaryTable(true);
|
||||
const Sqlite::Column &sourceIdColumn = table.addColumn("sourceId", Sqlite::ColumnType::Integer);
|
||||
const Sqlite::Column &defineNameColumn = table.addColumn("defineName", Sqlite::ColumnType::Text);
|
||||
table.addIndex({sourceIdColumn, defineNameColumn});
|
||||
|
||||
table.initialize(database);
|
||||
|
||||
return table;
|
||||
}
|
||||
|
||||
public:
|
||||
Sqlite::ImmediateTransaction transaction;
|
||||
Database &database;
|
||||
Sqlite::Table newSymbolsTablet{createNewSymbolsTable()};
|
||||
Sqlite::Table newLocationsTable{createNewLocationsTable()};
|
||||
Sqlite::Table newUsedDefineTable{createNewUsedDefinesTable()};
|
||||
WriteStatement insertSymbolsToNewSymbolsStatement{
|
||||
"INSERT INTO newSymbols(temporarySymbolId, usr, symbolName) VALUES(?,?,?)",
|
||||
database};
|
||||
@@ -152,6 +166,22 @@ public:
|
||||
"SELECT compilerArguments FROM projectParts WHERE projectPartId = (SELECT projectPartId FROM projectPartsSources WHERE sourceId = ?)",
|
||||
database
|
||||
};
|
||||
WriteStatement insertIntoNewUsedDefinesStatement{
|
||||
"INSERT INTO newUsedDefines(sourceId, defineName) VALUES (?,?)",
|
||||
database
|
||||
};
|
||||
WriteStatement syncNewUsedDefinesStatement{
|
||||
"INSERT INTO usedDefines(sourceId, defineName) SELECT sourceId, defineName FROM newUsedDefines WHERE NOT EXISTS (SELECT sourceId FROM usedDefines WHERE usedDefines.sourceId == newUsedDefines.sourceId AND usedDefines.defineName == newUsedDefines.defineName)",
|
||||
database
|
||||
};
|
||||
WriteStatement deleteOutdatedUsedDefinesStatement{
|
||||
"DELETE FROM usedDefines WHERE sourceId IN (SELECT sourceId FROM newUsedDefines) AND NOT EXISTS (SELECT sourceId FROM newUsedDefines WHERE newUsedDefines.sourceId == usedDefines.sourceId AND newUsedDefines.defineName == usedDefines.defineName)",
|
||||
database
|
||||
};
|
||||
WriteStatement deleteNewUsedDefinesTableStatement{
|
||||
"DELETE FROM newUsedDefines",
|
||||
database
|
||||
};
|
||||
};
|
||||
|
||||
} // namespace ClangBackEnd
|
||||
|
||||
@@ -83,7 +83,13 @@ public:
|
||||
|
||||
void insertOrUpdateUsedDefines(const UsedDefines &usedDefines) override
|
||||
{
|
||||
WriteStatement &insertStatement = m_statementFactory.insertIntoNewUsedDefinesStatement;
|
||||
for (const UsedDefine &usedDefine : usedDefines)
|
||||
insertStatement.write(usedDefine.filePathId.filePathId, usedDefine.defineName);
|
||||
|
||||
m_statementFactory.syncNewUsedDefinesStatement.execute();
|
||||
m_statementFactory.deleteOutdatedUsedDefinesStatement.execute();
|
||||
m_statementFactory.deleteNewUsedDefinesTableStatement.execute();
|
||||
}
|
||||
|
||||
void updateProjectPartSources(Utils::SmallStringView projectPartName,
|
||||
|
||||
Reference in New Issue
Block a user