Files
admodelling.org/INTERFACE/WebLCP/dataLayer.cs
T
Samuele E. Locatelli b9033dee88 Test ok con selezione PLOT
2019-10-31 11:55:57 +01:00

219 lines
7.0 KiB
C#

using Newtonsoft.Json;
using SteamWare;
using System;
using System.Collections;
namespace WebLCP
{
public class dataLayer
{
#region area public
public DS_AppTableAdapters.JobsListTableAdapter taJL;
/// <summary>
/// Effettua verifica jobs
/// </summary>
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);
copyDone = true;
}
catch (Exception exc)
{
logger.lg.scriviLog($"Eccezione in copia folder a fine job:{Environment.NewLine}{exc}", tipoLog.EXCEPTION);
}
if (copyDone)
{
try
{
// registro su DB
man.taJL.updateProcessed(currJob.JobId, DateTime.Now, 0, $"{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 <b>{currJob.JobDescr}</b> execution has just been completed.<br/>" +
$"Job was submitted at {currJob.dtSubmiss} and ended at {DateTime.Now}.<br/>" +
$"Please access to <a href=\"{siteUrl}\">{siteUrl}</a> 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);
}
}
}
}
}
}
}
}
}
/// <summary>
/// pulisce folder upload da files in IN lasciati da oltre 30 minuti (conf)
/// </summary>
public void cleanupTempDir()
{
int ageMaxTempFile = memLayer.ML.CRI("ageMaxTempFile");
string sourceDir = $"{memLayer.ML.CRS("tempUploadDir")}";
DateTime dataLimite = DateTime.Now.AddMinutes(-ageMaxTempFile);
forceClean(sourceDir, dataLimite, false);
}
/// <summary>
/// Effettua vera pulizia directory
/// </summary>
/// <param name="sourceDir"></param>
/// <param name="dataLimite"></param>
private static void forceClean(string sourceDir, DateTime dataLimite, bool updateDb)
{
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);
}
}
}
/// <summary>
/// pulisce folder OUT/download
/// - elimino folder oltre 4 settimane (conf)
/// </summary>
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);
}
#endregion
public dataLayer()
{
initAdapters();
setupConnection();
}
public static dataLayer man = new dataLayer();
private void setupConnection()
{
string connString = memLayer.ML.CRS("AdmodellingConnectionString");
taJL.Connection.ConnectionString = connString;
}
private void initAdapters()
{
taJL = new DS_AppTableAdapters.JobsListTableAdapter();
}
/// <summary>
/// Elenco dei JOBS selezionati e salvati in cache
/// </summary>
/// <returns></returns>
public static ICollection getSelectedJobs()
{
ArrayList al = new ArrayList();
string rawdata = memLayer.ML.StringSessionObj("jobSelection");
if (rawdata != "")
{
al = JsonConvert.DeserializeObject<ArrayList>(rawdata);
}
// restituisco array!
return al;
}
}
/// <summary>
/// Classe oggetto plot
/// </summary>
public class jobData
{
public int jobId { get; set; }
public string jobCode { get; set; }
}
}