diff --git a/src/umbraco.datalayer/DataLayerHelper.cs b/src/umbraco.datalayer/DataLayerHelper.cs
index c17bdd2057..a6f14de0b9 100644
--- a/src/umbraco.datalayer/DataLayerHelper.cs
+++ b/src/umbraco.datalayer/DataLayerHelper.cs
@@ -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
///
public class DataLayerHelper
{
+ private static string _dataHelperTypeName;
+ private static string _dataHelperAssemblyName;
#region Private Constants
@@ -27,7 +28,7 @@ namespace umbraco.DataLayer
/// Name of the default data layer, that is used when nothing is specified.
private const string DefaultDataHelperName = "SqlServer";
/// Format used when the SQL helper is qualified by its simple name, instead of the full class name.
- 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
- }
+ }
}
diff --git a/src/umbraco.datalayer/umbraco.datalayer.csproj b/src/umbraco.datalayer/umbraco.datalayer.csproj
index e0a225bca1..8130c877a4 100644
--- a/src/umbraco.datalayer/umbraco.datalayer.csproj
+++ b/src/umbraco.datalayer/umbraco.datalayer.csproj
@@ -79,6 +79,7 @@
..\packages\MySQL.Data.5.1.2.2\lib\MySql.Data.dll
+
3.5