private Type mapErlTypeToCLR(string erlType) { Tuple <Type, Func <IErlObject, object> > to; if (ERL_TO_CLR_TYPEMAP.TryGetValue(erlType, out to)) { return(to.Item1); } throw new ErlDataAccessException(StringConsts.ERL_DS_SCHEMA_MAP_ERL_TYPE_ERROR.Args(erlType)); }
internal static object ErlToClrValue(IErlObject erlValue, Schema schema, Schema.FieldDef fdef, string targetName = null, IErlObject outerTerm = null) { if (erlValue.IsNull()) { return(null); } var atr = fdef[targetName]; var dataType = atr.BackendType; if (dataType.IsNullOrWhiteSpace()) { throw new ErlDataAccessException(StringConsts.ERL_DS_INTERNAL_MAPPING_ERROR + "fielddef '{0}.{1}' has no backend type".Args(schema.Name, fdef.Name)); } Tuple <Type, Func <IErlObject, object> > mapping; if (ERL_TO_CLR_TYPEMAP.TryGetValue(dataType, out mapping)) { try { return(mapping.Item2(erlValue)); } catch (Exception error) { var err = "Schema '{0}' field '{1}' ({2}) cannot be converted from '{3}' to '{4}' format{5}" .Args(schema.Name, fdef.Name, erlValue.ToString(), erlValue.GetType(), dataType, outerTerm == null ? "" : " in record:\n {0}".Args(outerTerm.ToString())); App.Log.Write(new Log.Message { Type = Log.MessageType.TraceErl, Topic = CoreConsts.ERLANG_TOPIC, From = "SchemaMap.ErlTupleToRow({0})".Args(schema.Name), Text = err + error.ToMessageWithType(), Exception = error }); throw new ErlDataAccessException(err, inner: error); } } var er = StringConsts.ERL_DS_INTERNAL_MAPPING_ERROR + "erltype'{0}' not matched in the dict".Args(dataType); throw new ErlDataAccessException(er); }
/// <summary> /// Maps ErlRow to CLR row supplied by schema, either Dynamic or TypedRow /// </summary> public Row ErlTupleToRow(string schemaName, ErlTuple tuple, Schema schema) { var singleKey = schema.ExtraData[SCHEMA_KEY_COUNT].AsInt(0) < 2; var row = Row.MakeRow(schema, schema.TypedRowType); var i = -1; foreach (var elm in enumErlResponseTuple(tuple, singleKey)) { i++; if (i == 0) { var thisname = tuple[0].ValueAsString; if (!schemaName.EqualsOrdSenseCase(thisname)) { throw new ErlDataAccessException(StringConsts.ERL_DS_CRUD_RESPONSE_SCHEMA_MISMATCH_ERROR.Args(thisname, schemaName)); } continue; } //map fields now if (i - 1 >= schema.FieldCount) { throw new ErlDataAccessException(StringConsts.ERL_DS_CRUD_RESPONSE_SCHEMA_FLD_COUNT_MISMATCH_ERROR.Args(schemaName, schema.Name)); } var fdef = schema[i - 1]; var atr = fdef[m_Store.TargetName]; var erlType = atr.BackendType; if (erlType.IsNullOrWhiteSpace()) { throw new ErlDataAccessException(StringConsts.ERL_DS_INTERNAL_MAPPING_ERROR + "fielddef('{0}') has no backend type".Args(fdef.Name)); } if (elm.IsNull()) { row.SetFieldValue(fdef, null); continue; } Tuple <Type, Func <IErlObject, object> > mapping; if (ERL_TO_CLR_TYPEMAP.TryGetValue(erlType, out mapping)) { object clrValue = null; try { clrValue = mapping.Item2(elm); } catch (Exception error) { App.Log.Write(new Log.Message { Type = Log.MessageType.TraceErl, Topic = CoreConsts.ERLANG_TOPIC, From = "SchemaMap.ErlTupleToRow({0})".Args(schemaName), Text = "Error converting element '{0}'->'{1}': {2}".Args(erlType, elm.GetType(), error.ToMessageWithType()), Exception = error }); throw; } row.SetFieldValue(fdef, clrValue); } else { throw new ErlDataAccessException(StringConsts.ERL_DS_INTERNAL_MAPPING_ERROR + "erltype'{0}' not matched in the dict".Args(erlType)); } } return(row); }