コード例 #1
0
        /// <summary>
        /// Prepara un servidor para ser utilizado por Lázaro. Crea estructuras y realiza una carga inicial de datos.
        /// </summary>
        /// <param name="progreso">El objeto OperationProgress donde notificar el progreso</param>
        public Lfx.Types.OperationResult Prepare(Lfx.Types.OperationProgress progreso)
        {
            bool MiProgreso = false;

            if (progreso == null)
            {
                progreso = new Types.OperationProgress("Preparando el almacén de datos", "Se están creando las tablas de datos y se va realizar una carga inicial de datos. Esta operación puede demorar varios minutos.")
                {
                    Modal = true
                };
                progreso.Begin();
                MiProgreso = true;
            }

            // Creación de tablas
            progreso.ChangeStatus("Creando estructuras");
            this.CheckAndUpdateDatabaseStructure(this.MasterConnection, true, progreso);

            this.MasterConnection.EnableConstraints(false);

            string Sql = "";

            using (System.IO.Stream RecursoSql = ObtenerRecurso(@"Data.Struct.dbdata.sql")) {
                using (System.IO.StreamReader Lector = new System.IO.StreamReader(RecursoSql, System.Text.Encoding.UTF8)) {
                    // Carga inicial de datos
                    Sql = this.MasterConnection.CustomizeSql(Lector.ReadToEnd());
                    Lector.Close();
                    RecursoSql.Close();
                }
            }

            // Si hay archivos adicionales de datos para la carga inicial, los incluyo
            // Estos suelen tener datos personalizados de esta instalación en partícular
            if (System.IO.File.Exists(Lfx.Environment.Folders.ApplicationFolder + "default.alf"))
            {
                using (System.IO.StreamReader Lector = new System.IO.StreamReader(Lfx.Environment.Folders.ApplicationFolder + "default.alf", System.Text.Encoding.UTF8)) {
                    Sql += Lfx.Types.ControlChars.CrLf;
                    Sql += this.MasterConnection.CustomizeSql(Lector.ReadToEnd());
                    Lector.Close();
                }
            }

            progreso.ChangeStatus("Carga inicial de datos");
            progreso.Max = Sql.Length;
            //this.MasterConnection.ExecuteSql(Sql);

            do
            {
                string Comando = Lfx.Data.Connection.GetNextCommand(ref Sql);
                try {
                    this.MasterConnection.ExecuteNonQuery(Comando);
                } catch {
                    // Hubo errores, pero continúo
                }
                progreso.ChangeStatus(progreso.Max - Sql.Length);
            }while (Sql.Length > 0);

            progreso.ChangeStatus("Carga de TagList");
            // Cargar TagList y volver a verificar la estructura
            Lfx.Workspace.Master.Structure.TagList.Clear();
            Lfx.Workspace.Master.Structure.LoadBuiltIn();

            this.CheckAndUpdateDatabaseStructure(this.MasterConnection, false, progreso);

            this.MasterConnection.EnableConstraints(true);
            this.CurrentConfig.WriteGlobalSetting("Sistema.DB.Version", Lfx.Workspace.VersionUltima);

            if (MiProgreso)
            {
                progreso.End();
            }
            return(new Lfx.Types.SuccessOperationResult());
        }
コード例 #2
0
ファイル: Workspace.cs プロジェクト: solutema/ultralight
                /// <summary>
                /// Prepara un servidor para ser utilizado por Lázaro. Crea estructuras y realiza una carga inicial de datos.
                /// </summary>
                public Lfx.Types.OperationResult Prepare(Lfx.Types.OperationProgress progreso)
                {
                        bool MiProgreso = false;
                        if (progreso == null) {
                                progreso = new Types.OperationProgress("Preparando el almacén de datos", "Se están creando las tablas de datos y se va realizar una carga inicial de datos. Esta operación puede demorar varios minutos.");
                                progreso.Modal = true;
                                progreso.Begin();
                                MiProgreso = true;
                        }

                        // Creación de tablas
                        progreso.ChangeStatus("Creando estructuras");
                        this.CheckAndUpdateDataBaseStructure(this.MasterConnection, true, progreso);

                        this.MasterConnection.EnableConstraints(false);

                        string Sql = "";
                        using (System.IO.Stream RecursoSql = ObtenerRecurso(@"Data.Struct.dbdata.sql")) {
                                using (System.IO.StreamReader Lector = new System.IO.StreamReader(RecursoSql, System.Text.Encoding.UTF8)) {
                                        // Carga inicial de datos
                                        Sql = this.MasterConnection.CustomizeSql(Lector.ReadToEnd());
                                        Lector.Close();
                                        RecursoSql.Close();
                                }
                        }

                        // Si hay archivos adicionales de datos para la carga inicial, los incluyo
                        // Estos suelen tener datos personalizados de esta instalación en partícular
                        if (System.IO.File.Exists(Lfx.Environment.Folders.ApplicationFolder + "default.alf")) {
                                using (System.IO.StreamReader Lector = new System.IO.StreamReader(Lfx.Environment.Folders.ApplicationFolder + "default.alf", System.Text.Encoding.UTF8)) {
                                        Sql += Lfx.Types.ControlChars.CrLf;
                                        Sql += this.MasterConnection.CustomizeSql(Lector.ReadToEnd());
                                        Lector.Close();
                                }
                        }

                        progreso.ChangeStatus("Carga inicial de datos");
                        progreso.Max = Sql.Length;
                        //this.MasterConnection.ExecuteSql(Sql);
                        
                        do {
                                string Comando = Lfx.Data.Connection.GetNextCommand(ref Sql);
                                try {
                                        this.MasterConnection.ExecuteSql(Comando);
                                } catch {
                                        // Hubo errores, pero continúo
                                }
                                progreso.ChangeStatus(progreso.Max - Sql.Length);
                        }
                        while (Sql.Length > 0);

                        progreso.ChangeStatus("Carga de TagList");
                        // Cargar TagList y volver a verificar la estructura
                        Lfx.Workspace.Master.Structure.TagList.Clear();
                        Lfx.Workspace.Master.Structure.LoadBuiltIn();

                        this.CheckAndUpdateDataBaseStructure(this.MasterConnection, false, progreso);

                        this.MasterConnection.EnableConstraints(true);
                        this.CurrentConfig.WriteGlobalSetting("Sistema.DB.Version", Lfx.Workspace.VersionUltima);

                        if (MiProgreso)
                                progreso.End();
                        return new Lfx.Types.SuccessOperationResult();
                }
コード例 #3
0
        /// <summary>
        /// Verifica la versión de la base de datos y si es necesario actualiza.
        /// </summary>
        /// <param name="ignorarFecha">Ignorar la fecha y actualizar siempre.</param>
        /// <param name="noTocarDatos">Actualizar sólo la estructura. No incorpora ni modifica datos.</param>
        public void CheckAndUpdateDatabaseVersion(bool ignorarFecha, bool noTocarDatos)
        {
            using (Lfx.Data.IConnection Conn = Lfx.Workspace.Master.GetNewConnection("Verificar estructura de la base de datos") as Lfx.Data.IConnection) {
                Conn.RequiresTransaction = false;
                int VersionActual = this.CurrentConfig.ReadGlobalSetting <int>("Sistema.DB.Version", 0);

                if (VersionUltima < VersionActual)
                {
                    this.RunTime.Toast("Es necesario actualizar Lázaro en esta estación de trabajo. Se esperaba la versión " + VersionUltima.ToString() + " de la base de datos, pero se encontró la versión " + VersionActual.ToString() + " que es demasiado nueva.", "Aviso");
                    return;
                }

                // Me fijo si ya hay alguien verificando la estructura
                string FechaInicioVerif    = Lfx.Workspace.Master.CurrentConfig.ReadGlobalSetting <string>("Sistema.VerificarVersionBd.Inicio", string.Empty);
                string FechaInicioVerifMax = Lfx.Types.Formatting.FormatDateTimeSql(System.DateTime.Now.AddMinutes(10).ToUniversalTime());

                if (ignorarFecha == false && string.Compare(FechaInicioVerif, FechaInicioVerifMax) > 0)
                {
                    // Ya hay alguien verificando
                    return;
                }

                DateTime VersionEstructura = Lfx.Types.Parsing.ParseSqlDateTime(this.CurrentConfig.ReadGlobalSetting <string>("Sistema.DB.VersionEstructura", "2000-01-01 00:00:00"));
                DateTime FechaLazaroExe    = new System.IO.FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location).LastWriteTime;
                TimeSpan Diferencia        = FechaLazaroExe - VersionEstructura;
                System.Console.WriteLine("Versión estructura: " + VersionEstructura.ToString());
                System.Console.WriteLine("Versión Lázaro    : " + FechaLazaroExe.ToString() + " (" + Diferencia.ToString() + " más nuevo)");

                if ((noTocarDatos || VersionActual == VersionUltima) && (ignorarFecha == false && Diferencia.TotalHours <= 1))
                {
                    // No es necesario actualizar nada
                    return;
                }

                var Progreso = new Types.OperationProgress("Verificando estructuras de datos", "Se está analizando la estructura del almacén de datos y se van a realizar cambios si fuera necesario")
                {
                    Modal = true
                };
                Progreso.Begin();

                Lfx.Workspace.Master.CurrentConfig.WriteGlobalSetting("Sistema.VerificarVersionBd.Inicio", Lfx.Types.Formatting.FormatDateTimeSql(Lfx.Workspace.Master.MasterConnection.ServerDateTime.ToUniversalTime()));
                Lfx.Workspace.Master.CurrentConfig.WriteGlobalSetting("Sistema.VerificarVersionBd.Estacion", Lfx.Environment.SystemInformation.MachineName);

                try {
                    Conn.ExecuteNonQuery("FLUSH TABLES");
                } catch (Exception ex) {
                    // No tengo permiso... no importa
                    Log.Warn("No se pudo hacer FLUSH TABLES", ex);
                }

                if (noTocarDatos == false && VersionActual < VersionUltima && VersionActual > 0)
                {
                    //Actualizo desde la versión actual a la última
                    for (int i = VersionActual + 1; i <= VersionUltima; i++)
                    {
                        Progreso.ChangeStatus("Pre-actualización " + i.ToString());
                        InyectarSqlDesdeRecurso(Conn, @"Data.Struct.db_upd" + i.ToString() + "_pre.sql");
                    }
                }

                if (ignorarFecha || Diferencia.TotalHours > 1)
                {
                    // Lázaro es más nuevo que la BD por más de 1 hora
                    Progreso.ChangeStatus("Verificando estructuras");
                    this.CheckAndUpdateDatabaseStructure(Conn, false, Progreso);
                    if (noTocarDatos == false)
                    {
                        this.CurrentConfig.WriteGlobalSetting("Sistema.DB.VersionEstructura", Lfx.Types.Formatting.FormatDateTimeSql(FechaLazaroExe.ToUniversalTime()));
                    }
                }

                if (noTocarDatos == false && VersionActual < VersionUltima && VersionActual > 0)
                {
                    for (int i = VersionActual + 1; i <= VersionUltima; i++)
                    {
                        Progreso.ChangeStatus("Post-actualización " + i.ToString());
                        InyectarSqlDesdeRecurso(Conn, @"Data.Struct.db_upd" + i.ToString() + "_post.sql");
                        this.CurrentConfig.WriteGlobalSetting("Sistema.DB.Version", i);
                    }
                }

                Lfx.Workspace.Master.CurrentConfig.WriteGlobalSetting("Sistema.VerificarVersionBd.Inicio", "0");
                Progreso.End();
            }
        }
コード例 #4
0
ファイル: Workspace.cs プロジェクト: solutema/ultralight
                /// <summary>
                /// Verifica la versión de la base de datos y si es necesario actualiza.
                /// </summary>
                /// <param name="ignorarFecha">Ignorar la fecha y actualizar siempre.</param>
                /// <param name="noTocarDatos">Actualizar sólo la estructura. No incorpora ni modifica datos.</param>
                public void CheckAndUpdateDataBaseVersion(bool ignorarFecha, bool noTocarDatos)
                {
                        using (Lfx.Data.Connection Conn = Lfx.Workspace.Master.GetNewConnection("Verificar estructura de la base de datos")) {
                                Conn.RequiresTransaction = false;
                                int VersionActual = this.CurrentConfig.ReadGlobalSetting<int>("Sistema.DB.Version", 0);

                                if (VersionUltima < VersionActual) {
                                        this.RunTime.Toast("Es necesario actualizar Lázaro en esta estación de trabajo. Se esperaba la versión " + VersionUltima.ToString() + " de la base de datos, pero se encontró la versión " + VersionActual.ToString() + " que es demasiado nueva.", "Aviso");
                                        return;
                                }

                                // Me fijo si ya hay alguien verificando la estructura
                                string FechaInicioVerif = Lfx.Workspace.Master.CurrentConfig.ReadGlobalSetting<string>("Sistema.VerificarVersionBd.Inicio", string.Empty);
                                string FechaInicioVerifMax = Lfx.Types.Formatting.FormatDateTimeSql(System.DateTime.Now.AddMinutes(10).ToUniversalTime());

                                if (ignorarFecha == false && string.Compare(FechaInicioVerif, FechaInicioVerifMax) > 0)
                                        // Ya hay alguien verificando
                                        return;

                                DateTime VersionEstructura = Lfx.Types.Parsing.ParseSqlDateTime(this.CurrentConfig.ReadGlobalSetting<string>("Sistema.DB.VersionEstructura", "2000-01-01 00:00:00"));
                                DateTime FechaLazaroExe = new System.IO.FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location).LastWriteTime;
                                TimeSpan Diferencia = FechaLazaroExe - VersionEstructura;
                                System.Console.WriteLine("Versión estructura: " + VersionEstructura.ToString());
                                System.Console.WriteLine("Versión Lázaro    : " + FechaLazaroExe.ToString() + " (" + Diferencia.ToString() + " más nuevo)");

                                if ((noTocarDatos || VersionActual == VersionUltima) && (ignorarFecha == false && Diferencia.TotalHours <= 1)) {
                                        // No es necesario actualizar nada
                                        return;
                                }

                                Lfx.Types.OperationProgress Progreso = new Types.OperationProgress("Verificando estructuras de datos", "Se está analizando la estructura del almacén de datos y se van a realizar cambios si fuera necesario");
                                Progreso.Modal = true;
                                Progreso.Begin();

                                Lfx.Workspace.Master.CurrentConfig.WriteGlobalSetting("Sistema.VerificarVersionBd.Inicio", Lfx.Types.Formatting.FormatDateTimeSql(Lfx.Workspace.Master.MasterConnection.ServerDateTime.ToUniversalTime()));
                                Lfx.Workspace.Master.CurrentConfig.WriteGlobalSetting("Sistema.VerificarVersionBd.Estacion", Lfx.Environment.SystemInformation.MachineName);

                                try {
                                        Conn.ExecuteSql("FLUSH TABLES");
                                } catch {
                                        // No tengo permiso... no importa
                                }

                                if (noTocarDatos == false && VersionActual < VersionUltima && VersionActual > 0) {
                                        //Actualizo desde la versión actual a la última
                                        for (int i = VersionActual + 1; i <= VersionUltima; i++) {
                                                Progreso.ChangeStatus("Pre-actualización " + i.ToString());
                                                InyectarSqlDesdeRecurso(Conn, @"Data.Struct.db_upd" + i.ToString() + "_pre.sql");
                                        }
                                }

                                if (ignorarFecha || Diferencia.TotalHours > 1) {
                                        // Lázaro es más nuevo que la BD por más de 1 hora
                                        Progreso.ChangeStatus("Verificando estructuras");
                                        this.CheckAndUpdateDataBaseStructure(Conn, false, Progreso);
                                        if (noTocarDatos == false)
                                                this.CurrentConfig.WriteGlobalSetting("Sistema.DB.VersionEstructura", Lfx.Types.Formatting.FormatDateTimeSql(FechaLazaroExe.ToUniversalTime()));
                                }

                                if (noTocarDatos == false && VersionActual < VersionUltima && VersionActual > 0) {
                                        for (int i = VersionActual + 1; i <= VersionUltima; i++) {
                                                Progreso.ChangeStatus("Post-actualización " + i.ToString());
                                                InyectarSqlDesdeRecurso(Conn, @"Data.Struct.db_upd" + i.ToString() + "_post.sql");
                                                this.CurrentConfig.WriteGlobalSetting("Sistema.DB.Version", i);
                                        }
                                }

                                Lfx.Workspace.Master.CurrentConfig.WriteGlobalSetting("Sistema.VerificarVersionBd.Inicio", "0");
                                Progreso.End();
                        }
                }