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 | } |