Пример #1
0
        public override void ReadFromPhysical(byte[] buffer, int offset)
        {
            // Clear current value
            if (ValuesOwned && !IsNative && (StreamID != StreamID.Null))
            {
                Manager.StreamManager.Deallocate(StreamID);
            }

            // Read scalar header
            byte header = buffer[offset];

            offset++;
            if ((header & 1) != 0)             // if not nil
            {
                if ((header & 2) != 0)
                {
                    if (DataType.IsCompound)
                    {
                        using (IRow row = (IRow)DataValue.FromPhysical(Manager, DataType.CompoundRowType, buffer, offset))
                        {
                            Value           = row.AsNative;
                            row.ValuesOwned = false;
                        }
                    }
                    else
                    {
                        Streams.IConveyor conveyor = Manager.GetConveyor(DataType);
                        if (conveyor.IsStreaming)
                        {
                            Stream stream = new MemoryStream(buffer, offset, buffer.Length - offset, false, true);
                            Value = conveyor.Read(stream);
                            stream.Close();
                        }
                        else
                        {
                            Value = conveyor.Read(buffer, offset);
                        }
                    }
                }
                else
                {
                    if ((header & 4) != 0)                     // if expanded form
                    {
                        Value = Manager.StreamManager.Allocate();
                        Stream stream = Manager.StreamManager.Open(StreamID, LockMode.Exclusive);
                        stream.Write(buffer, offset, buffer.Length - offset);
                        stream.Close();
                    }
                    else
                    {
                        Value = StreamID.Read(buffer, offset);
                    }
                }
            }
            else
            {
                if ((header & 2) != 0)
                {
                    Value = null;
                }
                else
                {
                    Value = StreamID.Null;
                }
            }
        }