瀏覽代碼

change BO schema 1.0.9

Finish InstallDbCommand (works, but localDB not working)
Fix mandatory validation on AbstractArgument
Dalibor Votruba 4 年之前
父節點
當前提交
ede5c10eae

+ 45 - 46
@Database/bo_create_schema.sql

@@ -1,7 +1,7 @@
--- 18.8.2021 1.0.8
--- Table User --------------------------
+-- 19.10.2021 1.0.9
+-- Table BoUser --------------------------
 --Defines User identity with statistics informations. Defines if user is enabled and/or user is system account also.
-CREATE TABLE [dbo].[User]
+CREATE TABLE [dbo].[BoUser]
 (
     [Id] [bigint] NOT NULL IDENTITY (1, 1),
     [IFReference] [varchar] (50) NOT NULL,
@@ -9,57 +9,57 @@ CREATE TABLE [dbo].[User]
     [LastLogged] [datetime] NULL,
     [LastDisabled] [datetime] NULL,
     [LastEnabled] [datetime] NULL,
-    [Created] [datetime] NOT NULL CONSTRAINT DF_User_Created DEFAULT getdate(),
+    [Created] [datetime] NOT NULL CONSTRAINT DF_BoUser_Created DEFAULT getdate(),
     [Modified] [datetime] NULL,
-    [LangLCID] [int] NOT NULL CONSTRAINT DF_User_LangLCID DEFAULT 1033,
-    [IsSystem] [bit] NOT NULL CONSTRAINT DF_User_IsSystem DEFAULT 0,
-    [IsEnabled] [bit] NOT NULL CONSTRAINT DF_User_IsEnabled DEFAULT 0,
+    [LangLCID] [int] NOT NULL CONSTRAINT DF_BoUser_LangLCID DEFAULT 1033,
+    [IsSystem] [bit] NOT NULL CONSTRAINT DF_BoUser_IsSystem DEFAULT 0,
+    [IsEnabled] [bit] NOT NULL CONSTRAINT DF_BoUser_IsEnabled DEFAULT 0,
     CONSTRAINT PK_USER_ID PRIMARY KEY (Id)	
 )
 GO
 
-EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'User primary key' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User', @level2type=N'COLUMN',@level2name=N'Id'
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'User primary key' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BoUser', @level2type=N'COLUMN',@level2name=N'Id'
 GO
 
-EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to Identity framework IdentityUser.Id' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User', @level2type=N'COLUMN',@level2name=N'IFReference'
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Reference to Identity framework IdentityUser.Id' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BoUser', @level2type=N'COLUMN',@level2name=N'IFReference'
 GO
 
-EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Full user name' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User', @level2type=N'COLUMN',@level2name=N'Name'
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Full user name' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BoUser', @level2type=N'COLUMN',@level2name=N'Name'
 GO
 
-EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp of user last successful login' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User', @level2type=N'COLUMN',@level2name=N'LastLogged'
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp of user last successful login' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BoUser', @level2type=N'COLUMN',@level2name=N'LastLogged'
 GO
 
-EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp of last user set to be disabled' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User', @level2type=N'COLUMN',@level2name=N'LastDisabled'
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp of last user set to be disabled' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BoUser', @level2type=N'COLUMN',@level2name=N'LastDisabled'
 GO
 
-EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp of last user set to be enabled' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User', @level2type=N'COLUMN',@level2name=N'LastEnabled'
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp of last user set to be enabled' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BoUser', @level2type=N'COLUMN',@level2name=N'LastEnabled'
 GO
 
-EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when user was created' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User', @level2type=N'COLUMN',@level2name=N'Created'
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when user was created' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BoUser', @level2type=N'COLUMN',@level2name=N'Created'
 GO
 
-EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when user was modified' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User', @level2type=N'COLUMN',@level2name=N'Modified'
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Timestamp when user was modified' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BoUser', @level2type=N'COLUMN',@level2name=N'Modified'
 GO
 
-EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'LCID of preffered user language' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User', @level2type=N'COLUMN',@level2name=N'LangLCID'
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'LCID of preffered user language' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BoUser', @level2type=N'COLUMN',@level2name=N'LangLCID'
 GO
 
-EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Flag if user is system only account. Cannot log in.' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User', @level2type=N'COLUMN',@level2name=N'IsSystem'
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Flag if user is system only account. Cannot log in.' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BoUser', @level2type=N'COLUMN',@level2name=N'IsSystem'
 GO
 
-EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Flag if user can sign on' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User', @level2type=N'COLUMN',@level2name=N'IsEnabled'
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Flag if user can sign on' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BoUser', @level2type=N'COLUMN',@level2name=N'IsEnabled'
 GO
 
-EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'User identity with properties' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'User'
+EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'User identity with properties' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BoUser'
 GO
 
--- Indexes of table User ------------------------------
-CREATE UNIQUE INDEX IDX_IFREFERENCE ON [dbo].[User]
+-- Indexes of table BoUser ------------------------------
+CREATE UNIQUE INDEX IDX_IFREFERENCE ON [dbo].[BoUser]
 (IFReference) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
 GO
 
-CREATE UNIQUE INDEX IDX_USER_NAME ON [dbo].[User]
+CREATE UNIQUE INDEX IDX_USER_NAME ON [dbo].[BoUser]
 (Name) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
 GO
 
@@ -1123,23 +1123,23 @@ GO
 -- References for UserWorkspace --------------------------
 ALTER TABLE [dbo].[UserWorkspace]
 ADD 
-    CONSTRAINT REL_UserWorkspace_User FOREIGN KEY (UserId) REFERENCES [dbo].[User] (Id), 
+    CONSTRAINT REL_UserWorkspace_User FOREIGN KEY (UserId) REFERENCES [dbo].[BoUser] (Id), 
     CONSTRAINT REL_UserWorkspace_Workspace FOREIGN KEY (WorkspaceId) REFERENCES [dbo].[Workspace] (Id)
 GO
 
 -- References for Workspace --------------------------
 ALTER TABLE [dbo].[Workspace]
 ADD 
-    CONSTRAINT REL_Workspace_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[User] (Id), 
-    CONSTRAINT REL_Workspace_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[User] (Id), 
+    CONSTRAINT REL_Workspace_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[BoUser] (Id), 
+    CONSTRAINT REL_Workspace_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[BoUser] (Id), 
     CONSTRAINT REL_Workspace_BillingInfo FOREIGN KEY (BillingInfoId) REFERENCES [dbo].[BillingInfo] (Id)
 GO
 
 -- References for BillingInfo --------------------------
 ALTER TABLE [dbo].[BillingInfo]
 ADD 
-    CONSTRAINT REL_BillingInfo_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[User] (Id), 
-    CONSTRAINT REL_BillingInfo_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[User] (Id), 
+    CONSTRAINT REL_BillingInfo_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[BoUser] (Id), 
+    CONSTRAINT REL_BillingInfo_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[BoUser] (Id), 
     CONSTRAINT REL_BillingInfo_Workspace FOREIGN KEY (WorkspaceId) REFERENCES [dbo].[Workspace] (Id)
 GO
 
@@ -1154,15 +1154,15 @@ GO
 ALTER TABLE [dbo].[Metadocument]
 ADD 
     CONSTRAINT REL_Metadocument_Structure FOREIGN KEY (StructureId) REFERENCES [dbo].[Structure] (Id), 
-    CONSTRAINT REL_Metadocument_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[User] (Id), 
-    CONSTRAINT REL_Metadocument_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[User] (Id), 
-    CONSTRAINT REL_Metadocument_User_Downloaded FOREIGN KEY (LastDownloadedByUserId) REFERENCES [dbo].[User] (Id)
+    CONSTRAINT REL_Metadocument_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[BoUser] (Id), 
+    CONSTRAINT REL_Metadocument_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[BoUser] (Id), 
+    CONSTRAINT REL_Metadocument_User_Downloaded FOREIGN KEY (LastDownloadedByUserId) REFERENCES [dbo].[BoUser] (Id)
 GO
 
 -- References for StatusHistory --------------------------
 ALTER TABLE [dbo].[StatusHistory]
 ADD 
-    CONSTRAINT REL_StatusHistory_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[User] (Id), 
+    CONSTRAINT REL_StatusHistory_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[BoUser] (Id), 
     CONSTRAINT REL_StatusHistory_Metadocument FOREIGN KEY (MetadocumentId) REFERENCES [dbo].[Metadocument] (Id)
 GO
 
@@ -1171,22 +1171,22 @@ ALTER TABLE [dbo].[Artifact]
 ADD 
     CONSTRAINT REL_Artifact_Metadocument FOREIGN KEY (MetadocumentId) REFERENCES [dbo].[Metadocument] (Id), 
     CONSTRAINT REL_Artifact_MimeType FOREIGN KEY (MimeTypeId) REFERENCES [dbo].[MimeType] (Id), 
-    CONSTRAINT REL_Artifact_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[User] (Id)
+    CONSTRAINT REL_Artifact_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[BoUser] (Id)
 GO
 
 -- References for MimeType --------------------------
 ALTER TABLE [dbo].[MimeType]
 ADD 
-    CONSTRAINT REL_MimeType_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[User] (Id), 
-    CONSTRAINT REL_MimeType_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[User] (Id)
+    CONSTRAINT REL_MimeType_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[BoUser] (Id), 
+    CONSTRAINT REL_MimeType_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[BoUser] (Id)
 GO
 
 -- References for Tag --------------------------
 ALTER TABLE [dbo].[Tag]
 ADD 
     CONSTRAINT REL_Tag_Workspace FOREIGN KEY (WorkspaceId) REFERENCES [dbo].[Workspace] (Id), 
-    CONSTRAINT REL_Tag_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[User] (Id), 
-    CONSTRAINT REL_Tag_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[User] (Id)
+    CONSTRAINT REL_Tag_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[BoUser] (Id), 
+    CONSTRAINT REL_Tag_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[BoUser] (Id)
 GO
 
 -- References for MetadocumentTag --------------------------
@@ -1199,8 +1199,8 @@ GO
 -- References for BillingPlan --------------------------
 ALTER TABLE [dbo].[BillingPlan]
 ADD 
-    CONSTRAINT REL_BillingPlan_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[User] (Id), 
-    CONSTRAINT REL_BillingPlan_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[User] (Id)
+    CONSTRAINT REL_BillingPlan_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[BoUser] (Id), 
+    CONSTRAINT REL_BillingPlan_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[BoUser] (Id)
 GO
 
 -- References for MetadocumentBilling --------------------------
@@ -1222,8 +1222,8 @@ ALTER TABLE [dbo].[Invoice]
 ADD 
     CONSTRAINT REL_Invoice_InvoiceIssuer FOREIGN KEY (InvoiceIssuerId) REFERENCES [dbo].[InvoiceIssuer] (Id), 
     CONSTRAINT REL_Invoice_Workspace FOREIGN KEY (WorkspaceId) REFERENCES [dbo].[Workspace] (Id), 
-    CONSTRAINT REL_Invoice_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[User] (Id), 
-    CONSTRAINT REL_Invoice_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[User] (Id)
+    CONSTRAINT REL_Invoice_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[BoUser] (Id), 
+    CONSTRAINT REL_Invoice_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[BoUser] (Id)
 GO
 
 -- References for InvoiceItem --------------------------
@@ -1231,16 +1231,15 @@ ALTER TABLE [dbo].[InvoiceItem]
 ADD 
     CONSTRAINT REL_InvoiceItem_Invoice FOREIGN KEY (InvoiceId) REFERENCES [dbo].[Invoice] (Id), 
     CONSTRAINT REL_InvoiceItem_BillingPlan FOREIGN KEY (BillingPlanId) REFERENCES [dbo].[BillingPlan] (Id), 
-    CONSTRAINT REL_InvoiceItem_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[User] (Id), 
-    CONSTRAINT REL_InvoiceItem_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[User] (Id)
+    CONSTRAINT REL_InvoiceItem_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[BoUser] (Id), 
+    CONSTRAINT REL_InvoiceItem_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[BoUser] (Id)
 GO
 
 -- References for InvoiceIssuer --------------------------
 ALTER TABLE [dbo].[InvoiceIssuer]
 ADD 
-    CONSTRAINT REL_InvoiceIssuer_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[User] (Id), 
-    CONSTRAINT REL_InvoiceIssuer_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[User] (Id)
+    CONSTRAINT REL_InvoiceIssuer_User_Created FOREIGN KEY (CreatedByUserId) REFERENCES [dbo].[BoUser] (Id), 
+    CONSTRAINT REL_InvoiceIssuer_User_Modified FOREIGN KEY (ModifiedByUserId) REFERENCES [dbo].[BoUser] (Id)
 GO
-
-EXEC sys.sp_updateextendedproperty @name=N'BO_Version', @value=N'1.0.8'
+EXEC sys.sp_updateextendedproperty @name=N'BO_Version', @value=N'1.0.9'
 GO

文件差異過大導致無法顯示
+ 181 - 145
@Documentation/BlueprintOptimizer.simp


+ 9 - 0
Common/qdr.fnd.core.qconsole/Command/Base/AbstractCommand.cs

@@ -303,6 +303,15 @@ namespace Quadarax.Foundation.Core.QConsole.Command.Base
 
         protected virtual void OnValidateArguments()
         {
+            var ex = new List<Exception>();
+            foreach (var arg in _arguments.Where(x=>x.Value.IsMandatory).Select(x=>x.Value))
+            {
+                if (!arg.Value.HasValue)
+                    ex.Add(new Exception($"Argument '{arg.Code}' is mandatory!"));
+            }
+
+            if (ex.Count > 0)
+                throw new AggregateException(ex);
         }
 
         protected virtual void OnInitialize()

+ 1 - 1
Console/Commands/Base/DbBaseCommand.cs

@@ -57,7 +57,7 @@ namespace BO.Console.Commands.Base
 
         protected override void OnValidateArguments()
         {
-            base.OnCommandInit();
+            base.OnValidateArguments();
             if (!GetArgumentValueOrDefault(ARG_ISEC_CODE, false))
             {
                 if (!GetArgument(ARG_USER_CODE).Value.HasValue)

+ 115 - 31
Console/Commands/Install/InstallDbCommand.cs

@@ -1,21 +1,28 @@
 using System;
 using System.Collections.Generic;
 using System.Data;
-using System.Linq;
+using System.Data.SqlClient;
 using System.Reflection;
 using BO.Console.Commands.Base;
 using Quadarax.Foundation.Core.Data.Extensions;
 using Quadarax.Foundation.Core.QConsole;
 using Quadarax.Foundation.Core.QConsole.Argument;
+using Quadarax.Foundation.Core.QConsole.Attributes;
 using Quadarax.Foundation.Core.QConsole.Value;
 using Quadarax.Foundation.Core.Resource.Extensions;
 using Quadarax.Foundation.Core.Value;
 
 namespace BO.Console.Commands.Install
 {
+    [CommandDefinition]
     internal class InstallDbCommand : DbBaseCommand
     {
         #region *** Constants ***
+
+        private const string DB_VERSION = "1.0.9";
+        private const string DB_PROP_NAME = "BO_Version";
+
+
         private const string CS_CMD_INSTALL_NAME = "dbinstall";
         private const string CS_CMD_INSTALL_DESCR = "install BO database from scratch (supports SqlServer, LocalDB).";
         
@@ -30,6 +37,12 @@ namespace BO.Console.Commands.Install
         private const string ARG_GROWTH_HINT = "growth";
         private const string ARG_GROWTH_DESC = "Data file growth in %";
 
+        private const string ARG_FORCE_DESC = "Flag if defined override (if exists) existing database (drop and create) with loosing data";
+
+
+        private const string VAL_LOCALDB = "(localdb)";
+        private const string VAL_NOFILE = "nofile";
+
         #endregion
 
         #region *** Properties ***
@@ -37,11 +50,16 @@ namespace BO.Console.Commands.Install
         public override string Name => CS_CMD_INSTALL_NAME;
         public override string Description => CS_CMD_INSTALL_DESCR;
 
+        public override string Notes => "For localDB (local db engine) use argument -srv:" + VAL_LOCALDB + "\\mssqllocaldb";
+
+        private Version LatestVersion { get; }
+
         #endregion
 
         #region *** Constructor ***
         public InstallDbCommand(Engine engine) : base(engine)
         {
+            LatestVersion = new Version(DB_VERSION);
         }
         #endregion
 
@@ -55,51 +73,54 @@ namespace BO.Console.Commands.Install
                 if (!CheckIfDbExists(conn, DatabseName))
                 {
                     // database not exists
-                    WriteInfo($"Database '{DatabseName}' not exists creating ...");
-                    var dataPath = GetArgumentValueOrDefault<string>(ARG_PATH_CODE).Replace("|", ":");
-                    var initSize = GetArgumentValueOrDefault<int>(ARG_ISIZE_CODE);
-                    var growth = GetArgumentValueOrDefault<int>(ARG_GROWTH_CODE);
-                    var query = $"CREATE DATABASE {DatabseName} ON PRIMARY " +
-                                $"(NAME = {DatabseName}_Data, " +
-                                $"FILENAME = '{dataPath}\\{DatabseName}.mdf', " +
-                                $"SIZE = {initSize}MB, FILEGROWTH = {growth}%) " +
-                                $"LOG ON (NAME = {DatabseName}_Log, " +
-                                $"FILENAME = '{dataPath}\\{DatabseName}.ldf', " +
-                                $"SIZE = {initSize}MB, " +
-                                $"FILEGROWTH = {growth}%)";
-                    WriteDebugInfo("Using query: " + query);
-                    var resultExecute = conn.Execute(query);
-                    WriteDebugInfo($"Create script returns: {resultExecute}");
-                    if (resultExecute == 0)
-                        throw new Exception($"Database '{DatabseName}' creating FAILED.");
-                    WriteCaption($"Database '{DatabseName}' CREATED");
-
+                    CreateDatabase(conn);
 
                     using (var connDb = OpenConnection())
                     {
-                        var script = Assembly.GetExecutingAssembly().GetEmbeddedFileContentAsString("BO.Console.Commands.Install.bo_create_schema.sql");
-                        WriteCaption($"Creating latest DB structure in '{DatabseName}'");
-                        resultExecute = conn.BatchExecute(script);
-                        WriteDebugInfo($"Deploy script returns: {resultExecute}");
-                        if (resultExecute == 0)
-                            throw new Exception($"Database '{DatabseName}' deploying FAILED.");
-
-                        var version = connDb.ExecuteScalar<string>(CommandType.Text, "select value from sys.extended_properties where NAME = 'BO_Version'");
-                        WriteCaption($"Database '{DatabseName}' updated to version '{version}'");
+                        UpdateModel(conn);    
                     }
                 }
                 else
                 {
                     // database exists
-                    WriteCaption($"Database '{DatabseName}' exists. SKIPPING");
+                    using (var connDb = OpenConnection())
+                    {
+                        var version = GetDbVersion(connDb);
+                        WriteCaption($"Database '{DatabseName}' exists (v.{version}).");
+                    }
+
+                    if (IsForce.GetValueOrDefault())
+                    {
+                        DeleteDatabase(conn);
+                        CreateDatabase(conn);
+                        using (var connDb = OpenConnection())
+                        {
+                            UpdateModel(conn);    
+                        }
+                    }
+                    else
+                    {
+                        WriteInfo($"Cancel. For force reinstall database use {Engine.Configuration.CharacterNamedArgumentSeparator}{CS_ARG_NAME_FORCE} flag.");
+                    }
                 }
             }
             return result;
         }
+
+        
         #endregion
 
-        #region *** Private operations ***
+        #region *** Private overrides ***
 
+        protected override void OnValidateArguments()
+        {
+            if (ServerName.Contains(VAL_LOCALDB))
+            {
+                var pathArg = GetArgument(ARG_PATH_CODE);
+                pathArg.Value.Set(VAL_NOFILE);
+            }
+            base.OnValidateArguments();
+        }
 
         protected override IEnumerable<AbstractArgument> OnSetupArguments()
         {
@@ -107,9 +128,72 @@ namespace BO.Console.Commands.Install
             arguments.Add(new NamedArgument(ARG_PATH_CODE, ARG_PATH_DESC, ARG_PATH_HINT, TypeValuesEnum.String, string.Empty, true));
             arguments.Add(new NamedArgument(ARG_ISIZE_CODE, ARG_ISIZE_DESC, ARG_ISIZE_HINT, TypeValuesEnum.Integer, "10", false));
             arguments.Add(new NamedArgument(ARG_GROWTH_CODE, ARG_GROWTH_DESC, ARG_GROWTH_HINT, TypeValuesEnum.Integer, "10", false));
+            AppendForceArgument(arguments,ARG_FORCE_DESC);
             return arguments;
         }
 
         #endregion
+
+        #region *** Private Operations ***
+
+        private void CreateDatabase(SqlConnection masterConnection)
+        {
+            WriteInfo($"Database '{DatabseName}' not exists creating ...");
+            var dataPath = GetArgumentValueOrDefault<string>(ARG_PATH_CODE).Replace("|", ":");
+            var initSize = GetArgumentValueOrDefault<int>(ARG_ISIZE_CODE);
+            var growth = GetArgumentValueOrDefault<int>(ARG_GROWTH_CODE);
+            var query = dataPath == VAL_NOFILE ? $"CREATE DATABASE {DatabseName} " : ($"CREATE DATABASE {DatabseName} ON PRIMARY " +
+                $"(NAME = {DatabseName}_Data, " +
+                $"FILENAME = '{dataPath}\\{DatabseName}.mdf', " +
+                $"SIZE = {initSize}MB, FILEGROWTH = {growth}%) " +
+                $"LOG ON (NAME = {DatabseName}_Log, " +
+                $"FILENAME = '{dataPath}\\{DatabseName}.ldf', " +
+                $"SIZE = {initSize}MB, " +
+                $"FILEGROWTH = {growth}%)");
+            WriteDebugInfo("Using query: " + query);
+            var resultExecute = masterConnection.Execute(query);
+            WriteDebugInfo($"Create script returns: {resultExecute}");
+            if (resultExecute == 0)
+                throw new Exception($"Database '{DatabseName}' creating FAILED.");
+            WriteCaption($"Database '{DatabseName}' CREATED");
+        }
+        private void DeleteDatabase(SqlConnection masterConnection)
+        {
+            masterConnection.BatchExecute($"ALTER DATABASE [{DatabseName}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE\nGO\nDROP DATABASE [{DatabseName}]\nGO");
+            WriteInfo($"Database '{DatabseName}' dropped.");
+        }
+
+        private Version GetDbVersion(SqlConnection dbConnection)
+        {
+            var version = dbConnection.ExecuteScalar<string>(CommandType.Text, $"select value from sys.extended_properties where NAME = '{DB_PROP_NAME}'");
+            WriteDebugInfo($"DB version get: {version}");
+            if (!string.IsNullOrEmpty(version))
+            {
+                return new Version(version);
+            }
+            return new Version();
+
+        }
+
+        private void SetDbVersion(SqlConnection dbConnection)
+        {
+            dbConnection.Execute(CommandType.Text, $"EXEC sys.sp_updateextendedproperty @name=N'{DB_PROP_NAME}', @value=N'{DB_VERSION}'");
+            WriteDebugInfo($"DB version set: {DB_VERSION}");
+        }
+
+        private void UpdateModel(SqlConnection dbConnection)
+        {
+            var script = Assembly.GetExecutingAssembly().GetEmbeddedFileContentAsString("BO.Console.Scripts.bo_create_schema.sql");
+            WriteCaption($"Creating latest DB structure in '{DatabseName}'");
+            var resultExecute = dbConnection.BatchExecute(script);
+            WriteDebugInfo($"Deploy script returns: {resultExecute}");
+            if (resultExecute == 0)
+                throw new Exception($"Database '{DatabseName}' deploying FAILED.");
+            SetDbVersion(dbConnection);
+            var version = GetDbVersion(dbConnection);
+            WriteCaption($"Database '{DatabseName}' updated to version '{version}'");
+        }
+
+        #endregion
     }
 }

+ 1 - 1
Console/Properties/launchSettings.json

@@ -2,7 +2,7 @@
   "profiles": {
     "Console": {
       "commandName": "Project",
-      "commandLineArgs": "workspace_sync -directory:\"D:\\BO\" -init"
+      "commandLineArgs": "dbinstall -srv:(localdb)\\mssqllocaldb -db:BO -isec -force"
     }
   }
 }

文件差異過大導致無法顯示
+ 243 - 242
Console/Scripts/bo_create_schema.sql


部分文件因文件數量過多而無法顯示