using Newtonsoft.Json; using SteamWare; using System; using System.Collections; namespace WebLCP { public class dataLayer { #region Public Fields public static dataLayer man = new dataLayer(); public DS_AppTableAdapters.JobsListTableAdapter taJL; #endregion Public Fields #region Public Constructors public dataLayer() { initAdapters(); setupConnection(); } #endregion Public Constructors #region Private Methods /// /// Effettua vera pulizia directory /// /// /// private static void forceClean(string sourceDir, DateTime dataLimite, bool updateDb) { logger.lg.scriviLog($"Richiesta eliminazione file + antecedenti {dataLimite} nella cartella {sourceDir}"); fileMover.obj.setDirectoryMapPath(sourceDir); fileMover.obj.checkDir(); // eliminazione files! var elencoFiles = fileMover.obj.elencoFiles_FI(); foreach (var fi in elencoFiles) { if (fi.CreationTime < dataLimite && fi.Name != "PlaceHolder.file") { fi.Delete(); } } // eliminazione directory! var elencoDir = fileMover.obj.elencoSubdir_DI(); foreach (var di in elencoDir) { if (di.CreationTime < dataLimite) { // SE richeisto di aggiornare DB... if (updateDb) { // registro che ho ELIMINATO il job... int jobId = 0; try { string pathName = di.Name.Replace("J", ""); int.TryParse(pathName, out jobId); // registro che ho eliminato! man.taJL.updateDeleted(jobId, DateTime.Now); } catch { } } // effettiva delete! di.Delete(true); } } } private void initAdapters() { taJL = new DS_AppTableAdapters.JobsListTableAdapter(); } private void setupConnection() { string connString = memLayer.ML.CRS("AdmodellingConnectionString"); taJL.Connection.ConnectionString = connString; } #endregion Private Methods #region Public Methods /// /// Elenco dei JOBS selezionati e salvati in cache /// /// public static ICollection getSelectedJobs() { ArrayList al = new ArrayList(); string rawdata = memLayer.ML.StringSessionObj("jobSelection"); if (rawdata != "") { al = JsonConvert.DeserializeObject(rawdata); } // restituisco array! return al; } /// /// Effettua verifica jobs /// public void checkJobs() { string jobName = ""; string resultsDir = ""; // verifica se ci siano JOB in corso --> completati DS_App.JobsListDataTable tabJobsAperti = taJL.getIncomp(); if (tabJobsAperti.Count > 0) { // dir di riferimento string completedDir = $"{memLayer.ML.CRS("clusterBaseDir")}OUT\\"; // cerco SE siano finiti su filesystem... fileMover.obj.setDirectory(completedDir); foreach (var currJob in tabJobsAperti) { // calcolo nome folder... jobName = "J" + currJob.JobId.ToString("D9"); // cerco se ci sia... System.IO.DirectoryInfo[] elencoDir = fileMover.obj.elencoSubdir_DI(jobName); if (elencoDir.Length > 0) { foreach (var currDir in elencoDir) { bool copyDone = false; bool delDone = false; bool dbDone = false; try { // calcolo dir locale... resultsDir = System.Web.HttpContext.Current.Server.MapPath($"{memLayer.ML.CRS("resultsDir")}\\{jobName}"); // sposto folder in dir locale.. fileMover.DirectoryCopy(currDir.FullName, resultsDir, true, true); copyDone = true; } catch (Exception exc) { logger.lg.scriviLog($"Eccezione in copia folder a fine job:{Environment.NewLine}{exc}", tipoLog.EXCEPTION); } if (copyDone) { // status: parto da default = incomplete... int newStatus = (int)JStatus.PROC_INCOMPLETE; // se ho il file message.err --> errore int downlSize = 0; var elFilesRes = fileMover.obj.elencoFilesDir(resultsDir); if (elFilesRes.Count > 0) { // cerco eventuale file .err foreach (var file in elFilesRes) { // se è "message.err" --> ho errore if (file.Nome.Contains("message.err")) { newStatus = (int)JStatus.PROC_ERROR; break; } // se ho txt --> completato else if (file.Nome.EndsWith(".txt")) { newStatus = (int)JStatus.COMPLETED; break; } } // ora calcolo dimensione da somma files... foreach (var file in elFilesRes) { downlSize += (int)(file.size * 1024); } } try { // registro su DB man.taJL.updateProcessed(currJob.JobId, newStatus, DateTime.Now, downlSize, $"{memLayer.ML.CRS("resultsDir")}{jobName}"); dbDone = true; } catch (Exception exc) { logger.lg.scriviLog($"Eccezione in salvataggio su DB a fine job:{Environment.NewLine}{exc}", tipoLog.EXCEPTION); } if (dbDone) { try { //elimino fileMover.obj.setDirectory(currDir.FullName); fileMover.obj.eliminaDir(); fileMover.obj.setDirectory(resultsDir); delDone = true; } catch (Exception exc) { logger.lg.scriviLog($"Eccezione in eliminazione folder OUT a fine job:{Environment.NewLine}{exc}", tipoLog.EXCEPTION); } if (delDone) { try { string siteUrl = memLayer.ML.CRS("baseUrl"); // invio email ad utenti al completamento string oggetto = $"Job {currJob.JobDescr} execution has just been completed.
" + $"Job was submitted at {currJob.dtSubmiss} and ended at {DateTime.Now}.
" + $"Please access to {siteUrl} in order to download results"; gestEmail.geAuth.mandaEmail(memLayer.ML.CRS("_fromEmail"), currJob.USER_NAME, $"JOB {currJob.JobDescr} completed", oggetto); } catch (Exception exc) { logger.lg.scriviLog($"Eccezione in invio email a fine job:{Environment.NewLine}{exc}", tipoLog.EXCEPTION); } } } } } } } } } /// /// pulisce folder OUT/download /// - elimino folder oltre 4 settimane (conf) /// public void cleanupJobsDir() { int ageMaxResultFile = memLayer.ML.CRI("ageMaxResultFile"); string sourceDir = $"{memLayer.ML.CRS("resultsDir")}\\"; DateTime dataLimite = DateTime.Now.AddDays(-ageMaxResultFile); #if DEBUG // in debug elimino dopo 10 min... dataLimite = DateTime.Now.AddMinutes(-1440); #endif forceClean(sourceDir, dataLimite, true); } /// /// pulisce folder upload da files in IN lasciati da oltre 30 minuti (conf) /// public void cleanupTempDir() { int ageMaxTempFile = memLayer.ML.CRI("ageMaxTempFile"); if (ageMaxTempFile > 1) { string sourceDir = $"{memLayer.ML.CRS("tempUploadDir")}"; DateTime dataLimite = DateTime.Now.AddMinutes(-ageMaxTempFile); forceClean(sourceDir, dataLimite, false); } } #endregion Public Methods } /// /// Classe oggetto plot /// public class jobData { #region Public Properties public string jobCode { get; set; } = ""; public int jobId { get; set; } = 0; public string jobName { get; set; } = ""; #endregion Public Properties } }