DbBaseCommand.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Data.SqlClient;
  5. using Quadarax.Foundation.Core.Data.Extensions;
  6. using Quadarax.Foundation.Core.QConsole;
  7. using Quadarax.Foundation.Core.QConsole.Argument;
  8. using Quadarax.Foundation.Core.QConsole.Value;
  9. namespace BO.Console.Commands.Base
  10. {
  11. internal abstract class DbBaseCommand : BaseLocalCommand
  12. {
  13. #region *** Constants ***
  14. private const string ARG_SERVER_CODE = "srv";
  15. private const string ARG_SERVER_HINT = "database_server";
  16. private const string ARG_SERVER_DESC = "Sql Server name and/or instance name";
  17. private const string ARG_DB_CODE = "db";
  18. private const string ARG_DB_HINT = "database_name";
  19. private const string ARG_DB_DESC = "Database name";
  20. private const string ARG_ISEC_CODE = "isec";
  21. private const string ARG_ISEC_HINT = "is_trusted_security";
  22. private const string ARG_ISEC_DESC = "Flag if trusted security, otherwise user credentials must be specified";
  23. private const string ARG_USER_CODE = "u";
  24. private const string ARG_USER_HINT = "user_name";
  25. private const string ARG_USER_DESC = "User name to connect to databse";
  26. private const string ARG_PWD_CODE = "p";
  27. private const string ARG_PWD_HINT = "user_password";
  28. private const string ARG_PWD_DESC = "User password to connect to databse";
  29. #endregion
  30. #region *** Properties ***
  31. protected SqlConnectionStringBuilder ConnectionString => GetConnectionString();
  32. protected string ServerName => GetArgumentValueOrDefault<string>(ARG_SERVER_CODE);
  33. protected string DatabseName => GetArgumentValueOrDefault<string>(ARG_DB_CODE);
  34. #endregion
  35. #region *** Constructors ***
  36. protected DbBaseCommand(Engine engine) : base(engine)
  37. {
  38. }
  39. #endregion
  40. #region *** Overrides ***
  41. protected override IEnumerable<AbstractArgument> OnSetupArguments()
  42. {
  43. var arguments = new List<AbstractArgument>(base.OnSetupArguments());
  44. arguments.Add(new NamedArgument(ARG_SERVER_CODE, ARG_SERVER_DESC, ARG_SERVER_HINT, TypeValuesEnum.String,string.Empty,true));
  45. arguments.Add(new NamedArgument(ARG_DB_CODE, ARG_DB_DESC, ARG_DB_HINT, TypeValuesEnum.String,string.Empty,true));
  46. arguments.Add(new FlagArgument(ARG_ISEC_CODE, ARG_ISEC_DESC, ARG_ISEC_HINT, false));
  47. arguments.Add(new NamedArgument(ARG_USER_CODE, ARG_USER_DESC, ARG_USER_HINT, TypeValuesEnum.String,string.Empty,false));
  48. arguments.Add(new NamedArgument(ARG_PWD_CODE, ARG_PWD_DESC, ARG_PWD_HINT, TypeValuesEnum.String,string.Empty,false));
  49. return arguments;
  50. }
  51. protected override void OnValidateArguments()
  52. {
  53. base.OnCommandInit();
  54. if (!GetArgumentValueOrDefault(ARG_ISEC_CODE, false))
  55. {
  56. if (!GetArgument(ARG_USER_CODE).Value.HasValue)
  57. throw new ArgumentException($"Argument '{ARG_USER_CODE}' must be set with flag '{ARG_ISEC_CODE}'.", ARG_USER_CODE);
  58. if (!GetArgument(ARG_PWD_CODE).Value.HasValue)
  59. throw new ArgumentException($"Argument '{ARG_PWD_CODE}' must be set with flag '{ARG_ISEC_CODE}'.", ARG_PWD_CODE);
  60. }
  61. }
  62. #endregion
  63. #region *** Protected Operations ***
  64. protected SqlConnection OpenConnection()
  65. {
  66. WriteDebugInfo($"Opening connection [{ConnectionString.InitialCatalog}@{ConnectionString.DataSource}]...");
  67. var conn = new SqlConnection(ConnectionString.ToString());
  68. conn.Open();
  69. WriteInfo($"Connection to {ConnectionString.InitialCatalog}@{ConnectionString.DataSource} established.");
  70. return conn;
  71. }
  72. protected SqlConnection OpenMasterConnection()
  73. {
  74. var builder = ConnectionString;
  75. builder.InitialCatalog = "master";
  76. WriteDebugInfo($"Opening connection [{builder.InitialCatalog}@{builder.DataSource}]...");
  77. var conn = new SqlConnection(builder.ToString());
  78. conn.Open();
  79. WriteInfo($"Connection to {builder.InitialCatalog}@{builder.DataSource} established.");
  80. return conn;
  81. }
  82. protected virtual SqlConnectionStringBuilder GetConnectionString()
  83. {
  84. var builder = new SqlConnectionStringBuilder();
  85. builder.DataSource = GetArgumentValueOrDefault<string>(ARG_SERVER_CODE);
  86. builder.InitialCatalog = GetArgumentValueOrDefault<string>(ARG_DB_CODE);
  87. builder.IntegratedSecurity = GetArgumentValueOrDefault<bool>(ARG_ISEC_CODE);
  88. if (!builder.IntegratedSecurity)
  89. {
  90. builder.UserID = GetArgumentValueOrDefault<string>(ARG_USER_CODE);
  91. builder.Password = GetArgumentValueOrDefault<string>(ARG_PWD_CODE);
  92. }
  93. return builder;
  94. }
  95. protected bool CheckIfDbExists(SqlConnection conn,string databaseName)
  96. {
  97. var query = $"select count(*) from master.dbo.sysdatabases WHERE ('[' + name + ']' = '{databaseName}' OR name = '{databaseName}')";
  98. return conn.ExecuteScalar<int>(CommandType.Text, query) == 1;
  99. }
  100. #endregion
  101. #region *** Private Operations ***
  102. #endregion
  103. }
  104. }