Commit 1369dd36970987b2a4ee79f56091a0ffbb9cdb53

Authored by Schwirg László
1 parent 8288c475

v1.29.2.0

- MoveDbToRemoteServer kiegészítése
Vrh.Log4Pro.MaintenanceConsole/Manager - SQLDataBaseManager.cs
@@ -135,7 +135,6 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS @@ -135,7 +135,6 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
135 SQLDataBase sqld = p.Parameters as SQLDataBase; 135 SQLDataBase sqld = p.Parameters as SQLDataBase;
136 try 136 try
137 { 137 {
138 -  
139 SQLDataBaseManagerCore.BackupSqlScripts(sqld,TS); 138 SQLDataBaseManagerCore.BackupSqlScripts(sqld,TS);
140 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);
141 } 140 }
@@ -633,16 +632,57 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS @@ -633,16 +632,57 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
633 632
634 var selectedsqldbindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.SQLDataBaseManager.Function.CMD_DATABASES); 633 var selectedsqldbindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.SQLDataBaseManager.Function.CMD_DATABASES);
635 634
636 - selectionloop: 635 + (bool Exit, bool Yes) yesornoanswer;
  636 + (bool Exit, bool Yes, SQLDataBase Dbfrom, SQLDataBase Dbto, string Selecteddbname, bool Emulation) movedbanswer;
  637 + while (true)
  638 + {
  639 + var DateTimeNow = DateTime.Now;
  640 +
  641 + movedbanswer = YesOrNo_MoveDbToRemoteServer(config, selectedsqldbindexes);
  642 + if (movedbanswer.Exit) break;
  643 + if (movedbanswer.Yes)
  644 + {
  645 + var movesuccess = SQLDataBaseManagerCore.MoveDbToRemoteServer(movedbanswer.Dbfrom, movedbanswer.Dbto, movedbanswer.Selecteddbname, movedbanswer.Emulation);
  646 + if (!movesuccess) continue;
  647 + }
  648 +
  649 + var usernamelist = new string[] { "corplear\\lschwirg", "corplear\\gen_vrhalmadmin", $"corplear\\{Program.ThisComputer.ComputerName}$" };
  650 +
  651 + yesornoanswer = YesOrNo_ServerLogin(movedbanswer.Dbfrom.SQLCS, usernamelist);
  652 + if (yesornoanswer.Exit) return o;
  653 + if (yesornoanswer.Yes) SQLDataBaseManagerCore.CreateServerLogins(movedbanswer.Emulation, movedbanswer.Dbfrom.SQLCS, usernamelist, loginrolelist,fullaccessrolelist);
  654 +
  655 + yesornoanswer = YesOrNo_ServerLogin(movedbanswer.Dbto.SQLCS, usernamelist);
  656 + if (yesornoanswer.Exit) return o;
  657 + if (yesornoanswer.Yes) SQLDataBaseManagerCore.CreateServerLogins(movedbanswer.Emulation, movedbanswer.Dbto.SQLCS, usernamelist, loginrolelist, fullaccessrolelist);
  658 +
  659 + yesornoanswer = YesOrNo_SetDbOffline(movedbanswer.Dbfrom.SQLCS, null);
  660 + if (yesornoanswer.Exit) return o;
  661 + if (yesornoanswer.Yes) SQLDataBaseManagerCore.SetDatabaseOffline(movedbanswer.Dbfrom.SQLCS);
  662 +
  663 + ColorConsole.WriteLine($"Moving DB to remote server completed. Required time: {(int)(DateTime.Now.Subtract(DateTimeNow).TotalSeconds)} seconds.", ConsoleColor.Green);
  664 + }
  665 + return o;
  666 + }
  667 + private static (bool,bool,SQLDataBase, SQLDataBase, string, bool) YesOrNo_MoveDbToRemoteServer(SQLDataBaseManagerXmlProcessor config,string selectedsqldbindexes)
  668 + {
  669 + (bool, bool, SQLDataBase, SQLDataBase, string, bool) returnvalueexit = (true, false, null, null, null, false);
  670 +
  671 + selectionloop:
  672 +
  673 + ColorConsole.WriteLine($"Do You want to move ANY database from local server to remote server?", ConsoleColor.Yellow);
  674 + var yesorno = ColorConsole.ReadLine("Move?", ConsoleColor.Yellow, validitylist: new List<string> { "yes", "no" }, defaultvalue: "yes");
  675 + if (yesorno.ToUpper() == "EX") return returnvalueexit;
  676 +
637 var menufolders = DisplaySQLDataBaseMenu(config, $"Select the SQL database(s) to manage with function. '{nameof(MoveDbToRemoteServer)}'! Format:FROMLOCALDB,TOREMOTEDB", silent: true, selectionmode: Menu.SelectionMode.Multi); 677 var menufolders = DisplaySQLDataBaseMenu(config, $"Select the SQL database(s) to manage with function. '{nameof(MoveDbToRemoteServer)}'! Format:FROMLOCALDB,TOREMOTEDB", silent: true, selectionmode: Menu.SelectionMode.Multi);
638 678
639 Menu.Selection sr = menufolders.Select(selectedsqldbindexes); 679 Menu.Selection sr = menufolders.Select(selectedsqldbindexes);
640 - if (sr.Result == Menu.SelectionResult.Exit) { return o; } 680 + if (sr.Result == Menu.SelectionResult.Exit) { return returnvalueexit; }
641 else if (sr.Result == Menu.SelectionResult.None) { goto selectionloop; } 681 else if (sr.Result == Menu.SelectionResult.None) { goto selectionloop; }
642 else if (sr.Result == Menu.SelectionResult.Error) { goto selectionloop; } 682 else if (sr.Result == Menu.SelectionResult.Error) { goto selectionloop; }
643 else if (sr.Result == Menu.SelectionResult.Ok && sr.SelectedParameterList.FirstOrDefault() == null) { goto selectionloop; } 683 else if (sr.Result == Menu.SelectionResult.Ok && sr.SelectedParameterList.FirstOrDefault() == null) { goto selectionloop; }
644 - else if (sr.Result == Menu.SelectionResult.Ok && sr.SelectedParameterList.Count() != 2)  
645 - { 684 + else if (sr.Result == Menu.SelectionResult.Ok && sr.SelectedParameterList.Count() != 2)
  685 + {
646 ColorConsole.WriteLine($"Select exactly 2 DB. Format:FROMLOCALDB,TOREMOTEDB", ConsoleColor.Red); 686 ColorConsole.WriteLine($"Select exactly 2 DB. Format:FROMLOCALDB,TOREMOTEDB", ConsoleColor.Red);
647 goto selectionloop; 687 goto selectionloop;
648 } 688 }
@@ -652,7 +692,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS @@ -652,7 +692,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
652 var spto = sr.SelectedParameterList.ElementAt(1); 692 var spto = sr.SelectedParameterList.ElementAt(1);
653 SQLDataBase dbfrom = spfrom.Parameters as SQLDataBase; 693 SQLDataBase dbfrom = spfrom.Parameters as SQLDataBase;
654 SQLDataBase dbto = spto.Parameters as SQLDataBase; 694 SQLDataBase dbto = spto.Parameters as SQLDataBase;
655 - if (!dbto.Xml_IsRemoteDB) 695 + if (!dbto.Xml_IsRemoteDB)
656 { 696 {
657 ColorConsole.WriteLine($"TOREMOTEDB '{dbto.SQLCS}' has to be remote!", ConsoleColor.Red); 697 ColorConsole.WriteLine($"TOREMOTEDB '{dbto.SQLCS}' has to be remote!", ConsoleColor.Red);
658 goto selectionloop; 698 goto selectionloop;
@@ -662,64 +702,39 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS @@ -662,64 +702,39 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
662 ColorConsole.WriteLine($"FROMLOCALDB '{dbfrom.SQLCS}' has to be local!", ConsoleColor.Red); 702 ColorConsole.WriteLine($"FROMLOCALDB '{dbfrom.SQLCS}' has to be local!", ConsoleColor.Red);
663 goto selectionloop; 703 goto selectionloop;
664 } 704 }
  705 + if (yesorno.ToUpper() != "YES") return (false, false,dbfrom,dbto, null,false);
  706 +
665 bool emulation = false; 707 bool emulation = false;
666 -  
667 var selecteddbname = ColorConsole.ReadLine($"Enter the name of the restored DB. EMPTY={dbto.DBName}, EX=exit."); 708 var selecteddbname = ColorConsole.ReadLine($"Enter the name of the restored DB. EMPTY={dbto.DBName}, EX=exit.");
668 - if (selecteddbname.ToUpper() == "EX") return o;  
669 - else if (string.IsNullOrWhiteSpace(selecteddbname)) selecteddbname=dbto.DBName; 709 + if (selecteddbname.ToUpper() == "EX") return returnvalueexit;
  710 + else if (string.IsNullOrWhiteSpace(selecteddbname)) selecteddbname = dbto.DBName;
670 711
671 confirmloop:; 712 confirmloop:;
672 var selection = ColorConsole.ReadLine("Enter CONFIRM to start, EMU to emulate, EX to exit."); 713 var selection = ColorConsole.ReadLine("Enter CONFIRM to start, EMU to emulate, EX to exit.");
673 - if (selection.ToUpper() == "EX") return o; 714 + if (selection.ToUpper() == "EX") return returnvalueexit;
674 else if (selection.ToUpper() == "EMU") emulation = true; 715 else if (selection.ToUpper() == "EMU") emulation = true;
675 else if (selection.ToUpper() == "CONFIRM") { } 716 else if (selection.ToUpper() == "CONFIRM") { }
676 else goto confirmloop; 717 else goto confirmloop;
677 -  
678 - var DateTimeNow = DateTime.Now;  
679 - var usernameList = new string[] { "corplear\\lschwirg", "corplear\\gen_vrhalmadmin", $"corplear\\{Program.ThisComputer.ComputerName}$" };  
680 - foreach (var username in usernameList)  
681 - {  
682 - ColorConsole.WriteLine(username, ConsoleColor.Yellow, prefix: nameof(SQLDataBaseManagerCore.CreateUser) + ":");  
683 - try { if (!emulation) SQLDataBaseManagerCore.CreateLogin(dbfrom.SQLCS, username, null, "master", LoginType.WindowsUser, loginrolelist); }  
684 - catch (Exception ex) { ColorConsole.WriteLine(nameof(SQLDataBaseManagerCore.CreateLogin)+">>>: "+ex.MessageNested(), ConsoleColor.Red); }  
685 - try { if (!emulation) SQLDataBaseManagerCore.CreateUser(dbfrom.SQLCS, username, string.Join(",", fullaccessrolelist), "w"); }  
686 - catch (Exception ex) { ColorConsole.WriteLine(nameof(SQLDataBaseManagerCore.CreateUser) + "\n" + ex.MessageNested(), ConsoleColor.Red); }  
687 - }  
688 -  
689 - //backup dbfrom  
690 - var backupfileFullname = SQLDataBaseManagerCore.CreateBackup(dbfrom, false, DateTimeNow,emulation);  
691 - //move dbfrom to tranit area  
692 -  
693 - if (!emulation && !File.Exists(backupfileFullname)) { goto selectionloop; }  
694 -  
695 - string backupfileFilename = null;  
696 - string tranzitfileFullname = null;  
697 - try  
698 - {  
699 - backupfileFilename = Path.GetFileName(backupfileFullname);  
700 - tranzitfileFullname = Path.Combine(dbto.Xml_TranzitDirectoryPath, backupfileFilename);  
701 - ColorConsole.WriteLine($"Moving backup file {backupfileFullname} to tranzit location: {dbto.Xml_TranzitDirectoryPath}", ConsoleColor.Yellow);  
702 - if (!emulation)  
703 - {  
704 - if (File.Exists(tranzitfileFullname)) { File.Delete(tranzitfileFullname); }  
705 - File.Move(backupfileFullname, tranzitfileFullname);  
706 - ColorConsole.WriteLine($"...completed...", ConsoleColor.Yellow);  
707 - }  
708 - }  
709 - catch (Exception ex)  
710 - {  
711 - ColorConsole.WriteLine($"Moving file FAILED!", ConsoleColor.Red);  
712 - ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red);  
713 - goto selectionloop;  
714 - }  
715 - if (!emulation && !File.Exists(tranzitfileFullname)) { goto selectionloop; }  
716 -  
717 - //restore backup to dbto  
718 - tranzitfileFullname = Path.Combine(dbto.Xml_TranzitDirectoryPath, backupfileFilename);  
719 - SQLDataBaseManagerCore.RestoreBackup(dbto, tranzitfileFullname, dbto.Xml_PhysicalFilesDirectoryPath, false, selecteddbname, emulation);  
720 -  
721 - ColorConsole.WriteLine($"Moving DB to remote server completed. Required time: {(int)(DateTime.Now.Subtract(DateTimeNow).TotalSeconds)} seconds.",ConsoleColor.Green);  
722 - return o; 718 + return (false,true,dbfrom,dbto, selecteddbname,emulation);
  719 + }
  720 + private static (bool,bool) YesOrNo_SetDbOffline(string sqlcs, string dbname)
  721 + {
  722 + dbname = dbname ?? SQLDataBaseManagerCore.GetDBName(sqlcs);
  723 + var servername = SQLDataBaseManagerCore.GetDataSource(sqlcs);
  724 + ColorConsole.WriteLine($"Do You want to set database '{dbname}' OFFLINE on server '{servername}'?", ConsoleColor.Yellow);
  725 + ColorConsole.WriteLine($" SQL connection string: {sqlcs}", ConsoleColor.Yellow);
  726 + ColorConsole.WriteLine($" Server/database: {servername}/{dbname}", ConsoleColor.Yellow);
  727 + var yesorno = ColorConsole.ReadLine("Set offline?", ConsoleColor.Yellow, validitylist: new List<string> { "yes", "no" }, defaultvalue: "yes");
  728 + return (yesorno.ToUpper() == "EX", yesorno.ToUpper() == "YES");
  729 + }
  730 + private static (bool,bool) YesOrNo_ServerLogin(string sqlcs,string[] usernamelist)
  731 + {
  732 + ColorConsole.WriteLine($"Do You want to create the following mandatory server logins?", ConsoleColor.Yellow);
  733 + ColorConsole.WriteLine($" SQL connection string: {sqlcs}", ConsoleColor.Yellow);
  734 + ColorConsole.WriteLine($" Server: {SQLDataBaseManagerCore.GetDataSource(sqlcs)}", ConsoleColor.Yellow);
  735 + ColorConsole.WriteLine($" Username list: " + string.Join(",", usernamelist), ConsoleColor.Yellow);
  736 + var yesorno = ColorConsole.ReadLine("Create login?", ConsoleColor.Yellow, validitylist: new List<string> { "yes", "no" }, defaultvalue: "yes");
  737 + return (yesorno.ToUpper() == "EX", yesorno.ToUpper() == "YES");
723 } 738 }
724 #endregion MoveDbToRemoteServer 739 #endregion MoveDbToRemoteServer
725 740
@@ -1153,7 +1168,8 @@ GO @@ -1153,7 +1168,8 @@ GO
1153 if (restoredbname.ToUpper() == "EX") { continue; } 1168 if (restoredbname.ToUpper() == "EX") { continue; }
1154 else if (string.IsNullOrWhiteSpace(restoredbname)) { restoredbname = sqld.DBName; } 1169 else if (string.IsNullOrWhiteSpace(restoredbname)) { restoredbname = sqld.DBName; }
1155 ColorConsole.WriteLine("Enter the path for the DB physical files.", ConsoleColor.Yellow); 1170 ColorConsole.WriteLine("Enter the path for the DB physical files.", ConsoleColor.Yellow);
1156 - ColorConsole.WriteLine(sqld.PhysicalFilesDirectoryPath, ConsoleColor.Yellow, prefix: $" Empty=current location of source DB: ", bracket: "[]"); 1171 + var PhysicalFilesDirectoryPathcolor = sqld.PhysicalFilesDirectoryPath.StartsWith("ERR") ? ConsoleColor.Red : ConsoleColor.Yellow;
  1172 + ColorConsole.WriteLine(sqld.PhysicalFilesDirectoryPath, PhysicalFilesDirectoryPathcolor, prefix: $" Empty=current location of source DB: ", bracket: "[]");
1157 ColorConsole.WriteLine(SQLDataBaseManagerCore.GetServerDefaultPhysicalDATFileLocation(sqld.SQLCS)??"???", ConsoleColor.Yellow,prefix: $" DEFAULT= sql server default location.",bracket:"[]"); 1173 ColorConsole.WriteLine(SQLDataBaseManagerCore.GetServerDefaultPhysicalDATFileLocation(sqld.SQLCS)??"???", ConsoleColor.Yellow,prefix: $" DEFAULT= sql server default location.",bracket:"[]");
1158 var targetdirectory = ColorConsole.ReadLine($"Enter the target path.EX=exit.", ConsoleColor.Yellow, suffix: " --> "); 1174 var targetdirectory = ColorConsole.ReadLine($"Enter the target path.EX=exit.", ConsoleColor.Yellow, suffix: " --> ");
1159 if (targetdirectory.ToUpper() == "EX") { continue; } 1175 if (targetdirectory.ToUpper() == "EX") { continue; }
@@ -1224,13 +1240,15 @@ GO @@ -1224,13 +1240,15 @@ GO
1224 } 1240 }
1225 else if (lineix == 3) 1241 else if (lineix == 3)
1226 { 1242 {
1227 - ColorConsole.Write($"{st.PhysicalFilesDirectoryPath}", ConsoleColor.Yellow, prefix: "DB files physical location:", suffix: " "); 1243 + var PhysicalFilesDirectoryPathcolor = st.PhysicalFilesDirectoryPath.StartsWith("ERR") ? ConsoleColor.Red : ConsoleColor.Yellow;
  1244 + ColorConsole.Write($"{st.PhysicalFilesDirectoryPath}", PhysicalFilesDirectoryPathcolor, prefix: "DB files physical location:", suffix: " ");
1228 ColorConsole.WriteLine(" "); 1245 ColorConsole.WriteLine(" ");
1229 return " "; 1246 return " ";
1230 } 1247 }
1231 else if (lineix == 4) 1248 else if (lineix == 4)
1232 { 1249 {
1233 - ColorConsole.Write(st.SizeString, ConsoleColor.Yellow, prefix: "DB size:", suffix: " "); 1250 + var SizeStringcolor = st.SizeString.StartsWith("ERR") ? ConsoleColor.Red : ConsoleColor.Yellow;
  1251 + ColorConsole.Write(st.SizeString, SizeStringcolor, prefix: "DB size:", suffix: " ");
1234 ColorConsole.WriteLine(" "); 1252 ColorConsole.WriteLine(" ");
1235 return " "; 1253 return " ";
1236 } 1254 }
@@ -1253,6 +1271,12 @@ GO @@ -1253,6 +1271,12 @@ GO
1253 #region class SQLDataBaseManager 1271 #region class SQLDataBaseManager
1254 public static class SQLDataBaseManagerCore 1272 public static class SQLDataBaseManagerCore
1255 { 1273 {
  1274 + /// <summary>
  1275 + /// Egy adatbázis fizikai file-jainak mozgatása egy másik lokációba
  1276 + /// </summary>
  1277 + /// <param name="sqld"></param>
  1278 + /// <param name="targetdirectory"></param>
  1279 + /// <param name="restoredbname"></param>
1256 public static void RelocatePhysicalFiles(SQLDataBase sqld, string targetdirectory, string restoredbname) 1280 public static void RelocatePhysicalFiles(SQLDataBase sqld, string targetdirectory, string restoredbname)
1257 { 1281 {
1258 var dbbackupfilepath = CreateBackup(sqld, false,null); 1282 var dbbackupfilepath = CreateBackup(sqld, false,null);
@@ -1260,6 +1284,52 @@ GO @@ -1260,6 +1284,52 @@ GO
1260 RestoreBackup(sqld, dbbackupfilepath, targetdirectory, false, restoredbname); 1284 RestoreBackup(sqld, dbbackupfilepath, targetdirectory, false, restoredbname);
1261 if (File.Exists(dbbackupfilepath)) { File.Delete(dbbackupfilepath); } 1285 if (File.Exists(dbbackupfilepath)) { File.Delete(dbbackupfilepath); }
1262 } 1286 }
  1287 +
  1288 + /// <summary>
  1289 + /// Egy adatbázis átmozgatása egy távoli szerverre
  1290 + /// </summary>
  1291 + /// <param name="dbfrom"></param>
  1292 + /// <param name="dbto"></param>
  1293 + /// <param name="selecteddbname"></param>
  1294 + /// <param name="emulation"></param>
  1295 + /// <returns></returns>
  1296 + public static bool MoveDbToRemoteServer(SQLDataBase dbfrom, SQLDataBase dbto, string selecteddbname, bool emulation)
  1297 + {
  1298 + //backup dbfrom
  1299 + var DateTimeNow = DateTime.Now;
  1300 + var backupfileFullname = SQLDataBaseManagerCore.CreateBackup(dbfrom, false, DateTimeNow, emulation);
  1301 + //move dbfrom to tranit area
  1302 +
  1303 + if (!emulation && !File.Exists(backupfileFullname)) { return false; }
  1304 +
  1305 + string backupfileFilename = null;
  1306 + string tranzitfileFullname = null;
  1307 + try
  1308 + {
  1309 + backupfileFilename = Path.GetFileName(backupfileFullname);
  1310 + tranzitfileFullname = Path.Combine(dbto.Xml_TranzitDirectoryPath, backupfileFilename);
  1311 + ColorConsole.WriteLine($"Moving backup file {backupfileFullname} to tranzit location: {dbto.Xml_TranzitDirectoryPath}", ConsoleColor.Yellow);
  1312 + if (!emulation)
  1313 + {
  1314 + if (File.Exists(tranzitfileFullname)) { File.Delete(tranzitfileFullname); }
  1315 + File.Move(backupfileFullname, tranzitfileFullname);
  1316 + ColorConsole.WriteLine($"...completed...", ConsoleColor.Yellow);
  1317 + }
  1318 + }
  1319 + catch (Exception ex)
  1320 + {
  1321 + ColorConsole.WriteLine($"Moving file FAILED!", ConsoleColor.Red);
  1322 + ColorConsole.WriteLine(ex.MessageNested(), ConsoleColor.Red);
  1323 + return false;
  1324 + }
  1325 + if (!emulation && !File.Exists(tranzitfileFullname)) { return false; }
  1326 +
  1327 + //restore backup to dbto
  1328 + tranzitfileFullname = Path.Combine(dbto.Xml_TranzitDirectoryPath, backupfileFilename);
  1329 + SQLDataBaseManagerCore.RestoreBackup(dbto, tranzitfileFullname, dbto.Xml_PhysicalFilesDirectoryPath, false, selecteddbname, emulation);
  1330 + return true;
  1331 + }
  1332 +
1263 /// <summary> 1333 /// <summary>
1264 /// Restores database backup (zipped or normal) 1334 /// Restores database backup (zipped or normal)
1265 /// </summary> 1335 /// </summary>
@@ -1316,18 +1386,23 @@ GO @@ -1316,18 +1386,23 @@ GO
1316 smoRestore.PercentCompleteNotification = 1; 1386 smoRestore.PercentCompleteNotification = 1;
1317 var backupdevice = new BackupDeviceItem(normalbackupfilepath, DeviceType.File); 1387 var backupdevice = new BackupDeviceItem(normalbackupfilepath, DeviceType.File);
1318 smoRestore.Devices.Add(backupdevice); 1388 smoRestore.Devices.Add(backupdevice);
1319 - smoRestore.Database = string.IsNullOrWhiteSpace(restoretodbname)  
1320 - ? smoRestore.ReadBackupHeader(sqlserver).Rows[0]["DatabaseName"].ToString()  
1321 - : restoretodbname;  
1322 - 1389 + smoRestore.Database = restoretodbname;
  1390 + if (string.IsNullOrWhiteSpace(smoRestore.Database))
  1391 + {
  1392 + smoRestore.Database = smoRestore.ReadBackupHeader(sqlserver).Rows[0]["DatabaseName"].ToString();
  1393 + ColorConsole.WriteLine($"ReadBackupHeader completed. Database name in backup header:{smoRestore.Database}", ConsoleColor.Yellow);
  1394 + }
1323 1395
1324 var dbfilelist = smoRestore.ReadFileList(sqlserver); 1396 var dbfilelist = smoRestore.ReadFileList(sqlserver);
  1397 + ColorConsole.WriteLine($"ReadFileList completed.", ConsoleColor.Yellow);
1325 var smorestoreDATfile = new RelocateFile(); 1398 var smorestoreDATfile = new RelocateFile();
1326 string targetdbphysicalfilesdirectorypathDAT = targetdbphysicalfilesdirectorypath; 1399 string targetdbphysicalfilesdirectorypathDAT = targetdbphysicalfilesdirectorypath;
1327 if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathDAT)) { targetdbphysicalfilesdirectorypathDAT = sqlserver.DefaultFile; } 1400 if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathDAT)) { targetdbphysicalfilesdirectorypathDAT = sqlserver.DefaultFile; }
1328 if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathDAT)) { targetdbphysicalfilesdirectorypathDAT = sqlserver.MasterDBPath; } 1401 if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathDAT)) { targetdbphysicalfilesdirectorypathDAT = sqlserver.MasterDBPath; }
1329 smorestoreDATfile.PhysicalFileName = Path.Combine(targetdbphysicalfilesdirectorypathDAT, smoRestore.Database + "_Data.mdf"); 1402 smorestoreDATfile.PhysicalFileName = Path.Combine(targetdbphysicalfilesdirectorypathDAT, smoRestore.Database + "_Data.mdf");
1330 smorestoreDATfile.LogicalFileName = dbfilelist.Select("Type='D'")[0]["LogicalName"].ToString(); 1403 smorestoreDATfile.LogicalFileName = dbfilelist.Select("Type='D'")[0]["LogicalName"].ToString();
  1404 + ColorConsole.WriteLine($"DAT PhysicalFileName to relocate: {smorestoreDATfile.PhysicalFileName}", ConsoleColor.Yellow);
  1405 + ColorConsole.WriteLine($"DAT LogicalFileName to relocate: {smorestoreDATfile.LogicalFileName}", ConsoleColor.Yellow);
1331 smoRestore.RelocateFiles.Add(smorestoreDATfile); 1406 smoRestore.RelocateFiles.Add(smorestoreDATfile);
1332 1407
1333 var smorestoreLOGfile = new RelocateFile(); 1408 var smorestoreLOGfile = new RelocateFile();
@@ -1336,6 +1411,8 @@ GO @@ -1336,6 +1411,8 @@ GO
1336 if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathLOG)) { targetdbphysicalfilesdirectorypathLOG = sqlserver.MasterDBLogPath; } 1411 if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathLOG)) { targetdbphysicalfilesdirectorypathLOG = sqlserver.MasterDBLogPath; }
1337 smorestoreLOGfile.PhysicalFileName = Path.Combine(targetdbphysicalfilesdirectorypathLOG, smoRestore.Database + "_Log.ldf"); 1412 smorestoreLOGfile.PhysicalFileName = Path.Combine(targetdbphysicalfilesdirectorypathLOG, smoRestore.Database + "_Log.ldf");
1338 smorestoreLOGfile.LogicalFileName = dbfilelist.Select("Type='L'")[0]["LogicalName"].ToString(); 1413 smorestoreLOGfile.LogicalFileName = dbfilelist.Select("Type='L'")[0]["LogicalName"].ToString();
  1414 + ColorConsole.WriteLine($"LOG PhysicalFileName to relocate: {smorestoreLOGfile.PhysicalFileName}", ConsoleColor.Yellow);
  1415 + ColorConsole.WriteLine($"LOG LogicalFileName to relocate: {smorestoreLOGfile.LogicalFileName}", ConsoleColor.Yellow);
1339 smoRestore.RelocateFiles.Add(smorestoreLOGfile); 1416 smoRestore.RelocateFiles.Add(smorestoreLOGfile);
1340 1417
1341 GetExclusiveUse(smoRestore.Database, sqlserver, sc); 1418 GetExclusiveUse(smoRestore.Database, sqlserver, sc);
@@ -1469,7 +1546,6 @@ GO @@ -1469,7 +1546,6 @@ GO
1469 ColorConsole.Write($"Completed: {e.Percent}%. {e.Message}"); 1546 ColorConsole.Write($"Completed: {e.Percent}%. {e.Message}");
1470 } 1547 }
1471 1548
1472 - #region private methods  
1473 public static List<FileInfo> GetBackupFilePathList(SQLDataBase sqld) 1549 public static List<FileInfo> GetBackupFilePathList(SQLDataBase sqld)
1474 { 1550 {
1475 var filenamemask = Path.GetFileNameWithoutExtension(sqld.Xml_BackupFileNameMask); 1551 var filenamemask = Path.GetFileNameWithoutExtension(sqld.Xml_BackupFileNameMask);
@@ -1619,6 +1695,17 @@ GO @@ -1619,6 +1695,17 @@ GO
1619 } 1695 }
1620 finally { sqlserver?.ConnectionContext.SqlConnectionObject.Dispose(); } 1696 finally { sqlserver?.ConnectionContext.SqlConnectionObject.Dispose(); }
1621 } 1697 }
  1698 + public static void CreateServerLogins(bool emulation, string sqlcs, string[] usernamelist,string[] loginrolelist, string[] fullaccessrolelist)
  1699 + {
  1700 + foreach (var username in usernamelist)
  1701 + {
  1702 + ColorConsole.WriteLine(username, ConsoleColor.Yellow, prefix: nameof(SQLDataBaseManagerCore.CreateUser) + ":");
  1703 + try { if (!emulation) SQLDataBaseManagerCore.CreateLogin(sqlcs, username, null, "master", LoginType.WindowsUser, loginrolelist); }
  1704 + catch (Exception ex) { ColorConsole.WriteLine(nameof(SQLDataBaseManagerCore.CreateLogin) + ">>>: " + ex.MessageNested(), ConsoleColor.Red); }
  1705 + try { if (!emulation) SQLDataBaseManagerCore.CreateUser(sqlcs, username, string.Join(",", fullaccessrolelist), "w"); }
  1706 + catch (Exception ex) { ColorConsole.WriteLine(nameof(SQLDataBaseManagerCore.CreateUser) + "\n" + ex.MessageNested(), ConsoleColor.Red); }
  1707 + }
  1708 + }
1622 1709
1623 public static void ConfigureWindowsUser(string cs, string sapassword, string databasename, string windowsfullusername,string windowsuserpassword,List<string> rolenamelist) 1710 public static void ConfigureWindowsUser(string cs, string sapassword, string databasename, string windowsfullusername,string windowsuserpassword,List<string> rolenamelist)
1624 { 1711 {
@@ -1699,15 +1786,33 @@ GO @@ -1699,15 +1786,33 @@ GO
1699 } 1786 }
1700 public static void GetExclusiveUse(string databasename,Server sqlserver,SqlConnection sc) 1787 public static void GetExclusiveUse(string databasename,Server sqlserver,SqlConnection sc)
1701 { 1788 {
1702 - try { sqlserver.KillAllProcesses(databasename); } 1789 + try
  1790 + {
  1791 + sqlserver.KillAllProcesses(databasename);
  1792 + ColorConsole.WriteLine($"{nameof(GetExclusiveUse)}/KillAllProcesses completed.", ConsoleColor.Yellow);
  1793 + }
1703 catch (Exception ex) { ColorConsole.WriteLine($"{nameof(GetExclusiveUse)}/{nameof(Server.KillAllProcesses)}>>>:" + ex.MessageNested(), ConsoleColor.Red); } 1794 catch (Exception ex) { ColorConsole.WriteLine($"{nameof(GetExclusiveUse)}/{nameof(Server.KillAllProcesses)}>>>:" + ex.MessageNested(), ConsoleColor.Red); }
1704 1795
1705 SqlCommand sqlcommand = null; 1796 SqlCommand sqlcommand = null;
1706 - try { sqlcommand = new SqlCommand($"ALTER DATABASE {databasename} SET Single_User WITH Rollback IMMEDIATE", sc); sqlcommand.ExecuteNonQuery(); } 1797 + try
  1798 + {
  1799 + var cmd = $"ALTER DATABASE {databasename} SET Single_User WITH Rollback IMMEDIATE";
  1800 + sqlcommand = new SqlCommand(cmd, sc); sqlcommand.ExecuteNonQuery();
  1801 + ColorConsole.WriteLine($"{nameof(GetExclusiveUse)}/{nameof(SqlCommand.ExecuteNonQuery)}/\"{cmd}\" completed.", ConsoleColor.Yellow);
  1802 + }
1707 catch (Exception ex) { ColorConsole.WriteLine($"{nameof(GetExclusiveUse)}/{nameof(SqlCommand.ExecuteNonQuery)}>>>: " + ex.MessageNested(), ConsoleColor.Red); } 1803 catch (Exception ex) { ColorConsole.WriteLine($"{nameof(GetExclusiveUse)}/{nameof(SqlCommand.ExecuteNonQuery)}>>>: " + ex.MessageNested(), ConsoleColor.Red); }
1708 finally { sqlcommand?.Dispose(); } 1804 finally { sqlcommand?.Dispose(); }
1709 } 1805 }
1710 1806
  1807 + public static void SetDatabaseOffline(string sqlcs, string dbname=null)
  1808 + {
  1809 + dbname = dbname ?? SQLDataBaseManagerCore.GetDBName(sqlcs);
  1810 + var sc = ServerConnectionPool.GetSqlConnection(sqlcs, "master");
  1811 + var cmd = $"ALTER DATABASE {dbname} SET OFFLINE WITH ROLLBACK IMMEDIATE";
  1812 + //var cmd = $"ALTER DATABASE {dbname ?? SQLDataBaseManagerCore.GetDBName(sqlcs)} SET ONLINE";
  1813 + var sqlcommand = new SqlCommand(cmd, sc); sqlcommand.ExecuteNonQuery();
  1814 + }
  1815 +
1711 public static string GetServerDefaultPhysicalDATFileLocation(string cs) 1816 public static string GetServerDefaultPhysicalDATFileLocation(string cs)
1712 { 1817 {
1713 Server sqlserver = null; 1818 Server sqlserver = null;
@@ -2186,7 +2291,6 @@ GO @@ -2186,7 +2291,6 @@ GO
2186 } 2291 }
2187 } 2292 }
2188 #endregion BackupSqlData 2293 #endregion BackupSqlData
2189 - #endregion private methods  
2190 } 2294 }
2191 #endregion class SQLDataBaseManager 2295 #endregion class SQLDataBaseManager
2192 2296
@@ -2263,7 +2367,7 @@ GO @@ -2263,7 +2367,7 @@ GO
2263 try 2367 try
2264 { 2368 {
2265 GetPhysicalFilesLocationAndSize(this.SQLCS, out this.SizeString, out this.PhysicalFilesDirectoryPath); 2369 GetPhysicalFilesLocationAndSize(this.SQLCS, out this.SizeString, out this.PhysicalFilesDirectoryPath);
2266 - this.Status = this.PhysicalFilesDirectoryPath=="ERR" ? SQLDBStatus.NoAccess : SQLDBStatus.OK; 2370 + this.Status = this.PhysicalFilesDirectoryPath.StartsWith("ERR") ? SQLDBStatus.NoAccess : SQLDBStatus.OK;
2267 this.DBName = SQLDataBaseManagerCore.GetDBName(this.SQLCS); 2371 this.DBName = SQLDataBaseManagerCore.GetDBName(this.SQLCS);
2268 this.DataSource = SQLDataBaseManagerCore.GetDataSource(this.SQLCS); 2372 this.DataSource = SQLDataBaseManagerCore.GetDataSource(this.SQLCS);
2269 } 2373 }
@@ -2305,7 +2409,7 @@ GO @@ -2305,7 +2409,7 @@ GO
2305 } 2409 }
2306 dbsizetext = dbsizetext ?? "N/A"; 2410 dbsizetext = dbsizetext ?? "N/A";
2307 } 2411 }
2308 - catch { } 2412 + catch (Exception ex) {dbsizetext = $"ERROR! {nameof(GetPhysicalFilesLocationAndSize)} getting size." + ex.MessageNested() + $" sqlconnectionstring:{sqlconnectionstring}";}
2309 2413
2310 try 2414 try
2311 { 2415 {
@@ -2322,10 +2426,14 @@ GO @@ -2322,10 +2426,14 @@ GO
2322 var result = SQLDataBaseManagerCore.ExecuteSQLScript(sqlc, scripttext, commandtimeout, vars); 2426 var result = SQLDataBaseManagerCore.ExecuteSQLScript(sqlc, scripttext, commandtimeout, vars);
2323 if (result.ReturnValue != 0) { dbpathtext = Path.GetDirectoryName(result.ReturnMessage); } 2427 if (result.ReturnValue != 0) { dbpathtext = Path.GetDirectoryName(result.ReturnMessage); }
2324 } 2428 }
2325 - catch { } 2429 + catch (Exception ex) {dbpathtext =$"ERROR! {nameof(GetPhysicalFilesLocationAndSize)} getting location." + ex.MessageNested() + $" sqlconnectionstring:{sqlconnectionstring}";}
2326 sqlc.Close(); 2430 sqlc.Close();
2327 } 2431 }
2328 - catch { } 2432 + catch (Exception ex)
  2433 + {
  2434 + dbpathtext = $"ERROR! {nameof(GetPhysicalFilesLocationAndSize)}." + ex.MessageNested() + $" sqlconnectionstring:{sqlconnectionstring}";
  2435 + dbsizetext = null;
  2436 + }
2329 dbsizetext = dbsizetext ?? "ERR"; 2437 dbsizetext = dbsizetext ?? "ERR";
2330 dbpathtext = dbpathtext ?? "ERR"; 2438 dbpathtext = dbpathtext ?? "ERR";
2331 } 2439 }
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.29.1.0")]  
36 -[assembly: AssemblyFileVersion("1.29.1.0")] 35 +[assembly: AssemblyVersion("1.29.2.0")]
  36 +[assembly: AssemblyFileVersion("1.29.2.0")]