Commit acc7abdacdda58ceab3b0d3b82a919e32de4fff0

Authored by Schwirg László
1 parent 84e2de26

v1.2.3.0

- SQL Table backup script esetén a hibakezelés javítása
Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - Tools.cs
@@ -233,4 +233,44 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS @@ -233,4 +233,44 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS
233 return ""; 233 return "";
234 } 234 }
235 } 235 }
  236 +
  237 + #region StringExtension class
  238 + public static class StringExtension
  239 + {
  240 + /// <summary>
  241 + /// Behelyezzesíti a megadott stringben előforduló Environment.SpecialFolder enum neveket
  242 + /// az Environment.GetFolderPath által visszadott tényleges értékükre
  243 + /// </summary>
  244 + /// <param name="s"></param>
  245 + /// <param name="n"></param>
  246 + /// <returns></returns>
  247 + public static string SubstituteSpecialFolderName(this string s, Environment.SpecialFolder n) { return s.Replace("@" + n.ToString() + "@", Environment.GetFolderPath(n)); }
  248 + }
  249 + #endregion StringExtension class
  250 +
  251 + #region ExceptionExtension class
  252 + public static class ExceptionExtension
  253 + {
  254 + /// <summary>
  255 + /// Az exception és belső exceptionjeinek összefűzése
  256 + /// </summary>
  257 + /// <param name="ex"></param>
  258 + /// <returns></returns>
  259 + public static string MessageNested(this Exception ex)
  260 + {
  261 + string rexmsg = "";
  262 + string indent = "";
  263 + const string indentof1level = " ";
  264 + Exception excl = ex;
  265 + while (true)
  266 + {
  267 + rexmsg += indent + excl.Message;
  268 + excl = excl.InnerException;
  269 + indent += (indent==""?"\n":"")+indentof1level;
  270 + if (excl == null) { break; }
  271 + }
  272 + return rexmsg.Replace("\n\n","\n");
  273 + }
  274 + }
  275 + #endregion ExceptionExtension class
236 } 276 }
Vrh.Log4Pro.MaintenanceConsole/Manager - BackupPackageManager.cs
@@ -103,7 +103,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS @@ -103,7 +103,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS
103 BackupPackageManagerCore.CreatePackageFile(bp, tempfolderpath, vars); 103 BackupPackageManagerCore.CreatePackageFile(bp, tempfolderpath, vars);
104 if (Directory.Exists(tempfolderpath)) { Directory.Delete(tempfolderpath,true); } 104 if (Directory.Exists(tempfolderpath)) { Directory.Delete(tempfolderpath,true); }
105 } 105 }
106 - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } 106 + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); }
107 } 107 }
108 #endregion First level Executors with UI 108 #endregion First level Executors with UI
109 109
@@ -486,28 +486,28 @@ namespace Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS @@ -486,28 +486,28 @@ namespace Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS
486 private string SpecialFolderNameSubstitution(string path) 486 private string SpecialFolderNameSubstitution(string path)
487 { 487 {
488 return path 488 return path
489 - .R(Environment.SpecialFolder.ApplicationData)// Current User's Application Data  
490 - .R(Environment.SpecialFolder.CommonApplicationData) // All User's Application Data  
491 - .R(Environment.SpecialFolder.CommonProgramFiles) // Program Files  
492 - .R(Environment.SpecialFolder.Cookies) // Internet Cookie  
493 - .R(Environment.SpecialFolder.Desktop) // Logical Desktop  
494 - .R(Environment.SpecialFolder.DesktopDirectory) // Physical Desktop  
495 - .R(Environment.SpecialFolder.Favorites) // Favorites  
496 - .R(Environment.SpecialFolder.History) // Internet History  
497 - .R(Environment.SpecialFolder.InternetCache) // Internet Cache  
498 - .R(Environment.SpecialFolder.MyComputer) // "My Computer" Folder  
499 - .R(Environment.SpecialFolder.MyDocuments) // "My Documents" Folder  
500 - .R(Environment.SpecialFolder.MyMusic) // "My Music" Folder  
501 - .R(Environment.SpecialFolder.MyPictures) // "My Pictures" Folder  
502 - .R(Environment.SpecialFolder.Personal) // "My Document" Folder  
503 - .R(Environment.SpecialFolder.ProgramFiles) // Program files Folder  
504 - .R(Environment.SpecialFolder.Programs) // Programs Folder  
505 - .R(Environment.SpecialFolder.Recent) // Recent Folder  
506 - .R(Environment.SpecialFolder.SendTo) // "Sent to" Folder  
507 - .R(Environment.SpecialFolder.StartMenu) // Start Menu  
508 - .R(Environment.SpecialFolder.Startup) // Startup  
509 - .R(Environment.SpecialFolder.System) // System Folder  
510 - .R(Environment.SpecialFolder.Templates) // Document Templates 489 + .SubstituteSpecialFolderName(Environment.SpecialFolder.ApplicationData)// Current User's Application Data
  490 + .SubstituteSpecialFolderName(Environment.SpecialFolder.CommonApplicationData) // All User's Application Data
  491 + .SubstituteSpecialFolderName(Environment.SpecialFolder.CommonProgramFiles) // Program Files
  492 + .SubstituteSpecialFolderName(Environment.SpecialFolder.Cookies) // Internet Cookie
  493 + .SubstituteSpecialFolderName(Environment.SpecialFolder.Desktop) // Logical Desktop
  494 + .SubstituteSpecialFolderName(Environment.SpecialFolder.DesktopDirectory) // Physical Desktop
  495 + .SubstituteSpecialFolderName(Environment.SpecialFolder.Favorites) // Favorites
  496 + .SubstituteSpecialFolderName(Environment.SpecialFolder.History) // Internet History
  497 + .SubstituteSpecialFolderName(Environment.SpecialFolder.InternetCache) // Internet Cache
  498 + .SubstituteSpecialFolderName(Environment.SpecialFolder.MyComputer) // "My Computer" Folder
  499 + .SubstituteSpecialFolderName(Environment.SpecialFolder.MyDocuments) // "My Documents" Folder
  500 + .SubstituteSpecialFolderName(Environment.SpecialFolder.MyMusic) // "My Music" Folder
  501 + .SubstituteSpecialFolderName(Environment.SpecialFolder.MyPictures) // "My Pictures" Folder
  502 + .SubstituteSpecialFolderName(Environment.SpecialFolder.Personal) // "My Document" Folder
  503 + .SubstituteSpecialFolderName(Environment.SpecialFolder.ProgramFiles) // Program files Folder
  504 + .SubstituteSpecialFolderName(Environment.SpecialFolder.Programs) // Programs Folder
  505 + .SubstituteSpecialFolderName(Environment.SpecialFolder.Recent) // Recent Folder
  506 + .SubstituteSpecialFolderName(Environment.SpecialFolder.SendTo) // "Sent to" Folder
  507 + .SubstituteSpecialFolderName(Environment.SpecialFolder.StartMenu) // Start Menu
  508 + .SubstituteSpecialFolderName(Environment.SpecialFolder.Startup) // Startup
  509 + .SubstituteSpecialFolderName(Environment.SpecialFolder.System) // System Folder
  510 + .SubstituteSpecialFolderName(Environment.SpecialFolder.Templates) // Document Templates
511 ; 511 ;
512 } 512 }
513 } 513 }
@@ -537,9 +537,5 @@ namespace Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS @@ -537,9 +537,5 @@ namespace Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS
537 #endregion BackupSQLDataBase class 537 #endregion BackupSQLDataBase class
538 538
539 } 539 }
540 - public static class StringExtension  
541 - {  
542 - public static string R(this string s, Environment.SpecialFolder n) { return s.Replace("@" + n.ToString() + "@", Environment.GetFolderPath(n)); }  
543 - }  
544 #endregion BackupPackage class 540 #endregion BackupPackage class
545 } 541 }
Vrh.Log4Pro.MaintenanceConsole/Manager - SQLDataBaseManager.cs
@@ -862,11 +862,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS @@ -862,11 +862,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
862 862
863 863
864 List<string> backupfilepathlist = new List<string>(); 864 List<string> backupfilepathlist = new List<string>();
865 - foreach (var sqldata in sqld.Xml_SQLDataList) 865 + foreach (var sqldata in sqld.Xml_SQLDataList)
866 { 866 {
867 vars[nameof(DBSubstitutionName.DBDATAGROUP)] = sqldata.Group; 867 vars[nameof(DBSubstitutionName.DBDATAGROUP)] = sqldata.Group;
868 - var sqlfilescreated = ScriptOneDataGroup(sqlserver, tempbackupdirectorypath, backupfilenamemask + backupfilenameext, sqldata.TableNameList, vars); 868 + var sqlfilescreated = ScriptOneDataGroup(sqlserver, tempbackupdirectorypath, backupfilenamemask + backupfilenameext, sqldata.TableNameList, vars,out List<string> errormessageList);
869 backupfilepathlist.AddRange(sqlfilescreated); 869 backupfilepathlist.AddRange(sqlfilescreated);
  870 + if (errormessageList != null && errormessageList.Any()) { foreach (var emsg in errormessageList) { ColorConsole.WriteLine("\n"+emsg, ConsoleColor.Red); } }
870 } 871 }
871 872
872 if (createZip) 873 if (createZip)
@@ -876,8 +877,9 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS @@ -876,8 +877,9 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
876 } 877 }
877 } 878 }
878 } 879 }
879 - private static List<string> ScriptOneDataGroup(Server sqlserver, string backupdirectorypath, string backupfilenamemask, List<string> tablenamelist, Dictionary<string, string> vars) 880 + private static List<string> ScriptOneDataGroup(Server sqlserver, string backupdirectorypath, string backupfilenamemask, List<string> tablenamelist, Dictionary<string, string> vars,out List<string> errormessageList)
880 { 881 {
  882 + errormessageList = new List<string>();
881 string filename =null , filefullname=null, lastfilefullname = null; 883 string filename =null , filefullname=null, lastfilefullname = null;
882 var myscripter = new Microsoft.SqlServer.Management.Smo.Scripter(); 884 var myscripter = new Microsoft.SqlServer.Management.Smo.Scripter();
883 myscripter.Server = sqlserver; 885 myscripter.Server = sqlserver;
@@ -900,6 +902,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS @@ -900,6 +902,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
900 var backupfilelist = new List<string>(); 902 var backupfilelist = new List<string>();
901 var urnstoscript = new UrnCollection(); 903 var urnstoscript = new UrnCollection();
902 var deletefromlist = new List<string>(); 904 var deletefromlist = new List<string>();
  905 + string errmsg;
  906 + bool success;
903 foreach (var tn in tablenamelist) 907 foreach (var tn in tablenamelist)
904 { 908 {
905 string tn_dbname = tn.Split('.')[0]; 909 string tn_dbname = tn.Split('.')[0];
@@ -911,7 +915,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS @@ -911,7 +915,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
911 filefullname = Path.Combine(backupdirectorypath, filename); 915 filefullname = Path.Combine(backupdirectorypath, filename);
912 if (lastfilefullname!=filefullname && lastfilefullname!=null) 916 if (lastfilefullname!=filefullname && lastfilefullname!=null)
913 { 917 {
914 - backupfilelist.Add(CreateOneSqlFile(urnstoscript, deletefromlist,sqlserver, myscripter, lastfilefullname)); 918 + success = CreateOneSqlFile(urnstoscript, deletefromlist, sqlserver, myscripter, lastfilefullname, out errmsg);
  919 + if (success) { backupfilelist.Add(lastfilefullname); } else { errormessageList.Add(errmsg);}
915 lastfilefullname = filefullname; 920 lastfilefullname = filefullname;
916 deletefromlist.Clear(); 921 deletefromlist.Clear();
917 urnstoscript.Clear(); 922 urnstoscript.Clear();
@@ -922,17 +927,27 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS @@ -922,17 +927,27 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
922 urnstoscript.Add(new Microsoft.SqlServer.Management.Sdk.Sfc.Urn(urnstring)); 927 urnstoscript.Add(new Microsoft.SqlServer.Management.Sdk.Sfc.Urn(urnstring));
923 lastfilefullname = filefullname; 928 lastfilefullname = filefullname;
924 } 929 }
925 - backupfilelist.Add(CreateOneSqlFile(urnstoscript, deletefromlist,sqlserver,myscripter,filefullname)); 930 + success = CreateOneSqlFile(urnstoscript, deletefromlist, sqlserver, myscripter, filefullname,out errmsg);
  931 + if (success) { backupfilelist.Add(filefullname); } else { errormessageList.Add(errmsg); }
926 return backupfilelist; 932 return backupfilelist;
927 } 933 }
928 - private static string CreateOneSqlFile( UrnCollection urnstoscript,List<string> deletefromlist,Server sqlserver,Scripter myscripter, string sqlfilefullname) 934 + private static bool CreateOneSqlFile( UrnCollection urnstoscript,List<string> deletefromlist,Server sqlserver,Scripter myscripter, string sqlfilefullname,out string errormessage)
929 { 935 {
  936 + errormessage = null;
930 myscripter.Options.FileName = sqlfilefullname; 937 myscripter.Options.FileName = sqlfilefullname;
931 - if (urnstoscript.Any()) { myscripter.EnumScript(urnstoscript); }  
932 - var scripttext = File.ReadAllText(sqlfilefullname);  
933 - deletefromlist = deletefromlist.Prepend($"use [{sqlserver.ConnectionContext.DatabaseName}]").ToList();  
934 - File.WriteAllText(sqlfilefullname, string.Join("\r\n",deletefromlist) +"\r\n\r\n" + scripttext, Encoding.UTF8);//????????????????  
935 - return sqlfilefullname; 938 + try
  939 + {
  940 + if (urnstoscript.Any()) { myscripter.EnumScript(urnstoscript); }
  941 + var scripttext = File.ReadAllText(sqlfilefullname);
  942 + deletefromlist = deletefromlist.Prepend($"use [{sqlserver.ConnectionContext.DatabaseName}]").ToList();
  943 + File.WriteAllText(sqlfilefullname, string.Join("\r\n", deletefromlist) + "\r\n\r\n" + scripttext, Encoding.UTF8);//????????????????
  944 + return true;
  945 + }
  946 + catch (Exception ex)
  947 + {
  948 + errormessage=ex.MessageNested();
  949 + return false;
  950 + }
936 } 951 }
937 #endregion BackupSqlData 952 #endregion BackupSqlData
938 #endregion private methods 953 #endregion private methods
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.2.2.0")]  
36 -[assembly: AssemblyFileVersion("1.2.2.0")] 35 +[assembly: AssemblyVersion("1.2.3.0")]
  36 +[assembly: AssemblyFileVersion("1.2.3.0")]