/// /// Copyright (c) 2016-2018 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; using FluentNHibernate.Cfg; using FluentNHibernate.Cfg.Db; using log4net; using NHibernate; using NHibernate.Cfg; using NHibernate.Tool.hbm2ddl; using Users.Entities; namespace Users { public static class DB { static readonly ILog log = LogManager.GetLogger(typeof(DB)); /// Session factory for all regular sessions, not for CreateEmptyResultsDB(). public static ISessionFactory SessionFactory; public static ISession CurrentSession; /// Connection string for all sessions private static string connectionString; /// public static string ConnectionString { get { return connectionString; } set { connectionString = value; SessionFactory = null; } } /// Database type (MySQL or SQLite) for all sessions private static DBType dbType; /// public static DBType DbType { get { return dbType; } set { dbType = value; SessionFactory = null; } } /// /// NHibernate session factory (to create the database session 'SessionFactory') /// /// A database session static ISessionFactory CreateSessionFactory() { return CreateSessionFactory(false); } /// /// NHibernate session factory (to create the database session 'SessionFactory') /// /// true = Create a new DB, false = Regular DB /// A database session public static ISessionFactory CreateSessionFactory(bool createDB) { FluentConfiguration cfg = Fluently.Configure(); switch (dbType) { default: case DBType.SQLite: cfg = cfg.Database(SQLiteConfiguration.Standard.UsingFile(connectionString)); break; case DBType.MySql: cfg = cfg.Database(MySQLConfiguration.Standard.ConnectionString(connectionString)); break; } cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf()); if (createDB) { return cfg.ExposeConfiguration(BuildSchemaCreate).BuildSessionFactory(); } else { return cfg.ExposeConfiguration(BuildSchema).BuildSessionFactory(); } } static void BuildSchema(Configuration config) { /// This NHibernate tool takes a configuration with mapping info and exports a database schema new SchemaExport(config).SetOutputFile("db_schema"); } static void BuildSchemaCreate(Configuration config) { /// This NHibernate tool takes a configuration with mapping info and exports a database schema new SchemaExport(config).Create(true, true); } /// Create a NHibernate session for the given database public static ISession CreateSession() { if (string.IsNullOrEmpty(connectionString)) { throw new Exception("Connection string was not specified"); } if (SessionFactory == null) SessionFactory = CreateSessionFactory(); CurrentSession = SessionFactory.OpenSession(); return CurrentSession; } /// /// Create an empty users database. /// Database contains only the user 'admin' and the control board component 'CB'. /// /// DBType.SQLite or DBType.MySql /// Connection string /// true=success, false=error public static bool CreateEmptyDB() { ISessionFactory sessionFactory = CreateSessionFactory(true); if (sessionFactory == null) return false; /// Populate the database using (var session = sessionFactory.OpenSession()) { using (var transaction = session.BeginTransaction()) { transaction.Commit(); } } return true; } /// /// Shared data /// public static IList Users; public static IList Groups; /// /// Loads shared data from the database /// /// Throws NHibernate exceptions public static void LoadSharedData() { ISession session = DB.CreateSession(); Users = session.QueryOver().List(); Groups = session.QueryOver().List(); } } }