/// /// 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) { if (database < 0 || database >= Users.Entities.DBKind.Count) return null; int ix = (int)database; 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()) { /// /// Create user 'admin' /// var admin = new Config.Entities.User { UserName = Data.AdminUsername, FullName = Strings.Administrator, LastPwChange = DateTime.Now }; admin.SetPassword(Data.AdminPassword); /// /// Prepare all groups, add some of them to admin /// for (Users.Entities.GID gid = 0; gid < Users.Entities.GID.NrOfGroups; gid++) { Config.Entities.Group group = new Config.Entities.Group(gid); switch (gid) { case Users.Entities.GID.Testers: case Users.Entities.GID.TestingSpecialists: case Users.Entities.GID.HeadOfLab: case Users.Entities.GID.MaintenanceSpecialists: case Users.Entities.GID.Metrologists: case Users.Entities.GID.CalibrationSpecialists: case Users.Entities.GID.Administrators: #if TURA_IPERL || TURA_IPERL_NEW || TURA_SPECIAL case Users.Entities.GID.TraceabilityManagement: #elif KEMPNO_50 || KRAKOW_50 || TORUN_50 || WARSAW_END case Users.Entities.GID.MetrologicalAuthority: case Users.Entities.GID.WaterMeterAuthority: #endif admin.AddGroup(group); session.SaveOrUpdate(group); /// Save this group break; } } session.SaveOrUpdate(admin); /// Save user 'admin' transaction.Commit(); } } return true; } } }