/// <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()); }
/// <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(); }
/// <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(); } }
/// <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(); } }