diff options
Diffstat (limited to 'Codemerx/Gestor.Infrastructure/Gestor.Infrastructure.Configuration')
2 files changed, 277 insertions, 0 deletions
diff --git a/Codemerx/Gestor.Infrastructure/Gestor.Infrastructure.Configuration/ConfigurationFileCache.cs b/Codemerx/Gestor.Infrastructure/Gestor.Infrastructure.Configuration/ConfigurationFileCache.cs new file mode 100644 index 0000000..4864edc --- /dev/null +++ b/Codemerx/Gestor.Infrastructure/Gestor.Infrastructure.Configuration/ConfigurationFileCache.cs @@ -0,0 +1,133 @@ +using Gestor.Common.Helpers;
+using NHibernate.Cfg;
+using System;
+using System.ComponentModel;
+using System.Data.SqlClient;
+using System.IO;
+using System.Reflection;
+using System.Runtime.Serialization.Formatters.Binary;
+
+namespace Gestor.Infrastructure.Configuration
+{
+ public class ConfigurationFileCache
+ {
+ private readonly string _cacheFile;
+
+ private readonly Assembly _definitionsAssembly;
+
+ private bool IsConfigurationFileValid
+ {
+ get
+ {
+ string location;
+ if (!File.Exists(this._cacheFile))
+ {
+ return false;
+ }
+ FileInfo fileInfo = new FileInfo(this._cacheFile);
+ Assembly assembly = this._definitionsAssembly;
+ if (assembly != null)
+ {
+ location = assembly.Location;
+ }
+ else
+ {
+ location = null;
+ }
+ string str = location;
+ if (str == null)
+ {
+ return false;
+ }
+ FileInfo fileInfo1 = new FileInfo(str);
+ if (fileInfo.Length < (long)5120)
+ {
+ return false;
+ }
+ return fileInfo.LastWriteTime >= fileInfo1.LastWriteTime;
+ }
+ }
+
+ public ConfigurationFileCache(string connectionString)
+ {
+ if (connectionString == null)
+ {
+ return;
+ }
+ this._definitionsAssembly = Assembly.GetExecutingAssembly();
+ SqlConnection sqlConnection = new SqlConnection(connectionString);
+ string str = string.Concat("Data_", sqlConnection.Database, ".cfg");
+ sqlConnection.Dispose();
+ this._cacheFile = string.Concat(AppDomain.CurrentDomain.BaseDirectory, str);
+ }
+
+ public void DeleteCacheFile()
+ {
+ try
+ {
+ if (File.Exists(this._cacheFile))
+ {
+ File.Delete(this._cacheFile);
+ }
+ }
+ catch (Exception exception)
+ {
+ }
+ }
+
+ public NHibernate.Cfg.Configuration LoadConfigurationFromFile()
+ {
+ NHibernate.Cfg.Configuration configuration;
+ if (!this.IsConfigurationFileValid)
+ {
+ return null;
+ }
+ try
+ {
+ using (FileStream fileStream = File.Open(this._cacheFile, FileMode.Open, FileAccess.Read))
+ {
+ using (MemoryStream memoryStream = new MemoryStream(ConfigurationFileCache.ReadFully(fileStream).DecryptBytes()))
+ {
+ configuration = (new BinaryFormatter()).Deserialize(memoryStream) as NHibernate.Cfg.Configuration;
+ }
+ }
+ }
+ catch (Exception exception)
+ {
+ this.DeleteCacheFile();
+ configuration = null;
+ }
+ return configuration;
+ }
+
+ private static byte[] ReadFully(Stream inputStream)
+ {
+ byte[] array;
+ using (MemoryStream memoryStream = new MemoryStream())
+ {
+ inputStream.CopyTo(memoryStream);
+ array = memoryStream.ToArray();
+ }
+ return array;
+ }
+
+ public void SaveConfigurationToFile(NHibernate.Cfg.Configuration configuration)
+ {
+ try
+ {
+ using (FileStream fileStream = File.Open(this._cacheFile, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
+ {
+ using (MemoryStream memoryStream = new MemoryStream())
+ {
+ (new BinaryFormatter()).Serialize(memoryStream, configuration);
+ byte[] numArray = memoryStream.ToArray().EncryptBytes();
+ fileStream.Write(numArray, 0, (int)numArray.Length);
+ }
+ }
+ }
+ catch (Exception exception)
+ {
+ }
+ }
+ }
+}
\ No newline at end of file diff --git a/Codemerx/Gestor.Infrastructure/Gestor.Infrastructure.Configuration/SessionFactory.cs b/Codemerx/Gestor.Infrastructure/Gestor.Infrastructure.Configuration/SessionFactory.cs new file mode 100644 index 0000000..236c026 --- /dev/null +++ b/Codemerx/Gestor.Infrastructure/Gestor.Infrastructure.Configuration/SessionFactory.cs @@ -0,0 +1,144 @@ +using FluentNHibernate.Cfg;
+using FluentNHibernate.Cfg.Db;
+using Gestor.Infrastructure.Entities.Seguros;
+using NHibernate;
+using NHibernate.Cfg;
+using NHibernate.Connection;
+using NHibernate.Impl;
+using NHibernate.Mapping;
+using NHibernate.Tool.hbm2ddl;
+using System;
+using System.ComponentModel;
+using System.Data.SqlClient;
+using System.Linq;
+using System.Runtime.CompilerServices;
+
+namespace Gestor.Infrastructure.Configuration
+{
+ public class SessionFactory
+ {
+ private static ISessionFactory _sessionFactory;
+
+ private static string ConnectionString
+ {
+ get;
+ set;
+ }
+
+ public static bool Retry
+ {
+ get;
+ set;
+ }
+
+ private static ISessionFactory Session
+ {
+ get
+ {
+ object connection;
+ SessionFactoryImpl sessionFactoryImpl = SessionFactory._sessionFactory as SessionFactoryImpl;
+ if (sessionFactoryImpl != null)
+ {
+ connection = sessionFactoryImpl.ConnectionProvider.GetConnection();
+ }
+ else
+ {
+ connection = null;
+ }
+ SqlConnection sqlConnection = connection as SqlConnection;
+ SqlConnection sqlConnection1 = new SqlConnection(SessionFactory.ConnectionString);
+ if (sqlConnection == null || sqlConnection.Database != sqlConnection1.Database)
+ {
+ SessionFactory.Initialize();
+ }
+ sqlConnection1.Dispose();
+ return SessionFactory._sessionFactory;
+ }
+ }
+
+ public SessionFactory()
+ {
+ }
+
+ private static NHibernate.Cfg.Configuration BuildConfiguration()
+ {
+ MsSqlConfiguration msSqlConfiguration = MsSqlConfiguration.MsSql2012.ConnectionString(SessionFactory.ConnectionString).ShowSql();
+ return Fluently.Configure().Database(msSqlConfiguration).Mappings((MappingConfiguration m) => m.FluentMappings.AddFromAssemblyOf<ClienteMap>()).ExposeConfiguration((NHibernate.Cfg.Configuration cfg) => (new SchemaUpdate(cfg)).Execute(false, true)).BuildConfiguration();
+ }
+
+ private static void BuildSessionFactory(bool withDelete = false)
+ {
+ SessionFactory._sessionFactory = SessionFactory.ConfigurationFile(withDelete).BuildSessionFactory();
+ }
+
+ private static FluentConfiguration ConfigurationFile(bool withDelete)
+ {
+ NHibernate.Cfg.Configuration configuration;
+ ConfigurationFileCache configurationFileCache = new ConfigurationFileCache(SessionFactory.ConnectionString);
+ if (withDelete)
+ {
+ configurationFileCache.DeleteCacheFile();
+ }
+ NHibernate.Cfg.Configuration configuration1 = configurationFileCache.LoadConfigurationFromFile();
+ configuration1 = SessionFactory.FixConfiguration(configuration1);
+ if (configuration1 != null)
+ {
+ configuration = configuration1;
+ configuration.SetProperty("connection.connection_string", SessionFactory.ConnectionString);
+ }
+ else
+ {
+ configuration = SessionFactory.BuildConfiguration();
+ configurationFileCache.SaveConfigurationToFile(configuration);
+ }
+ return Fluently.Configure(configuration);
+ }
+
+ private static NHibernate.Cfg.Configuration FixConfiguration(NHibernate.Cfg.Configuration cachedConfiguration)
+ {
+ NHibernate.Cfg.Configuration configuration;
+ if (cachedConfiguration == null)
+ {
+ return cachedConfiguration;
+ }
+ Type type = typeof(ClienteDb);
+ if (cachedConfiguration.ClassMappings.Any<PersistentClass>((PersistentClass x) => x.EntityName == type.FullName))
+ {
+ configuration = cachedConfiguration;
+ }
+ else
+ {
+ configuration = null;
+ }
+ cachedConfiguration = configuration;
+ return cachedConfiguration;
+ }
+
+ public static void Initialize()
+ {
+ if (SessionFactory.ConnectionString == null)
+ {
+ throw new ArgumentNullException();
+ }
+ try
+ {
+ SessionFactory.BuildSessionFactory(false);
+ }
+ catch (Exception exception)
+ {
+ SessionFactory.BuildSessionFactory(true);
+ }
+ }
+
+ public static ISession OpenSession(string connectionString)
+ {
+ SessionFactory.ConnectionString = connectionString;
+ ISessionFactory session = SessionFactory.Session;
+ if (session != null)
+ {
+ return session.OpenSession();
+ }
+ return null;
+ }
+ }
+}
\ No newline at end of file |