/// <summary> /// Importa o arquivo de log (insere os registros no banco de dados) /// </summary> private Boolean ImportFile(String fileName, Boolean createDigest) { Boolean result = false; try { // Caso os registros do arquivo não estejam no banco realiza a importação PrintLogPersistence logPersistence = new PrintLogPersistence(1, dataAccess.GetConnection(), this, createDigest); DateRange dateRange = new DateRange(true); DateTime? fileDate = PrintLogFile.GetDate(fileName); if (fileDate != null) { // Verifica se existe alguma impressão na mesma data, considera o intervalo // de um dia ( 23 horas e 59 minutos ) TimeSpan timeSpan = new TimeSpan(23, 59, 00); dateRange.SetRange(fileDate.Value.Date, fileDate.Value.Date.Add(timeSpan)); } if (!logPersistence.FileImported(dateRange)) { result = logPersistence.ImportFile(fileName); } } catch (Exception exc) { fileLogger.LogInfo("Exceção encontrada."); fileLogger.LogError(exc.Message); return(false); } return(result); }
private Boolean ProcessPrintLogFile(String fileName, PrintLogSender printLogSender) { // Informações de trace são enviadas ao listener através de NotifyListener() // O listener grava essas informações em log de arquivo CSVReader reader = new CSVReader(fileName, listener); NotifyListener("Fazendo a leitura do CSV."); DataTable fullTable = reader.Read(); int rowCount = fullTable.Rows.Count; // Verifica se existem registros no CSV if (rowCount < 1) { NotifyListener("CSV inválido. Nenhum registro encontrado."); return(false); } // Informa a quantidade de registros no CSV e uma amostra de seu conteúdo NotifyListener("Quantidade de registros no CSV - " + rowCount); String sampleData = fullTable.Rows[0]["Time"].ToString() + " - " + fullTable.Rows[0]["Document Name"].ToString(); NotifyListener("Amostra dos dados - " + sampleData); // Gera uma view do log com uma faixa de horário String startHour = DateTime.Now.AddHours(-1).ToString("yyyy-MM-dd HH:mm:ss"); String endHour = DateTime.Now.AddHours(+1).ToString("yyyy-MM-dd HH:mm:ss"); String rowFilter = "Time > '" + startHour + "' AND Time < '" + endHour + "'"; DataView view = new DataView(fullTable, rowFilter, null, DataViewRowState.Added); DataTable printedDocumentTable = view.ToTable(); // Cria arquivo que armazenará resumo dos trabalhos de impressão DateTime? fileDate = PrintLogFile.GetDate(fileName); PrintLogDigest digest = new PrintLogDigest(); digest.Create(fileDate); PrintedDocument printedDocument; foreach (DataRow row in printedDocumentTable.Rows) { printedDocument = new PrintedDocument(); printedDocument.tenantId = tenantId; printedDocument.jobTime = DateTime.Parse(row["Time"].ToString()); printedDocument.userName = row["User"].ToString(); printedDocument.printerName = row["Printer"].ToString(); printedDocument.name = row["Document Name"].ToString(); printedDocument.pageCount = int.Parse(row["Pages"].ToString()); printedDocument.copyCount = int.Parse(row["Copies"].ToString()); printedDocument.duplex = ConvertToBool(row["Duplex"].ToString()); printedDocument.color = !ConvertToBool(row["Grayscale"].ToString()); printLogSender.AddPrintedDocument(printedDocument); digest.AddToDigest(printedDocument, row["Language"].ToString(), row["Size"].ToString()); } return(true); }
/// <summary> /// Importa os registros do arquivo de log(.CSV) e insere no banco de dados /// </summary> public Boolean ImportFile(String fileName) { DateTime?fileDate = PrintLogFile.GetDate(fileName); // Informações de trace são enviadas ao listener através de NotifyListener() // O listener grava essas informações em log de arquivo CSVReader reader = new CSVReader(fileName, listener); NotifyListener("Fazendo a leitura do CSV."); DataTable printedDocumentTable = reader.Read(); int rowCount = printedDocumentTable.Rows.Count; // Verifica se existem registros no CSV if (rowCount < 1) { NotifyListener("CSV inválido. Nenhum registro encontrado."); return(false); } // Informa a quantidade de registros no CSV e uma amostra de seu conteúdo NotifyListener("Quantidade de registros no CSV - " + rowCount); String sampleData = printedDocumentTable.Rows[0]["Time"].ToString() + " - " + printedDocumentTable.Rows[0]["Document Name"].ToString(); NotifyListener("Amostra dos dados - " + sampleData); PrintedDocumentDAO printedDocumentDAO = new PrintedDocumentDAO(sqlConnection); CreateDigest(fileDate); PrintedDocument printedDocument; foreach (DataRow row in printedDocumentTable.Rows) { printedDocument = new PrintedDocument(); printedDocument.tenantId = tenantId; printedDocument.jobTime = DateTime.Parse(row["Time"].ToString()); printedDocument.userName = row["User"].ToString(); printedDocument.printerName = row["Printer"].ToString(); printedDocument.name = row["Document Name"].ToString(); printedDocument.pageCount = int.Parse(row["Pages"].ToString()); printedDocument.copyCount = int.Parse(row["Copies"].ToString()); printedDocument.duplex = ConvertToBool(row["Duplex"].ToString()); printedDocument.color = !ConvertToBool(row["Grayscale"].ToString()); printedDocumentDAO.InsertPrintedDocument(printedDocument); AddToDigest(printedDocument, row["Language"].ToString(), row["Size"].ToString()); } return(true); }
public PrintLogSorter(String logPath) { DirectoryInfo dirInfo = new DirectoryInfo(logPath); foreach (FileInfo fileInfo in dirInfo.GetFiles()) { String fileName = fileInfo.Name; int? fileID = PrintLogFile.GetToken(fileName); if (fileID != null) { fileList.Add(fileID.Value, fileName); } } }
/// <summary> /// Importa a massa de dados existente no diretório de logs /// </summary> private void ImportPreviousLogs(String logDirectory) { PrintLogSorter logSorter = new PrintLogSorter(logDirectory); String[] logFiles = logSorter.GetOrderedFiles(); DateTime?lastFileDate = null; // Importa os arquivos encontrados no diretório de log fileLogger.LogInfo("Importando logs pré-existentes no diretório " + logDirectory); foreach (String file in logFiles) { DateTime?fileDate = PrintLogFile.GetDate(file); // considera hora como sendo 00:00:00 DateTime?today = DateTime.Now.Date; // considera hora como sendo 00:00:00 // Importa todos com exceção do arquivo com as impressões de hoje, faz isso no final do dia if ((fileDate != null) && (fileDate != today)) { String fileName = PathFormat.Adjust(logDirectory) + file; // Loga informações sem profundidade, para não sobrecarregar/poluir o arquivo de logs. Apenas // em caso de falha acrescenta detalhes (processa as notificações) fileLogger.LogInfo("Importando arquivo " + Path.GetFileName(fileName)); notifications.Clear(); Boolean imported = ImportFile(fileName, false); if (!imported) // Falha ao importar o log { // São gravados logs detalhados para que se possa determinar a causa da falha ProcessNotifications(); return; } lastFileDate = fileDate; } } // Grava a data do último acesso (baseada na data do último arquivo) if (lastFileDate != null) { PrintLogAccess printLogAccess = new PrintLogAccess(dataAccess.GetConnection()); printLogAccess.SetLastAccess(lastFileDate.Value.AddDays(1)); } }
public Boolean SendPrintJobs(String logDirectories) { Boolean success = true; DateTime today = DateTime.Now.Date; PrintLogSender printLogSender = new PrintLogSender(serviceUrl, listener); String[] directoryArray = logDirectories.Split(new Char[] { ';' }); foreach (String directory in directoryArray) { DirectoryInfo logDir = new DirectoryInfo(directory); String fileName = null; if (logDir.Exists) { fileName = PrintLogFile.MountName(directory, today.Day, today.Month, today.Year); FileInfo logFile = new FileInfo(fileName); if (!logFile.Exists) { fileName = null; } } // Se o arquivo existe, processa seu conteúdo if (!String.IsNullOrEmpty(fileName)) { // Informa dados do arquivo NotifyListener("Arquivo - fileName = " + fileName); if (!ProcessPrintLogFile(fileName, printLogSender)) { success = false; // Falha ao processar o arquivo .CSV } } } if (!printLogSender.FinishSending()) { success = false; // Falha ao enviar algum pacote de logs } return(success); }
public void Execute() { // Verifica se as dependências foram instanciadas (se o método InitializeTaskState foi chamado) if (taskParams == null) { return; } if (dataAccess == null) { return; } if (notifications == null) { return; } if (fileLogger == null) { return; } // Verifica os parâmetros recebidos String logDirectory = taskParams["logDirectory"]; Boolean importPreviousLogs = Boolean.Parse(taskParams["importPreviousLogs"]); dataAccess.OpenConnection(); // "lastAccess" é gravado e recuperado do banco com frequência, logo não pode ser obtido de "taskParams" PrintLogAccess printLogAccess = new PrintLogAccess(dataAccess.GetConnection()); DateTime lastAccess = printLogAccess.GetLastAccess(); // Importa a massa de dados existente if ((importPreviousLogs) && (firstExecution)) { ImportPreviousLogs(logDirectory); firstExecution = false; dataAccess.CloseConnection(); return; } // Procura pelo arquivo do último dia trabalhado String fileName = PrintLogFile.GetLastFile(logDirectory); if (fileName == null) { // Não processa (sai do método) se não achou o arquivo dataAccess.CloseConnection(); return; } // Compara a data do arquivo com a data do último acesso DateTime?fileDate = PrintLogFile.GetDate(fileName); if ((fileDate == null) || (fileDate.Value.CompareTo(lastAccess) < 0)) { // Não processa (sai do método) se o arquivo já foi processado dataAccess.CloseConnection(); return; } // Inicia o append no arquivo de log (acrescentando o "startingDelimiter") fileLogger.LogInfo("Importação de log - Iniciando execução...", true); // Informa dados do arquivo fileLogger.LogInfo("Arquivo - fileName = " + fileName); fileLogger.LogInfo("Data - fileDate = " + fileDate.Value.ToShortDateString()); notifications.Clear(); // Persiste os registros do arquivo de log Boolean imported = ImportFile(fileName, true); ProcessNotifications(); fileLogger.LogInfo("Execução concluída."); // Grava a data do último acesso no banco if (imported) { printLogAccess.SetLastAccess(DateTime.Now); } dataAccess.CloseConnection(); }