Backups.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Data;
6 using System.IO;
7 using System.Data.SqlClient;
8 
9 namespace sage.ew.db
10 {
14  public class Backups
15  {
19  public string _Grupo
20  {
21  get
22  {
23  return _cGrupo;
24  }
25  set
26  {
27  _cGrupo = value;
28  }
29  }
30  private string _cGrupo = string.Empty;
31 
35  public string _RutaLocal
36  {
37  get
38  {
39  return _cRutaLocal;
40  }
41  set
42  {
43  _cRutaLocal = value;
44  }
45  }
46  private string _cRutaLocal = string.Empty;
47 
51  public string _Ejercicio
52  {
53  get
54  {
55  return _cEjercicio;
56  }
57  set
58  {
59  _cEjercicio = value;
60  }
61  }
62  private string _cEjercicio = string.Empty;
63 
67  public string _ErrorMessage
68  {
69  get
70  {
71  return _cErrorMessage;
72  }
73  set
74  {
75  _cErrorMessage = value;
76  }
77  }
78  private string _cErrorMessage = string.Empty;
79 
83  public string _GrupoOrigenBackup
84  {
85  get
86  {
87  return _c_GrupoOrigenBackup;
88  }
89  set
90  {
91  _c_GrupoOrigenBackup = value;
92  }
93  }
94  private string _c_GrupoOrigenBackup = string.Empty;
95 
99  public string _Sufijo
100  {
101  get
102  {
103  return _cSufijo;
104  }
105  set
106  {
107  _cSufijo = value;
108  }
109  }
110  private string _cSufijo = string.Empty;
111 
115  public List<string> _ListaDBRestauradas = new List<string>();
116 
121  public bool _LimpiarEjercicios { get; set; } = false;
122 
126  public List<string> _EjerciciosMantener { get; set; } = new List<string>();
127 
132  public List<string> _EjerciciosCopiados { get; set; } = new List<string>();
133 
134  #region DELEGADOS
135  public delegate void _ActualizarEstadoProgreso(string tcEstado, int tnPorcentaje);
139 
143  public event _ActualizarEstadoProgreso _ActualizarEstado;
144  #endregion
145 
146 
150  public Backups()
151  {
152  }
153 
164  public Backups(string tcGrupo, string tcRutaLocal, string tcEjercicio, string tcGrupoBackup = "", string tcSufijoDB = "", bool tbLimpiarEjercicios = false, List<string> toEjerciciosMantener = null)
165  {
166  _Grupo = tcGrupo;
167  _RutaLocal = tcRutaLocal;
168  _Ejercicio = tcEjercicio;
169  _GrupoOrigenBackup = tcGrupoBackup;
170  _Sufijo = tcSufijoDB;
171  _LimpiarEjercicios = tbLimpiarEjercicios;
172  _EjerciciosMantener = toEjerciciosMantener;
173 
174  _ListaDBRestauradas = new List<string>();
175  }
176 
180  public void _BackupSageSys()
181  {
182  bool lbOk = true;
183 
184  //Comprobamos carpeta, sino la creamos
185  if (!Directory.Exists(_RutaLocal))
186  Directory.CreateDirectory(_RutaLocal);
187 
188  //Copia del SageSys
189  lbOk = DB._DbBackup("EUROWINSYS", _RutaLocal);
190 
191  if (!lbOk)
192  {
193  _ErrorMessage = DB.Error_Message;
194  throw new Exception("Error al ejecutar la copia de los datos: " + _ErrorMessage);
195  }
196  }
197 
202  {
203  bool lbOk = true;
204 
205  DataTable ldtEjercici = new DataTable();
206  DataTable ldtModulos = new DataTable();
207  string lcSql = string.Empty;
208 
209  //Comprobamos carpeta, sino la creamos
210  if (!Directory.Exists(_RutaLocal))
211  Directory.CreateDirectory(_RutaLocal);
212 
213  string lcDbComunes = "COMU" + _Grupo;
214 
215  //Copia del comunes
216  lbOk = DB._DbBackup(lcDbComunes, _RutaLocal);
217 
218  if (!lbOk)
219  {
220  _ErrorMessage = DB.Error_Message;
221  throw new Exception("Error al ejecutar la copia de los datos: " + _ErrorMessage);
222  }
223 
224  //Obtenemos las conexiones de gestion de este comunes
225  lcSql = "select conexion, [any] as anyo from " + DB.SQLDatabaseReal(lcDbComunes, "EJERCICI");
226  DB.SQLExec(lcSql, ref ldtEjercici);
227 
228  if (ldtEjercici != null && ldtEjercici.Rows.Count > 0)
229  {
230  foreach (DataRow rowEjer in ldtEjercici.Rows)
231  {
232  //Comprobamos si hay que copiar un ejercicio o todos
233  if (_Ejercicio != "Todos")
234  {
235  if (Convert.ToString(rowEjer["anyo"]).Trim() == _Ejercicio.Trim())
236  {
237  lbOk = DB._DbBackup(Convert.ToString(rowEjer["conexion"]).Trim(), _RutaLocal);
238  if (!lbOk)
239  {
240  _ErrorMessage = DB.Error_Message;
241  throw new Exception("Error al ejecutar la copia de los datos: " + _ErrorMessage);
242  }
243  break;
244  }
245  }
246  else
247  {
248  if (DB.SQLDatabaseExistStrict(Convert.ToString(rowEjer["anyo"]).Trim())) //Bug 199477
249  {
250  lbOk = DB._DbBackup(Convert.ToString(rowEjer["conexion"]).Trim(), _RutaLocal);
251  if (!lbOk)
252  {
253  _ErrorMessage = DB.Error_Message;
254  throw new Exception("Error al ejecutar la copia de los datos: " + _ErrorMessage);
255  }
256  _EjerciciosCopiados.Add(Convert.ToString(rowEjer["anyo"]).Trim());
257  }
258  }
259  }
260  }
261  //Copia de los módulos
262  lcSql = "select nom_conex from " + DB.SQLDatabaseReal(lcDbComunes, "MODULOS");
263  DB.SQLExec(lcSql, ref ldtModulos);
264 
265  if (ldtModulos != null && ldtModulos.Rows.Count > 0)
266  {
267  foreach (DataRow rowModulo in ldtModulos.Rows)
268  {
269  //Hacemos backup de cada uno de los modulos con el nombre de la conexion directamente
270  lbOk = DB._DbBackup(Convert.ToString(rowModulo["nom_conex"]).Trim(), _RutaLocal);
271  if (!lbOk)
272  {
273  _ErrorMessage = DB.Error_Message;
274  throw new Exception("Error al ejecutar la copia de los datos: " + _ErrorMessage);
275  }
276  }
277  }
278  }
279 
284  {
285  bool llOk = true;
286  DataTable ldtEjercici = new DataTable();
287  DataTable ldtModulos = new DataTable();
288  string lcSql = string.Empty;
289 
290  string lcDbComunes = "COMU" + _Grupo;
291  string lcDbComunesOrigen = "COMU" + _GrupoOrigenBackup;
292 
293  _ActualizarMensajeProgreso("Limpiar bases de datos actuales", 20);
294 
295  llOk = LimpiarGrupoActual(lcDbComunes);
296 
297  _ActualizarMensajeProgreso("Restaurando Comunes: " + lcDbComunes + " ... ", 20);
298 
299  //Restauración del comunes
300  llOk = RestaurarComunes(lcDbComunesOrigen, lcDbComunes);
301 
302  if (!llOk)
303  {
304  _ErrorMessage = DB.Error_Message;
305  return false;
306  }
307 
308  //Restauración de ejercicios
309  llOk = RestaurarEjercicios(lcDbComunes);
310 
311  //Restauración de los módulos
312  llOk = RestaurarModulos(lcDbComunes);
313 
314 
315  _ActualizarMensajeProgreso("", 100);
316 
317  return llOk;
318  }
319 
324  private bool LimpiarGrupoActual(string tcComunesGrupo)
325  {
326  DataTable ldtEjercici = new DataTable();
327  DataTable ldtModulos = new DataTable();
328  bool llOk = true;
329  string lcSql;
330 
331  //Obtener las bases de datos de gestion y modulos de la base de datos actual para tener la lista de bases de datos a borrar
332  lcSql = "select conexion, [any] as anyo from " + DB.SQLDatabaseReal(tcComunesGrupo, "EJERCICI");
333  DB.SQLExec(lcSql, ref ldtEjercici);
334 
335  if (ldtEjercici != null && ldtEjercici.Rows.Count > 0)
336  {
337  foreach (DataRow rowEjer in ldtEjercici.Rows)
338  {
339  if (_Ejercicio != "Todos")
340  {
341  //Task 181077: Si es una copia de ejercicio único, sólo limpiar los ejercicios posteriores y sólo si está marcado como _LimpiarEjercicios
342  if (Convert.ToString(rowEjer["anyo"]).Trim() == _Ejercicio
343  || (_LimpiarEjercicios && Convert.ToInt32(rowEjer["anyo"]) > Convert.ToInt32(_Ejercicio)))
344  {
345  _ActualizarMensajeProgreso("Eliminando Ejercicio: " + Convert.ToString(rowEjer["conexion"]).Trim() + " ... ", 20);
346  llOk = DB._DBRemove(new SqlConnection(DB.Conexion), Convert.ToString(rowEjer["conexion"]).Trim());
347  }
348  }
349  else
350  {
351  //Task 181077: Si estamos ante una copia de "Todos" ejercicios miramos si está marcado _LimpiarEjercicios y sólo en ese caso limpiar, sino dejarlos
352  if (_LimpiarEjercicios || (!_LimpiarEjercicios && !_EjerciciosMantener.Contains(Convert.ToString(rowEjer["anyo"]).Trim())))
353  {
354  _ActualizarMensajeProgreso("Eliminando Ejercicio: " + Convert.ToString(rowEjer["conexion"]).Trim() + " ... ", 20);
355  llOk = DB._DBRemove(new SqlConnection(DB.Conexion), Convert.ToString(rowEjer["conexion"]).Trim());
356  }
357  }
358  }
359  }
360 
361  //Eliminación de los módulos
362  lcSql = "select nom_conex from " + DB.SQLDatabaseReal(tcComunesGrupo, "MODULOS");
363  DB.SQLExec(lcSql, ref ldtModulos);
364 
365  if (ldtModulos != null && ldtModulos.Rows.Count > 0)
366  {
367  foreach (DataRow rowModulo in ldtModulos.Rows)
368  {
369  _ActualizarMensajeProgreso("Eliminando Módulo: " + Convert.ToString(rowModulo["nom_conex"]).Trim() + " ... ", 20);
370  llOk = DB._DBRemove(new SqlConnection(DB.Conexion), Convert.ToString(rowModulo["nom_conex"]).Trim());
371  }
372  }
373 
374  //Eliminar la base de datos de comunes
375  llOk = DB._DBRemove(new SqlConnection(DB.Conexion), tcComunesGrupo);
376 
377  return llOk;
378 
379  }
380 
387  private bool RestaurarComunes(string tcDbComunesOrigen, string tcDbComunes)
388  {
389  bool llOk;
390 
391  llOk = Backups._DbRestore(tcDbComunesOrigen, tcDbComunes, _RutaLocal, GrupoempTools._UserPropBdGrNuevo);
392  if (llOk)
393  {
394  _ListaDBRestauradas.Add(tcDbComunes);
395  }
396 
397  return llOk;
398  }
399 
405  private bool RestaurarEjercicios(string tcDbComunes)
406  {
407  bool llOk = true;
408  string lcSql = string.Empty;
409  string lcConexionNueva = string.Empty;
410  DataTable ldtEjercici = new DataTable();
411 
412  //Obtenemos las conexiones de gestion del comunes restaurado
413  lcSql = "select conexion, [any] as anyo from " + DB.SQLDatabaseReal(tcDbComunes, "EJERCICI");
414  DB.SQLExec(lcSql, ref ldtEjercici);
415 
416  if (ldtEjercici != null && ldtEjercici.Rows.Count > 0)
417  {
418  foreach (DataRow rowEjer in ldtEjercici.Rows)
419  {
420  //Comprobamos si hay que restaurar un ejercicio o todos
421  if (_Ejercicio != "Todos")
422  {
423  if (Convert.ToString(rowEjer["conexion"]).Trim().Length > 2)
424  lcConexionNueva = Convert.ToString(rowEjer["conexion"]).Trim().Substring(0, Convert.ToString(rowEjer["conexion"]).Trim().Length - 2) + _Sufijo;
425 
426  if (Convert.ToString(rowEjer["anyo"]).Trim() == _Ejercicio.Trim())
427  {
428  if (Convert.ToString(rowEjer["conexion"]).Trim().Length > 2)
429  lcConexionNueva = Convert.ToString(rowEjer["conexion"]).Trim().Substring(0, Convert.ToString(rowEjer["conexion"]).Trim().Length - 2) + _Sufijo;
430  else
431  {
432  _ErrorMessage = "Error en la conexión de ejercicio";
433  return false;
434  }
435 
436  _ActualizarMensajeProgreso("Restaurando Ejercicio: " + lcConexionNueva + " ... ", 50);
437 
438  llOk = Backups._DbRestore(Convert.ToString(rowEjer["conexion"]).Trim(), lcConexionNueva, _RutaLocal, GrupoempTools._UserPropBdGrNuevo);
439 
440  if (!llOk)
441  {
442  _ErrorMessage = DB.Error_Message;
443  return false;
444  }
445 
446  //Actualizar conexion de la base de datos de ejercici
447  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcDbComunes, "EJERCICI") + " SET ruta = " + DB.SQLString(lcConexionNueva) + ", rutaser = " + DB.SQLString(lcConexionNueva) +
448  ", conexion = " + DB.SQLString(lcConexionNueva) +
449  " WHERE [any] = " + DB.SQLString(Convert.ToString(rowEjer["anyo"]).Trim());
450  DB.SQLExec(lcSql);
451 
452  //Bug 148848: A parte de marcar como predeterminado el que se restaura, hay que marcar sin predeterminado el resto de ejercicios
453  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcDbComunes, "EJERCICI") +
454  " SET predet = 0 ";
455  DB.SQLExec(lcSql);
456 
457  //Bug 124169: En el momento de restaurar cuando sólo se ha restaurado un ejercicio, marcamos dicho ejercicio como predeterminado en la tabla EJERCICI
458  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcDbComunes, "EJERCICI") +
459  " SET predet = 1 " +
460  " WHERE [any] = " + DB.SQLString(_Ejercicio);
461  DB.SQLExec(lcSql);
462 
463  //break;
464  }
465  else
466  {
467  //Task 147254: Puesto que ahora no borramos los otros ejercicios que haya quitamos la consulta de limpiar la tabla EJERCICI
468  //En su lugar comprobamos si la base de datos que no estamos restaurando existe en sqlserver y si no existe la quitamos de la tabla ejercici restaurada
469  if (!DB._SQLExisteBBDD(lcConexionNueva))
470  {
471  lcSql = "DELETE FROM " + DB.SQLDatabaseReal(tcDbComunes, "EJERCICI") +
472  " WHERE [any] = " + DB.SQLString(Convert.ToString(rowEjer["anyo"]).Trim());
473  DB.SQLExec(lcSql);
474  }
475  }
476  }
477  else
478  {
479  if (Convert.ToString(rowEjer["conexion"]).Trim().Length > 2)
480  lcConexionNueva = Convert.ToString(rowEjer["conexion"]).Trim().Substring(0, Convert.ToString(rowEjer["conexion"]).Trim().Length - 2) + _Sufijo;
481  else
482  {
483  _ErrorMessage = "Error en la conexión de ejercicio";
484  return false;
485  }
486 
487  //Bug 199477. Si ejercicios está null o vacío, como antes, restauramos (copias sin esta lista en metadatos).
488  //Si tiene un valor miramos si existe en la lista de copiados para restaurar su base de datos
489  if (_EjerciciosCopiados == null || _EjerciciosCopiados.Count == 0 ||_EjerciciosCopiados.Contains(Convert.ToString(rowEjer["anyo"]).Trim()))
490  {
491  _ActualizarMensajeProgreso("Restaurando Ejercicio: " + lcConexionNueva + " ... ", 50);
492 
493  llOk = Backups._DbRestore(Convert.ToString(rowEjer["conexion"]).Trim(), lcConexionNueva, _RutaLocal, GrupoempTools._UserPropBdGrNuevo);
494  }
495  else
496  llOk = true;
497  _ListaDBRestauradas.Add(lcConexionNueva);
498 
499  if (!llOk)
500  {
501  _ErrorMessage = DB.Error_Message;
502  return false;
503  }
504 
505  //Actualizar conexion de la base de datos de ejercici
506  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcDbComunes, "EJERCICI") + " SET ruta = " + DB.SQLString(lcConexionNueva) + ", rutaser = " + DB.SQLString(lcConexionNueva) +
507  ", conexion = " + DB.SQLString(lcConexionNueva) +
508  " WHERE [any] = " + DB.SQLString(Convert.ToString(rowEjer["anyo"]).Trim());
509  DB.SQLExec(lcSql);
510  }
511  }
512  }
513 
514  return llOk;
515  }
516 
522  public bool RestaurarModulos(string tcDbComunes)
523  {
524  bool llOk = true;
525  string lcSql = string.Empty;
526  DataTable ldtModulos = new DataTable();
527  string lcConexionNueva = string.Empty;
528 
529  lcSql = "select nombre, nom_conex from " + DB.SQLDatabaseReal(tcDbComunes, "MODULOS");
530  DB.SQLExec(lcSql, ref ldtModulos);
531 
532  if (ldtModulos != null && ldtModulos.Rows.Count > 0)
533  {
534  foreach (DataRow rowModulo in ldtModulos.Rows)
535  {
536  if (Convert.ToString(rowModulo["nom_conex"]).Trim().Length > 2)
537  lcConexionNueva = Convert.ToString(rowModulo["nom_conex"]).Trim().Substring(0, Convert.ToString(rowModulo["nom_conex"]).Trim().Length - 2) + _Sufijo;
538  else
539  {
540  _ErrorMessage = "Error en la conexión de ejercicio";
541  return false;
542  }
543 
544  _ActualizarMensajeProgreso("Restaurando Módulo: " + lcConexionNueva + " ... ", 80);
545 
546  llOk = Backups._DbRestore(Convert.ToString(rowModulo["nom_conex"]).Trim(), lcConexionNueva, _RutaLocal, GrupoempTools._UserPropBdGrNuevo);
547 
548  _ListaDBRestauradas.Add(lcConexionNueva);
549 
550  if (!llOk)
551  {
552  _ErrorMessage = DB.Error_Message;
553  return false;
554  }
555 
556  //Actualizar conexion de la base de datos de ejercici
557  lcSql = "UPDATE " + DB.SQLDatabaseReal(tcDbComunes, "MODULOS") + " SET nom_conex = " + DB.SQLString(lcConexionNueva) + ", tablas = " + DB.SQLString(lcConexionNueva) +
558  " WHERE nombre = " + DB.SQLString(Convert.ToString(rowModulo["nombre"]).Trim());
559  DB.SQLExec(lcSql);
560  }
561  }
562 
563  return llOk;
564  }
565 
566 
576  public static bool _DbRestore(string tcNombreBak, string tcNombreNuevo, string tcCarpetaBackup, string tcPropietario)
577  {
578  string lcRutaDatosBd = string.Empty;
579 
580  //Usar este método que ya directamente nos retorna la ruta de los ficheros de base de datos de este servidor. Necesario cuando queramos restaurar copias
581  //de grupos no existentes
582  if (!DB.DbRutaBaseDatos())
583  {
584  DB.Error_Message = "No se ha podido averiguar la ruta física de los archivos de la base de datos. Error: " + DB.Error_Message;
585  return false;
586  }
587  else
588  lcRutaDatosBd = System.IO.Path.GetDirectoryName(DB._RutaBaseDatos);
589 
590  return DB._DbRestore(tcNombreBak, tcNombreNuevo, tcCarpetaBackup, tcPropietario, lcRutaDatosBd);
591  }
592 
598  private void _ActualizarMensajeProgreso(string tcMensaje, int tnPorcentaje)
599  {
600  if (_ActualizarEstado != null)
601  _ActualizarEstado(tcMensaje, tnPorcentaje);
602  }
603  }
604 }
Backups()
Constructor por defecto
Definition: Backups.cs:150
PE-104237: Clase de Backups para realizar las copias de seguridad
Definition: Backups.cs:14
bool _RestoreBasesDatosGrupo()
Restaurar Bases de datos del grupo de empresas
Definition: Backups.cs:283
void _BackupSageSys()
Task 155235: Método para hacer un backup de la base de datos SageSys (Eurowinsys) ...
Definition: Backups.cs:180
bool RestaurarModulos(string tcDbComunes)
Task 122030: Método para restaurar los módulos de la copia de seguridad
Definition: Backups.cs:522
_ActualizarEstadoProgreso _ActualizarEstado
Evento que se produce al actualizar estado
Definition: Backups.cs:143
void _BackupBasesDatosGrupo()
PE-104237: Backup de las bases de datos del grupo pasado por parámetro
Definition: Backups.cs:201
static bool _DbRestore(string tcNombreBak, string tcNombreNuevo, string tcCarpetaBackup, string tcPropietario)
Task 122030: Método _DbRestore donde ya obtenemos automáticamente la ruta de los ficheros de la base ...
Definition: Backups.cs:576
Backups(string tcGrupo, string tcRutaLocal, string tcEjercicio, string tcGrupoBackup="", string tcSufijoDB="", bool tbLimpiarEjercicios=false, List< string > toEjerciciosMantener=null)
Constructor con parámetros
Definition: Backups.cs:164