From acc7abdacdda58ceab3b0d3b82a919e32de4fff0 Mon Sep 17 00:00:00 2001 From: Schwirg László Date: Fri, 30 Apr 2021 10:01:06 +0200 Subject: [PATCH] v1.2.3.0 - SQL Table backup script esetén a hibakezelés javítása --- Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - Tools.cs | 40 ++++++++++++++++++++++++++++++++++++++++ Vrh.Log4Pro.MaintenanceConsole/Manager - BackupPackageManager.cs | 50 +++++++++++++++++++++++--------------------------- Vrh.Log4Pro.MaintenanceConsole/Manager - SQLDataBaseManager.cs | 37 ++++++++++++++++++++++++++----------- Vrh.Log4Pro.MaintenanceConsole/Properties/AssemblyInfo.cs | 4 ++-- 4 files changed, 91 insertions(+), 40 deletions(-) diff --git a/Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - Tools.cs b/Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - Tools.cs index d883724..36fcf62 100644 --- a/Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - Tools.cs +++ b/Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - Tools.cs @@ -233,4 +233,44 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS return ""; } } + + #region StringExtension class + public static class StringExtension + { + /// + /// Behelyezzesíti a megadott stringben előforduló Environment.SpecialFolder enum neveket + /// az Environment.GetFolderPath által visszadott tényleges értékükre + /// + /// + /// + /// + public static string SubstituteSpecialFolderName(this string s, Environment.SpecialFolder n) { return s.Replace("@" + n.ToString() + "@", Environment.GetFolderPath(n)); } + } + #endregion StringExtension class + + #region ExceptionExtension class + public static class ExceptionExtension + { + /// + /// Az exception és belső exceptionjeinek összefűzése + /// + /// + /// + public static string MessageNested(this Exception ex) + { + string rexmsg = ""; + string indent = ""; + const string indentof1level = " "; + Exception excl = ex; + while (true) + { + rexmsg += indent + excl.Message; + excl = excl.InnerException; + indent += (indent==""?"\n":"")+indentof1level; + if (excl == null) { break; } + } + return rexmsg.Replace("\n\n","\n"); + } + } + #endregion ExceptionExtension class } diff --git a/Vrh.Log4Pro.MaintenanceConsole/Manager - BackupPackageManager.cs b/Vrh.Log4Pro.MaintenanceConsole/Manager - BackupPackageManager.cs index 9bcf525..b5f5695 100644 --- a/Vrh.Log4Pro.MaintenanceConsole/Manager - BackupPackageManager.cs +++ b/Vrh.Log4Pro.MaintenanceConsole/Manager - BackupPackageManager.cs @@ -103,7 +103,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS BackupPackageManagerCore.CreatePackageFile(bp, tempfolderpath, vars); if (Directory.Exists(tempfolderpath)) { Directory.Delete(tempfolderpath,true); } } - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } } #endregion First level Executors with UI @@ -486,28 +486,28 @@ namespace Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS private string SpecialFolderNameSubstitution(string path) { return path - .R(Environment.SpecialFolder.ApplicationData)// Current User's Application Data - .R(Environment.SpecialFolder.CommonApplicationData) // All User's Application Data - .R(Environment.SpecialFolder.CommonProgramFiles) // Program Files - .R(Environment.SpecialFolder.Cookies) // Internet Cookie - .R(Environment.SpecialFolder.Desktop) // Logical Desktop - .R(Environment.SpecialFolder.DesktopDirectory) // Physical Desktop - .R(Environment.SpecialFolder.Favorites) // Favorites - .R(Environment.SpecialFolder.History) // Internet History - .R(Environment.SpecialFolder.InternetCache) // Internet Cache - .R(Environment.SpecialFolder.MyComputer) // "My Computer" Folder - .R(Environment.SpecialFolder.MyDocuments) // "My Documents" Folder - .R(Environment.SpecialFolder.MyMusic) // "My Music" Folder - .R(Environment.SpecialFolder.MyPictures) // "My Pictures" Folder - .R(Environment.SpecialFolder.Personal) // "My Document" Folder - .R(Environment.SpecialFolder.ProgramFiles) // Program files Folder - .R(Environment.SpecialFolder.Programs) // Programs Folder - .R(Environment.SpecialFolder.Recent) // Recent Folder - .R(Environment.SpecialFolder.SendTo) // "Sent to" Folder - .R(Environment.SpecialFolder.StartMenu) // Start Menu - .R(Environment.SpecialFolder.Startup) // Startup - .R(Environment.SpecialFolder.System) // System Folder - .R(Environment.SpecialFolder.Templates) // Document Templates + .SubstituteSpecialFolderName(Environment.SpecialFolder.ApplicationData)// Current User's Application Data + .SubstituteSpecialFolderName(Environment.SpecialFolder.CommonApplicationData) // All User's Application Data + .SubstituteSpecialFolderName(Environment.SpecialFolder.CommonProgramFiles) // Program Files + .SubstituteSpecialFolderName(Environment.SpecialFolder.Cookies) // Internet Cookie + .SubstituteSpecialFolderName(Environment.SpecialFolder.Desktop) // Logical Desktop + .SubstituteSpecialFolderName(Environment.SpecialFolder.DesktopDirectory) // Physical Desktop + .SubstituteSpecialFolderName(Environment.SpecialFolder.Favorites) // Favorites + .SubstituteSpecialFolderName(Environment.SpecialFolder.History) // Internet History + .SubstituteSpecialFolderName(Environment.SpecialFolder.InternetCache) // Internet Cache + .SubstituteSpecialFolderName(Environment.SpecialFolder.MyComputer) // "My Computer" Folder + .SubstituteSpecialFolderName(Environment.SpecialFolder.MyDocuments) // "My Documents" Folder + .SubstituteSpecialFolderName(Environment.SpecialFolder.MyMusic) // "My Music" Folder + .SubstituteSpecialFolderName(Environment.SpecialFolder.MyPictures) // "My Pictures" Folder + .SubstituteSpecialFolderName(Environment.SpecialFolder.Personal) // "My Document" Folder + .SubstituteSpecialFolderName(Environment.SpecialFolder.ProgramFiles) // Program files Folder + .SubstituteSpecialFolderName(Environment.SpecialFolder.Programs) // Programs Folder + .SubstituteSpecialFolderName(Environment.SpecialFolder.Recent) // Recent Folder + .SubstituteSpecialFolderName(Environment.SpecialFolder.SendTo) // "Sent to" Folder + .SubstituteSpecialFolderName(Environment.SpecialFolder.StartMenu) // Start Menu + .SubstituteSpecialFolderName(Environment.SpecialFolder.Startup) // Startup + .SubstituteSpecialFolderName(Environment.SpecialFolder.System) // System Folder + .SubstituteSpecialFolderName(Environment.SpecialFolder.Templates) // Document Templates ; } } @@ -537,9 +537,5 @@ namespace Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS #endregion BackupSQLDataBase class } - public static class StringExtension - { - public static string R(this string s, Environment.SpecialFolder n) { return s.Replace("@" + n.ToString() + "@", Environment.GetFolderPath(n)); } - } #endregion BackupPackage class } diff --git a/Vrh.Log4Pro.MaintenanceConsole/Manager - SQLDataBaseManager.cs b/Vrh.Log4Pro.MaintenanceConsole/Manager - SQLDataBaseManager.cs index 31325f1..dc77bc0 100644 --- a/Vrh.Log4Pro.MaintenanceConsole/Manager - SQLDataBaseManager.cs +++ b/Vrh.Log4Pro.MaintenanceConsole/Manager - SQLDataBaseManager.cs @@ -862,11 +862,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS List backupfilepathlist = new List(); - foreach (var sqldata in sqld.Xml_SQLDataList) + foreach (var sqldata in sqld.Xml_SQLDataList) { vars[nameof(DBSubstitutionName.DBDATAGROUP)] = sqldata.Group; - var sqlfilescreated = ScriptOneDataGroup(sqlserver, tempbackupdirectorypath, backupfilenamemask + backupfilenameext, sqldata.TableNameList, vars); + var sqlfilescreated = ScriptOneDataGroup(sqlserver, tempbackupdirectorypath, backupfilenamemask + backupfilenameext, sqldata.TableNameList, vars,out List errormessageList); backupfilepathlist.AddRange(sqlfilescreated); + if (errormessageList != null && errormessageList.Any()) { foreach (var emsg in errormessageList) { ColorConsole.WriteLine("\n"+emsg, ConsoleColor.Red); } } } if (createZip) @@ -876,8 +877,9 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS } } } - private static List ScriptOneDataGroup(Server sqlserver, string backupdirectorypath, string backupfilenamemask, List tablenamelist, Dictionary vars) + private static List ScriptOneDataGroup(Server sqlserver, string backupdirectorypath, string backupfilenamemask, List tablenamelist, Dictionary vars,out List errormessageList) { + errormessageList = new List(); string filename =null , filefullname=null, lastfilefullname = null; var myscripter = new Microsoft.SqlServer.Management.Smo.Scripter(); myscripter.Server = sqlserver; @@ -900,6 +902,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS var backupfilelist = new List(); var urnstoscript = new UrnCollection(); var deletefromlist = new List(); + string errmsg; + bool success; foreach (var tn in tablenamelist) { string tn_dbname = tn.Split('.')[0]; @@ -911,7 +915,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS filefullname = Path.Combine(backupdirectorypath, filename); if (lastfilefullname!=filefullname && lastfilefullname!=null) { - backupfilelist.Add(CreateOneSqlFile(urnstoscript, deletefromlist,sqlserver, myscripter, lastfilefullname)); + success = CreateOneSqlFile(urnstoscript, deletefromlist, sqlserver, myscripter, lastfilefullname, out errmsg); + if (success) { backupfilelist.Add(lastfilefullname); } else { errormessageList.Add(errmsg);} lastfilefullname = filefullname; deletefromlist.Clear(); urnstoscript.Clear(); @@ -922,17 +927,27 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS urnstoscript.Add(new Microsoft.SqlServer.Management.Sdk.Sfc.Urn(urnstring)); lastfilefullname = filefullname; } - backupfilelist.Add(CreateOneSqlFile(urnstoscript, deletefromlist,sqlserver,myscripter,filefullname)); + success = CreateOneSqlFile(urnstoscript, deletefromlist, sqlserver, myscripter, filefullname,out errmsg); + if (success) { backupfilelist.Add(filefullname); } else { errormessageList.Add(errmsg); } return backupfilelist; } - private static string CreateOneSqlFile( UrnCollection urnstoscript,List deletefromlist,Server sqlserver,Scripter myscripter, string sqlfilefullname) + private static bool CreateOneSqlFile( UrnCollection urnstoscript,List deletefromlist,Server sqlserver,Scripter myscripter, string sqlfilefullname,out string errormessage) { + errormessage = null; myscripter.Options.FileName = sqlfilefullname; - if (urnstoscript.Any()) { myscripter.EnumScript(urnstoscript); } - var scripttext = File.ReadAllText(sqlfilefullname); - deletefromlist = deletefromlist.Prepend($"use [{sqlserver.ConnectionContext.DatabaseName}]").ToList(); - File.WriteAllText(sqlfilefullname, string.Join("\r\n",deletefromlist) +"\r\n\r\n" + scripttext, Encoding.UTF8);//???????????????? - return sqlfilefullname; + try + { + if (urnstoscript.Any()) { myscripter.EnumScript(urnstoscript); } + var scripttext = File.ReadAllText(sqlfilefullname); + deletefromlist = deletefromlist.Prepend($"use [{sqlserver.ConnectionContext.DatabaseName}]").ToList(); + File.WriteAllText(sqlfilefullname, string.Join("\r\n", deletefromlist) + "\r\n\r\n" + scripttext, Encoding.UTF8);//???????????????? + return true; + } + catch (Exception ex) + { + errormessage=ex.MessageNested(); + return false; + } } #endregion BackupSqlData #endregion private methods diff --git a/Vrh.Log4Pro.MaintenanceConsole/Properties/AssemblyInfo.cs b/Vrh.Log4Pro.MaintenanceConsole/Properties/AssemblyInfo.cs index 2fd4c47..d65e6ee 100644 --- a/Vrh.Log4Pro.MaintenanceConsole/Properties/AssemblyInfo.cs +++ b/Vrh.Log4Pro.MaintenanceConsole/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.2.2.0")] -[assembly: AssemblyFileVersion("1.2.2.0")] +[assembly: AssemblyVersion("1.2.3.0")] +[assembly: AssemblyFileVersion("1.2.3.0")] -- libgit2 0.21.2