public ChoFixedLengthRecordFieldConfiguration this[string name] { get { return(FixedLengthRecordFieldConfigurations.Where(i => i.Name == name).FirstOrDefault()); } }
internal ChoFixedLengthRecordFieldConfiguration GetFieldConfiguration(string propertyName, ChoFixedLengthRecordFieldAttribute attr = null, Attribute[] otherAttrs = null) { if (!FixedLengthRecordFieldConfigurations.Any(fc => fc.Name == propertyName)) { FixedLengthRecordFieldConfigurations.Add(new ChoFixedLengthRecordFieldConfiguration(propertyName, attr, otherAttrs)); } return(FixedLengthRecordFieldConfigurations.First(fc => fc.Name == propertyName)); }
internal ChoFixedLengthRecordFieldConfiguration GetFieldConfiguration(string fn) { if (!FixedLengthRecordFieldConfigurations.Any(fc => fc.Name == fn)) { FixedLengthRecordFieldConfigurations.Add(new ChoFixedLengthRecordFieldConfiguration(fn)); } return(FixedLengthRecordFieldConfigurations.First(fc => fc.Name == fn)); }
public ChoFixedLengthRecordConfiguration IgnoreField(string fieldName) { var fc = FixedLengthRecordFieldConfigurations.Where(f => f.DeclaringMember == fieldName || f.FieldName == fieldName).FirstOrDefault(); if (fc != null) { FixedLengthRecordFieldConfigurations.Remove(fc); } return(this); }
private void DiscoverRecordFields(Type recordType, bool clear = true) { if (clear) { //SupportsMultiRecordTypes = false; FixedLengthRecordFieldConfigurations.Clear(); } //else // SupportsMultiRecordTypes = true; DiscoverRecordFields(recordType, null, ChoTypeDescriptor.GetProperties(recordType).Where(pd => pd.Attributes.OfType <ChoFixedLengthRecordFieldAttribute>().Any()).Any()); }
private void DiscoverRecordFields(Type recordType) { if (!IsDynamicObject) { FixedLengthRecordFieldConfigurations.Clear(); foreach (PropertyDescriptor pd in ChoTypeDescriptor.GetProperties(recordType).Where(pd => pd.Attributes.OfType <ChoFixedLengthRecordFieldAttribute>().Any())) { //if (!pd.PropertyType.IsSimple()) // throw new ChoRecordConfigurationException("Property '{0}' is not a simple type.".FormatString(pd.Name)); var obj = new ChoFixedLengthRecordFieldConfiguration(pd.Name, pd.Attributes.OfType <ChoFixedLengthRecordFieldAttribute>().First()); obj.FieldType = pd.PropertyType; FixedLengthRecordFieldConfigurations.Add(obj); } } }
public ChoFixedLengthRecordConfiguration IgnoreField <T, TProperty>(Expression <Func <T, TProperty> > field) { if (FixedLengthRecordFieldConfigurations.Count == 0) { MapRecordFields <T>(); } var fc = FixedLengthRecordFieldConfigurations.Where(f => f.DeclaringMember == field.GetFullyQualifiedMemberName()).FirstOrDefault(); if (fc != null) { FixedLengthRecordFieldConfigurations.Remove(fc); } return(this); }
public override void Validate(object state) { base.Validate(state); string line = null; string[] fieldNames = null; if (state is Tuple <long, string> ) { line = ((Tuple <long, string>)state).Item2; } else { fieldNames = state as string[]; } if (RecordLength <= 0 && line != null) { RecordLength = line.Length; } //Validate Header if (FileHeaderConfiguration != null) { if (FileHeaderConfiguration.FillChar != null) { if (FileHeaderConfiguration.FillChar.Value == ChoCharEx.NUL) { throw new ChoRecordConfigurationException("Invalid '{0}' FillChar specified.".FormatString(FileHeaderConfiguration.FillChar)); } if (EOLDelimiter.Contains(FileHeaderConfiguration.FillChar.Value)) { throw new ChoRecordConfigurationException("FillChar [{0}] can't be one of EOLDelimiter characters [{1}]".FormatString(FileHeaderConfiguration.FillChar.Value, EOLDelimiter)); } if (Comments != null) { if ((from comm in Comments where comm.Contains(FileHeaderConfiguration.FillChar.Value.ToString()) select comm).Any()) { throw new ChoRecordConfigurationException("One of the Comments contains FillChar. Not allowed."); } } } } //string[] headers = state as string[]; if (AutoDiscoverColumns && FixedLengthRecordFieldConfigurations.Count == 0 /*&& headers != null*/) { if (RecordType != null && !IsDynamicObject && ChoTypeDescriptor.GetProperties(RecordType).Where(pd => pd.Attributes.OfType <ChoFixedLengthRecordFieldAttribute>().Any()).Any()) { int startIndex = 0; int size = 0; foreach (PropertyDescriptor pd in ChoTypeDescriptor.GetProperties(RecordType).Where(pd => pd.Attributes.OfType <ChoFixedLengthRecordFieldAttribute>().Any())) { //if (!pd.PropertyType.IsSimple()) // throw new ChoRecordConfigurationException("Property '{0}' is not a simple type.".FormatString(pd.Name)); if (FixedLengthFieldDefaultSizeConfiguation == null) { size = ChoFixedLengthFieldDefaultSizeConfiguation.Instance.GetSize(pd.PropertyType); } else { size = FixedLengthFieldDefaultSizeConfiguation.GetSize(pd.PropertyType); } var obj = new ChoFixedLengthRecordFieldConfiguration(pd.Name, startIndex, size); obj.FieldType = pd.PropertyType; FixedLengthRecordFieldConfigurations.Add(obj); startIndex += size; } //RecordLength = startIndex; } else if (!line.IsNullOrEmpty()) { int index = 0; if (IsDynamicObject) { foreach (var item in DiscoverColumns(line)) { var obj = new ChoFixedLengthRecordFieldConfiguration(FileHeaderConfiguration.HasHeaderRecord ? item.Item1 : "Column{0}".FormatString(++index), item.Item2, item.Item3); FixedLengthRecordFieldConfigurations.Add(obj); } } else { Tuple <string, int, int>[] tuples = DiscoverColumns(line); foreach (PropertyDescriptor pd in ChoTypeDescriptor.GetProperties(RecordType)) { if (index < tuples.Length) { var obj = new ChoFixedLengthRecordFieldConfiguration(FileHeaderConfiguration.HasHeaderRecord ? tuples[index].Item1 : pd.Name, tuples[index].Item2, tuples[index].Item3); FixedLengthRecordFieldConfigurations.Add(obj); index++; } else { break; } } } } else if (!fieldNames.IsNullOrEmpty()) { int startIndex = 0; int fieldLength = ChoFixedLengthFieldDefaultSizeConfiguation.Instance.GetSize(typeof(string)); foreach (string fn in fieldNames) { var obj = new ChoFixedLengthRecordFieldConfiguration(fn, startIndex, fieldLength); FixedLengthRecordFieldConfigurations.Add(obj); startIndex += fieldLength; } } } if (FixedLengthRecordFieldConfigurations.Count == 0) { throw new ChoRecordConfigurationException("No record fields specified."); } //Derive record length from fields if (RecordLength <= 0) { int maxStartIndex = FixedLengthRecordFieldConfigurations.Max(f => f.StartIndex); int maxSize = FixedLengthRecordFieldConfigurations.Where(f => f.StartIndex == maxStartIndex).Max(f1 => f1.Size.Value); var fc = FixedLengthRecordFieldConfigurations.Where(f => f.StartIndex == maxStartIndex && f.Size.Value == maxSize).FirstOrDefault(); if (fc != null) { RecordLength = fc.StartIndex + fc.Size.Value; } } if (RecordLength <= 0) { throw new ChoRecordConfigurationException("RecordLength must be > 0"); } //Check if any field has empty names if (FixedLengthRecordFieldConfigurations.Where(i => i.FieldName.IsNullOrWhiteSpace()).Count() > 0) { throw new ChoRecordConfigurationException("Some fields has empty field name specified."); } //Check field names for duplicate string[] dupFields = FixedLengthRecordFieldConfigurations.GroupBy(i => i.FieldName, FileHeaderConfiguration.StringComparer) .Where(g => g.Count() > 1) .Select(g => g.Key).ToArray(); if (dupFields.Length > 0) { throw new ChoRecordConfigurationException("Duplicate field names [Name: {0}] specified to record fields.".FormatString(String.Join(",", dupFields))); } //Find duplicate fields with start index ChoFixedLengthRecordFieldConfiguration dupRecConfig = FixedLengthRecordFieldConfigurations.GroupBy(i => i.StartIndex).Where(g => g.Count() > 1).Select(g => g.FirstOrDefault()).FirstOrDefault(); if (dupRecConfig != null) { throw new ChoRecordConfigurationException("Found duplicate '{0}' record field with same start index.".FormatString(dupRecConfig.FieldName)); } //Check any overlapping fields specified foreach (var f in FixedLengthRecordFieldConfigurations) { if (f.StartIndex + f.Size.Value > RecordLength) { throw new ChoRecordConfigurationException("Found '{0}' record field out of bounds of record length.".FormatString(f.FieldName)); } } RecordFieldConfigurationsDict = FixedLengthRecordFieldConfigurations.OrderBy(i => i.StartIndex).Where(i => !i.Name.IsNullOrWhiteSpace()).ToDictionary(i => i.Name, FileHeaderConfiguration.StringComparer); RecordFieldConfigurationsDict2 = FixedLengthRecordFieldConfigurations.OrderBy(i => i.StartIndex).Where(i => !i.FieldName.IsNullOrWhiteSpace()).ToDictionary(i => i.FieldName, FileHeaderConfiguration.StringComparer); //Validate each record field foreach (var fieldConfig in FixedLengthRecordFieldConfigurations) { fieldConfig.Validate(this); } if (!FileHeaderConfiguration.HasHeaderRecord) { } else { } LoadNCacheMembers(FixedLengthRecordFieldConfigurations); }
private void DiscoverRecordFields(Type recordType, string declaringMember, bool optIn = false) { if (!recordType.IsDynamicType()) { Type pt = null; int startIndex = 0; int size = 0; if (optIn) //ChoTypeDescriptor.GetProperties(recordType).Where(pd => pd.Attributes.OfType<ChoFixedLengthRecordFieldAttribute>().Any()).Any()) { foreach (PropertyDescriptor pd in ChoTypeDescriptor.GetProperties(recordType)) { pt = pd.PropertyType.GetUnderlyingType(); if (!pt.IsSimple() && !typeof(IEnumerable).IsAssignableFrom(pt)) { DiscoverRecordFields(pt, declaringMember == null ? pd.Name : "{0}.{1}".FormatString(declaringMember, pd.Name), optIn); } else if (pd.Attributes.OfType <ChoFixedLengthRecordFieldAttribute>().Any()) { var obj = new ChoFixedLengthRecordFieldConfiguration(pd.Name, pd.Attributes.OfType <ChoFixedLengthRecordFieldAttribute>().First(), pd.Attributes.OfType <Attribute>().ToArray()); obj.FieldType = pt; obj.PropertyDescriptor = pd; obj.DeclaringMember = declaringMember == null ? null : "{0}.{1}".FormatString(declaringMember, pd.Name); if (!FixedLengthRecordFieldConfigurations.Any(c => c.Name == pd.Name)) { FixedLengthRecordFieldConfigurations.Add(obj); } } } } else { foreach (PropertyDescriptor pd in ChoTypeDescriptor.GetProperties(recordType)) { pt = pd.PropertyType.GetUnderlyingType(); if (pt != typeof(object) && !pt.IsSimple() && !typeof(IEnumerable).IsAssignableFrom(pt)) { DiscoverRecordFields(pt, declaringMember == null ? pd.Name : "{0}.{1}".FormatString(declaringMember, pd.Name), optIn); } else { if (FixedLengthFieldDefaultSizeConfiguation == null) { size = ChoFixedLengthFieldDefaultSizeConfiguation.Instance.GetSize(pd.PropertyType); } else { size = FixedLengthFieldDefaultSizeConfiguation.GetSize(pd.PropertyType); } var obj = new ChoFixedLengthRecordFieldConfiguration(pd.Name, startIndex, size); obj.FieldType = pt; obj.PropertyDescriptor = pd; obj.DeclaringMember = declaringMember == null ? null : "{0}.{1}".FormatString(declaringMember, pd.Name); StringLengthAttribute slAttr = pd.Attributes.OfType <StringLengthAttribute>().FirstOrDefault(); if (slAttr != null && slAttr.MaximumLength > 0) { obj.Size = slAttr.MaximumLength; } DisplayAttribute dpAttr = pd.Attributes.OfType <DisplayAttribute>().FirstOrDefault(); if (dpAttr != null) { if (!dpAttr.ShortName.IsNullOrWhiteSpace()) { obj.FieldName = dpAttr.ShortName; } else if (!dpAttr.Name.IsNullOrWhiteSpace()) { obj.FieldName = dpAttr.Name; } } DisplayFormatAttribute dfAttr = pd.Attributes.OfType <DisplayFormatAttribute>().FirstOrDefault(); if (dfAttr != null && !dfAttr.DataFormatString.IsNullOrWhiteSpace()) { obj.FormatText = dfAttr.DataFormatString; } if (dfAttr != null && !dfAttr.NullDisplayText.IsNullOrWhiteSpace()) { obj.NullValue = dfAttr.NullDisplayText; } if (!FixedLengthRecordFieldConfigurations.Any(c => c.Name == pd.Name)) { FixedLengthRecordFieldConfigurations.Add(obj); } startIndex += size; } } } } }
public ChoFixedLengthRecordConfiguration ClearFields() { //FixedLengthRecordFieldConfigurationsForType.Clear(); FixedLengthRecordFieldConfigurations.Clear(); return(this); }