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 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 103 BackupPackageManagerCore.CreatePackageFile(bp, tempfolderpath, vars);
104 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 108 #endregion First level Executors with UI
109 109  
... ... @@ -486,28 +486,28 @@ namespace Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS
486 486 private string SpecialFolderNameSubstitution(string path)
487 487 {
488 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 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 540 #endregion BackupPackage class
545 541 }
... ...
Vrh.Log4Pro.MaintenanceConsole/Manager - SQLDataBaseManager.cs
... ... @@ -862,11 +862,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
862 862  
863 863  
864 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 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 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 873 if (createZip)
... ... @@ -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 883 string filename =null , filefullname=null, lastfilefullname = null;
882 884 var myscripter = new Microsoft.SqlServer.Management.Smo.Scripter();
883 885 myscripter.Server = sqlserver;
... ... @@ -900,6 +902,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
900 902 var backupfilelist = new List<string>();
901 903 var urnstoscript = new UrnCollection();
902 904 var deletefromlist = new List<string>();
  905 + string errmsg;
  906 + bool success;
903 907 foreach (var tn in tablenamelist)
904 908 {
905 909 string tn_dbname = tn.Split('.')[0];
... ... @@ -911,7 +915,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
911 915 filefullname = Path.Combine(backupdirectorypath, filename);
912 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 920 lastfilefullname = filefullname;
916 921 deletefromlist.Clear();
917 922 urnstoscript.Clear();
... ... @@ -922,17 +927,27 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
922 927 urnstoscript.Add(new Microsoft.SqlServer.Management.Sdk.Sfc.Urn(urnstring));
923 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 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 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 952 #endregion BackupSqlData
938 953 #endregion private methods
... ...
Vrh.Log4Pro.MaintenanceConsole/Properties/AssemblyInfo.cs
... ... @@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
32 32 // You can specify all the values or you can default the Build and Revision Numbers
33 33 // by using the '*' as shown below:
34 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")]
... ...