/// /// Copyright (c) 2013-2018 Sensus Slovensko a.s. /// using System; using System.Windows.Forms; using FluentNHibernate.Cfg; using FluentNHibernate.Cfg.Db; using NHibernate; using NHibernate.Cfg; using NHibernate.Tool.hbm2ddl; using Config.Resources; namespace Config { public static class FluentCommon { /// /// Session factories for regular sessions. /// public static ISessionFactory[] SessionFactories = new ISessionFactory[(int)Users.Entities.DBKind.Count]; /// /// NHibernate session factory (to create the database session 'SessionFactory') /// /// A database session static ISessionFactory CreateSessionFactory(Users.Entities.DBKind database) { Users.Entities.DBType dbType; string connectionString; switch (database) { default: case Users.Entities.DBKind.Config: dbType = Data.CurrentBench.ProceduresDBSettings.DbType; connectionString = Data.CurrentBench.ProceduresDBSettings.ConnectionString; break; case Users.Entities.DBKind.Results: dbType = Data.CurrentBench.WaterMetersDBSettings.DbType; connectionString = Data.CurrentBench.WaterMetersDBSettings.ConnectionString; break; case Users.Entities.DBKind.RemoteConfig: dbType = Data.CurrentBench.UsersDBSettings.DbType; connectionString = Data.CurrentBench.UsersDBSettings.ConnectionString; break; } return CreateSessionFactory(database, dbType, connectionString, false); } /// /// NHibernate session factory (to create the database session 'SessionFactory') /// /// A database session public static ISessionFactory CreateSessionFactory(Users.Entities.DBKind database, Users.Entities.DBType dbType, string connectionString, bool createDB) { try { FluentConfiguration cfg = Fluently.Configure(); switch (dbType) { default: case Users.Entities.DBType.SQLite: cfg = cfg.Database(SQLiteConfiguration.Standard.UsingFile(connectionString)); break; case Users.Entities.DBType.MySql: cfg = cfg.Database(MySQLConfiguration.Standard.ConnectionString(connectionString)); break; } switch (database) { default: case Users.Entities.DBKind.Config: case Users.Entities.DBKind.RemoteConfig: cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf()); break; case Users.Entities.DBKind.Results: cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf()); break; } if (createDB) { return cfg.ExposeConfiguration(BuildSchemaCreate).BuildSessionFactory(); } else { return cfg.ExposeConfiguration(BuildSchema).BuildSessionFactory(); } } catch (Exception exc) { MessageBox.Show(string.Format(Strings.Cannot_open_DB_Cause_0, exc.Message), Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Error); return null; } } public delegate void BuildSchemaDlgt(Configuration config); static void BuildSchema(Configuration config) { /// This NHibernate tool takes a configuration (with mapping info in) /// and exports a database schema from it new SchemaExport(config).SetOutputFile("db_schema"); } static void BuildSchemaCreate(Configuration config) { /// This NHibernate tool takes a configuration (with mapping info in) /// and exports a database schema from it new SchemaExport(config).Create(true, true); } /// Create a NHibernate session for the given database public static ISession CreateSession(Users.Entities.DBKind database) { int ix = (int)database; if (ix < 0 || ix >= (int)Users.Entities.DBKind.Count) return null; if (SessionFactories[ix] == null) SessionFactories[ix] = CreateSessionFactory(database); return SessionFactories[ix].OpenSession(); } /// /// 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 CreateEmptyConfigDB(Users.Entities.DBType dbType, string connectionString) { ISessionFactory sessionFactory = CreateSessionFactory(Users.Entities.DBKind.Config, dbType, connectionString, true); if (sessionFactory == null) return false; /// Populate the database using (var session = sessionFactory.OpenSession()) { using (var transaction = session.BeginTransaction()) { /// /// Prepare all groups /// var testers = new Config.Entities.Group(Users.Entities.GID.Testers); var testingSpecialists = new Config.Entities.Group(Users.Entities.GID.TestingSpecialists); var headOfLab = new Config.Entities.Group(Users.Entities.GID.HeadOfLab); var maintenanceSpecialists = new Config.Entities.Group(Users.Entities.GID.MaintenanceSpecialists); var metrologists = new Config.Entities.Group(Users.Entities.GID.Metrologists); var calibrationSpecialists = new Config.Entities.Group(Users.Entities.GID.CalibrationSpecialists); var administrators = new Config.Entities.Group(Users.Entities.GID.Administrators); /// Create the user 'admin' add his groups var admin = new Config.Entities.User { UserName = Data.AdminUsername, FullName = Strings.Administrator, LastPwChange = DateTime.Now }; admin.SetPassword(Data.AdminPassword); admin.AddGroup(testers); admin.AddGroup(testingSpecialists); admin.AddGroup(headOfLab); admin.AddGroup(maintenanceSpecialists); admin.AddGroup(metrologists); admin.AddGroup(calibrationSpecialists); admin.AddGroup(administrators); session.SaveOrUpdate(admin); ///// Create the control board component //var cmpnt = (new BenchControl.Elde.ControlBoardCfg(new BenchControl.Elde.ControlBoardFactory())).CreateDbEntity(); //session.SaveOrUpdate(cmpnt); transaction.Commit(); } } return true; } } }