private async Task WriteTextFeed(TextDataFeed feed, Encoding encoding, bool needBom, TdsParserStateObject stateObj, int size) { Debug.Assert(encoding == null || !needBom); char[] inBuff = new char[constTextBufferSize]; encoding = encoding ?? Encoding.Unicode; ConstrainedTextWriter writer = new ConstrainedTextWriter(new StreamWriter(new TdsOutputStream(this, stateObj, null), encoding), size); if (needBom) { 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) { nRead = await feed._source.ReadBlockAsync(inBuff, 0, constTextBufferSize).ConfigureAwait(false); } else { nRead = feed._source.ReadBlock(inBuff, 0, constTextBufferSize); } if (nRead == 0) { break; } if (_asyncWrite) { await writer.WriteAsync(inBuff, 0, nRead).ConfigureAwait(false); } else { writer.Write(inBuff, 0, nRead); } nWritten += nRead; } while (!writer.IsComplete); if (_asyncWrite) { await writer.FlushAsync().ConfigureAwait(false); } else { writer.Flush(); } }
private static void SetTextReader_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metadata, TextDataFeed feed) { long len = metadata.MaxLength; char[] buff = new char[constTextBufferSize]; int nWritten = 0; do { int nRead = 0; int readSize = constTextBufferSize; if (len > 0 && nWritten + readSize > len) { readSize = (int)(len - nWritten); } Debug.Assert(readSize >= 0); nRead = feed._source.Read(buff, 0, readSize); if (nRead == 0) { break; } setters.SetChars(sink, ordinal, nWritten, buff, 0, nRead); sink.ProcessMessagesAndThrow(); nWritten += nRead; } while (len <= 0 || nWritten < len); setters.SetCharsLength(sink, ordinal, nWritten); sink.ProcessMessagesAndThrow(); }
// Coerced Value is also used in SqlBulkCopy.ConvertValue(object value, _SqlMetaData metadata) internal static object CoerceValue(object value, MetaType destinationType, out bool coercedToDataFeed, out bool typeChanged, bool allowStreaming = true) { Debug.Assert(!(value is DataFeed), "Value provided should not already be a data feed"); Debug.Assert(!ADP.IsNull(value), "Value provided should not be null"); Debug.Assert(null != destinationType, "null destinationType"); coercedToDataFeed = false; typeChanged = false; Type currentType = value.GetType(); if ((typeof(object) != destinationType.ClassType) && (currentType != destinationType.ClassType) && ((currentType != destinationType.SqlType) || (SqlDbType.Xml == destinationType.SqlDbType))) { // Special case for Xml types (since we need to convert SqlXml into a string) try { // Assume that the type changed typeChanged = true; if ((typeof(string) == destinationType.ClassType)) { // For Xml data, destination Type is always string if (typeof(SqlXml) == currentType) { value = MetaType.GetStringFromXml((XmlReader)(((SqlXml)value).CreateReader())); } else if (typeof(SqlString) == currentType) { typeChanged = false; // Do nothing } else if (typeof(XmlReader).IsAssignableFrom(currentType)) { if (allowStreaming) { coercedToDataFeed = true; value = new XmlDataFeed((XmlReader)value); } else { value = MetaType.GetStringFromXml((XmlReader)value); } } else if (typeof(char[]) == currentType) { value = new string((char[])value); } else if (typeof(SqlChars) == currentType) { value = new string(((SqlChars)value).Value); } else if (value is TextReader && allowStreaming) { coercedToDataFeed = true; value = new TextDataFeed((TextReader)value); } else { value = Convert.ChangeType(value, destinationType.ClassType, (IFormatProvider)null); } } else if ((DbType.Currency == destinationType.DbType) && (typeof(string) == currentType)) { value = Decimal.Parse((string)value, NumberStyles.Currency, (IFormatProvider)null); // WebData 99376 } else if ((typeof(SqlBytes) == currentType) && (typeof(byte[]) == destinationType.ClassType)) { typeChanged = false; // Do nothing } else if ((typeof(string) == currentType) && (SqlDbType.Time == destinationType.SqlDbType)) { value = TimeSpan.Parse((string)value); } else if ((typeof(string) == currentType) && (SqlDbType.DateTimeOffset == destinationType.SqlDbType)) { value = DateTimeOffset.Parse((string)value, (IFormatProvider)null); } else if ((typeof(DateTime) == currentType) && (SqlDbType.DateTimeOffset == destinationType.SqlDbType)) { value = new DateTimeOffset((DateTime)value); } else if (TdsEnums.SQLTABLE == destinationType.TDSType && ( value is DbDataReader || value is System.Collections.Generic.IEnumerable<SqlDataRecord>)) { // no conversion for TVPs. typeChanged = false; } else if (destinationType.ClassType == typeof(byte[]) && value is Stream && allowStreaming) { coercedToDataFeed = true; value = new StreamDataFeed((Stream)value); } else { value = Convert.ChangeType(value, destinationType.ClassType, (IFormatProvider)null); } } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } throw ADP.ParameterConversionFailed(value, destinationType.ClassType, e); // WebData 75433 } } Debug.Assert(allowStreaming || !coercedToDataFeed, "Streaming is not allowed, but type was coerced into a data feed"); Debug.Assert(value.GetType() == currentType ^ typeChanged, "Incorrect value for typeChanged"); return value; }