Commit 8d42e5c0d05ca724d43eb307f7f829993f986778

Authored by Schwirg László
1 parent 71ae70b0

v1.23.0

Vrh.Log4Pro.MaintenanceConsole/Manager - SQLDataBaseManager.cs
... ... @@ -251,7 +251,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
251 251 foreach (var s in sqld.Xml_SQLScriptList)
252 252 {
253 253 ColorConsole.Write(s.Key, ConsoleColor.Yellow, bracket: "[]",suffix:" ",prefix: " ");
254   - ColorConsole.Write($"{s.Description} ({s.Name})", ConsoleColor.Yellow, prefix: "Script:");
  254 + var fromfile = string.IsNullOrWhiteSpace(s.FilePath) ? "": $",from:{s.FilePath}";
  255 + ColorConsole.Write($"{s.Description} ({s.Name}{fromfile})", ConsoleColor.Yellow, prefix: "Script:");
255 256 ColorConsole.WriteLine();
256 257 vlist.Add(s.Key);
257 258 }
... ... @@ -260,9 +261,21 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
260 261 if (scriptkey.ToUpper() == "EX") { return o; }
261 262 SQLDataBase.SQLScript ss = sqld.Xml_SQLScriptList.FirstOrDefault(s=>s.Key==scriptkey);
262 263 if (!Tools.ResolveArguments(ss.ArgumentParameters, ss.ScriptText,out string ssScriptText)) { return o; }
263   - ColorConsole.WriteLine(ssScriptText);
264   - //SQLDataBaseManagerCore.ExecuteSQLScript(sqld.SQLCS, ssScriptText, ss.CommandTimeout, null);
265   - ColorConsole.WriteLine($"Script executed. Name:{sqld.DBName}, script name: {ss.Name}", ConsoleColor.Green);
  264 + if (ss.ScriptText == null)
  265 + {
  266 + ColorConsole.WriteLine($"Nothing to execute!. Check script definition entry!", ConsoleColor.Red);
  267 + }
  268 + else
  269 + {
  270 + ColorConsole.WriteLine(ssScriptText);
  271 + var confirm = ColorConsole.ReadLine("Enter CONFIRM to start! [EX]=exit.", ConsoleColor.Yellow, prefix:" ", suffix: " --> ", validitylist: new List<string>() {"CONFIRM"});
  272 + if (confirm == "CONFIRM")
  273 + {
  274 + SQLDataBaseManagerCore.ExecuteSQLScript(sqld.SQLCS, ssScriptText, ss.CommandTimeout, null);
  275 + ColorConsole.WriteLine($"Script executed. Name:{sqld.DBName}, script name: {ss.Name}", ConsoleColor.Green);
  276 + }
  277 + else {ColorConsole.WriteLine($"Script was NOT executed!", ConsoleColor.Red);}
  278 + }
266 279 }
267 280 }
268 281 catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }
... ... @@ -361,15 +374,15 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
361 374 private static Menu DisplaySQLDataBaseMenu(SQLDataBaseManagerXmlProcessor config = null, string prompt = null, bool silent = false, Menu.SelectionMode selectionmode = Menu.SelectionMode.Multi)
362 375 {
363 376 if (config == null) { config = new SQLDataBaseManagerXmlProcessor(XMLCONNECTIONSTRING, "", "hu-HU"); }
364   - List<SQLDataBase> schtskdefList = config.GetDefinitionList();
  377 + List<SQLDataBase> defList = config.GetDefinitionList();
365 378 var menufct = new Menu("SQL Databases", prompt)
366 379 .SetMenuItemDisplayer(DisplayDataBaseInfo)
367 380 .SetSelectionMode(selectionmode);
368 381 menufct.ClearMenuItemList();
369   - foreach (var schtskdef in schtskdefList)
  382 + foreach (var def in defList)
370 383 {
371   - var st = SQLDataBaseManagerCore.CollectDataBaseInfo(schtskdef);
372   - menufct.AddMenuItem(new Menu.Item(schtskdef.Xml_Key, null, null, new Menu.ExecutorParameter(pars: st)));
  384 + var st = SQLDataBaseManagerCore.CollectDataBaseInfo(def);
  385 + menufct.AddMenuItem(new Menu.Item(def.Xml_Key, null, null, new Menu.ExecutorParameter(pars: st)));
373 386 }
374 387 if (!silent) { menufct.DisplayItems(1); }
375 388 return menufct;
... ... @@ -406,7 +419,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
406 419 }
407 420 else if (lineix == 3)
408 421 {
409   - var phypath = SQLDataBaseManagerCore.GetPhysicalFilesLocation(st.SQLCS);
  422 + var phypath = (SQLDataBaseManagerCore.GetPhysicalFilesLocation(st.SQLCS))??"ERR";
410 423 ColorConsole.Write($"{phypath}", ConsoleColor.Yellow, prefix: "DB files physical location:", suffix: " ");
411 424 ColorConsole.WriteLine(" ");
412 425 return " ";
... ... @@ -440,11 +453,22 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
440 453 #region public CollectDataBaseInfo
441 454 public static SQLDataBase CollectDataBaseInfo(SQLDataBase sqld)
442 455 {
443   - sqld.Status = GetStatus(sqld.SQLCS);
444   - sqld.PhysicalFilesDirectoryPath = GetPhysicalFilesLocation(sqld.SQLCS);
445   - sqld.DBName = GetDBName(sqld.SQLCS);
446   - sqld.DataSource = GetDataSource(sqld.SQLCS);
447   - sqld.SizeString = GetSize(sqld.SQLCS);
  456 + try
  457 + {
  458 + sqld.Status = GetStatus(sqld.SQLCS);
  459 + sqld.PhysicalFilesDirectoryPath = (GetPhysicalFilesLocation(sqld.SQLCS))??"";
  460 + sqld.DBName = GetDBName(sqld.SQLCS);
  461 + sqld.DataSource = GetDataSource(sqld.SQLCS);
  462 + sqld.SizeString = GetSize(sqld.SQLCS);
  463 + }
  464 + catch
  465 + {
  466 + sqld.Status = SQLDBStatus.NoAccess;
  467 + sqld.PhysicalFilesDirectoryPath = "";
  468 + sqld.DBName = GetDBName(sqld.SQLCS);
  469 + sqld.DataSource = GetDataSource(sqld.SQLCS);
  470 + sqld.SizeString = "";
  471 + }
448 472 return sqld;
449 473 }
450 474 #endregion public CollectDataBaseInfo
... ... @@ -661,7 +685,13 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
661 685 public enum SQLDBStatus { NoAccess, OK, }
662 686 public static SQLDBStatus GetStatus(string cs)
663 687 {
664   - try { var s = GetPhysicalFilesLocation(cs); if (s == null) { throw new Exception(); }; return SQLDBStatus.OK; } catch { return SQLDBStatus.NoAccess; }
  688 + try
  689 + {
  690 + var s = GetPhysicalFilesLocation(cs);
  691 + if (s == null) { throw new Exception(); };
  692 + return SQLDBStatus.OK;
  693 + }
  694 + catch { return SQLDBStatus.NoAccess; }
665 695 }
666 696 public static Server SQLServerConnect(string sqlconnectionstring)
667 697 {
... ... @@ -693,26 +723,30 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
693 723 /// <returns></returns>
694 724 public static string GetSize(string sqlconnectionstring)
695 725 {
696   - var sqlc = new Microsoft.Data.SqlClient.SqlConnection(sqlconnectionstring);
697   - var dbname = GetDBName(sqlconnectionstring);
  726 + try
  727 + {
  728 + var sqlc = new Microsoft.Data.SqlClient.SqlConnection(sqlconnectionstring);
  729 + var dbname = GetDBName(sqlconnectionstring);
698 730  
699   - var getsizecmd = new Microsoft.Data.SqlClient.SqlCommand ("sp_spaceused", sqlc);
700   - getsizecmd.CommandType = System.Data.CommandType.StoredProcedure;
701   - sqlc.Open();
702   - var reader = getsizecmd.ExecuteReader();
  731 + var getsizecmd = new Microsoft.Data.SqlClient.SqlCommand("sp_spaceused", sqlc);
  732 + getsizecmd.CommandType = System.Data.CommandType.StoredProcedure;
  733 + sqlc.Open();
  734 + var reader = getsizecmd.ExecuteReader();
703 735  
704   - if (reader.HasRows)
705   - {
706   - while (reader.Read())
  736 + if (reader.HasRows)
707 737 {
708   - var dbn = reader["database_name"];
709   - var dbs = reader["database_size"];
710   - if (Convert.ToString(dbn) == dbname) { return Convert.ToString(dbs); };
  738 + while (reader.Read())
  739 + {
  740 + var dbn = reader["database_name"];
  741 + var dbs = reader["database_size"];
  742 + if (Convert.ToString(dbn) == dbname) { return Convert.ToString(dbs); };
  743 + }
711 744 }
  745 + sqlc.Close();
  746 + sqlc.Dispose();
  747 + return "N/A";
712 748 }
713   - sqlc.Close();
714   - sqlc.Dispose();
715   - return "N/A";
  749 + catch { return "ERR"; }
716 750 }
717 751 #endregion GetSize
718 752  
... ... @@ -724,18 +758,22 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
724 758 /// <returns>the path, or null, if any error occurs</returns>
725 759 public static string GetPhysicalFilesLocation(string sqlconnectionstring)
726 760 {
727   - int commandtimeout = 5000;
728   - string scripttext = "";
729   - scripttext += " DECLARE @physicalpath varchar(1000) = NULL;";
730   - scripttext += " SELECT @physicalpath = f.physical_name";
731   - scripttext += " FROM sys.master_files as f inner join sys.databases as d on f.database_id = d.database_id";
732   - scripttext += " where d.name = '{DATABASE}' and f.type_desc = 'ROWS';";
733   - scripttext += " SELECT 1 AS RETURNCODE, @physicalpath AS RETURNMESSAGE;";
734   - var vars = new Dictionary<string, string>();
735   - vars.Add(nameof(DBSubstitutionName.DATABASE), GetDBName(sqlconnectionstring));
736   - vars.Add(nameof(DBSubstitutionName.DATASOURCE), "");
737   - var result = ExecuteSQLScript(sqlconnectionstring, scripttext, commandtimeout, vars);
738   - if (result.ReturnValue != 0) { return Path.GetDirectoryName(result.ReturnMessage); } else { return null; };
  761 + try
  762 + {
  763 + int commandtimeout = 5000;
  764 + string scripttext = "";
  765 + scripttext += " DECLARE @physicalpath varchar(1000) = NULL;";
  766 + scripttext += " SELECT @physicalpath = f.physical_name";
  767 + scripttext += " FROM sys.master_files as f inner join sys.databases as d on f.database_id = d.database_id";
  768 + scripttext += " where d.name = '{DATABASE}' and f.type_desc = 'ROWS';";
  769 + scripttext += " SELECT 1 AS RETURNCODE, @physicalpath AS RETURNMESSAGE;";
  770 + var vars = new Dictionary<string, string>();
  771 + vars.Add(nameof(DBSubstitutionName.DATABASE), GetDBName(sqlconnectionstring));
  772 + vars.Add(nameof(DBSubstitutionName.DATASOURCE), "");
  773 + var result = ExecuteSQLScript(sqlconnectionstring, scripttext, commandtimeout, vars);
  774 + if (result.ReturnValue != 0) { return Path.GetDirectoryName(result.ReturnMessage); } else { return null; };
  775 + }
  776 + catch { return null; }
739 777 }
740 778 #endregion GetPhysicalFilesLocation
741 779 #region DBSubstitution
... ... @@ -1295,6 +1333,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
1295 1333 public static class Attributes
1296 1334 {
1297 1335 public static class Name { public static class Values { public const string DEFAULT = ""; } }
  1336 + public static class File { public static class Values { public const string DEFAULT = ""; } }
1298 1337 public static class Description { public static class Values { public const string DEFAULT = ""; } }
1299 1338 public static class ScriptCommandTimeout { public static class Values { public const int DEFAULT = 10000; } }
1300 1339 public static class Parameters { public static class Values { public const string DEFAULT = ""; } }
... ... @@ -1309,6 +1348,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
1309 1348 {
1310 1349 public string Key = "";
1311 1350 public string Name = "";
  1351 + public string FilePath = "";
1312 1352 public string Description = "";
1313 1353 public string ScriptText = "";
1314 1354 public int CommandTimeout = 10000;
... ... @@ -1322,10 +1362,18 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
1322 1362  
1323 1363 Key = $"S{index}";
1324 1364 Name = GetValue(nameof(XmlStructure.SQLDataBase.Scripts.Script.Attributes.Name), sqlscriptXml, XmlStructure.SQLDataBase.Scripts.Script.Attributes.Name.Values.DEFAULT);
  1365 + FilePath = GetValue(nameof(XmlStructure.SQLDataBase.Scripts.Script.Attributes.File), sqlscriptXml, XmlStructure.SQLDataBase.Scripts.Script.Attributes.File.Values.DEFAULT);
1325 1366 Description= GetValue(nameof(XmlStructure.SQLDataBase.Scripts.Script.Attributes.Description), sqlscriptXml, XmlStructure.SQLDataBase.Scripts.Script.Attributes.Description.Values.DEFAULT);
1326 1367 Tools.ResolveArguments(ArgumentParameters, this.Name, out this.Name, interactive: false);
1327 1368 Tools.ResolveArguments(ArgumentParameters, this.Description, out this.Description, interactive: false);
1328   - ScriptText = GetValue(sqlscriptXml, XmlStructure.SQLDataBase.Scripts.Script.Values.DEFAULT);
  1369 + if (string.IsNullOrWhiteSpace(this.FilePath))
  1370 + {
  1371 + ScriptText = GetValue(sqlscriptXml, XmlStructure.SQLDataBase.Scripts.Script.Values.DEFAULT);
  1372 + }
  1373 + else
  1374 + {
  1375 + try { ScriptText = File.ReadAllText(this.FilePath); } catch { ScriptText = null; }
  1376 + }
1329 1377 CommandTimeout = GetValue(nameof(XmlStructure.SQLDataBase.Scripts.Script.Attributes.ScriptCommandTimeout), sqlscriptXml, defaultcommandtimeout);
1330 1378 }
1331 1379 }
... ...
Vrh.Log4Pro.MaintenanceConsole/Properties/AssemblyInfo.cs
... ... @@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
32 32 // You can specify all the values or you can default the Build and Revision Numbers
33 33 // by using the '*' as shown below:
34 34 // [assembly: AssemblyVersion("1.0.*")]
35   -[assembly: AssemblyVersion("1.22.3.0")]
36   -[assembly: AssemblyFileVersion("1.22.3.0")]
  35 +[assembly: AssemblyVersion("1.23.0.0")]
  36 +[assembly: AssemblyFileVersion("1.23.0.0")]
... ...
Vrh.Log4Pro.MaintenanceConsole/Tools.cs
... ... @@ -330,14 +330,17 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS
330 330 resolvedtext = stringwithparameters;
331 331 foreach (var kvp in argumentparametersdictionary)
332 332 {
333   - if (kvp.Value.StartsWith("?") && interactive)
  333 + if (kvp.Value == null) { resolveddictionary.Add(kvp.Key, "");}
  334 + else if (kvp.Value.StartsWith("?") && interactive)
334 335 {
  336 + // "?default?prompt"
335 337 string prompt = $"Enter value for {kvp.Key}:";
336 338 string kvpdefaultvalue = null;
337 339 if (kvp.Value.Length > 1)
338 340 {
339   - prompt = kvp.Value.Substring(1).Split(new char[] { '?' }, StringSplitOptions.RemoveEmptyEntries)[0];
340   - if (kvp.Value.Substring(1).IndexOf('?') != -1) kvpdefaultvalue = kvp.Value.Substring(1).Split(new char[] { '?' }, StringSplitOptions.RemoveEmptyEntries)[1];
  341 + var ppp = kvp.Value.Substring(1).Split(new char[] { '?' }, StringSplitOptions.RemoveEmptyEntries);
  342 + if (!string.IsNullOrWhiteSpace(ppp[0])) { kvpdefaultvalue = ppp[0]; };
  343 + if (kvp.Value.Substring(1).IndexOf('?') != -1) { prompt = ppp[1]; }
341 344 }
342 345 string value = ColorConsole.ReadLine(prompt, ConsoleColor.Yellow, defaultvalue: kvpdefaultvalue);
343 346 if (value.ToUpper() == "EX") { return false; }
... ...