/// <summary> /// Checks the log data for duplicate indexes. /// </summary> /// <param name="logData">The log data.</param> /// <param name="function">The context function</param> /// <param name="delimiter">The data delimiter.</param> /// <param name="isTimeLog">Is the log a time log.</param> /// <param name="mnemonicCount">The count of mnemonics.</param> /// <returns><c>true</c> if Log data has duplicates; otherwise, <c>false</c>.</returns> public static bool HasDuplicateIndexes(this List <string> logData, Functions function, string delimiter, bool isTimeLog, int mnemonicCount) { var warnings = new List <WitsmlValidationResult>(); var indexValues = new HashSet <double>(); foreach (var row in logData) { var values = ChannelDataReader.Split(row, delimiter, mnemonicCount, warnings); var value = values.FirstOrDefault(); if (isTimeLog) { DateTimeOffset dto; if (!DateTimeOffset.TryParse(value, out dto)) { var error = new WitsmlException(function.GetNonConformingErrorCode()); ChannelDataExtensions.HandleInvalidDataRow(error, warnings); continue; } // TODO: Add compatibility option for DuplicateIndexSetting if (indexValues.Contains(dto.UtcTicks)) { return(true); } indexValues.Add(dto.UtcTicks); } else { double doubleValue; if (!double.TryParse(value, out doubleValue)) { var error = new WitsmlException(function.GetNonConformingErrorCode()); ChannelDataExtensions.HandleInvalidDataRow(error, warnings); continue; } // TODO: Add compatibility option for DuplicateIndexSetting if (indexValues.Contains(doubleValue)) { return(true); } indexValues.Add(doubleValue); } } if (warnings.Any()) { WitsmlOperationContext.Current.Warnings.AddRange(warnings); } return(false); }
/// <summary> /// Validates the row data count. /// </summary> /// <param name="values">The values array.</param> /// <param name="data">The data row.</param> /// <param name="channelCount">The channel count.</param> /// <param name="warnings">The collection of validation warnings.</param> /// <returns>A validated array of data row values or an empty array.</returns> public static string[] ValidateRowDataCount(string[] values, string data, int?channelCount = null, ICollection <WitsmlValidationResult> warnings = null) { if (!channelCount.HasValue || values.Length == channelCount) { return(values); } var message = ErrorCodes.ErrorRowDataCount.GetDescription() + $" Expected: {channelCount}; Actual: {values.Length}; Data: {data}"; var error = new WitsmlException(ErrorCodes.ErrorRowDataCount, message); return(HandleInvalidDataRow(error, warnings)); }
/// <summary> /// Validates the row data count. /// </summary> /// <param name="values">The values array.</param> /// <param name="data">The data row.</param> /// <param name="channelCount">The channel count.</param> /// <param name="warnings">The collection of validation warnings.</param> /// <returns>A validated array of data row values or an empty array.</returns> public static string[] ValidateRowDataCount(string[] values, string data, int?channelCount = null, ICollection <WitsmlValidationResult> warnings = null) { if (!channelCount.HasValue || values.Length == channelCount) { return(values); } // TODO: Add compatibility setting to allow handling of trailing delimiter if (values.Length == channelCount + 1 && string.IsNullOrWhiteSpace(values.Last())) { return(values); } var message = ErrorCodes.ErrorRowDataCount.GetDescription() + $" Expected: {channelCount}; Actual: {values.Length}; Data: {data}"; var error = new WitsmlException(ErrorCodes.ErrorRowDataCount, message); return(HandleInvalidDataRow(error, warnings)); }
/// <summary> /// Handles the invalid data row according to the configured InvalidDataRowSetting value. /// </summary> /// <param name="error">The error.</param> /// <param name="warnings">The collection of validation warnings.</param> /// <returns>An empty array.</returns> public static string[] HandleInvalidDataRow(WitsmlException error, ICollection <WitsmlValidationResult> warnings = null) { switch (CompatibilitySettings.InvalidDataRowSetting) { case InvalidDataRowSetting.Ignore: _log.Debug(error.Message); break; case InvalidDataRowSetting.Warn: warnings?.Add(new WitsmlValidationResult((short)error.ErrorCode, error.Message, new[] { "data" })); _log.Warn(error.Message); break; case InvalidDataRowSetting.Error: throw error; default: throw error; } // return blank data row return(new string[0]); }