Skip to content

Instantly share code, notes, and snippets.

@GeorgeTsiokos
Created October 16, 2017 16:53
Show Gist options
  • Save GeorgeTsiokos/76c2c41b9406c940729d92a871a157b1 to your computer and use it in GitHub Desktop.
Save GeorgeTsiokos/76c2c41b9406c940729d92a871a157b1 to your computer and use it in GitHub Desktop.
QuickFix SessionSettingsExtensions POC
public static class SessionSettingsExtensions
{
public static bool TryUseWeekdaySessionSettings(this SessionSettings sessionSettings)
{
var allSessionIds = sessionSettings.GetSessions();
var result = allSessionIds.Select(sessionId => TryUseWeekdaySessionSettings(sessionSettings, sessionId)).All(x => x);
Console.WriteLine(sessionSettings);
return result;
}
public static void Archive(this SessionSettings sessionSettings)
{
var allSessionIds = sessionSettings.GetSessions();
#if(DEBUG)
foreach (var sessionId in allSessionIds)
Archive(sessionSettings, sessionId);
#else
Parallel.ForEach(allSessionIds, sessionId => Archive(sessionSettings, sessionId));
#endif
}
public static bool TryUseWeekdaySessionSettings(this SessionSettings sessionSettings, SessionID sessionId)
{
var setting = sessionSettings.Get(sessionId).OfType<KeyValuePair<string, string>>().ToDictionary(x => x.Key, x => x.Value, StringComparer.OrdinalIgnoreCase);
if (setting.ContainsKey(SessionSettings.START_DAY) || setting.ContainsKey(SessionSettings.END_DAY))
return false;
if (!setting.ContainsKey(SessionSettings.START_TIME) || !setting.ContainsKey(SessionSettings.END_TIME))
return false;
if (string.Equals(setting[SessionSettings.CONNECTION_TYPE], "acceptor", StringComparison.OrdinalIgnoreCase))
return false;
sessionSettings.Remove(sessionId);
foreach (var weekday in GetWeekdays())
{
var sessionQualifier = GetSessionQualifier(weekday.End);
var weekdayId = new SessionID(sessionId.BeginString, sessionId.SenderCompID, sessionId.SenderSubID, sessionId.SenderLocationID, sessionId.TargetCompID, sessionId.TargetSubID, sessionId.TargetLocationID, sessionQualifier);
var settings = new Dictionary("SESSION", setting);
settings.SetString(SessionSettings.SESSION_QUALIFIER, sessionQualifier);
settings.SetDay(SessionSettings.START_DAY, weekday.Start);
settings.SetDay(SessionSettings.END_DAY, weekday.End);
sessionSettings.Set(weekdayId, settings);
}
return true;
}
static string GetSessionQualifier(DayOfWeek dayOfWeek) => $"{(int) dayOfWeek}-{dayOfWeek.ToString().ToUpperInvariant()}";
public static void Archive(this SessionSettings sessionSettings, SessionID sessionId)
{
if (IsActive(sessionSettings, sessionId))
return;
var settings = sessionSettings.Get(sessionId);
var prefix = FileStore.Prefix(sessionId);
var destinationArchiveFileName = $"{DateTime.Now:yyyy-MM-dd}-{prefix}-{DateTime.Now:HH-mm-ss}.zip";
var files = GetFiles(prefix, settings.GetString(SessionSettings.FILE_STORE_PATH)).Concat(GetFiles(prefix, settings.GetString(SessionSettings.FILE_LOG_PATH))).ToArray();
if (files.Length < 1)
return;
if (!AreEmpty(files))
using (var zipArchive = ZipFile.Open(destinationArchiveFileName, File.Exists(destinationArchiveFileName) ? ZipArchiveMode.Update : ZipArchiveMode.Create))
{
foreach (var file in files)
zipArchive.CreateEntryFromFile(file.FullName, file.Name, CompressionLevel.Optimal);
}
foreach (var file in files)
try { file.Delete(); }
catch { }
}
static IEnumerable<FileInfo> GetFiles(string prefix, string path)
{
var directoryInfo = new DirectoryInfo(path);
return directoryInfo.EnumerateFiles($"{prefix}*.*", SearchOption.TopDirectoryOnly);
}
static bool AreEmpty(IEnumerable<FileInfo> files)
{
bool Predicate(FileInfo file)
{
var length = file.Name.EndsWith(".event.current.log") ? 3 : 1;
using (var streamReader = file.OpenText())
{
var lines = streamReader.ReadToEnd().Split(new[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries);
return lines.Length <= length;
}
}
return files.All(Predicate);
}
static IEnumerable<(DayOfWeek Start, DayOfWeek End)> GetWeekdays()
{
yield return (DayOfWeek.Sunday, DayOfWeek.Monday);
yield return (DayOfWeek.Monday, DayOfWeek.Tuesday);
yield return (DayOfWeek.Tuesday, DayOfWeek.Wednesday);
yield return (DayOfWeek.Wednesday, DayOfWeek.Thursday);
yield return (DayOfWeek.Thursday, DayOfWeek.Friday);
}
static bool IsActive(SessionSettings sessionSettings, SessionID sessionId)
{
var now = DateTime.Now;
var dayOfWeek = now.DayOfWeek;
var settings = sessionSettings.Get(sessionId);
if (settings.Has(SessionSettings.START_DAY) && settings.Has(SessionSettings.END_DAY))
{
var startDay = settings.GetDay(SessionSettings.START_DAY);
var endDay = settings.GetDay(SessionSettings.END_DAY);
if (dayOfWeek != startDay && dayOfWeek != endDay)
return false;
}
if (settings.Has(SessionSettings.START_TIME))
{
var startTime = TimeSpan.Parse(settings.GetString(SessionSettings.START_TIME));
if (now.TimeOfDay < startTime)
return false;
}
if (settings.Has(SessionSettings.END_TIME))
{
var endTime = TimeSpan.Parse(settings.GetString(SessionSettings.END_TIME));
if (now.TimeOfDay > endTime)
return false;
}
return true;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment