예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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));
        }
예제 #3
0
        /// <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));
        }
예제 #4
0
        /// <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]);
        }