From acb909c706883b4f5ec43ed18c248d206ba98d9f Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Thu, 29 Nov 2012 12:40:48 -0100 Subject: [PATCH] Refactoring installer to use the DatabaseContext for installing the umbraco db schema and default data. Minimizing the use of the json/ajax calls during installation. --- src/Umbraco.Core/DatabaseContext.cs | 35 +++++- .../Persistence/PetaPocoExtensions.cs | 2 +- .../Persistence/DatabaseFactoryTests.cs | 2 +- .../TestHelpers/BaseDatabaseFactoryTest.cs | 2 +- .../TestHelpers/BaseDatabaseTest.cs | 2 +- .../install/steps/database.ascx | 92 ++++++++++----- .../install/steps/database.ascx | 105 ++++++++--------- .../install/steps/database.ascx.cs | 88 +------------- .../install/utills/p.aspx.cs | 110 ++---------------- 9 files changed, 153 insertions(+), 285 deletions(-) diff --git a/src/Umbraco.Core/DatabaseContext.cs b/src/Umbraco.Core/DatabaseContext.cs index 6b52b1ddc5..cd2f53a7df 100644 --- a/src/Umbraco.Core/DatabaseContext.cs +++ b/src/Umbraco.Core/DatabaseContext.cs @@ -22,12 +22,12 @@ namespace Umbraco.Core public class DatabaseContext { private bool _configured; - - #region Singleton - private static readonly Lazy lazy = new Lazy(() => new DatabaseContext()); private string _connectionString; private string _providerName; + #region Singleton + private static readonly Lazy lazy = new Lazy(() => new DatabaseContext()); + /// /// Gets the current Database Context. /// @@ -122,7 +122,6 @@ namespace Umbraco.Core SaveConnectionString(connectionString, appSettingsConnection, providerName); - string appData = VirtualPathUtility.ToAbsolute(GlobalSettings.StorageDirectory); var path = Path.Combine(GlobalSettings.FullpathToRoot, "App_Data", "Umbraco.sdf"); if (File.Exists(path) == false) { @@ -130,7 +129,6 @@ namespace Umbraco.Core engine.CreateDatabase(); } - Initialize(providerName); } @@ -297,5 +295,32 @@ namespace Umbraco.Core _configured = true; } + + internal Result CreateDatabaseSchemaAndData() + { + var providerName = string.IsNullOrEmpty(_providerName) ? ProviderName : _providerName; + if (_configured == false || (string.IsNullOrEmpty(_connectionString) || string.IsNullOrEmpty(providerName))) + { + return new Result{Message = "Database configuration is invalid", Success = false, Percentage = "10"}; + } + + try + { + var database = new Database(_connectionString, providerName); + database.CreateDatabaseSchema(); + return new Result { Message = "Installation completed!", Success = true, Percentage = "100" }; + } + catch (Exception ex) + { + return new Result { Message = ex.Message, Success = false, Percentage = "90" }; + } + } + + internal class Result + { + public string Message { get; set; } + public bool Success { get; set; } + public string Percentage { get; set; } + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs b/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs index 298e23b789..99ddc9e7b4 100644 --- a/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs +++ b/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs @@ -124,7 +124,7 @@ namespace Umbraco.Core.Persistence return SyntaxConfig.SqlSyntaxProvider.DoesTableExist(db, tableName); } - public static void Initialize(this Database db) + public static void CreateDatabaseSchema(this Database db) { NewTable += PetaPocoExtensions_NewTable; diff --git a/src/Umbraco.Tests/Persistence/DatabaseFactoryTests.cs b/src/Umbraco.Tests/Persistence/DatabaseFactoryTests.cs index 6284dc5d38..c5de6d3945 100644 --- a/src/Umbraco.Tests/Persistence/DatabaseFactoryTests.cs +++ b/src/Umbraco.Tests/Persistence/DatabaseFactoryTests.cs @@ -53,7 +53,7 @@ namespace Umbraco.Tests.Persistence SyntaxConfig.SqlSyntaxProvider = SqlCeSyntaxProvider.Instance; //Create the umbraco database - DatabaseFactory.Current.Database.Initialize(); + DatabaseFactory.Current.Database.CreateDatabaseSchema(); bool umbracoNodeTable = DatabaseFactory.Current.Database.TableExist("umbracoNode"); bool umbracoUserTable = DatabaseFactory.Current.Database.TableExist("umbracoUser"); diff --git a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs index 729cfac44c..5df3ab5267 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs @@ -64,7 +64,7 @@ namespace Umbraco.Tests.TestHelpers //Configure the Database and Sql Syntax based on connection string set in config DatabaseContext.Initialize(); //Create the umbraco database and its base data - DatabaseContext.Database.Initialize(); + DatabaseContext.Database.CreateDatabaseSchema(); } [TearDown] diff --git a/src/Umbraco.Tests/TestHelpers/BaseDatabaseTest.cs b/src/Umbraco.Tests/TestHelpers/BaseDatabaseTest.cs index b370ee4508..673c47d3e6 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseDatabaseTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseDatabaseTest.cs @@ -43,7 +43,7 @@ namespace Umbraco.Tests.TestHelpers //Create the umbraco database _database = new Database(ConnectionString, ProviderName); - _database.Initialize(); + _database.CreateDatabaseSchema(); } public abstract string ConnectionString { get; } diff --git a/src/Umbraco.Web.UI/install/steps/database.ascx b/src/Umbraco.Web.UI/install/steps/database.ascx index 77e33f5441..a28efb6712 100644 --- a/src/Umbraco.Web.UI/install/steps/database.ascx +++ b/src/Umbraco.Web.UI/install/steps/database.ascx @@ -1,4 +1,4 @@ -<%@ Control Language="c#" AutoEventWireup="True" CodeBehind="database.ascx.cs" Inherits="umbraco.presentation.install.steps.detect" +<%@ Control Language="c#" AutoEventWireup="True" CodeBehind="database.ascx.cs" Inherits="umbraco.presentation.install.steps.detect" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %> <%@ Import Namespace="Umbraco.Core.Configuration" %> @@ -223,37 +223,37 @@ switch($(this).val()) { - case "blank": + case "blank": - $(".database-option").hide(); - $("#database-blank").show(); - $(".installbtn").show(); + $(".database-option").hide(); + $("#database-blank").show(); + $(".installbtn").show(); - break; - case "embedded": - $(".database-option").hide(); - $("#database-embedded").show(); + break; + case "embedded": + $(".database-option").hide(); + $("#database-embedded").show(); - if (!hasEmbeddedDlls) { - $('.embeddedError').show(); - $(".installbtn").hide(); - } - else { - $('.embedded').show(); - $(".installbtn").show(); - } - - break; - case "advanced": - $(".database-option").hide(); - $("#database-advanced").show(); - $(".installbtn").show(); - break; - case "help": - $(".database-option").hide(); - $("#database-help").show(); + if (!hasEmbeddedDlls) { + $('.embeddedError').show(); $(".installbtn").hide(); - break; + } + else { + $('.embedded').show(); + $(".installbtn").show(); + } + + break; + case "advanced": + $(".database-option").hide(); + $("#database-advanced").show(); + $(".installbtn").show(); + break; + case "help": + $(".database-option").hide(); + $("#database-help").show(); + $(".installbtn").hide(); + break; } @@ -291,10 +291,38 @@ diff --git a/src/Umbraco.Web/umbraco.presentation/install/steps/database.ascx b/src/Umbraco.Web/umbraco.presentation/install/steps/database.ascx index 77e33f5441..d3446f49cb 100644 --- a/src/Umbraco.Web/umbraco.presentation/install/steps/database.ascx +++ b/src/Umbraco.Web/umbraco.presentation/install/steps/database.ascx @@ -1,4 +1,4 @@ -<%@ Control Language="c#" AutoEventWireup="True" CodeBehind="database.ascx.cs" Inherits="umbraco.presentation.install.steps.detect" +<%@ Control Language="c#" AutoEventWireup="True" CodeBehind="database.ascx.cs" Inherits="umbraco.presentation.install.steps.detect" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %> <%@ Import Namespace="Umbraco.Core.Configuration" %> @@ -223,37 +223,37 @@ switch($(this).val()) { - case "blank": + case "blank": - $(".database-option").hide(); - $("#database-blank").show(); - $(".installbtn").show(); + $(".database-option").hide(); + $("#database-blank").show(); + $(".installbtn").show(); - break; - case "embedded": - $(".database-option").hide(); - $("#database-embedded").show(); + break; + case "embedded": + $(".database-option").hide(); + $("#database-embedded").show(); - if (!hasEmbeddedDlls) { - $('.embeddedError').show(); - $(".installbtn").hide(); - } - else { - $('.embedded').show(); - $(".installbtn").show(); - } - - break; - case "advanced": - $(".database-option").hide(); - $("#database-advanced").show(); - $(".installbtn").show(); - break; - case "help": - $(".database-option").hide(); - $("#database-help").show(); + if (!hasEmbeddedDlls) { + $('.embeddedError').show(); $(".installbtn").hide(); - break; + } + else { + $('.embedded').show(); + $(".installbtn").show(); + } + + break; + case "advanced": + $(".database-option").hide(); + $("#database-advanced").show(); + $(".installbtn").show(); + break; + case "help": + $(".database-option").hide(); + $("#database-help").show(); + $(".installbtn").hide(); + break; } @@ -291,42 +291,33 @@ diff --git a/src/Umbraco.Web/umbraco.presentation/install/steps/database.ascx.cs b/src/Umbraco.Web/umbraco.presentation/install/steps/database.ascx.cs index 6bdd7a1936..a1049ffa92 100644 --- a/src/Umbraco.Web/umbraco.presentation/install/steps/database.ascx.cs +++ b/src/Umbraco.Web/umbraco.presentation/install/steps/database.ascx.cs @@ -1,13 +1,9 @@ using System; using System.Data.Common; -using System.Threading; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using Umbraco.Core; using Umbraco.Core.Logging; -using Umbraco.Core.Persistence; -using umbraco.DataLayer; -using umbraco.DataLayer.Utility.Installer; using System.IO; using umbraco.IO; @@ -18,29 +14,6 @@ namespace umbraco.presentation.install.steps /// public partial class detect : System.Web.UI.UserControl { - /// The installer associated with the chosen connection string. - private IInstallerUtility m_Installer; - - /// - /// The installer associated with the chosen connection string. - /// Will be initialized if m_Installer is null. - /// - protected IInstallerUtility Installer - { - get - { - if (m_Installer == null) - m_Installer = SqlHelper.Utility.CreateInstaller(); - return m_Installer; - } - } - - /// Returns the current SQLHelper. - protected static ISqlHelper SqlHelper - { - get { return BusinessLogic.Application.SqlHelper; } - } - /// /// Returns whether the selected database is an embedded database. /// @@ -154,13 +127,8 @@ namespace umbraco.presentation.install.steps /// protected void saveDBConfig(object sender, EventArgs e) { - Helper.setProgress(5, "Saving database connection...", ""); - try { - /*DbConnectionStringBuilder connectionStringBuilder = CreateConnectionString(); - GlobalSettings.DbDSN = connectionStringBuilder.ConnectionString;*/ - if (string.IsNullOrEmpty(ConnectionString.Text) == false) { DatabaseContext.Current.ConfigureDatabaseConnection(ConnectionString.Text); @@ -175,70 +143,16 @@ namespace umbraco.presentation.install.steps DatabaseUsername.Text, DatabasePassword.Text, DatabaseType.SelectedValue); } - - var database = new Database(DatabaseContext.Current.ConnectionString, - DatabaseContext.Current.ProviderName); - - database.Initialize(); } catch (Exception ex) { LogHelper.Error("Exception was thrown during the setup of the database in 'saveDBConfig'.", ex); - - Exception error = new Exception("Could not save the web.config file. Please modify the connection string manually.", ex); - Helper.setProgress(-1, "Could not save the web.config file. Please modify the connection string manually.", error.InnerException.Message); } - - Thread.Sleep(5000); - + settings.Visible = false; installing.Visible = true; } - /// - /// Creates the connection string with the values the user has supplied. - /// - /// - protected DbConnectionStringBuilder CreateConnectionString() - { - DbConnectionStringBuilder connectionStringBuilder = new DbConnectionStringBuilder(); - - if (ManualConnectionString) - { - connectionStringBuilder.ConnectionString = ConnectionString.Text; - } - else if (!IsEmbeddedDatabase && !DatabaseType.SelectedValue.Contains("SqlAzure"))//If database is not embedded or of type Sql Azure - { - connectionStringBuilder["server"] = DatabaseServer.Text; - connectionStringBuilder["database"] = DatabaseName.Text; - connectionStringBuilder["user id"] = DatabaseUsername.Text; - connectionStringBuilder["password"] = DatabasePassword.Text; - } - else if (!IsEmbeddedDatabase && DatabaseType.SelectedValue.Contains("SqlAzure"))//If database is not embedded and of type Sql Azure - { - connectionStringBuilder.ConnectionString = - string.Format("Server=tcp:{0}.database.windows.net;Database={1};User ID={2}@{0};Password={3}", - DatabaseServer.Text, DatabaseName.Text, DatabaseUsername.Text, DatabasePassword.Text); - } - else if (Request["database"] == "embedded") - { - connectionStringBuilder.ConnectionString = @"datalayer=SQLCE4Umbraco.SqlCEHelper,SQLCE4Umbraco;data source=|DataDirectory|\Umbraco.sdf"; - } - - if (!String.IsNullOrEmpty(Request["database"]) && !String.IsNullOrEmpty(DatabaseType.SelectedValue) - && !DatabaseType.SelectedValue.Contains("SqlServer") - && !DatabaseType.SelectedValue.Contains("SqlAzure") - && Request["database"] != "advanced") - { - connectionStringBuilder["datalayer"] = DatabaseType.SelectedValue; - } - - //if (!String.IsNullOrEmpty(DatabaseType.SelectedValue) && !DatabaseType.SelectedValue.Contains("SqlServer") && !DatabaseType.SelectedValue.Contains("Custom")) - // connectionStringBuilder["datalayer"] = DatabaseType.SelectedValue; - - return connectionStringBuilder; - } - /// /// Gets the value of the specified item in the connection string. /// diff --git a/src/Umbraco.Web/umbraco.presentation/install/utills/p.aspx.cs b/src/Umbraco.Web/umbraco.presentation/install/utills/p.aspx.cs index 9dd2fc46d8..1bcbfd5bdd 100644 --- a/src/Umbraco.Web/umbraco.presentation/install/utills/p.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/install/utills/p.aspx.cs @@ -1,15 +1,9 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Web; -using System.Web.UI; -using System.Web.UI.WebControls; +using System.Web.Script.Serialization; +using System.Web.Script.Services; +using System.Web.Services; using Umbraco.Core; using Umbraco.Core.Logging; -using Umbraco.Core.Persistence; -using umbraco.DataLayer.Utility.Installer; -using umbraco.DataLayer; namespace umbraco.presentation.install.utills { @@ -58,103 +52,17 @@ namespace umbraco.presentation.install.utills } - [System.Web.Services.WebMethod] - [System.Web.Script.Services.ScriptMethod] + [WebMethod] + [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public static string installOrUpgrade() { LogHelper.Info

("Running 'installOrUpgrade' service"); - //Helper.setProgress(5, "Opening database connection...", ""); - //IInstallerUtility installer; + var result = DatabaseContext.Current.CreateDatabaseSchemaAndData(); - if (DatabaseContext.Current.IsDatabaseConfigured == false) - return "ConnectionString could not be found"; - - //Helper.setProgress(20, "Connection opened", ""); - - //var database = new Database(DatabaseContext.Current.ConnectionString, DatabaseContext.Current.ProviderName); - - //Helper.setProgress(35, "Installing tables...", ""); - - //database.Initialize(); - - //Helper.setProgress(90, "Refreshing content cache", ""); - - //library.RefreshContent(); - - Helper.setProgress(100, "Installation completed!", ""); - - return "installed"; - - /*try - { - var sqlHelper = DataLayerHelper.CreateSqlHelper(GlobalSettings.DbDSN); - installer = sqlHelper.Utility.CreateInstaller(); - - if (!installer.CanConnect) - throw new Exception("The installer cannot connect to the database."); - else - Helper.setProgress(20, "Connection opened", ""); - } - catch (Exception ex) - { - var error = new Exception("Database connection initialisation failed.", ex); - Helper.setProgress(-5, "Database connection initialisation failed.", - string.Format("{0}
Connection string: {1}", error.InnerException.Message, GlobalSettings.DbDSN)); - - return error.Message; - }*/ - - - /*if (installer.CanConnect) - { - if (installer.IsLatestVersion) - { - - Helper.setProgress(90, "Refreshing content cache", ""); - - library.RefreshContent(); - - Helper.setProgress(100, "Database is up-to-date", ""); - - } - else - { - if (installer.IsEmpty) - { - Helper.setProgress(35, "Installing tables...", ""); - try - { - installer.Install(); - Helper.setProgress(100, "Installation completed!", ""); - installer = null; - - library.RefreshContent(); - return "installed"; - } - catch (Exception SqlExp) - { - Helper.setProgress(35, "Error installing tables", SqlExp.InnerException.ToString()); - return "error"; - } - - } - else if (installer.CurrentVersion == DatabaseVersion.None || installer.CanUpgrade) - { - Helper.setProgress(35, "Updating database tables...", ""); - installer.Install(); - - Helper.setProgress(100, "Upgrade completed!", ""); - - installer = null; - - library.RefreshContent(); - return "upgraded"; - } - } - }*/ - - return "no connection;"; + var js = new JavaScriptSerializer(); + var jsonResult = js.Serialize(result); + return jsonResult; } } } \ No newline at end of file