• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

HicServices / RDMP / 8598528338

08 Apr 2024 10:28AM UTC coverage: 56.914% (+0.08%) from 56.837%
8598528338

push

github

web-flow
Move 8.1.5 to main for autoupdater (#1797)

* bump to net8

* add sqlcli

* Bump Autoupdater.NET.Official from 1.8.4 to 1.8.5

Bumps [Autoupdater.NET.Official](https://github.com/ravibpatel/AutoUpdater.NET) from 1.8.4 to 1.8.5.
- [Release notes](https://github.com/ravibpatel/AutoUpdater.NET/releases)
- [Commits](https://github.com/ravibpatel/AutoUpdater.NET/compare/v1.8.4...v1.8.5)

---
updated-dependencies:
- dependency-name: Autoupdater.NET.Official
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Delete .nuget/packages.config (#1758)

* Delete .nuget/packages.config

Remove  hopefully obsolete package list confusing dependency tracking

* Remove .nuget folder

---------

Co-authored-by: James A Sutherland <>

* Bump svenstaro/upload-release-action from 2.7.0 to 2.9.0 (#1759)

* Bump shogo82148/actions-setup-perl from 1.28.0 to 1.29.0 (#1751)

Bumps [shogo82148/actions-setup-perl](https://github.com/shogo82148/actions-setup-perl) from 1.28.0 to 1.29.0.
- [Release notes](https://github.com/shogo82148/actions-setup-perl/releases)
- [Commits](https://github.com/shogo82148/actions-setup-perl/compare/v1.28.0...v1.29.0)

---
updated-dependencies:
- dependency-name: shogo82148/actions-setup-perl
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: James Friel <jfriel001@dundee.ac.uk>

* Bump CsvHelper from 30.0.3 to 30.1.0 (#1737)

Bumps [CsvHelper](https://github.com/JoshClose/CsvHelper) from 30.0.3 to 30.1.0.
- [Commits](https://github.com/JoshClose/CsvHelper/compare/30.0.3...30.1.0)

---
updated-dependencies:
- dependency-name: CsvHelper
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

S... (continued)

10835 of 20509 branches covered (52.83%)

Branch coverage included in aggregate %.

99 of 176 new or added lines in 33 files covered. (56.25%)

10 existing lines in 7 files now uncovered.

30856 of 52744 relevant lines covered (58.5%)

7400.67 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/Rdmp.Core/DataLoad/Engine/LoadExecution/Components/Runtime/ExecuteSqlBakFileRuntimeTask.cs
1
// Copyright (c) The University of Dundee 2018-2023
2
// This file is part of the Research Data Management Platform (RDMP).
3
// RDMP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
4
// RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
5
// You should have received a copy of the GNU General Public License along with RDMP. If not, see <https://www.gnu.org/licenses/>.
6

7
using System;
8
using System.Collections.Generic;
9
using System.Data;
10
using System.IO;
11
using Microsoft.Data.SqlClient;
12
using Rdmp.Core.Curation.Data.DataLoad;
13
using Rdmp.Core.DataFlowPipeline;
14
using Rdmp.Core.DataLoad.Engine.Job;
15
using Rdmp.Core.DataLoad.Engine.LoadExecution.Components.Arguments;
16
using Rdmp.Core.ReusableLibraryCode.Checks;
17
using Rdmp.Core.ReusableLibraryCode.Progress;
18
using System.Text.Json;
19

20
namespace Rdmp.Core.DataLoad.Engine.LoadExecution.Components.Runtime;
21

22
/// <summary>
23
/// RuntimeTask that executes a single .bak file specified by the user in a ProcessTask with ProcessTaskType SQLBakFile.
24
/// </summary>
25
public class ExecuteSqlBakFileRuntimeTask : RuntimeTask
26
{
27
    public string Filepath;
28
    private readonly IProcessTask _task;
29

30
    public string PrimaryFilePhysicalName;
31
    public string LogFilePhysicalName;
32
    private LoadStage _loadStage;
33

34
    public ExecuteSqlBakFileRuntimeTask(IProcessTask task, RuntimeArgumentCollection args) : base(task, args)
×
35
    {
36
        _task = task;
×
37
        Filepath = task.Path;
×
NEW
38
        if (!string.IsNullOrWhiteSpace(task.SerialisableConfiguration))
×
39
        {
NEW
40
            var config = JsonSerializer.Deserialize<Dictionary<string, string>>(task.SerialisableConfiguration);
×
NEW
41
            config.TryGetValue("PrimaryFilePhysicalName", out PrimaryFilePhysicalName);
×
NEW
42
            config.TryGetValue("LogFilePhysicalName", out LogFilePhysicalName);
×
43
        }
UNCOV
44
    }
×
45

46
    public override ExitCodeType Run(IDataLoadJob job, GracefulCancellationToken cancellationToken)
47
    {
48
        var db = RuntimeArguments.StageSpecificArguments.DbInfo;
×
49
        _loadStage = RuntimeArguments.StageSpecificArguments.LoadStage;
×
50

51
        if (!Exists())
×
52
            throw new Exception($"The sql bak file {Filepath} does not exist");
×
53

54
        var fileOnlyCommand = $"RESTORE FILELISTONLY FROM DISK = '{Filepath}'";
×
55
        using var fileInfo = new DataTable();
×
56
        using var con = (SqlConnection)db.Server.GetConnection();
×
57
        using (var cmd = new SqlCommand(fileOnlyCommand, con))
×
NEW
58
        using (var da = new SqlDataAdapter(cmd))
×
59
            da.Fill(fileInfo);
×
60
        var primaryFiles = fileInfo.Select("Type = 'D'");
×
61
        var logFiles = fileInfo.Select("Type = 'L'");
×
62
        if (primaryFiles.Length != 1 || logFiles.Length != 1)
×
63
        {
64
            //Something has gone wrong
65
            return ExitCodeType.Error;
×
66
        }
67

68

69
        var primaryFile = primaryFiles[0];
×
70
        var logFile = logFiles[0];
×
NEW
71
        if (string.IsNullOrWhiteSpace(PrimaryFilePhysicalName))
×
NEW
72
            PrimaryFilePhysicalName = primaryFile["PhysicalName"].ToString();
×
NEW
73
        if (string.IsNullOrWhiteSpace(LogFilePhysicalName))
×
NEW
74
            LogFilePhysicalName = logFile["PhysicalName"].ToString();
×
75

NEW
76
        if (File.Exists(PrimaryFilePhysicalName) || File.Exists(LogFilePhysicalName))
×
77
        {
78
            var timestamp = DateTime.Now.Millisecond.ToString();
×
NEW
79
            var primaryFileName = PrimaryFilePhysicalName[..^4];
×
NEW
80
            var primaryFileExtension = PrimaryFilePhysicalName[^4..];
×
NEW
81
            PrimaryFilePhysicalName = $"{primaryFileName}_{timestamp}{primaryFileExtension}";
×
NEW
82
            var logFileName = LogFilePhysicalName[..^4];
×
NEW
83
            var logFileExtension = LogFilePhysicalName[^4..];
×
NEW
84
            LogFilePhysicalName = $"{logFileName}_{timestamp}{logFileExtension}";
×
85
        }
86

87
        var name = db.ToString();
×
88

89
        var restoreCommand = @$"
×
90
        use master;
×
91
        ALTER DATABASE {name} SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
×
92
        RESTORE DATABASE {name}
×
93
        FROM DISK = '{Filepath}'
×
NEW
94
        WITH MOVE '{primaryFile["LogicalName"]}' TO '{PrimaryFilePhysicalName}',
×
NEW
95
        MOVE '{logFile["LogicalName"]}' TO '{LogFilePhysicalName}' ,  NOUNLOAD,  REPLACE,  STATS = 5;
×
96
        ALTER DATABASE {name} SET MULTI_USER;
×
97
        ";
×
98

99
        job.OnNotify(this, new NotifyEventArgs(ProgressEventType.Information,
×
100
            $"Executing script {Filepath} ( against {db})"));
×
101

102
        var executer = new ExecuteSqlInDleStage(job, _loadStage);
×
103
        return executer.Execute(restoreCommand, db);
×
104
    }
×
105

106

107
    public override bool Exists() => File.Exists(Filepath);
×
108

109
    public override void Abort(IDataLoadEventListener postLoadEventListener)
110
    {
111
    }
×
112

113
    public override void LoadCompletedSoDispose(ExitCodeType exitCode, IDataLoadEventListener postLoadEventListener)
114
    {
115
    }
×
116

117
    public override void Check(ICheckNotifier notifier)
118
    {
119
        if (string.IsNullOrWhiteSpace(Filepath))
×
120
        {
121
            notifier.OnCheckPerformed(
×
122
                new CheckEventArgs($"ExecuteSqlFileTask {_task} does not have a path specified",
×
123
                    CheckResult.Fail));
×
124
            return;
×
125
        }
126

127
        if (!File.Exists(Filepath))
×
128
            notifier.OnCheckPerformed(
×
129
                new CheckEventArgs(
×
130
                    $"File '{Filepath}' does not exist! (the only time this would be legal is if you have an exe or a freaky plugin that creates this file)",
×
131
                    CheckResult.Warning));
×
132
        else
133
            notifier.OnCheckPerformed(new CheckEventArgs($"Found File '{Filepath}'",
×
134
                CheckResult.Success));
×
135
    }
×
136
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc