/// /// Copyright (c) 2013-2021 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 Common; using Config.Resources; namespace Config { public class FluentCommon { /// /// NHibernate session factory (to create the database session 'SessionFactory') /// /// A database session public static ISessionFactory CreateSessionFactory(DBKind database, DBType dbType, string connectionString, bool createDB) { try { FluentConfiguration cfg = Fluently.Configure(); switch (dbType) { default: case DBType.MySql: cfg = cfg.Database(MySQLConfiguration.Standard.ConnectionString(connectionString)); break; case DBType.SQLite: cfg = cfg.Database(SQLiteConfiguration.Standard.UsingFile(connectionString)); break; } switch (database) { default: case DBKind.Config: case DBKind.RemoteConfig: cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf()); break; case 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(DBType dbType, string connectionString) { ISessionFactory sessionFactory = CreateSessionFactory(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 = GlobalData.AdminUsername, FullName = Strings.Administrator, LastPwChange = DateTime.Now }; admin.SetPassword(GlobalData.AdminPassword); /// /// Prepare all groups, add some of them to admin /// for (GID gid = 0; gid < GID.NrOfGroups; gid++) { Config.Entities.Group group = new Config.Entities.Group(gid); switch (gid) { case GID.Testers: case GID.TestingSpecialists: case GID.HeadOfLab: case GID.MaintenanceSpecialists: case GID.Metrologists: case GID.CalibrationSpecialists: case GID.Administrators: #if TURA_IPERL || TURA_IPERL_NEW || TURA_SPECIAL case GID.TraceabilityManagement: #elif KEMPNO_50 || KRAKOW_50 || TORUN_50 || WARSAW_END case GID.MetrologicalAuthority: case GID.WaterMeterAuthority: #endif admin.AddGroup(group); session.SaveOrUpdate(group); /// Save this group break; } } session.SaveOrUpdate(admin); /// Save user 'admin' transaction.Commit(); } } return true; } } }