Exemple #1
0
    public static async Task ExecuteCommandAsync(this DbConnection connection, string commandText)
    {
        commandText = commandText.Trim();

        try
        {
            var stopwatch = Stopwatch.StartNew();

#if (NET5_0)
            await using (var command = connection.CreateCommand())
#else
            using (var command = connection.CreateCommand())
#endif
            {
                command.CommandText = commandText;
                await command.ExecuteNonQueryAsync();
            }

            if (LocalDbLogging.SqlLoggingEnabled)
            {
                LocalDbLogging.Log($@"Executed SQL ({stopwatch.ElapsedMilliseconds}.ms):
{commandText.IndentLines()}");
            }
        }
        catch (DbException exception)
        {
            throw BuildException(connection, commandText, exception);
        }
        catch (Exception exception)
        {
            throw BuildException(connection, commandText, exception);
        }
    }
    public static void Log(MethodBase method, long milliseconds, string message)
    {
        if (!LocalDbLogging.Enabled)
        {
            return;
        }
        if (message == null)
        {
            LocalDbLogging.Log($"{method.Name} {milliseconds}ms");
            return;
        }

        LocalDbLogging.Log($"{method.Name} {milliseconds}ms {message}");
    }
Exemple #3
0
    void InnerStart(DateTime timestamp, Func <SqlConnection, Task> buildTemplate)
    {
        void CleanStart()
        {
            FileExtensions.FlushDirectory(Directory);
            LocalDbApi.CreateInstance(instance);
            LocalDbApi.StartInstance(instance);
            startupTask = CreateAndDetachTemplate(
                timestamp,
                buildTemplate,
                rebuild: true,
                optimize: true);
            InitRollbackTask();
        }

        var info = LocalDbApi.GetInstance(instance);

        if (!info.Exists)
        {
            CleanStart();
            return;
        }

        if (!info.IsRunning)
        {
            LocalDbApi.DeleteInstance(instance);
            CleanStart();
            return;
        }

        var templateLastMod = File.GetCreationTime(TemplateDataFile);

        if (timestamp == templateLastMod)
        {
            LocalDbLogging.Log("Not modified so skipping rebuild");
            startupTask = CreateAndDetachTemplate(timestamp, buildTemplate, false, false);
        }
        else
        {
            startupTask = CreateAndDetachTemplate(timestamp, buildTemplate, true, false);
        }

        InitRollbackTask();
    }
Exemple #4
0
    void InnerStart(DateTime timestamp, Action <SqlConnection> buildTemplate)
    {
        void CleanStart()
        {
            FileExtensions.FlushDirectory(directory);
            LocalDbApi.CreateInstance(instance);
            LocalDbApi.StartInstance(instance);
            RunOnceOfOptimizations();
            CreateTemplate();
            ExecuteBuildTemplate(buildTemplate);
            DetachTemplate(timestamp);
        }

        var info = LocalDbApi.GetInstance(instance);

        if (!info.Exists)
        {
            CleanStart();
            return;
        }

        if (!info.IsRunning)
        {
            LocalDbApi.DeleteInstance(instance);
            CleanStart();
            return;
        }

        PurgeDbs();
        DeleteNonTemplateFiles();

        var templateLastMod = File.GetCreationTime(TemplateDataFile);

        if (timestamp == templateLastMod)
        {
            LocalDbLogging.Log("Not modified so skipping rebuild");
            return;
        }

        DeleteTemplateFiles();
        CreateTemplate();
        ExecuteBuildTemplate(buildTemplate);
        DetachTemplate(timestamp);
    }
Exemple #5
0
    public void Start(DateTime timestamp, Func <DbConnection, Task> buildTemplate)
    {
#if RELEASE
        try
        {
#endif
        var stopwatch = Stopwatch.StartNew();
        InnerStart(timestamp, buildTemplate);
        var message = $"Start `{ServerName}` {stopwatch.ElapsedMilliseconds}ms.";

        LocalDbLogging.Log(message);
#if RELEASE
    }
    catch (Exception exception)
    {
        throw ExceptionBuilder.WrapLocalDbFailure(instance, Directory, exception);
    }
#endif
    }
Exemple #6
0
    async Task CreateAndDetachTemplate(DateTime timestamp, Func <DbConnection, Task> buildTemplate, bool rebuild, bool optimize)
    {
        masterConnection = buildConnection(MasterConnectionString);
        await masterConnection.OpenAsync();

        var takeDbsOffline = ExecuteOnMasterAsync(SqlBuilder.TakeDbsOfflineCommand);

        if (LocalDbLogging.Enabled)
        {
            LocalDbLogging.Log($"SqlServerVersion: {masterConnection.ServerVersion}");
        }

        if (optimize)
        {
            await ExecuteOnMasterAsync(SqlBuilder.GetOptimizationCommand(size));
        }

        if (!rebuild || templateProvided)
        {
            await takeDbsOffline;
            return;
        }

        DeleteTemplateFiles();
        await ExecuteOnMasterAsync(SqlBuilder.GetCreateTemplateCommand(TemplateDataFile, TemplateLogFile));

        FileExtensions.MarkFileAsWritable(TemplateDataFile);
        FileExtensions.MarkFileAsWritable(TemplateLogFile);

        using (var templateConnection = buildConnection(TemplateConnectionString))
        {
            await templateConnection.OpenAsync();
            await buildTemplate(templateConnection);
        }

        await ExecuteOnMasterAsync(SqlBuilder.DetachTemplateCommand);

        File.SetCreationTime(TemplateDataFile, timestamp);
        await takeDbsOffline;
    }
 static void WriteLine(CommandEventData data)
 {
     LocalDbLogging.Log($"EF {data}");
 }