Skip to content
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -12807,119 +12807,127 @@ private async Task WriteXmlFeed(XmlDataFeed feed, TdsParserStateObject stateObj,
private async Task WriteTextFeed(TextDataFeed feed, Encoding encoding, bool needBom, TdsParserStateObject stateObj, int size, bool useReadBlock)
{
Debug.Assert(encoding == null || !needBom);
char[] inBuff = new char[constTextBufferSize];
char[] inBuff = ArrayPool<char>.Shared.Rent(constTextBufferSize);

encoding = encoding ?? new UnicodeEncoding(false, false);
ConstrainedTextWriter writer = new ConstrainedTextWriter(new StreamWriter(new TdsOutputStream(this, stateObj, null), encoding), size);

if (needBom)

using (ConstrainedTextWriter writer = new ConstrainedTextWriter(new StreamWriter(new TdsOutputStream(this, stateObj, null), encoding), size))
{
if (_asyncWrite)
{
await writer.WriteAsync((char)TdsEnums.XMLUNICODEBOM).ConfigureAwait(false);
}
else
if (needBom)
{
writer.Write((char)TdsEnums.XMLUNICODEBOM);
if (_asyncWrite)
{
await writer.WriteAsync((char)TdsEnums.XMLUNICODEBOM).ConfigureAwait(false);
}
else
{
writer.Write((char)TdsEnums.XMLUNICODEBOM);
}
}
}

int nWritten = 0;
do
{
int nRead = 0;

if (_asyncWrite)
int nWritten = 0;
do
{
if (useReadBlock)
int nRead = 0;

if (_asyncWrite)
{
nRead = await feed._source.ReadBlockAsync(inBuff, 0, constTextBufferSize).ConfigureAwait(false);
if (useReadBlock)
{
nRead = await feed._source.ReadBlockAsync(inBuff, 0, constTextBufferSize).ConfigureAwait(false);
}
else
{
nRead = await feed._source.ReadAsync(inBuff, 0, constTextBufferSize).ConfigureAwait(false);
}
}
else
{
nRead = await feed._source.ReadAsync(inBuff, 0, constTextBufferSize).ConfigureAwait(false);
if (useReadBlock)
{
nRead = feed._source.ReadBlock(inBuff, 0, constTextBufferSize);
}
else
{
nRead = feed._source.Read(inBuff, 0, constTextBufferSize);
}
}
}
else
{
if (useReadBlock)

if (nRead == 0)
{
break;
}

if (_asyncWrite)
{
nRead = feed._source.ReadBlock(inBuff, 0, constTextBufferSize);
await writer.WriteAsync(inBuff, 0, nRead).ConfigureAwait(false);
}
else
{
nRead = feed._source.Read(inBuff, 0, constTextBufferSize);
writer.Write(inBuff, 0, nRead);
}
}

if (nRead == 0)
{
break;
}
nWritten += nRead;
} while (!writer.IsComplete);

if (_asyncWrite)
{
await writer.WriteAsync(inBuff, 0, nRead).ConfigureAwait(false);
await writer.FlushAsync().ConfigureAwait(false);
}
else
{
writer.Write(inBuff, 0, nRead);
writer.Flush();
}

nWritten += nRead;
} while (!writer.IsComplete);

if (_asyncWrite)
{
await writer.FlushAsync().ConfigureAwait(false);
}
else
{
writer.Flush();
}
ArrayPool<char>.Shared.Return(inBuff, clearArray: true);
}

private async Task WriteStreamFeed(StreamDataFeed feed, TdsParserStateObject stateObj, int len)
{
TdsOutputStream output = new TdsOutputStream(this, stateObj, null);
byte[] buff = new byte[constBinBufferSize];
int nWritten = 0;
do
byte[] buff = ArrayPool<byte>.Shared.Rent(constBinBufferSize);

using (TdsOutputStream output = new TdsOutputStream(this, stateObj, null))
{
int nRead = 0;
int readSize = constBinBufferSize;
if (len > 0 && nWritten + readSize > len)
int nWritten = 0;
do
{
readSize = len - nWritten;
}
int nRead = 0;
int readSize = constBinBufferSize;
if (len > 0 && nWritten + readSize > len)
{
readSize = len - nWritten;
}

Debug.Assert(readSize >= 0);
Debug.Assert(readSize >= 0);

if (_asyncWrite)
{
nRead = await feed._source.ReadAsync(buff, 0, readSize).ConfigureAwait(false);
}
else
{
nRead = feed._source.Read(buff, 0, readSize);
}
if (_asyncWrite)
{
nRead = await feed._source.ReadAsync(buff, 0, readSize).ConfigureAwait(false);
}
else
{
nRead = feed._source.Read(buff, 0, readSize);
}

if (nRead == 0)
{
return;
}
if (nRead == 0)
{
return;
}

if (_asyncWrite)
{
await output.WriteAsync(buff, 0, nRead).ConfigureAwait(false);
}
else
{
output.Write(buff, 0, nRead);
}
if (_asyncWrite)
{
await output.WriteAsync(buff, 0, nRead).ConfigureAwait(false);
}
else
{
output.Write(buff, 0, nRead);
}

nWritten += nRead;
} while (len <= 0 || nWritten < len);
}

nWritten += nRead;
} while (len <= 0 || nWritten < len);
ArrayPool<byte>.Shared.Return(buff, clearArray: true);
}

private Task NullIfCompletedWriteTask(Task task)
Expand Down
Loading