1 // Licensed to the .NET Foundation under one or more agreements. 2 // The .NET Foundation licenses this file to you under the MIT license. 3 // See the LICENSE file in the project root for more information. 4 5 6 7 //------------------------------------------------------------------------------ 8 9 using System; 10 using System.Data.Common; 11 using System.Data.SqlClient; 12 using System.Diagnostics; 13 using System.IO; 14 15 namespace Microsoft.SqlServer.Server 16 { 17 internal class SmiSettersStream : Stream 18 { 19 private SmiEventSink_Default _sink; 20 private ITypedSettersV3 _setters; 21 private int _ordinal; 22 private long _lengthWritten; 23 private SmiMetaData _metaData; 24 SmiSettersStream(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData)25 internal SmiSettersStream(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData) 26 { 27 Debug.Assert(null != sink); 28 Debug.Assert(null != setters); 29 Debug.Assert(0 <= ordinal); 30 Debug.Assert(null != metaData); 31 32 _sink = sink; 33 _setters = setters; 34 _ordinal = ordinal; 35 _lengthWritten = 0; 36 _metaData = metaData; 37 } 38 39 public override bool CanRead 40 { 41 get 42 { 43 return false; 44 } 45 } 46 47 // If CanSeek is false, Position, Seek, Length, and SetLength should throw. 48 public override bool CanSeek 49 { 50 get 51 { 52 return false; 53 } 54 } 55 56 public override bool CanWrite 57 { 58 get 59 { 60 return true; 61 } 62 } 63 64 public override long Length 65 { 66 get 67 { 68 return _lengthWritten; 69 } 70 } 71 72 public override long Position 73 { 74 get 75 { 76 return _lengthWritten; 77 } 78 set 79 { 80 throw SQL.StreamSeekNotSupported(); 81 } 82 } 83 Flush()84 public override void Flush() 85 { 86 _lengthWritten = ValueUtilsSmi.SetBytesLength(_sink, _setters, _ordinal, _metaData, _lengthWritten); 87 } 88 Seek(long offset, SeekOrigin origin)89 public override long Seek(long offset, SeekOrigin origin) 90 { 91 throw SQL.StreamSeekNotSupported(); 92 } 93 SetLength(long value)94 public override void SetLength(long value) 95 { 96 if (value < 0) 97 { 98 throw ADP.ArgumentOutOfRange(nameof(value)); 99 } 100 ValueUtilsSmi.SetBytesLength(_sink, _setters, _ordinal, _metaData, value); 101 } 102 Read(byte[] buffer, int offset, int count)103 public override int Read(byte[] buffer, int offset, int count) 104 { 105 throw SQL.StreamReadNotSupported(); 106 } 107 Write(byte[] buffer, int offset, int count)108 public override void Write(byte[] buffer, int offset, int count) 109 { 110 _lengthWritten += ValueUtilsSmi.SetBytes(_sink, _setters, _ordinal, _metaData, _lengthWritten, buffer, offset, count); 111 } 112 } 113 } 114