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); } } } }
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); } }