Commit fc8a064bd0ba4c7cb27b77d712cc17e61dd82695
1 parent
0e9c5d3a
v1.27.0
- MoveDbToRemoteServer megvalósítása
Showing
14 changed files
with
954 additions
and
543 deletions
Show diff stats
Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - CommandLineParser.cs
| @@ -301,10 +301,11 @@ namespace Vrh.Log4Pro.MaintenanceConsole.CommandLineParserNS | @@ -301,10 +301,11 @@ namespace Vrh.Log4Pro.MaintenanceConsole.CommandLineParserNS | ||
| 301 | public static class BackupDataBase { public const string KEY = "BAK"; } | 301 | public static class BackupDataBase { public const string KEY = "BAK"; } |
| 302 | public static class CreateCodeScripts { public const string KEY = "CCS"; } | 302 | public static class CreateCodeScripts { public const string KEY = "CCS"; } |
| 303 | public static class CreateDataScripts { public const string KEY = "CDS"; } | 303 | public static class CreateDataScripts { public const string KEY = "CDS"; } |
| 304 | - public static class RestoreDataBase { public const string KEY = "RES"; public const string CMD_RESTOREFIRST = "-RESTOREFIRST"; | ||
| 305 | - } | 304 | + public static class RestoreDataBase { public const string KEY = "RES"; public const string KEY2 = "RE2"; public const string CMD_RESTOREFIRST = "-RESTOREFIRST";} |
| 305 | + public static class MoveDbToRemoteServer { public const string KEY = "MOV"; } | ||
| 306 | public static class RelocatePhysicalFiles { public const string KEY = "COP"; } | 306 | public static class RelocatePhysicalFiles { public const string KEY = "COP"; } |
| 307 | public static class ShrinkDB { public const string KEY = "SHR"; } | 307 | public static class ShrinkDB { public const string KEY = "SHR"; } |
| 308 | + public static class DropDB { public const string KEY = "DRP";} | ||
| 308 | public static class ExecuteScript{ public const string KEY = "EXE"; } | 309 | public static class ExecuteScript{ public const string KEY = "EXE"; } |
| 309 | public static class CreateLoginAndUser{ public const string KEY = "CRU"; } | 310 | public static class CreateLoginAndUser{ public const string KEY = "CRU"; } |
| 310 | public static class AddUserForLogin{ public const string KEY = "CRA"; } | 311 | public static class AddUserForLogin{ public const string KEY = "CRA"; } |
Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - Menu.cs
| @@ -16,6 +16,7 @@ using Vrh.XmlProcessing; | @@ -16,6 +16,7 @@ using Vrh.XmlProcessing; | ||
| 16 | using VRH.Common; | 16 | using VRH.Common; |
| 17 | using System.Xml.Linq; | 17 | using System.Xml.Linq; |
| 18 | using System.Reflection; | 18 | using System.Reflection; |
| 19 | +using Vrh.Log4Pro.MaintenanceConsole.ToolsNS; | ||
| 19 | 20 | ||
| 20 | namespace Vrh.Log4Pro.MaintenanceConsole.MenuNS | 21 | namespace Vrh.Log4Pro.MaintenanceConsole.MenuNS |
| 21 | { | 22 | { |
| @@ -168,8 +169,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MenuNS | @@ -168,8 +169,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MenuNS | ||
| 168 | } | 169 | } |
| 169 | catch (Exception ex) | 170 | catch (Exception ex) |
| 170 | { | 171 | { |
| 171 | - ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); | ||
| 172 | - if (ex.InnerException != null) { ColorConsole.WriteLine(ex.InnerException.Message, ConsoleColor.Red); } | 172 | + ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); |
| 173 | Menu.PressAnykeyToContinue(); | 173 | Menu.PressAnykeyToContinue(); |
| 174 | } | 174 | } |
| 175 | } | 175 | } |
Vrh.Log4Pro.MaintenanceConsole/Manager - FileCleanerManager.cs
| @@ -75,7 +75,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.FileCleanerManagerNS | @@ -75,7 +75,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.FileCleanerManagerNS | ||
| 75 | var success = FileCleanerManagerCore.CleanFolderFiles(di, ftc, delete: true); | 75 | var success = FileCleanerManagerCore.CleanFolderFiles(di, ftc, delete: true); |
| 76 | ColorConsole.WriteLine($"Folder cleaned. Name:{ftc.Xml_DirectoryPath}", ConsoleColor.Green); | 76 | ColorConsole.WriteLine($"Folder cleaned. Name:{ftc.Xml_DirectoryPath}", ConsoleColor.Green); |
| 77 | } | 77 | } |
| 78 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 78 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 79 | } | 79 | } |
| 80 | #endregion First level Executors with UI | 80 | #endregion First level Executors with UI |
| 81 | 81 |
Vrh.Log4Pro.MaintenanceConsole/Manager - MSMQManager.cs
| @@ -83,7 +83,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MSMQManagerNS | @@ -83,7 +83,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MSMQManagerNS | ||
| 83 | ColorConsole.WriteLine($"Access right {accessright.ar} {ctrlstring} for user:{accessright.un}.", ConsoleColor.Green); | 83 | ColorConsole.WriteLine($"Access right {accessright.ar} {ctrlstring} for user:{accessright.un}.", ConsoleColor.Green); |
| 84 | } | 84 | } |
| 85 | } | 85 | } |
| 86 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 86 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 87 | } | 87 | } |
| 88 | return o; | 88 | return o; |
| 89 | } | 89 | } |
| @@ -111,7 +111,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MSMQManagerNS | @@ -111,7 +111,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MSMQManagerNS | ||
| 111 | MSMQManagerCore.DeleteQueue(fullpath); | 111 | MSMQManagerCore.DeleteQueue(fullpath); |
| 112 | ColorConsole.WriteLine($"MSMQ:{st.Xml_Name} removed.", ConsoleColor.Green); | 112 | ColorConsole.WriteLine($"MSMQ:{st.Xml_Name} removed.", ConsoleColor.Green); |
| 113 | } | 113 | } |
| 114 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 114 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 115 | } | 115 | } |
| 116 | return o; | 116 | return o; |
| 117 | } | 117 | } |
| @@ -145,7 +145,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MSMQManagerNS | @@ -145,7 +145,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MSMQManagerNS | ||
| 145 | ColorConsole.WriteLine($"Access right {accessright.ar} {ctrlstring} for user:{accessright.un}.", ConsoleColor.Green); | 145 | ColorConsole.WriteLine($"Access right {accessright.ar} {ctrlstring} for user:{accessright.un}.", ConsoleColor.Green); |
| 146 | } | 146 | } |
| 147 | } | 147 | } |
| 148 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 148 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 149 | } | 149 | } |
| 150 | return o; | 150 | return o; |
| 151 | } | 151 | } |
| @@ -192,7 +192,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MSMQManagerNS | @@ -192,7 +192,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MSMQManagerNS | ||
| 192 | MSMQManagerCore.SetPermissions(fullpath, username, accessrights, controltype); | 192 | MSMQManagerCore.SetPermissions(fullpath, username, accessrights, controltype); |
| 193 | ColorConsole.WriteLine($"Permissions set for MSMQ:{st.Xml_Name}. Username:{username}, access right: {accessrights}, control type: {controltype}", ConsoleColor.Green); | 193 | ColorConsole.WriteLine($"Permissions set for MSMQ:{st.Xml_Name}. Username:{username}, access right: {accessrights}, control type: {controltype}", ConsoleColor.Green); |
| 194 | } | 194 | } |
| 195 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 195 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 196 | } | 196 | } |
| 197 | 197 | ||
| 198 | defaultusername = username; | 198 | defaultusername = username; |
| @@ -320,10 +320,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MSMQManagerNS | @@ -320,10 +320,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MSMQManagerNS | ||
| 320 | ColorConsole.WriteLine($" Body: {msgbody}", ConsoleColor.Yellow); | 320 | ColorConsole.WriteLine($" Body: {msgbody}", ConsoleColor.Yellow); |
| 321 | ColorConsole.WriteLine($" Label: {msglabel}", ConsoleColor.Yellow); | 321 | ColorConsole.WriteLine($" Label: {msglabel}", ConsoleColor.Yellow); |
| 322 | } | 322 | } |
| 323 | - catch (Exception ex) | ||
| 324 | - { | ||
| 325 | - ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); | ||
| 326 | - } | 323 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 327 | } | 324 | } |
| 328 | return o; | 325 | return o; |
| 329 | } | 326 | } |
| @@ -356,10 +353,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MSMQManagerNS | @@ -356,10 +353,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MSMQManagerNS | ||
| 356 | ColorConsole.WriteLine($" Body: {msgbody}", ConsoleColor.Yellow); | 353 | ColorConsole.WriteLine($" Body: {msgbody}", ConsoleColor.Yellow); |
| 357 | ColorConsole.WriteLine($" Label: {msglabel}", ConsoleColor.Yellow); | 354 | ColorConsole.WriteLine($" Label: {msglabel}", ConsoleColor.Yellow); |
| 358 | } | 355 | } |
| 359 | - catch (Exception ex) | ||
| 360 | - { | ||
| 361 | - ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); | ||
| 362 | - } | 356 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 363 | } | 357 | } |
| 364 | return o; | 358 | return o; |
| 365 | } | 359 | } |
| @@ -395,8 +389,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MSMQManagerNS | @@ -395,8 +389,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MSMQManagerNS | ||
| 395 | ColorConsole.WriteLine($"Message sent to MSMQ:{st.Xml_Name}.", ConsoleColor.Green); | 389 | ColorConsole.WriteLine($"Message sent to MSMQ:{st.Xml_Name}.", ConsoleColor.Green); |
| 396 | } | 390 | } |
| 397 | } | 391 | } |
| 398 | - catch (ApplicationException ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | ||
| 399 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 392 | + catch (ApplicationException ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 393 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } | ||
| 400 | } | 394 | } |
| 401 | } | 395 | } |
| 402 | return o; | 396 | return o; |
| @@ -514,7 +508,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MSMQManagerNS | @@ -514,7 +508,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MSMQManagerNS | ||
| 514 | MSMQManagerCore.Purge(fullpath); | 508 | MSMQManagerCore.Purge(fullpath); |
| 515 | ColorConsole.WriteLine($"MSMQ messages purged. Name:{st.Xml_Name}", ConsoleColor.Green); | 509 | ColorConsole.WriteLine($"MSMQ messages purged. Name:{st.Xml_Name}", ConsoleColor.Green); |
| 516 | } | 510 | } |
| 517 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 511 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 518 | } | 512 | } |
| 519 | return o; | 513 | return o; |
| 520 | } | 514 | } |
| @@ -1118,7 +1112,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MSMQManagerNS | @@ -1118,7 +1112,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MSMQManagerNS | ||
| 1118 | } | 1112 | } |
| 1119 | catch (MessageQueueException ex) | 1113 | catch (MessageQueueException ex) |
| 1120 | { | 1114 | { |
| 1121 | - returnmessage= ex.ErrorCode + ":" + ex.Message + (ex.InnerException != null ? ("\n" + ex.InnerException.Message) : ""); | 1115 | + returnmessage= ex.ErrorCode + ":" + ex.MessageNested(); |
| 1122 | return ex.Message.StartsWith("Timeout"); | 1116 | return ex.Message.StartsWith("Timeout"); |
| 1123 | } | 1117 | } |
| 1124 | } | 1118 | } |
| @@ -1167,11 +1161,11 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MSMQManagerNS | @@ -1167,11 +1161,11 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MSMQManagerNS | ||
| 1167 | } | 1161 | } |
| 1168 | catch (MessageQueueException ex) | 1162 | catch (MessageQueueException ex) |
| 1169 | { | 1163 | { |
| 1170 | - msmqdef.Status = "Error"; msmqdef.StatusDescription = ex.ErrorCode +":"+ ex.Message + (ex.InnerException != null ? ("\n" + ex.InnerException.Message) : ""); | 1164 | + msmqdef.Status = "Error"; msmqdef.StatusDescription = ex.ErrorCode +":"+ ex.MessageNested(); |
| 1171 | } | 1165 | } |
| 1172 | catch (Exception ex) | 1166 | catch (Exception ex) |
| 1173 | { | 1167 | { |
| 1174 | - msmqdef.Status = "Error"; msmqdef.StatusDescription = ex.Message + (ex.InnerException != null ? ("\n" + ex.InnerException.Message) : ""); | 1168 | + msmqdef.Status = "Error"; msmqdef.StatusDescription = ex.MessageNested(); |
| 1175 | } | 1169 | } |
| 1176 | return msmqdef; | 1170 | return msmqdef; |
| 1177 | } | 1171 | } |
| @@ -1350,7 +1344,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MSMQManagerNS | @@ -1350,7 +1344,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MSMQManagerNS | ||
| 1350 | ColorConsole.WriteLine(); | 1344 | ColorConsole.WriteLine(); |
| 1351 | } | 1345 | } |
| 1352 | } | 1346 | } |
| 1353 | - catch (Exception ex) { ColorConsole.WriteLine(" " + ex.Message, ConsoleColor.Red); } | 1347 | + catch (Exception ex) { ColorConsole.WriteLine(" " + ex.MessageNested(), ConsoleColor.Red); } |
| 1354 | } | 1348 | } |
| 1355 | } | 1349 | } |
| 1356 | #endregion DisplayInfo | 1350 | #endregion DisplayInfo |
Vrh.Log4Pro.MaintenanceConsole/Manager - MaintenanceToolManager.cs
| @@ -532,7 +532,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MaintenanceToolManagerNS | @@ -532,7 +532,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MaintenanceToolManagerNS | ||
| 532 | } | 532 | } |
| 533 | catch (Exception ex) | 533 | catch (Exception ex) |
| 534 | { | 534 | { |
| 535 | - ColorConsole.WriteLine(ex.Message, f: ConsoleColor.Red); | 535 | + ColorConsole.WriteLine(ex.MessageNested(), f: ConsoleColor.Red); |
| 536 | return false; | 536 | return false; |
| 537 | } | 537 | } |
| 538 | } | 538 | } |
Vrh.Log4Pro.MaintenanceConsole/Manager - SQLDataBaseManager.cs
| @@ -25,7 +25,7 @@ using System.Text.RegularExpressions; | @@ -25,7 +25,7 @@ using System.Text.RegularExpressions; | ||
| 25 | 25 | ||
| 26 | using Microsoft.SqlServer.Management.Common; | 26 | using Microsoft.SqlServer.Management.Common; |
| 27 | using Microsoft.SqlServer.Management.Smo; | 27 | using Microsoft.SqlServer.Management.Smo; |
| 28 | -using System.Data.SqlClient; | 28 | +using Microsoft.Data.SqlClient; |
| 29 | 29 | ||
| 30 | namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | 30 | namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS |
| 31 | { | 31 | { |
| @@ -48,12 +48,15 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -48,12 +48,15 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
| 48 | .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.CreateCodeScripts.KEY, "Create code scripts", CreateCodeScripts, ep)) | 48 | .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.CreateCodeScripts.KEY, "Create code scripts", CreateCodeScripts, ep)) |
| 49 | .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.CreateDataScripts.KEY, "Create data scripts", CreateDataScripts, ep)) | 49 | .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.CreateDataScripts.KEY, "Create data scripts", CreateDataScripts, ep)) |
| 50 | .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.RestoreDataBase.KEY, "Restore database backup", RestoreDataBase, ep)) | 50 | .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.RestoreDataBase.KEY, "Restore database backup", RestoreDataBase, ep)) |
| 51 | + .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.RestoreDataBase.KEY2, "Restore database backup (any to anywhere)", RestoreDataBaseAnyToAnywhere, ep)) | ||
| 51 | .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.RelocatePhysicalFiles.KEY, "Copy database and or relocate its physical files", RelocatePhysicalFiles, ep)) | 52 | .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.RelocatePhysicalFiles.KEY, "Copy database and or relocate its physical files", RelocatePhysicalFiles, ep)) |
| 52 | .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.ShrinkDB.KEY, "Shrink database", ShrinkDB, ep)) | 53 | .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.ShrinkDB.KEY, "Shrink database", ShrinkDB, ep)) |
| 54 | + .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.DropDB.KEY, "Drop database", DropDB, ep)) | ||
| 53 | .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.ExecuteScript.KEY, "Execute script", ExecuteScript, ep)) | 55 | .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.ExecuteScript.KEY, "Execute script", ExecuteScript, ep)) |
| 54 | - .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.CreateLoginAndUser.KEY, "Create Server login and database user", CreteLoginAndAddToDB, ep)) | ||
| 55 | - .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.AddUserForLogin.KEY, "Add database user to an existing Login", AddExistingLoginToDB, ep)) | 56 | + .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.CreateLoginAndUser.KEY, "Create Server login", CreateServerLogin, ep)) |
| 57 | + .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.AddUserForLogin.KEY, "Create DB user", CreateDBUser, ep)) | ||
| 56 | .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.CreateLastUpdatedTrigger.KEY, "Add/remove LastUpdated trigger to a datatable column", ManageLastUpdatedTrigger, ep)) | 58 | .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.CreateLastUpdatedTrigger.KEY, "Add/remove LastUpdated trigger to a datatable column", ManageLastUpdatedTrigger, ep)) |
| 59 | + .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.MoveDbToRemoteServer.KEY, "Move DB from local to remote server", MoveDbToRemoteServer, ep)) | ||
| 57 | .SetSelectionMode(Menu.SelectionMode.Single) | 60 | .SetSelectionMode(Menu.SelectionMode.Single) |
| 58 | .SetMenuHeaderDisplayer(DataBaseListDisplayer); | 61 | .SetMenuHeaderDisplayer(DataBaseListDisplayer); |
| 59 | menufunctions.ExecuteMenu(functionkey); | 62 | menufunctions.ExecuteMenu(functionkey); |
| @@ -105,10 +108,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -105,10 +108,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
| 105 | SQLDataBaseManagerCore.BackupSqlData(sqld,TS); | 108 | SQLDataBaseManagerCore.BackupSqlData(sqld,TS); |
| 106 | ColorConsole.WriteLine($"SQLDB data scripts created. Name:{sqld.Xml_Description}", ConsoleColor.Green); | 109 | ColorConsole.WriteLine($"SQLDB data scripts created. Name:{sqld.Xml_Description}", ConsoleColor.Green); |
| 107 | } | 110 | } |
| 108 | - catch (Exception ex) | ||
| 109 | - { | ||
| 110 | - ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); | ||
| 111 | - } | 111 | + catch (Exception ex){ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red);} |
| 112 | } | 112 | } |
| 113 | return o; | 113 | return o; |
| 114 | } | 114 | } |
| @@ -138,7 +138,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -138,7 +138,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
| 138 | SQLDataBaseManagerCore.BackupSqlScripts(sqld,TS); | 138 | SQLDataBaseManagerCore.BackupSqlScripts(sqld,TS); |
| 139 | ColorConsole.WriteLine($"SQLDB code scripts created. Name:{sqld.Xml_Description}", ConsoleColor.Green); | 139 | ColorConsole.WriteLine($"SQLDB code scripts created. Name:{sqld.Xml_Description}", ConsoleColor.Green); |
| 140 | } | 140 | } |
| 141 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 141 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 142 | } | 142 | } |
| 143 | return o; | 143 | return o; |
| 144 | } | 144 | } |
| @@ -167,7 +167,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -167,7 +167,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
| 167 | SQLDataBaseManagerCore.CreateBackup(ssqldb,null,TS); | 167 | SQLDataBaseManagerCore.CreateBackup(ssqldb,null,TS); |
| 168 | ColorConsole.WriteLine($"Database backup created. Name:{ssqldb.DBName}", ConsoleColor.Green); | 168 | ColorConsole.WriteLine($"Database backup created. Name:{ssqldb.DBName}", ConsoleColor.Green); |
| 169 | } | 169 | } |
| 170 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 170 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 171 | } | 171 | } |
| 172 | return o; | 172 | return o; |
| 173 | } | 173 | } |
| @@ -179,53 +179,335 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -179,53 +179,335 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
| 179 | var selectedsqldbindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.SQLDataBaseManager.Function.CMD_DATABASES); | 179 | var selectedsqldbindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.SQLDataBaseManager.Function.CMD_DATABASES); |
| 180 | bool restorefirst = CommandLine.GetCommandLineArgument(args, CLP.Module.SQLDataBaseManager.Function.RestoreDataBase.CMD_RESTOREFIRST,switchtype:true)!=null; | 180 | bool restorefirst = CommandLine.GetCommandLineArgument(args, CLP.Module.SQLDataBaseManager.Function.RestoreDataBase.CMD_RESTOREFIRST,switchtype:true)!=null; |
| 181 | 181 | ||
| 182 | - var menufolders = DisplaySQLDataBaseMenu(config, $"Select the SQL database(s) to manage with function '{nameof(RestoreDataBase)}'!", silent: true); | 182 | + startselection: |
| 183 | + var menufolders = DisplaySQLDataBaseMenu(config, $"Select the SQL database(s) to manage with function '{nameof(RestoreDataBase)}'!", silent: true,selectionmode:Menu.SelectionMode.Single); | ||
| 183 | 184 | ||
| 184 | Menu.Selection sr = menufolders.Select(selectedsqldbindexes); | 185 | Menu.Selection sr = menufolders.Select(selectedsqldbindexes); |
| 185 | if (sr.Result == Menu.SelectionResult.Exit) { return o; } | 186 | if (sr.Result == Menu.SelectionResult.Exit) { return o; } |
| 186 | else if (sr.Result == Menu.SelectionResult.None) { return o; } | 187 | else if (sr.Result == Menu.SelectionResult.None) { return o; } |
| 187 | else if (sr.Result == Menu.SelectionResult.Error) { return o; } | 188 | else if (sr.Result == Menu.SelectionResult.Error) { return o; } |
| 189 | + else if (sr.Result == Menu.SelectionResult.Ok && sr.SelectedParameterList.FirstOrDefault() == null) { return o; } | ||
| 188 | else if (sr.Result == Menu.SelectionResult.Ok) { } | 190 | else if (sr.Result == Menu.SelectionResult.Ok) { } |
| 189 | else { } | 191 | else { } |
| 190 | - foreach (var p in sr.SelectedParameterList) | 192 | + var p = sr.SelectedParameterList.First(); |
| 193 | + SQLDataBase st = p.Parameters as SQLDataBase; | ||
| 194 | + try | ||
| 191 | { | 195 | { |
| 192 | - SQLDataBase st = p.Parameters as SQLDataBase; | ||
| 193 | - try | 196 | + var targetdirectorypath = st.Xml_PhysicalFilesDirectoryPath; |
| 197 | + var targetdbname = st.DBName; | ||
| 198 | + bool restorefromzip = st.Xml_CreateZip; | ||
| 199 | + var backupfilelist = SQLDataBaseManagerCore.GetBackupFilePathList(st); | ||
| 200 | + Dictionary<string, string> selectionlist = new Dictionary<string, string>(); | ||
| 201 | + | ||
| 202 | + string selectedbackupfilepath=null; | ||
| 203 | + if (backupfilelist == null || !backupfilelist.Any()) { } | ||
| 204 | + else if (restorefirst) { selectedbackupfilepath = backupfilelist.First().FullName; } | ||
| 205 | + else | ||
| 194 | { | 206 | { |
| 195 | - var targetdirectorypath = st.Xml_PhysicalFilesDirectoryPath; | ||
| 196 | - var targetdbname= st.DBName; | ||
| 197 | - bool restorefromzip = st.Xml_CreateZip; | ||
| 198 | - var backupfilelist = SQLDataBaseManagerCore.GetBackupFilePathList(st); | ||
| 199 | - if (backupfilelist != null && backupfilelist.Any()) | ||
| 200 | - { | ||
| 201 | - string selectedbackupfilepath; | ||
| 202 | - if (restorefirst) | ||
| 203 | - { | ||
| 204 | - selectedbackupfilepath = backupfilelist.First().FullName; | ||
| 205 | - } | ||
| 206 | - else | ||
| 207 | - { | ||
| 208 | - var selectionlist = backupfilelist | ||
| 209 | - .Select(x => new KeyValuePair<string,string>($"{x.Name}({x.Length}bytes,created:{x.CreationTime})", x.FullName)) | ||
| 210 | - .ToDictionary(x=>x.Key,x=>x.Value); | ||
| 211 | - var ms = Menu.SelectFromItemList($"Backup files of {st.DBName}", "Select the backup file to restore! First is the newest!", selectionlist,Menu.SelectionMode.Single,getconfirmation:true); | ||
| 212 | - if (ms == null) { continue; } | ||
| 213 | - selectedbackupfilepath = ms.SelectedParameterList.First().Parameters.ToString(); | ||
| 214 | - } | ||
| 215 | - SQLDataBaseManagerCore.RestoreBackup(st, selectedbackupfilepath, targetdirectorypath, restorefromzip, targetdbname); | ||
| 216 | - ColorConsole.WriteLine($"Database '{st.DBName}' restored to '{targetdbname}' into directory '{targetdirectorypath}'.", ConsoleColor.Green); | ||
| 217 | - } | ||
| 218 | - else | ||
| 219 | - { | ||
| 220 | - ColorConsole.WriteLine($"Database '{st.DBName}' restore FAILED, as no backup to restore!", ConsoleColor.Red); | ||
| 221 | - } | 207 | + selectionlist = (backupfilelist??new List<FileInfo>()) |
| 208 | + .Select(x => new KeyValuePair<string, string>($"{x.Name}({x.Length}bytes,created:{x.CreationTime})", x.FullName)) | ||
| 209 | + .ToDictionary(x => x.Key, x => x.Value); | ||
| 210 | + selectionlist.Add("*", "other..."); | ||
| 211 | + var ms = Menu.SelectFromItemList($"Backup files of {st.DBName}", "Select the backup file to restore! First is the newest!", selectionlist, Menu.SelectionMode.Single, getconfirmation: true); | ||
| 212 | + if (ms == null) { goto startselection; } | ||
| 213 | + else if (ms.SelectedKeyList.First() == "*") { } | ||
| 214 | + else { selectedbackupfilepath = ms.SelectedParameterList.First().Parameters.ToString(); } | ||
| 215 | + } | ||
| 216 | + if (selectedbackupfilepath == null) | ||
| 217 | + { | ||
| 218 | + enterpathtobackupfileloop: | ||
| 219 | + selectedbackupfilepath = ColorConsole.ReadLine("Enter the full path to the backup file, EX: to exit", ConsoleColor.Yellow); | ||
| 220 | + if (selectedbackupfilepath.ToUpper() == "EX") return o; | ||
| 221 | + else if (string.IsNullOrWhiteSpace(selectedbackupfilepath)) goto enterpathtobackupfileloop; | ||
| 222 | } | 222 | } |
| 223 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 223 | + |
| 224 | + SQLDataBaseManagerCore.RestoreBackup(st, selectedbackupfilepath, targetdirectorypath, restorefromzip, targetdbname); | ||
| 225 | + ColorConsole.WriteLine($"Database '{st.DBName}' restored to '{targetdbname}' into directory '{targetdirectorypath}'.", ConsoleColor.Green); | ||
| 226 | + } | ||
| 227 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } | ||
| 228 | + return o; | ||
| 229 | + } | ||
| 230 | + private static object RestoreDataBaseAnyToAnywhere(object parameter, object o) | ||
| 231 | + { | ||
| 232 | + var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>(); | ||
| 233 | + var args = (parameter as Menu.ExecutorParameter).Args; | ||
| 234 | + | ||
| 235 | + var selectedsqldbindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.SQLDataBaseManager.Function.CMD_DATABASES); | ||
| 236 | + bool restorefirst = CommandLine.GetCommandLineArgument(args, CLP.Module.SQLDataBaseManager.Function.RestoreDataBase.CMD_RESTOREFIRST, switchtype: true) != null; | ||
| 237 | + | ||
| 238 | + startselection: | ||
| 239 | + var menufolders = DisplaySQLDataBaseMenu(config, $"Select the SQL database(s) to manage with function '{nameof(RestoreDataBaseAnyToAnywhere)}'!", silent: true, selectionmode: Menu.SelectionMode.Single); | ||
| 240 | + | ||
| 241 | + Menu.Selection sr = menufolders.Select(selectedsqldbindexes); | ||
| 242 | + if (sr.Result == Menu.SelectionResult.Exit) { return o; } | ||
| 243 | + else if (sr.Result == Menu.SelectionResult.None) { return o; } | ||
| 244 | + else if (sr.Result == Menu.SelectionResult.Error) { return o; } | ||
| 245 | + else if (sr.Result == Menu.SelectionResult.Ok && sr.SelectedParameterList.FirstOrDefault() == null) { return o; } | ||
| 246 | + else if (sr.Result == Menu.SelectionResult.Ok) { } | ||
| 247 | + else { } | ||
| 248 | + var p = sr.SelectedParameterList.First(); | ||
| 249 | + SQLDataBase st = p.Parameters as SQLDataBase; | ||
| 250 | + try | ||
| 251 | + { | ||
| 252 | + var selectedbackupfilepath = ColorConsole.ReadLine("Enter the full path to the backup file (or its zip), EX: to exit", ConsoleColor.Yellow); | ||
| 253 | + if (selectedbackupfilepath.ToUpper() == "EX") { return o; } | ||
| 254 | + if (string.IsNullOrWhiteSpace(selectedbackupfilepath)) { goto startselection; } | ||
| 255 | + var targetdirectorypath = ColorConsole.ReadLine("Enter the full path to the folder where the DB physical files will be located, EX: to exit", ConsoleColor.Yellow); | ||
| 256 | + if (targetdirectorypath.ToUpper() == "EX") { return o; } | ||
| 257 | + if (string.IsNullOrWhiteSpace(selectedbackupfilepath)) { goto startselection; } | ||
| 258 | + var targetdbname = ColorConsole.ReadLine($"Enter the name of the target DB (empty={st.DBName}), EX: to exit", ConsoleColor.Yellow); | ||
| 259 | + if (targetdirectorypath.ToUpper() == "EX") { return o; } | ||
| 260 | + if (string.IsNullOrWhiteSpace(selectedbackupfilepath)) { targetdbname = st.DBName; } | ||
| 261 | + bool restorefromzip =Path.GetExtension(selectedbackupfilepath).ToLower() == ".zip"; ; | ||
| 262 | + SQLDataBaseManagerCore.RestoreBackup(st, selectedbackupfilepath, targetdirectorypath, restorefromzip, targetdbname); | ||
| 263 | + ColorConsole.WriteLine($"Database '{targetdbname}' restored into directory '{targetdirectorypath}'.", ConsoleColor.Green); | ||
| 264 | + goto startselection; | ||
| 224 | } | 265 | } |
| 266 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } | ||
| 267 | + return o; | ||
| 268 | + } | ||
| 269 | + private static object CreateServerLogin(object parameter, object o) | ||
| 270 | + { | ||
| 271 | + var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>(); | ||
| 272 | + var args = (parameter as Menu.ExecutorParameter).Args; | ||
| 273 | + var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.ScheduledTaskManager.Function.CMD_TASKS); | ||
| 274 | + var menuofdbs = DisplaySQLDataBaseMenu(config, $"Select the SQL database(s) to manage with function '{nameof(CreateServerLogin)}'!", silent: true, selectionmode: Menu.SelectionMode.Single); | ||
| 275 | + Menu.Selection sr = menuofdbs.Select(selectedtaskindexes); | ||
| 276 | + if (sr.Result == Menu.SelectionResult.Exit) { return o; } | ||
| 277 | + else if (sr.Result == Menu.SelectionResult.None) { return o; } | ||
| 278 | + else if (sr.Result == Menu.SelectionResult.Error) { return o; } | ||
| 279 | + else if (sr.SelectedParameterList?.FirstOrDefault() == null) { return o; } | ||
| 280 | + else if (sr.Result == Menu.SelectionResult.Ok) { } | ||
| 281 | + else { } | ||
| 282 | + string dbusername; | ||
| 283 | + string password; | ||
| 284 | + LoginType logintype; | ||
| 285 | + | ||
| 286 | + var p = sr.SelectedParameterList.FirstOrDefault(); | ||
| 287 | + SQLDataBase sqld = p.Parameters as SQLDataBase; | ||
| 288 | + | ||
| 289 | + parameterinputloop: | ||
| 290 | + try | ||
| 291 | + { | ||
| 292 | + ColorConsole.WriteLine(prefix: $"Enter the parameters for creating server login: {sqld.DBName}. Format:", bracket: "()", text: "LOGINNAME[,PASSWORD][GRANTORUSER[,GRANTORUSERPASSWORD]]", f: ConsoleColor.Yellow); | ||
| 293 | + ColorConsole.WriteLine(prefix: " ", text: "LOGINNAME", bracket: "", suffix: $": server login name"); | ||
| 294 | + ColorConsole.WriteLine(prefix: " ", text: "PASSWORD", bracket: "", suffix: $": password for login; empty=windows login is created, non empty=sql login is created"); | ||
| 295 | + ColorConsole.WriteLine(prefix: " ", text: "GRANTORUSER", bracket: "", suffix: $": name of the user in behalf the login is created (that logs in the sql server); default:current user with windows authentication"); | ||
| 296 | + ColorConsole.WriteLine(prefix: " ", text: "GRANTORUSERPASSWORD", bracket: "", suffix: $": password for GRANTORUSER;default:empy (windows authentication is used with GRANTORUSER)"); | ||
| 297 | + | ||
| 298 | + var createuseroptions = ColorConsole.ReadLine($"EX=exit.", ConsoleColor.Yellow, suffix: " --> "); | ||
| 299 | + if (createuseroptions.ToUpper() == "EX") { return o; } | ||
| 300 | + | ||
| 301 | + dbusername = null; | ||
| 302 | + password = null; | ||
| 303 | + logintype = LoginType.WindowsUser; | ||
| 304 | + | ||
| 305 | + var optionList = createuseroptions.Split(new char[] { ',' }, StringSplitOptions.None); | ||
| 306 | + if (optionList.Length < 1) { ColorConsole.WriteLine("ERROR! LOGINNAME is required, PASSWORD is optional", ConsoleColor.Red); goto parameterinputloop; } | ||
| 307 | + | ||
| 308 | + dbusername = optionList[0]; | ||
| 309 | + if (optionList.Length == 2) | ||
| 310 | + { | ||
| 311 | + password = optionList[1]; | ||
| 312 | + if (string.IsNullOrWhiteSpace(password)) { ColorConsole.WriteLine("ERROR! PASSWORD, if set, may not be empty!", ConsoleColor.Red); goto parameterinputloop; } | ||
| 313 | + logintype = LoginType.SqlLogin; | ||
| 314 | + } | ||
| 315 | + string grantoruser = null; | ||
| 316 | + string grantoruserpsw = null; | ||
| 317 | + if (optionList.Length > 2) | ||
| 318 | + { | ||
| 319 | + grantoruser = optionList[2]; | ||
| 320 | + if (string.IsNullOrWhiteSpace(grantoruser)) { ColorConsole.WriteLine("ERROR! GRANTORUSER, if set, may not be empty!", ConsoleColor.Red); goto parameterinputloop; } | ||
| 321 | + } | ||
| 322 | + if (optionList.Length > 3) | ||
| 323 | + { | ||
| 324 | + grantoruserpsw = optionList[3]; | ||
| 325 | + if (string.IsNullOrWhiteSpace(grantoruser)) { ColorConsole.WriteLine("ERROR! GRANTORUSERPASSWORD, if set, may not be empty!", ConsoleColor.Red); goto parameterinputloop; } | ||
| 326 | + } | ||
| 327 | + | ||
| 328 | + SQLDataBaseManagerCore.CreateLogin(sqld.SQLCS, dbusername, password, "master", logintype, null,grantoruser,grantoruserpsw); | ||
| 329 | + string passwordtext = logintype == LoginType.WindowsUser ? "" : $", password:{password}"; | ||
| 330 | + ColorConsole.WriteLine($"Server login created. Server login name:{dbusername}, login type: {logintype}{passwordtext}.", ConsoleColor.Green); | ||
| 331 | + } | ||
| 332 | + catch (Exception ex) | ||
| 333 | + { | ||
| 334 | + ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); | ||
| 335 | + goto parameterinputloop; | ||
| 336 | + } | ||
| 337 | + goto parameterinputloop; | ||
| 338 | + | ||
| 339 | + } | ||
| 340 | + private static string[] selectablerolelist = new string[] { "FULLACCESS", "DATAREADER", "db_accessadmin", "db_backupoperator", "db_datareader", "db_datawriter", "db_ddladmin", "db_denydatareader", "db_denydatawriter", "db_owner", "db_securityadmin", }; | ||
| 341 | + private static string[] fullaccessrolelist = new string[] { "db_accessadmin", "db_backupoperator", "db_datareader", "db_datawriter", "db_ddladmin", "db_owner", "db_securityadmin", }; | ||
| 342 | + private static string[] datareaderrolelist = new string[] { "db_datareader", "db_denydatareader", }; | ||
| 343 | + private static object CreateDBUser(object parameter, object o) | ||
| 344 | + { | ||
| 345 | + const string COMMA = ","; | ||
| 346 | + var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>(); | ||
| 347 | + var args = (parameter as Menu.ExecutorParameter).Args; | ||
| 348 | + var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.ScheduledTaskManager.Function.CMD_TASKS); | ||
| 349 | + var menuofdbs = DisplaySQLDataBaseMenu(config, $"Select the SQL database(s) to manage with function '{nameof(CreateDBUser)}'!", silent: true, selectionmode: Menu.SelectionMode.Single); | ||
| 350 | + Menu.Selection sr = menuofdbs.Select(selectedtaskindexes); | ||
| 351 | + if (sr.Result == Menu.SelectionResult.Exit) { return o; } | ||
| 352 | + else if (sr.Result == Menu.SelectionResult.None) { return o; } | ||
| 353 | + else if (sr.Result == Menu.SelectionResult.Error) { return o; } | ||
| 354 | + else if (sr.SelectedParameterList?.FirstOrDefault() == null) { return o; } | ||
| 355 | + else if (sr.Result == Menu.SelectionResult.Ok) { } | ||
| 356 | + else { } | ||
| 357 | + string dbusername = null; | ||
| 358 | + string loginname = null; | ||
| 359 | + string rolenamecommalist = null; | ||
| 360 | + | ||
| 361 | + var p = sr.SelectedParameterList.FirstOrDefault(); | ||
| 362 | + SQLDataBase sqld = p.Parameters as SQLDataBase; | ||
| 363 | + | ||
| 364 | + parameterinputloop: | ||
| 365 | + try | ||
| 366 | + { | ||
| 367 | + ColorConsole.WriteLine(prefix: $"Enter the parameters for creating DB user for: {sqld.DBName}. Format:", bracket: "()", text: "DBUSERNAME,SERVERLOGINNAME,ROLENAME,ROLENAME,ROLENAME...", f: ConsoleColor.Yellow); | ||
| 368 | + ColorConsole.WriteLine(prefix: " ", text: "DBUSERNAME", bracket: "", suffix: $": dbusername."); | ||
| 369 | + ColorConsole.WriteLine(prefix: " ", text: "SERVERLOGINNAME", bracket: "", suffix: $": serverlogin name; empty=SQL user w/o login,w=WIndows user, other=SQL user for this server login name(* means server login name equals to dbusername)."); | ||
| 370 | + ColorConsole.WriteLine(prefix: " ", text: "ROLENAME", bracket: "", suffix: $": One of these->" + string.Join(COMMA, selectablerolelist)); | ||
| 371 | + | ||
| 372 | + var createuseroptions = ColorConsole.ReadLine($"EX=exit.", ConsoleColor.Yellow, suffix: " --> "); | ||
| 373 | + if (createuseroptions.ToUpper() == "EX") { return o; } | ||
| 374 | + | ||
| 375 | + dbusername = null; | ||
| 376 | + loginname = null; | ||
| 377 | + rolenamecommalist = null; | ||
| 378 | + var optionList = createuseroptions.Split(new char[] { ',' }, StringSplitOptions.None); | ||
| 379 | + if (optionList.Length < 3) { ColorConsole.WriteLine("ERROR! DBUSERNAME,SERVERLOGINNAME and at least one ROLENAME are required", ConsoleColor.Red); goto parameterinputloop; } | ||
| 380 | + //012345678 | ||
| 381 | + //uuu,ppp,r1,r2,r3 | ||
| 382 | + dbusername = optionList[0]; | ||
| 383 | + loginname = optionList[1]; | ||
| 384 | + var selectedrolelist = optionList.Skip(2).ToArray(); | ||
| 385 | + List<string> badrolenames = new List<string>(); | ||
| 386 | + bool enablefullaccess = false; | ||
| 387 | + bool enabledatareader = false; | ||
| 388 | + int selectedrolelistnum = 0; | ||
| 389 | + foreach (var rolename in selectedrolelist) | ||
| 390 | + { | ||
| 391 | + selectedrolelistnum++; | ||
| 392 | + enablefullaccess = enablefullaccess || rolename.ToUpper() == "FULLACCESS"; | ||
| 393 | + enabledatareader = enabledatareader || rolename.ToUpper() == "DATAREADER"; | ||
| 394 | + if (!selectablerolelist.Contains(rolename)) { badrolenames.Add(rolename); } | ||
| 395 | + } | ||
| 396 | + bool specialselectionactive = enablefullaccess || enabledatareader; | ||
| 397 | + if (selectedrolelistnum > 1 && specialselectionactive) { ColorConsole.WriteLine($"ERROR! FULLACCESS or DATAREADER has to be selected alone!", ConsoleColor.Red); goto parameterinputloop; } | ||
| 398 | + if (badrolenames.Count > 0) { ColorConsole.WriteLine($"ERROR! {string.Join(COMMA, badrolenames)} are not available!", ConsoleColor.Red); goto parameterinputloop; } | ||
| 399 | + | ||
| 400 | + var effectiverolelist = | ||
| 401 | + enablefullaccess ? fullaccessrolelist | ||
| 402 | + : enabledatareader ? datareaderrolelist | ||
| 403 | + : selectedrolelist; | ||
| 404 | + rolenamecommalist = string.Join(",", effectiverolelist); | ||
| 405 | + | ||
| 406 | + SQLDataBaseManagerCore.CreateUser(sqld.SQLCS, dbusername, rolenamecommalist, loginname); | ||
| 407 | + ColorConsole.WriteLine($"DB user created. DB name:{sqld.DBName}, DB username:{dbusername}, rolelist={rolenamecommalist}.", ConsoleColor.Green); | ||
| 408 | + } | ||
| 409 | + catch (Exception ex) | ||
| 410 | + { | ||
| 411 | + ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); | ||
| 412 | + goto parameterinputloop; | ||
| 413 | + } | ||
| 414 | + goto parameterinputloop; | ||
| 415 | + } | ||
| 416 | + private static object MoveDbToRemoteServer(object parameter, object o) | ||
| 417 | + { | ||
| 418 | + var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>(); | ||
| 419 | + var args = (parameter as Menu.ExecutorParameter).Args; | ||
| 420 | + | ||
| 421 | + var selectedsqldbindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.SQLDataBaseManager.Function.CMD_DATABASES); | ||
| 422 | + | ||
| 423 | + selectionloop: | ||
| 424 | + var menufolders = DisplaySQLDataBaseMenu(config, $"Select the SQL database(s) to manage with function. '{nameof(MoveDbToRemoteServer)}'! Format:FROMLOCALDB,TOREMOTEDB", silent: true, selectionmode: Menu.SelectionMode.Multi); | ||
| 425 | + | ||
| 426 | + Menu.Selection sr = menufolders.Select(selectedsqldbindexes); | ||
| 427 | + if (sr.Result == Menu.SelectionResult.Exit) { return o; } | ||
| 428 | + else if (sr.Result == Menu.SelectionResult.None) { goto selectionloop; } | ||
| 429 | + else if (sr.Result == Menu.SelectionResult.Error) { goto selectionloop; } | ||
| 430 | + else if (sr.Result == Menu.SelectionResult.Ok && sr.SelectedParameterList.FirstOrDefault() == null) { goto selectionloop; } | ||
| 431 | + else if (sr.Result == Menu.SelectionResult.Ok && sr.SelectedParameterList.Count() != 2) | ||
| 432 | + { | ||
| 433 | + ColorConsole.WriteLine($"Select exactly 2 DB. Format:FROMLOCALDB,TOREMOTEDB", ConsoleColor.Red); | ||
| 434 | + goto selectionloop; | ||
| 435 | + } | ||
| 436 | + else if (sr.Result == Menu.SelectionResult.Ok) { } | ||
| 437 | + else { } | ||
| 438 | + var spfrom = sr.SelectedParameterList.First(); | ||
| 439 | + var spto = sr.SelectedParameterList.ElementAt(1); | ||
| 440 | + SQLDataBase dbfrom = spfrom.Parameters as SQLDataBase; | ||
| 441 | + SQLDataBase dbto = spto.Parameters as SQLDataBase; | ||
| 442 | + if (!dbto.Xml_IsRemoteDB) | ||
| 443 | + { | ||
| 444 | + ColorConsole.WriteLine($"TOREMOTEDB '{dbto.SQLCS}' has to be remote!", ConsoleColor.Red); | ||
| 445 | + goto selectionloop; | ||
| 446 | + } | ||
| 447 | + if (dbfrom.Xml_IsRemoteDB) | ||
| 448 | + { | ||
| 449 | + ColorConsole.WriteLine($"FROMLOCALDB '{dbfrom.SQLCS}' has to be local!", ConsoleColor.Red); | ||
| 450 | + goto selectionloop; | ||
| 451 | + } | ||
| 452 | + bool emulation = false; | ||
| 453 | + | ||
| 454 | + var selecteddbname = ColorConsole.ReadLine($"Enter the name of the restored DB. EMPTY={dbto.DBName}, EX=exit."); | ||
| 455 | + if (selecteddbname.ToUpper() == "EX") return o; | ||
| 456 | + else if (string.IsNullOrWhiteSpace(selecteddbname)) selecteddbname=dbto.DBName; | ||
| 457 | + | ||
| 458 | + confirmloop:; | ||
| 459 | + var selection = ColorConsole.ReadLine("Enter CONFIRM to start, EMU to emulate, EX to exit."); | ||
| 460 | + if (selection.ToUpper() == "EX") return o; | ||
| 461 | + else if (selection.ToUpper() == "EMU") emulation = true; | ||
| 462 | + else if (selection.ToUpper() == "CONFIRM") { } | ||
| 463 | + else goto confirmloop; | ||
| 464 | + | ||
| 465 | + var DateTimeNow = DateTime.Now; | ||
| 466 | + var usernameList = new string[] { "corplear\\lschwirg", "corplear\\gen_vrhalmadmin", $"corplear\\{Program.ThisComputer.ComputerName}$" }; | ||
| 467 | + foreach (var username in usernameList) | ||
| 468 | + { | ||
| 469 | + ColorConsole.WriteLine(username, ConsoleColor.Yellow, prefix: nameof(SQLDataBaseManagerCore.CreateUser) + ":"); | ||
| 470 | + try { if (!emulation) SQLDataBaseManagerCore.CreateLogin(dbfrom.SQLCS, username, null, "master", LoginType.WindowsUser, null); } | ||
| 471 | + catch (Exception ex) { ColorConsole.WriteLine(nameof(SQLDataBaseManagerCore.CreateLogin)+">>>: "+ex.MessageNested(), ConsoleColor.Red); } | ||
| 472 | + try { if (!emulation) SQLDataBaseManagerCore.CreateUser(dbfrom.SQLCS, username, string.Join(",", fullaccessrolelist), "w"); } | ||
| 473 | + catch (Exception ex) { ColorConsole.WriteLine(nameof(SQLDataBaseManagerCore.CreateUser) + "\n" + ex.MessageNested(), ConsoleColor.Red); } | ||
| 474 | + } | ||
| 475 | + | ||
| 476 | + //backup dbfrom | ||
| 477 | + var backupfileFullname = SQLDataBaseManagerCore.CreateBackup(dbfrom, false, DateTimeNow,emulation); | ||
| 478 | + //move dbfrom to tranit area | ||
| 479 | + | ||
| 480 | + if (!emulation && !File.Exists(backupfileFullname)) { goto selectionloop; } | ||
| 481 | + | ||
| 482 | + string backupfileFilename = null; | ||
| 483 | + string tranzitfileFullname = null; | ||
| 484 | + try | ||
| 485 | + { | ||
| 486 | + backupfileFilename = Path.GetFileName(backupfileFullname); | ||
| 487 | + tranzitfileFullname = Path.Combine(dbto.Xml_TranzitDirectoryPath, backupfileFilename); | ||
| 488 | + ColorConsole.WriteLine($"Moving backup file {backupfileFullname} to tranzit location: {dbto.Xml_TranzitDirectoryPath}", ConsoleColor.Yellow); | ||
| 489 | + if (!emulation) | ||
| 490 | + { | ||
| 491 | + if (File.Exists(tranzitfileFullname)) { File.Delete(tranzitfileFullname); } | ||
| 492 | + File.Move(backupfileFullname, tranzitfileFullname); | ||
| 493 | + ColorConsole.WriteLine($"...completed...", ConsoleColor.Yellow); | ||
| 494 | + } | ||
| 495 | + } | ||
| 496 | + catch (Exception ex) | ||
| 497 | + { | ||
| 498 | + ColorConsole.WriteLine($"Moving file FAILED!", ConsoleColor.Red); | ||
| 499 | + ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); | ||
| 500 | + goto selectionloop; | ||
| 501 | + } | ||
| 502 | + if (!emulation && !File.Exists(tranzitfileFullname)) { goto selectionloop; } | ||
| 503 | + | ||
| 504 | + //restore backup to dbto | ||
| 505 | + tranzitfileFullname = Path.Combine(dbto.Xml_TranzitDirectoryPath, backupfileFilename); | ||
| 506 | + SQLDataBaseManagerCore.RestoreBackup(dbto, tranzitfileFullname, dbto.Xml_PhysicalFilesDirectoryPath, false, selecteddbname, emulation); | ||
| 507 | + | ||
| 508 | + ColorConsole.WriteLine($"Moving DB to remote server completed. Required time: {(int)(DateTime.Now.Subtract(DateTimeNow).TotalSeconds)} seconds.",ConsoleColor.Green); | ||
| 225 | return o; | 509 | return o; |
| 226 | } | 510 | } |
| 227 | - private static object CreteLoginAndAddToDB(object parameter, object o) { return _CreteLoginAndUser(parameter, o, true); } | ||
| 228 | - private static object AddExistingLoginToDB(object parameter, object o) { return _CreteLoginAndUser(parameter, o, false); } | ||
| 229 | 511 | ||
| 230 | private static object ManageLastUpdatedTrigger(object parameter, object o) { return _ManageLastUpdatedTrigger(parameter, o, null); } | 512 | private static object ManageLastUpdatedTrigger(object parameter, object o) { return _ManageLastUpdatedTrigger(parameter, o, null); } |
| 231 | #region script texts for _RemoveAndCreateLastUpdatedTrigger | 513 | #region script texts for _RemoveAndCreateLastUpdatedTrigger |
| @@ -351,10 +633,10 @@ GO | @@ -351,10 +633,10 @@ GO | ||
| 351 | 633 | ||
| 352 | if (!Tools.ResolveArguments(parameters, RemoveLastUpdatedTrigger_Script, out ssScriptText)) { throw new ApplicationException(); } | 634 | if (!Tools.ResolveArguments(parameters, RemoveLastUpdatedTrigger_Script, out ssScriptText)) { throw new ApplicationException(); } |
| 353 | try {SQLDataBaseManagerCore.ExecuteSQLScript(sqld.SQLCS, ssScriptText, 5000, null); } | 635 | try {SQLDataBaseManagerCore.ExecuteSQLScript(sqld.SQLCS, ssScriptText, 5000, null); } |
| 354 | - catch (Exception e) {ColorConsole.WriteLine(e.Message, ConsoleColor.Yellow);} | 636 | + catch (Exception e) {ColorConsole.WriteLine(e.MessageNested(), ConsoleColor.Yellow);} |
| 355 | if (!Tools.ResolveArguments(parameters, RemoveLastUpdatedColumn_Script, out ssScriptText)) { throw new ApplicationException(); } | 637 | if (!Tools.ResolveArguments(parameters, RemoveLastUpdatedColumn_Script, out ssScriptText)) { throw new ApplicationException(); } |
| 356 | try {SQLDataBaseManagerCore.ExecuteSQLScript(sqld.SQLCS, ssScriptText, 5000, null);} | 638 | try {SQLDataBaseManagerCore.ExecuteSQLScript(sqld.SQLCS, ssScriptText, 5000, null);} |
| 357 | - catch (Exception e) { ColorConsole.WriteLine(e.Message, ConsoleColor.Yellow); } | 639 | + catch (Exception e) { ColorConsole.WriteLine(e.MessageNested(), ConsoleColor.Yellow); } |
| 358 | 640 | ||
| 359 | if (!effectiveremoveaction) | 641 | if (!effectiveremoveaction) |
| 360 | { | 642 | { |
| @@ -377,102 +659,10 @@ GO | @@ -377,102 +659,10 @@ GO | ||
| 377 | } | 659 | } |
| 378 | catch (Exception e) | 660 | catch (Exception e) |
| 379 | { | 661 | { |
| 380 | - ColorConsole.WriteLine("FATAL ERROR! "+e.Message, ConsoleColor.Red); | 662 | + ColorConsole.WriteLine("FATAL ERROR! "+e.MessageNested(), ConsoleColor.Red); |
| 381 | goto getparameters; | 663 | goto getparameters; |
| 382 | } | 664 | } |
| 383 | } | 665 | } |
| 384 | - private static object _CreteLoginAndUser(object parameter, object o,bool createlogin) | ||
| 385 | - { | ||
| 386 | - const string COMMA = ","; | ||
| 387 | - var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>(); | ||
| 388 | - var args = (parameter as Menu.ExecutorParameter).Args; | ||
| 389 | - var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.ScheduledTaskManager.Function.CMD_TASKS); | ||
| 390 | - var functionname = createlogin ? nameof(CreteLoginAndAddToDB) : nameof(AddExistingLoginToDB); | ||
| 391 | - var menufolders = DisplaySQLDataBaseMenu(config, $"Select the SQL database(s) to manage with function '{functionname}'!", silent: true); | ||
| 392 | - Menu.Selection sr = menufolders.Select(selectedtaskindexes); | ||
| 393 | - if (sr.Result == Menu.SelectionResult.Exit) { return o; } | ||
| 394 | - else if (sr.Result == Menu.SelectionResult.None) { return o; } | ||
| 395 | - else if (sr.Result == Menu.SelectionResult.Error) { return o; } | ||
| 396 | - else if (sr.Result == Menu.SelectionResult.Ok) { } | ||
| 397 | - else { } | ||
| 398 | - string dbusername = null; | ||
| 399 | - string password = null; | ||
| 400 | - string rolenamecommalist = null; | ||
| 401 | - int loopindex = 0; | ||
| 402 | - bool effectivecreatelogin = createlogin; | ||
| 403 | - foreach (var p in sr.SelectedParameterList) | ||
| 404 | - { | ||
| 405 | - effectivecreatelogin = createlogin && loopindex == 0; | ||
| 406 | - SQLDataBase sqld = p.Parameters as SQLDataBase; | ||
| 407 | - try | ||
| 408 | - { | ||
| 409 | - var enabledrolelist = new string[] { "db_datareader", "db_datawriter", "db_accessadmin", "db_securityadmin", "db_backupoperator" }; | ||
| 410 | - if (effectivecreatelogin) | ||
| 411 | - { | ||
| 412 | - ColorConsole.WriteLine(prefix: $"Enter the parameters for creating user for database: {sqld.DBName}. Format:", bracket: "()", text: "DBUSERNAME,PASSWORD,ROLENAME,ROLENAME,ROLENAME...", f: ConsoleColor.Yellow); | ||
| 413 | - } | ||
| 414 | - else | ||
| 415 | - { | ||
| 416 | - ColorConsole.WriteLine(prefix: $"Enter the parameters for creating user for database: {sqld.DBName}. Format:", bracket: "()", text: "DBUSERNAME,ROLENAME,ROLENAME,ROLENAME...", f: ConsoleColor.Yellow); | ||
| 417 | - if (createlogin) | ||
| 418 | - { | ||
| 419 | - ColorConsole.WriteLine(prefix: $"Press [Enter] to use parameters set in the previous loop.", bracket: "()", text: $"{dbusername},{rolenamecommalist}", f: ConsoleColor.Yellow); | ||
| 420 | - } | ||
| 421 | - } | ||
| 422 | - ColorConsole.WriteLine(prefix: " ", text: "DBUSERNAME", bracket: "", suffix: $": dbusername (server login name; must exist when adding login to DB)"); | ||
| 423 | - if (effectivecreatelogin) | ||
| 424 | - { | ||
| 425 | - ColorConsole.WriteLine(prefix: " ", text: "PASSWORD", bracket: "", suffix: $": password for login"); | ||
| 426 | - } | ||
| 427 | - ColorConsole.WriteLine(prefix: " ", text: "ROLENAME", bracket: "", suffix: $": One of these->" + string.Join(COMMA, enabledrolelist)); | ||
| 428 | - | ||
| 429 | - var createuseroptions = ColorConsole.ReadLine($"EX=exit.", ConsoleColor.Yellow, suffix: " --> "); | ||
| 430 | - if (createuseroptions.ToUpper() == "EX") { continue; } | ||
| 431 | - if (loopindex>0 && string.IsNullOrWhiteSpace(createuseroptions)) { createuseroptions = $"{dbusername},{rolenamecommalist}"; } | ||
| 432 | - | ||
| 433 | - dbusername = null; | ||
| 434 | - password = null; | ||
| 435 | - rolenamecommalist = null; | ||
| 436 | - var optionList = createuseroptions.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); | ||
| 437 | - if (effectivecreatelogin) | ||
| 438 | - { | ||
| 439 | - if (optionList.Length < 3) { ColorConsole.WriteLine("ERROR! USERNAME,PASSWORD and at least one ROLENAME are required", ConsoleColor.Red); continue; } | ||
| 440 | - } | ||
| 441 | - else | ||
| 442 | - { | ||
| 443 | - if (optionList.Length < 2) { ColorConsole.WriteLine("ERROR! USERNAME and at least one ROLENAME are required", ConsoleColor.Red); continue; } | ||
| 444 | - } | ||
| 445 | - //012345678 | ||
| 446 | - //uuu,ppp,r1,r2,r3 | ||
| 447 | - dbusername = optionList[0]; | ||
| 448 | - password = effectivecreatelogin ? optionList[1]:null; | ||
| 449 | - //rolenamecommalist = cretauseroptions.Substring(username.Length + password.Length + 2); | ||
| 450 | - var rolenameList = optionList.Skip(effectivecreatelogin ? 2:1).ToArray(); | ||
| 451 | - List<string> badrolenames = new List<string>(); | ||
| 452 | - foreach (var rolename in rolenameList) | ||
| 453 | - { | ||
| 454 | - if (!enabledrolelist.Contains(rolename)) { badrolenames.Add(rolename); } | ||
| 455 | - } | ||
| 456 | - if (badrolenames.Count > 0) { ColorConsole.WriteLine($"ERROR! {string.Join(COMMA, badrolenames)} are not available!", ConsoleColor.Red); continue; } | ||
| 457 | - rolenamecommalist = string.Join(",", rolenameList); | ||
| 458 | - | ||
| 459 | - if (effectivecreatelogin) | ||
| 460 | - { | ||
| 461 | - SQLDataBaseManagerCore.CreateLogin(sqld.SQLCS, dbusername, password, "master", null); | ||
| 462 | - SQLDataBaseManagerCore.CreateUser(sqld.SQLCS, dbusername, rolenamecommalist); | ||
| 463 | - ColorConsole.WriteLine($"Login and DB users created. DB name:{sqld.DBName}, login and DB username:{dbusername}, password:{password},rolelist={rolenamecommalist}.", ConsoleColor.Green); | ||
| 464 | - } | ||
| 465 | - else | ||
| 466 | - { | ||
| 467 | - SQLDataBaseManagerCore.CreateUser(sqld.SQLCS, dbusername, rolenamecommalist); | ||
| 468 | - ColorConsole.WriteLine($"DB user created. DB name:{sqld.DBName}, DB username:{dbusername}, rolelist={rolenamecommalist}.", ConsoleColor.Green); | ||
| 469 | - } | ||
| 470 | - } | ||
| 471 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red);continue; } | ||
| 472 | - loopindex++; | ||
| 473 | - } | ||
| 474 | - return o; | ||
| 475 | - } | ||
| 476 | 666 | ||
| 477 | private static object ExecuteScript(object parameter, object o) | 667 | private static object ExecuteScript(object parameter, object o) |
| 478 | { | 668 | { |
| @@ -532,11 +722,66 @@ GO | @@ -532,11 +722,66 @@ GO | ||
| 532 | } | 722 | } |
| 533 | } | 723 | } |
| 534 | } | 724 | } |
| 535 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 725 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 536 | } | 726 | } |
| 537 | return o; | 727 | return o; |
| 538 | } | 728 | } |
| 539 | 729 | ||
| 730 | + private static object DropDB(object parameter, object o) | ||
| 731 | + { | ||
| 732 | + var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>(); | ||
| 733 | + var args = (parameter as Menu.ExecutorParameter).Args; | ||
| 734 | + | ||
| 735 | + var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.ScheduledTaskManager.Function.CMD_TASKS); | ||
| 736 | + | ||
| 737 | + var menufolders = DisplaySQLDataBaseMenu(config, $"Select the SQL database(s) that is located on the server, where the DB to manage with function '{nameof(DropDB)}'!", silent: true); | ||
| 738 | + | ||
| 739 | + Menu.Selection sr = menufolders.Select(selectedtaskindexes); | ||
| 740 | + if (sr.Result == Menu.SelectionResult.Exit) { return o; } | ||
| 741 | + else if (sr.Result == Menu.SelectionResult.None) { return o; } | ||
| 742 | + else if (sr.Result == Menu.SelectionResult.Error) { return o; } | ||
| 743 | + else if (sr.Result == Menu.SelectionResult.Ok) { } | ||
| 744 | + else { } | ||
| 745 | + foreach (var p in sr.SelectedParameterList) | ||
| 746 | + { | ||
| 747 | + SQLDataBase sqld = p.Parameters as SQLDataBase; | ||
| 748 | + try | ||
| 749 | + { | ||
| 750 | + ColorConsole.WriteLine(prefix: $"Enter the dbname, the userid/password (for the user in favour you want to drop the DB). Format:", bracket: "()", text: "[DBNAME][,USERNAME[,PASSWORD]]:", f: ConsoleColor.Yellow); | ||
| 751 | + ColorConsole.WriteLine(prefix: " ", text: "[DBNAME]", bracket: "[]", suffix: $":name of the DB to delete, default:{sqld.DBName}", f: ConsoleColor.Yellow); | ||
| 752 | + ColorConsole.WriteLine(prefix: " ", text: "[USERNAME,PASSWORD empty]", bracket: "[]", suffix: $":use windows authentication with current user", f: ConsoleColor.Yellow); | ||
| 753 | + ColorConsole.WriteLine(prefix: " ", text: "USERNAME", bracket: "[]", suffix: $":use windows authentication with this user", f: ConsoleColor.Yellow); | ||
| 754 | + ColorConsole.WriteLine(prefix: " ", text: "USERNAME,PASSWORD", bracket: "[]", suffix: $":use sql server authentication with this user and password.", f: ConsoleColor.Yellow); | ||
| 755 | + var parameters = ColorConsole.ReadLine($"EX=exit.", ConsoleColor.Yellow, suffix: " --> "); | ||
| 756 | + if (parameters.ToUpper() == "EX") { continue; } | ||
| 757 | + | ||
| 758 | + string userid = null; | ||
| 759 | + string password = null; | ||
| 760 | + string dbname = null; | ||
| 761 | + if (!string.IsNullOrWhiteSpace(parameters)) | ||
| 762 | + { | ||
| 763 | + dbname = parameters.Split(new char[] { ',' })[0]; | ||
| 764 | + if (parameters.IndexOf(',') >= 1) { userid = parameters.Split(new char[] { ',' })[1]; } | ||
| 765 | + if (parameters.IndexOf(',') >= 0) { password = parameters.Split(new char[] { ',' })[2]; } | ||
| 766 | + } | ||
| 767 | + if (string.IsNullOrWhiteSpace(dbname)) { dbname = sqld.DBName; } | ||
| 768 | + ColorConsole.WriteLine($"Dropping DB..."); | ||
| 769 | + ColorConsole.WriteLine(prefix: " connection string to server:", text: sqld.SQLCS, bracket: "[]", f: ConsoleColor.Yellow); | ||
| 770 | + ColorConsole.WriteLine(prefix: " DB name to drop:", text: dbname, bracket: "[]", f: ConsoleColor.Yellow); | ||
| 771 | + ColorConsole.WriteLine(prefix: " userid:", text: userid ?? "-", bracket: "[]", f: ConsoleColor.Yellow); | ||
| 772 | + ColorConsole.WriteLine(prefix: " user psw:", text: password ?? "-", bracket: "[]", f: ConsoleColor.Yellow); | ||
| 773 | + var confirmation = ColorConsole.ReadLine($"Enter CONFIRM to execute. EX=exit.", ConsoleColor.Yellow, suffix: " --> "); | ||
| 774 | + if (confirmation.ToUpper() == "EX") { continue; } | ||
| 775 | + else if (confirmation.ToUpper() != "CONFIRM") { continue; } | ||
| 776 | + | ||
| 777 | + var success = SQLDataBaseManagerCore.DropDatabase(sqld.SQLCS, dbname, userid, password); | ||
| 778 | + if (success) { ColorConsole.WriteLine($"SUCCESS! Database dropped. Name:{dbname}", ConsoleColor.Green); } | ||
| 779 | + else { ColorConsole.WriteLine($"FAILURE! Database is NOT dropped. Name:{dbname}", ConsoleColor.Red); } | ||
| 780 | + } | ||
| 781 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } | ||
| 782 | + } | ||
| 783 | + return o; | ||
| 784 | + } | ||
| 540 | private static object ShrinkDB(object parameter, object o) | 785 | private static object ShrinkDB(object parameter, object o) |
| 541 | { | 786 | { |
| 542 | var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>(); | 787 | var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>(); |
| @@ -576,7 +821,7 @@ GO | @@ -576,7 +821,7 @@ GO | ||
| 576 | SQLDataBaseManagerCore.ShrinkDB(sqld.SQLCS, shrinkmethod, fspint); | 821 | SQLDataBaseManagerCore.ShrinkDB(sqld.SQLCS, shrinkmethod, fspint); |
| 577 | ColorConsole.WriteLine($"Database shrinked. Name:{sqld.DBName}", ConsoleColor.Green); | 822 | ColorConsole.WriteLine($"Database shrinked. Name:{sqld.DBName}", ConsoleColor.Green); |
| 578 | } | 823 | } |
| 579 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 824 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 580 | } | 825 | } |
| 581 | return o; | 826 | return o; |
| 582 | } | 827 | } |
| @@ -605,7 +850,7 @@ GO | @@ -605,7 +850,7 @@ GO | ||
| 605 | else if (string.IsNullOrWhiteSpace(restoredbname)) { restoredbname = sqld.DBName; } | 850 | else if (string.IsNullOrWhiteSpace(restoredbname)) { restoredbname = sqld.DBName; } |
| 606 | ColorConsole.WriteLine("Enter the path for the DB physical files.", ConsoleColor.Yellow); | 851 | ColorConsole.WriteLine("Enter the path for the DB physical files.", ConsoleColor.Yellow); |
| 607 | ColorConsole.WriteLine(sqld.PhysicalFilesDirectoryPath, ConsoleColor.Yellow, prefix: $" Empty=current location of source DB: ", bracket: "[]"); | 852 | ColorConsole.WriteLine(sqld.PhysicalFilesDirectoryPath, ConsoleColor.Yellow, prefix: $" Empty=current location of source DB: ", bracket: "[]"); |
| 608 | - ColorConsole.WriteLine(SQLDataBaseManagerCore.GetServerDefaultPhysicalDATFileLocation(sqld.SQLCS), ConsoleColor.Yellow,prefix: $" DEFAULT= sql server default location.",bracket:"[]"); | 853 | + ColorConsole.WriteLine(SQLDataBaseManagerCore.GetServerDefaultPhysicalDATFileLocation(sqld.SQLCS)??"???", ConsoleColor.Yellow,prefix: $" DEFAULT= sql server default location.",bracket:"[]"); |
| 609 | var targetdirectory = ColorConsole.ReadLine($"Enter the target path.EX=exit.", ConsoleColor.Yellow, suffix: " --> "); | 854 | var targetdirectory = ColorConsole.ReadLine($"Enter the target path.EX=exit.", ConsoleColor.Yellow, suffix: " --> "); |
| 610 | if (targetdirectory.ToUpper() == "EX") { continue; } | 855 | if (targetdirectory.ToUpper() == "EX") { continue; } |
| 611 | else if (targetdirectory == "DEFAULT") { targetdirectory = null; ; } | 856 | else if (targetdirectory == "DEFAULT") { targetdirectory = null; ; } |
| @@ -616,7 +861,7 @@ GO | @@ -616,7 +861,7 @@ GO | ||
| 616 | SQLDataBaseManagerCore.RelocatePhysicalFiles(sqld, targetdirectory, restoredbname); | 861 | SQLDataBaseManagerCore.RelocatePhysicalFiles(sqld, targetdirectory, restoredbname); |
| 617 | ColorConsole.WriteLine($"Database physical files relocated. Name:{sqld.DBName}", ConsoleColor.Green); | 862 | ColorConsole.WriteLine($"Database physical files relocated. Name:{sqld.DBName}", ConsoleColor.Green); |
| 618 | } | 863 | } |
| 619 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 864 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 620 | } | 865 | } |
| 621 | return o; | 866 | return o; |
| 622 | } | 867 | } |
| @@ -655,6 +900,7 @@ GO | @@ -655,6 +900,7 @@ GO | ||
| 655 | { | 900 | { |
| 656 | ColorConsole.Write(st.DBName, statuscolor, bracket: "[]", prefix: "Database ", suffix: ". "); | 901 | ColorConsole.Write(st.DBName, statuscolor, bracket: "[]", prefix: "Database ", suffix: ". "); |
| 657 | ColorConsole.Write(st.DataSource, statuscolor, bracket: "[]", prefix: "from server ", suffix: ". "); | 902 | ColorConsole.Write(st.DataSource, statuscolor, bracket: "[]", prefix: "from server ", suffix: ". "); |
| 903 | + if (st.Xml_IsRemoteDB) { ColorConsole.Write("REMOTE", ConsoleColor.Cyan, bracket: "[]", prefix: "", suffix: ""); } | ||
| 658 | } | 904 | } |
| 659 | ColorConsole.WriteLine(); | 905 | ColorConsole.WriteLine(); |
| 660 | return " "; | 906 | return " "; |
| @@ -709,8 +955,8 @@ GO | @@ -709,8 +955,8 @@ GO | ||
| 709 | { | 955 | { |
| 710 | try | 956 | try |
| 711 | { | 957 | { |
| 712 | - sqld.Status = GetStatus(sqld.SQLCS); | ||
| 713 | - sqld.PhysicalFilesDirectoryPath = (GetPhysicalFilesLocation(sqld.SQLCS))??""; | 958 | + sqld.PhysicalFilesDirectoryPath = (GetPhysicalFilesLocation(sqld.SQLCS)) ?? ""; |
| 959 | + sqld.Status = string.IsNullOrWhiteSpace(sqld.PhysicalFilesDirectoryPath)? SQLDBStatus.NoAccess: SQLDBStatus.OK; | ||
| 714 | sqld.DBName = GetDBName(sqld.SQLCS); | 960 | sqld.DBName = GetDBName(sqld.SQLCS); |
| 715 | sqld.DataSource = GetDataSource(sqld.SQLCS); | 961 | sqld.DataSource = GetDataSource(sqld.SQLCS); |
| 716 | sqld.SizeString = GetSize(sqld.SQLCS); | 962 | sqld.SizeString = GetSize(sqld.SQLCS); |
| @@ -734,61 +980,91 @@ GO | @@ -734,61 +980,91 @@ GO | ||
| 734 | RestoreBackup(sqld, dbbackupfilepath, targetdirectory, false, restoredbname); | 980 | RestoreBackup(sqld, dbbackupfilepath, targetdirectory, false, restoredbname); |
| 735 | if (File.Exists(dbbackupfilepath)) { File.Delete(dbbackupfilepath); } | 981 | if (File.Exists(dbbackupfilepath)) { File.Delete(dbbackupfilepath); } |
| 736 | } | 982 | } |
| 737 | - public static void RestoreBackup(SQLDataBase sqldb, string sourcesqlbackupfilepath, string targetdbphysicalfilesdirectorypath, bool restorefromZIP = false, string restoretodbname = null) | 983 | + /// <summary> |
| 984 | + /// Restores database backup (zipped or normal) | ||
| 985 | + /// </summary> | ||
| 986 | + /// <param name="sqldb"></param> | ||
| 987 | + /// <param name="sourcesqlbackupfilepath">source backup file</param> | ||
| 988 | + /// <param name="targetdbphysicalfilesdirectorypath"></param> | ||
| 989 | + /// <param name="restorefromZIP">true=sourcesqlbackupfilepath is a zip file</param> | ||
| 990 | + /// <param name="restoretodbname"></param> | ||
| 991 | + /// <param name="emulate"></param> | ||
| 992 | + public static void RestoreBackup(SQLDataBase sqldb, string sourcesqlbackupfilepath, string targetdbphysicalfilesdirectorypath, bool restorefromZIP = false, string restoretodbname = null,bool emulate=false) | ||
| 738 | { | 993 | { |
| 739 | - if (sqldb.Xml_IsRemoteDB) | ||
| 740 | - { | ||
| 741 | - ColorConsole.WriteLine(text: $" {nameof(RestoreBackup)}: data restore is not available for remote SQL Servers! DBname:'{sqldb.DBName}'.", prefix: $"WARNING!", f: ConsoleColor.Yellow); | ||
| 742 | - return; | ||
| 743 | - } | 994 | + string sqlcs = sqldb.SQLCS; //sqlcs = sqlcs.Replace("LearALM2", "master"); |
| 995 | + string zippedbackupfilepath = restorefromZIP? sourcesqlbackupfilepath:Path.Combine(Path.GetDirectoryName(sourcesqlbackupfilepath), Path.GetFileNameWithoutExtension(sourcesqlbackupfilepath) + ".zip"); | ||
| 996 | + string normalbackupfilepath = !restorefromZIP? sourcesqlbackupfilepath : Path.Combine(Path.GetDirectoryName(sourcesqlbackupfilepath), Path.GetFileNameWithoutExtension(sourcesqlbackupfilepath) + ".bak"); | ||
| 997 | + | ||
| 998 | + ColorConsole.WriteLine(nameof(RestoreBackup), ConsoleColor.Yellow, prefix: "running...."); | ||
| 999 | + ColorConsole.WriteLine(restoretodbname, ConsoleColor.Yellow, prefix: " restoretodbname:"); | ||
| 1000 | + ColorConsole.WriteLine(sqldb.SQLCS, ConsoleColor.Yellow, prefix: " sqldb.SQLCS:"); | ||
| 1001 | + ColorConsole.WriteLine(sourcesqlbackupfilepath, ConsoleColor.Yellow, prefix: " sourcesqlbackupfilepath:"); | ||
| 1002 | + ColorConsole.WriteLine(normalbackupfilepath, ConsoleColor.Yellow, prefix: " backupfilepath:"); | ||
| 1003 | + ColorConsole.WriteLine(restorefromZIP.ToString(), ConsoleColor.Yellow, prefix: " restorefromZIP:"); | ||
| 1004 | + ColorConsole.WriteLine(zippedbackupfilepath, ConsoleColor.Yellow, prefix: " zippedbackupfilepath:"); | ||
| 1005 | + ColorConsole.WriteLine(targetdbphysicalfilesdirectorypath, ConsoleColor.Yellow, prefix: " targetdbphysicalfilesdirectorypath:"); | ||
| 1006 | + if (emulate) { return; } | ||
| 744 | 1007 | ||
| 745 | - string sqlcs = sqldb.SQLCS; | ||
| 746 | - string backupfilepath; | ||
| 747 | if (restorefromZIP) | 1008 | if (restorefromZIP) |
| 748 | { | 1009 | { |
| 749 | - backupfilepath = Path.Combine(Path.GetDirectoryName(sourcesqlbackupfilepath), Path.GetFileNameWithoutExtension(sourcesqlbackupfilepath) + ".bak"); | ||
| 750 | - ZipTools.Extract1stFileFromZIP(backupfilepath, sourcesqlbackupfilepath); | 1010 | + if (!File.Exists(zippedbackupfilepath)) |
| 1011 | + { | ||
| 1012 | + ColorConsole.WriteLine($"ERROR! Restore source zipped backup file '{zippedbackupfilepath}' does not exist!", ConsoleColor.Red, prefix: ""); | ||
| 1013 | + return; | ||
| 1014 | + } | ||
| 1015 | + ZipTools.Extract1stFileFromZIP(normalbackupfilepath, zippedbackupfilepath); | ||
| 751 | var starttime = DateTime.Now; | 1016 | var starttime = DateTime.Now; |
| 752 | - while (DateTime.Now.Subtract(starttime).TotalSeconds > 5) { if (File.Exists(backupfilepath)) { break; } Thread.Sleep(500); } | ||
| 753 | - } | ||
| 754 | - else { backupfilepath = sourcesqlbackupfilepath; } | ||
| 755 | - var sqlserver = SQLServerConnect(sqlcs); | ||
| 756 | - | ||
| 757 | - var smoRestore = new Restore(); | ||
| 758 | - smoRestore.NoRecovery = false; | ||
| 759 | - smoRestore.ReplaceDatabase = true; | ||
| 760 | - smoRestore.Action = RestoreActionType.Database; | ||
| 761 | - smoRestore.PercentCompleteNotification = 5; | ||
| 762 | - var backupdevice = new BackupDeviceItem(backupfilepath, DeviceType.File); | ||
| 763 | - smoRestore.Devices.Add(backupdevice); | ||
| 764 | - smoRestore.Database = string.IsNullOrWhiteSpace(restoretodbname) | ||
| 765 | - ? smoRestore.ReadBackupHeader(sqlserver).Rows[0]["DatabaseName"].ToString() | ||
| 766 | - : restoretodbname; | ||
| 767 | - | ||
| 768 | - var dbfilelist = smoRestore.ReadFileList(sqlserver); | ||
| 769 | - var smorestoreDATfile = new RelocateFile(); | ||
| 770 | - string targetdbphysicalfilesdirectorypathDAT = targetdbphysicalfilesdirectorypath; | ||
| 771 | - if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathDAT)) { targetdbphysicalfilesdirectorypathDAT = sqlserver.DefaultFile; } | ||
| 772 | - if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathDAT)) { targetdbphysicalfilesdirectorypathDAT = sqlserver.MasterDBPath; } | ||
| 773 | - smorestoreDATfile.PhysicalFileName = Path.Combine(targetdbphysicalfilesdirectorypathDAT, smoRestore.Database + "_Data.mdf"); | ||
| 774 | - smorestoreDATfile.LogicalFileName = dbfilelist.Select("Type='D'")[0]["LogicalName"].ToString(); | ||
| 775 | - smoRestore.RelocateFiles.Add(smorestoreDATfile); | ||
| 776 | - | ||
| 777 | - var smorestoreLOGfile = new RelocateFile(); | ||
| 778 | - string targetdbphysicalfilesdirectorypathLOG = targetdbphysicalfilesdirectorypath; | ||
| 779 | - if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathLOG)) { targetdbphysicalfilesdirectorypathLOG = sqlserver.DefaultLog; } | ||
| 780 | - if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathLOG)) { targetdbphysicalfilesdirectorypathLOG = sqlserver.MasterDBLogPath; } | ||
| 781 | - smorestoreLOGfile.PhysicalFileName = Path.Combine(targetdbphysicalfilesdirectorypathLOG, smoRestore.Database + "_Log.ldf"); | ||
| 782 | - smorestoreLOGfile.LogicalFileName = dbfilelist.Select("Type='L'")[0]["LogicalName"].ToString(); | ||
| 783 | - smoRestore.RelocateFiles.Add(smorestoreLOGfile); | ||
| 784 | - | ||
| 785 | - sqlserver.KillAllProcesses(smoRestore.Database); | ||
| 786 | - | ||
| 787 | - smoRestore.SqlRestore(sqlserver); | ||
| 788 | - if (restorefromZIP) | 1017 | + while (DateTime.Now.Subtract(starttime).TotalSeconds > 5) { if (File.Exists(normalbackupfilepath)) { break; } Thread.Sleep(500); } |
| 1018 | + } | ||
| 1019 | + | ||
| 1020 | + if (!File.Exists(normalbackupfilepath)) | ||
| 1021 | + { | ||
| 1022 | + ColorConsole.WriteLine($"ERROR! Restore source backup file '{normalbackupfilepath}' does not exist!", ConsoleColor.Red, prefix: ""); | ||
| 1023 | + return; | ||
| 1024 | + } | ||
| 1025 | + Server sqlserver = null; | ||
| 1026 | + try | ||
| 789 | { | 1027 | { |
| 790 | - if (File.Exists(backupfilepath)) { File.Delete(backupfilepath); } | 1028 | + var sc = GetSqlConnection(sqlcs, "master"); |
| 1029 | + sqlserver = SQLServerConnect(sc);if (sqlserver == null) { return; } | ||
| 1030 | + | ||
| 1031 | + var smoRestore = new Restore(); | ||
| 1032 | + smoRestore.NoRecovery = false; | ||
| 1033 | + smoRestore.ReplaceDatabase = true; | ||
| 1034 | + smoRestore.Action = RestoreActionType.Database; | ||
| 1035 | + smoRestore.PercentComplete += SmoBackupRestore_PercentComplete; | ||
| 1036 | + smoRestore.PercentCompleteNotification = 1; | ||
| 1037 | + var backupdevice = new BackupDeviceItem(normalbackupfilepath, DeviceType.File); | ||
| 1038 | + smoRestore.Devices.Add(backupdevice); | ||
| 1039 | + smoRestore.Database = string.IsNullOrWhiteSpace(restoretodbname) | ||
| 1040 | + ? smoRestore.ReadBackupHeader(sqlserver).Rows[0]["DatabaseName"].ToString() | ||
| 1041 | + : restoretodbname; | ||
| 1042 | + | ||
| 1043 | + | ||
| 1044 | + var dbfilelist = smoRestore.ReadFileList(sqlserver); | ||
| 1045 | + var smorestoreDATfile = new RelocateFile(); | ||
| 1046 | + string targetdbphysicalfilesdirectorypathDAT = targetdbphysicalfilesdirectorypath; | ||
| 1047 | + if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathDAT)) { targetdbphysicalfilesdirectorypathDAT = sqlserver.DefaultFile; } | ||
| 1048 | + if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathDAT)) { targetdbphysicalfilesdirectorypathDAT = sqlserver.MasterDBPath; } | ||
| 1049 | + smorestoreDATfile.PhysicalFileName = Path.Combine(targetdbphysicalfilesdirectorypathDAT, smoRestore.Database + "_Data.mdf"); | ||
| 1050 | + smorestoreDATfile.LogicalFileName = dbfilelist.Select("Type='D'")[0]["LogicalName"].ToString(); | ||
| 1051 | + smoRestore.RelocateFiles.Add(smorestoreDATfile); | ||
| 1052 | + | ||
| 1053 | + var smorestoreLOGfile = new RelocateFile(); | ||
| 1054 | + string targetdbphysicalfilesdirectorypathLOG = targetdbphysicalfilesdirectorypath; | ||
| 1055 | + if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathLOG)) { targetdbphysicalfilesdirectorypathLOG = sqlserver.DefaultLog; } | ||
| 1056 | + if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathLOG)) { targetdbphysicalfilesdirectorypathLOG = sqlserver.MasterDBLogPath; } | ||
| 1057 | + smorestoreLOGfile.PhysicalFileName = Path.Combine(targetdbphysicalfilesdirectorypathLOG, smoRestore.Database + "_Log.ldf"); | ||
| 1058 | + smorestoreLOGfile.LogicalFileName = dbfilelist.Select("Type='L'")[0]["LogicalName"].ToString(); | ||
| 1059 | + smoRestore.RelocateFiles.Add(smorestoreLOGfile); | ||
| 1060 | + | ||
| 1061 | + GetExclusiveUse(smoRestore.Database, sqlserver, sc); | ||
| 1062 | + smoRestore.SqlRestore(sqlserver); | ||
| 1063 | + ColorConsole.WriteLine(); | ||
| 1064 | + ColorConsole.WriteLine("Restore completed", ConsoleColor.Green); | ||
| 1065 | + if (restorefromZIP && File.Exists(normalbackupfilepath)) { File.Delete(normalbackupfilepath); } | ||
| 791 | } | 1066 | } |
| 1067 | + finally { sqlserver?.ConnectionContext.SqlConnectionObject.Dispose(); } | ||
| 792 | } | 1068 | } |
| 793 | 1069 | ||
| 794 | /// <summary> | 1070 | /// <summary> |
| @@ -798,34 +1074,27 @@ GO | @@ -798,34 +1074,27 @@ GO | ||
| 798 | /// <param name="forcecreatezip"></param> | 1074 | /// <param name="forcecreatezip"></param> |
| 799 | /// <param name="timestamp"></param> | 1075 | /// <param name="timestamp"></param> |
| 800 | /// <returns></returns> | 1076 | /// <returns></returns> |
| 801 | - public static string CreateBackup(SQLDataBase sqld,bool? forcecreatezip, DateTime? timestamp) | 1077 | + public static string CreateBackup(SQLDataBase sqld,bool? forcecreatezip, DateTime? timestamp,bool emulate=false) |
| 802 | { | 1078 | { |
| 803 | string backupdirectorypath = sqld.Xml_BackupTargetDirectoryPath; | 1079 | string backupdirectorypath = sqld.Xml_BackupTargetDirectoryPath; |
| 804 | - string tranzitdirectorypathlocal = sqld.Xml_TranzitDirectoryPathLocal; | ||
| 805 | - string tranzitdirectorypathnetwork = sqld.Xml_TranzitDirectoryPathNetwork; | 1080 | + string tranzitdirectorypath = sqld.Xml_TranzitDirectoryPath; |
| 806 | bool usetranzit = sqld.Xml_IsRemoteDB; | 1081 | bool usetranzit = sqld.Xml_IsRemoteDB; |
| 807 | - string sqlconnectionstring = sqld.SQLCS; | ||
| 808 | string backupfilenamemask = sqld.Xml_BackupFileNameMask; | 1082 | string backupfilenamemask = sqld.Xml_BackupFileNameMask; |
| 809 | bool createzip = forcecreatezip ?? sqld.Xml_CreateZip; | 1083 | bool createzip = forcecreatezip ?? sqld.Xml_CreateZip; |
| 810 | //tranzitdirectorypathlocal = @"F:\ALM"; | 1084 | //tranzitdirectorypathlocal = @"F:\ALM"; |
| 811 | //tranzitdirectorypathnetwork = @"\\matng-sql01\ALM"; | 1085 | //tranzitdirectorypathnetwork = @"\\matng-sql01\ALM"; |
| 812 | - var sqlserver = SQLServerConnect(sqlconnectionstring); | ||
| 813 | - if (sqlserver == null) | ||
| 814 | - { | ||
| 815 | - ColorConsole.WriteLine($"ERROR! Database connection string error. '{sqlconnectionstring}'", ConsoleColor.Red); | ||
| 816 | - return null; | ||
| 817 | - } | ||
| 818 | - | 1086 | + |
| 819 | string returnfilename = null; | 1087 | string returnfilename = null; |
| 820 | - var dbname = GetDBName(sqlconnectionstring); | 1088 | + var dbname = GetDBName(sqld.SQLCS); |
| 1089 | + var datasource = GetDataSource(sqld.SQLCS); | ||
| 821 | 1090 | ||
| 822 | var backupts = (timestamp.HasValue ? timestamp.Value : DateTime.Now).ToString("yyyyMMddHHmmss"); | 1091 | var backupts = (timestamp.HasValue ? timestamp.Value : DateTime.Now).ToString("yyyyMMddHHmmss"); |
| 823 | 1092 | ||
| 824 | string backupfileNameOnly = Path.GetFileNameWithoutExtension(backupfilenamemask); | 1093 | string backupfileNameOnly = Path.GetFileNameWithoutExtension(backupfilenamemask); |
| 825 | var vars = new Dictionary<string, string>(); | 1094 | var vars = new Dictionary<string, string>(); |
| 826 | - vars.Add(nameof(DBSubstitutionName.DATABASE), GetDBName(sqlconnectionstring)); | 1095 | + vars.Add(nameof(DBSubstitutionName.DATABASE), dbname); |
| 827 | vars.Add(nameof(DBSubstitutionName.DBKEY), sqld.Xml_Key); | 1096 | vars.Add(nameof(DBSubstitutionName.DBKEY), sqld.Xml_Key); |
| 828 | - vars.Add(nameof(DBSubstitutionName.DATASOURCE), GetDataSource(sqlconnectionstring)); | 1097 | + vars.Add(nameof(DBSubstitutionName.DATASOURCE), datasource); |
| 829 | vars.Add(nameof(DBSubstitutionName.DBOTYPE), "DBBACKUP"); | 1098 | vars.Add(nameof(DBSubstitutionName.DBOTYPE), "DBBACKUP"); |
| 830 | vars.Add(nameof(DBSubstitutionName.DBONAME), ""); | 1099 | vars.Add(nameof(DBSubstitutionName.DBONAME), ""); |
| 831 | vars.Add(nameof(DBSubstitutionName.DBDATAGROUP), ""); | 1100 | vars.Add(nameof(DBSubstitutionName.DBDATAGROUP), ""); |
| @@ -835,70 +1104,90 @@ GO | @@ -835,70 +1104,90 @@ GO | ||
| 835 | 1104 | ||
| 836 | string backupfilename = backupfileNameOnly + ".bak"; | 1105 | string backupfilename = backupfileNameOnly + ".bak"; |
| 837 | string backupFullName = Path.Combine(backupdirectorypath, backupfilename); | 1106 | string backupFullName = Path.Combine(backupdirectorypath, backupfilename); |
| 838 | - string tranzitFullNameLocal= usetranzit ? Path.Combine(tranzitdirectorypathlocal, backupfilename) : null; | ||
| 839 | - string tranzitFullNameNetwork= usetranzit ? Path.Combine(tranzitdirectorypathnetwork, backupfilename) : null; | ||
| 840 | - if (File.Exists(backupFullName)) { File.Delete(backupFullName); } | ||
| 841 | - | ||
| 842 | - | ||
| 843 | - var smoBackup = new Backup(); | ||
| 844 | - smoBackup.Action = BackupActionType.Database; | ||
| 845 | - smoBackup.BackupSetName = sqlserver.ConnectionContext.DatabaseName + " Backup"; | ||
| 846 | - smoBackup.BackupSetDescription = $"Full Backup of {sqlserver.ConnectionContext.DatabaseName}"; | ||
| 847 | - smoBackup.MediaDescription = "Disk"; | 1107 | + string tranzitFullName = usetranzit ? Path.Combine(tranzitdirectorypath, backupfilename) : null; |
| 1108 | + | ||
| 1109 | + string ZIPbackupfilename = backupfileNameOnly + ".zip"; | ||
| 1110 | + string ZIPbackupFullName = Path.Combine(backupdirectorypath, ZIPbackupfilename); | ||
| 1111 | + returnfilename = createzip? ZIPbackupFullName : backupFullName; | ||
| 1112 | + | ||
| 1113 | + ColorConsole.WriteLine(nameof(CreateBackup), ConsoleColor.Yellow, prefix: "running...."); | ||
| 1114 | + ColorConsole.WriteLine(dbname, ConsoleColor.Yellow, prefix: " dbname:"); | ||
| 1115 | + ColorConsole.WriteLine(sqld.SQLCS, ConsoleColor.Yellow, prefix: " sqld.SQLCS:"); | ||
| 1116 | + ColorConsole.WriteLine(backupdirectorypath, ConsoleColor.Yellow, prefix: " backupdirectorypath:"); | ||
| 1117 | + ColorConsole.WriteLine(backupfilename, ConsoleColor.Yellow, prefix: " backupfilename:"); | ||
| 1118 | + ColorConsole.WriteLine(backupFullName, ConsoleColor.Yellow, prefix: " backupFullName:"); | ||
| 1119 | + ColorConsole.WriteLine(createzip.ToString(), ConsoleColor.Yellow, prefix: " createzip:"); | ||
| 1120 | + ColorConsole.WriteLine(ZIPbackupfilename, ConsoleColor.Yellow, prefix: " ZIPbackupfilename:"); | ||
| 1121 | + ColorConsole.WriteLine(ZIPbackupFullName, ConsoleColor.Yellow, prefix: " ZIPbackupFullName:"); | ||
| 1122 | + ColorConsole.WriteLine(usetranzit.ToString(), ConsoleColor.Yellow, prefix: " usetranzit:"); | ||
| 1123 | + ColorConsole.WriteLine(tranzitFullName, ConsoleColor.Yellow, prefix: " tranzitFullName:"); | ||
| 1124 | + ColorConsole.WriteLine(returnfilename, ConsoleColor.Yellow, prefix: " returnfilename:"); | ||
| 1125 | + | ||
| 1126 | + if (!emulate) | ||
| 1127 | + { | ||
| 1128 | + ColorConsole.WriteLine($"Database backup started...", ConsoleColor.DarkGreen); | ||
| 1129 | + if (File.Exists(backupFullName)) { File.Delete(backupFullName); } | ||
| 1130 | + var smoBackup = new Backup(); | ||
| 1131 | + smoBackup.Database = dbname; | ||
| 1132 | + smoBackup.Action = BackupActionType.Database; | ||
| 1133 | + smoBackup.BackupSetName = smoBackup.Database + " Backup"; | ||
| 1134 | + smoBackup.BackupSetDescription = $"Full Backup of {smoBackup.Database}"; | ||
| 1135 | + smoBackup.MediaDescription = "Disk"; | ||
| 848 | Console.WriteLine($"Backup set: {smoBackup.BackupSetName} ({smoBackup.BackupSetDescription}) to media: {smoBackup.MediaDescription}"); | 1136 | Console.WriteLine($"Backup set: {smoBackup.BackupSetName} ({smoBackup.BackupSetDescription}) to media: {smoBackup.MediaDescription}"); |
| 849 | - smoBackup.Database = sqlserver.ConnectionContext.DatabaseName; | ||
| 850 | string dummystring = usetranzit ? " REMOTE SQL SERVER!" : ""; | 1137 | string dummystring = usetranzit ? " REMOTE SQL SERVER!" : ""; |
| 851 | Console.WriteLine($"Database name: {smoBackup.Database}{dummystring}"); | 1138 | Console.WriteLine($"Database name: {smoBackup.Database}{dummystring}"); |
| 852 | Console.WriteLine($"Connection string: {sqld.SQLCS}"); | 1139 | Console.WriteLine($"Connection string: {sqld.SQLCS}"); |
| 853 | - smoBackup.Devices.AddDevice(usetranzit ? tranzitFullNameLocal : backupFullName, DeviceType.File); | 1140 | + smoBackup.Devices.AddDevice(usetranzit ? tranzitFullName : backupFullName, DeviceType.File); |
| 854 | Console.WriteLine($"Backup full name:{backupFullName}"); | 1141 | Console.WriteLine($"Backup full name:{backupFullName}"); |
| 855 | - if (usetranzit) | 1142 | + if (usetranzit) |
| 856 | { | 1143 | { |
| 857 | - Console.WriteLine($" ...will be created through tranzit: {tranzitFullNameNetwork}"); | 1144 | + Console.WriteLine($" ...will be created through tranzit: {tranzitFullName}"); |
| 1145 | + } | ||
| 1146 | + smoBackup.PercentComplete += SmoBackupRestore_PercentComplete; | ||
| 1147 | + smoBackup.PercentCompleteNotification = 1; | ||
| 1148 | + | ||
| 1149 | + Server sqlserver = null; | ||
| 1150 | + try | ||
| 1151 | + { | ||
| 1152 | + sqlserver = SQLServerConnect(sqld.SQLCS, "master"); if (sqlserver == null) { return null; } | ||
| 1153 | + smoBackup.SqlBackupAsync(sqlserver); | ||
| 1154 | + var startbackup = DateTime.Now; | ||
| 1155 | + smoBackup.Wait(); | ||
| 1156 | + Console.WriteLine($""); | ||
| 1157 | + Console.WriteLine($"Backup completed. Backup time: {(int)(DateTime.Now.Subtract(startbackup).TotalSeconds)}sec."); | ||
| 1158 | + } | ||
| 1159 | + finally { sqlserver?.ConnectionContext.SqlConnectionObject.Dispose(); } | ||
| 1160 | + if (usetranzit && File.Exists(tranzitFullName)) | ||
| 1161 | + { | ||
| 1162 | + File.Move(tranzitFullName, backupFullName); | ||
| 1163 | + Console.WriteLine($"Moving backup file..."); | ||
| 1164 | + Console.WriteLine($" ...from tranzit location: {tranzitFullName}"); | ||
| 1165 | + Console.WriteLine($" ...to backup location: {backupFullName}"); | ||
| 1166 | + } | ||
| 1167 | + if (!File.Exists(backupFullName)) | ||
| 1168 | + { | ||
| 1169 | + ColorConsole.WriteLine($"ERROR! Database backup failed. DB name:'{smoBackup.Database}'. BAK/ZIP file name:'{Path.GetFileName(returnfilename)}'", ConsoleColor.Red); | ||
| 1170 | + return null; | ||
| 858 | } | 1171 | } |
| 859 | - smoBackup.PercentComplete += SmoBackup_PercentComplete; | ||
| 860 | - smoBackup.PercentCompleteNotification = 1; | ||
| 861 | - smoBackup.SqlBackupAsync(sqlserver); | ||
| 862 | - var startbackup = DateTime.Now; | ||
| 863 | - smoBackup.Wait(); | ||
| 864 | - Console.WriteLine($""); | ||
| 865 | - Console.WriteLine($"Backup completed. Backup time: {(int)(DateTime.Now.Subtract(startbackup).TotalSeconds)}sec."); | ||
| 866 | - if (usetranzit && File.Exists(tranzitFullNameNetwork)) | ||
| 867 | - { | ||
| 868 | - File.Move(tranzitFullNameNetwork, backupFullName); | ||
| 869 | - Console.WriteLine($"Moving backup file..."); | ||
| 870 | - Console.WriteLine($" ...from tranzit location: {tranzitFullNameNetwork}"); | ||
| 871 | - Console.WriteLine($" ...to backup location: {backupFullName}"); | ||
| 872 | - } | ||
| 873 | - returnfilename = backupFullName; | ||
| 874 | - if (File.Exists(backupFullName)) | ||
| 875 | - { | ||
| 876 | if (createzip) | 1172 | if (createzip) |
| 877 | { | 1173 | { |
| 878 | var startcompressing = DateTime.Now; | 1174 | var startcompressing = DateTime.Now; |
| 879 | - string ZIPbackupfilename = backupfileNameOnly + ".zip"; | ||
| 880 | - string ZIPbackupFullName = Path.Combine(backupdirectorypath, ZIPbackupfilename); | ||
| 881 | if (File.Exists(ZIPbackupFullName)) { File.Delete(ZIPbackupFullName); } | 1175 | if (File.Exists(ZIPbackupFullName)) { File.Delete(ZIPbackupFullName); } |
| 882 | 1176 | ||
| 883 | ZipTools.CreateEntriesFromDirectoryContent(backupdirectorypath, ZIPbackupFullName, backupfilename, "", "", removearchivedfiles: false, storepathinzip: false); | 1177 | ZipTools.CreateEntriesFromDirectoryContent(backupdirectorypath, ZIPbackupFullName, backupfilename, "", "", removearchivedfiles: false, storepathinzip: false); |
| 884 | File.Delete(backupFullName); | 1178 | File.Delete(backupFullName); |
| 885 | Console.WriteLine($"Zipping completed. Compressing time: {(int)(DateTime.Now.Subtract(startcompressing).TotalSeconds)}sec."); | 1179 | Console.WriteLine($"Zipping completed. Compressing time: {(int)(DateTime.Now.Subtract(startcompressing).TotalSeconds)}sec."); |
| 886 | - returnfilename = ZIPbackupFullName; | ||
| 887 | } | 1180 | } |
| 888 | - ColorConsole.WriteLine($"SUCCESS! Database backup created. DB name:'{dbname}'. BAK/ZIP file name:'{Path.GetFileName(returnfilename)}'", ConsoleColor.DarkGreen); | ||
| 889 | - } | ||
| 890 | - else | ||
| 891 | - { | ||
| 892 | - ColorConsole.WriteLine($"ERROR! Database backup failed. DB name:'{dbname}'. BAK/ZIP file name:'{Path.GetFileName(returnfilename)}'", ConsoleColor.Red); | 1181 | + ColorConsole.WriteLine($"SUCCESS! Database backup created. DB name:'{smoBackup.Database}'. BAK/ZIP file name:'{Path.GetFileName(returnfilename)}'", ConsoleColor.DarkGreen); |
| 893 | } | 1182 | } |
| 894 | return returnfilename; | 1183 | return returnfilename; |
| 895 | } | 1184 | } |
| 896 | 1185 | ||
| 897 | - private static void SmoBackup_PercentComplete(object sender, PercentCompleteEventArgs e) | 1186 | + private static void SmoBackupRestore_PercentComplete(object sender, PercentCompleteEventArgs e) |
| 898 | { | 1187 | { |
| 899 | - Console.SetCursorPosition(0, Console.CursorTop); | ||
| 900 | - Console.Write($"Database backup completed: {e.Percent}%. {e.Message}"); | ||
| 901 | - } | 1188 | + ColorConsole.SetCursorPosition(0, Console.CursorTop); |
| 1189 | + ColorConsole.Write($"Completed: {e.Percent}%. {e.Message}"); | ||
| 1190 | + } | ||
| 902 | 1191 | ||
| 903 | #region private methods | 1192 | #region private methods |
| 904 | public static List<FileInfo> GetBackupFilePathList(SQLDataBase sqld) | 1193 | public static List<FileInfo> GetBackupFilePathList(SQLDataBase sqld) |
| @@ -926,16 +1215,21 @@ GO | @@ -926,16 +1215,21 @@ GO | ||
| 926 | /// <returns></returns> | 1215 | /// <returns></returns> |
| 927 | public static string ConfigureSaUser(string cs,string password, string newsapassword) | 1216 | public static string ConfigureSaUser(string cs,string password, string newsapassword) |
| 928 | { | 1217 | { |
| 929 | - var sqlserver = SQLServerConnect(cs); | ||
| 930 | - sqlserver.Settings.LoginMode= ServerLoginMode.Mixed; | ||
| 931 | - sqlserver.Logins["sa"].Enable(); | ||
| 932 | - sqlserver.Logins.ItemById(10).Enable(); | ||
| 933 | - sqlserver.Logins["sa"].ChangePassword(newsapassword); | ||
| 934 | - sqlserver.Alter(); | ||
| 935 | - sqlserver.Logins["a"].Refresh(); | ||
| 936 | - return SQLServerConnect(cs).ConnectionContext.ConnectionString; | 1218 | + Server sqlserver = null; |
| 1219 | + try | ||
| 1220 | + { | ||
| 1221 | + sqlserver = SQLServerConnect(cs); if (sqlserver == null) return null; | ||
| 1222 | + sqlserver.Settings.LoginMode = ServerLoginMode.Mixed; | ||
| 1223 | + sqlserver.Logins["sa"].Enable(); | ||
| 1224 | + sqlserver.Logins.ItemById(10).Enable(); | ||
| 1225 | + sqlserver.Logins["sa"].ChangePassword(newsapassword); | ||
| 1226 | + sqlserver.Alter(); | ||
| 1227 | + sqlserver.Logins["a"].Refresh(); | ||
| 1228 | + return sqlserver.ConnectionContext.ConnectionString; | ||
| 1229 | + } | ||
| 1230 | + finally { sqlserver?.ConnectionContext.SqlConnectionObject.Dispose(); } | ||
| 937 | } | 1231 | } |
| 938 | - public static void CreateUser(string sqldbconnectionString, string dbusername, string dbrolenamecommalist) | 1232 | + public static void CreateUser(string sqldbconnectionString, string dbusername, string dbrolenamecommalist,string loginname) |
| 939 | { | 1233 | { |
| 940 | using (SqlConnection connection = new SqlConnection(sqldbconnectionString)) | 1234 | using (SqlConnection connection = new SqlConnection(sqldbconnectionString)) |
| 941 | { | 1235 | { |
| @@ -944,7 +1238,37 @@ GO | @@ -944,7 +1238,37 @@ GO | ||
| 944 | //USE [LearALM2] | 1238 | //USE [LearALM2] |
| 945 | //DROP USER[datareader] | 1239 | //DROP USER[datareader] |
| 946 | 1240 | ||
| 947 | - string createUserQuery = "CREATE USER [" + dbusername + "] FOR LOGIN [" + dbusername + "];"; | 1241 | + //empty=DB user w/o login, *=DB user with login,w=WIndows user, other=server login name DB user is created for |
| 1242 | + bool? forlogin; | ||
| 1243 | + if (string.IsNullOrWhiteSpace(loginname)) { forlogin = false; loginname = null; } | ||
| 1244 | + else if (loginname.ToLower() == "w") { forlogin = null; loginname = null; } | ||
| 1245 | + else { forlogin = true; loginname = loginname == "*"?dbusername: loginname; } | ||
| 1246 | + | ||
| 1247 | + //Creating a database user based on a SQL Server login | ||
| 1248 | + // CREATE LOGIN AbolrousHazem WITH PASSWORD = '340$Uuxwp7Mcxo7Khy'; | ||
| 1249 | + // GO | ||
| 1250 | + // USE AdventureWorks2022 | ||
| 1251 | + // GO | ||
| 1252 | + // CREATE USER AbolrousHazem FOR LOGIN AbolrousHazem; | ||
| 1253 | + // GO | ||
| 1254 | + //Creating and using a user without a login | ||
| 1255 | + // USE AdventureWorks2022; | ||
| 1256 | + // CREATE USER CustomApp WITHOUT LOGIN; | ||
| 1257 | + // GRANT IMPERSONATE ON USER::CustomApp TO[adventure - works\tengiz0]; | ||
| 1258 | + // GO | ||
| 1259 | + // To use the CustomApp credentials, the user adventure-works\tengiz0 executes the following statement. | ||
| 1260 | + // EXECUTE AS USER = 'CustomApp' ; | ||
| 1261 | + //Creating a contained database user for a domain login for a login named Fritz in a domain named Contoso. | ||
| 1262 | + // USE AdventureWorks2022; | ||
| 1263 | + // GO | ||
| 1264 | + // CREATE USER [Contoso\Fritz]; | ||
| 1265 | + // GO | ||
| 1266 | + | ||
| 1267 | + string createUserQuery = "CREATE USER [" + dbusername + "]"; | ||
| 1268 | + if (forlogin.HasValue && forlogin.Value) {createUserQuery += " FOR LOGIN [" + loginname + "];"; } | ||
| 1269 | + else if (forlogin.HasValue && !forlogin.Value) { createUserQuery = " WITHOUT LOGIN;"; } | ||
| 1270 | + createUserQuery += ";"; | ||
| 1271 | + | ||
| 948 | using (SqlCommand createUserCommand = new SqlCommand(createUserQuery, connection)) { createUserCommand.ExecuteNonQuery(); } | 1272 | using (SqlCommand createUserCommand = new SqlCommand(createUserQuery, connection)) { createUserCommand.ExecuteNonQuery(); } |
| 949 | //--ALTER AUTHORIZATION ON SCHEMA::[aspnet_Membership_BasicAccess] TO[dbo] | 1273 | //--ALTER AUTHORIZATION ON SCHEMA::[aspnet_Membership_BasicAccess] TO[dbo] |
| 950 | //--ALTER AUTHORIZATION ON SCHEMA::[aspnet_Membership_FullAccess] TO[dbo] | 1274 | //--ALTER AUTHORIZATION ON SCHEMA::[aspnet_Membership_FullAccess] TO[dbo] |
| @@ -955,113 +1279,198 @@ GO | @@ -955,113 +1279,198 @@ GO | ||
| 955 | string grantPermissionsQuery = "EXEC sp_addrolemember N'"+ rolename + "', N'"+ dbusername + "'"; | 1279 | string grantPermissionsQuery = "EXEC sp_addrolemember N'"+ rolename + "', N'"+ dbusername + "'"; |
| 956 | using (SqlCommand grantPermissionsCommand = new SqlCommand(grantPermissionsQuery, connection)) { grantPermissionsCommand.ExecuteNonQuery(); } | 1280 | using (SqlCommand grantPermissionsCommand = new SqlCommand(grantPermissionsQuery, connection)) { grantPermissionsCommand.ExecuteNonQuery(); } |
| 957 | } | 1281 | } |
| 958 | - } | ||
| 959 | - } | ||
| 960 | - public static void CreateLogin(string sqldbconnectionString, string name, string password, string defaultDatabase, string[] roles) | ||
| 961 | - { | ||
| 962 | - var _server = SQLServerConnect(sqldbconnectionString); | ||
| 963 | - Login login = new Login(_server, name); | ||
| 964 | - login.LoginType = LoginType.SqlLogin; | ||
| 965 | - login.DefaultDatabase = defaultDatabase; | ||
| 966 | - | ||
| 967 | - login.PasswordExpirationEnabled = false; | ||
| 968 | - login.PasswordPolicyEnforced = false; | ||
| 969 | 1282 | ||
| 970 | - login.Create(password, LoginCreateOptions.None); | ||
| 971 | 1283 | ||
| 972 | - for (int i = 0; i < (roles==null?-1:roles.Length); i++) { login.AddToRole(roles[i]); } | 1284 | + //USE[LearALM2] |
| 1285 | + //ALTER AUTHORIZATION ON SCHEMA::[ALM] TO[dbo] | ||
| 1286 | + //ALTER AUTHORIZATION ON SCHEMA::[Andon] TO[dbo] | ||
| 1287 | + //ALTER AUTHORIZATION ON SCHEMA::[aspnet_Membership_BasicAccess] TO[dbo] | ||
| 1288 | + //ALTER AUTHORIZATION ON SCHEMA::[aspnet_Membership_FullAccess] TO[dbo] | ||
| 1289 | + //ALTER AUTHORIZATION ON SCHEMA::[aspnet_Membership_ReportingAccess] TO[dbo] | ||
| 1290 | + //ALTER AUTHORIZATION ON SCHEMA::[aspnet_Personalization_BasicAccess] TO[dbo] | ||
| 1291 | + //ALTER AUTHORIZATION ON SCHEMA::[aspnet_Personalization_FullAccess] TO[dbo] | ||
| 1292 | + //ALTER AUTHORIZATION ON SCHEMA::[aspnet_Personalization_ReportingAccess] TO[dbo] | ||
| 1293 | + //ALTER AUTHORIZATION ON SCHEMA::[aspnet_Profile_BasicAccess] TO[dbo] | ||
| 1294 | + //ALTER AUTHORIZATION ON SCHEMA::[aspnet_Profile_FullAccess] TO[dbo] | ||
| 1295 | + //ALTER AUTHORIZATION ON SCHEMA::[aspnet_Profile_ReportingAccess] TO[dbo] | ||
| 1296 | + //ALTER AUTHORIZATION ON SCHEMA::[aspnet_Roles_BasicAccess] TO[dbo] | ||
| 1297 | + //ALTER AUTHORIZATION ON SCHEMA::[aspnet_Roles_FullAccess] TO[dbo] | ||
| 1298 | + //ALTER AUTHORIZATION ON SCHEMA::[aspnet_Roles_ReportingAccess] TO[dbo] | ||
| 1299 | + //ALTER AUTHORIZATION ON SCHEMA::[aspnet_WebEvent_FullAccess] TO[dbo] | ||
| 1300 | + //ALTER AUTHORIZATION ON SCHEMA::[CP] TO[dbo] | ||
| 1301 | + //ALTER AUTHORIZATION ON SCHEMA::[db_accessadmin] TO[dbo] | ||
| 1302 | + //ALTER AUTHORIZATION ON SCHEMA::[db_backupoperator] TO[dbo] | ||
| 1303 | + //ALTER AUTHORIZATION ON SCHEMA::[db_datareader] TO[dbo] | ||
| 1304 | + //ALTER AUTHORIZATION ON SCHEMA::[db_datawriter] TO[dbo] | ||
| 1305 | + //ALTER AUTHORIZATION ON SCHEMA::[db_ddladmin] TO[dbo] | ||
| 1306 | + //ALTER AUTHORIZATION ON SCHEMA::[db_denydatareader] TO[dbo] | ||
| 1307 | + //ALTER AUTHORIZATION ON SCHEMA::[db_denydatawriter] TO[dbo] | ||
| 1308 | + //ALTER AUTHORIZATION ON SCHEMA::[db_owner] TO[dbo] | ||
| 1309 | + //ALTER AUTHORIZATION ON SCHEMA::[db_securityadmin] TO[dbo] | ||
| 1310 | + //ALTER AUTHORIZATION ON SCHEMA::[guest] TO[dbo] | ||
| 1311 | + //ALTER AUTHORIZATION ON SCHEMA::[i18n] TO[dbo] | ||
| 1312 | + //ALTER AUTHORIZATION ON SCHEMA::[IdTranslator] TO[dbo] | ||
| 1313 | + //ALTER AUTHORIZATION ON SCHEMA::[ImportLog] TO[dbo] | ||
| 1314 | + //ALTER AUTHORIZATION ON SCHEMA::[iScheduler] TO[dbo] | ||
| 1315 | + //ALTER AUTHORIZATION ON SCHEMA::[iSchedulerReports] TO[dbo] | ||
| 973 | 1316 | ||
| 974 | - login.Alter(); | ||
| 975 | - login.Enable(); | ||
| 976 | - login.Alter(); | 1317 | + } |
| 1318 | + } | ||
| 1319 | + public static void CreateLogin(string sqldbconnectionString, string name, string password, string defaultDatabase, LoginType logintype, string[] roles,string grantoruser=null,string grantoruserpsw=null) | ||
| 1320 | + { | ||
| 1321 | + Server sqlserver = null; | ||
| 1322 | + try | ||
| 1323 | + { | ||
| 1324 | + var sc = GetSqlConnection(sqldbconnectionString,null, grantoruser, grantoruserpsw); | ||
| 1325 | + sqlserver = SQLServerConnect(sc); if (sqlserver == null) return; | ||
| 1326 | + Login login = new Login(sqlserver, name); | ||
| 1327 | + login.LoginType = logintype; | ||
| 1328 | + login.DefaultDatabase = defaultDatabase; | ||
| 1329 | + | ||
| 1330 | + login.PasswordExpirationEnabled = false; | ||
| 1331 | + login.PasswordPolicyEnforced = false; | ||
| 1332 | + if (password == null) { login.Create(); } | ||
| 1333 | + else { login.Create(password, LoginCreateOptions.None); } | ||
| 1334 | + | ||
| 1335 | + for (int i = 0; i < (roles == null ? -1 : roles.Length); i++) { login.AddToRole(roles[i]); } | ||
| 1336 | + | ||
| 1337 | + login.Alter(); | ||
| 1338 | + login.Enable(); | ||
| 1339 | + login.Alter(); | ||
| 1340 | + } | ||
| 1341 | + finally { sqlserver?.ConnectionContext.SqlConnectionObject.Dispose(); } | ||
| 977 | } | 1342 | } |
| 978 | 1343 | ||
| 979 | public static void ConfigureWindowsUser(string cs, string sapassword, string databasename, string windowsfullusername,string windowsuserpassword,List<string> rolenamelist) | 1344 | public static void ConfigureWindowsUser(string cs, string sapassword, string databasename, string windowsfullusername,string windowsuserpassword,List<string> rolenamelist) |
| 980 | { | 1345 | { |
| 981 | - var sqlserver = SQLServerConnect(cs); | ||
| 982 | - if (!sqlserver.Logins.Contains(windowsfullusername)) | 1346 | + Server sqlserver = null; |
| 1347 | + try | ||
| 983 | { | 1348 | { |
| 984 | - var wul = new Microsoft.SqlServer.Management.Smo.Login(sqlserver, windowsfullusername); | ||
| 985 | - wul.LoginType = LoginType.WindowsUser; | ||
| 986 | - wul.Create(windowsuserpassword,LoginCreateOptions.None); | ||
| 987 | - if (!string.IsNullOrWhiteSpace(databasename)) | 1349 | + sqlserver = SQLServerConnect(cs); if (sqlserver == null) return; |
| 1350 | + if (!sqlserver.Logins.Contains(windowsfullusername)) | ||
| 988 | { | 1351 | { |
| 989 | - var dbobject = sqlserver.Databases[databasename]; | ||
| 990 | - if (dbobject==null) { throw new Exception($"Specified databas '{databasename}' does not exist!"); } | ||
| 991 | - if (dbobject.Users.Contains(windowsfullusername)) { dbobject.Users[windowsfullusername].Drop(); } | ||
| 992 | - var dbuser = new Microsoft.SqlServer.Management.Smo.User(dbobject, windowsfullusername); | ||
| 993 | - dbuser.Login = windowsfullusername; | ||
| 994 | - dbuser.Create(windowsuserpassword); | ||
| 995 | - foreach (var rn in rolenamelist) | ||
| 996 | - { | ||
| 997 | - var dbrole = dbobject.Roles[rn]; | ||
| 998 | - dbrole.AddMember(windowsfullusername); | ||
| 999 | - dbrole.Alter(); | 1352 | + var wul = new Microsoft.SqlServer.Management.Smo.Login(sqlserver, windowsfullusername); |
| 1353 | + wul.LoginType = LoginType.WindowsUser; | ||
| 1354 | + wul.Create(windowsuserpassword, LoginCreateOptions.None); | ||
| 1355 | + if (!string.IsNullOrWhiteSpace(databasename)) | ||
| 1356 | + { | ||
| 1357 | + var dbobject = sqlserver.Databases[databasename]; | ||
| 1358 | + if (dbobject == null) { throw new Exception($"Specified databas '{databasename}' does not exist!"); } | ||
| 1359 | + if (dbobject.Users.Contains(windowsfullusername)) { dbobject.Users[windowsfullusername].Drop(); } | ||
| 1360 | + var dbuser = new Microsoft.SqlServer.Management.Smo.User(dbobject, windowsfullusername); | ||
| 1361 | + dbuser.Login = windowsfullusername; | ||
| 1362 | + dbuser.Create(windowsuserpassword); | ||
| 1363 | + foreach (var rn in rolenamelist) | ||
| 1364 | + { | ||
| 1365 | + var dbrole = dbobject.Roles[rn]; | ||
| 1366 | + dbrole.AddMember(windowsfullusername); | ||
| 1367 | + dbrole.Alter(); | ||
| 1368 | + } | ||
| 1000 | } | 1369 | } |
| 1001 | } | 1370 | } |
| 1002 | } | 1371 | } |
| 1372 | + finally { sqlserver?.ConnectionContext.SqlConnectionObject.Dispose(); } | ||
| 1003 | } | 1373 | } |
| 1004 | - public static void DropDatabase(string cs,string databasename,string sapassword) | 1374 | + public static bool DropDatabase(string cs,string databasename,string userid, string password) |
| 1005 | { | 1375 | { |
| 1006 | - var sqlserver = SQLServerConnect(cs); | ||
| 1007 | - if (sqlserver.Databases.Contains(databasename)) | 1376 | + Server sqlserver = null; |
| 1377 | + try | ||
| 1008 | { | 1378 | { |
| 1009 | - sqlserver.KillAllProcesses(databasename); | ||
| 1010 | - sqlserver.Databases[databasename].Drop(); | 1379 | + var sc = GetSqlConnection(cs, dbname:databasename, userid: userid, userpassword: password); |
| 1380 | + sqlserver = SQLServerConnect(sc); if (sqlserver == null) return false; | ||
| 1381 | + if (sqlserver.Databases.Contains(databasename)) | ||
| 1382 | + { | ||
| 1383 | + GetExclusiveUse(databasename, sqlserver, sc); | ||
| 1384 | + sqlserver.Databases[databasename].Drop(); | ||
| 1385 | + return true; | ||
| 1386 | + } | ||
| 1387 | + else { throw new ApplicationException($"Specified DB '{databasename}' does not exist!"); } | ||
| 1011 | } | 1388 | } |
| 1012 | - else { throw new Exception($"Specified databas '{databasename}' does not exist!"); } | 1389 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); return false; } |
| 1390 | + finally { sqlserver?.ConnectionContext.SqlConnectionObject.Dispose(); } | ||
| 1391 | + } | ||
| 1392 | + public static void GetExclusiveUse(string databasename,Server sqlserver,SqlConnection sc) | ||
| 1393 | + { | ||
| 1394 | + try { sqlserver.KillAllProcesses(databasename); } | ||
| 1395 | + catch (Exception ex) { ColorConsole.WriteLine($"{nameof(GetExclusiveUse)}/{nameof(Server.KillAllProcesses)}>>>:" + ex.MessageNested(), ConsoleColor.Red); } | ||
| 1396 | + | ||
| 1397 | + SqlCommand sqlcommand = null; | ||
| 1398 | + try { sqlcommand = new SqlCommand($"ALTER DATABASE {databasename} SET Single_User WITH Rollback IMMEDIATE", sc); sqlcommand.ExecuteNonQuery(); } | ||
| 1399 | + catch (Exception ex) { ColorConsole.WriteLine($"{nameof(GetExclusiveUse)}/{nameof(SqlCommand.ExecuteNonQuery)}>>>: " + ex.MessageNested(), ConsoleColor.Red); } | ||
| 1400 | + finally { sqlcommand?.Dispose(); } | ||
| 1013 | } | 1401 | } |
| 1402 | + | ||
| 1014 | public static string GetServerDefaultPhysicalDATFileLocation(string cs) | 1403 | public static string GetServerDefaultPhysicalDATFileLocation(string cs) |
| 1015 | { | 1404 | { |
| 1016 | - var sqlserver = SQLDataBaseManagerCore.SQLServerConnect(cs); | ||
| 1017 | - return string.IsNullOrEmpty(sqlserver.DefaultFile) ? sqlserver.MasterDBPath : sqlserver.DefaultFile; | 1405 | + Server sqlserver = null; |
| 1406 | + try | ||
| 1407 | + { | ||
| 1408 | + sqlserver = SQLServerConnect(cs); if (sqlserver == null) return null; | ||
| 1409 | + return string.IsNullOrEmpty(sqlserver.DefaultFile) ? sqlserver.MasterDBPath : sqlserver.DefaultFile; | ||
| 1410 | + } | ||
| 1411 | + finally { sqlserver?.ConnectionContext.SqlConnectionObject.Dispose(); } | ||
| 1018 | } | 1412 | } |
| 1019 | public static string GetServerDefaultPhysicalLOGFileLocation(string cs) | 1413 | public static string GetServerDefaultPhysicalLOGFileLocation(string cs) |
| 1020 | { | 1414 | { |
| 1021 | - var sqlserver = SQLDataBaseManagerCore.SQLServerConnect(cs); | ||
| 1022 | - return string.IsNullOrEmpty(sqlserver.DefaultLog) ? sqlserver.MasterDBLogPath : sqlserver.DefaultLog; | 1415 | + Server sqlserver = null; |
| 1416 | + try | ||
| 1417 | + { | ||
| 1418 | + sqlserver = SQLServerConnect(cs);if (sqlserver == null) return null; | ||
| 1419 | + return string.IsNullOrEmpty(sqlserver.DefaultLog) ? sqlserver.MasterDBLogPath : sqlserver.DefaultLog; | ||
| 1420 | + } | ||
| 1421 | + finally { sqlserver?.ConnectionContext.SqlConnectionObject.Dispose(); } | ||
| 1023 | } | 1422 | } |
| 1024 | public static string GetDBName(string cs) | 1423 | public static string GetDBName(string cs) |
| 1025 | { | 1424 | { |
| 1026 | - var sqlc = new Microsoft.Data.SqlClient.SqlConnection(cs); | ||
| 1027 | - return sqlc.Database; | 1425 | + var sqlcb = new SqlConnectionStringBuilder(cs); |
| 1426 | + return sqlcb.InitialCatalog; | ||
| 1028 | } | 1427 | } |
| 1029 | public static string GetDataSource(string cs) | 1428 | public static string GetDataSource(string cs) |
| 1030 | { | 1429 | { |
| 1031 | - var sqlc = new Microsoft.Data.SqlClient.SqlConnection(cs); | ||
| 1032 | - return sqlc.DataSource; | 1430 | + var sqlcb = new SqlConnectionStringBuilder(cs); |
| 1431 | + return sqlcb.DataSource; | ||
| 1033 | } | 1432 | } |
| 1034 | public enum SQLDBStatus { NoAccess, OK, } | 1433 | public enum SQLDBStatus { NoAccess, OK, } |
| 1035 | - public static SQLDBStatus GetStatus(string cs) | 1434 | + public static SqlConnection GetSqlConnection(string sqlconnectionstring, string dbname = null, string userid = null, string userpassword = null) |
| 1036 | { | 1435 | { |
| 1037 | - try | ||
| 1038 | - { | ||
| 1039 | - var s = GetPhysicalFilesLocation(cs); | ||
| 1040 | - if (s == null) { throw new Exception(); }; | ||
| 1041 | - return SQLDBStatus.OK; | ||
| 1042 | - } | ||
| 1043 | - catch { return SQLDBStatus.NoAccess; } | 1436 | + var scb = new SqlConnectionStringBuilder(sqlconnectionstring); |
| 1437 | + if (!string.IsNullOrWhiteSpace(dbname)) { scb.InitialCatalog = dbname; } | ||
| 1438 | + if (!string.IsNullOrWhiteSpace(userid) && !string.IsNullOrWhiteSpace(userpassword)) { scb.UserID = userid; scb.Password = userpassword; } | ||
| 1439 | + else if (!string.IsNullOrWhiteSpace(userid) && string.IsNullOrWhiteSpace(userpassword)) { scb.UserID= userid; scb.IntegratedSecurity= true; } | ||
| 1440 | + return new SqlConnection(scb.ToString()); | ||
| 1044 | } | 1441 | } |
| 1045 | - public static Server SQLServerConnect(string sqlconnectionstring) | 1442 | + public static Server SQLServerConnect(string sqlconnectionstring,string dbname=null) |
| 1046 | { | 1443 | { |
| 1444 | + return SQLServerConnect(GetSqlConnection(sqlconnectionstring, dbname)); | ||
| 1445 | + } | ||
| 1446 | + public static Server SQLServerConnect(SqlConnection sqlconnection) | ||
| 1447 | + { | ||
| 1448 | + if (sqlconnection == null) return null; | ||
| 1047 | try | 1449 | try |
| 1048 | { | 1450 | { |
| 1049 | - var sqlconnection = new Microsoft.Data.SqlClient.SqlConnection(sqlconnectionstring); | 1451 | + ColorConsole.WriteLine($"{nameof(SQLServerConnect)}. Connecting to: '{sqlconnection.ConnectionString}'", ConsoleColor.Yellow); |
| 1050 | var serverconnection = new ServerConnection(sqlconnection); | 1452 | var serverconnection = new ServerConnection(sqlconnection); |
| 1051 | var sqlserver = new Server(serverconnection); | 1453 | var sqlserver = new Server(serverconnection); |
| 1052 | - if (string.IsNullOrEmpty(sqlserver.Information.Version.ToString())) { throw new Exception("Connection not established!"); } | 1454 | + ColorConsole.WriteLine($"{nameof(SQLServerConnect)}. Connected. Server version:v{sqlserver.Information.Version}", ConsoleColor.Yellow); |
| 1053 | return sqlserver; | 1455 | return sqlserver; |
| 1054 | } | 1456 | } |
| 1055 | - catch (Exception ex) { throw ex; } | 1457 | + catch (Exception ex) |
| 1458 | + { | ||
| 1459 | + ColorConsole.WriteLine($"{nameof(SQLServerConnect)}. ERROR! Connecting to: '{sqlconnection.ConnectionString}'", ConsoleColor.Red); | ||
| 1460 | + ColorConsole.WriteLine(ex.MessageNested()); | ||
| 1461 | + throw ex; | ||
| 1462 | + } | ||
| 1056 | } | 1463 | } |
| 1057 | 1464 | ||
| 1058 | public static void ShrinkDB(string sqlconnectionstring, ShrinkMethod shrinkmethod,int freespacepercent) | 1465 | public static void ShrinkDB(string sqlconnectionstring, ShrinkMethod shrinkmethod,int freespacepercent) |
| 1059 | { | 1466 | { |
| 1060 | - var sqlc = new Microsoft.Data.SqlClient.SqlConnection(sqlconnectionstring); | ||
| 1061 | - var sc = new ServerConnection(sqlc); | ||
| 1062 | - var srvr = new Server(sc); | ||
| 1063 | - var db = new Database(srvr, GetDBName(sqlconnectionstring)); | ||
| 1064 | - db.Shrink(freespacepercent, shrinkmethod); | 1467 | + using (var sqlc = new SqlConnection(sqlconnectionstring)) |
| 1468 | + { | ||
| 1469 | + var sc = new ServerConnection(sqlc); | ||
| 1470 | + var srvr = new Server(sc); | ||
| 1471 | + var db = new Database(srvr, GetDBName(sqlconnectionstring)); | ||
| 1472 | + db.Shrink(freespacepercent, shrinkmethod); | ||
| 1473 | + } | ||
| 1065 | } | 1474 | } |
| 1066 | 1475 | ||
| 1067 | #region GetSize | 1476 | #region GetSize |
| @@ -1074,25 +1483,26 @@ GO | @@ -1074,25 +1483,26 @@ GO | ||
| 1074 | { | 1483 | { |
| 1075 | try | 1484 | try |
| 1076 | { | 1485 | { |
| 1077 | - var sqlc = new Microsoft.Data.SqlClient.SqlConnection(sqlconnectionstring); | ||
| 1078 | - var dbname = GetDBName(sqlconnectionstring); | 1486 | + using (var sqlc = new Microsoft.Data.SqlClient.SqlConnection(sqlconnectionstring)) |
| 1487 | + { | ||
| 1488 | + var dbname = GetDBName(sqlconnectionstring); | ||
| 1079 | 1489 | ||
| 1080 | - var getsizecmd = new Microsoft.Data.SqlClient.SqlCommand("sp_spaceused", sqlc); | ||
| 1081 | - getsizecmd.CommandType = System.Data.CommandType.StoredProcedure; | ||
| 1082 | - sqlc.Open(); | ||
| 1083 | - var reader = getsizecmd.ExecuteReader(); | 1490 | + var getsizecmd = new Microsoft.Data.SqlClient.SqlCommand("sp_spaceused", sqlc); |
| 1491 | + getsizecmd.CommandType = System.Data.CommandType.StoredProcedure; | ||
| 1492 | + sqlc.Open(); | ||
| 1493 | + var reader = getsizecmd.ExecuteReader(); | ||
| 1084 | 1494 | ||
| 1085 | - if (reader.HasRows) | ||
| 1086 | - { | ||
| 1087 | - while (reader.Read()) | 1495 | + if (reader.HasRows) |
| 1088 | { | 1496 | { |
| 1089 | - var dbn = reader["database_name"]; | ||
| 1090 | - var dbs = reader["database_size"]; | ||
| 1091 | - if (Convert.ToString(dbn) == dbname) { return Convert.ToString(dbs); }; | 1497 | + while (reader.Read()) |
| 1498 | + { | ||
| 1499 | + var dbn = reader["database_name"]; | ||
| 1500 | + var dbs = reader["database_size"]; | ||
| 1501 | + if (Convert.ToString(dbn) == dbname) { return Convert.ToString(dbs); }; | ||
| 1502 | + } | ||
| 1092 | } | 1503 | } |
| 1504 | + sqlc.Close(); | ||
| 1093 | } | 1505 | } |
| 1094 | - sqlc.Close(); | ||
| 1095 | - sqlc.Dispose(); | ||
| 1096 | return "N/A"; | 1506 | return "N/A"; |
| 1097 | } | 1507 | } |
| 1098 | catch { return "ERR"; } | 1508 | catch { return "ERR"; } |
| @@ -1152,46 +1562,47 @@ GO | @@ -1152,46 +1562,47 @@ GO | ||
| 1152 | /// </returns> | 1562 | /// </returns> |
| 1153 | public static ReturnInfoJSON ExecuteSQLScript(string sqlconnectionstring, string sqltxt, int commandtimeout, Dictionary<string, string> vars) | 1563 | public static ReturnInfoJSON ExecuteSQLScript(string sqlconnectionstring, string sqltxt, int commandtimeout, Dictionary<string, string> vars) |
| 1154 | { | 1564 | { |
| 1155 | - var sqlc = new Microsoft.Data.SqlClient.SqlConnection(sqlconnectionstring); | ||
| 1156 | - | ||
| 1157 | - sqltxt = VRH.Common.StringConstructor.ResolveConstructorR(vars, sqltxt, "{}@@"); | ||
| 1158 | - | ||
| 1159 | - sqlc.Open(); | ||
| 1160 | - string SQLBatchTxt = ""; // ebben lesznek az sql script-en belüli batch-ek összerakva | ||
| 1161 | - int SQLBatchIndex = 0; // az aktuális batch indexe | ||
| 1162 | - int scriptlineindex = 0; // az aktuális script sor indexe | ||
| 1163 | - System.Data.DataSet DataSet = null; // ebben lesz az eredmény (az utolsó batch eredménye) | ||
| 1164 | - sqltxt += "\r\nGO";// ha esetleg nem lenne, odatesszük a végére az utolsó batch-et lezáró GO-t | ||
| 1165 | - foreach (var scriptline in sqltxt.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries)) | 1565 | + using (var sqlc = new Microsoft.Data.SqlClient.SqlConnection(sqlconnectionstring)) |
| 1166 | { | 1566 | { |
| 1167 | - scriptlineindex += 1; | ||
| 1168 | - if (Regex.Match(scriptline, @"^GO$").Success)// a batch utolső sora | 1567 | + sqltxt = VRH.Common.StringConstructor.ResolveConstructorR(vars, sqltxt, "{}@@"); |
| 1568 | + | ||
| 1569 | + sqlc.Open(); | ||
| 1570 | + string SQLBatchTxt = ""; // ebben lesznek az sql script-en belüli batch-ek összerakva | ||
| 1571 | + int SQLBatchIndex = 0; // az aktuális batch indexe | ||
| 1572 | + int scriptlineindex = 0; // az aktuális script sor indexe | ||
| 1573 | + System.Data.DataSet DataSet = null; // ebben lesz az eredmény (az utolsó batch eredménye) | ||
| 1574 | + sqltxt += "\r\nGO";// ha esetleg nem lenne, odatesszük a végére az utolsó batch-et lezáró GO-t | ||
| 1575 | + foreach (var scriptline in sqltxt.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries)) | ||
| 1169 | { | 1576 | { |
| 1170 | - if (!string.IsNullOrWhiteSpace(SQLBatchTxt)) | 1577 | + scriptlineindex += 1; |
| 1578 | + if (Regex.Match(scriptline, @"^GO$").Success)// a batch utolső sora | ||
| 1171 | { | 1579 | { |
| 1172 | - SQLBatchIndex += 1; | ||
| 1173 | - DataSet = ExecuteSQLScriptBatch(sqlc, SQLBatchTxt, commandtimeout); | ||
| 1174 | - SQLBatchTxt = ""; | 1580 | + if (!string.IsNullOrWhiteSpace(SQLBatchTxt)) |
| 1581 | + { | ||
| 1582 | + SQLBatchIndex += 1; | ||
| 1583 | + DataSet = ExecuteSQLScriptBatch(sqlc, SQLBatchTxt, commandtimeout); | ||
| 1584 | + SQLBatchTxt = ""; | ||
| 1585 | + } | ||
| 1586 | + } | ||
| 1587 | + else if (!string.IsNullOrWhiteSpace(scriptline)) | ||
| 1588 | + { | ||
| 1589 | + SQLBatchTxt += scriptline + "\r\n"; | ||
| 1175 | } | 1590 | } |
| 1176 | } | 1591 | } |
| 1177 | - else if (!string.IsNullOrWhiteSpace(scriptline)) | 1592 | + |
| 1593 | + sqlc.Close(); | ||
| 1594 | + try | ||
| 1178 | { | 1595 | { |
| 1179 | - SQLBatchTxt += scriptline + "\r\n"; | 1596 | + var firstreturnedtable = DataSet.Tables[0]; |
| 1597 | + var firstreturnedrow = firstreturnedtable.Rows[0]; | ||
| 1598 | + var firstreturnedvalue = firstreturnedrow[0]; | ||
| 1599 | + var secondreturnedvalue = firstreturnedrow[1]; | ||
| 1600 | + var rv = Convert.ToInt32(firstreturnedvalue); | ||
| 1601 | + var rm = Convert.ToString(secondreturnedvalue); | ||
| 1602 | + return new ReturnInfoJSON() { ReturnValue = rv, ReturnMessage = rm, }; | ||
| 1180 | } | 1603 | } |
| 1604 | + catch { } | ||
| 1181 | } | 1605 | } |
| 1182 | - | ||
| 1183 | - sqlc.Close(); | ||
| 1184 | - try | ||
| 1185 | - { | ||
| 1186 | - var firstreturnedtable = DataSet.Tables[0]; | ||
| 1187 | - var firstreturnedrow = firstreturnedtable.Rows[0]; | ||
| 1188 | - var firstreturnedvalue = firstreturnedrow[0]; | ||
| 1189 | - var secondreturnedvalue = firstreturnedrow[1]; | ||
| 1190 | - var rv = Convert.ToInt32(firstreturnedvalue); | ||
| 1191 | - var rm = Convert.ToString(secondreturnedvalue); | ||
| 1192 | - return new ReturnInfoJSON() { ReturnValue = rv, ReturnMessage = rm, }; | ||
| 1193 | - } | ||
| 1194 | - catch { } | ||
| 1195 | return new ReturnInfoJSON() { ReturnValue = 0, ReturnMessage = null, }; | 1606 | return new ReturnInfoJSON() { ReturnValue = 0, ReturnMessage = null, }; |
| 1196 | } | 1607 | } |
| 1197 | 1608 | ||
| @@ -1252,38 +1663,40 @@ GO | @@ -1252,38 +1663,40 @@ GO | ||
| 1252 | 1663 | ||
| 1253 | public static List<SPparameter> ExecuteSQLStoredProcedure(string sqlconnectionstring, string storedprocedurename, int commandtimeout, List<SPparameter> SPparameters) | 1664 | public static List<SPparameter> ExecuteSQLStoredProcedure(string sqlconnectionstring, string storedprocedurename, int commandtimeout, List<SPparameter> SPparameters) |
| 1254 | { | 1665 | { |
| 1255 | - var sqlc = new Microsoft.Data.SqlClient.SqlConnection(sqlconnectionstring); | ||
| 1256 | - var sqlcommand = sqlc.CreateCommand(); | ||
| 1257 | - sqlcommand.Connection = sqlc; | ||
| 1258 | - sqlcommand.CommandText = storedprocedurename; | ||
| 1259 | - sqlcommand.CommandTimeout = commandtimeout; | ||
| 1260 | - sqlcommand.CommandType= System.Data.CommandType.StoredProcedure; | ||
| 1261 | - //var DataAdapter = new Microsoft.Data.SqlClient.SqlDataAdapter(sqlcommand); | ||
| 1262 | - sqlc.Open(); | ||
| 1263 | - foreach (var p in SPparameters) | ||
| 1264 | - { | ||
| 1265 | - var sqlparameter = new Microsoft.Data.SqlClient.SqlParameter() | ||
| 1266 | - { | ||
| 1267 | - ParameterName = p.Name, | ||
| 1268 | - SqlDbType = p.Type, | ||
| 1269 | - Size = p.Typepar, | ||
| 1270 | - Direction = p.Direction, | ||
| 1271 | - Value = p.Value, | ||
| 1272 | - }; | ||
| 1273 | - sqlcommand.Parameters.Add(sqlparameter); | ||
| 1274 | - } | ||
| 1275 | - sqlcommand.ExecuteNonQuery(); | 1666 | + using (var sqlc = new Microsoft.Data.SqlClient.SqlConnection(sqlconnectionstring)) |
| 1667 | + { | ||
| 1668 | + var sqlcommand = sqlc.CreateCommand(); | ||
| 1669 | + sqlcommand.Connection = sqlc; | ||
| 1670 | + sqlcommand.CommandText = storedprocedurename; | ||
| 1671 | + sqlcommand.CommandTimeout = commandtimeout; | ||
| 1672 | + sqlcommand.CommandType = System.Data.CommandType.StoredProcedure; | ||
| 1673 | + //var DataAdapter = new Microsoft.Data.SqlClient.SqlDataAdapter(sqlcommand); | ||
| 1674 | + sqlc.Open(); | ||
| 1675 | + foreach (var p in SPparameters) | ||
| 1676 | + { | ||
| 1677 | + var sqlparameter = new Microsoft.Data.SqlClient.SqlParameter() | ||
| 1678 | + { | ||
| 1679 | + ParameterName = p.Name, | ||
| 1680 | + SqlDbType = p.Type, | ||
| 1681 | + Size = p.Typepar, | ||
| 1682 | + Direction = p.Direction, | ||
| 1683 | + Value = p.Value, | ||
| 1684 | + }; | ||
| 1685 | + sqlcommand.Parameters.Add(sqlparameter); | ||
| 1686 | + } | ||
| 1687 | + sqlcommand.ExecuteNonQuery(); | ||
| 1276 | 1688 | ||
| 1277 | - var sqlresult = new List<SPparameter>(); | ||
| 1278 | - foreach (var p in SPparameters) | ||
| 1279 | - { | ||
| 1280 | - if (p.Direction == System.Data.ParameterDirection.Output) | 1689 | + var sqlresult = new List<SPparameter>(); |
| 1690 | + foreach (var p in SPparameters) | ||
| 1281 | { | 1691 | { |
| 1282 | - sqlresult.Add(new SPparameter(sqlcommand.Parameters[p.Name])); | 1692 | + if (p.Direction == System.Data.ParameterDirection.Output) |
| 1693 | + { | ||
| 1694 | + sqlresult.Add(new SPparameter(sqlcommand.Parameters[p.Name])); | ||
| 1695 | + } | ||
| 1283 | } | 1696 | } |
| 1697 | + sqlc.Close(); | ||
| 1698 | + return sqlresult; | ||
| 1284 | } | 1699 | } |
| 1285 | - sqlc.Close(); | ||
| 1286 | - return sqlresult; | ||
| 1287 | } | 1700 | } |
| 1288 | #endregion ExecuteSQLStoredProcedure | 1701 | #endregion ExecuteSQLStoredProcedure |
| 1289 | #region BackupSqlScripts | 1702 | #region BackupSqlScripts |
| @@ -1298,35 +1711,38 @@ GO | @@ -1298,35 +1711,38 @@ GO | ||
| 1298 | string backupfilenamemask = sqld.Xml_BackupFileNameMask; | 1711 | string backupfilenamemask = sqld.Xml_BackupFileNameMask; |
| 1299 | string sqlcs = sqld.SQLCS; | 1712 | string sqlcs = sqld.SQLCS; |
| 1300 | bool createZip = sqld.Xml_CreateZip; | 1713 | bool createZip = sqld.Xml_CreateZip; |
| 1301 | - var sqlserver = SQLServerConnect(sqlcs); | 1714 | + |
| 1302 | var dbname = GetDBName(sqlcs); | 1715 | var dbname = GetDBName(sqlcs); |
| 1303 | - if (sqlserver!=null) | 1716 | + string backupts = (timestamp.HasValue ? timestamp.Value : DateTime.Now).ToString("yyyyMMddHHmmss"); |
| 1717 | + var vars = new Dictionary<string, string>(); | ||
| 1718 | + vars.Add(nameof(DBSubstitutionName.DATABASE), GetDBName(sqlcs)); | ||
| 1719 | + vars.Add(nameof(DBSubstitutionName.DATASOURCE), GetDataSource(sqlcs)); | ||
| 1720 | + vars.Add(nameof(DBSubstitutionName.BACKUPTS), backupts); | ||
| 1721 | + vars.Add(nameof(DBSubstitutionName.DBOTYPE), "Scripts"); | ||
| 1722 | + | ||
| 1723 | + string zipfilefullpath = null; | ||
| 1724 | + string tempbackupdirectorypath; | ||
| 1725 | + if (createZip) | ||
| 1304 | { | 1726 | { |
| 1305 | - string backupts = (timestamp.HasValue? timestamp.Value:DateTime.Now).ToString("yyyyMMddHHmmss"); | ||
| 1306 | - var vars = new Dictionary<string, string>(); | ||
| 1307 | - vars.Add(nameof(DBSubstitutionName.DATABASE), GetDBName(sqlcs)); | ||
| 1308 | - vars.Add(nameof(DBSubstitutionName.DATASOURCE), GetDataSource(sqlcs)); | ||
| 1309 | - vars.Add(nameof(DBSubstitutionName.BACKUPTS), backupts); | ||
| 1310 | - vars.Add(nameof(DBSubstitutionName.DBOTYPE), "Scripts"); | ||
| 1311 | - | ||
| 1312 | - string zipfilefullpath = null; | ||
| 1313 | - string tempbackupdirectorypath; | ||
| 1314 | - if (createZip) | ||
| 1315 | - { | ||
| 1316 | - vars[nameof(DBSubstitutionName.DBONAME)] = ""; | ||
| 1317 | - vars[nameof(DBSubstitutionName.DBDATAGROUP)] = ""; | ||
| 1318 | - string zipfilename = VRH.Common.StringConstructor.ResolveConstructorR(vars, backupfilenamemask, "{}@@") + ".zip"; | ||
| 1319 | - zipfilefullpath = Path.Combine(backupdirectorypath, zipfilename); | ||
| 1320 | - tempbackupdirectorypath = Path.Combine(backupdirectorypath, Path.GetRandomFileName()); | ||
| 1321 | - if (Directory.Exists(tempbackupdirectorypath)) { Directory.Delete(tempbackupdirectorypath, recursive: true); } | ||
| 1322 | - if (!Directory.Exists(tempbackupdirectorypath)) { Directory.CreateDirectory(tempbackupdirectorypath); } | ||
| 1323 | - } | ||
| 1324 | - else { tempbackupdirectorypath = backupdirectorypath; } | 1727 | + vars[nameof(DBSubstitutionName.DBONAME)] = ""; |
| 1728 | + vars[nameof(DBSubstitutionName.DBDATAGROUP)] = ""; | ||
| 1729 | + string zipfilename = VRH.Common.StringConstructor.ResolveConstructorR(vars, backupfilenamemask, "{}@@") + ".zip"; | ||
| 1730 | + zipfilefullpath = Path.Combine(backupdirectorypath, zipfilename); | ||
| 1731 | + tempbackupdirectorypath = Path.Combine(backupdirectorypath, Path.GetRandomFileName()); | ||
| 1732 | + if (Directory.Exists(tempbackupdirectorypath)) { Directory.Delete(tempbackupdirectorypath, recursive: true); } | ||
| 1733 | + if (!Directory.Exists(tempbackupdirectorypath)) { Directory.CreateDirectory(tempbackupdirectorypath); } | ||
| 1734 | + } | ||
| 1735 | + else { tempbackupdirectorypath = backupdirectorypath; } | ||
| 1736 | + | ||
| 1737 | + if (!Directory.Exists(backupdirectorypath)) { Directory.CreateDirectory(backupdirectorypath); } | ||
| 1738 | + var directorynameonly = new DirectoryInfo(backupdirectorypath).Name; | ||
| 1739 | + var backupfilenameext = Path.GetExtension(backupfilenamemask); if (string.IsNullOrWhiteSpace(backupfilenameext)) { backupfilenameext = ".sql"; } | ||
| 1740 | + backupfilenamemask = Path.GetFileNameWithoutExtension(backupfilenamemask); | ||
| 1325 | 1741 | ||
| 1326 | - if (!Directory.Exists(backupdirectorypath)) { Directory.CreateDirectory(backupdirectorypath); } | ||
| 1327 | - var directorynameonly = new DirectoryInfo(backupdirectorypath).Name; | ||
| 1328 | - var backupfilenameext = Path.GetExtension(backupfilenamemask); if (string.IsNullOrWhiteSpace(backupfilenameext)) { backupfilenameext = ".sql"; } | ||
| 1329 | - backupfilenamemask = Path.GetFileNameWithoutExtension(backupfilenamemask); | 1742 | + Server sqlserver = null; |
| 1743 | + try | ||
| 1744 | + { | ||
| 1745 | + sqlserver = SQLServerConnect(sqlcs);if (sqlserver == null) { return; } | ||
| 1330 | var sqldatabase = sqlserver.Databases[sqlserver.ConnectionContext.DatabaseName]; | 1746 | var sqldatabase = sqlserver.Databases[sqlserver.ConnectionContext.DatabaseName]; |
| 1331 | 1747 | ||
| 1332 | ScriptOneObject(sqlserver, tempbackupdirectorypath, backupfilenamemask + backupfilenameext, new List<SqlSmoObject> { sqldatabase }, vars); | 1748 | ScriptOneObject(sqlserver, tempbackupdirectorypath, backupfilenamemask + backupfilenameext, new List<SqlSmoObject> { sqldatabase }, vars); |
| @@ -1335,11 +1751,11 @@ GO | @@ -1335,11 +1751,11 @@ GO | ||
| 1335 | ScriptOneObject(sqlserver, tempbackupdirectorypath, backupfilenamemask + backupfilenameext, sqldatabase.Views.Cast<SqlSmoObject>().ToList(), vars); | 1751 | ScriptOneObject(sqlserver, tempbackupdirectorypath, backupfilenamemask + backupfilenameext, sqldatabase.Views.Cast<SqlSmoObject>().ToList(), vars); |
| 1336 | ScriptOneObject(sqlserver, tempbackupdirectorypath, backupfilenamemask + backupfilenameext, sqldatabase.Tables.Cast<SqlSmoObject>().ToList(), vars); | 1752 | ScriptOneObject(sqlserver, tempbackupdirectorypath, backupfilenamemask + backupfilenameext, sqldatabase.Tables.Cast<SqlSmoObject>().ToList(), vars); |
| 1337 | ScriptOneObject(sqlserver, tempbackupdirectorypath, backupfilenamemask + backupfilenameext, sqldatabase.Triggers.Cast<SqlSmoObject>().ToList(), vars); | 1753 | ScriptOneObject(sqlserver, tempbackupdirectorypath, backupfilenamemask + backupfilenameext, sqldatabase.Triggers.Cast<SqlSmoObject>().ToList(), vars); |
| 1338 | - if (createZip) { ZipTools.CreateEntriesFromDirectoryContent(tempbackupdirectorypath, zipfilefullpath, "*.sql","", backupts,removearchivedfiles:true, storepathinzip: false); } | 1754 | + if (createZip) { ZipTools.CreateEntriesFromDirectoryContent(tempbackupdirectorypath, zipfilefullpath, "*.sql", "", backupts, removearchivedfiles: true, storepathinzip: false); } |
| 1339 | var resultfilename = zipfilefullpath == null ? "-" : Path.GetFileName(zipfilefullpath); | 1755 | var resultfilename = zipfilefullpath == null ? "-" : Path.GetFileName(zipfilefullpath); |
| 1340 | ColorConsole.WriteLine($"SQL scripts created. DB name:'{dbname}'. BAK/ZIP file name:'{resultfilename}'", ConsoleColor.DarkGreen); | 1756 | ColorConsole.WriteLine($"SQL scripts created. DB name:'{dbname}'. BAK/ZIP file name:'{resultfilename}'", ConsoleColor.DarkGreen); |
| 1341 | } | 1757 | } |
| 1342 | - else { ColorConsole.WriteLine($"SQL scripts create: error in db connection string. '{sqlcs}'", ConsoleColor.DarkGreen); } | 1758 | + finally { sqlserver?.ConnectionContext.SqlConnectionObject.Dispose(); } |
| 1343 | } | 1759 | } |
| 1344 | private static void ScriptOneObject(Server sqlserver,string backupdirectory,string backupfilenamemask,List<SqlSmoObject> sqldbobjects,Dictionary<string, string> vars) | 1760 | private static void ScriptOneObject(Server sqlserver,string backupdirectory,string backupfilenamemask,List<SqlSmoObject> sqldbobjects,Dictionary<string, string> vars) |
| 1345 | { | 1761 | { |
| @@ -1414,60 +1830,62 @@ GO | @@ -1414,60 +1830,62 @@ GO | ||
| 1414 | return; | 1830 | return; |
| 1415 | } | 1831 | } |
| 1416 | string sqlcs = sqld.SQLCS; | 1832 | string sqlcs = sqld.SQLCS; |
| 1417 | - var sqlserver = SQLServerConnect(sqlcs); | ||
| 1418 | var dbname = GetDBName(sqlcs); | 1833 | var dbname = GetDBName(sqlcs); |
| 1419 | - if (sqlserver != null) | ||
| 1420 | - { | ||
| 1421 | - string backupts = (timestamp.HasValue ? timestamp.Value : DateTime.Now).ToString("yyyyMMddHHmmss"); | ||
| 1422 | - bool createZip = sqld.Xml_CreateZip; | ||
| 1423 | - string backupdirectorypath = sqld.Xml_BackupTargetDirectoryPath; | ||
| 1424 | - string backupfilenamemask = sqld.Xml_BackupFileNameMask; | ||
| 1425 | 1834 | ||
| 1426 | - var backupfilenameext = Path.GetExtension(backupfilenamemask); if (string.IsNullOrWhiteSpace(backupfilenameext)) { backupfilenameext = ".sql"; } | ||
| 1427 | - backupfilenamemask = Path.GetFileNameWithoutExtension(backupfilenamemask); | 1835 | + string backupts = (timestamp.HasValue ? timestamp.Value : DateTime.Now).ToString("yyyyMMddHHmmss"); |
| 1836 | + bool createZip = sqld.Xml_CreateZip; | ||
| 1837 | + string backupdirectorypath = sqld.Xml_BackupTargetDirectoryPath; | ||
| 1838 | + string backupfilenamemask = sqld.Xml_BackupFileNameMask; | ||
| 1428 | 1839 | ||
| 1429 | - var vars = new Dictionary<string, string>(); | ||
| 1430 | - vars.Add(nameof(DBSubstitutionName.DATABASE), GetDBName(sqlcs)); | ||
| 1431 | - vars.Add(nameof(DBSubstitutionName.DATASOURCE), GetDataSource(sqlcs)); | ||
| 1432 | - vars.Add(nameof(DBSubstitutionName.BACKUPTS), backupts); | ||
| 1433 | - vars.Add(nameof(DBSubstitutionName.DBOTYPE), "TableData"); | ||
| 1434 | - | ||
| 1435 | - string zipfilefullpath=null; | ||
| 1436 | - string tempbackupdirectorypath; | ||
| 1437 | - if (createZip) | ||
| 1438 | - { | ||
| 1439 | - vars[nameof(DBSubstitutionName.DBONAME)] = ""; | ||
| 1440 | - vars[nameof(DBSubstitutionName.DBDATAGROUP)] = ""; | ||
| 1441 | - string zipfilename = VRH.Common.StringConstructor.ResolveConstructorR(vars, backupfilenamemask, "{}@@") + ".zip"; | ||
| 1442 | - tempbackupdirectorypath = Path.Combine(backupdirectorypath, Path.GetRandomFileName()); | ||
| 1443 | - zipfilefullpath = Path.Combine(backupdirectorypath, zipfilename); | ||
| 1444 | - if (Directory.Exists(tempbackupdirectorypath)) { Directory.Delete(tempbackupdirectorypath, recursive: true); } | ||
| 1445 | - if (!Directory.Exists(tempbackupdirectorypath)) { Directory.CreateDirectory(tempbackupdirectorypath); } | ||
| 1446 | - } | ||
| 1447 | - else { tempbackupdirectorypath = backupdirectorypath; } | 1840 | + var backupfilenameext = Path.GetExtension(backupfilenamemask); if (string.IsNullOrWhiteSpace(backupfilenameext)) { backupfilenameext = ".sql"; } |
| 1841 | + backupfilenamemask = Path.GetFileNameWithoutExtension(backupfilenamemask); | ||
| 1842 | + | ||
| 1843 | + var vars = new Dictionary<string, string>(); | ||
| 1844 | + vars.Add(nameof(DBSubstitutionName.DATABASE), GetDBName(sqlcs)); | ||
| 1845 | + vars.Add(nameof(DBSubstitutionName.DATASOURCE), GetDataSource(sqlcs)); | ||
| 1846 | + vars.Add(nameof(DBSubstitutionName.BACKUPTS), backupts); | ||
| 1847 | + vars.Add(nameof(DBSubstitutionName.DBOTYPE), "TableData"); | ||
| 1848 | + | ||
| 1849 | + string zipfilefullpath=null; | ||
| 1850 | + string tempbackupdirectorypath; | ||
| 1851 | + if (createZip) | ||
| 1852 | + { | ||
| 1853 | + vars[nameof(DBSubstitutionName.DBONAME)] = ""; | ||
| 1854 | + vars[nameof(DBSubstitutionName.DBDATAGROUP)] = ""; | ||
| 1855 | + string zipfilename = VRH.Common.StringConstructor.ResolveConstructorR(vars, backupfilenamemask, "{}@@") + ".zip"; | ||
| 1856 | + tempbackupdirectorypath = Path.Combine(backupdirectorypath, Path.GetRandomFileName()); | ||
| 1857 | + zipfilefullpath = Path.Combine(backupdirectorypath, zipfilename); | ||
| 1858 | + if (Directory.Exists(tempbackupdirectorypath)) { Directory.Delete(tempbackupdirectorypath, recursive: true); } | ||
| 1859 | + if (!Directory.Exists(tempbackupdirectorypath)) { Directory.CreateDirectory(tempbackupdirectorypath); } | ||
| 1860 | + } | ||
| 1861 | + else { tempbackupdirectorypath = backupdirectorypath; } | ||
| 1448 | 1862 | ||
| 1449 | 1863 | ||
| 1450 | - if (!Directory.Exists(backupdirectorypath)) { Directory.CreateDirectory(backupdirectorypath); } | 1864 | + if (!Directory.Exists(backupdirectorypath)) { Directory.CreateDirectory(backupdirectorypath); } |
| 1451 | 1865 | ||
| 1452 | 1866 | ||
| 1453 | - List<string> backupfilepathlist = new List<string>(); | 1867 | + List<string> backupfilepathlist = new List<string>(); |
| 1868 | + Server sqlserver = null; | ||
| 1869 | + try | ||
| 1870 | + { | ||
| 1871 | + sqlserver = SQLServerConnect(sqlcs);if (sqlserver == null) { return; } | ||
| 1454 | foreach (var sqldata in sqld.Xml_SQLDataList) | 1872 | foreach (var sqldata in sqld.Xml_SQLDataList) |
| 1455 | { | 1873 | { |
| 1456 | vars[nameof(DBSubstitutionName.DBDATAGROUP)] = sqldata.Group; | 1874 | vars[nameof(DBSubstitutionName.DBDATAGROUP)] = sqldata.Group; |
| 1457 | - var sqlfilescreated = ScriptOneDataGroup(sqlserver, tempbackupdirectorypath, backupfilenamemask + backupfilenameext, sqldata.TableNameList, vars,out List<string> errormessageList); | 1875 | + var sqlfilescreated = ScriptOneDataGroup(sqlserver, tempbackupdirectorypath, backupfilenamemask + backupfilenameext, sqldata.TableNameList, vars, out List<string> errormessageList); |
| 1458 | backupfilepathlist.AddRange(sqlfilescreated); | 1876 | backupfilepathlist.AddRange(sqlfilescreated); |
| 1459 | - if (errormessageList != null && errormessageList.Any()) { foreach (var emsg in errormessageList) { ColorConsole.WriteLine("\n"+emsg, ConsoleColor.Red); } } | 1877 | + if (errormessageList != null && errormessageList.Any()) { foreach (var emsg in errormessageList) { ColorConsole.WriteLine("\n" + emsg, ConsoleColor.Red); } } |
| 1460 | } | 1878 | } |
| 1879 | + } | ||
| 1880 | + finally { sqlserver?.ConnectionContext.SqlConnectionObject.Dispose(); } | ||
| 1461 | 1881 | ||
| 1462 | - if (createZip) | ||
| 1463 | - { | ||
| 1464 | - string fullpathregex = Regex.Escape(string.Join(";",backupfilepathlist)).Replace(';','|'); | ||
| 1465 | - ZipTools.CreateEntriesFromDirectoryContent(tempbackupdirectorypath, zipfilefullpath, "*.sql","", fullpathregex, removearchivedfiles: true, storepathinzip: false); | ||
| 1466 | - } | ||
| 1467 | - var resultfilename = zipfilefullpath == null ? "-" : Path.GetFileName(zipfilefullpath); | ||
| 1468 | - ColorConsole.WriteLine($"SQL data scripts created. DB name:'{dbname}'. BAK/ZIP file name:'{resultfilename}'", ConsoleColor.DarkGreen); | 1882 | + if (createZip) |
| 1883 | + { | ||
| 1884 | + string fullpathregex = Regex.Escape(string.Join(";",backupfilepathlist)).Replace(';','|'); | ||
| 1885 | + ZipTools.CreateEntriesFromDirectoryContent(tempbackupdirectorypath, zipfilefullpath, "*.sql","", fullpathregex, removearchivedfiles: true, storepathinzip: false); | ||
| 1469 | } | 1886 | } |
| 1470 | - else { ColorConsole.WriteLine($"SQL data scripts create: error in db connection string. '{sqlcs}'", ConsoleColor.DarkGreen); } | 1887 | + var resultfilename = zipfilefullpath == null ? "-" : Path.GetFileName(zipfilefullpath); |
| 1888 | + ColorConsole.WriteLine($"SQL data scripts created. DB name:'{dbname}'. BAK/ZIP file name:'{resultfilename}'", ConsoleColor.DarkGreen); | ||
| 1471 | } | 1889 | } |
| 1472 | private static List<string> ScriptOneDataGroup(Server sqlserver, string backupdirectorypath, string backupfilenamemask, List<string> tablenamelist, Dictionary<string, string> vars,out List<string> errormessageList) | 1890 | private static List<string> ScriptOneDataGroup(Server sqlserver, string backupdirectorypath, string backupfilenamemask, List<string> tablenamelist, Dictionary<string, string> vars,out List<string> errormessageList) |
| 1473 | { | 1891 | { |
| @@ -1562,8 +1980,7 @@ GO | @@ -1562,8 +1980,7 @@ GO | ||
| 1562 | Xml_BackupFileNameMask = GetValue(nameof(SQLDataBase.XmlStructure.Attributes.BackupFileNameMask), this.RootElement, SQLDataBase.XmlStructure.Attributes.BackupFileNameMask.Values.DEFAULT), | 1980 | Xml_BackupFileNameMask = GetValue(nameof(SQLDataBase.XmlStructure.Attributes.BackupFileNameMask), this.RootElement, SQLDataBase.XmlStructure.Attributes.BackupFileNameMask.Values.DEFAULT), |
| 1563 | Xml_RestoreFileNameMask = GetValue(nameof(SQLDataBase.XmlStructure.Attributes.RestoreFileNameMask), this.RootElement, SQLDataBase.XmlStructure.Attributes.RestoreFileNameMask.Values.DEFAULT), | 1981 | Xml_RestoreFileNameMask = GetValue(nameof(SQLDataBase.XmlStructure.Attributes.RestoreFileNameMask), this.RootElement, SQLDataBase.XmlStructure.Attributes.RestoreFileNameMask.Values.DEFAULT), |
| 1564 | Xml_BackupTargetDirectoryPath = GetValue(nameof(SQLDataBase.XmlStructure.Attributes.BackupTargetDirectoryPath), this.RootElement, SQLDataBase.XmlStructure.Attributes.BackupTargetDirectoryPath.Values.DEFAULT), | 1982 | Xml_BackupTargetDirectoryPath = GetValue(nameof(SQLDataBase.XmlStructure.Attributes.BackupTargetDirectoryPath), this.RootElement, SQLDataBase.XmlStructure.Attributes.BackupTargetDirectoryPath.Values.DEFAULT), |
| 1565 | - Xml_TranzitDirectoryPathLocal = GetValue(nameof(SQLDataBase.XmlStructure.Attributes.TranzitDirectoryPathLocal), this.RootElement, SQLDataBase.XmlStructure.Attributes.TranzitDirectoryPathLocal.Values.DEFAULT), | ||
| 1566 | - Xml_TranzitDirectoryPathNetwork = GetValue(nameof(SQLDataBase.XmlStructure.Attributes.TranzitDirectoryPathNetwork), this.RootElement, SQLDataBase.XmlStructure.Attributes.TranzitDirectoryPathNetwork.Values.DEFAULT), | 1983 | + Xml_TranzitDirectoryPath = GetValue(nameof(SQLDataBase.XmlStructure.Attributes.TranzitDirectoryPath), this.RootElement, SQLDataBase.XmlStructure.Attributes.TranzitDirectoryPath.Values.DEFAULT), |
| 1567 | Xml_PhysicalFilesDirectoryPath = GetValue(nameof(SQLDataBase.XmlStructure.Attributes.PhysicalFilesDirectoryPath), this.RootElement, SQLDataBase.XmlStructure.Attributes.PhysicalFilesDirectoryPath.Values.DEFAULT), | 1984 | Xml_PhysicalFilesDirectoryPath = GetValue(nameof(SQLDataBase.XmlStructure.Attributes.PhysicalFilesDirectoryPath), this.RootElement, SQLDataBase.XmlStructure.Attributes.PhysicalFilesDirectoryPath.Values.DEFAULT), |
| 1568 | Xml_ScriptCommandTimeout = GetValue(nameof(SQLDataBase.XmlStructure.Attributes.ScriptCommandTimeout), this.RootElement, SQLDataBase.XmlStructure.Attributes.ScriptCommandTimeout.Values.DEFAULT), | 1985 | Xml_ScriptCommandTimeout = GetValue(nameof(SQLDataBase.XmlStructure.Attributes.ScriptCommandTimeout), this.RootElement, SQLDataBase.XmlStructure.Attributes.ScriptCommandTimeout.Values.DEFAULT), |
| 1569 | }; | 1986 | }; |
| @@ -1591,9 +2008,8 @@ GO | @@ -1591,9 +2008,8 @@ GO | ||
| 1591 | public string Xml_BackupFileNameMask; | 2008 | public string Xml_BackupFileNameMask; |
| 1592 | public string Xml_RestoreFileNameMask; | 2009 | public string Xml_RestoreFileNameMask; |
| 1593 | public string Xml_BackupTargetDirectoryPath; | 2010 | public string Xml_BackupTargetDirectoryPath; |
| 1594 | - public string Xml_TranzitDirectoryPathLocal; | ||
| 1595 | - public bool Xml_IsRemoteDB { get { return !string.IsNullOrWhiteSpace(Xml_TranzitDirectoryPathLocal); } } | ||
| 1596 | - public string Xml_TranzitDirectoryPathNetwork; | 2011 | + public bool Xml_IsRemoteDB { get { return !string.IsNullOrWhiteSpace(Xml_TranzitDirectoryPath); } } |
| 2012 | + public string Xml_TranzitDirectoryPath; | ||
| 1597 | public string Xml_SQLConnectionString; | 2013 | public string Xml_SQLConnectionString; |
| 1598 | public string Xml_PhysicalFilesDirectoryPath; | 2014 | public string Xml_PhysicalFilesDirectoryPath; |
| 1599 | public int Xml_ScriptCommandTimeout; | 2015 | public int Xml_ScriptCommandTimeout; |
| @@ -1625,8 +2041,7 @@ GO | @@ -1625,8 +2041,7 @@ GO | ||
| 1625 | Xml_BackupFileNameMask = GetValue(nameof(XmlStructure.SQLDataBase.Attributes.BackupFileNameMask), sqldatabasexml, common.Xml_BackupFileNameMask); | 2041 | Xml_BackupFileNameMask = GetValue(nameof(XmlStructure.SQLDataBase.Attributes.BackupFileNameMask), sqldatabasexml, common.Xml_BackupFileNameMask); |
| 1626 | Xml_RestoreFileNameMask = GetValue(nameof(XmlStructure.SQLDataBase.Attributes.RestoreFileNameMask), sqldatabasexml, common.Xml_RestoreFileNameMask); | 2042 | Xml_RestoreFileNameMask = GetValue(nameof(XmlStructure.SQLDataBase.Attributes.RestoreFileNameMask), sqldatabasexml, common.Xml_RestoreFileNameMask); |
| 1627 | Xml_BackupTargetDirectoryPath = GetValue(nameof(XmlStructure.SQLDataBase.Attributes.BackupTargetDirectoryPath), sqldatabasexml, common.Xml_BackupTargetDirectoryPath); | 2043 | Xml_BackupTargetDirectoryPath = GetValue(nameof(XmlStructure.SQLDataBase.Attributes.BackupTargetDirectoryPath), sqldatabasexml, common.Xml_BackupTargetDirectoryPath); |
| 1628 | - Xml_TranzitDirectoryPathLocal = GetValue(nameof(XmlStructure.SQLDataBase.Attributes.TranzitDirectoryPathLocal), sqldatabasexml, common.Xml_TranzitDirectoryPathLocal); | ||
| 1629 | - Xml_TranzitDirectoryPathNetwork = GetValue(nameof(XmlStructure.SQLDataBase.Attributes.TranzitDirectoryPathNetwork), sqldatabasexml, common.Xml_TranzitDirectoryPathNetwork); | 2044 | + Xml_TranzitDirectoryPath = GetValue(nameof(XmlStructure.SQLDataBase.Attributes.TranzitDirectoryPath), sqldatabasexml, common.Xml_TranzitDirectoryPath); |
| 1630 | Xml_SQLConnectionString = GetValue(nameof(XmlStructure.SQLDataBase.Attributes.SQLConnectionString), sqldatabasexml, XmlStructure.SQLDataBase.Attributes.SQLConnectionString.Values.DEFAULT); | 2045 | Xml_SQLConnectionString = GetValue(nameof(XmlStructure.SQLDataBase.Attributes.SQLConnectionString), sqldatabasexml, XmlStructure.SQLDataBase.Attributes.SQLConnectionString.Values.DEFAULT); |
| 1631 | 2046 | ||
| 1632 | Xml_CreateZip = GetValue(nameof(XmlStructure.SQLDataBase.Attributes.CreateZip), sqldatabasexml, common.Xml_CreateZip); | 2047 | Xml_CreateZip = GetValue(nameof(XmlStructure.SQLDataBase.Attributes.CreateZip), sqldatabasexml, common.Xml_CreateZip); |
| @@ -1654,8 +2069,7 @@ GO | @@ -1654,8 +2069,7 @@ GO | ||
| 1654 | Xml_BackupFileNameMask = sqld.Xml_BackupFileNameMask; | 2069 | Xml_BackupFileNameMask = sqld.Xml_BackupFileNameMask; |
| 1655 | Xml_RestoreFileNameMask = sqld.Xml_RestoreFileNameMask; | 2070 | Xml_RestoreFileNameMask = sqld.Xml_RestoreFileNameMask; |
| 1656 | Xml_BackupTargetDirectoryPath = sqld.Xml_BackupTargetDirectoryPath; | 2071 | Xml_BackupTargetDirectoryPath = sqld.Xml_BackupTargetDirectoryPath; |
| 1657 | - Xml_TranzitDirectoryPathLocal = sqld.Xml_TranzitDirectoryPathLocal; | ||
| 1658 | - Xml_TranzitDirectoryPathNetwork = sqld.Xml_TranzitDirectoryPathNetwork; | 2072 | + Xml_TranzitDirectoryPath = sqld.Xml_TranzitDirectoryPath; |
| 1659 | Xml_SQLConnectionString = sqld.Xml_SQLConnectionString; | 2073 | Xml_SQLConnectionString = sqld.Xml_SQLConnectionString; |
| 1660 | Xml_PhysicalFilesDirectoryPath = sqld.Xml_PhysicalFilesDirectoryPath; | 2074 | Xml_PhysicalFilesDirectoryPath = sqld.Xml_PhysicalFilesDirectoryPath; |
| 1661 | Xml_SQLDataList = sqld.Xml_SQLDataList.Select(x => new SQLData(x)).ToList(); | 2075 | Xml_SQLDataList = sqld.Xml_SQLDataList.Select(x => new SQLData(x)).ToList(); |
| @@ -1670,8 +2084,7 @@ GO | @@ -1670,8 +2084,7 @@ GO | ||
| 1670 | public static class BackupFileNameMask { public static class Values { public const string DEFAULT = ""; } } | 2084 | public static class BackupFileNameMask { public static class Values { public const string DEFAULT = ""; } } |
| 1671 | public static class RestoreFileNameMask { public static class Values { public const string DEFAULT = ""; } } | 2085 | public static class RestoreFileNameMask { public static class Values { public const string DEFAULT = ""; } } |
| 1672 | public static class BackupTargetDirectoryPath { public static class Values { public const string DEFAULT = ""; } } | 2086 | public static class BackupTargetDirectoryPath { public static class Values { public const string DEFAULT = ""; } } |
| 1673 | - public static class TranzitDirectoryPathLocal { public static class Values { public const string DEFAULT = ""; } } | ||
| 1674 | - public static class TranzitDirectoryPathNetwork { public static class Values { public const string DEFAULT = ""; } } | 2087 | + public static class TranzitDirectoryPath { public static class Values { public const string DEFAULT = ""; } } |
| 1675 | public static class PhysicalFilesDirectoryPath { public static class Values { public const string DEFAULT = ""; } } | 2088 | public static class PhysicalFilesDirectoryPath { public static class Values { public const string DEFAULT = ""; } } |
| 1676 | public static class ScriptCommandTimeout { public static class Values { public const int DEFAULT = 10000; } } | 2089 | public static class ScriptCommandTimeout { public static class Values { public const int DEFAULT = 10000; } } |
| 1677 | 2090 | ||
| @@ -1688,8 +2101,7 @@ GO | @@ -1688,8 +2101,7 @@ GO | ||
| 1688 | public static class BackupFileNameMask { } | 2101 | public static class BackupFileNameMask { } |
| 1689 | public static class RestoreFileNameMask { } | 2102 | public static class RestoreFileNameMask { } |
| 1690 | public static class BackupTargetDirectoryPath { } | 2103 | public static class BackupTargetDirectoryPath { } |
| 1691 | - public static class TranzitDirectoryPathLocal { } | ||
| 1692 | - public static class TranzitDirectoryPathNetwork { } | 2104 | + public static class TranzitDirectoryPath { } |
| 1693 | public static class CreateZip { } | 2105 | public static class CreateZip { } |
| 1694 | public static class PhysicalFilesDirectoryPath { } | 2106 | public static class PhysicalFilesDirectoryPath { } |
| 1695 | public static class ScriptCommandTimeout { public static class Values { public const int DEFAULT = 10000; } } | 2107 | public static class ScriptCommandTimeout { public static class Values { public const int DEFAULT = 10000; } } |
Vrh.Log4Pro.MaintenanceConsole/Manager - ScheduledTaskManager.cs
| @@ -77,7 +77,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ScheduledTaskManagerNS | @@ -77,7 +77,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ScheduledTaskManagerNS | ||
| 77 | ScheduledTaskManagerCore.SetPriority(st.Xml_Name,st.Xml_Priority); | 77 | ScheduledTaskManagerCore.SetPriority(st.Xml_Name,st.Xml_Priority); |
| 78 | ColorConsole.WriteLine($"Priority changed for scheduled task. Name:{st.Xml_Name}", ConsoleColor.Green); | 78 | ColorConsole.WriteLine($"Priority changed for scheduled task. Name:{st.Xml_Name}", ConsoleColor.Green); |
| 79 | } | 79 | } |
| 80 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 80 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 81 | } | 81 | } |
| 82 | return o; | 82 | return o; |
| 83 | } | 83 | } |
| @@ -104,7 +104,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ScheduledTaskManagerNS | @@ -104,7 +104,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ScheduledTaskManagerNS | ||
| 104 | ScheduledTaskManagerCore.DisableTask(st.Xml_Name); | 104 | ScheduledTaskManagerCore.DisableTask(st.Xml_Name); |
| 105 | ColorConsole.WriteLine($"Scheduled task disabled. Name:{st.Xml_Name}", ConsoleColor.Green); | 105 | ColorConsole.WriteLine($"Scheduled task disabled. Name:{st.Xml_Name}", ConsoleColor.Green); |
| 106 | } | 106 | } |
| 107 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 107 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 108 | } | 108 | } |
| 109 | return o; | 109 | return o; |
| 110 | } | 110 | } |
| @@ -131,7 +131,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ScheduledTaskManagerNS | @@ -131,7 +131,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ScheduledTaskManagerNS | ||
| 131 | ScheduledTaskManagerCore.EnableTask(st.Xml_Name); | 131 | ScheduledTaskManagerCore.EnableTask(st.Xml_Name); |
| 132 | ColorConsole.WriteLine($"Scheduled task enabled. Name:{st.Xml_Name}", ConsoleColor.Green); | 132 | ColorConsole.WriteLine($"Scheduled task enabled. Name:{st.Xml_Name}", ConsoleColor.Green); |
| 133 | } | 133 | } |
| 134 | - catch (Exception ex){ ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 134 | + catch (Exception ex){ ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 135 | } | 135 | } |
| 136 | return o; | 136 | return o; |
| 137 | } | 137 | } |
| @@ -158,7 +158,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ScheduledTaskManagerNS | @@ -158,7 +158,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ScheduledTaskManagerNS | ||
| 158 | ScheduledTaskManagerCore.EndTask(st.Xml_Name); | 158 | ScheduledTaskManagerCore.EndTask(st.Xml_Name); |
| 159 | ColorConsole.WriteLine($"Scheduled task stopped. Name:{st.Xml_Name}", ConsoleColor.Green); | 159 | ColorConsole.WriteLine($"Scheduled task stopped. Name:{st.Xml_Name}", ConsoleColor.Green); |
| 160 | } | 160 | } |
| 161 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 161 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 162 | } | 162 | } |
| 163 | return o; | 163 | return o; |
| 164 | } | 164 | } |
| @@ -187,7 +187,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ScheduledTaskManagerNS | @@ -187,7 +187,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ScheduledTaskManagerNS | ||
| 187 | } | 187 | } |
| 188 | catch (Exception ex) | 188 | catch (Exception ex) |
| 189 | { | 189 | { |
| 190 | - ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); | 190 | + ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); |
| 191 | } | 191 | } |
| 192 | } | 192 | } |
| 193 | return o; | 193 | return o; |
| @@ -216,7 +216,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ScheduledTaskManagerNS | @@ -216,7 +216,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ScheduledTaskManagerNS | ||
| 216 | ScheduledTaskManagerCore.DeleteTask(st.Xml_Name); | 216 | ScheduledTaskManagerCore.DeleteTask(st.Xml_Name); |
| 217 | ColorConsole.WriteLine($"Scheduled task uninstalled. Name:{st.Xml_Name}", ConsoleColor.Green); | 217 | ColorConsole.WriteLine($"Scheduled task uninstalled. Name:{st.Xml_Name}", ConsoleColor.Green); |
| 218 | } | 218 | } |
| 219 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 219 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 220 | } | 220 | } |
| 221 | return o; | 221 | return o; |
| 222 | } | 222 | } |
| @@ -245,7 +245,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ScheduledTaskManagerNS | @@ -245,7 +245,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ScheduledTaskManagerNS | ||
| 245 | ScheduledTaskManagerCore.CreateTask(st); | 245 | ScheduledTaskManagerCore.CreateTask(st); |
| 246 | ColorConsole.WriteLine($"Scheduled task installed. Name:{st.Xml_Name}", ConsoleColor.Green); | 246 | ColorConsole.WriteLine($"Scheduled task installed. Name:{st.Xml_Name}", ConsoleColor.Green); |
| 247 | } | 247 | } |
| 248 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 248 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 249 | } | 249 | } |
| 250 | return o; | 250 | return o; |
| 251 | } | 251 | } |
Vrh.Log4Pro.MaintenanceConsole/Manager - UserManager.cs
| @@ -94,7 +94,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.UserManagerNS | @@ -94,7 +94,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.UserManagerNS | ||
| 94 | ColorConsole.WriteLine($"Action:{cr.Type}, role names: {cr.Roles}.", ConsoleColor.Yellow); | 94 | ColorConsole.WriteLine($"Action:{cr.Type}, role names: {cr.Roles}.", ConsoleColor.Yellow); |
| 95 | var sel = ColorConsole.ReadLine($"Press enter to continue.", ConsoleColor.Gray); if (sel.ToUpper() == "EX") return o; | 95 | var sel = ColorConsole.ReadLine($"Press enter to continue.", ConsoleColor.Gray); if (sel.ToUpper() == "EX") return o; |
| 96 | } | 96 | } |
| 97 | - foreach (var rn in cr.RoleArray) { try { MembershipTools.Roles.Create(rn); } catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }; } | 97 | + foreach (var rn in cr.RoleArray) { try { MembershipTools.Roles.Create(rn); } catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); }; } |
| 98 | } | 98 | } |
| 99 | foreach (var cr in iab.GetCreateRoleGroupActions()) | 99 | foreach (var cr in iab.GetCreateRoleGroupActions()) |
| 100 | { | 100 | { |
| @@ -107,7 +107,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.UserManagerNS | @@ -107,7 +107,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.UserManagerNS | ||
| 107 | { | 107 | { |
| 108 | MembershipTools.RoleGroups.Create(cr.Name); | 108 | MembershipTools.RoleGroups.Create(cr.Name); |
| 109 | MembershipTools.Assign.RolesToRoleGroups(cr.Roles, cr.Name); | 109 | MembershipTools.Assign.RolesToRoleGroups(cr.Roles, cr.Name); |
| 110 | - } catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }; | 110 | + } catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); }; |
| 111 | 111 | ||
| 112 | } | 112 | } |
| 113 | foreach (var cr in iab.GetCreateUserActions()) | 113 | foreach (var cr in iab.GetCreateUserActions()) |
| @@ -122,11 +122,11 @@ namespace Vrh.Log4Pro.MaintenanceConsole.UserManagerNS | @@ -122,11 +122,11 @@ namespace Vrh.Log4Pro.MaintenanceConsole.UserManagerNS | ||
| 122 | { | 122 | { |
| 123 | MembershipTools.Users.Create(cr.Name, cr.Password, administrator: false, superuser: cr.Superuser, rolenames: cr.RoleArray, rolegroupnames: cr.RoleGroupArray); | 123 | MembershipTools.Users.Create(cr.Name, cr.Password, administrator: false, superuser: cr.Superuser, rolenames: cr.RoleArray, rolegroupnames: cr.RoleGroupArray); |
| 124 | } | 124 | } |
| 125 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }; | 125 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); }; |
| 126 | } | 126 | } |
| 127 | ColorConsole.WriteLine($"Executing init action block '{iabname}' was successful!", ConsoleColor.Green); | 127 | ColorConsole.WriteLine($"Executing init action block '{iabname}' was successful!", ConsoleColor.Green); |
| 128 | } | 128 | } |
| 129 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 129 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 130 | return o; | 130 | return o; |
| 131 | } | 131 | } |
| 132 | #endregion ExecuteInitActionBlock | 132 | #endregion ExecuteInitActionBlock |
| @@ -144,7 +144,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.UserManagerNS | @@ -144,7 +144,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.UserManagerNS | ||
| 144 | MembershipTools.Users.Create(suname, supsw, superuser: true); | 144 | MembershipTools.Users.Create(suname, supsw, superuser: true); |
| 145 | ColorConsole.WriteLine($"Creating superuser '{suname}' was successful!", ConsoleColor.Green); | 145 | ColorConsole.WriteLine($"Creating superuser '{suname}' was successful!", ConsoleColor.Green); |
| 146 | } | 146 | } |
| 147 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 147 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 148 | return o; | 148 | return o; |
| 149 | } | 149 | } |
| 150 | #endregion CreateSuperuser | 150 | #endregion CreateSuperuser |
| @@ -164,7 +164,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.UserManagerNS | @@ -164,7 +164,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.UserManagerNS | ||
| 164 | MembershipTools.Users.CreateAdminRolesRoleGroupsUsers(adminun,adminpsw); | 164 | MembershipTools.Users.CreateAdminRolesRoleGroupsUsers(adminun,adminpsw); |
| 165 | ColorConsole.WriteLine($"Creating admin users was successful!", ConsoleColor.Green); | 165 | ColorConsole.WriteLine($"Creating admin users was successful!", ConsoleColor.Green); |
| 166 | } | 166 | } |
| 167 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 167 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 168 | return o; | 168 | return o; |
| 169 | } | 169 | } |
| 170 | #endregion CreateAdminusers | 170 | #endregion CreateAdminusers |
| @@ -184,7 +184,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.UserManagerNS | @@ -184,7 +184,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.UserManagerNS | ||
| 184 | } | 184 | } |
| 185 | else { throw new Exception($"User '{uname}' is protected, can not be deleted!"); } | 185 | else { throw new Exception($"User '{uname}' is protected, can not be deleted!"); } |
| 186 | } | 186 | } |
| 187 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 187 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 188 | return o; | 188 | return o; |
| 189 | } | 189 | } |
| 190 | #endregion DeleteUsers | 190 | #endregion DeleteUsers |
Vrh.Log4Pro.MaintenanceConsole/Manager - WindowsServiceManager.cs
| @@ -113,7 +113,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS | @@ -113,7 +113,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS | ||
| 113 | var success = WindowsServiceManagerCore.Register(ws, selectedServices.Select(x => x.Name).ToList()); | 113 | var success = WindowsServiceManagerCore.Register(ws, selectedServices.Select(x => x.Name).ToList()); |
| 114 | ColorConsole.WriteLine($"Service registered. Name:{ws.Name}", ConsoleColor.Green); | 114 | ColorConsole.WriteLine($"Service registered. Name:{ws.Name}", ConsoleColor.Green); |
| 115 | } | 115 | } |
| 116 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 116 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 117 | } | 117 | } |
| 118 | break; | 118 | break; |
| 119 | case CLP.Module.WindowsServiceManager.Function.Unregister.KEY: | 119 | case CLP.Module.WindowsServiceManager.Function.Unregister.KEY: |
| @@ -124,7 +124,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS | @@ -124,7 +124,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS | ||
| 124 | var success = WindowsServiceManagerCore.Unregister(ws); | 124 | var success = WindowsServiceManagerCore.Unregister(ws); |
| 125 | ColorConsole.WriteLine($"Service unregistered. Name:{ws.Name}", ConsoleColor.Green); | 125 | ColorConsole.WriteLine($"Service unregistered. Name:{ws.Name}", ConsoleColor.Green); |
| 126 | } | 126 | } |
| 127 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 127 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 128 | } | 128 | } |
| 129 | break; | 129 | break; |
| 130 | case CLP.Module.WindowsServiceManager.Function.Start.KEY: | 130 | case CLP.Module.WindowsServiceManager.Function.Start.KEY: |
| @@ -135,7 +135,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS | @@ -135,7 +135,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS | ||
| 135 | var success = WindowsServiceManagerCore.Start(ws.Name, ws.Xml_StartTimeout); | 135 | var success = WindowsServiceManagerCore.Start(ws.Name, ws.Xml_StartTimeout); |
| 136 | ColorConsole.WriteLine($"Service started. Name:{ws.Name}", ConsoleColor.Green); | 136 | ColorConsole.WriteLine($"Service started. Name:{ws.Name}", ConsoleColor.Green); |
| 137 | } | 137 | } |
| 138 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 138 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 139 | } | 139 | } |
| 140 | break; | 140 | break; |
| 141 | case CLP.Module.WindowsServiceManager.Function.Stop.KEY: | 141 | case CLP.Module.WindowsServiceManager.Function.Stop.KEY: |
| @@ -146,7 +146,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS | @@ -146,7 +146,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS | ||
| 146 | var success = WindowsServiceManagerCore.Stop(ws.Name, ws.Xml_StopTimeout); | 146 | var success = WindowsServiceManagerCore.Stop(ws.Name, ws.Xml_StopTimeout); |
| 147 | ColorConsole.WriteLine($"Service stopped. Name:{ws.Name}", ConsoleColor.Green); | 147 | ColorConsole.WriteLine($"Service stopped. Name:{ws.Name}", ConsoleColor.Green); |
| 148 | } | 148 | } |
| 149 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 149 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 150 | } | 150 | } |
| 151 | break; | 151 | break; |
| 152 | case CLP.Module.WindowsServiceManager.Function.Dump.KEY: | 152 | case CLP.Module.WindowsServiceManager.Function.Dump.KEY: |
| @@ -157,7 +157,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS | @@ -157,7 +157,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS | ||
| 157 | var success = WindowsServiceManagerCore.Dump(ws.Name); | 157 | var success = WindowsServiceManagerCore.Dump(ws.Name); |
| 158 | ColorConsole.WriteLine($"Service dump completed. Name:{ws.Name}", ConsoleColor.Green); | 158 | ColorConsole.WriteLine($"Service dump completed. Name:{ws.Name}", ConsoleColor.Green); |
| 159 | } | 159 | } |
| 160 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 160 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 161 | } | 161 | } |
| 162 | break; | 162 | break; |
| 163 | case CLP.Module.WindowsServiceManager.Function.Kill.KEY: | 163 | case CLP.Module.WindowsServiceManager.Function.Kill.KEY: |
| @@ -168,7 +168,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS | @@ -168,7 +168,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS | ||
| 168 | var success = WindowsServiceManagerCore.Kill(ws.Name); | 168 | var success = WindowsServiceManagerCore.Kill(ws.Name); |
| 169 | ColorConsole.WriteLine($"Service killed. Name:{ws.Name}", ConsoleColor.Green); | 169 | ColorConsole.WriteLine($"Service killed. Name:{ws.Name}", ConsoleColor.Green); |
| 170 | } | 170 | } |
| 171 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 171 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 172 | } | 172 | } |
| 173 | break; | 173 | break; |
| 174 | case CLP.Module.WindowsServiceManager.Function.SetUserAccount.KEY: SetUserAccount(config, string.Join(",",selectedkeylist),forcecommandmode:true); break; | 174 | case CLP.Module.WindowsServiceManager.Function.SetUserAccount.KEY: SetUserAccount(config, string.Join(",",selectedkeylist),forcecommandmode:true); break; |
| @@ -265,7 +265,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS | @@ -265,7 +265,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS | ||
| 265 | else { ColorConsole.WriteLine($"Service user account change FAILED! Name:{ws.Name}", ConsoleColor.Red); } | 265 | else { ColorConsole.WriteLine($"Service user account change FAILED! Name:{ws.Name}", ConsoleColor.Red); } |
| 266 | } | 266 | } |
| 267 | } | 267 | } |
| 268 | - catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 268 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red); } |
| 269 | } | 269 | } |
| 270 | return; | 270 | return; |
| 271 | } | 271 | } |
| @@ -567,11 +567,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS | @@ -567,11 +567,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS | ||
| 567 | ColorConsole.WriteLine(startInfo.FileName + " " + startInfo.Arguments); | 567 | ColorConsole.WriteLine(startInfo.FileName + " " + startInfo.Arguments); |
| 568 | using (Process exeProcess = Process.Start(startInfo)) { exeProcess.WaitForExit(); } | 568 | using (Process exeProcess = Process.Start(startInfo)) { exeProcess.WaitForExit(); } |
| 569 | } | 569 | } |
| 570 | - catch (Exception ex) | ||
| 571 | - { | ||
| 572 | - ColorConsole.WriteLine(ex.Message); | ||
| 573 | - if(ex.InnerException!=null) ColorConsole.WriteLine(ex.InnerException.Message); | ||
| 574 | - } | 570 | + catch (Exception ex) { ColorConsole.WriteLine(ex.MessageNested()); } |
| 575 | return true; | 571 | return true; |
| 576 | } | 572 | } |
| 577 | private static string BuildArgumentListSetDescription(WindowsService ws, List<string> dependencygroupservicenamelist) | 573 | private static string BuildArgumentListSetDescription(WindowsService ws, List<string> dependencygroupservicenamelist) |
Vrh.Log4Pro.MaintenanceConsole/Program.cs
| @@ -92,6 +92,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole | @@ -92,6 +92,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole | ||
| 92 | 92 | ||
| 93 | ColorConsole.PressAnykeyToContinue(); | 93 | ColorConsole.PressAnykeyToContinue(); |
| 94 | } | 94 | } |
| 95 | + public static ComputerInfo ThisComputer=null; | ||
| 95 | } | 96 | } |
| 96 | public static class TESTS | 97 | public static class TESTS |
| 97 | { | 98 | { |
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.26.0.0")] | ||
| 36 | -[assembly: AssemblyFileVersion("1.26.0.0")] | 35 | +[assembly: AssemblyVersion("1.27.0.0")] |
| 36 | +[assembly: AssemblyFileVersion("1.27.0.0")] |
Vrh.Log4Pro.MaintenanceConsole/Tools - Http.cs
| @@ -38,7 +38,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS | @@ -38,7 +38,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS | ||
| 38 | { | 38 | { |
| 39 | return mode == RequestType.GET? _GetReturninfoJSON(url, timeoutinseconds,out returninfojsonstring) : _PostReturninfoJSON(url, timeoutinseconds, out returninfojsonstring, dictparameterlist); | 39 | return mode == RequestType.GET? _GetReturninfoJSON(url, timeoutinseconds,out returninfojsonstring) : _PostReturninfoJSON(url, timeoutinseconds, out returninfojsonstring, dictparameterlist); |
| 40 | } | 40 | } |
| 41 | - catch (Exception ex) { return new ReturnInfoJSON() { ReturnValue = -1, ReturnMessage = ex.Message + "\n" + returninfojsonstring, }; } | 41 | + catch (Exception ex) { return new ReturnInfoJSON() { ReturnValue = -1, ReturnMessage = ex.MessageNested() + "\n" + returninfojsonstring, }; } |
| 42 | } | 42 | } |
| 43 | 43 | ||
| 44 | private static ReturnInfoJSON _GetReturninfoJSON(string url, int timeoutinseconds, out string returninfojsonstring) | 44 | private static ReturnInfoJSON _GetReturninfoJSON(string url, int timeoutinseconds, out string returninfojsonstring) |
Vrh.Log4Pro.MaintenanceConsole/Tools - Membership.cs
| @@ -552,7 +552,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS | @@ -552,7 +552,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS | ||
| 552 | catch (Exception ex) | 552 | catch (Exception ex) |
| 553 | { | 553 | { |
| 554 | result.ReturnValue = -1; | 554 | result.ReturnValue = -1; |
| 555 | - result.ReturnMessage = ex.Message; | 555 | + result.ReturnMessage = ex.MessageNested(); |
| 556 | } | 556 | } |
| 557 | return result; | 557 | return result; |
| 558 | } | 558 | } |
| @@ -590,7 +590,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS | @@ -590,7 +590,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS | ||
| 590 | catch (Exception ex) | 590 | catch (Exception ex) |
| 591 | { | 591 | { |
| 592 | result.ReturnValue = -1; | 592 | result.ReturnValue = -1; |
| 593 | - result.ReturnMessage = ex.Message; | 593 | + result.ReturnMessage = ex.MessageNested(); |
| 594 | } | 594 | } |
| 595 | return result; | 595 | return result; |
| 596 | } | 596 | } |
| @@ -632,7 +632,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS | @@ -632,7 +632,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS | ||
| 632 | catch (Exception ex) | 632 | catch (Exception ex) |
| 633 | { | 633 | { |
| 634 | result.ReturnValue = -1; | 634 | result.ReturnValue = -1; |
| 635 | - result.ReturnMessage = ex.Message; | 635 | + result.ReturnMessage = ex.MessageNested(); |
| 636 | } | 636 | } |
| 637 | return result; | 637 | return result; |
| 638 | } | 638 | } |
Vrh.Log4Pro.MaintenanceConsole/Tools.cs
| @@ -93,7 +93,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS | @@ -93,7 +93,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS | ||
| 93 | { | 93 | { |
| 94 | foreach (var zipentry in archive.Entries) | 94 | foreach (var zipentry in archive.Entries) |
| 95 | { | 95 | { |
| 96 | - zipentry.ExtractToFile(targetfilefullpath); | 96 | + ColorConsole.WriteLine($"{nameof(Extract1stFileFromZIP)} extracting to file: {targetfilefullpath}", ConsoleColor.Yellow, prefix: ""); |
| 97 | + zipentry.ExtractToFile(targetfilefullpath,true); | ||
| 97 | return; | 98 | return; |
| 98 | } | 99 | } |
| 99 | } | 100 | } |
| @@ -103,9 +104,13 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS | @@ -103,9 +104,13 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS | ||
| 103 | if (!Directory.Exists(targetdirectorypath)) { Directory.CreateDirectory(targetdirectorypath); } | 104 | if (!Directory.Exists(targetdirectorypath)) { Directory.CreateDirectory(targetdirectorypath); } |
| 104 | using (ZipArchive archive = ZipFile.Open(ZIPfilefullpath, ZipArchiveMode.Read)) | 105 | using (ZipArchive archive = ZipFile.Open(ZIPfilefullpath, ZipArchiveMode.Read)) |
| 105 | { | 106 | { |
| 107 | + ColorConsole.WriteLine(); | ||
| 106 | foreach (var zipentry in archive.Entries) | 108 | foreach (var zipentry in archive.Entries) |
| 107 | { | 109 | { |
| 108 | - zipentry.ExtractToFile(Path.Combine(targetdirectorypath, zipentry.FullName)); | 110 | + ColorConsole.SetCursorPosition(0, Console.CursorTop); |
| 111 | + string targetfilefullpath = Path.Combine(targetdirectorypath, zipentry.FullName); | ||
| 112 | + ColorConsole.WriteLine($"{nameof(Extract1stFileFromZIP)} extracting to file: {targetfilefullpath}", ConsoleColor.Yellow, prefix: ""); | ||
| 113 | + zipentry.ExtractToFile(targetfilefullpath,true); | ||
| 109 | } | 114 | } |
| 110 | } | 115 | } |
| 111 | } | 116 | } |
| @@ -151,7 +156,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS | @@ -151,7 +156,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS | ||
| 151 | catch (Exception ex) | 156 | catch (Exception ex) |
| 152 | { | 157 | { |
| 153 | ColorConsole.WriteLine($"Error when accessing/zipping file '{fi.FullName}'!", ConsoleColor.Red); | 158 | ColorConsole.WriteLine($"Error when accessing/zipping file '{fi.FullName}'!", ConsoleColor.Red); |
| 154 | - ColorConsole.WriteLine(ex.Message, ConsoleColor.Red,prefix: "Exception message: ", bracket:"[]"); | 159 | + ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red,prefix: "Exception message: ", bracket:"[]"); |
| 155 | } | 160 | } |
| 156 | } | 161 | } |
| 157 | cpt = ColorConsole.CursorTop; | 162 | cpt = ColorConsole.CursorTop; |
| @@ -384,7 +389,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS | @@ -384,7 +389,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS | ||
| 384 | public string OSServicePack; | 389 | public string OSServicePack; |
| 385 | public string OSVersionString; | 390 | public string OSVersionString; |
| 386 | public List<string> OSFriendlyNames; | 391 | public List<string> OSFriendlyNames; |
| 387 | - public static void DisplayThis() { new ComputerInfo().Display(); } | 392 | + public static void DisplayThis() { Program.ThisComputer = Program.ThisComputer??new ComputerInfo(); Program.ThisComputer.Display(); } |
| 388 | public ComputerInfo() | 393 | public ComputerInfo() |
| 389 | { | 394 | { |
| 390 | var ci = this; | 395 | var ci = this; |
| @@ -504,12 +509,14 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS | @@ -504,12 +509,14 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS | ||
| 504 | string indent = ""; | 509 | string indent = ""; |
| 505 | const string indentof1level = " "; | 510 | const string indentof1level = " "; |
| 506 | Exception excl = ex; | 511 | Exception excl = ex; |
| 507 | - while (true) | 512 | + while (excl != null) |
| 508 | { | 513 | { |
| 509 | - rexmsg += indent + excl.Message; | 514 | + if (!string.IsNullOrWhiteSpace(ex.Message)) |
| 515 | + { | ||
| 516 | + rexmsg += indent + excl.Message; | ||
| 517 | + indent += (indent == "" ? "\n" : "") + indentof1level; | ||
| 518 | + } | ||
| 510 | excl = excl.InnerException; | 519 | excl = excl.InnerException; |
| 511 | - indent += (indent==""?"\n":"")+indentof1level; | ||
| 512 | - if (excl == null) { break; } | ||
| 513 | } | 520 | } |
| 514 | return rexmsg.Replace("\n\n","\n"); | 521 | return rexmsg.Replace("\n\n","\n"); |
| 515 | } | 522 | } |