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