blob: abc9f1776aa146eed655ae11205b7aed4c3c4ec0 [file] [log] [blame]
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
namespace OfficeOpenXml.FormulaParsing.Logging
{
internal class TextFileLogger : IFormulaParserLogger
{
private StreamWriter _sw;
private const string Separator = "=================================";
private int _count;
private DateTime _startTime = DateTime.Now;
private Dictionary<string, int> _funcs = new Dictionary<string, int>();
private Dictionary<string, long> _funcPerformance = new Dictionary<string, long>();
internal TextFileLogger(FileInfo fileInfo)
{
_sw = new StreamWriter(fileInfo.FullName);
}
private void WriteSeparatorAndTimeStamp()
{
_sw.WriteLine(Separator);
_sw.WriteLine("Timestamp: {0}", DateTime.Now);
_sw.WriteLine();
}
private void WriteAddressInfo(ParsingContext context)
{
if (context.Scopes.Current != null && context.Scopes.Current.Address != null)
{
_sw.WriteLine("Worksheet: {0}", context.Scopes.Current.Address.Worksheet ?? "<not specified>");
_sw.WriteLine("Address: {0}", context.Scopes.Current.Address.Address ?? "<not available>");
}
}
public void Log(ParsingContext context, Exception ex)
{
WriteSeparatorAndTimeStamp();
WriteAddressInfo(context);
_sw.WriteLine(ex);
_sw.WriteLine();
}
public void Log(ParsingContext context, string message)
{
WriteSeparatorAndTimeStamp();
WriteAddressInfo(context);
_sw.WriteLine(message);
_sw.WriteLine();
}
public void Log(string message)
{
WriteSeparatorAndTimeStamp();
_sw.WriteLine(message);
_sw.WriteLine();
}
public void LogCellCounted()
{
_count++;
if (_count%500 == 0)
{
_sw.WriteLine(Separator);
var timeEllapsed = DateTime.Now.Subtract(_startTime);
_sw.WriteLine("{0} cells parsed, time {1} seconds", _count, timeEllapsed.TotalSeconds);
var funcs = _funcs.Keys.OrderByDescending(x => _funcs[x]).ToList();
foreach (var func in funcs)
{
_sw.Write(func + " - " + _funcs[func]);
if (_funcPerformance.ContainsKey(func))
{
_sw.Write(" - avg: " + _funcPerformance[func]/_funcs[func] + " milliseconds");
}
_sw.WriteLine();
}
_sw.WriteLine();
_funcs.Clear();
}
}
public void LogFunction(string func)
{
if (!_funcs.ContainsKey(func))
{
_funcs.Add(func, 0);
}
_funcs[func]++;
}
public void LogFunction(string func, long milliseconds)
{
if (!_funcPerformance.ContainsKey(func))
{
_funcPerformance[func] = 0;
}
_funcPerformance[func] += milliseconds;
}
public void Dispose()
{
_sw.Close();
_sw.Dispose();
}
}
}