Compare View
Commits (3)
-
- CompareDirectories funkció beépítése
Showing
6 changed files
Show diff stats
Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - CommandLineParser.cs
@@ -288,12 +288,18 @@ namespace Vrh.Log4Pro.MaintenanceConsole.CommandLineParserNS | @@ -288,12 +288,18 @@ namespace Vrh.Log4Pro.MaintenanceConsole.CommandLineParserNS | ||
288 | public static class Functions | 288 | public static class Functions |
289 | { | 289 | { |
290 | public const string CMD_PACKAGES = "-PACKAGES"; | 290 | public const string CMD_PACKAGES = "-PACKAGES"; |
291 | - public static class CreateBackupPackage | 291 | + public const string CMD_DIR1 = "-DIR1"; |
292 | + public const string CMD_DIR2 = "-DIR2"; | ||
293 | + public static class CreateBackupPackage | ||
292 | { | 294 | { |
293 | public const string KEY = "CRE"; | 295 | public const string KEY = "CRE"; |
294 | } | 296 | } |
295 | - } | ||
296 | - } | 297 | + public static class CompareDirectories |
298 | + { | ||
299 | + public const string KEY = "COM"; | ||
300 | + } | ||
301 | + } | ||
302 | + } | ||
297 | public static class SQLDataBaseManager | 303 | public static class SQLDataBaseManager |
298 | { | 304 | { |
299 | public const string KEY = "SQL"; | 305 | public const string KEY = "SQL"; |
Vrh.Log4Pro.MaintenanceConsole/Manager - BackupPackageManager.cs
@@ -22,6 +22,8 @@ using Vrh.XmlProcessing; | @@ -22,6 +22,8 @@ using Vrh.XmlProcessing; | ||
22 | using VRH.Common; | 22 | using VRH.Common; |
23 | using System.Xml.Linq; | 23 | using System.Xml.Linq; |
24 | using System.Text.RegularExpressions; | 24 | using System.Text.RegularExpressions; |
25 | +using System.Security.Cryptography; | ||
26 | +using System.Numerics; | ||
25 | 27 | ||
26 | namespace Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS | 28 | namespace Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS |
27 | { | 29 | { |
@@ -42,7 +44,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS | @@ -42,7 +44,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS | ||
42 | 44 | ||
43 | var menufunctions = new Menu("Manage Backup Packages", "Select the management function!") | 45 | var menufunctions = new Menu("Manage Backup Packages", "Select the management function!") |
44 | .AddMenuItem(new Menu.Item(CLP.Module.BackupPackageManager.Functions.CreateBackupPackage.KEY, "Create backup package", CreateBackupPackage,ep)) | 46 | .AddMenuItem(new Menu.Item(CLP.Module.BackupPackageManager.Functions.CreateBackupPackage.KEY, "Create backup package", CreateBackupPackage,ep)) |
45 | - .SetSelectionMode(Menu.SelectionMode.Single) | 47 | + .AddMenuItem(new Menu.Item(CLP.Module.BackupPackageManager.Functions.CompareDirectories.KEY, "Compare directories", CompareDirectories, ep)) |
48 | + .SetSelectionMode(Menu.SelectionMode.Single) | ||
46 | .SetMenuHeaderDisplayer(BackupPackageListDisplayer); | 49 | .SetMenuHeaderDisplayer(BackupPackageListDisplayer); |
47 | menufunctions.ExecuteMenu(functionkey); | 50 | menufunctions.ExecuteMenu(functionkey); |
48 | return o2; | 51 | return o2; |
@@ -50,7 +53,213 @@ namespace Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS | @@ -50,7 +53,213 @@ namespace Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS | ||
50 | #endregion Execute | 53 | #endregion Execute |
51 | 54 | ||
52 | #region First level Executors with UI | 55 | #region First level Executors with UI |
53 | - private static object CreateBackupPackage(object parameter, object o) | 56 | + internal static object CompareDirectories(object parameter, object o) |
57 | + { | ||
58 | + var config = parameter==null?null:((parameter as Menu.ExecutorParameter).GetConfig<BackupPackageManagerXmlProcessor>()); | ||
59 | + var args = parameter == null ? null : ((parameter as Menu.ExecutorParameter).Args); | ||
60 | + | ||
61 | + var dir1= CommandLine.GetCommandLineArgument(args, CLP.Module.BackupPackageManager.Functions.CMD_DIR1); | ||
62 | + var dir2 = CommandLine.GetCommandLineArgument(args, CLP.Module.BackupPackageManager.Functions.CMD_DIR2); | ||
63 | + | ||
64 | + | ||
65 | + string rootWORKING = ColorConsole.ReadLine("Enter path to WORKING INSTALLATION directory:", defaultvalue: dir1 ?? "", required: true); //@"C:\Path\To\Folder1"; | ||
66 | + string rootUPGRADE = ColorConsole.ReadLine("Enter path to UPGRADE INSTALLATION directory:", defaultvalue: dir1 ?? "", required: true); //@"C:\Path\To\Folder2"; | ||
67 | + string searchpatterncsvlist = ColorConsole.ReadLine("Enter search pattern (csv list):", defaultvalue: "*.dll,*.exe", required: true); //@"C:\Path\To\Folder2"; | ||
68 | + | ||
69 | + rootWORKING = rootWORKING + @"\"; rootWORKING.Replace(@"/", @"\").Replace(@"\\", @"\"); | ||
70 | + rootUPGRADE = rootUPGRADE + @"\"; rootUPGRADE.Replace(@"/", @"\").Replace(@"\\", @"\"); | ||
71 | + | ||
72 | + ColorConsole.WriteLine("Comparing folders..."); | ||
73 | + ColorConsole.WriteLine($" WORKING INSTALLATION: {rootWORKING}"); | ||
74 | + ColorConsole.WriteLine($" UPGRADE INSTALLATION: {rootUPGRADE}"); | ||
75 | + ColorConsole.WriteLine($" Search patterns: {searchpatterncsvlist}"); | ||
76 | + ColorConsole.WriteLine(); | ||
77 | + | ||
78 | + | ||
79 | + var folderWFiles = GetFilesWithRelativePaths(rootWORKING, searchpatterncsvlist); | ||
80 | + var folder2Files = GetFilesWithRelativePaths(rootUPGRADE, searchpatterncsvlist); | ||
81 | + | ||
82 | + | ||
83 | + var allfiles = new HashSet<string>(folderWFiles.Keys); | ||
84 | + allfiles.UnionWith(folder2Files.Keys); | ||
85 | + | ||
86 | + var savedcursortop = Console.CursorTop; | ||
87 | + Console.WriteLine(); | ||
88 | + var actualcursortop = Console.CursorTop; | ||
89 | + var numberofprocessedfiles = 0; | ||
90 | + var upgradefiles = new Dictionary<string, (CompareDirectoriesActions,string)>(); | ||
91 | + string previousdirectory = null; | ||
92 | + foreach (var onefile in allfiles.OrderBy(p => Path.GetDirectoryName(p))) | ||
93 | + { | ||
94 | + numberofprocessedfiles++; | ||
95 | + if (numberofprocessedfiles < 25) | ||
96 | + { | ||
97 | + actualcursortop = Console.CursorTop; | ||
98 | + ColorConsole.SetCursorPosition(0, savedcursortop); ColorConsole.Write(onefile, suffix: new string(' ', 20)); | ||
99 | + ColorConsole.SetCursorPosition(0, actualcursortop); | ||
100 | + } | ||
101 | + bool inWORKFolder = folderWFiles.TryGetValue(onefile, out string file1); | ||
102 | + bool inUPGRADEFolder = folder2Files.TryGetValue(onefile, out string file2); | ||
103 | + | ||
104 | + if (inWORKFolder && inUPGRADEFolder) | ||
105 | + { | ||
106 | + if (!FilesAreEqual(file1, file2, out string difftext)) | ||
107 | + { | ||
108 | + string actualdirectory = Path.GetDirectoryName(onefile); | ||
109 | + if (previousdirectory != actualdirectory) | ||
110 | + { | ||
111 | + ColorConsole.WriteLine(actualdirectory, ConsoleColor.DarkYellow); | ||
112 | + previousdirectory = actualdirectory; | ||
113 | + } | ||
114 | + //ColorConsole.WriteLine($"DIFFERENT ({difftext}): {relativePath}", ConsoleColor.Yellow); | ||
115 | + ColorConsole.WriteLine($"< {onefile} ({difftext}):", ConsoleColor.Yellow); | ||
116 | + upgradefiles.Add(onefile, (CompareDirectoriesActions.CopyFROMUPGRADE, $"({difftext})")); | ||
117 | + } | ||
118 | + } | ||
119 | + else if (inWORKFolder) | ||
120 | + { | ||
121 | + string actualdirectory = Path.GetDirectoryName(onefile); | ||
122 | + if (previousdirectory != actualdirectory) | ||
123 | + { | ||
124 | + ColorConsole.WriteLine(actualdirectory, ConsoleColor.DarkYellow); | ||
125 | + previousdirectory = actualdirectory; | ||
126 | + } | ||
127 | + //ColorConsole.WriteLine($"ONLY IN Folder1: {relativePath}", ConsoleColor.Yellow); | ||
128 | + ColorConsole.WriteLine($"-- {onefile}", ConsoleColor.Yellow); | ||
129 | + upgradefiles.Add(onefile, (CompareDirectoriesActions.DeleteINWORKING,"")); | ||
130 | + } | ||
131 | + else if (inUPGRADEFolder) | ||
132 | + { | ||
133 | + string actualdirectory = Path.GetDirectoryName(onefile); | ||
134 | + if (previousdirectory != actualdirectory) | ||
135 | + { | ||
136 | + ColorConsole.WriteLine(actualdirectory, ConsoleColor.DarkYellow); | ||
137 | + previousdirectory = actualdirectory; | ||
138 | + } | ||
139 | + //ColorConsole.WriteLine($"ONLY IN Folder2: {relativePath}", ConsoleColor.Yellow); | ||
140 | + ColorConsole.WriteLine($"<< {onefile}", ConsoleColor.Yellow); | ||
141 | + upgradefiles.Add(onefile, (CompareDirectoriesActions.CopyFROMUPGRADE,"(new file)")); | ||
142 | + } | ||
143 | + } | ||
144 | + ColorConsole.WriteLine(); | ||
145 | + ColorConsole.WriteLine("Do You want to upgrade WORKING INSTALLATION with UPGRADE INSTALLATION?"); | ||
146 | + ColorConsole.WriteLine(rootWORKING,prefix:" WORKING INSTALLATION root folder:"); | ||
147 | + ColorConsole.WriteLine(rootUPGRADE,prefix:" UPGRADE INSTALLATION root folder:"); | ||
148 | + string doupgradetxt = ColorConsole.ReadLine("Do upgrade?",validitylist: new List<string>{"yes","no","YES","NO","ask","ASK" }, defaultvalue: "no", required: true); | ||
149 | + if (doupgradetxt.ToUpper() == "EX") return o; | ||
150 | + if (doupgradetxt.ToUpper() == "YES" || doupgradetxt.ToUpper() == "ASK") | ||
151 | + { | ||
152 | + bool ask = doupgradetxt.ToUpper() == "ASK"; | ||
153 | + bool goontoall = false; | ||
154 | + foreach (var uf in upgradefiles) | ||
155 | + { | ||
156 | + bool goon = true; | ||
157 | + if (ask && !goontoall) | ||
158 | + { | ||
159 | + string actiontext = uf.Value.Item1 == CompareDirectoriesActions.CopyFROMUPGRADE ? "upgrade" : "remove"; | ||
160 | + ColorConsole.WriteLine($"Do You want to {actiontext} file in WORKING INSTALLATION?"); | ||
161 | + var validitylist = new List<string> { "yes", "no", "YES", "NO", "yestoall", "YESTOALL", }; | ||
162 | + string goontxt = ColorConsole.ReadLine(uf.Key,f:ConsoleColor.Yellow, prefix:" file:",suffix:uf.Value.Item2, validitylist:validitylist, defaultvalue: "no", required: true); | ||
163 | + if (goontxt.ToUpper() == "EX") return o; | ||
164 | + goon = goontxt.ToUpper() == "YES"; | ||
165 | + goontoall = goontxt.ToUpper() == "YESTOALL"; | ||
166 | + } | ||
167 | + if (goon || goontoall) | ||
168 | + { | ||
169 | + if (uf.Value.Item1 == CompareDirectoriesActions.CopyFROMUPGRADE) { File.Copy(Path.Combine(rootUPGRADE, uf.Key), Path.Combine(rootWORKING, uf.Key), overwrite: true); } | ||
170 | + else if (uf.Value.Item1 == CompareDirectoriesActions.DeleteINWORKING) { File.Delete(Path.Combine(rootWORKING, uf.Key)); } | ||
171 | + } | ||
172 | + } | ||
173 | + } | ||
174 | + return o; | ||
175 | + } | ||
176 | + private enum CompareDirectoriesActions { CopyFROMUPGRADE, DeleteINWORKING,} | ||
177 | + private static Dictionary<string, string> GetFilesWithRelativePaths(string root,string searchpattern="*") | ||
178 | + { | ||
179 | + var searchpatternlist = searchpattern.Split(new char[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries); | ||
180 | + List<string> files = new List<string>() { }; | ||
181 | + foreach (var sp in searchpatternlist) | ||
182 | + { | ||
183 | + files.AddRange(Directory.GetFiles(root, sp, SearchOption.AllDirectories)); | ||
184 | + } | ||
185 | + var dict = new Dictionary<string, string>(); | ||
186 | + foreach (var fileAbsolutPath in files) | ||
187 | + { | ||
188 | + string relativePath = GetRelativePath(root, fileAbsolutPath); | ||
189 | + dict[relativePath] = fileAbsolutPath; | ||
190 | + } | ||
191 | + return dict; | ||
192 | + } | ||
193 | + /// <summary> | ||
194 | + /// Creates a relative path from one file or folder to another. | ||
195 | + /// </summary> | ||
196 | + /// <param name="fromPath">Contains the directory that defines the start of the relative path.</param> | ||
197 | + /// <param name="toPath">Contains the path that defines the endpoint of the relative path.</param> | ||
198 | + /// <returns>The relative path from the start directory to the end path or <c>toPath</c> if the paths are not related.</returns> | ||
199 | + /// <exception cref="ArgumentNullException"></exception> | ||
200 | + /// <exception cref="UriFormatException"></exception> | ||
201 | + /// <exception cref="InvalidOperationException"></exception> | ||
202 | + public static string GetRelativePath(String fromPath, String toPath) | ||
203 | + { | ||
204 | + if (String.IsNullOrEmpty(fromPath)) throw new ArgumentNullException("fromPath"); | ||
205 | + if (String.IsNullOrEmpty(toPath)) throw new ArgumentNullException("toPath"); | ||
206 | + | ||
207 | + Uri fromUri = new Uri(fromPath); | ||
208 | + Uri toUri = new Uri(toPath); | ||
209 | + | ||
210 | + if (fromUri.Scheme != toUri.Scheme) { return toPath; } // path can't be made relative. | ||
211 | + | ||
212 | + Uri relativeUri = fromUri.MakeRelativeUri(toUri); | ||
213 | + String relativePath = Uri.UnescapeDataString(relativeUri.ToString()); | ||
214 | + | ||
215 | + if (toUri.Scheme.Equals("file", StringComparison.InvariantCultureIgnoreCase)) | ||
216 | + { | ||
217 | + relativePath = relativePath.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar); | ||
218 | + } | ||
219 | + | ||
220 | + return relativePath; | ||
221 | + } | ||
222 | + private static bool FilesAreEqual(string WORKINGfilePath, string UPGRADEfilePath,out string differencetext) | ||
223 | + { | ||
224 | + differencetext = null; | ||
225 | + var fiW = new FileInfo(WORKINGfilePath); | ||
226 | + var fiU = new FileInfo(UPGRADEfilePath); | ||
227 | + | ||
228 | + var fvW = FileVersionInfo.GetVersionInfo(WORKINGfilePath); | ||
229 | + var fvU = FileVersionInfo.GetVersionInfo(UPGRADEfilePath); | ||
230 | + var fvW1=GetVersionNumber(fvW, out string fvW2); | ||
231 | + var fvU1 = GetVersionNumber(fvU, out string fvU2); | ||
232 | + var fveresiondifftext = "";// $" {fvW1}<>{fvU1};{fvW2}<>{fvU2}"; | ||
233 | + var pvW1 = GetVersionNumber(fvW, out string pvW2,true); | ||
234 | + var pvU1 = GetVersionNumber(fvU, out string pvU2,true); | ||
235 | + var pveresiondifftext = "";// $" {pvW1}<>{pvU1};{pvW2}<>{pvU2}"; | ||
236 | + if (fvW.FileVersion != fvU.FileVersion) { string oldertext = fvW1 > fvU1 ? "DOWNGRADE":"UPGRADE"; differencetext = $"{oldertext} FileVersion: {fveresiondifftext} {fvW.FileVersion} <--> {fvU.FileVersion}"; return false; } | ||
237 | + if (fvW.ProductVersion != fvU.ProductVersion) { string oldertext = pvW1 > pvU1 ? "DOWNGRADE" : "UPGRADE"; differencetext = $"{oldertext} ProductVersion: {pveresiondifftext} {fvW.ProductVersion} <--> {fvU.ProductVersion}"; return false; } | ||
238 | + //if (fi1.CreationTime != fi2.CreationTime) return false; | ||
239 | + //if (fi1.LastWriteTimeUtc != fi2.LastWriteTimeUtc) { differencetext = "LastWriteTimeUTC"; return false; } | ||
240 | + if (fiW.Length != fiU.Length) { string oldertext = fiW.Length > fiU.Length?"DOWNSIZE":"UPSIZE"; differencetext = $"Length: {oldertext} {fiW.Length} <--> {fiU.Length}"; return false; } | ||
241 | + using (var sha256 = SHA256.Create()) | ||
242 | + using (var stream1 = File.OpenRead(WORKINGfilePath)) | ||
243 | + using (var stream2 = File.OpenRead(UPGRADEfilePath)) | ||
244 | + { | ||
245 | + var hash1 = sha256.ComputeHash(stream1); | ||
246 | + var hash2 = sha256.ComputeHash(stream2); | ||
247 | + | ||
248 | + if (!hash1.SequenceEqual(hash2)) { differencetext = "Hash/Content"; return false; } | ||
249 | + } | ||
250 | + return true; | ||
251 | + } | ||
252 | + private static long GetVersionNumber(FileVersionInfo vi,out string vt,bool useproductversion=false) | ||
253 | + { | ||
254 | + vt = useproductversion | ||
255 | + ? $"{vi.ProductMajorPart}.{vi.ProductMinorPart}.{vi.ProductBuildPart}.{vi.ProductPrivatePart}" | ||
256 | + : $"{vi.FileMajorPart}.{vi.FileMinorPart}.{vi.FileBuildPart}.{vi.FilePrivatePart}"; | ||
257 | + long numberbase = 10000; | ||
258 | + return useproductversion | ||
259 | + ? vi.ProductMajorPart * numberbase * numberbase * numberbase + vi.ProductMinorPart * numberbase * numberbase + vi.ProductBuildPart * numberbase + vi.ProductPrivatePart | ||
260 | + : vi.FileMajorPart * numberbase * numberbase * numberbase + vi.FileMinorPart * numberbase * numberbase + vi.FileBuildPart * numberbase + vi.FilePrivatePart; | ||
261 | + } | ||
262 | + private static object CreateBackupPackage(object parameter, object o) | ||
54 | { | 263 | { |
55 | var config = (parameter as Menu.ExecutorParameter).GetConfig< BackupPackageManagerXmlProcessor>(); | 264 | var config = (parameter as Menu.ExecutorParameter).GetConfig< BackupPackageManagerXmlProcessor>(); |
56 | var args = (parameter as Menu.ExecutorParameter).Args; | 265 | var args = (parameter as Menu.ExecutorParameter).Args; |
Vrh.Log4Pro.MaintenanceConsole/Manager - SQLDataBaseManager.cs
@@ -33,6 +33,8 @@ using System.Data.Entity.Core.Common.CommandTrees.ExpressionBuilder; | @@ -33,6 +33,8 @@ using System.Data.Entity.Core.Common.CommandTrees.ExpressionBuilder; | ||
33 | using System.Windows.Controls; | 33 | using System.Windows.Controls; |
34 | using Menu = Vrh.Log4Pro.MaintenanceConsole.MenuNS.Menu; | 34 | using Menu = Vrh.Log4Pro.MaintenanceConsole.MenuNS.Menu; |
35 | using static Vrh.Log4Pro.MaintenanceConsole.MenuNS.Menu; | 35 | using static Vrh.Log4Pro.MaintenanceConsole.MenuNS.Menu; |
36 | +using System.Security.AccessControl; | ||
37 | +using System.Data; | ||
36 | 38 | ||
37 | namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | 39 | namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS |
38 | { | 40 | { |
@@ -1382,10 +1384,10 @@ GO | @@ -1382,10 +1384,10 @@ GO | ||
1382 | #endregion private method: DisplayDataBaseInfo | 1384 | #endregion private method: DisplayDataBaseInfo |
1383 | #endregion private methods | 1385 | #endregion private methods |
1384 | } | 1386 | } |
1385 | - #endregion SQLDataBaseManager class | 1387 | + #endregion SQLDataBaseManager class |
1386 | 1388 | ||
1387 | - #region class SQLDataBaseManager | ||
1388 | - public static class SQLDataBaseManagerCore | 1389 | + #region class SQLDataBaseManagerCore |
1390 | + public static class SQLDataBaseManagerCore | ||
1389 | { | 1391 | { |
1390 | /// <summary> | 1392 | /// <summary> |
1391 | /// Egy adatbázis fizikai file-jainak mozgatása egy másik lokációba | 1393 | /// Egy adatbázis fizikai file-jainak mozgatása egy másik lokációba |
@@ -1539,14 +1541,26 @@ GO | @@ -1539,14 +1541,26 @@ GO | ||
1539 | finally { sqlserver?.ConnectionContext.SqlConnectionObject.Dispose(); } | 1541 | finally { sqlserver?.ConnectionContext.SqlConnectionObject.Dispose(); } |
1540 | } | 1542 | } |
1541 | 1543 | ||
1542 | - /// <summary> | ||
1543 | - /// Create SQL DB backup | ||
1544 | - /// </summary> | ||
1545 | - /// <param name="sqld">az sql db-t leíró descriptor</param> | ||
1546 | - /// <param name="forcecreatezip"></param> | ||
1547 | - /// <param name="timestamp"></param> | ||
1548 | - /// <returns></returns> | ||
1549 | - public static string CreateBackup(SQLDataBase sqld,bool? forcecreatezip, DateTime? timestamp,bool emulate=false) | 1544 | + private static void RunEXEOnRemoteComputer(string servername,string username, string password, string exefilename) |
1545 | + { | ||
1546 | + var processToRun = new[] { exefilename/*"notepad.exe"*/ }; | ||
1547 | + var connection = new ConnectionOptions(); | ||
1548 | + connection.Username = username; | ||
1549 | + connection.Password = password; | ||
1550 | + var wmiScope = new ManagementScope(String.Format(@"\\{0}\root\cimv2", servername), connection); | ||
1551 | + var wmiProcess = new ManagementClass(wmiScope, new ManagementPath("Win32_Process"), new ObjectGetOptions()); | ||
1552 | + wmiProcess.InvokeMethod("Create", processToRun); | ||
1553 | + } | ||
1554 | + | ||
1555 | + | ||
1556 | + /// <summary> | ||
1557 | + /// Create SQL DB backup | ||
1558 | + /// </summary> | ||
1559 | + /// <param name="sqld">az sql db-t leíró descriptor</param> | ||
1560 | + /// <param name="forcecreatezip"></param> | ||
1561 | + /// <param name="timestamp"></param> | ||
1562 | + /// <returns></returns> | ||
1563 | + public static string CreateBackup(SQLDataBase sqld,bool? forcecreatezip, DateTime? timestamp,bool emulate=false) | ||
1550 | { | 1564 | { |
1551 | string backupdirectorypath = sqld.Xml_BackupTargetDirectoryPath; | 1565 | string backupdirectorypath = sqld.Xml_BackupTargetDirectoryPath; |
1552 | string tranzitdirectorypath = sqld.Xml_PrimaryDB_TranzitDirectoryPath; | 1566 | string tranzitdirectorypath = sqld.Xml_PrimaryDB_TranzitDirectoryPath; |
@@ -1599,57 +1613,32 @@ GO | @@ -1599,57 +1613,32 @@ GO | ||
1599 | 1613 | ||
1600 | if (!emulate) | 1614 | if (!emulate) |
1601 | { | 1615 | { |
1602 | - ColorConsole.WriteLine($"Database backup started...", ConsoleColor.DarkGreen); | ||
1603 | - if (File.Exists(backupFullName)) { File.Delete(backupFullName); } | ||
1604 | - var smoBackup = new Backup(); | ||
1605 | - smoBackup.Database = dbname; | ||
1606 | - smoBackup.Action = BackupActionType.Database; | ||
1607 | - smoBackup.BackupSetName = smoBackup.Database + " Backup"; | ||
1608 | - smoBackup.BackupSetDescription = $"Full Backup of {smoBackup.Database}"; | ||
1609 | - smoBackup.MediaDescription = "Disk"; | ||
1610 | - Console.WriteLine($"Backup set: {smoBackup.BackupSetName} ({smoBackup.BackupSetDescription}) to media: {smoBackup.MediaDescription}"); | ||
1611 | - string dummystring = sqld.Xml_PrimaryDB_IsUseTranzit ? " REMOTE SQL SERVER!" : ""; | ||
1612 | - Console.WriteLine($"Database name: {smoBackup.Database}{dummystring}"); | ||
1613 | - Console.WriteLine($"Connection string: {sqld.SQLCS_Primary}"); | ||
1614 | - smoBackup.Devices.AddDevice(sqld.Xml_PrimaryDB_IsUseTranzit ? tranzitFullName : backupFullName, DeviceType.File); | ||
1615 | - Console.WriteLine($"Backup full name:{backupFullName}"); | ||
1616 | - if (sqld.Xml_PrimaryDB_IsUseTranzit) | ||
1617 | - { | ||
1618 | - Console.WriteLine($" ...will be created through tranzit: {tranzitFullName}"); | ||
1619 | - } | ||
1620 | - smoBackup.PercentComplete += SmoBackupRestore_PercentComplete; | ||
1621 | - smoBackup.PercentCompleteNotification = 1; | 1616 | + ColorConsole.WriteLine($"Database backup started...", ConsoleColor.DarkGreen); |
1617 | + if (File.Exists(backupFullName)) { File.Delete(backupFullName); } | ||
1618 | + | ||
1619 | + | ||
1620 | + Console.WriteLine($"Backup set: {dbname + " Backup"} (Full backup of {dbname}) to media: Disk"); | ||
1621 | + string dummystring = sqld.Xml_PrimaryDB_IsUseTranzit ? " REMOTE SQL SERVER!" : ""; | ||
1622 | + Console.WriteLine($"Database name: {dbname}{dummystring}"); | ||
1623 | + Console.WriteLine($"Connection string: {sqld.SQLCS_Primary}"); | ||
1624 | + Console.WriteLine($"Backup full name:{backupFullName}"); | ||
1625 | + if (sqld.Xml_PrimaryDB_IsUseTranzit) { Console.WriteLine($" ...will be created through through tranzit {tranzitFullName}"); } | ||
1626 | + | ||
1627 | + var result = BackupDatabase(sqld.Xml_PrimaryDB_IsUseTranzit ? tranzitFullName : backupFullName, sqld.SQLCS_Primary, sqld.Xml_BackupTimeout, SmoBackupRestore_PercentComplete); | ||
1628 | + | ||
1629 | + Console.WriteLine($""); | ||
1630 | + Console.WriteLine("BACKUP " + (result.Success?"SUCCESS":"FAILURE") + ". " + result.Resulttext); | ||
1622 | 1631 | ||
1623 | - Server sqlserver = null; | ||
1624 | - try | ||
1625 | - { | ||
1626 | - sqlserver = SQLServerConnect(sqld.SQLCS_Primary, "master"); if (sqlserver == null) { return null; } | ||
1627 | - sqlserver.ConnectionContext.StatementTimeout = sqld.Xml_BackupTimeout; | ||
1628 | - backupstarttime = DateTime.Now; | ||
1629 | - smoBackup.SqlBackupAsync(sqlserver); | ||
1630 | - smoBackup.Wait(); | ||
1631 | - //smoBackup.Wait(); | ||
1632 | - Console.WriteLine($""); | ||
1633 | - Console.WriteLine($"Backup completed. Backup time: {(int)(DateTime.Now.Subtract(backupstarttime).TotalSeconds)}sec."); | ||
1634 | - } | ||
1635 | - catch (Exception ex) | ||
1636 | - { | ||
1637 | - ColorConsole.WriteLine($"ERROR! Database backup failed. DB name:'{smoBackup.Database}'. BAK/ZIP file name:'{Path.GetFileName(returnfilename)}'", ConsoleColor.Red); | ||
1638 | - var errmsg = ""; while (ex != null) { errmsg += ";" + ex.Message;ex = ex.InnerException; } | ||
1639 | - ColorConsole.WriteLine(errmsg, ConsoleColor.Red); | ||
1640 | - return null; | ||
1641 | - } | ||
1642 | - finally { sqlserver?.ConnectionContext.SqlConnectionObject.Dispose(); } | ||
1643 | if (sqld.Xml_PrimaryDB_IsUseTranzit && File.Exists(tranzitFullName)) | 1632 | if (sqld.Xml_PrimaryDB_IsUseTranzit && File.Exists(tranzitFullName)) |
1644 | { | 1633 | { |
1645 | - File.Move(tranzitFullName, backupFullName); | ||
1646 | - Console.WriteLine($"Moving backup file..."); | ||
1647 | - Console.WriteLine($" ...from tranzit location: {tranzitFullName}"); | ||
1648 | - Console.WriteLine($" ...to backup location: {backupFullName}"); | 1634 | + Console.WriteLine($"Moving backup file..."); |
1635 | + Console.WriteLine($" ...from tranzit location: {tranzitFullName}"); | ||
1636 | + Console.WriteLine($" ...to backup location: {backupFullName}"); | ||
1637 | + File.Move(tranzitFullName, backupFullName); | ||
1649 | } | 1638 | } |
1650 | if (!File.Exists(backupFullName)) | 1639 | if (!File.Exists(backupFullName)) |
1651 | { | 1640 | { |
1652 | - ColorConsole.WriteLine($"ERROR! Database backup failed. DB name:'{smoBackup.Database}'. BAK/ZIP file name:'{Path.GetFileName(returnfilename)}'", ConsoleColor.Red); | 1641 | + ColorConsole.WriteLine($"ERROR! Database backup failed. DB name:'{dbname}'. BAK/ZIP file name:'{Path.GetFileName(returnfilename)}'", ConsoleColor.Red); |
1653 | return null; | 1642 | return null; |
1654 | } | 1643 | } |
1655 | if (createzip) | 1644 | if (createzip) |
@@ -1661,12 +1650,76 @@ GO | @@ -1661,12 +1650,76 @@ GO | ||
1661 | File.Delete(backupFullName); | 1650 | File.Delete(backupFullName); |
1662 | Console.WriteLine($"Zipping completed. Compressing time: {(int)(DateTime.Now.Subtract(startcompressing).TotalSeconds)}sec."); | 1651 | Console.WriteLine($"Zipping completed. Compressing time: {(int)(DateTime.Now.Subtract(startcompressing).TotalSeconds)}sec."); |
1663 | } | 1652 | } |
1664 | - ColorConsole.WriteLine($"SUCCESS! Database backup created. DB name:'{smoBackup.Database}'. BAK/ZIP file name:'{Path.GetFileName(returnfilename)}'", ConsoleColor.DarkGreen); | 1653 | + ColorConsole.WriteLine($"SUCCESS! Database backup created. DB name:'{dbname}'. BAK/ZIP file name:'{Path.GetFileName(returnfilename)}'", ConsoleColor.DarkGreen); |
1665 | } | 1654 | } |
1666 | return returnfilename; | 1655 | return returnfilename; |
1667 | } | 1656 | } |
1668 | private static DateTime backupstarttime; | 1657 | private static DateTime backupstarttime; |
1669 | - private static void SmoBackupRestore_PercentComplete(object sender, PercentCompleteEventArgs e) | 1658 | + private static (bool Success, string Resulttext, string Header) BackupDatabase(string backuptargetfilename, string sqlconnectionstringtodatabase, int BackupTimeout, PercentCompleteEventHandler pcEventHandler) |
1659 | + { | ||
1660 | + string DatabaseName = ServerConnectionPool.GetSqlConnection(sqlconnectionstringtodatabase).Database; | ||
1661 | + string Header = $"Sql connection to database:{sqlconnectionstringtodatabase} Backup target:{backuptargetfilename}"; | ||
1662 | + string SUCCESSTEXT = "Done with SUCCESS; Time elapsed:{0}"; | ||
1663 | + string EXCEPTIONTEXT = "BACKUPEXCEPTION: {0}"; | ||
1664 | + string SERVERCONNECTIONFAILURETEXT = "SERVERCONNECTIONFAILURE"; | ||
1665 | + backupstarttime = DateTime.Now; | ||
1666 | + bool mode = false; | ||
1667 | + if (mode) | ||
1668 | + { | ||
1669 | + var SQLCtos = ServerConnectionPool.GetSqlConnection(sqlconnectionstringtodatabase, "master"); | ||
1670 | + string SqlConnectionStringToServer = SQLCtos.ConnectionString; | ||
1671 | + DatabaseName = "[" + DatabaseName + "]"; | ||
1672 | + string SQLBackUp = @"BACKUP DATABASE " + DatabaseName + " TO DISK = N'" + backuptargetfilename + @"'"; | ||
1673 | + SqlConnection cnBk = new SqlConnection(SqlConnectionStringToServer); | ||
1674 | + SqlCommand cmdBkUp = new SqlCommand(SQLBackUp, cnBk); | ||
1675 | + cmdBkUp.CommandTimeout = BackupTimeout; | ||
1676 | + Header = $"{SQLBackUp} {Header}"; | ||
1677 | + try | ||
1678 | + { | ||
1679 | + cnBk.Open(); | ||
1680 | + cmdBkUp.ExecuteNonQuery(); | ||
1681 | + return (true, string.Format(SUCCESSTEXT, DateTime.Now.Subtract(backupstarttime).TotalSeconds), Header); | ||
1682 | + } | ||
1683 | + catch (Exception ex) | ||
1684 | + { | ||
1685 | + var errmsg = ""; while (ex != null) { errmsg += ex.Message + ";"; ex = ex.InnerException; } | ||
1686 | + return (false, string.Format(EXCEPTIONTEXT, errmsg), Header); | ||
1687 | + } | ||
1688 | + finally | ||
1689 | + { | ||
1690 | + if (cnBk.State == ConnectionState.Open) { cnBk.Close(); } | ||
1691 | + } | ||
1692 | + } | ||
1693 | + else | ||
1694 | + { | ||
1695 | + var smoBackup = new Backup(); | ||
1696 | + smoBackup.Database = DatabaseName; | ||
1697 | + smoBackup.Action = BackupActionType.Database; | ||
1698 | + smoBackup.BackupSetName = smoBackup.Database + " Backup"; | ||
1699 | + smoBackup.BackupSetDescription = $"Full Backup of {smoBackup.Database}"; | ||
1700 | + smoBackup.MediaDescription = "Disk"; | ||
1701 | + smoBackup.Devices.AddDevice(backuptargetfilename, DeviceType.File); | ||
1702 | + smoBackup.PercentComplete += pcEventHandler; | ||
1703 | + smoBackup.PercentCompleteNotification = 1; | ||
1704 | + | ||
1705 | + Server sqlserver = null; | ||
1706 | + try | ||
1707 | + { | ||
1708 | + sqlserver = SQLServerConnect(sqlconnectionstringtodatabase, "master"); if (sqlserver == null) { return (false, string.Format(SERVERCONNECTIONFAILURETEXT), Header); } | ||
1709 | + sqlserver.ConnectionContext.StatementTimeout = BackupTimeout; | ||
1710 | + smoBackup.SqlBackup(sqlserver); | ||
1711 | + //smoBackup.SqlBackupAsync(sqlserver);smoBackup.Wait(); | ||
1712 | + return (true, string.Format(SUCCESSTEXT, DateTime.Now.Subtract(backupstarttime).TotalSeconds), Header); | ||
1713 | + } | ||
1714 | + catch (Exception ex) | ||
1715 | + { | ||
1716 | + var errmsg = ""; while (ex != null) { errmsg += ex.Message + ";"; ex = ex.InnerException; } | ||
1717 | + return (false, string.Format(EXCEPTIONTEXT, errmsg), Header); | ||
1718 | + } | ||
1719 | + finally { sqlserver?.ConnectionContext.SqlConnectionObject.Dispose(); } | ||
1720 | + } | ||
1721 | + } | ||
1722 | + private static void SmoBackupRestore_PercentComplete(object sender, PercentCompleteEventArgs e) | ||
1670 | { | 1723 | { |
1671 | ColorConsole.SetCursorPosition(0, Console.CursorTop); | 1724 | ColorConsole.SetCursorPosition(0, Console.CursorTop); |
1672 | ColorConsole.Write($"Completed: {e.Percent}%. {e.Message}. Backup time : {(int)(DateTime.Now.Subtract(backupstarttime).TotalSeconds)}sec."); | 1725 | ColorConsole.Write($"Completed: {e.Percent}%. {e.Message}. Backup time : {(int)(DateTime.Now.Subtract(backupstarttime).TotalSeconds)}sec."); |
@@ -2629,10 +2682,10 @@ GO | @@ -2629,10 +2682,10 @@ GO | ||
2629 | } | 2682 | } |
2630 | #endregion BackupSqlData | 2683 | #endregion BackupSqlData |
2631 | } | 2684 | } |
2632 | - #endregion class SQLDataBaseManager | 2685 | + #endregion class SQLDataBaseManagerCore |
2633 | 2686 | ||
2634 | - #region SQLDataBaseManager class | ||
2635 | - public class SQLDataBaseManagerXmlProcessor : XmlParser | 2687 | + #region SQLDataBaseManagerXmlProcessor class |
2688 | + public class SQLDataBaseManagerXmlProcessor : XmlParser | ||
2636 | { | 2689 | { |
2637 | #region fields | 2690 | #region fields |
2638 | private List<SQLDataBase> _sqldatabaselist; | 2691 | private List<SQLDataBase> _sqldatabaselist; |
@@ -2663,10 +2716,10 @@ GO | @@ -2663,10 +2716,10 @@ GO | ||
2663 | public List<SQLDataBase> GetDefinitionList() { return _sqldatabaselist; } | 2716 | public List<SQLDataBase> GetDefinitionList() { return _sqldatabaselist; } |
2664 | #endregion GetDefinitionList | 2717 | #endregion GetDefinitionList |
2665 | } | 2718 | } |
2666 | - #endregion SQLDataBaseManager class | 2719 | + #endregion SQLDataBaseManagerXmlProcessor class |
2667 | 2720 | ||
2668 | - #region SQLDataBase class | ||
2669 | - public class SQLDataBase : XmlLinqBase | 2721 | + #region SQLDataBase class |
2722 | + public class SQLDataBase : XmlLinqBase | ||
2670 | { | 2723 | { |
2671 | #region fields | 2724 | #region fields |
2672 | public bool Valid = true; | 2725 | public bool Valid = true; |
Vrh.Log4Pro.MaintenanceConsole/Properties/AssemblyInfo.cs
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices; | @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; | ||
32 | // You can specify all the values or you can default the Build and Revision Numbers | 32 | // You can specify all the values or you can default the Build and Revision Numbers |
33 | // by using the '*' as shown below: | 33 | // by using the '*' as shown below: |
34 | // [assembly: AssemblyVersion("1.0.*")] | 34 | // [assembly: AssemblyVersion("1.0.*")] |
35 | -[assembly: AssemblyVersion("1.33.0.0")] | ||
36 | -[assembly: AssemblyFileVersion("1.33.0.0")] | 35 | +[assembly: AssemblyVersion("1.34.2.0")] |
36 | +[assembly: AssemblyFileVersion("1.34.2.0")] |
Vrh.Log4Pro.MaintenanceConsole/Vrh.Log4Pro.MaintenanceConsole.csproj
@@ -347,23 +347,23 @@ | @@ -347,23 +347,23 @@ | ||
347 | <Reference Include="Microsoft.CSharp" /> | 347 | <Reference Include="Microsoft.CSharp" /> |
348 | <Reference Include="System.Data" /> | 348 | <Reference Include="System.Data" /> |
349 | <Reference Include="System.Xml" /> | 349 | <Reference Include="System.Xml" /> |
350 | - <Reference Include="VRH.Common, Version=4.1.1.0, Culture=neutral, processorArchitecture=MSIL"> | ||
351 | - <HintPath>..\packages\VRH.Common.4.1.1\lib\net462\VRH.Common.dll</HintPath> | 350 | + <Reference Include="VRH.Common, Version=4.1.4.0, Culture=neutral, processorArchitecture=MSIL"> |
351 | + <HintPath>..\packages\VRH.Common.4.1.4\lib\net462\VRH.Common.dll</HintPath> | ||
352 | </Reference> | 352 | </Reference> |
353 | - <Reference Include="VRH.Common.COM, Version=4.1.0.0, Culture=neutral, processorArchitecture=MSIL"> | ||
354 | - <HintPath>..\packages\VRH.Common.4.1.1\lib\net462\VRH.Common.COM.dll</HintPath> | 353 | + <Reference Include="VRH.Common.COM, Version=4.1.3.0, Culture=neutral, processorArchitecture=MSIL"> |
354 | + <HintPath>..\packages\VRH.Common.4.1.4\lib\net462\VRH.Common.COM.dll</HintPath> | ||
355 | </Reference> | 355 | </Reference> |
356 | - <Reference Include="VRH.Common.EF, Version=4.1.0.0, Culture=neutral, processorArchitecture=MSIL"> | ||
357 | - <HintPath>..\packages\VRH.Common.4.1.1\lib\net462\VRH.Common.EF.dll</HintPath> | 356 | + <Reference Include="VRH.Common.EF, Version=4.1.3.0, Culture=neutral, processorArchitecture=MSIL"> |
357 | + <HintPath>..\packages\VRH.Common.4.1.4\lib\net462\VRH.Common.EF.dll</HintPath> | ||
358 | </Reference> | 358 | </Reference> |
359 | - <Reference Include="VRH.Common.Log4ProIS, Version=4.1.1.0, Culture=neutral, processorArchitecture=MSIL"> | ||
360 | - <HintPath>..\packages\VRH.Common.4.1.1\lib\net462\VRH.Common.Log4ProIS.dll</HintPath> | 359 | + <Reference Include="VRH.Common.Log4ProIS, Version=4.1.4.0, Culture=neutral, processorArchitecture=MSIL"> |
360 | + <HintPath>..\packages\VRH.Common.4.1.4\lib\net462\VRH.Common.Log4ProIS.dll</HintPath> | ||
361 | </Reference> | 361 | </Reference> |
362 | <Reference Include="Vrh.Web.Providers, Version=2.0.2.0, Culture=neutral, processorArchitecture=MSIL"> | 362 | <Reference Include="Vrh.Web.Providers, Version=2.0.2.0, Culture=neutral, processorArchitecture=MSIL"> |
363 | <HintPath>..\packages\VRH.Web.Providers.2.0.2\lib\net452\Vrh.Web.Providers.dll</HintPath> | 363 | <HintPath>..\packages\VRH.Web.Providers.2.0.2\lib\net452\Vrh.Web.Providers.dll</HintPath> |
364 | </Reference> | 364 | </Reference> |
365 | - <Reference Include="Vrh.XmlProcessing, Version=2.8.0.0, Culture=neutral, processorArchitecture=MSIL"> | ||
366 | - <HintPath>..\packages\Vrh.XmlProcessing.2.8.0\lib\net45\Vrh.XmlProcessing.dll</HintPath> | 365 | + <Reference Include="Vrh.XmlProcessing, Version=2.9.5.0, Culture=neutral, processorArchitecture=MSIL"> |
366 | + <HintPath>..\packages\Vrh.XmlProcessing.2.9.5\lib\net462\Vrh.XmlProcessing.dll</HintPath> | ||
367 | </Reference> | 367 | </Reference> |
368 | <Reference Include="WindowsBase" /> | 368 | <Reference Include="WindowsBase" /> |
369 | </ItemGroup> | 369 | </ItemGroup> |
Vrh.Log4Pro.MaintenanceConsole/packages.config
@@ -73,7 +73,7 @@ | @@ -73,7 +73,7 @@ | ||
73 | <package id="System.Threading.Timer" version="4.0.1" targetFramework="net472" /> | 73 | <package id="System.Threading.Timer" version="4.0.1" targetFramework="net472" /> |
74 | <package id="System.Xml.ReaderWriter" version="4.0.11" targetFramework="net472" /> | 74 | <package id="System.Xml.ReaderWriter" version="4.0.11" targetFramework="net472" /> |
75 | <package id="System.Xml.XDocument" version="4.0.11" targetFramework="net472" /> | 75 | <package id="System.Xml.XDocument" version="4.0.11" targetFramework="net472" /> |
76 | - <package id="VRH.Common" version="4.1.1" targetFramework="net472" /> | 76 | + <package id="VRH.Common" version="4.1.4" targetFramework="net472" /> |
77 | <package id="VRH.Web.Providers" version="2.0.2" targetFramework="net472" /> | 77 | <package id="VRH.Web.Providers" version="2.0.2" targetFramework="net472" /> |
78 | - <package id="Vrh.XmlProcessing" version="2.8.0" targetFramework="net472" /> | 78 | + <package id="Vrh.XmlProcessing" version="2.9.5" targetFramework="net472" /> |
79 | </packages> | 79 | </packages> |
80 | \ No newline at end of file | 80 | \ No newline at end of file |