private bool CheckCanUpgrade(DbVersionInfo oldDbVersion) { var appVersion = _database.DbModel.EntityApp.Version; if (oldDbVersion != null && oldDbVersion.Version > appVersion) { _upgradeInfo.Status = UpgradeStatus.HigherVersionDetected; OnHigherVersionDetected(); var error = StringHelper.SafeFormat( "Downgrade detected: database version ({0}) is higher than EntityApp version ({1}). Activation canceled.", oldDbVersion.Version, appVersion); _log.Error(error); return(false); } switch (_database.Settings.UpgradeMode) { case DbUpgradeMode.Always: return(true); case DbUpgradeMode.NonProductionOnly: if (oldDbVersion != null && oldDbVersion.InstanceType == DbInstanceType.Production) { _upgradeInfo.Status = UpgradeStatus.NotAllowed; return(false); } return(true); case DbUpgradeMode.Never: default: _upgradeInfo.Status = UpgradeStatus.NotAllowed; return(false); } }
private string SerializeValues(DbVersionInfo versionInfo) { if (versionInfo.Values == null || versionInfo.Values.Count == 0) { return(null); } return(string.Join(Environment.NewLine, versionInfo.Values.Select(de => de.Key + "=" + de.Value))); }
// We cannot use regular access thru EntitySession - db info/version loads at the very start of connecting to db; // the entity app is not ready yet (schema not updated, etc). public DbVersionInfo LoadDbInfo(DbSettings settings, string appName, Vita.Data.Driver.DbModelLoader loader) { var thisSchema = settings.ModelConfig.GetSchema(this.Area); var prefix = settings.ModelConfig.Options.IsSet(DbOptions.AddSchemaToTableNames) ? thisSchema + "_" : string.Empty; var dbInfoName = prefix + "DbInfo"; var dbModuleInfoName = prefix + "DbModuleInfo"; if (!loader.TableExists(thisSchema, dbInfoName)) { return(null); } try { var dbInfo = new DbVersionInfo(); var sql = settings.Driver.GetDirectSelectAllSql(thisSchema, dbInfoName); var dt = loader.ExecuteSelect(sql); var appRow = dt.FindRow("AppName", appName); if (appRow != null) { dbInfo.InstanceType = (DbInstanceType)appRow.GetAsInt("InstanceType"); var strVersion = appRow.GetAsString("Version"); Version dbVersion; if (Version.TryParse(strVersion, out dbVersion)) { dbInfo.Version = dbVersion; } // 'Values' column appears in v 1.1 if (dt.HasColumn("Values")) { var strValues = appRow.GetAsString("Values"); DeserializeValues(dbInfo, strValues); } } //if appRow //Read modules sql = settings.Driver.GetDirectSelectAllSql(thisSchema, dbModuleInfoName); dt = loader.ExecuteSelect(sql); foreach (DbRow row in dt.Rows) { var moduleName = row.GetAsString("ModuleName"); var schema = row.GetAsString("Schema"); var strModuleVersion = row.GetAsString("Version"); Version v; if (!Version.TryParse(strModuleVersion, out v)) { v = null; } dbInfo.Modules.Add(new ModuleDbVersionInfo(schema, moduleName, v)); } return(dbInfo); } catch (Exception ex) { Trace.WriteLine("Failed to load DbInfo record: " + ex.ToLogString()); //Debugger.Break(); return(null); } } //method
public DbVersionInfo LoadDbVersionInfo(DbModel dbModel, DbSettings settings, ILog log) { var tblDbInfo = dbModel.GetTable(typeof(IDbInfo), throwIfNotFound: false); Util.Check(tblDbInfo != null, "DbInfo table not defined in DB Model."); // Empty/zero verson var versionInfo = new DbVersionInfo(); // Check that table actually exists in the database var driver = settings.Driver; if (!TableExists(settings, tblDbInfo)) { return(versionInfo); //zero version } try { var dt = SelectAllFrom(settings, tblDbInfo); var appRow = dt.FindRow(nameof(IDbInfo.AppName), dbModel.EntityApp.AppName); if (appRow != null) { versionInfo.InstanceType = (DbInstanceType)appRow.GetAsInt(nameof(IDbInfo.InstanceType)); var strVersion = appRow.GetAsString(nameof(IDbInfo.Version)); Version dbVersion; if (Version.TryParse(strVersion, out dbVersion)) { versionInfo.Version = dbVersion; } var strValues = appRow.GetAsString(nameof(IDbInfo.Values)); DeserializeValues(versionInfo, strValues); } //if appRow //Read modules var tblDbModuleInfo = dbModel.GetTable(typeof(IDbModuleInfo)); dt = SelectAllFrom(settings, tblDbModuleInfo); foreach (var row in dt.Rows) { var moduleName = row.GetAsString(nameof(IDbModuleInfo.ModuleName)); var schema = row.GetAsString(nameof(IDbModuleInfo.Schema)); var strModuleVersion = row.GetAsString(nameof(IDbModuleInfo.Version)); if (!Version.TryParse(strModuleVersion, out Version v)) { v = null; } versionInfo.Modules.Add(new ModuleDbVersionInfo(schema, moduleName, v)); } return(versionInfo); } catch (Exception ex) { log.LogError("Failed to load DbInfo record: " + ex.ToLogString()); //Debugger.Break(); throw; } }
private void SaveModulesInfo(IEntitySession session, DbVersionInfo dbVersion) { // important - should use EntitySet here; otherwise MySql fails var moduleRecs = session.EntitySet <IDbModuleInfo>().ToList(); foreach (var mi in dbVersion.Modules) { var mrec = moduleRecs.FirstOrDefault(r => r.ModuleName == mi.ModuleName && r.Schema == mi.Schema); if (mrec == null) { mrec = session.NewEntity <IDbModuleInfo>(); mrec.ModuleName = mi.ModuleName; mrec.Schema = mi.Schema; } mrec.Version = mi.Version.ToString(); } }
private void DeserializeValues(DbVersionInfo version, string str) { version.Values.Clear(); if (string.IsNullOrWhiteSpace(str)) { return; } var lines = str.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); foreach (var line in lines) { var arr = line.Split('='); if (arr.Length < 2) { continue; } version.Values[arr[0]] = arr[1]; } }
private bool CheckCanUpgrade(DbVersionInfo oldDbVersion) { var appVersion = _database.DbModel.EntityApp.Version; if (oldDbVersion != null && oldDbVersion.Version > appVersion) { _upgradeInfo.Status = UpgradeStatus.HigherVersionDetected; OnHigherVersionDetected(); var error = StringHelper.SafeFormat( "Downgrade detected: database version ({0}) is higher than EntityApp version ({1}). Activation canceled.", oldDbVersion.Version, appVersion); _log.Error(error); return false; } switch (_database.Settings.UpgradeMode) { case DbUpgradeMode.Always: return true; case DbUpgradeMode.NonProductionOnly: if (oldDbVersion != null && oldDbVersion.InstanceType == DbInstanceType.Production) { _upgradeInfo.Status = UpgradeStatus.NotAllowed; return false; } return true; case DbUpgradeMode.Never: default: _upgradeInfo.Status = UpgradeStatus.NotAllowed; return false; } }