Files
Umbraco-CMS/src/Umbraco.Web/Install/InstallSteps/MajorVersion7UpgradeReport.cs

106 lines
4.4 KiB
C#

using System;
using System.Collections.Generic;
using Umbraco.Core;
using Umbraco.Core.Configuration;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.SqlSyntax;
using Umbraco.Core.PropertyEditors;
using Umbraco.Web.Install.Models;
namespace Umbraco.Web.Install.InstallSteps
{
[InstallSetupStep(InstallationType.Upgrade,
"MajorVersion7UpgradeReport", 1, "Checking for compatibility issues with upgrade")]
internal class MajorVersion7UpgradeReport : InstallSetupStep<object>
{
private readonly ApplicationContext _applicationContext;
public MajorVersion7UpgradeReport(ApplicationContext applicationContext)
{
_applicationContext = applicationContext;
}
public override InstallSetupResult Execute(object model)
{
//we cannot run this step if the db is not configured.
if (_applicationContext.DatabaseContext.IsDatabaseConfigured == false)
{
return null;
}
return new InstallSetupResult("version7upgradereport", CreateReport());
}
public override bool RequiresExecution()
{
//if it's configured, then no need to run
if (_applicationContext.IsConfigured)
{
return false;
}
try
{
//we cannot run this step if the db is not configured.
if (_applicationContext.DatabaseContext.IsDatabaseConfigured == false)
{
return false;
}
}
catch (InvalidOperationException)
{
//if there is no db context
return false;
}
var result = _applicationContext.DatabaseContext.ValidateDatabaseSchema();
var determinedVersion = result.DetermineInstalledVersion();
if ((string.IsNullOrWhiteSpace(GlobalSettings.ConfigurationStatus) == false || determinedVersion.Equals(new Version(0, 0, 0)) == false)
&& UmbracoVersion.Current.Major > determinedVersion.Major)
{
//it's an upgrade to a major version so we're gonna show this step
return true;
}
return false;
}
private IEnumerable<Tuple<bool, string>> CreateReport()
{
var errorReport = new List<Tuple<bool, string>>();
var sql = new Sql();
sql
.Select(
SqlSyntaxContext.SqlSyntaxProvider.GetQuotedColumn("cmsDataType", "controlId"),
SqlSyntaxContext.SqlSyntaxProvider.GetQuotedColumn("umbracoNode", "text"))
.From(SqlSyntaxContext.SqlSyntaxProvider.GetQuotedTableName("cmsDataType"))
.InnerJoin(SqlSyntaxContext.SqlSyntaxProvider.GetQuotedTableName("umbracoNode"))
.On(
SqlSyntaxContext.SqlSyntaxProvider.GetQuotedColumn("cmsDataType", "nodeId") + " = " +
SqlSyntaxContext.SqlSyntaxProvider.GetQuotedColumn("umbracoNode", "id"));
var list = _applicationContext.DatabaseContext.Database.Fetch<dynamic>(sql);
foreach (var item in list)
{
Guid legacyId = item.controlId;
//check for a map entry
var alias = LegacyPropertyEditorIdToAliasConverter.GetAliasFromLegacyId(legacyId);
if (alias != null)
{
//check that the new property editor exists with that alias
var editor = PropertyEditorResolver.Current.GetByAlias(alias);
if (editor == null)
{
errorReport.Add(new Tuple<bool, string>(false, string.Format("Property Editor with ID '{0}' (assigned to Data Type '{1}') has a valid GUID -> Alias map but no property editor was found. It will be replaced with a Readonly/Label property editor.", item.controlId, item.text)));
}
}
else
{
errorReport.Add(new Tuple<bool, string>(false, string.Format("Property Editor with ID '{0}' (assigned to Data Type '{1}') does not have a valid GUID -> Alias map. It will be replaced with a Readonly/Label property editor.", item.controlId, item.text)));
}
}
return errorReport;
}
}
}