From b5e9ae628ca6246f3622507dccfbb837a290663f Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Sat, 19 Nov 2022 15:19:56 +0100 Subject: [PATCH] C# modernization/cleanup in database model factories --- Directory.Build.props | 2 +- .../Internal/SqlServerDatabaseModelFactory.cs | 290 +++++++++--------- .../Internal/SqliteDatabaseModelFactory.cs | 202 ++++++------ 3 files changed, 251 insertions(+), 243 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 94132fb6e9b..a8e0887c1e5 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -22,7 +22,7 @@ Entity Framework Core;entity-framework-core;EF;Data;O/RM;EntityFramework;EntityFrameworkCore;EFCore Microsoft Entity Framework Core true - 10.0 + 11.0 portable https://docs.microsoft.com/ef/core/ diff --git a/src/EFCore.SqlServer/Scaffolding/Internal/SqlServerDatabaseModelFactory.cs b/src/EFCore.SqlServer/Scaffolding/Internal/SqlServerDatabaseModelFactory.cs index 93636a5f3e5..a98024e2e43 100644 --- a/src/EFCore.SqlServer/Scaffolding/Internal/SqlServerDatabaseModelFactory.cs +++ b/src/EFCore.SqlServer/Scaffolding/Internal/SqlServerDatabaseModelFactory.cs @@ -175,18 +175,19 @@ public override DatabaseModel Create(DbConnection connection, DatabaseModelFacto static int GetEngineEdition(DbConnection connection) { using var command = connection.CreateCommand(); - command.CommandText = @" -SELECT SERVERPROPERTY('EngineEdition');"; + command.CommandText = "SELECT SERVERPROPERTY('EngineEdition');"; return (int)command.ExecuteScalar()!; } static byte GetCompatibilityLevel(DbConnection connection) { using var command = connection.CreateCommand(); - command.CommandText = $@" + command.CommandText = +$""" SELECT compatibility_level FROM sys.databases -WHERE name = '{connection.Database}';"; +WHERE name = '{connection.Database}' +"""; var result = command.ExecuteScalar(); return result != null ? Convert.ToByte(result) : (byte)0; @@ -195,32 +196,28 @@ FROM sys.databases static string? GetServerCollation(DbConnection connection) { using var command = connection.CreateCommand(); - command.CommandText = @" -SELECT SERVERPROPERTY('Collation');"; - return command.ExecuteScalar() is string collation - ? collation - : null; + command.CommandText = "SELECT SERVERPROPERTY('Collation');"; + return command.ExecuteScalar() as string; } static string? GetDatabaseCollation(DbConnection connection) { using var command = connection.CreateCommand(); - command.CommandText = $@" + command.CommandText = +$""" SELECT collation_name FROM sys.databases -WHERE name = '{connection.Database}';"; +WHERE name = '{connection.Database}'; +"""; - return command.ExecuteScalar() is string collation - ? collation - : null; + return command.ExecuteScalar() as string; } } private void CheckViewDefinitionRights(DbConnection connection) { using var command = connection.CreateCommand(); - command.CommandText = @" -SELECT HAS_PERMS_BY_NAME(QUOTENAME(DB_NAME()), 'DATABASE', 'VIEW DEFINITION');"; + command.CommandText = "SELECT HAS_PERMS_BY_NAME(QUOTENAME(DB_NAME()), 'DATABASE', 'VIEW DEFINITION');"; var hasAccess = (int)command.ExecuteScalar()!; if (hasAccess == 0) @@ -232,7 +229,7 @@ private void CheckViewDefinitionRights(DbConnection connection) private string? GetDefaultSchema(DbConnection connection) { using var command = connection.CreateCommand(); - command.CommandText = "SELECT SCHEMA_NAME()"; + command.CommandText = "SELECT SCHEMA_NAME();"; if (command.ExecuteScalar() is string schema) { @@ -352,7 +349,8 @@ private static string EscapeLiteral(string s) using var command = connection.CreateCommand(); var typeAliasMap = new Dictionary(StringComparer.OrdinalIgnoreCase); - command.CommandText = @" + command.CommandText = +""" SELECT SCHEMA_NAME([t].[schema_id]) AS [schema_name], [t].[name] AS [type_name], @@ -362,7 +360,8 @@ private static string EscapeLiteral(string s) CAST([t].[scale] AS int) AS [scale] FROM [sys].[types] AS [t] JOIN [sys].[types] AS [t2] ON [t].[system_type_id] = [t2].[user_type_id] -WHERE [t].[is_user_defined] = 1 OR [t].[system_type_id] <> [t].[user_type_id]"; +WHERE [t].[is_user_defined] = 1 OR [t].[system_type_id] <> [t].[user_type_id]; +"""; using var reader = command.ExecuteReader(); while (reader.Read()) @@ -391,7 +390,8 @@ private void GetSequences( IReadOnlyDictionary typeAliases) { using var command = connection.CreateCommand(); - command.CommandText = @" + command.CommandText = +""" SELECT OBJECT_SCHEMA_NAME([s].[object_id]) AS [schema_name], [s].[name], @@ -401,31 +401,33 @@ private void GetSequences( CAST([s].[scale] AS int) AS [scale], [s].[is_cycling], CAST([s].[increment] AS int) AS [increment], - CAST(CASE + CAST(CASE WHEN [s].[start_value] > 9223372036854775807 THEN 9223372036854775807 WHEN [s].[start_value] < -9223372036854775808 THEN -9223372036854775808 - ELSE [s].[start_value] + ELSE [s].[start_value] END AS bigint) AS start_value, - CAST(CASE + CAST(CASE WHEN [s].[minimum_value] > 9223372036854775807 THEN 9223372036854775807 - WHEN [s].[minimum_value] < -9223372036854775808 THEN -9223372036854775808 - ELSE [s].[minimum_value] + WHEN [s].[minimum_value] < -9223372036854775808 THEN -9223372036854775808 + ELSE [s].[minimum_value] END AS bigint) AS minimum_value, - CAST(CASE + CAST(CASE WHEN [s].[maximum_value] > 9223372036854775807 THEN 9223372036854775807 WHEN [s].[maximum_value] < -9223372036854775808 THEN -9223372036854775808 - ELSE [s].[maximum_value] + ELSE [s].[maximum_value] END AS bigint) AS maximum_value FROM [sys].[sequences] AS [s] -JOIN [sys].[types] AS [t] ON [s].[user_type_id] = [t].[user_type_id]"; +JOIN [sys].[types] AS [t] ON [s].[user_type_id] = [t].[user_type_id] +"""; if (schemaFilter != null) { command.CommandText += @" -WHERE " - + schemaFilter("OBJECT_SCHEMA_NAME([s].[object_id])"); +WHERE " + schemaFilter("OBJECT_SCHEMA_NAME([s].[object_id])"); } + command.CommandText += ';'; + using var reader = command.ExecuteReader(); while (reader.Read()) { @@ -492,34 +494,41 @@ private void GetTables( var supportsMemoryOptimizedTable = SupportsMemoryOptimizedTable(); var supportsTemporalTable = SupportsTemporalTable(); - var commandText = @" + var builder = new StringBuilder( +""" SELECT SCHEMA_NAME([t].[schema_id]) AS [schema], [t].[name], CAST([e].[value] AS nvarchar(MAX)) AS [comment], - 'table' AS [type]"; + 'table' AS [type] +"""); if (supportsMemoryOptimizedTable) { - commandText += @", - [t].[is_memory_optimized]"; + builder.AppendLine(",").Append(" [t].[is_memory_optimized]"); } if (supportsTemporalTable) { - commandText += @", + builder.AppendLine(",").Append( +""" [t].[temporal_type], (SELECT [t2].[name] FROM [sys].[tables] AS t2 WHERE [t2].[object_id] = [t].[history_table_id]) AS [history_table_name], (SELECT SCHEMA_NAME([t2].[schema_id]) FROM [sys].[tables] AS t2 WHERE [t2].[object_id] = [t].[history_table_id]) AS [history_table_schema], (SELECT [c].[name] FROM [sys].[columns] as [c] WHERE [c].[object_id] = [t].[object_id] AND [c].[generated_always_type] = 1) as [period_start_column], - (SELECT [c].[name] FROM [sys].[columns] as [c] WHERE [c].[object_id] = [t].[object_id] AND [c].[generated_always_type] = 2) as [period_end_column]"; + (SELECT [c].[name] FROM [sys].[columns] as [c] WHERE [c].[object_id] = [t].[object_id] AND [c].[generated_always_type] = 2) as [period_end_column] +"""); } - commandText += @" + builder.AppendLine().Append( +""" FROM [sys].[tables] AS [t] -LEFT JOIN [sys].[extended_properties] AS [e] ON [e].[major_id] = [t].[object_id] AND [e].[minor_id] = 0 AND [e].[class] = 1 AND [e].[name] = 'MS_Description'"; +LEFT JOIN [sys].[extended_properties] AS [e] ON [e].[major_id] = [t].[object_id] AND [e].[minor_id] = 0 AND [e].[class] = 1 AND [e].[name] = 'MS_Description' +"""); - var filter = @"[t].[is_ms_shipped] = 0 + var tableFilterBuilder = new StringBuilder( +$""" +[t].[is_ms_shipped] = 0 AND NOT EXISTS (SELECT * FROM [sys].[extended_properties] AS [ep] WHERE [ep].[major_id] = [t].[object_id] @@ -527,72 +536,86 @@ FROM [sys].[extended_properties] AS [ep] AND [ep].[class] = 1 AND [ep].[name] = N'microsoft_database_tools_support' ) -AND [t].[name] <> '" - + HistoryRepository.DefaultTableName - + "'"; +AND [t].[name] <> '{HistoryRepository.DefaultTableName}' +"""); if (supportsTemporalTable) { - filter += @" -AND [t].[temporal_type] <> 1"; + tableFilterBuilder.AppendLine().Append("AND [t].[temporal_type] <> 1"); } if (tableFilter != null) { - filter += @" -AND " - + tableFilter("SCHEMA_NAME([t].[schema_id])", "[t].[name]"); + tableFilterBuilder + .AppendLine() + .Append("AND ") + .Append(tableFilter("SCHEMA_NAME([t].[schema_id])", "[t].[name]")); } - commandText = commandText - + @" -WHERE " - + filter; + var tableFilterSql = tableFilterBuilder.ToString(); - var viewCommandText = @" + builder.AppendLine().Append("WHERE ").Append(tableFilterSql); + + // If views are supported, scaffold them too. + string? viewFilter = null; + + if (SupportsViews()) + { + builder.AppendLine().Append( +""" UNION SELECT SCHEMA_NAME([v].[schema_id]) AS [schema], [v].[name], CAST([e].[value] AS nvarchar(MAX)) AS [comment], - 'view' AS [type]"; + 'view' AS [type] +"""); - if (supportsMemoryOptimizedTable) - { - viewCommandText += @", - CAST(0 AS bit) AS [is_memory_optimized]"; - } - if (supportsTemporalTable) - { - viewCommandText += @", - 1 AS [temporal_type], - NULL AS [history_table_name], - NULL AS [history_table_schema], - NULL AS [period_start_column], - NULL AS [period_end_column]"; - } + if (supportsMemoryOptimizedTable) + { + builder.AppendLine(",").Append(" CAST(0 AS bit) AS [is_memory_optimized]"); + } - viewCommandText += @" + if (supportsTemporalTable) + { + builder.AppendLine(",").Append( +""" + 1 AS [temporal_type], + NULL AS [history_table_name], + NULL AS [history_table_schema], + NULL AS [period_start_column], + NULL AS [period_end_column] +"""); + } + + builder.Append( +""" FROM [sys].[views] AS [v] -LEFT JOIN [sys].[extended_properties] AS [e] ON [e].[major_id] = [v].[object_id] AND [e].[minor_id] = 0 AND [e].[class] = 1 AND [e].[name] = 'MS_Description'"; +LEFT JOIN [sys].[extended_properties] AS [e] ON [e].[major_id] = [v].[object_id] AND [e].[minor_id] = 0 AND [e].[class] = 1 AND [e].[name] = 'MS_Description' +"""); - var viewFilter = @"[v].[is_ms_shipped] = 0 -AND [v].[is_date_correlation_view] = 0 "; + var viewFilterBuilder = new StringBuilder( +""" +[v].[is_ms_shipped] = 0 +AND [v].[is_date_correlation_view] = 0 +"""); - if (tableFilter != null) - { - viewFilter += @" -AND " - + tableFilter("SCHEMA_NAME([v].[schema_id])", "[v].[name]"); - } + if (tableFilter != null) + { + viewFilterBuilder + .AppendLine() + .Append("AND ") + .Append(tableFilter("SCHEMA_NAME([v].[schema_id])", "[v].[name]")); + } - viewCommandText = viewCommandText - + @" -WHERE " - + viewFilter; + viewFilter = viewFilterBuilder.ToString(); - command.CommandText = SupportsViews() ? commandText + viewCommandText : commandText; + builder.AppendLine().Append("WHERE ").Append(viewFilter); + } + + builder.Append(";"); + command.CommandText = builder.ToString(); using (var reader = command.ExecuteReader()) { @@ -645,15 +668,15 @@ FROM [sys].[views] AS [v] } // This is done separately due to MARS property may be turned off - GetColumns(connection, tables, filter, viewFilter, typeAliases, databaseCollation); + GetColumns(connection, tables, tableFilterSql, viewFilter, typeAliases, databaseCollation); if (SupportsIndexes()) { - GetIndexes(connection, tables, filter); + GetIndexes(connection, tables, tableFilterSql); } - GetForeignKeys(connection, tables, filter); - GetTriggers(connection, tables, filter); + GetForeignKeys(connection, tables, tableFilterSql); + GetTriggers(connection, tables, tableFilterSql); foreach (var table in tables) { @@ -665,12 +688,13 @@ private void GetColumns( DbConnection connection, IReadOnlyList tables, string tableFilter, - string viewFilter, + string? viewFilter, IReadOnlyDictionary typeAliases, string? databaseCollation) { using var command = connection.CreateCommand(); - var commandText = @" + var builder = new StringBuilder( +$""" SELECT SCHEMA_NAME([o].[schema_id]) AS [table_schema], [o].[name] AS [table_name], @@ -690,41 +714,43 @@ private void GetColumns( [c].[collation_name], [c].[is_sparse] FROM -("; +( + SELECT [t].[name], [t].[object_id], [t].[schema_id] + FROM [sys].[tables] t + WHERE {tableFilter} +"""); + if (SupportsViews()) { - commandText += @" - SELECT[v].[name], [v].[object_id], [v].[schema_id] - FROM [sys].[views] v WHERE "; - - commandText += viewFilter; + Check.DebugAssert(viewFilter is not null, "viewFilter is not null"); - commandText += @" -UNION ALL"; + builder.AppendLine().Append( +$""" + UNION ALL + SELECT[v].[name], [v].[object_id], [v].[schema_id] + FROM [sys].[views] v + WHERE {viewFilter} +"""); } - commandText += @" - SELECT [t].[name], [t].[object_id], [t].[schema_id] - FROM [sys].[tables] t WHERE "; - - commandText += tableFilter; - commandText += @" + builder.AppendLine().Append( +""" ) o JOIN [sys].[columns] AS [c] ON [o].[object_id] = [c].[object_id] LEFT JOIN [sys].[types] AS [tp] ON [c].[user_type_id] = [tp].[user_type_id] LEFT JOIN [sys].[extended_properties] AS [e] ON [e].[major_id] = [o].[object_id] AND [e].[minor_id] = [c].[column_id] AND [e].[class] = 1 AND [e].[name] = 'MS_Description' LEFT JOIN [sys].[computed_columns] AS [cc] ON [c].[object_id] = [cc].[object_id] AND [c].[column_id] = [cc].[column_id] -LEFT JOIN [sys].[default_constraints] AS [dc] ON [c].[object_id] = [dc].[parent_object_id] AND [c].[column_id] = [dc].[parent_column_id]"; +LEFT JOIN [sys].[default_constraints] AS [dc] ON [c].[object_id] = [dc].[parent_object_id] AND [c].[column_id] = [dc].[parent_column_id] +"""); if (SupportsTemporalTable()) { - commandText += " WHERE [c].[generated_always_type] <> 1 AND [c].[generated_always_type] <> 2"; + builder.AppendLine().Append("WHERE [c].[generated_always_type] <> 1 AND [c].[generated_always_type] <> 2"); } - commandText += @" -ORDER BY [table_schema], [table_name], [c].[column_id]"; + builder.AppendLine().Append("ORDER BY [table_schema], [table_name], [c].[column_id];"); - command.CommandText = commandText; + command.CommandText = builder.ToString(); using var reader = command.ExecuteReader(); var tableColumnGroups = reader.Cast() @@ -845,29 +871,15 @@ private void GetColumns( if (defaultValue == "((0))" || defaultValue == "(0)") { - if (dataTypeName == "bigint" - || dataTypeName == "bit" - || dataTypeName == "decimal" - || dataTypeName == "float" - || dataTypeName == "int" - || dataTypeName == "money" - || dataTypeName == "numeric" - || dataTypeName == "real" - || dataTypeName == "smallint" - || dataTypeName == "smallmoney" - || dataTypeName == "tinyint") + if (dataTypeName is "bigint" or "bit" or "decimal" or "float" or "int" or "money" or "numeric" or "real" or "smallint" + or "smallmoney" or "tinyint") { return null; } } else if (defaultValue == "((0.0))" || defaultValue == "(0.0)") { - if (dataTypeName == "decimal" - || dataTypeName == "float" - || dataTypeName == "money" - || dataTypeName == "numeric" - || dataTypeName == "real" - || dataTypeName == "smallmoney") + if (dataTypeName is "decimal" or "float" or "money" or "numeric" or "real" or "smallmoney") { return null; } @@ -895,8 +907,7 @@ private static string GetStoreType(string dataTypeName, int maxLength, int preci return "rowversion"; } - if (dataTypeName == "decimal" - || dataTypeName == "numeric") + if (dataTypeName is "decimal" or "numeric") { return $"{dataTypeName}({precision}, {scale})"; } @@ -914,8 +925,7 @@ private static string GetStoreType(string dataTypeName, int maxLength, int preci return $"{dataTypeName}(max)"; } - if (dataTypeName == "nvarchar" - || dataTypeName == "nchar") + if (dataTypeName is "nvarchar" or "nchar") { maxLength /= 2; } @@ -972,7 +982,7 @@ FROM [sys].[indexes] i } commandText += @" -ORDER BY [table_schema], [table_name], [index_name], [ic].[key_ordinal]"; +ORDER BY [table_schema], [table_name], [index_name], [ic].[key_ordinal];"; command.CommandText = commandText; @@ -997,7 +1007,7 @@ FROM [sys].[indexes] i TypeDesc: ddr.GetValueOrDefault("type_desc"))) .ToArray(); - Check.DebugAssert(primaryKeyGroups.Length == 0 || primaryKeyGroups.Length == 1, "Multiple primary keys found"); + Check.DebugAssert(primaryKeyGroups.Length is 0 or 1, "Multiple primary keys found"); if (primaryKeyGroups.Length == 1) { @@ -1161,7 +1171,8 @@ bool TryGetIndex( private void GetForeignKeys(DbConnection connection, IReadOnlyList tables, string tableFilter) { using var command = connection.CreateCommand(); - command.CommandText = @" + command.CommandText = +$""" SELECT SCHEMA_NAME([t].[schema_id]) AS [table_schema], [t].[name] AS [table_name], @@ -1177,10 +1188,9 @@ FROM [sys].[foreign_keys] AS [f] JOIN [sys].[columns] AS [col1] ON [col1].[column_id] = [fc].[parent_column_id] AND [col1].[object_id] = [t].[object_id] JOIN [sys].[tables] AS [tab2] ON [tab2].[object_id] = [fc].[referenced_object_id] JOIN [sys].[columns] AS [col2] ON [col2].[column_id] = [fc].[referenced_column_id] AND [col2].[object_id] = [tab2].[object_id] -WHERE " - + tableFilter - + @" -ORDER BY [table_schema], [table_name], [f].[name], [fc].[constraint_column_id]"; +WHERE {tableFilter} +ORDER BY [table_schema], [table_name], [f].[name], [fc].[constraint_column_id]; +"""; using var reader = command.ExecuteReader(); var tableForeignKeyGroups = reader.Cast() @@ -1311,17 +1321,17 @@ FROM [sys].[foreign_keys] AS [f] private void GetTriggers(DbConnection connection, IReadOnlyList tables, string tableFilter) { using var command = connection.CreateCommand(); - command.CommandText = @" + command.CommandText = +$""" SELECT SCHEMA_NAME([t].[schema_id]) AS [table_schema], [t].[name] AS [table_name], [tr].[name] AS [trigger_name] FROM [sys].[triggers] AS [tr] JOIN [sys].[tables] AS [t] ON [tr].[parent_id] = [t].[object_id] -WHERE " - + tableFilter - + @" -ORDER BY [table_schema], [table_name], [tr].[name]"; +WHERE {tableFilter} +ORDER BY [table_schema], [table_name], [tr].[name]; +"""; using var reader = command.ExecuteReader(); var tableGroups = reader.Cast() diff --git a/src/EFCore.Sqlite.Core/Scaffolding/Internal/SqliteDatabaseModelFactory.cs b/src/EFCore.Sqlite.Core/Scaffolding/Internal/SqliteDatabaseModelFactory.cs index b2a50da6bbf..a5e17e87daf 100644 --- a/src/EFCore.Sqlite.Core/Scaffolding/Internal/SqliteDatabaseModelFactory.cs +++ b/src/EFCore.Sqlite.Core/Scaffolding/Internal/SqliteDatabaseModelFactory.cs @@ -109,11 +109,12 @@ public override DatabaseModel Create(DbConnection connection, DatabaseModelFacto private static bool HasGeometryColumns(DbConnection connection) { using var command = connection.CreateCommand(); - command.CommandText = new StringBuilder() - .AppendLine("SELECT COUNT(*)") - .AppendLine("FROM \"sqlite_master\"") - .AppendLine("WHERE \"name\" = 'geometry_columns' AND \"type\" = 'table';") - .ToString(); + command.CommandText = +""" +SELECT COUNT(*) +FROM "sqlite_master" +WHERE "name" = 'geometry_columns' AND "type" = 'table' +"""; return (long)command.ExecuteScalar()! != 0L; } @@ -136,21 +137,22 @@ private void GetTables(DbConnection connection, DatabaseModel databaseModel, IEn using (var command = connection.CreateCommand()) { - command.CommandText = new StringBuilder() - .AppendLine("SELECT \"name\", \"type\"") - .AppendLine("FROM \"sqlite_master\"") - .Append("WHERE \"type\" IN ('table', 'view') AND instr(\"name\", 'sqlite_') <> 1 AND \"name\" NOT IN ('") - .Append(HistoryRepository.DefaultTableName) - .Append("', 'ElementaryGeometries', 'geometry_columns', 'geometry_columns_auth', ") - .Append("'geometry_columns_field_infos', 'geometry_columns_statistics', 'geometry_columns_time', ") - .Append("'spatial_ref_sys', 'spatial_ref_sys_aux', 'SpatialIndex', 'spatialite_history', ") - .Append("'sql_statements_log', 'vector_layers', 'vector_layers_auth', 'vector_layers_statistics', ") - .Append("'vector_layers_field_infos', 'views_geometry_columns', 'views_geometry_columns_auth', ") - .Append("'views_geometry_columns_field_infos', 'views_geometry_columns_statistics', ") - .Append("'virts_geometry_columns', 'virts_geometry_columns_auth', ") - .Append("'geom_cols_ref_sys', 'spatial_ref_sys_all', ") - .AppendLine("'virts_geometry_columns_field_infos', 'virts_geometry_columns_statistics');") - .ToString(); + command.CommandText = +$""" +SELECT "name", "type" +FROM "sqlite_master" +WHERE "type" IN ('table', 'view') AND instr("name", 'sqlite_') <> 1 AND "name" NOT IN ( +'{HistoryRepository.DefaultTableName}', +'ElementaryGeometries', 'geometry_columns', 'geometry_columns_auth', +'geometry_columns_field_infos', 'geometry_columns_statistics', 'geometry_columns_time', +'spatial_ref_sys', 'spatial_ref_sys_aux', 'SpatialIndex', 'spatialite_history', +'sql_statements_log', 'vector_layers', 'vector_layers_auth', 'vector_layers_statistics', +'vector_layers_field_infos', 'views_geometry_columns', 'views_geometry_columns_auth', +'views_geometry_columns_field_infos', 'views_geometry_columns_statistics', +'virts_geometry_columns', 'virts_geometry_columns_auth', +'geom_cols_ref_sys', 'spatial_ref_sys_all', +'virts_geometry_columns_field_infos', 'virts_geometry_columns_statistics') +"""; using var reader = command.ExecuteReader(); while (reader.Read()) @@ -202,12 +204,13 @@ private static bool AllowsTable(HashSet tables, HashSet selected private void GetColumns(DbConnection connection, DatabaseTable table) { using var command = connection.CreateCommand(); - command.CommandText = new StringBuilder() - .AppendLine("SELECT \"name\", \"type\", \"notnull\", \"dflt_value\", \"hidden\"") - .AppendLine("FROM pragma_table_xinfo(@table)") - .AppendLine("WHERE \"hidden\" IN (0, 2, 3)") - .AppendLine("ORDER BY \"cid\";") - .ToString(); + command.CommandText = +""" +SELECT "name", "type", "notnull", "dflt_value", "hidden" +FROM pragma_table_xinfo(@table) +WHERE "hidden" IN (0, 2, 3) +ORDER BY "cid" +"""; var parameter = command.CreateParameter(); parameter.ParameterName = "@table"; @@ -237,10 +240,10 @@ private void GetColumns(DbConnection connection, DatabaseTable table) connection.Database, table.Name, columnName, - out var _, - out var _, - out var _, - out var _, + out _, + out _, + out _, + out _, out autoIncrement); SqliteException.ThrowExceptionForRC(rc, db); } @@ -286,12 +289,13 @@ private void GetColumns(DbConnection connection, DatabaseTable table) private void GetPrimaryKey(DbConnection connection, DatabaseTable table) { using var command = connection.CreateCommand(); - command.CommandText = new StringBuilder() - .AppendLine("SELECT \"name\"") - .AppendLine("FROM pragma_index_list(@table)") - .AppendLine("WHERE \"origin\" = 'pk'") - .AppendLine("ORDER BY \"seq\";") - .ToString(); + command.CommandText = +""" +SELECT "name" +FROM pragma_index_list(@table) +WHERE "origin" = 'pk' +ORDER BY "seq" +"""; var parameter = command.CreateParameter(); parameter.ParameterName = "@table"; @@ -312,11 +316,12 @@ private void GetPrimaryKey(DbConnection connection, DatabaseTable table) _logger.PrimaryKeyFound(name, table.Name); - command.CommandText = new StringBuilder() - .AppendLine("SELECT \"name\"") - .AppendLine("FROM pragma_index_info(@index)") - .AppendLine("ORDER BY \"seqno\";") - .ToString(); + command.CommandText = +""" +SELECT "name" +FROM pragma_index_info(@index) +ORDER BY "seqno" +"""; parameter.ParameterName = "@index"; parameter.Value = name; @@ -340,11 +345,12 @@ private static void GetRowidPrimaryKey( DatabaseTable table) { using var command = connection.CreateCommand(); - command.CommandText = new StringBuilder() - .AppendLine("SELECT \"name\"") - .AppendLine("FROM pragma_table_info(@table)") - .AppendLine("WHERE \"pk\" = 1;") - .ToString(); + command.CommandText = +""" +SELECT "name" +FROM pragma_table_info(@table) +WHERE "pk" = 1 +"""; var parameter = command.CreateParameter(); parameter.ParameterName = "@table"; @@ -375,12 +381,13 @@ private static void GetRowidPrimaryKey( private void GetUniqueConstraints(DbConnection connection, DatabaseTable table) { using var command1 = connection.CreateCommand(); - command1.CommandText = new StringBuilder() - .AppendLine("SELECT \"name\"") - .AppendLine("FROM pragma_index_list(@table)") - .AppendLine("WHERE \"origin\" = 'u'") - .AppendLine("ORDER BY \"seq\";") - .ToString(); + command1.CommandText = +""" +SELECT "name" +FROM pragma_index_list(@table) +WHERE "origin" = 'u' +ORDER BY "seq" +"""; var parameter1 = command1.CreateParameter(); parameter1.ParameterName = "@table"; @@ -400,11 +407,12 @@ private void GetUniqueConstraints(DbConnection connection, DatabaseTable table) using (var command2 = connection.CreateCommand()) { - command2.CommandText = new StringBuilder() - .AppendLine("SELECT \"name\"") - .AppendLine("FROM pragma_index_info(@index)") - .AppendLine("ORDER BY \"seqno\";") - .ToString(); + command2.CommandText = +""" +SELECT "name" +FROM pragma_index_info(@index) +ORDER BY "seqno" +"""; var parameter2 = command2.CreateParameter(); parameter2.ParameterName = "@index"; @@ -431,12 +439,13 @@ private void GetUniqueConstraints(DbConnection connection, DatabaseTable table) private void GetIndexes(DbConnection connection, DatabaseTable table) { using var command1 = connection.CreateCommand(); - command1.CommandText = new StringBuilder() - .AppendLine("SELECT \"name\", \"unique\"") - .AppendLine("FROM pragma_index_list(@table)") - .AppendLine("WHERE \"origin\" = 'c' AND instr(\"name\", 'sqlite_') <> 1") - .AppendLine("ORDER BY \"seq\";") - .ToString(); + command1.CommandText = +""" +SELECT "name", "unique" +FROM pragma_index_list(@table) +WHERE "origin" = 'c' AND instr("name", 'sqlite_') <> 1 +ORDER BY "seq" +"""; var parameter1 = command1.CreateParameter(); parameter1.ParameterName = "@table"; @@ -457,12 +466,13 @@ private void GetIndexes(DbConnection connection, DatabaseTable table) using (var command2 = connection.CreateCommand()) { - command2.CommandText = new StringBuilder() - .AppendLine("SELECT \"name\", \"desc\"") - .AppendLine("FROM pragma_index_xinfo(@index)") - .AppendLine("WHERE key = 1") - .AppendLine("ORDER BY \"seqno\";") - .ToString(); + command2.CommandText = +""" +SELECT "name", "desc" +FROM pragma_index_xinfo(@index) +WHERE key = 1 +ORDER BY "seqno" +"""; var parameter2 = command2.CreateParameter(); parameter2.ParameterName = "@index"; @@ -489,11 +499,12 @@ private void GetIndexes(DbConnection connection, DatabaseTable table) private void GetForeignKeys(DbConnection connection, DatabaseTable table, IList tables) { using var command1 = connection.CreateCommand(); - command1.CommandText = new StringBuilder() - .AppendLine("SELECT DISTINCT \"id\", \"table\", \"on_delete\"") - .AppendLine("FROM pragma_foreign_key_list(@table)") - .AppendLine("ORDER BY \"id\";") - .ToString(); + command1.CommandText = +""" +SELECT DISTINCT "id", "table", "on_delete" +FROM pragma_foreign_key_list(@table) +ORDER BY "id" +"""; var parameter1 = command1.CreateParameter(); parameter1.ParameterName = "@table"; @@ -527,12 +538,13 @@ private void GetForeignKeys(DbConnection connection, DatabaseTable table, IList< }; using var command2 = connection.CreateCommand(); - command2.CommandText = new StringBuilder() - .AppendLine("SELECT \"seq\", \"from\", \"to\"") - .AppendLine("FROM pragma_foreign_key_list(@table)") - .AppendLine("WHERE \"id\" = @id") - .AppendLine("ORDER BY \"seq\";") - .ToString(); + command2.CommandText = +""" +SELECT "seq", "from", "to" +FROM pragma_foreign_key_list(@table) +WHERE "id" = @id +ORDER BY "seq" +"""; var parameter2 = command2.CreateParameter(); parameter2.ParameterName = "@table"; @@ -592,27 +604,13 @@ private void GetForeignKeys(DbConnection connection, DatabaseTable table, IList< } private static ReferentialAction? ConvertToReferentialAction(string value) - { - switch (value) + => value switch { - case "RESTRICT": - return ReferentialAction.Restrict; - - case "CASCADE": - return ReferentialAction.Cascade; - - case "SET NULL": - return ReferentialAction.SetNull; - - case "SET DEFAULT": - return ReferentialAction.SetDefault; - - case "NO ACTION": - return ReferentialAction.NoAction; - - default: - Check.DebugAssert(value == "NONE", "Unexpected value: " + value); - return null; - } - } + "RESTRICT" => ReferentialAction.Restrict, + "CASCADE" => ReferentialAction.Cascade, + "SET NULL" => ReferentialAction.SetNull, + "SET DEFAULT" => ReferentialAction.SetDefault, + "NO ACTION" => ReferentialAction.NoAction, + _ => null + }; }