Пример #1
0
        private static MessageTraceEntityBase[] MapResultsTable <T>(DataTable table) where T : MessageTraceEntityBase, new()
        {
            List <MessageTraceEntityBase> list = new List <MessageTraceEntityBase>();

            if (list != null && table != null && table.Rows.Count > 0)
            {
                MessageTraceDataSet.< > c__DisplayClass3 <T> CS$ < > 8__locals1 = new MessageTraceDataSet.< > c__DisplayClass3 <T>();
                CS$ < > 8__locals1.columnSchema = table.Columns;
                foreach (object obj in table.Rows)
                {
                    DataRow dataRow = (DataRow)obj;
                    MessageTraceEntityBase           entity = Activator.CreateInstance <T>();
                    IEnumerable <PropertyDefinition> propertyDefinitions = (IEnumerable <PropertyDefinition>)entity.GetAllProperties();
                    using (IEnumerator enumerator2 = CS$ < > 8__locals1.columnSchema.GetEnumerator())
                    {
                        while (enumerator2.MoveNext())
                        {
                            DataColumn column = (DataColumn)enumerator2.Current;
                            try
                            {
                                PropertyDefinition propertyDefinition2 = propertyDefinitions.First((PropertyDefinition propertyDefinition) => string.Compare(propertyDefinition.Name, column.ColumnName, StringComparison.OrdinalIgnoreCase) == 0);
                                if (propertyDefinition2 != null)
                                {
                                    entity[propertyDefinition2] = DalHelper.ConvertFromStoreObject(dataRow[column], propertyDefinition2.Type);
                                }
                            }
                            catch (InvalidOperationException)
                            {
                            }
                        }
                    }
                    PropertyBase propertyBase = entity as PropertyBase;
                    if (propertyBase != null && propertyBase.PropertyName == MessageTraceCollapsedProperty.PropertyDefinition.Name)
                    {
                        byte[] data = Convert.FromBase64String(propertyBase.PropertyValueBlob.Value);
                        list.AddRange(MessageTraceCollapsedProperty.Expand <PropertyBase>(data, propertyBase.Namespace, delegate
                        {
                            PropertyBase propertyBase2 = Activator.CreateInstance <T>() as PropertyBase;
                            using (IEnumerator enumerator3 = CS$ < > 8__locals1.columnSchema.GetEnumerator())
                            {
                                while (enumerator3.MoveNext())
                                {
                                    MessageTraceDataSet.< > c__DisplayClass3 <T> CS$ < > 8__locals4 = CS$ < > 8__locals1;
                                    DataColumn column = (DataColumn)enumerator3.Current;
                                    try
                                    {
                                        PropertyDefinition propertyDefinition3 = propertyDefinitions.First((PropertyDefinition propertyDefinition) => string.Compare(propertyDefinition.Name, column.ColumnName, StringComparison.OrdinalIgnoreCase) == 0);
                                        if (propertyDefinition3 != null && propertyDefinition3 != PropertyBase.PropertyValueBlobProperty)
                                        {
                                            propertyBase2[propertyDefinition3] = entity[propertyDefinition3];
                                        }
                                    }
                                    catch (InvalidOperationException)
                                    {
                                    }
                                }
                            }
                            propertyBase2.PropertyId = Guid.NewGuid();
                            return(propertyBase2);
                        }));
        public T GetExtendedProperty(string nameSpace, string name)
        {
            if (nameSpace == null)
            {
                throw new ArgumentNullException("nameSpace");
            }
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }
            T result = default(T);
            Dictionary <string, T> dictionary = this.propertyStore[nameSpace];

            if (MessageTraceCollapsedProperty.IsCollapsableProperty(nameSpace, name))
            {
                IEnumerable <PropertyBase> source;
                if (!ExtendedPropertyStore <T> .TryGetCollapsedProperties(dictionary, nameSpace, name, out source))
                {
                    throw new KeyNotFoundException(string.Format(CultureInfo.InvariantCulture, "The key '{0}' was not found in the property bag", new object[]
                    {
                        name
                    }));
                }
                result = (T)((object)source.LastOrDefault((PropertyBase p) => string.Equals(p.PropertyName, name, StringComparison.OrdinalIgnoreCase)));
            }
            else
            {
                result = dictionary[name];
            }
            return(result);
        }
        public bool TryGetExtendedProperty(string nameSpace, string name, out T extendedProperty)
        {
            if (nameSpace == null)
            {
                throw new ArgumentNullException("nameSpace");
            }
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }
            Dictionary <string, T> dictionary = null;

            if (this.propertyStore.TryGetValue(nameSpace, out dictionary) && dictionary.TryGetValue(name, out extendedProperty))
            {
                if (!MessageTraceCollapsedProperty.IsCollapsableProperty(nameSpace, name))
                {
                    return(true);
                }
                IEnumerable <PropertyBase> source;
                if (ExtendedPropertyStore <T> .TryGetCollapsedProperties(dictionary, nameSpace, name, out source))
                {
                    extendedProperty = (source.LastOrDefault((PropertyBase p) => string.Equals(p.PropertyName, name, StringComparison.OrdinalIgnoreCase)) as T);
                    if (extendedProperty != null)
                    {
                        return(true);
                    }
                }
            }
            extendedProperty = default(T);
            return(false);
        }
        internal static IEnumerable <T> Expand <T>(byte[] data, string entityName, Func <T> objectBuilder) where T : PropertyBase
        {
            using (MemoryStream stream = new MemoryStream(data))
            {
                while (stream.Position < stream.Length)
                {
                    long startPosition = stream.Position;
                    int  propertyId    = (int)MessageTraceCollapsedProperty.ReadPrimitiveValueFromStream(stream, typeof(int));
                    SqlPropertyDefinition propertyDefinition = MessageTraceCollapsedProperty.GetCollapsedPropertyById(entityName, propertyId);
                    T property = objectBuilder();
                    property.PropertyName = propertyDefinition.PropertyName;
                    switch (propertyDefinition.Type)
                    {
                    case SqlPropertyTypes.Int:
                        property.PropertyValueInteger = new int?((int)MessageTraceCollapsedProperty.ReadPrimitiveValueFromStream(stream, typeof(int)));
                        break;

                    case SqlPropertyTypes.String:
                        property.PropertyValueString = (string)MessageTraceCollapsedProperty.ReadPrimitiveValueFromStream(stream, typeof(string));
                        break;

                    case SqlPropertyTypes.DateTime:
                        property.PropertyValueDatetime = new DateTime?((DateTime)MessageTraceCollapsedProperty.ReadPrimitiveValueFromStream(stream, typeof(DateTime)));
                        break;

                    case SqlPropertyTypes.Decimal:
                        property.PropertyValueDecimal = new decimal?((decimal)MessageTraceCollapsedProperty.ReadPrimitiveValueFromStream(stream, typeof(decimal)));
                        break;

                    case SqlPropertyTypes.Blob:
                        property.PropertyValueBlob = new BlobType((string)MessageTraceCollapsedProperty.ReadPrimitiveValueFromStream(stream, typeof(string)));
                        break;

                    case SqlPropertyTypes.Boolean:
                        property.PropertyValueBit = new bool?((bool)MessageTraceCollapsedProperty.ReadPrimitiveValueFromStream(stream, typeof(bool)));
                        break;

                    case SqlPropertyTypes.Guid:
                        property.PropertyValueGuid = (Guid)MessageTraceCollapsedProperty.ReadPrimitiveValueFromStream(stream, typeof(Guid));
                        break;

                    case SqlPropertyTypes.Long:
                        property.PropertyValueLong = new long?((long)MessageTraceCollapsedProperty.ReadPrimitiveValueFromStream(stream, typeof(long)));
                        break;

                    default:
                        throw new InvalidOperationException(string.Format("Property type {0} is not supported for MessageTraceCollapsedProperty.", propertyDefinition.Type));
                    }
                    yield return(property);

                    if (stream.Position <= startPosition)
                    {
                        throw new InvalidOperationException("Unable to expand. Stream position is not moving forward.");
                    }
                }
            }
            yield break;
        }
 private static void SaveLengthToStream(Stream stream, int length)
 {
     while (length >= 255)
     {
         MessageTraceCollapsedProperty.SaveSingleByteToStream(stream, byte.MaxValue);
         length -= 255;
     }
     MessageTraceCollapsedProperty.SaveSingleByteToStream(stream, (byte)length);
 }
        private static byte[] ReadByteArrayFromStream(Stream stream)
        {
            int num = MessageTraceCollapsedProperty.ReadLengthFromStream(stream);

            byte[] array = new byte[num];
            if (stream.Read(array, 0, num) != num)
            {
                throw new InvalidOperationException(string.Format("Unable to read byte array of {0} length from stream. End of stream reached.", num));
            }
            return(array);
        }
        private static int ReadLengthFromStream(Stream stream)
        {
            int num = 0;
            int num2;

            do
            {
                num2 = (int)MessageTraceCollapsedProperty.ReadSingleByteFromStream(stream);
                num += num2;
            }while (num2 == 255);
            return(num);
        }
        private static bool TryGetCollapsedProperties(IDictionary <string, T> nameToPropDict, string nameSpace, string name, out IEnumerable <PropertyBase> expandedProperties)
        {
            expandedProperties = null;
            T    t;
            bool result;

            if (result = nameToPropDict.TryGetValue(MessageTraceCollapsedProperty.PropertyDefinition.Name, out t))
            {
                byte[] data = Convert.FromBase64String(t.PropertyValueBlob.Value);
                expandedProperties = MessageTraceCollapsedProperty.Expand <MessageEventProperty>(data, name, () => new MessageEventProperty(nameSpace, name, false));
            }
            return(result);
        }
        private static object ReadPrimitiveValueFromStream(Stream stream, Type typeOfvalue)
        {
            if (typeOfvalue == typeof(long))
            {
                return(BitConverter.ToInt64(MessageTraceCollapsedProperty.ReadByteArrayFromStream(stream), 0));
            }
            if (typeOfvalue == typeof(int))
            {
                return(BitConverter.ToInt32(MessageTraceCollapsedProperty.ReadByteArrayFromStream(stream), 0));
            }
            if (typeOfvalue == typeof(Guid))
            {
                return(new Guid(MessageTraceCollapsedProperty.ReadByteArrayFromStream(stream)));
            }
            if (typeOfvalue == typeof(string))
            {
                byte b = MessageTraceCollapsedProperty.ReadSingleByteFromStream(stream);
                switch (b)
                {
                case 2:
                    return(Encoding.ASCII.GetString(MessageTraceCollapsedProperty.ReadByteArrayFromStream(stream)));

                case 3:
                    return(Encoding.Unicode.GetString(MessageTraceCollapsedProperty.ReadByteArrayFromStream(stream)));

                default:
                    throw new InvalidOperationException(string.Format("Unable to deserialize string from stream. Unknown string serialization algorithm {0}.", b));
                }
            }
            else
            {
                if (typeOfvalue == typeof(DateTime))
                {
                    return(DateTime.FromBinary((long)MessageTraceCollapsedProperty.ReadPrimitiveValueFromStream(stream, typeof(long))));
                }
                if (MessageTraceCollapsedProperty.PrimitiveValueFromByteArrayConvertor.ContainsKey(typeOfvalue))
                {
                    return(MessageTraceCollapsedProperty.PrimitiveValueFromByteArrayConvertor[typeOfvalue](MessageTraceCollapsedProperty.ReadByteArrayFromStream(stream)));
                }
                if (typeOfvalue.IsEnum)
                {
                    return(Enum.ToObject(typeOfvalue, (int)MessageTraceCollapsedProperty.ReadPrimitiveValueFromStream(stream, typeof(int))));
                }
                return(null);
            }
        }
 private static bool SavePrimitiveValueToStream(Stream stream, Type typeOfvalue, object value)
 {
     if (typeOfvalue == typeof(long))
     {
         MessageTraceCollapsedProperty.SaveByteArrayToStream(stream, BitConverter.GetBytes((long)value));
         return(true);
     }
     if (typeOfvalue == typeof(int))
     {
         MessageTraceCollapsedProperty.SaveByteArrayToStream(stream, BitConverter.GetBytes((int)value));
         return(true);
     }
     if (typeOfvalue == typeof(Guid))
     {
         MessageTraceCollapsedProperty.SaveByteArrayToStream(stream, ((Guid)value).ToByteArray());
         return(true);
     }
     if (typeOfvalue == typeof(string))
     {
         string text = value as string;
         if (Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(text)) == text)
         {
             MessageTraceCollapsedProperty.SaveSingleByteToStream(stream, 2);
             MessageTraceCollapsedProperty.SaveByteArrayToStream(stream, Encoding.ASCII.GetBytes((string)value));
         }
         else
         {
             MessageTraceCollapsedProperty.SaveSingleByteToStream(stream, 3);
             MessageTraceCollapsedProperty.SaveByteArrayToStream(stream, Encoding.Unicode.GetBytes((string)value));
         }
         return(true);
     }
     if (typeOfvalue == typeof(DateTime))
     {
         return(MessageTraceCollapsedProperty.SavePrimitiveValueToStream(stream, typeof(long), ((DateTime)value).ToBinary()));
     }
     if (MessageTraceCollapsedProperty.PrimitiveValueToByteArrayConvertor.ContainsKey(typeOfvalue))
     {
         MessageTraceCollapsedProperty.SaveByteArrayToStream(stream, MessageTraceCollapsedProperty.PrimitiveValueToByteArrayConvertor[typeOfvalue](value));
         return(true);
     }
     return(typeOfvalue.IsEnum && MessageTraceCollapsedProperty.SavePrimitiveValueToStream(stream, typeof(int), Convert.ToInt32(value)));
 }
        public void AddExtendedProperty(T extendedProperty)
        {
            if (extendedProperty == null)
            {
                throw new ArgumentNullException("extendedProperty");
            }
            Dictionary <string, T> orAdd = this.propertyStore.GetOrAdd(extendedProperty.Namespace, () => new Dictionary <string, T>(StringComparer.OrdinalIgnoreCase));

            if (MessageTraceCollapsedProperty.IsCollapsableProperty(extendedProperty.Namespace, extendedProperty.PropertyName))
            {
                byte[] array = null;
                T      t;
                if (orAdd.TryGetValue(MessageTraceCollapsedProperty.PropertyDefinition.Name, out t))
                {
                    array = Convert.FromBase64String(t.PropertyValueBlob.Value);
                }
                array = MessageTraceCollapsedProperty.Collapse(array, extendedProperty.Namespace, extendedProperty);
                if (t == null)
                {
                    t = extendedProperty;
                    t.PropertyName          = MessageTraceCollapsedProperty.PropertyDefinition.Name;
                    t.PropertyValueGuid     = Guid.Empty;
                    t.PropertyValueInteger  = null;
                    t.PropertyValueString   = null;
                    t.PropertyValueDatetime = null;
                    t.PropertyValueDecimal  = null;
                    t.PropertyValueBit      = null;
                    t.PropertyValueLong     = null;
                    orAdd[extendedProperty.PropertyName] = t;
                    t.PropertyIndex = this.propertiesList.Count;
                    this.propertiesList.Add(extendedProperty);
                }
                t.PropertyValueBlob = new BlobType(Convert.ToBase64String(array));
                return;
            }
            orAdd[extendedProperty.PropertyName] = extendedProperty;
            extendedProperty.PropertyIndex       = this.propertiesList.Count;
            this.propertiesList.Add(extendedProperty);
        }
        internal static byte[] Collapse(byte[] existingData, string entityName, PropertyBase property)
        {
            byte[] result;
            using (MemoryStream memoryStream = new MemoryStream())
            {
                if (existingData != null && existingData.Length > 0)
                {
                    memoryStream.Write(existingData, 0, existingData.Length);
                }
                SqlPropertyDefinition collapsedPropertyByName = MessageTraceCollapsedProperty.GetCollapsedPropertyByName(entityName, property.PropertyName);
                switch (collapsedPropertyByName.Type)
                {
                case SqlPropertyTypes.Int:
                    if (property.PropertyValueInteger != null)
                    {
                        MessageTraceCollapsedProperty.SavePrimitiveValueToStream(memoryStream, typeof(int), collapsedPropertyByName.PropertyId);
                        MessageTraceCollapsedProperty.SavePrimitiveValueToStream(memoryStream, typeof(int), property.PropertyValueInteger.Value);
                    }
                    break;

                case SqlPropertyTypes.String:
                    if (!string.IsNullOrEmpty(property.PropertyValueString))
                    {
                        MessageTraceCollapsedProperty.SavePrimitiveValueToStream(memoryStream, typeof(int), collapsedPropertyByName.PropertyId);
                        MessageTraceCollapsedProperty.SavePrimitiveValueToStream(memoryStream, typeof(string), property.PropertyValueString);
                    }
                    break;

                case SqlPropertyTypes.DateTime:
                    if (property.PropertyValueDatetime != null)
                    {
                        MessageTraceCollapsedProperty.SavePrimitiveValueToStream(memoryStream, typeof(int), collapsedPropertyByName.PropertyId);
                        MessageTraceCollapsedProperty.SavePrimitiveValueToStream(memoryStream, typeof(DateTime), property.PropertyValueDatetime.Value);
                    }
                    break;

                case SqlPropertyTypes.Decimal:
                    if (property.PropertyValueDecimal != null)
                    {
                        MessageTraceCollapsedProperty.SavePrimitiveValueToStream(memoryStream, typeof(int), collapsedPropertyByName.PropertyId);
                        MessageTraceCollapsedProperty.SavePrimitiveValueToStream(memoryStream, typeof(decimal), property.PropertyValueDecimal.Value);
                    }
                    break;

                case SqlPropertyTypes.Blob:
                    if (!string.IsNullOrEmpty(property.PropertyValueBlob.Value))
                    {
                        MessageTraceCollapsedProperty.SavePrimitiveValueToStream(memoryStream, typeof(int), collapsedPropertyByName.PropertyId);
                        MessageTraceCollapsedProperty.SavePrimitiveValueToStream(memoryStream, typeof(string), property.PropertyValueBlob.Value);
                    }
                    break;

                case SqlPropertyTypes.Boolean:
                    if (property.PropertyValueBit != null)
                    {
                        MessageTraceCollapsedProperty.SavePrimitiveValueToStream(memoryStream, typeof(int), collapsedPropertyByName.PropertyId);
                        MessageTraceCollapsedProperty.SavePrimitiveValueToStream(memoryStream, typeof(bool), property.PropertyValueBit.Value);
                    }
                    break;

                case SqlPropertyTypes.Guid:
                    if (property.PropertyValueGuid != Guid.Empty)
                    {
                        MessageTraceCollapsedProperty.SavePrimitiveValueToStream(memoryStream, typeof(int), collapsedPropertyByName.PropertyId);
                        MessageTraceCollapsedProperty.SavePrimitiveValueToStream(memoryStream, typeof(Guid), property.PropertyValueGuid);
                    }
                    break;

                case SqlPropertyTypes.Long:
                    if (property.PropertyValueLong != null)
                    {
                        MessageTraceCollapsedProperty.SavePrimitiveValueToStream(memoryStream, typeof(int), collapsedPropertyByName.PropertyId);
                        MessageTraceCollapsedProperty.SavePrimitiveValueToStream(memoryStream, typeof(long), property.PropertyValueLong.Value);
                    }
                    break;

                default:
                    throw new InvalidOperationException(string.Format("Property type {0} is not supported for MessageTraceCollapsedProperty.", collapsedPropertyByName.Type));
                }
                result = memoryStream.ToArray();
            }
            return(result);
        }
 internal static bool IsCollapsableProperty(string entityName, string propertyName)
 {
     return(MessageTraceCollapsedProperty.GetCollapsedPropertyByName(entityName, propertyName) != null);
 }
 private static void SaveByteArrayToStream(Stream stream, byte[] bytes)
 {
     MessageTraceCollapsedProperty.SaveLengthToStream(stream, bytes.Length);
     stream.Write(bytes, 0, bytes.Length);
 }