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
}
}