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