예제 #1
0
파일: RecordKey.cs 프로젝트: sab39/nrdo
 public RecordKey(RecipeRecord record)
 {
     this.table    = record.Table;
     this.getValue = delegate(NrdoField field)
     {
         RecipeValueField rfield = record.GetField(field.Name) as RecipeValueField;
         return(rfield == null?Recipe.defaultValue(field.Type, field.IsNullable) : rfield.Value);
     };
 }
예제 #2
0
        internal XmlElement ToXmlElement(XmlDocument doc)
        {
            XmlElement element = doc.CreateElement(TableName.Replace(':', '.'));

            if (NrdoId != null)
            {
                element.SetAttribute("nrdo.id", NrdoId);
            }
            foreach (RecipeField field in fields.Values)
            {
                RecipeValueField valueField = field as RecipeValueField;
                string           value;
                string           type = null;
                if (valueField != null)
                {
                    if (valueField.Value == null)
                    {
                        value = "null";
                    }
                    else
                    {
                        type = valueField.Value.GetType().FullName;
                        if (valueField.Value is DateTime)
                        {
                            value = ((DateTime)valueField.Value).ToBinary().ToString();
                        }
                        else
                        {
                            value = valueField.Value.ToString();
                        }
                    }
                }
                else
                {
                    value = "undefined";
                }
                element.SetAttribute(field.Name, type + ":" + value);
            }
            return(element);
        }
예제 #3
0
        internal static RecipeRecord FromXmlElement(RecipeContext context, XmlElement element)
        {
            var origTableName = element.LocalName.Replace('.', ':');
            var tableName     = context.GetRenameMappedTableName(origTableName);

            if (tableName == null)
            {
                return(null);
            }

            RecipeRecord result = new RecipeRecord(context, tableName, origTableName, XmlUtil.GetAttr(element, "nrdo.id"));

            foreach (XmlAttribute attr in element.Attributes)
            {
                if (attr.LocalName == "nrdo.id")
                {
                    continue;
                }

                RecipeField field;
                string[]    parts = attr.Value.Split(new char[] { ':' }, 2);
                if (parts.Length != 2)
                {
                    throw new ArgumentException("attribute value " + attr.Name + "='" + attr.Value + "' does not contain a ':'");
                }
                string type  = parts[0];
                string value = parts[1];

                if (type == "")
                {
                    switch (value)
                    {
                    case "undefined":
                        field = new RecipeField(result, attr.LocalName);
                        break;

                    case "null":
                        field = new RecipeValueField(result, attr.LocalName, null);
                        break;

                    default:
                        throw new ArgumentException("attribute value " + attr.Name + "='" + attr.Value + "' starts with : but is neither :null nor :undefined");
                    }
                }
                else
                {
                    if (!type.StartsWith("System."))
                    {
                        throw new ArgumentException("Illegal context value type " + type);
                    }
                    object valueObject;
                    if (type == "System.DateTime")
                    {
                        valueObject = DateTime.FromBinary(long.Parse(value));
                    }
                    else
                    {
                        Type valueType = Type.GetType(type);
                        valueObject = TypeDescriptor.GetConverter(valueType).ConvertFromString(value);
                    }
                    field = new RecipeValueField(result, attr.LocalName, valueObject);
                }
                result.PutField(field);
            }
            return(result);
        }