You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
EntityFrameworkCore.Jet/test/EFCore.Jet.FunctionalTests/TestUtilities/JetDatabaseCleaner.cs

85 lines
3.2 KiB
C#

// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Diagnostics;
using Microsoft.EntityFrameworkCore.Internal;
using Microsoft.EntityFrameworkCore.Migrations.Operations;
using Microsoft.EntityFrameworkCore.Scaffolding;
using Microsoft.EntityFrameworkCore.Scaffolding.Metadata;
using EntityFrameworkCore.Jet.Diagnostics.Internal;
using EntityFrameworkCore.Jet.Metadata.Internal;
using EntityFrameworkCore.Jet.Scaffolding.Internal;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.TestUtilities;
using Microsoft.Extensions.Logging;
namespace EntityFrameworkCore.Jet.FunctionalTests.TestUtilities
{
public class JetDatabaseCleaner : RelationalDatabaseCleaner
{
protected override IDatabaseModelFactory CreateDatabaseModelFactory(ILoggerFactory loggerFactory)
=> new JetDatabaseModelFactory(
new DiagnosticsLogger<DbLoggerCategory.Scaffolding>(
loggerFactory,
new LoggingOptions(),
new DiagnosticListener("Fake"),
new JetLoggingDefinitions()));
protected override bool AcceptTable(DatabaseTable table) => !(table is DatabaseView);
protected override bool AcceptIndex(DatabaseIndex index)
=> false;
private readonly string _dropViewsSql = @"
DECLARE @name VARCHAR(MAX) = '__dummy__', @SQL VARCHAR(MAX) = '';
WHILE @name IS NOT NULL
BEGIN
SELECT @name =
(SELECT TOP 1 QUOTENAME(s.`name`) + '.' + QUOTENAME(o.`name`)
FROM sysobjects o
INNER JOIN sys.views v ON o.id = v.object_id
INNER JOIN sys.schemas s ON s.schema_id = v.schema_id
WHERE (s.name = 'dbo' OR s.principal_id <> s.schema_id) AND o.`type` = 'V' AND o.category = 0 AND o.`name` NOT IN
(
SELECT referenced_entity_name
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id
)
ORDER BY v.`name`)
SELECT @SQL = 'DROP VIEW ' + @name
EXEC (@SQL)
END";
protected override string BuildCustomSql(DatabaseModel databaseModel)
=> _dropViewsSql;
protected override string BuildCustomEndingSql(DatabaseModel databaseModel)
=> _dropViewsSql
+ @"
GO
DECLARE @SQL VARCHAR(MAX) = '';
SELECT @SQL = @SQL + 'DROP FUNCTION ' + QUOTENAME(ROUTINE_SCHEMA) + '.' + QUOTENAME(ROUTINE_NAME) + ';'
FROM `INFORMATION_SCHEMA`.`ROUTINES` WHERE ROUTINE_TYPE = 'FUNCTION' AND ROUTINE_BODY = 'SQL';
EXEC (@SQL);
SET @SQL ='';
SELECT @SQL = @SQL + 'DROP AGGREGATE ' + QUOTENAME(ROUTINE_SCHEMA) + '.' + QUOTENAME(ROUTINE_NAME) + ';'
FROM `INFORMATION_SCHEMA`.`ROUTINES` WHERE ROUTINE_TYPE = 'FUNCTION' AND ROUTINE_BODY = 'EXTERNAL';
EXEC (@SQL);
SET @SQL ='';
SELECT @SQL = @SQL + 'DROP PROC ' + QUOTENAME(schema_name(schema_id)) + '.' + QUOTENAME(name) + ';' FROM sys.procedures;
EXEC (@SQL);
SET @SQL ='';
SELECT @SQL = @SQL + 'DROP TYPE ' + QUOTENAME(schema_name(schema_id)) + '.' + QUOTENAME(name) + ';' FROM sys.types WHERE is_user_defined = 1;
EXEC (@SQL);
SET @SQL ='';
SELECT @SQL = @SQL + 'DROP SCHEMA ' + QUOTENAME(name) + ';' FROM sys.schemas WHERE principal_id <> schema_id;
EXEC (@SQL);";
}
}