Exferia/Exferia_Actualizacion_BD/Datos_Actualizacion_BD.cs

373 lines
19 KiB
C#

using Exferia_Actualizacion_BD._1_Datos;
using Exferia_Actualizacion_BD._3_Vistas;
using Exferia_Actualizacion_BD.General;
using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Modelos_Generales;
using Exferia_EntityFramework;
using Exferia_EntityFramework.Script_Actualizacion;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Transactions;
using System.Windows.Forms;
namespace Exferia_Actualizacion_BD
{
public class Datos_Actualizacion_BD
{
#region Variables privadas
private BackgroundWorker g_obj_TareaAsincrona_EjecutarScripts =null;
private int g_int_Terminado_Correctamente = 0;
private bool g_bol_Termino = false;
private PE_Proceso_Actualizacion g_frm_PE_Proceso_Actualizacion = new PE_Proceso_Actualizacion();
private string g_str_Ruta_Aplicacion = "";
private string g_str_Nombre_ExferiaEntityFramework = "";
#endregion
public int Comprobar_Actualizaciones_BD(string _str_Ruta_Aplicacion,string _str_Nombre_ExferiaEntityFramework)
{
g_int_Terminado_Correctamente = 0;
g_str_Ruta_Aplicacion = _str_Ruta_Aplicacion;
g_str_Nombre_ExferiaEntityFramework = _str_Nombre_ExferiaEntityFramework;
try
{
//Mostrar pantalla de progreso
g_frm_PE_Proceso_Actualizacion.PE_Proceso_Actualizacion_Progreso = 0;
g_frm_PE_Proceso_Actualizacion.PE_Proceso_Total = 0;
g_frm_PE_Proceso_Actualizacion.PE_Proceso_Actualizacion_Titulo = "Comprobando conexión a base de datos ...";
g_frm_PE_Proceso_Actualizacion.PE_Proceso_Actualizacion_InformacionProgreso = 0;
g_frm_PE_Proceso_Actualizacion.Visible = true;
if (g_obj_TareaAsincrona_EjecutarScripts != null)
{
while (g_obj_TareaAsincrona_EjecutarScripts.IsBusy)
Application.DoEvents();
}
else
{
g_obj_TareaAsincrona_EjecutarScripts = new BackgroundWorker();
g_obj_TareaAsincrona_EjecutarScripts.DoWork += new DoWorkEventHandler(TareaAsincrona_EjecutarScripts_DoWork);
g_obj_TareaAsincrona_EjecutarScripts.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_EjecutarScripts_ProgressChanged);
g_obj_TareaAsincrona_EjecutarScripts.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_EjecutarScripts_Completed);
g_obj_TareaAsincrona_EjecutarScripts.WorkerReportsProgress = true;
}
g_bol_Termino = false;
//Ejecutar TareaAsincrona
g_obj_TareaAsincrona_EjecutarScripts.RunWorkerAsync();
//Te quedas esperando a que termine la tarea asincrona de Ejecutar Script
if (g_obj_TareaAsincrona_EjecutarScripts != null)
{
while (g_bol_Termino == false)
{
Application.DoEvents();
Thread.Sleep(10);
}
}
}
catch (Control_Errores )
{
g_bol_Termino = false;
g_frm_PE_Proceso_Actualizacion.Visible = false;
Mensajes.MostrarMensaje(Mensajes.G_STR_ERROR_ACTUALIZACION_BASEDATOS);
g_int_Terminado_Correctamente = -1;
}
catch (Exception ex)
{
g_bol_Termino = false;
g_frm_PE_Proceso_Actualizacion.Visible = false;
Mensajes.MostrarMensaje(Mensajes.G_STR_ERROR_ACTUALIZACION_BASEDATOS);
Control_Errores.Errores_Log("", ex, nameof(Datos_Actualizacion_BD) + "/" + nameof(Comprobar_Actualizaciones_BD));
g_int_Terminado_Correctamente = -1;
}
return g_int_Terminado_Correctamente;
}
private void TareaAsincrona_EjecutarScripts_DoWork(object sender, DoWorkEventArgs e)
{
INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
mdl_ValorDevuelto_Modelo.Mensaje = "";
try
{
PRV_Actualizaciones_Datos obj_PRV_Actualizaciones_Datos = new PRV_Actualizaciones_Datos();
//Version del Exferia_EntityFramework instalada en la aplicacion
FileVersionInfo obj_FileVersion_Exferia_EntityFramework = FileVersionInfo.GetVersionInfo(g_str_Ruta_Aplicacion + @"\" + g_str_Nombre_ExferiaEntityFramework);
Version obj_Version_Exferia_EntityFramework = Version.Parse(obj_FileVersion_Exferia_EntityFramework.ProductVersion);
//Parsenado la base de datos (es solo la primera conuslta a base de datos)
((BackgroundWorker)sender).ReportProgress(0, "2");
//Buscar el Base de datos la ultima version actualizada
PRV_Actualizaciones mdl_PRV_Actualizaciones = obj_PRV_Actualizaciones_Datos.Obtener_UltimaActualizacion();
//Buscar fichero de script de actualizaciones ejecutados
List<INTERNO_Versiones_Modelo> lst_Versiones_Ejecutadas = new List<INTERNO_Versiones_Modelo>();
StreamReader obj_StreamReader_FICHERO = null;
try
{
if (File.Exists(g_str_Ruta_Aplicacion + @"\" + Variables.G_STR_NOMBREFICHERO_ACTUALIZACIONESREALIZADAS))
{
//Recorrer todas las lineas , para ver que script se han ejecutado
int int_Contador = 0;
string str_Linea;
obj_StreamReader_FICHERO = new StreamReader(g_str_Ruta_Aplicacion + @"\" + Variables.G_STR_NOMBREFICHERO_ACTUALIZACIONESREALIZADAS);
while ((str_Linea = obj_StreamReader_FICHERO.ReadLine()) != null)
{
if (str_Linea.Trim().Length > 0)
{
string[] arr_Datos = str_Linea.Split('|');
lst_Versiones_Ejecutadas.Add(new INTERNO_Versiones_Modelo("", new Version(arr_Datos[0]), DateTime.ParseExact(arr_Datos[1], "dd/MM/yyyy HH:mm", CultureInfo.InvariantCulture)));
}
//Aumentaro Contador
int_Contador++;
}
//Cerrar Fichero
obj_StreamReader_FICHERO.Close();
obj_StreamReader_FICHERO.Dispose();
}
}
catch (Exception ex)
{
if (obj_StreamReader_FICHERO == null)
{
obj_StreamReader_FICHERO.Close();
}
Control_Errores.Errores_Log("", ex, nameof(Datos_Actualizacion_BD) + "/" + nameof(Comprobar_Actualizaciones_BD));
g_int_Terminado_Correctamente = -1;
}
//Si no dio ningun Error Comprobamos si hay que ejecutar scripts
if (g_int_Terminado_Correctamente == 0)
{
bool bol_Ejecutar_Script = false;
//Si no tiene fichero de actualizciones generadas se ejecuta
if (lst_Versiones_Ejecutadas.Count == 0)
{
bol_Ejecutar_Script = true;
}
//Si la Version grabada en BD esta a nula, se genera
else if (mdl_PRV_Actualizaciones == null)
{
bol_Ejecutar_Script = true;
}
//Si la ultima version que tengo ejecutada de scrip, no es la ultima version disponible se Ejecuta
else if (lst_Versiones_Ejecutadas.OrderByDescending(m => m.version).FirstOrDefault().version < new Version(mdl_PRV_Actualizaciones.versionETF_Numero_Texto))
{
bol_Ejecutar_Script = true;
}
//Si la Version que hay es menor que la que esta en Base de datos, aviso de Problema de compatibilidad
else if (obj_Version_Exferia_EntityFramework < new Version(mdl_PRV_Actualizaciones.versionETF_Numero_Texto))
{
g_int_Terminado_Correctamente = 1;
}
//Si la Version que hay es mayor que la que esta en Base de datos,se ejecuta
else if (obj_Version_Exferia_EntityFramework > new Version(mdl_PRV_Actualizaciones.versionETF_Numero_Texto))
{
bol_Ejecutar_Script = true;
}
//Se ejecuta para que genere los scripts
if (bol_Ejecutar_Script)
{
//Leer todos los Scripts de Actualizaciones Superiores a la ultima version que se ejecuto
long lng_VersionUltimo_Script_Ejecutado = 0;
if (lst_Versiones_Ejecutadas.Count > 0)
{
lng_VersionUltimo_Script_Ejecutado = long.Parse(lst_Versiones_Ejecutadas.OrderByDescending(m => m.version).FirstOrDefault().version.ToString().Replace(".", ""));
}
Versiones_EF obj_Versiones_EF = new Versiones_EF();
if (obj_Versiones_EF.G_LST_VERSIONES_EF!=null && obj_Versiones_EF.G_LST_VERSIONES_EF.Count>0)
{
List< INTERNO_Versiones_EF_Modelo > lst_INTERNO_Versiones_EF_Modelo = obj_Versiones_EF.G_LST_VERSIONES_EF.OrderBy(m => m.Version_Numerica).Where(x => x.Version_Numerica > lng_VersionUltimo_Script_Ejecutado).ToList();
if (lst_INTERNO_Versiones_EF_Modelo!=null && lst_INTERNO_Versiones_EF_Modelo.Count > 0)
{
//Actualizar Pantalla de Progreso
((BackgroundWorker)sender).ReportProgress(lst_INTERNO_Versiones_EF_Modelo.Count,"0");
try
{
PRV_Actualizaciones mdl_PRV_Actualizaciones_GRABAR = null;
DateTime dtt_FechaHora_Actual = DateTime.Now;
int int_Contador = 0;
foreach (INTERNO_Versiones_EF_Modelo mdl_INTERNO_Versiones_EF_Modelo in lst_INTERNO_Versiones_EF_Modelo.OrderBy(m=>m.Version_Numerica))
{
//Ejecutar los Script Procedimientpo
if (mdl_INTERNO_Versiones_EF_Modelo.Tipo==1)
{
obj_PRV_Actualizaciones_Datos.Ejecutar_Script_Procedimientos(mdl_INTERNO_Versiones_EF_Modelo.Script);
}
//Ejecutar los Script
else
{
obj_PRV_Actualizaciones_Datos.Ejecutar_Script(mdl_INTERNO_Versiones_EF_Modelo.Script);
}
//Grabar registro en BD
mdl_PRV_Actualizaciones_GRABAR = new PRV_Actualizaciones();
mdl_PRV_Actualizaciones_GRABAR.versionEFT_Numero_Numerica = mdl_INTERNO_Versiones_EF_Modelo.Version_Numerica;
mdl_PRV_Actualizaciones_GRABAR.versionETF_Numero_Texto = mdl_INTERNO_Versiones_EF_Modelo.Version.ToString();
mdl_PRV_Actualizaciones_GRABAR.fechaEjecucion = dtt_FechaHora_Actual;
obj_PRV_Actualizaciones_Datos.Insertar(mdl_PRV_Actualizaciones_GRABAR);
//Actualizar Pantalla de Progreso
int_Contador += 1;
((BackgroundWorker)sender).ReportProgress(int_Contador,"1");
}
string str_TextoFichero = "";
//Grabar en el fichero todos los scripts ejecutados
foreach (INTERNO_Versiones_EF_Modelo mdl_INTERNO_Versiones_EF_Modelo in lst_INTERNO_Versiones_EF_Modelo)
{
str_TextoFichero += mdl_INTERNO_Versiones_EF_Modelo.Version.ToString() + "|" + dtt_FechaHora_Actual.ToString("dd/MM/yyyy HH:mm") + System.Environment.NewLine;
}
File.AppendAllText(g_str_Ruta_Aplicacion + @"\" + Variables.G_STR_NOMBREFICHERO_ACTUALIZACIONESREALIZADAS, str_TextoFichero);
}
catch (Control_Errores)
{
mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ERROR_ACTUALIZACION_BASEDATOS;
}
catch (Exception ex)
{
Control_Errores.Errores_Log("", ex, nameof(Datos_Actualizacion_BD) + "/" + nameof(TareaAsincrona_EjecutarScripts_DoWork));
mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ERROR_ACTUALIZACION_BASEDATOS;
}
}
}
}
}
}
catch (ThreadAbortException ex)
{
Thread.ResetAbort();
Control_Errores.Errores_Log(ex.Message, ex, nameof(Datos_Actualizacion_BD) + "/" + nameof(TareaAsincrona_EjecutarScripts_DoWork));
mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ERROR_ACTUALIZACION_BASEDATOS;
}
catch (Control_Errores)
{
mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ERROR_ACTUALIZACION_BASEDATOS;
}
catch (Exception ex)
{
Control_Errores.Errores_Log(ex.Message, ex, nameof(Datos_Actualizacion_BD) + "/" + nameof(TareaAsincrona_EjecutarScripts_DoWork));
mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ERROR_ACTUALIZACION_BASEDATOS;
}
finally
{
e.Result = mdl_ValorDevuelto_Modelo;
}
}
private void TareaAsincrona_EjecutarScripts_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
try
{
if (e.UserState.ToString().Equals("0"))
{
//Vaciar progress .................................................................................................................
g_frm_PE_Proceso_Actualizacion.PE_Proceso_Actualizacion_Progreso = 0;
g_frm_PE_Proceso_Actualizacion.PE_Proceso_Total = e.ProgressPercentage;
g_frm_PE_Proceso_Actualizacion.PE_Proceso_Actualizacion_Titulo = "Actualizando la base de datos, por favor espere ...";
g_frm_PE_Proceso_Actualizacion.PE_Proceso_Actualizacion_InformacionProgreso = 0;
g_frm_PE_Proceso_Actualizacion.Cambiar_Imagen(Imagenes.G_IMG_ESPERA);
//.................................................................................................................................
}
else if (e.UserState.ToString().Equals("1"))
{
g_frm_PE_Proceso_Actualizacion.PE_Proceso_Actualizacion_Progreso = e.ProgressPercentage;
g_frm_PE_Proceso_Actualizacion.PE_Proceso_Actualizacion_InformacionProgreso = e.ProgressPercentage;
}
else if (e.UserState.ToString().Equals("2"))
{
//Vaciar progress .................................................................................................................
g_frm_PE_Proceso_Actualizacion.PE_Proceso_Actualizacion_Progreso = 0;
g_frm_PE_Proceso_Actualizacion.PE_Proceso_Total = e.ProgressPercentage;
g_frm_PE_Proceso_Actualizacion.PE_Proceso_Actualizacion_Titulo = "Montando la base de datos, esto puede tardar unos segundos, por favor espere ...";
g_frm_PE_Proceso_Actualizacion.PE_Proceso_Actualizacion_InformacionProgreso = 0;
g_frm_PE_Proceso_Actualizacion.Cambiar_Imagen(Imagenes.G_IMG_MONTANDOBASEDATOS);
//.................................................................................................................................
}
}
catch (Exception)
{}
}
private void TareaAsincrona_EjecutarScripts_Completed(object sender, RunWorkerCompletedEventArgs e)
{
g_frm_PE_Proceso_Actualizacion.Visible = false;
g_bol_Termino = true;
try
{
INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;
//Mostrar si tuviera algun mensaje
if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
{
g_int_Terminado_Correctamente = -1;
if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
{
Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
}
}
else
{
if (g_int_Terminado_Correctamente == 1)
{
Mensajes.MostrarMensaje(Mensajes.G_STR_VALIDACION_ACTUALIZACION_BASEDATOS_VERSIONLOCAL_INFERIOR);
}
}
}
catch (Exception)
{ }
}
}
}