Make sure MySql gets loaded with old AND new connectionstring
This commit is contained in:
@@ -7,10 +7,9 @@
|
||||
***********************************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Configuration;
|
||||
using System.Data.Common;
|
||||
using System.Reflection;
|
||||
using umbraco.DataLayer.SqlHelpers.SqlServer;
|
||||
using umbraco.DataLayer.SqlHelpers.MySql;
|
||||
|
||||
namespace umbraco.DataLayer
|
||||
{
|
||||
@@ -19,6 +18,8 @@ namespace umbraco.DataLayer
|
||||
/// </summary>
|
||||
public class DataLayerHelper
|
||||
{
|
||||
private static string _dataHelperTypeName;
|
||||
private static string _dataHelperAssemblyName;
|
||||
|
||||
#region Private Constants
|
||||
|
||||
@@ -27,7 +28,7 @@ namespace umbraco.DataLayer
|
||||
/// <summary>Name of the default data layer, that is used when nothing is specified.</summary>
|
||||
private const string DefaultDataHelperName = "SqlServer";
|
||||
/// <summary>Format used when the SQL helper is qualified by its simple name, instead of the full class name.</summary>
|
||||
private const string DefaultDataHelperFormat = "umbraco.DataLayer.SqlHelpers.{0}.{0}Helper";
|
||||
private const string DefaultDataHelperFormat = "umbraco.DataLayer.SqlHelpers.{0}.{0}Helper";
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -41,7 +42,7 @@ namespace umbraco.DataLayer
|
||||
public static ISqlHelper CreateSqlHelper(string connectionString)
|
||||
{
|
||||
/* check arguments */
|
||||
if (String.IsNullOrEmpty(connectionString))
|
||||
if (string.IsNullOrEmpty(connectionString))
|
||||
throw new ArgumentNullException("connectionString");
|
||||
|
||||
if (IsEmbeddedDatabase(connectionString) && connectionString.ToLower().Contains("SQLCE4Umbraco".ToLower()) == false)
|
||||
@@ -53,8 +54,9 @@ namespace umbraco.DataLayer
|
||||
connectionString = connectionString.Insert(connectionString.LastIndexOf('|') + 1, "\\");
|
||||
connectionString = string.Format("datalayer=SQLCE4Umbraco.SqlCEHelper,SQLCE4Umbraco;{0}", connectionString);
|
||||
}
|
||||
|
||||
/* try to parse connection string */
|
||||
DbConnectionStringBuilder connectionStringBuilder = new DbConnectionStringBuilder();
|
||||
var connectionStringBuilder = new DbConnectionStringBuilder();
|
||||
try
|
||||
{
|
||||
connectionStringBuilder.ConnectionString = connectionString;
|
||||
@@ -64,56 +66,49 @@ namespace umbraco.DataLayer
|
||||
throw new ArgumentException("Bad connection string.", "connectionString", ex);
|
||||
}
|
||||
|
||||
// get the data layer type and parse it
|
||||
string datalayerType = String.Empty;
|
||||
if (connectionStringBuilder.ContainsKey(ConnectionStringDataLayerIdentifier))
|
||||
{
|
||||
datalayerType = connectionStringBuilder[ConnectionStringDataLayerIdentifier].ToString();
|
||||
connectionStringBuilder.Remove(ConnectionStringDataLayerIdentifier);
|
||||
}
|
||||
|
||||
string[] datalayerTypeParts = datalayerType.Split(",".ToCharArray());
|
||||
string helperTypeName = datalayerTypeParts[0].Trim();
|
||||
string helperAssemblyName = datalayerTypeParts.Length < 2 ? String.Empty
|
||||
: datalayerTypeParts[1].Trim();
|
||||
if (datalayerTypeParts.Length > 2 || (helperTypeName.Length == 0 && helperAssemblyName.Length > 0))
|
||||
throw new ArgumentException("Illegal format of data layer property. Should be 'DataLayer = Full_Type_Name [, Assembly_Name]'.", "connectionString");
|
||||
var databaseSettings = ConfigurationManager.ConnectionStrings[Umbraco.Core.Configuration.GlobalSettings.UmbracoConnectionName];
|
||||
|
||||
if (databaseSettings != null)
|
||||
SetDataHelperNames(databaseSettings.ProviderName);
|
||||
else
|
||||
SetDataHelperNamesLegacyConnectionString(connectionStringBuilder);
|
||||
|
||||
/* create the helper */
|
||||
|
||||
// find the right assembly
|
||||
Assembly helperAssembly = Assembly.GetExecutingAssembly();
|
||||
if (datalayerTypeParts.Length == 2)
|
||||
var helperAssembly = Assembly.GetExecutingAssembly();
|
||||
if (string.IsNullOrWhiteSpace(_dataHelperAssemblyName) == false)
|
||||
{
|
||||
try
|
||||
{
|
||||
helperAssembly = Assembly.Load(helperAssemblyName);
|
||||
helperAssembly = Assembly.Load(_dataHelperAssemblyName);
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
throw new UmbracoException(String.Format("Could not load assembly {0}.", helperAssemblyName), exception);
|
||||
throw new UmbracoException(String.Format("Could not load assembly {0}.", _dataHelperAssemblyName), exception);
|
||||
}
|
||||
}
|
||||
|
||||
// find the right type
|
||||
Type helperType;
|
||||
if (helperTypeName == String.Empty)
|
||||
helperTypeName = DefaultDataHelperName;
|
||||
if (!helperTypeName.Contains("."))
|
||||
helperTypeName = String.Format(DefaultDataHelperFormat, helperTypeName);
|
||||
if (_dataHelperTypeName == string.Empty)
|
||||
_dataHelperTypeName = DefaultDataHelperName;
|
||||
|
||||
if (_dataHelperTypeName.Contains(".") == false)
|
||||
_dataHelperTypeName = string.Format(DefaultDataHelperFormat, _dataHelperTypeName);
|
||||
|
||||
try
|
||||
{
|
||||
helperType = helperAssembly.GetType(helperTypeName, true, true);
|
||||
helperType = helperAssembly.GetType(_dataHelperTypeName, true, true);
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
throw new UmbracoException(String.Format("Could not load type {0} ({1}).", helperTypeName, helperAssembly.FullName), exception);
|
||||
throw new UmbracoException(String.Format("Could not load type {0} ({1}).", _dataHelperTypeName, helperAssembly.FullName), exception);
|
||||
}
|
||||
|
||||
// find the right constructor
|
||||
ConstructorInfo constructor = helperType.GetConstructor(new Type[] { typeof(string) });
|
||||
var constructor = helperType.GetConstructor(new[] { typeof(string) });
|
||||
if (constructor == null)
|
||||
throw new UmbracoException(String.Format("Could not find constructor that takes a connection string as parameter. ({0}, {1}).", helperTypeName, helperAssembly.FullName));
|
||||
throw new UmbracoException(String.Format("Could not find constructor that takes a connection string as parameter. ({0}, {1}).", _dataHelperTypeName, helperAssembly.FullName));
|
||||
|
||||
// finally, return the helper
|
||||
try
|
||||
@@ -122,15 +117,50 @@ namespace umbraco.DataLayer
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
throw new UmbracoException(String.Format("Could not execute constructor of type {0} ({1}).", helperTypeName, helperAssembly.FullName), exception);
|
||||
throw new UmbracoException(String.Format("Could not execute constructor of type {0} ({1}).", _dataHelperTypeName, helperAssembly.FullName), exception);
|
||||
}
|
||||
}
|
||||
|
||||
private static void SetDataHelperNames(string providerName)
|
||||
{
|
||||
if (providerName.StartsWith("MySql"))
|
||||
{
|
||||
_dataHelperTypeName = "MySql";
|
||||
}
|
||||
|
||||
if (providerName.StartsWith("System.Data.SqlServerCe"))
|
||||
{
|
||||
_dataHelperTypeName = "SQLCE4Umbraco.SqlCEHelper";
|
||||
_dataHelperAssemblyName = "SQLCE4Umbraco";
|
||||
}
|
||||
}
|
||||
|
||||
private static void SetDataHelperNamesLegacyConnectionString(DbConnectionStringBuilder connectionStringBuilder)
|
||||
{
|
||||
// get the data layer type and parse it
|
||||
var datalayerType = String.Empty;
|
||||
if (connectionStringBuilder.ContainsKey(ConnectionStringDataLayerIdentifier))
|
||||
{
|
||||
datalayerType = connectionStringBuilder[ConnectionStringDataLayerIdentifier].ToString();
|
||||
connectionStringBuilder.Remove(ConnectionStringDataLayerIdentifier);
|
||||
}
|
||||
|
||||
var datalayerTypeParts = datalayerType.Split(",".ToCharArray());
|
||||
|
||||
_dataHelperTypeName = datalayerTypeParts[0].Trim();
|
||||
_dataHelperAssemblyName = datalayerTypeParts.Length < 2
|
||||
? string.Empty
|
||||
: datalayerTypeParts[1].Trim();
|
||||
|
||||
if (datalayerTypeParts.Length > 2 || (_dataHelperTypeName.Length == 0 && _dataHelperAssemblyName.Length > 0))
|
||||
throw new ArgumentException("Illegal format of data layer property. Should be 'DataLayer = Full_Type_Name [, Assembly_Name]'.", "connectionString");
|
||||
}
|
||||
|
||||
public static bool IsEmbeddedDatabase(string connectionString)
|
||||
{
|
||||
return connectionString.ToLower().Contains("|DataDirectory|".ToLower());
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -79,6 +79,7 @@
|
||||
<HintPath>..\packages\MySQL.Data.5.1.2.2\lib\MySql.Data.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Configuration" />
|
||||
<Reference Include="System.Core">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
|
||||
Reference in New Issue
Block a user