diff --git a/src/Orchard.Web/Orchard.Web.csproj b/src/Orchard.Web/Orchard.Web.csproj index 0fa586cba..d50af15f3 100644 --- a/src/Orchard.Web/Orchard.Web.csproj +++ b/src/Orchard.Web/Orchard.Web.csproj @@ -55,6 +55,10 @@ False ..\..\lib\fluentnhibernate\NHibernate.ByteCode.Castle.dll + + False + ..\..\lib\sqlce\System.Data.SqlServerCe.dll + @@ -320,10 +324,32 @@ --> + + + + + + + + + + + + $(ProjectDir)\..\Manifests + + diff --git a/src/Orchard/Data/Providers/SqlCeDataServicesProvider.cs b/src/Orchard/Data/Providers/SqlCeDataServicesProvider.cs new file mode 100644 index 000000000..cb22ee144 --- /dev/null +++ b/src/Orchard/Data/Providers/SqlCeDataServicesProvider.cs @@ -0,0 +1,65 @@ +using System; +using System.IO; +using FluentNHibernate.Cfg.Db; + +namespace Orchard.Data.Providers { + public class SqlCeDataServicesProvider : AbstractDataServicesProvider { + private readonly string _dataFolder; + private readonly string _connectionString; + + public SqlCeDataServicesProvider(string dataFolder, string connectionString) { + _dataFolder = dataFolder; + _connectionString = connectionString; + } + + public static string ProviderName { + get { return "SqlCe"; } + } + + public override IPersistenceConfigurer GetPersistenceConfigurer(bool createDatabase) { + var persistence = MsSqlCeConfiguration.Standard; + + if (string.IsNullOrEmpty(_connectionString)) { + var dataFile = Path.Combine(_dataFolder, "Orchard.sdf"); + + if (!Directory.Exists(_dataFolder)) { + Directory.CreateDirectory(_dataFolder); + } + + if (createDatabase && File.Exists(dataFile)) { + File.Delete(dataFile); + } + + string localConnectionString = string.Format("Data Source={0}", dataFile); + if (!File.Exists(dataFile)) { + CreateSqlCeDatabaseFile(localConnectionString); + } + + persistence = persistence.ConnectionString(localConnectionString); + } + else { + persistence = persistence.ConnectionString(_connectionString); + } + return persistence; + } + + private void CreateSqlCeDatabaseFile(string connectionString) { + // We want to execute this code using Reflection, to avoid having a binary + // dependency on SqlCe assembly + + //engine engine = new SqlCeEngine(); + var sqlceEngineHandle = Activator.CreateInstance("System.Data.SqlServerCe", "System.Data.SqlServerCe.SqlCeEngine"); + var engine = sqlceEngineHandle.Unwrap(); + + //engine.LocalConnectionString = connectionString; + engine.GetType().GetProperty("LocalConnectionString").SetValue(engine, connectionString, null/*index*/); + + //engine.CreateDatabase(); + engine.GetType().GetMethod("CreateDatabase").Invoke(engine, null); + + //engine.Dispose(); + engine.GetType().GetMethod("Dispose").Invoke(engine, null); + } + + } +} diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 84f31c7aa..502982b9d 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -393,6 +393,7 @@ +