@@ -89,71 +89,51 @@ public override Task<int> ReadAsync(byte[] buffer, int offset, int count, Cancel
89
89
/// </summary>
90
90
private async Task < int > ReadInternal ( byte [ ] buffer , int offset , int count , CancellationToken token , bool async )
91
91
{
92
+ int readBytes = 0 ;
93
+ byte [ ] packetData = null ;
94
+ byte [ ] readTarget = buffer ;
95
+ int readOffset = offset ;
92
96
if ( _encapsulate )
93
97
{
94
- return await ReadInternalEncapsulate ( buffer , offset , count , token , async ) . ConfigureAwait( false) ;
95
- }
96
- else if ( async)
97
- {
98
- return await ReadInternalAsync( buffer , offset , count , token ) . ConfigureAwait ( false ) ;
99
- }
100
- else
101
- {
102
- return ReadInternalSync( buffer , offset , count ) ;
103
- }
104
- }
98
+ packetData = ArrayPool < byte > . Shared . Rent ( count < TdsEnums . HEADER_LEN ? TdsEnums . HEADER_LEN : count ) ;
99
+ readTarget = packetData ;
100
+ readOffset = 0 ;
101
+ if ( _packetBytes == 0 )
102
+ {
103
+ // Account for split packets
104
+ while ( readBytes < TdsEnums . HEADER_LEN )
105
+ {
106
+ readBytes += async ?
107
+ await _stream . ReadAsync ( packetData , readBytes , TdsEnums . HEADER_LEN - readBytes , token ) . ConfigureAwait ( false ) :
108
+ _stream . Read ( packetData , readBytes , TdsEnums . HEADER_LEN - readBytes ) ;
109
+ }
105
110
106
- private async Task < int > ReadInternalEncapsulate ( byte [ ] buffer , int offset , int count , CancellationToken token , bool async )
107
- {
108
- int readBytes = 0 ;
109
- byte [ ] packetData = ArrayPool < byte > . Shared . Rent ( count < TdsEnums . HEADER_LEN ? TdsEnums. HEADER_LEN : count) ;
111
+ _packetBytes = ( packetData [ TdsEnums . HEADER_LEN_FIELD_OFFSET ] << 8 ) | packetData [ TdsEnums . HEADER_LEN_FIELD_OFFSET + 1 ] ;
112
+ _packetBytes -= TdsEnums . HEADER_LEN ;
113
+ }
110
114
111
- if ( _packetBytes == 0 )
112
- {
113
- // Account for split packets
114
- while ( readBytes < TdsEnums . HEADER_LEN )
115
+ if ( count > _packetBytes )
115
116
{
116
- readBytes += ( async ?
117
- await ReadInternalAsync( packetData, readBytes , TdsEnums . HEADER_LEN - readBytes , token ) . ConfigureAwait ( false) :
118
- ReadInternalSync ( packetData , readBytes , TdsEnums . HEADER_LEN - readBytes )
119
- ) ;
117
+ count = _packetBytes ;
120
118
}
121
-
122
- _packetBytes = ( packetData [ TdsEnums . HEADER_LEN_FIELD_OFFSET ] < < 8 ) | packetData [ TdsEnums . HEADER_LEN_FIELD_OFFSET + 1 ] ;
123
- _packetBytes -= TdsEnums . HEADER_LEN ;
124
119
}
125
120
126
- if ( count > _packetBytes )
121
+ readBytes = async ?
122
+ await _stream . ReadAsync ( readTarget , readOffset , count , token ) . ConfigureAwait ( false ) :
123
+ _stream . Read ( readTarget , readOffset , count ) ;
124
+
125
+ if ( _encapsulate )
127
126
{
128
- count = _packetBytes;
127
+ _packetBytes -= readBytes ;
128
+ }
129
+ if ( packetData != null )
130
+ {
131
+ Buffer . BlockCopy ( packetData , 0 , buffer , offset , readBytes ) ;
132
+ ArrayPool < byte > . Shared . Return ( packetData , clearArray : true ) ;
129
133
}
130
-
131
- readBytes = ( async ?
132
- await ReadInternalAsync( packetData, 0 , count, token) . ConfigureAwait( false) :
133
- ReadInternalSync( packetData, 0 , count)
134
- ) ;
135
-
136
-
137
- _packetBytes -= readBytes;
138
-
139
- Buffer. BlockCopy( packetData, 0 , buffer, offset, readBytes) ;
140
-
141
- Array. Clear( packetData, 0 , readBytes) ;
142
- ArrayPool< byte > . Shared. Return( packetData, clearArray: false) ;
143
-
144
134
return readBytes ;
145
135
}
146
136
147
- private async Task < int > ReadInternalAsync ( byte [ ] buffer , int offset , int count , CancellationToken token )
148
- {
149
- return await _stream . ReadAsync ( buffer , 0 , count , token ) . ConfigureAwait ( false ) ;
150
- }
151
-
152
- private int ReadInternalSync ( byte [ ] buffer , int offset , int count )
153
- {
154
- return _stream . Read ( buffer , 0 , count ) ;
155
- }
156
-
157
137
/// <summary>
158
138
/// The internal write method calls Sync APIs when Async flag is false
159
139
/// </summary>
0 commit comments