示例#1
0
        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));
        }
示例#2
0
        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);
        }
示例#3
0
        /// <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);
        }