Esempio n. 1
0
        /// <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);
            }
        }