示例#1
0
        public override void WriteToPhysical(byte[] buffer, int offset, bool expandStreams)
        {
            // Write scalar header
            byte header = (byte)(IsNil ? 0 : 1);

            header        |= (byte)(IsNative ? 2 : 0);
            header        |= (byte)(expandStreams ? 4 : 0);
            buffer[offset] = header;
            offset++;

            if (!IsNil)
            {
                if (IsNative)
                {
                    if (DataType.IsCompound)
                    {
                        _writeValue.WriteToPhysical(buffer, offset, expandStreams);
                        _writeValue.Dispose();
                        _writeValue = null;
                    }
                    else
                    {
                        Streams.IConveyor conveyor = Manager.GetConveyor(DataType);
                        if (conveyor.IsStreaming)
                        {
                            _writeStream.Position = 0;
                            _writeStream.Read(buffer, offset, (int)_writeStream.Length);
                            _writeStream.Close();
                        }
                        else
                        {
                            conveyor.Write(Value, buffer, offset);
                        }
                    }
                }
                else
                {
                    if (expandStreams)
                    {
                        _writeStream.Position = 0;
                        _writeStream.Read(buffer, offset, (int)_writeStream.Length);
                        _writeStream.Close();
                    }
                    else
                    {
                        ((StreamID)Value).Write(buffer, offset);
                    }
                }
            }
        }
示例#2
0
        public static void DisposeValue(IValueManager manager, object tempValue)
        {
            IDataValue localTempValue = tempValue as IDataValue;

            if (localTempValue != null)
            {
                localTempValue.Dispose();
                return;
            }

            if (tempValue is StreamID)
            {
                manager.StreamManager.Deallocate((StreamID)tempValue);
                return;
            }

            NativeRow nativeRow = tempValue as NativeRow;

            if (nativeRow != null)
            {
                for (int index = 0; index < nativeRow.Values.Length; index++)
                {
                    DisposeValue(manager, nativeRow.Values[index]);
                }
                return;
            }

            NativeList nativeList = tempValue as NativeList;

            if (nativeList != null)
            {
                for (int index = 0; index < nativeList.Values.Count; index++)
                {
                    DisposeValue(manager, nativeList.Values[index]);
                }
            }

            NativeTable nativeTable = tempValue as NativeTable;

            if (nativeTable != null)
            {
                DisposeNative(manager, nativeTable.TableType, nativeTable);
            }
        }