/// <summary> /// Verifica la estructura de la base de datos actual y si es necesario modifica para que esté conforme /// al diseño de referencia. /// </summary> /// <param name="dataBase">PrintDataBase mediante el cual se accede a la base de datos.</param> /// <param name="omitPreAndPostSql">Omitir la ejecución de comandos Pre- y Post-actualización de estructura. Esto es útil cuando se actualiza una estructura vacía, por ejemplo al crear una base de datos nueva.</param> /// /// <param name="progreso">El objeto sobre el cual reportar el progreso.</param> public void CheckAndUpdateDataBaseStructure(Lfx.Data.Connection dataBase, bool omitPreAndPostSql, Lfx.Types.OperationProgress progreso) { progreso.ChangeStatus("Verificando estructuras de datos"); bool MustEnableConstraints = false; if (dataBase.ConstraintsEnabled) { dataBase.EnableConstraints(false); MustEnableConstraints = true; } if (omitPreAndPostSql == false) { progreso.ChangeStatus("Ejecutando guión previo..."); InyectarSqlDesdeRecurso(dataBase, @"Data.Struct.db_upd_pre.sql"); } //Primero borro claves foráneas (deleteOnly = true) progreso.ChangeStatus("Eliminando reglas obsoletas..."); dataBase.SetConstraints(Lfx.Workspace.Master.Structure.Constraints, true); try { dataBase.ExecuteSql("FLUSH TABLES"); } catch { // No tengo permiso... no importa } progreso.Max = Lfx.Workspace.Master.Structure.Tables.Count; foreach (Lfx.Data.TableStructure Tab in Lfx.Workspace.Master.Structure.Tables.Values) { string TableLabel = Tab.Label; if (Tab.Label == null) { TableLabel = Tab.Name.ToTitleCase(); } progreso.ChangeStatus(progreso.Value + 1, "Verificando " + TableLabel); dataBase.SetTableStructure(Tab); } //Ahora creo claves nuevas (deleteOnly = false) progreso.ChangeStatus("Estableciendo reglas de integridad"); try { dataBase.ExecuteSql("FLUSH TABLES"); } catch { // No tengo permiso... no importa } dataBase.SetConstraints(Lfx.Workspace.Master.Structure.Constraints, false); if (omitPreAndPostSql == false) { progreso.ChangeStatus("Ejecutando guión posterior..."); InyectarSqlDesdeRecurso(dataBase, @"Data.Struct.db_upd_post.sql"); } if (MustEnableConstraints) { dataBase.EnableConstraints(true); } }