/// /// 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 { /// /// NHibernate session factory (to create the database session 'SessionFactory') /// /// A database session public static ISessionFactory CreateSessionFactory(Common.DBKind database, Common.DBType dbType, string connectionString, bool createDB) { try { FluentConfiguration cfg = Fluently.Configure(); switch (dbType) { default: case Common.DBType.MySql: cfg = cfg.Database(MySQLConfiguration.Standard.ConnectionString(connectionString)); break; case Common.DBType.SQLite: cfg = cfg.Database(SQLiteConfiguration.Standard.UsingFile(connectionString)); break; } switch (database) { default: case Common.DBKind.Config: case Common.DBKind.RemoteConfig: cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf()); break; case Common.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 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(Common.DBType dbType, string connectionString) { ISessionFactory sessionFactory = CreateSessionFactory(Common.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 (Common.GID gid = 0; gid < Common.GID.NrOfGroups; gid++) { Config.Entities.Group group = new Config.Entities.Group(gid); switch (gid) { case Common.GID.Testers: case Common.GID.TestingSpecialists: case Common.GID.HeadOfLab: case Common.GID.MaintenanceSpecialists: case Common.GID.Metrologists: case Common.GID.CalibrationSpecialists: case Common.GID.Administrators: #if TURA_IPERL || TURA_IPERL_NEW || TURA_SPECIAL case Common.GID.TraceabilityManagement: #elif KEMPNO_50 || KRAKOW_50 || TORUN_50 || WARSAW_END case Common.GID.MetrologicalAuthority: case Common.GID.WaterMeterAuthority: #endif admin.AddGroup(group); session.SaveOrUpdate(group); /// Save this group break; } } session.SaveOrUpdate(admin); /// Save user 'admin' transaction.Commit(); } } return true; } } }