SmiGettersStream.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. //------------------------------------------------------------------------------
  2. // <copyright file="SmiGettersStream.cs" company="Microsoft">
  3. // Copyright (c) Microsoft Corporation. All rights reserved.
  4. // </copyright>
  5. // <owner current="true" primary="true">Microsoft</owner>
  6. // <owner current="true" primary="false">Microsoft</owner>
  7. //------------------------------------------------------------------------------
  8. namespace Microsoft.SqlServer.Server {
  9. using System;
  10. using System.Data.Common;
  11. using System.Data.SqlClient;
  12. using System.IO;
  13. using System.Diagnostics;
  14. internal class SmiGettersStream : Stream {
  15. private SmiEventSink_Default _sink;
  16. private ITypedGettersV3 _getters;
  17. private int _ordinal;
  18. private long _readPosition;
  19. private SmiMetaData _metaData;
  20. internal SmiGettersStream( SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData ) {
  21. Debug.Assert( null != sink );
  22. Debug.Assert( null != getters );
  23. Debug.Assert( 0 <= ordinal );
  24. Debug.Assert( null != metaData );
  25. _sink = sink;
  26. _getters = getters;
  27. _ordinal = ordinal;
  28. _readPosition = 0;
  29. _metaData = metaData;
  30. }
  31. public override bool CanRead {
  32. get {
  33. return true;
  34. }
  35. }
  36. // If CanSeek is false, Position, Seek, Length, and SetLength should throw.
  37. public override bool CanSeek {
  38. get {
  39. return false;
  40. }
  41. }
  42. public override bool CanWrite {
  43. get {
  44. return false;
  45. }
  46. }
  47. public override long Length {
  48. get {
  49. return ValueUtilsSmi.GetBytesInternal( _sink, _getters, _ordinal, _metaData, 0, null, 0, 0, false );
  50. }
  51. }
  52. public override long Position {
  53. get {
  54. return _readPosition;
  55. }
  56. set {
  57. throw SQL.StreamSeekNotSupported();
  58. }
  59. }
  60. public override void Flush() {
  61. throw SQL.StreamWriteNotSupported();
  62. }
  63. public override long Seek(long offset, SeekOrigin origin) {
  64. throw SQL.StreamSeekNotSupported();
  65. }
  66. public override void SetLength(long value) {
  67. throw SQL.StreamWriteNotSupported();
  68. }
  69. public override int Read( byte[] buffer, int offset, int count ) {
  70. long bytesRead = ValueUtilsSmi.GetBytesInternal( _sink, _getters, _ordinal, _metaData, _readPosition, buffer, offset, count, false );
  71. _readPosition += bytesRead;
  72. return checked( (int) bytesRead );
  73. }
  74. public override void Write( byte[] buffer, int offset, int count ) {
  75. throw SQL.StreamWriteNotSupported();
  76. }
  77. }
  78. }