// Determines whether the timestamps in the file extend beyond user-defined thresholds. private static void ValidateFileTimestamps(string filePath, FileGroup fileGroup, SystemSettings systemSettings, FileInfoDataContext fileInfo) { DateTime now; double timeDifference; // Get the current time in XDA's time zone now = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, systemSettings.XDATimeZoneInfo); // Determine whether past timestamp validation is disabled if (systemSettings.MinTimeOffset > 0.0D) { // Get the total number of hours between the current time and the start time of the data in the file timeDifference = now.Subtract(fileGroup.DataStartTime).TotalHours; // Determine whether the number of hours exceeds the threshold if (timeDifference > systemSettings.MinTimeOffset) throw new FileSkippedException($"Skipped file \"{filePath}\" because data start time '{fileGroup.DataStartTime}' is too old."); } // Determine whether future timestamp validation is disabled if (systemSettings.MaxTimeOffset > 0.0D) { // Get the total number of hours between the current time and the end time of the data in the file timeDifference = fileGroup.DataEndTime.Subtract(now).TotalHours; // Determine whether the number of hours exceeds the threshold if (timeDifference > systemSettings.MaxTimeOffset) throw new FileSkippedException($"Skipped file \"{filePath}\" because data end time '{fileGroup.DataEndTime}' is too far in the future."); } }
/// <summary> /// Gets the file group containing information about the file on /// the given file path, as well as the files related to it. /// </summary> /// <param name="dataContext">The data context used for database lookups.</param> /// <param name="xdaTimeZone">The time zone used by openXDA.</param> /// <returns></returns> public FileGroup GetFileGroup(FileInfoDataContext dataContext, TimeZoneInfo xdaTimeZone) { FileInfo fileInfo; FileGroup fileGroup; DataFile dataFile; fileGroup = new FileGroup(); fileGroup.ProcessingStartTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, xdaTimeZone); foreach (string file in GSF.IO.FilePath.GetFileList($"{m_filePathWithoutExtension}.*")) { fileInfo = new FileInfo(file); dataFile = new DataFile(); dataFile.FilePath = file; dataFile.FilePathHash = file.GetHashCode(); dataFile.FileSize = fileInfo.Length; dataFile.CreationTime = TimeZoneInfo.ConvertTimeFromUtc(fileInfo.CreationTimeUtc, xdaTimeZone); dataFile.LastWriteTime = TimeZoneInfo.ConvertTimeFromUtc(fileInfo.LastWriteTimeUtc, xdaTimeZone); dataFile.LastAccessTime = TimeZoneInfo.ConvertTimeFromUtc(fileInfo.LastAccessTimeUtc, xdaTimeZone); dataFile.FileGroup = fileGroup; } dataContext.FileGroups.InsertOnSubmit(fileGroup); dataContext.SubmitChanges(); return fileGroup; }
// Determines the start time and end time of the given data and sets the properties on the given file group. private static void SetDataTimeRange(MeterDataSet meterDataSet, FileInfoDataContext fileInfo) { DateTime dataStartTime; DateTime dataEndTime; dataStartTime = meterDataSet.DataSeries .Concat(meterDataSet.Digitals) .Where(dataSeries => dataSeries.DataPoints.Any()) .Select(dataSeries => dataSeries.DataPoints.First().Time) .DefaultIfEmpty() .Min(); dataEndTime = meterDataSet.DataSeries .Concat(meterDataSet.Digitals) .Where(dataSeries => dataSeries.DataPoints.Any()) .Select(dataSeries => dataSeries.DataPoints.Last().Time) .DefaultIfEmpty() .Max(); if (dataStartTime != default(DateTime)) meterDataSet.FileGroup.DataStartTime = dataStartTime; if (dataEndTime != default(DateTime)) meterDataSet.FileGroup.DataEndTime = dataEndTime; fileInfo.SubmitChanges(); }
// Loads a file group containing information about the file on the given // file path, as well as the files related to it, into the database. private FileGroup LoadFileGroup(FileInfoDataContext dataContext, int fileGroupID) { return dataContext.FileGroups.FirstOrDefault(fileGroup => fileGroup.ID == fileGroupID); }