public ChoBSONReader <T> WithFields(params string[] fieldsNames) { string fnTrim = null; if (!fieldsNames.IsNullOrEmpty()) { PropertyDescriptor pd = null; ChoBSONRecordFieldConfiguration fc = null; foreach (string fn in fieldsNames) { if (fn.IsNullOrEmpty()) { continue; } if (!_clearFields) { ClearFields(); Configuration.MapRecordFields(Configuration.RecordType); //Configuration.ColumnOrderStrict = true; } fnTrim = fn.NTrim(); if (Configuration.BSONRecordFieldConfigurations.Any(o => o.Name == fnTrim)) { fc = Configuration.BSONRecordFieldConfigurations.Where(o => o.Name == fnTrim).First(); Configuration.BSONRecordFieldConfigurations.Remove(Configuration.BSONRecordFieldConfigurations.Where(o => o.Name == fnTrim).First()); } else { pd = ChoTypeDescriptor.GetProperty(typeof(T), fn); } var nfc = new ChoBSONRecordFieldConfiguration(fnTrim) { FieldName = fn }; nfc.PropertyDescriptor = fc != null ? fc.PropertyDescriptor : pd; nfc.DeclaringMember = fc != null ? fc.DeclaringMember : null; if (pd != null) { if (nfc.FieldType == null) { nfc.FieldType = pd.PropertyType; } } Configuration.BSONRecordFieldConfigurations.Add(nfc); } } return(this); }
public object GetPropertyValue(object target, PropertyInfo propertyInfo, ChoBSONRecordFieldConfiguration fieldConfig) { if (typeof(IList).IsAssignableFrom(target.GetType())) { if (fieldConfig.ArrayIndex != null) { var item = ((IList)target).OfType <object>().Skip(fieldConfig.ArrayIndex.Value).FirstOrDefault(); if (item != null) { return(ChoType.GetPropertyValue(item, propertyInfo)); } } return(null); } else { var item = ChoType.GetPropertyValue(target, propertyInfo); if (item != null && typeof(IList).IsAssignableFrom(item.GetType())) { if (fieldConfig.ArrayIndex != null) { return(((IList)item).OfType <object>().Skip(fieldConfig.ArrayIndex.Value).FirstOrDefault()); } return(item); } else if (item != null && typeof(IDictionary <string, object>).IsAssignableFrom(item.GetType())) { if (fieldConfig.DictKey != null && ((IDictionary)item).Contains(fieldConfig.DictKey)) { return(((IDictionary)item)[fieldConfig.DictKey]); } return(item); } else { return(item); } } }
internal ChoBSONRecordFieldConfigurationMap(ChoBSONRecordFieldConfiguration config) { ChoGuard.ArgumentNotNull(config, nameof(config)); _config = config; }
private bool LoadNode(Tuple <long, object> pair, ref object rec) { bool ignoreFieldValue = pair.Item2.IgnoreFieldValue(Configuration.IgnoreFieldValueMode); if (ignoreFieldValue) { return(false); } else if (pair.Item2 == null && !Configuration.IsDynamicObject) { rec = RecordType.CreateInstanceAndDefaultToMembers(Configuration.RecordFieldConfigurationsDict.ToDictionary(kvp => kvp.Key, kvp => kvp.Value as ChoRecordFieldConfiguration)); return(true); } if (Configuration.SupportsMultiRecordTypes && Configuration.RecordSelector != null) { Type recType = Configuration.RecordSelector(pair); if (recType == null) { if (Configuration.IgnoreIfNoRecordTypeFound) { ChoETLFramework.WriteLog(TraceSwitch.TraceVerbose, $"No record type found for [{pair.Item1}] line to parse."); return(true); } else { throw new ChoParserException($"No record type found for [{pair.Item1}] line to parse."); } } if (!Configuration.RecordTypeMapped) { Configuration.MapRecordFields(recType); Configuration.Validate(null); } rec = recType.IsDynamicType() ? new ChoDynamicObject() { ThrowExceptionIfPropNotExists = true } : ChoActivator.CreateInstance(recType); RecordType = recType; } else if (Configuration.IsDynamicObject) { rec = Configuration.IsDynamicObject ? new ChoDynamicObject() { ThrowExceptionIfPropNotExists = true } } : ChoActivator.CreateInstance(RecordType); try { if (!RaiseBeforeRecordLoad(rec, ref pair)) { ChoETLFramework.WriteLog(TraceSwitch.TraceVerbose, "Skipping..."); rec = null; return(true); } //if (Configuration.CustomNodeSelecter != null) //{ // pair = new Tuple<long, object>(pair.Item1, Configuration.CustomNodeSelecter(pair.Item2)); //} if (pair.Item2 == null) { rec = null; return(true); } if (!FillRecord(ref rec, pair)) { return(false); } if ((Configuration.ObjectValidationMode & ChoObjectValidationMode.ObjectLevel) == ChoObjectValidationMode.ObjectLevel) { rec.DoObjectLevelValidation(Configuration, Configuration.BSONRecordFieldConfigurations); } bool skip = false; if (!RaiseAfterRecordLoad(rec, pair, ref skip)) { return(false); } else if (skip) { rec = null; return(true); } } catch (Exception ex) { Reader.IsValid = false; if (ex is ChoMissingRecordFieldException && Configuration.ThrowAndStopOnMissingField) { if (!RaiseRecordLoadError(rec, pair, ex)) { throw; } else { //ChoETLFramework.WriteLog(TraceSwitch.TraceError, "Error [{0}] found. Ignoring record...".FormatString(ex.Message)); //rec = null; } } else { ChoETLFramework.HandleException(ref ex); if (Configuration.ErrorMode == ChoErrorMode.IgnoreAndContinue) { ChoETLFramework.WriteLog(TraceSwitch.TraceError, "Error [{0}] found. Ignoring record...".FormatString(ex.Message)); rec = null; } else if (Configuration.ErrorMode == ChoErrorMode.ReportAndContinue) { if (!RaiseRecordLoadError(rec, pair, ex)) { throw; } else { //ChoETLFramework.WriteLog(TraceSwitch.TraceError, "Error [{0}] found. Ignoring record...".FormatString(ex.Message)); //rec = null; } } else { throw; } } return(true); } return(true); } object fieldValue = null; ChoBSONRecordFieldConfiguration fieldConfig = null; PropertyInfo pi = null;