QmlDesigner: Use strict tables

Strict tables https://www.sqlite.org/stricttables.html have the advantage
of providing strict columns and fix some historical mistakes like null
primary keys.

Change-Id: I7460e4317caafaec37102ae4181d2ed3bcea5ce4
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Marco Bubke
2022-07-21 13:26:55 +02:00
parent 379340d6c2
commit c8a4638b53

View File

@@ -2202,40 +2202,42 @@ private:
void createSourcesTable(Database &database) void createSourcesTable(Database &database)
{ {
Sqlite::Table table; Sqlite::StrictTable table;
table.setUseIfNotExists(true); table.setUseIfNotExists(true);
table.setName("sources"); table.setName("sources");
table.addColumn("sourceId", Sqlite::ColumnType::Integer, {Sqlite::PrimaryKey{}}); table.addColumn("sourceId", Sqlite::StrictColumnType::Integer, {Sqlite::PrimaryKey{}});
const Sqlite::Column &sourceContextIdColumn = table.addColumn( const auto &sourceContextIdColumn = table.addColumn(
"sourceContextId", "sourceContextId",
Sqlite::ColumnType::Integer, Sqlite::StrictColumnType::Integer,
{Sqlite::NotNull{}, {Sqlite::NotNull{},
Sqlite::ForeignKey{"sourceContexts", Sqlite::ForeignKey{"sourceContexts",
"sourceContextId", "sourceContextId",
Sqlite::ForeignKeyAction::NoAction, Sqlite::ForeignKeyAction::NoAction,
Sqlite::ForeignKeyAction::Cascade}}); Sqlite::ForeignKeyAction::Cascade}});
const Sqlite::Column &sourceNameColumn = table.addColumn("sourceName"); const auto &sourceNameColumn = table.addColumn("sourceName",
Sqlite::StrictColumnType::Text);
table.addUniqueIndex({sourceContextIdColumn, sourceNameColumn}); table.addUniqueIndex({sourceContextIdColumn, sourceNameColumn});
table.initialize(database); table.initialize(database);
} }
void createTypesAndePropertyDeclarationsTables( void createTypesAndePropertyDeclarationsTables(
Database &database, [[maybe_unused]] const Sqlite::Column &foreignModuleIdColumn) Database &database, [[maybe_unused]] const Sqlite::StrictColumn &foreignModuleIdColumn)
{ {
Sqlite::Table typesTable; Sqlite::StrictTable typesTable;
typesTable.setUseIfNotExists(true); typesTable.setUseIfNotExists(true);
typesTable.setName("types"); typesTable.setName("types");
typesTable.addColumn("typeId", Sqlite::ColumnType::Integer, {Sqlite::PrimaryKey{}}); typesTable.addColumn("typeId", Sqlite::StrictColumnType::Integer, {Sqlite::PrimaryKey{}});
auto &sourceIdColumn = typesTable.addColumn("sourceId"); auto &sourceIdColumn = typesTable.addColumn("sourceId", Sqlite::StrictColumnType::Integer);
auto &typesNameColumn = typesTable.addColumn("name"); auto &typesNameColumn = typesTable.addColumn("name", Sqlite::StrictColumnType::Text);
typesTable.addColumn("accessSemantics"); typesTable.addColumn("accessSemantics", Sqlite::StrictColumnType::Integer);
typesTable.addForeignKeyColumn("prototypeId", typesTable.addForeignKeyColumn("prototypeId",
typesTable, typesTable,
Sqlite::ForeignKeyAction::NoAction, Sqlite::ForeignKeyAction::NoAction,
Sqlite::ForeignKeyAction::Restrict); Sqlite::ForeignKeyAction::Restrict);
typesTable.addColumn("prototypeNameId"); typesTable.addColumn("prototypeNameId", Sqlite::StrictColumnType::Integer);
auto &defaultPropertyIdColumn = typesTable.addColumn("defaultPropertyId"); auto &defaultPropertyIdColumn = typesTable.addColumn("defaultPropertyId",
Sqlite::StrictColumnType::Integer);
typesTable.addUniqueIndex({sourceIdColumn, typesNameColumn}); typesTable.addUniqueIndex({sourceIdColumn, typesNameColumn});
typesTable.addIndex({defaultPropertyIdColumn}); typesTable.addIndex({defaultPropertyIdColumn});
@@ -2243,11 +2245,11 @@ private:
typesTable.initialize(database); typesTable.initialize(database);
{ {
Sqlite::Table propertyDeclarationTable; Sqlite::StrictTable propertyDeclarationTable;
propertyDeclarationTable.setUseIfNotExists(true); propertyDeclarationTable.setUseIfNotExists(true);
propertyDeclarationTable.setName("propertyDeclarations"); propertyDeclarationTable.setName("propertyDeclarations");
propertyDeclarationTable.addColumn("propertyDeclarationId", propertyDeclarationTable.addColumn("propertyDeclarationId",
Sqlite::ColumnType::Integer, Sqlite::StrictColumnType::Integer,
{Sqlite::PrimaryKey{}}); {Sqlite::PrimaryKey{}});
auto &typeIdColumn = propertyDeclarationTable.addColumn("typeId"); auto &typeIdColumn = propertyDeclarationTable.addColumn("typeId");
auto &nameColumn = propertyDeclarationTable.addColumn("name"); auto &nameColumn = propertyDeclarationTable.addColumn("name");
@@ -2255,8 +2257,10 @@ private:
typesTable, typesTable,
Sqlite::ForeignKeyAction::NoAction, Sqlite::ForeignKeyAction::NoAction,
Sqlite::ForeignKeyAction::Restrict); Sqlite::ForeignKeyAction::Restrict);
propertyDeclarationTable.addColumn("propertyTraits"); propertyDeclarationTable.addColumn("propertyTraits",
propertyDeclarationTable.addColumn("propertyImportedTypeNameId"); Sqlite::StrictColumnType::Integer);
propertyDeclarationTable.addColumn("propertyImportedTypeNameId",
Sqlite::StrictColumnType::Integer);
auto &aliasPropertyDeclarationIdColumn = propertyDeclarationTable.addForeignKeyColumn( auto &aliasPropertyDeclarationIdColumn = propertyDeclarationTable.addForeignKeyColumn(
"aliasPropertyDeclarationId", "aliasPropertyDeclarationId",
propertyDeclarationTable, propertyDeclarationTable,
@@ -2279,20 +2283,24 @@ private:
} }
void createExportedTypeNamesTable(Database &database, void createExportedTypeNamesTable(Database &database,
const Sqlite::Column &foreignModuleIdColumn) const Sqlite::StrictColumn &foreignModuleIdColumn)
{ {
Sqlite::Table table; Sqlite::StrictTable table;
table.setUseIfNotExists(true); table.setUseIfNotExists(true);
table.setName("exportedTypeNames"); table.setName("exportedTypeNames");
table.addColumn("exportedTypeNameId", Sqlite::ColumnType::Integer, {Sqlite::PrimaryKey{}}); table.addColumn("exportedTypeNameId",
Sqlite::StrictColumnType::Integer,
{Sqlite::PrimaryKey{}});
auto &moduleIdColumn = table.addForeignKeyColumn("moduleId", auto &moduleIdColumn = table.addForeignKeyColumn("moduleId",
foreignModuleIdColumn, foreignModuleIdColumn,
Sqlite::ForeignKeyAction::NoAction, Sqlite::ForeignKeyAction::NoAction,
Sqlite::ForeignKeyAction::NoAction); Sqlite::ForeignKeyAction::NoAction);
auto &nameColumn = table.addColumn("name"); auto &nameColumn = table.addColumn("name", Sqlite::StrictColumnType::Text);
auto &typeIdColumn = table.addColumn("typeId"); auto &typeIdColumn = table.addColumn("typeId", Sqlite::StrictColumnType::Integer);
auto &majorVersionColumn = table.addColumn("majorVersion"); auto &majorVersionColumn = table.addColumn("majorVersion",
auto &minorVersionColumn = table.addColumn("minorVersion"); Sqlite::StrictColumnType::Integer);
auto &minorVersionColumn = table.addColumn("minorVersion",
Sqlite::StrictColumnType::Integer);
table.addUniqueIndex({moduleIdColumn, nameColumn}, table.addUniqueIndex({moduleIdColumn, nameColumn},
"majorVersion IS NULL AND minorVersion IS NULL"); "majorVersion IS NULL AND minorVersion IS NULL");
@@ -2308,13 +2316,15 @@ private:
void createImportedTypeNamesTable(Database &database) void createImportedTypeNamesTable(Database &database)
{ {
Sqlite::Table table; Sqlite::StrictTable table;
table.setUseIfNotExists(true); table.setUseIfNotExists(true);
table.setName("importedTypeNames"); table.setName("importedTypeNames");
table.addColumn("importedTypeNameId", Sqlite::ColumnType::Integer, {Sqlite::PrimaryKey{}}); table.addColumn("importedTypeNameId",
Sqlite::StrictColumnType::Integer,
{Sqlite::PrimaryKey{}});
auto &importOrSourceIdColumn = table.addColumn("importOrSourceId"); auto &importOrSourceIdColumn = table.addColumn("importOrSourceId");
auto &nameColumn = table.addColumn("name"); auto &nameColumn = table.addColumn("name", Sqlite::StrictColumnType::Text);
auto &kindColumn = table.addColumn("kind"); auto &kindColumn = table.addColumn("kind", Sqlite::StrictColumnType::Integer);
table.addUniqueIndex({kindColumn, importOrSourceIdColumn, nameColumn}); table.addUniqueIndex({kindColumn, importOrSourceIdColumn, nameColumn});
@@ -2323,15 +2333,15 @@ private:
void createEnumerationsTable(Database &database) void createEnumerationsTable(Database &database)
{ {
Sqlite::Table table; Sqlite::StrictTable table;
table.setUseIfNotExists(true); table.setUseIfNotExists(true);
table.setName("enumerationDeclarations"); table.setName("enumerationDeclarations");
table.addColumn("enumerationDeclarationId", table.addColumn("enumerationDeclarationId",
Sqlite::ColumnType::Integer, Sqlite::StrictColumnType::Integer,
{Sqlite::PrimaryKey{}}); {Sqlite::PrimaryKey{}});
auto &typeIdColumn = table.addColumn("typeId"); auto &typeIdColumn = table.addColumn("typeId", Sqlite::StrictColumnType::Integer);
auto &nameColumn = table.addColumn("name"); auto &nameColumn = table.addColumn("name", Sqlite::StrictColumnType::Text);
table.addColumn("enumeratorDeclarations"); table.addColumn("enumeratorDeclarations", Sqlite::StrictColumnType::Text);
table.addUniqueIndex({typeIdColumn, nameColumn}); table.addUniqueIndex({typeIdColumn, nameColumn});
@@ -2340,15 +2350,15 @@ private:
void createFunctionsTable(Database &database) void createFunctionsTable(Database &database)
{ {
Sqlite::Table table; Sqlite::StrictTable table;
table.setUseIfNotExists(true); table.setUseIfNotExists(true);
table.setName("functionDeclarations"); table.setName("functionDeclarations");
table.addColumn("functionDeclarationId", table.addColumn("functionDeclarationId",
Sqlite::ColumnType::Integer, Sqlite::StrictColumnType::Integer,
{Sqlite::PrimaryKey{}}); {Sqlite::PrimaryKey{}});
auto &typeIdColumn = table.addColumn("typeId"); auto &typeIdColumn = table.addColumn("typeId", Sqlite::StrictColumnType::Integer);
auto &nameColumn = table.addColumn("name"); auto &nameColumn = table.addColumn("name", Sqlite::StrictColumnType::Text);
auto &signatureColumn = table.addColumn("signature"); auto &signatureColumn = table.addColumn("signature", Sqlite::StrictColumnType::Text);
table.addColumn("returnTypeName"); table.addColumn("returnTypeName");
table.addUniqueIndex({typeIdColumn, nameColumn, signatureColumn}); table.addUniqueIndex({typeIdColumn, nameColumn, signatureColumn});
@@ -2358,28 +2368,30 @@ private:
void createSignalsTable(Database &database) void createSignalsTable(Database &database)
{ {
Sqlite::Table table; Sqlite::StrictTable table;
table.setUseIfNotExists(true); table.setUseIfNotExists(true);
table.setName("signalDeclarations"); table.setName("signalDeclarations");
table.addColumn("signalDeclarationId", Sqlite::ColumnType::Integer, {Sqlite::PrimaryKey{}}); table.addColumn("signalDeclarationId",
auto &typeIdColumn = table.addColumn("typeId"); Sqlite::StrictColumnType::Integer,
auto &nameColumn = table.addColumn("name"); {Sqlite::PrimaryKey{}});
auto &signatureColumn = table.addColumn("signature"); auto &typeIdColumn = table.addColumn("typeId", Sqlite::StrictColumnType::Integer);
auto &nameColumn = table.addColumn("name", Sqlite::StrictColumnType::Text);
auto &signatureColumn = table.addColumn("signature", Sqlite::StrictColumnType::Text);
table.addUniqueIndex({typeIdColumn, nameColumn, signatureColumn}); table.addUniqueIndex({typeIdColumn, nameColumn, signatureColumn});
table.initialize(database); table.initialize(database);
} }
Sqlite::Column createModulesTable(Database &database) Sqlite::StrictColumn createModulesTable(Database &database)
{ {
Sqlite::Table table; Sqlite::StrictTable table;
table.setUseIfNotExists(true); table.setUseIfNotExists(true);
table.setName("modules"); table.setName("modules");
auto &modelIdColumn = table.addColumn("moduleId", auto &modelIdColumn = table.addColumn("moduleId",
Sqlite::ColumnType::Integer, Sqlite::StrictColumnType::Integer,
{Sqlite::PrimaryKey{}}); {Sqlite::PrimaryKey{}});
auto &nameColumn = table.addColumn("name"); auto &nameColumn = table.addColumn("name", Sqlite::StrictColumnType::Text);
table.addUniqueIndex({nameColumn}); table.addUniqueIndex({nameColumn});
@@ -2389,36 +2401,38 @@ private:
} }
void createModuleExportedImportsTable(Database &database, void createModuleExportedImportsTable(Database &database,
const Sqlite::Column &foreignModuleIdColumn) const Sqlite::StrictColumn &foreignModuleIdColumn)
{ {
Sqlite::Table table; Sqlite::StrictTable table;
table.setUseIfNotExists(true); table.setUseIfNotExists(true);
table.setName("moduleExportedImports"); table.setName("moduleExportedImports");
table.addColumn("moduleExportedImportId", table.addColumn("moduleExportedImportId",
Sqlite::ColumnType::Integer, Sqlite::StrictColumnType::Integer,
{Sqlite::PrimaryKey{}}); {Sqlite::PrimaryKey{}});
auto &moduleIdColumn = table.addForeignKeyColumn("moduleId", auto &moduleIdColumn = table.addForeignKeyColumn("moduleId",
foreignModuleIdColumn, foreignModuleIdColumn,
Sqlite::ForeignKeyAction::NoAction, Sqlite::ForeignKeyAction::NoAction,
Sqlite::ForeignKeyAction::Cascade, Sqlite::ForeignKeyAction::Cascade,
Sqlite::Enforment::Immediate); Sqlite::Enforment::Immediate);
auto &sourceIdColumn = table.addColumn("exportedModuleId"); auto &sourceIdColumn = table.addColumn("exportedModuleId",
table.addColumn("isAutoVersion"); Sqlite::StrictColumnType::Integer);
table.addColumn("majorVersion"); table.addColumn("isAutoVersion", Sqlite::StrictColumnType::Integer);
table.addColumn("minorVersion"); table.addColumn("majorVersion", Sqlite::StrictColumnType::Integer);
table.addColumn("minorVersion", Sqlite::StrictColumnType::Integer);
table.addUniqueIndex({sourceIdColumn, moduleIdColumn}); table.addUniqueIndex({sourceIdColumn, moduleIdColumn});
table.initialize(database); table.initialize(database);
} }
void createDocumentImportsTable(Database &database, const Sqlite::Column &foreignModuleIdColumn) void createDocumentImportsTable(Database &database,
const Sqlite::StrictColumn &foreignModuleIdColumn)
{ {
Sqlite::Table table; Sqlite::StrictTable table;
table.setUseIfNotExists(true); table.setUseIfNotExists(true);
table.setName("documentImports"); table.setName("documentImports");
table.addColumn("importId", Sqlite::ColumnType::Integer, {Sqlite::PrimaryKey{}}); table.addColumn("importId", Sqlite::StrictColumnType::Integer, {Sqlite::PrimaryKey{}});
auto &sourceIdColumn = table.addColumn("sourceId"); auto &sourceIdColumn = table.addColumn("sourceId", Sqlite::StrictColumnType::Integer);
auto &moduleIdColumn = table.addForeignKeyColumn("moduleId", auto &moduleIdColumn = table.addForeignKeyColumn("moduleId",
foreignModuleIdColumn, foreignModuleIdColumn,
Sqlite::ForeignKeyAction::NoAction, Sqlite::ForeignKeyAction::NoAction,
@@ -2429,10 +2443,13 @@ private:
Sqlite::ForeignKeyAction::NoAction, Sqlite::ForeignKeyAction::NoAction,
Sqlite::ForeignKeyAction::Cascade, Sqlite::ForeignKeyAction::Cascade,
Sqlite::Enforment::Immediate); Sqlite::Enforment::Immediate);
auto &kindColumn = table.addColumn("kind"); auto &kindColumn = table.addColumn("kind", Sqlite::StrictColumnType::Integer);
auto &majorVersionColumn = table.addColumn("majorVersion"); auto &majorVersionColumn = table.addColumn("majorVersion",
auto &minorVersionColumn = table.addColumn("minorVersion"); Sqlite::StrictColumnType::Integer);
auto &moduleExportedModuleIdColumn = table.addColumn("moduleExportedModuleId"); auto &minorVersionColumn = table.addColumn("minorVersion",
Sqlite::StrictColumnType::Integer);
auto &moduleExportedModuleIdColumn = table.addColumn("moduleExportedModuleId",
Sqlite::StrictColumnType::Integer);
table.addUniqueIndex({sourceIdColumn, table.addUniqueIndex({sourceIdColumn,
moduleIdColumn, moduleIdColumn,
@@ -2461,32 +2478,33 @@ private:
void createFileStatusesTable(Database &database) void createFileStatusesTable(Database &database)
{ {
Sqlite::Table table; Sqlite::StrictTable table;
table.setUseIfNotExists(true); table.setUseIfNotExists(true);
table.setName("fileStatuses"); table.setName("fileStatuses");
table.addColumn("sourceId", table.addColumn("sourceId",
Sqlite::ColumnType::Integer, Sqlite::StrictColumnType::Integer,
{Sqlite::PrimaryKey{}, {Sqlite::PrimaryKey{},
Sqlite::ForeignKey{"sources", Sqlite::ForeignKey{"sources",
"sourceId", "sourceId",
Sqlite::ForeignKeyAction::NoAction, Sqlite::ForeignKeyAction::NoAction,
Sqlite::ForeignKeyAction::Cascade}}); Sqlite::ForeignKeyAction::Cascade}});
table.addColumn("size"); table.addColumn("size", Sqlite::StrictColumnType::Integer);
table.addColumn("lastModified"); table.addColumn("lastModified", Sqlite::StrictColumnType::Integer);
table.initialize(database); table.initialize(database);
} }
void createProjectDatasTable(Database &database) void createProjectDatasTable(Database &database)
{ {
Sqlite::Table table; Sqlite::StrictTable table;
table.setUseIfNotExists(true); table.setUseIfNotExists(true);
table.setUseWithoutRowId(true); table.setUseWithoutRowId(true);
table.setName("projectDatas"); table.setName("projectDatas");
auto &projectSourceIdColumn = table.addColumn("projectSourceId"); auto &projectSourceIdColumn = table.addColumn("projectSourceId",
auto &sourceIdColumn = table.addColumn("sourceId"); Sqlite::StrictColumnType::Integer);
table.addColumn("moduleId"); auto &sourceIdColumn = table.addColumn("sourceId", Sqlite::StrictColumnType::Integer);
table.addColumn("fileType"); table.addColumn("moduleId", Sqlite::StrictColumnType::Integer);
table.addColumn("fileType", Sqlite::StrictColumnType::Integer);
table.addPrimaryKeyContraint({projectSourceIdColumn, sourceIdColumn}); table.addPrimaryKeyContraint({projectSourceIdColumn, sourceIdColumn});