DbInstallCmd.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. using System.Linq.Expressions;
  2. using Microsoft.Data.SqlClient;
  3. using Quadarax.Application.QLiberace.Base;
  4. using Quadarax.Application.QLiberace.Console.Commands.Base;
  5. using Quadarax.Foundation.Core.QConsole.Attributes;
  6. using Quadarax.Foundation.Core.QConsole;
  7. using Quadarax.Foundation.Core.QConsole.Argument;
  8. using Quadarax.Foundation.Core.QConsole.Value;
  9. using Quadarax.Foundation.Core.Value;
  10. namespace Quadarax.Application.QLiberace.Console.Commands
  11. {
  12. [CommandDefinition]
  13. internal class DbInstallCmd : DbMigrationCommand
  14. {
  15. #region *** Properties ***
  16. public override string Name => Constants.Commands.DbInstall.Name;
  17. public override string Description => Constants.Commands.DbInstall.Description;
  18. #endregion
  19. #region *** Fields ***
  20. private bool _isLatestUpdateEnabled;
  21. #endregion
  22. #region *** Constructor ***
  23. public DbInstallCmd(Engine engine) : base(engine)
  24. {
  25. }
  26. #endregion
  27. #region *** EXECUTE ***
  28. protected override Result OnExecute(QlbrcDbContext context)
  29. {
  30. WriteInfo("Ensuring database...");
  31. var resultCode = 0;
  32. // TODO: handle this exception as resultCode = 1 on context.Database.EnsureCreated()
  33. // Microsoft.Data.SqlClient.SqlException: 'A network-related or instance-specific error occurred while establishing a connection to SQL Server
  34. try
  35. {
  36. if (!context.Database.EnsureCreated())
  37. {
  38. WriteInfo("Database already exists.");
  39. resultCode = 1;
  40. }
  41. else
  42. {
  43. WriteInfo("Database created.");
  44. }
  45. if (_isLatestUpdateEnabled)
  46. {
  47. WriteInfo("Checking pending migrations.");
  48. if (CheckPendingMigrations(context))
  49. {
  50. WriteInfo("New pending migrations detected.");
  51. ApplyMigration(context);
  52. }
  53. else
  54. {
  55. WriteInfo("Nothing found.");
  56. }
  57. }
  58. }
  59. catch (SqlException e)
  60. {
  61. if (e.Message.Contains("A network-related or instance-specific error occurred while establishing a connection to SQL Server"))
  62. {
  63. WriteError(e);
  64. return new Result(10);
  65. }
  66. throw e;
  67. }
  68. return new Result(resultCode);
  69. }
  70. #endregion
  71. #region *** Private operations ***
  72. protected override void OnValidateArguments()
  73. {
  74. base.OnValidateArguments();
  75. if (ContainsArgument(Constants.Commands.DbInstall.Arguments.Latest.Name))
  76. _isLatestUpdateEnabled = GetArgumentValueOrDefault<bool>(Constants.Commands.DbInstall.Arguments.Latest.Name);
  77. }
  78. protected override IEnumerable<AbstractArgument> OnSetupArguments()
  79. {
  80. var arguments = new List<AbstractArgument>(base.OnSetupArguments());
  81. arguments.Add(new FlagArgument(Constants.Commands.DbInstall.Arguments.Latest.Name,
  82. Constants.Commands.DbInstall.Arguments.Latest.Description,
  83. Constants.Commands.DbInstall.Arguments.Latest.Hint, false));
  84. return arguments;
  85. }
  86. #endregion
  87. }
  88. }