private static long GetBytesConversion(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, long fieldOffset, byte[] buffer, int bufferOffset, int length, bool throwOnNull) { object obj = GetSqlValue( sink, getters, ordinal, metaData, null ); if (null == obj) { throw ADP.InvalidCast(); } SqlBinary value = (SqlBinary) obj; if (value.IsNull) { if (throwOnNull) { throw SQL.SqlNullValue(); } else { // return zero length in any case return 0; } } if ( null == buffer ) { return value.Length; } length = CheckXetParameters( metaData.SqlDbType, metaData.MaxLength * sizeof(char), value.Length, fieldOffset, buffer.Length, bufferOffset, length ); Array.Copy( value.Value, checked((int)fieldOffset), buffer, bufferOffset, length ); return length; }
internal SqlClientWrapperSmiStream(SmiEventSink_Default sink, SmiStream stream) { Debug.Assert(null != sink); Debug.Assert(null != stream); _sink = sink; _stream = stream; }
internal SqlDataRecord(SmiRecordBuffer recordBuffer, params SmiExtendedMetaData[] metaData) { Debug.Assert(null != recordBuffer, "invalid attempt to instantiate SqlDataRecord with null SmiRecordBuffer"); Debug.Assert(null != metaData, "invalid attempt to instantiate SqlDataRecord with null SmiExtendedMetaData[]"); _columnMetaData = new SqlMetaData[metaData.Length]; _columnSmiMetaData = new SmiExtendedMetaData[metaData.Length]; for (int i = 0; i < _columnSmiMetaData.Length; i++) { _columnSmiMetaData[i] = metaData[i]; _columnMetaData[i] = MetaDataUtilsSmi.SmiExtendedMetaDataToSqlMetaData(_columnSmiMetaData[i]); } _eventSink = new SmiEventSink_Default( ); if (InOutOfProcHelper.InProc) { _recordContext = SmiContextFactory.Instance.GetCurrentContext(); } else { _recordContext = null; } _recordBuffer = recordBuffer; _eventSink.ProcessMessagesAndThrow(); }
// // SqlDataRecord public API // public SqlDataRecord(params SqlMetaData[] metaData) { // Initial consistency check if (null == metaData) { throw ADP.ArgumentNull(nameof(metaData)); } _columnMetaData = new SqlMetaData[metaData.Length]; _columnSmiMetaData = new SmiExtendedMetaData[metaData.Length]; for (int i = 0; i < _columnSmiMetaData.Length; i++) { if (null == metaData[i]) { throw ADP.ArgumentNull($"{nameof(metaData)}[{i}]"); } _columnMetaData[i] = metaData[i]; _columnSmiMetaData[i] = MetaDataUtilsSmi.SqlMetaDataToSmiExtendedMetaData(_columnMetaData[i]); } _eventSink = new SmiEventSink_Default(); _recordBuffer = new MemoryRecordBuffer(_columnSmiMetaData); _usesStringStorageForXml = true; _eventSink.ProcessMessagesAndThrow(); }
internal SmiSettersStream(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData) { this._sink = sink; this._setters = setters; this._ordinal = ordinal; this._lengthWritten = 0L; this._metaData = metaData; }
private long _length; // Total length of the stream internal SqlSequentialStreamSmi(SmiEventSink_Default sink, ITypedGettersV3 getters, int columnIndex, long length) { _sink = sink; _getters = getters; _columnIndex = columnIndex; _length = length; _position = 0; }
internal SmiGettersStream(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { this._sink = sink; this._getters = getters; this._ordinal = ordinal; this._readPosition = 0L; this._metaData = metaData; }
private int _peekedChar; // Current peeked character (if any) internal SqlSequentialTextReaderSmi(SmiEventSink_Default sink, ITypedGettersV3 getters, int columnIndex, long length) { _sink = sink; _getters = getters; _columnIndex = columnIndex; _length = length; _position = 0; _peekedChar = -1; }
private SmiContextFactory() { if (InOutOfProcHelper.InProc) { Type smiLinkType = Type.GetType("Microsoft.SqlServer.Server.InProcLink, SqlAccess, PublicKeyToken=89845dcd8080cc91"); if (null == smiLinkType) { Debug.Assert(false, "could not get InProcLink type"); throw SQL.ContextUnavailableOutOfProc(); // Must not be a valid version of Sql Server. } System.Reflection.FieldInfo instanceField = GetStaticField(smiLinkType, "Instance"); if (instanceField != null) { _smiLink = (SmiLink)GetValue(instanceField); } else { Debug.Assert(false, "could not get InProcLink.Instance"); throw SQL.ContextUnavailableOutOfProc(); // Must not be a valid version of Sql Server. } System.Reflection.FieldInfo buildVersionField = GetStaticField(smiLinkType, "BuildVersion"); if (buildVersionField != null) { UInt32 buildVersion = (UInt32)GetValue(buildVersionField); _majorVersion = (byte)(buildVersion >> 24); _minorVersion = (byte)((buildVersion >> 16) & 0xff); _buildNum = (short)(buildVersion & 0xffff); _serverVersion = (String.Format((IFormatProvider)null, "{0:00}.{1:00}.{2:0000}", _majorVersion, (short)_minorVersion, _buildNum)); } else { _serverVersion = String.Empty; // default value if nothing exists. } _negotiatedSmiVersion = _smiLink.NegotiateVersion(SmiLink.InterfaceVersion); bool isSupportedVersion = false; for (int i = 0; !isSupportedVersion && i < __supportedSmiVersions.Length; i++) { if (__supportedSmiVersions[i] == _negotiatedSmiVersion) { isSupportedVersion = true; } } // Disconnect if we didn't get a supported version!! if (!isSupportedVersion) { _smiLink = null; } _eventSinkForGetCurrentContext = new SmiEventSink_Default(); } }
internal static byte GetByte( SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData ) { ThrowIfITypedGettersIsNull( sink, getters, ordinal ); if ( CanAccessGetterDirectly( metaData, ExtendedClrTypeCode.Byte ) ) { return GetByte_Unchecked( sink, getters, ordinal ); } object result = GetValue( sink, getters, ordinal, metaData, null ); if (null == result) { throw ADP.InvalidCast(); } return (Byte)result; }
internal SqlInternalConnectionSmi(SqlConnectionString connectionOptions, SmiContext smiContext) : base(connectionOptions) { this._smiContext = smiContext; this._smiContext.OutOfScope += new EventHandler(this.OnOutOfScope); this._smiConnection = this._smiContext.ContextConnection; this._smiEventSink = new EventSink(this); if (Bid.AdvancedOn) { Bid.Trace("<sc.SqlInternalConnectionSmi.ctor|ADV> %d#, constructed new SMI internal connection\n", base.ObjectID); } }
internal SmiGettersStream( SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData ) { Debug.Assert( null != sink ); Debug.Assert( null != getters ); Debug.Assert( 0 <= ordinal ); Debug.Assert( null != metaData ); _sink = sink; _getters = getters; _ordinal = ordinal; _readPosition = 0; _metaData = metaData; }
internal SmiSettersStream( SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData ) { Debug.Assert( null != sink ); Debug.Assert( null != setters ); Debug.Assert( 0 <= ordinal ); Debug.Assert( null != metaData ); _sink = sink; _setters = setters; _ordinal = ordinal; _lengthWritten = 0; _metaData = metaData; }
internal SmiGettersStream(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { Debug.Assert(null != sink); Debug.Assert(null != getters); Debug.Assert(0 <= ordinal); Debug.Assert(null != metaData); _sink = sink; _getters = getters; _ordinal = ordinal; _readPosition = 0; _metaData = metaData; }
internal SmiSettersStream(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData) { Debug.Assert(null != sink); Debug.Assert(null != setters); Debug.Assert(0 <= ordinal); Debug.Assert(null != metaData); _sink = sink; _setters = setters; _ordinal = ordinal; _lengthWritten = 0; _metaData = metaData; }
internal void CleanMessages() { SmiEventSink_Default parent = (SmiEventSink_Default)_parent; if (null != parent) { parent.CleanMessages(); } else { _errors = null; _warnings = null; } }
protected virtual void DispatchMessages(bool ignoreNonFatalMessages) { SmiEventSink_Default default2 = (SmiEventSink_Default)this._parent; if (default2 != null) { default2.DispatchMessages(ignoreNonFatalMessages); } else { SqlException exception = this.ProcessMessages(true, ignoreNonFatalMessages); if (exception != null) { throw exception; } } }
private SmiContextFactory() { if (InOutOfProcHelper.InProc) { Type smiLinkType = Type.GetType("Microsoft.SqlServer.Server.InProcLink, SqlAccess, PublicKeyToken=89845dcd8080cc91"); if (null == smiLinkType) { Debug.Assert(false, "could not get InProcLink type"); throw SQL.ContextUnavailableOutOfProc(); // Must not be a valid version of Sql Server. } System.Reflection.FieldInfo instanceField = GetStaticField(smiLinkType, "Instance"); if (instanceField != null) { _smiLink = (SmiLink)GetValue(instanceField); } else { Debug.Assert(false, "could not get InProcLink.Instance"); throw SQL.ContextUnavailableOutOfProc(); // Must not be a valid version of Sql Server. } System.Reflection.FieldInfo buildVersionField = GetStaticField(smiLinkType, "BuildVersion"); if (buildVersionField != null) { UInt32 buildVersion = (UInt32)GetValue(buildVersionField); _majorVersion = (byte)(buildVersion >> 24); _minorVersion = (byte)((buildVersion >> 16) & 0xff); _buildNum = (short)(buildVersion & 0xffff); _serverVersion = (String.Format((IFormatProvider)null, "{0:00}.{1:00}.{2:0000}", _majorVersion, (short) _minorVersion, _buildNum)); } else { _serverVersion = String.Empty; // default value if nothing exists. } _negotiatedSmiVersion = _smiLink.NegotiateVersion(SmiLink.InterfaceVersion); bool isSupportedVersion = false; for(int i=0; !isSupportedVersion && i<__supportedSmiVersions.Length; i++) { if (__supportedSmiVersions[i] == _negotiatedSmiVersion) { isSupportedVersion = true; } } // Disconnect if we didn't get a supported version!! if (!isSupportedVersion) { _smiLink = null; } _eventSinkForGetCurrentContext = new SmiEventSink_Default(); } }
internal SqlDataRecord(SmiRecordBuffer recordBuffer, params SmiExtendedMetaData[] metaData) { Debug.Assert(null != recordBuffer, "invalid attempt to instantiate SqlDataRecord with null SmiRecordBuffer"); Debug.Assert(null != metaData, "invalid attempt to instantiate SqlDataRecord with null SmiExtendedMetaData[]"); _columnMetaData = new SqlMetaData[metaData.Length]; _columnSmiMetaData = new SmiExtendedMetaData[metaData.Length]; for (int i = 0; i < _columnSmiMetaData.Length; i++) { _columnSmiMetaData[i] = metaData[i]; _columnMetaData[i] = MetaDataUtilsSmi.SmiExtendedMetaDataToSqlMetaData(_columnSmiMetaData[i]); } _eventSink = new SmiEventSink_Default(); _recordBuffer = recordBuffer; _eventSink.ProcessMessagesAndThrow(); }
private SmiContextFactory() { if (InOutOfProcHelper.InProc) { Type aType = Type.GetType("Microsoft.SqlServer.Server.InProcLink, SqlAccess, PublicKeyToken=89845dcd8080cc91"); if (null == aType) { throw SQL.ContextUnavailableOutOfProc(); } FieldInfo staticField = this.GetStaticField(aType, "Instance"); if (staticField == null) { throw SQL.ContextUnavailableOutOfProc(); } this._smiLink = (SmiLink)this.GetValue(staticField); FieldInfo fieldInfo = this.GetStaticField(aType, "BuildVersion"); if (fieldInfo != null) { uint num2 = (uint)this.GetValue(fieldInfo); this._majorVersion = (byte)(num2 >> 0x18); this._minorVersion = (byte)((num2 >> 0x10) & 0xff); this._buildNum = (short)(num2 & 0xffff); this._serverVersion = string.Format(null, "{0:00}.{1:00}.{2:0000}", new object[] { this._majorVersion, (short)this._minorVersion, this._buildNum }); } else { this._serverVersion = string.Empty; } this._negotiatedSmiVersion = this._smiLink.NegotiateVersion(210L); bool flag = false; for (int i = 0; !flag && (i < this.__supportedSmiVersions.Length); i++) { if (this.__supportedSmiVersions[i] == this._negotiatedSmiVersion) { flag = true; } } if (!flag) { this._smiLink = null; } this._eventSinkForGetCurrentContext = new SmiEventSink_Default(); } }
// // SqlDataRecord public API // public SqlDataRecord(params SqlMetaData[] metaData) { // Initial consistency check if (null == metaData) { throw ADP.ArgumentNull("metadata"); } _columnMetaData = new SqlMetaData[metaData.Length]; _columnSmiMetaData = new SmiExtendedMetaData[metaData.Length]; ulong smiVersion = SmiVersion; for (int i = 0; i < _columnSmiMetaData.Length; i++) { if (null == metaData[i]) { throw ADP.ArgumentNull("metadata[" + i + "]"); } _columnMetaData[i] = metaData[i]; _columnSmiMetaData[i] = MetaDataUtilsSmi.SqlMetaDataToSmiExtendedMetaData(_columnMetaData[i]); if (!MetaDataUtilsSmi.IsValidForSmiVersion(_columnSmiMetaData[i], smiVersion)) { throw ADP.VersionDoesNotSupportDataType(_columnSmiMetaData[i].TypeName); } } _eventSink = new SmiEventSink_Default( ); if (InOutOfProcHelper.InProc) { _recordContext = SmiContextFactory.Instance.GetCurrentContext(); _recordBuffer = _recordContext.CreateRecordBuffer(_columnSmiMetaData, _eventSink); _usesStringStorageForXml = false; } else { _recordContext = null; _recordBuffer = new MemoryRecordBuffer(_columnSmiMetaData); _usesStringStorageForXml = true; } _eventSink.ProcessMessagesAndThrow(); }
internal SqlDataRecord(SmiRecordBuffer recordBuffer, params SmiExtendedMetaData[] metaData) { this._columnMetaData = new SqlMetaData[metaData.Length]; this._columnSmiMetaData = new SmiExtendedMetaData[metaData.Length]; for (int i = 0; i < this._columnSmiMetaData.Length; i++) { this._columnSmiMetaData[i] = metaData[i]; this._columnMetaData[i] = MetaDataUtilsSmi.SmiExtendedMetaDataToSqlMetaData(this._columnSmiMetaData[i]); } this._eventSink = new SmiEventSink_Default(); if (InOutOfProcHelper.InProc) { this._recordContext = SmiContextFactory.Instance.GetCurrentContext(); } else { this._recordContext = null; } this._recordBuffer = recordBuffer; this._eventSink.ProcessMessagesAndThrow(); }
protected virtual void DispatchMessages(bool ignoreNonFatalMessages) { // virtual because we want a default implementation in the cases // where we don't have a connection to process stuff, but we want to // provide the connection the ability to fire info messages when it // hooks up. SmiEventSink_Default parent = (SmiEventSink_Default)_parent; if (null != parent) { parent.DispatchMessages(ignoreNonFatalMessages); } else { SqlException errors = ProcessMessages(true, ignoreNonFatalMessages); // ignore warnings, because there's no place to send them... if (null != errors) { throw errors; } } }
public SqlDataRecord(params SqlMetaData[] metaData) { if (metaData == null) { throw ADP.ArgumentNull("metadata"); } this._columnMetaData = new SqlMetaData[metaData.Length]; this._columnSmiMetaData = new SmiExtendedMetaData[metaData.Length]; ulong smiVersion = this.SmiVersion; for (int i = 0; i < this._columnSmiMetaData.Length; i++) { if (metaData[i] == null) { throw ADP.ArgumentNull("metadata[" + i + "]"); } this._columnMetaData[i] = metaData[i]; this._columnSmiMetaData[i] = MetaDataUtilsSmi.SqlMetaDataToSmiExtendedMetaData(this._columnMetaData[i]); if (!MetaDataUtilsSmi.IsValidForSmiVersion(this._columnSmiMetaData[i], smiVersion)) { throw ADP.VersionDoesNotSupportDataType(this._columnSmiMetaData[i].TypeName); } } this._eventSink = new SmiEventSink_Default(); if (InOutOfProcHelper.InProc) { this._recordContext = SmiContextFactory.Instance.GetCurrentContext(); this._recordBuffer = this._recordContext.CreateRecordBuffer(this._columnSmiMetaData, this._eventSink); this._usesStringStorageForXml = false; } else { this._recordContext = null; this._recordBuffer = new MemoryRecordBuffer(this._columnSmiMetaData); this._usesStringStorageForXml = true; } this._eventSink.ProcessMessagesAndThrow(); }
// calling GetTimeSpan on possibly v100 SMI internal static TimeSpan GetTimeSpan(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, bool gettersSupportKatmaiDateTime) { if (gettersSupportKatmaiDateTime) { return GetTimeSpan(sink, (SmiTypedGetterSetter)getters, ordinal, metaData); } ThrowIfITypedGettersIsNull(sink, getters, ordinal); object obj = GetValue(sink, getters, ordinal, metaData, null); if (null == obj) { throw ADP.InvalidCast(); } return (TimeSpan) obj; }
internal static Stream GetStream(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, bool bypassTypeCheck = false) { bool isDbNull = ValueUtilsSmi.IsDBNull_Unchecked(sink, getters, ordinal); // If a sql_variant, get the internal type if ( !bypassTypeCheck ) { if ((!isDbNull) && (metaData.SqlDbType == SqlDbType.Variant)) { metaData = getters.GetVariantType(sink, ordinal); } // If the SqlDbType is still variant, then it must contain null, so don't throw InvalidCast if ((metaData.SqlDbType != SqlDbType.Variant) && (!CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.Stream))) { throw ADP.InvalidCast(); } } byte[] data; if (isDbNull) { // "null" stream data = new byte[0]; } else { // Read all data data = GetByteArray_Unchecked(sink, getters, ordinal); } // Wrap data in pre-built object return new MemoryStream(data, writable: false); }
internal static TextReader GetTextReader( SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData ) { bool isDbNull = ValueUtilsSmi.IsDBNull_Unchecked(sink, getters, ordinal); // If a sql_variant, get the internal type if ((!isDbNull) && (metaData.SqlDbType == SqlDbType.Variant)) { metaData = getters.GetVariantType(sink, ordinal); } // If the SqlDbType is still variant, then it must contain null, so don't throw InvalidCast if ((metaData.SqlDbType != SqlDbType.Variant) && (!CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.TextReader))) { throw ADP.InvalidCast(); } string data; if (isDbNull) { // "null" textreader data = string.Empty; } else { // Read all data data = GetString_Unchecked(sink, getters, ordinal); } // Wrap in pre-built object return new StringReader(data); }
internal static SqlSequentialTextReaderSmi GetSequentialTextReader( SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData ) { Debug.Assert(!ValueUtilsSmi.IsDBNull_Unchecked(sink, getters, ordinal), "Should not try to get a SqlSequentialTextReaderSmi on a null column"); ThrowIfITypedGettersIsNull( sink, getters, ordinal ); if ( !CanAccessGetterDirectly( metaData, ExtendedClrTypeCode.TextReader ) ) { throw ADP.InvalidCast(); } // This will advance the column to ordinal long length = GetCharsLength_Unchecked(sink, getters, ordinal); return new SqlSequentialTextReaderSmi(sink, getters, ordinal, length); }
internal SqlClientWrapperSmiStreamChars(SmiEventSink_Default sink, SmiStream stream) { this._sink = sink; this._stream = stream; }
// dealing with v200 SMI internal static object GetSqlValue200( SmiEventSink_Default sink, SmiTypedGetterSetter getters, int ordinal, SmiMetaData metaData, SmiContext context ) { object result = null; if (IsDBNull_Unchecked(sink, getters, ordinal)) { if (SqlDbType.Udt == metaData.SqlDbType) { result = NullUdtInstance(metaData); } else { result = __typeSpecificNullForSqlValue[(int)metaData.SqlDbType]; } } else { switch (metaData.SqlDbType) { case SqlDbType.Variant: // Handle variants specifically for v200, since they could contain v200 types metaData = getters.GetVariantType(sink, ordinal); sink.ProcessMessagesAndThrow(); Debug.Assert(SqlDbType.Variant != metaData.SqlDbType, "Variant-within-variant causes endless recursion!"); result = GetSqlValue200(sink, getters, ordinal, metaData, context); break; case SqlDbType.Date: case SqlDbType.DateTime2: result = GetDateTime_Unchecked(sink, getters, ordinal); break; case SqlDbType.Time: result = GetTimeSpan_Unchecked(sink, getters, ordinal); break; case SqlDbType.DateTimeOffset: result = GetDateTimeOffset_Unchecked(sink, getters, ordinal); break; default: result = GetSqlValue(sink, getters, ordinal, metaData, context); break; } } return result; }
private static void SetString_Unchecked( SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, String value, int offset, int length ) { setters.SetString( sink, ordinal, value, offset, length ); sink.ProcessMessagesAndThrow(); }
internal static SqlSingle GetSqlSingle( SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData ) { SqlSingle result; if ( CanAccessGetterDirectly( metaData, ExtendedClrTypeCode.SqlSingle ) ) { if ( IsDBNull_Unchecked( sink, getters, ordinal ) ) { result = SqlSingle.Null; } else { Single temp = GetSingle_Unchecked( sink, getters, ordinal ); result = new SqlSingle( temp ); } } else { object obj = GetSqlValue( sink, getters, ordinal, metaData, null ); if (null == obj) { throw ADP.InvalidCast(); } result = (SqlSingle) obj; } return result; }
internal static SqlString GetSqlString( SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData ) { SqlString result; if ( CanAccessGetterDirectly( metaData, ExtendedClrTypeCode.SqlString ) ) { if ( IsDBNull_Unchecked( sink, getters, ordinal ) ) { result = SqlString.Null; } else { String temp = GetString_Unchecked( sink, getters, ordinal ); result = new SqlString( temp ); } } else if (SqlDbType.Xml == metaData.SqlDbType) { SqlXml xmlValue = GetSqlXml_Unchecked( sink, getters, ordinal, null ); if (xmlValue.IsNull) { result = SqlString.Null; } else { result = new SqlString( xmlValue.Value ); } } else { object obj = GetSqlValue( sink, getters, ordinal, metaData, null ); if (null == obj) { throw ADP.InvalidCast(); } result = (SqlString) obj; } return result; }
internal static SqlChars GetSqlChars( SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, SmiContext context ) { SqlChars result; if ( CanAccessGetterDirectly( metaData, ExtendedClrTypeCode.SqlChars ) ) { if ( IsDBNull_Unchecked( sink, getters, ordinal ) ) { result = SqlChars.Null; } else { long length = GetCharsLength_Unchecked( sink, getters, ordinal ); if ( length < __maxCharChunkSize || !InOutOfProcHelper.InProc) { char[] charBuffer = GetCharArray_Unchecked( sink, getters, ordinal ); result = new SqlChars( charBuffer ); } else { // InProc only Stream s = new SmiGettersStream( sink, getters, ordinal, metaData ); SqlStreamChars sc = CopyIntoNewSmiScratchStreamChars( s, sink, context ); result = new SqlChars( sc ); } } } else { SqlString stringValue; if (SqlDbType.Xml == metaData.SqlDbType) { SqlXml xmlValue = GetSqlXml_Unchecked( sink, getters, ordinal, null ); if (xmlValue.IsNull) { result = SqlChars.Null; } else { result = new SqlChars( xmlValue.Value.ToCharArray() ); } } else { object obj = GetSqlValue( sink, getters, ordinal, metaData, null ); if (null == obj) { throw ADP.InvalidCast(); } stringValue = (SqlString) obj; if ( stringValue.IsNull ) { result = SqlChars.Null; } else { result = new SqlChars( stringValue.Value.ToCharArray() ); } } } return result; }
const int constTextBufferSize = 4096; // Size of the buffer (in chars) user to read input parameter of type TextReader // // User-visible semantics-laden Getter/Setter support methods // These methods implement common semantics for getters & setters // All access to underlying Smi getters/setters must validate parameters // in these methods // // The idea for the getters is that there are two types associated with the field/column, // the one the user asks for (implicitly via a strongly-typed getter) and the one the data // is stored in (SmiMetaData). // When a strong getter is invoked, we try one of two ways to get the value // 1) go directly to the source for the requested type if possible // 2) instantiate the value based on the stored type (GetValue), then ask the Clr // to convert. internal static bool IsDBNull( SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal ) { return IsDBNull_Unchecked( sink, getters, ordinal ); }
private static void SetIEnumerableOfSqlDataRecord_Unchecked( SmiEventSink_Default sink, SmiTypedGetterSetter setters, int ordinal, SmiMetaData metaData, IEnumerable<SqlDataRecord> value, ParameterPeekAheadValue peekAhead ) { // Get target gettersetter setters = setters.GetTypedGetterSetter(sink, ordinal); sink.ProcessMessagesAndThrow(); IEnumerator<SqlDataRecord> enumerator = null; try { // Need to copy field metadata to an array to call FillCompatibleITypeSettersFromRecord SmiExtendedMetaData[] mdFields = new SmiExtendedMetaData[metaData.FieldMetaData.Count]; metaData.FieldMetaData.CopyTo(mdFields, 0); SmiDefaultFieldsProperty defaults = (SmiDefaultFieldsProperty) metaData.ExtendedProperties[SmiPropertySelector.DefaultFields]; int recordNumber = 1; // used only for reporting position when there are errors. // obtain enumerator and handle any peekahead values if (null != peekAhead && null != peekAhead.FirstRecord) { // hook up to enumerator enumerator = peekAhead.Enumerator; // send the first record that was obtained earlier setters.NewElement(sink); sink.ProcessMessagesAndThrow(); FillCompatibleSettersFromRecord(sink, setters, mdFields, peekAhead.FirstRecord, defaults); recordNumber++; } else { enumerator = value.GetEnumerator(); } using (enumerator) { while(enumerator.MoveNext()) { setters.NewElement(sink); sink.ProcessMessagesAndThrow(); SqlDataRecord record = enumerator.Current; if (record.FieldCount != mdFields.Length) { throw SQL.EnumeratedRecordFieldCountChanged(recordNumber); } for(int i=0; i<record.FieldCount; i++) { if (!MetaDataUtilsSmi.IsCompatible(metaData.FieldMetaData[i], record.GetSqlMetaData(i))) { throw SQL.EnumeratedRecordMetaDataChanged(record.GetName(i), recordNumber); } } FillCompatibleSettersFromRecord(sink, setters, mdFields, record, defaults); recordNumber++; } setters.EndElements(sink); sink.ProcessMessagesAndThrow(); } } finally { // Clean up! IDisposable disposable = enumerator as IDisposable; if (null != disposable) { disposable.Dispose(); } } }
// Set a DbDataReader to a Structured+MultiValued setter (table type) // Assumes metaData correctly describes the reader's shape, and consumes only the current resultset private static void SetDbDataReader_Unchecked( SmiEventSink_Default sink, SmiTypedGetterSetter setters, int ordinal, SmiMetaData metaData, DbDataReader value ) { // Get the target gettersetter setters = setters.GetTypedGetterSetter(sink, ordinal); sink.ProcessMessagesAndThrow(); // Iterate over all rows in the current set of results while (value.Read()) { setters.NewElement(sink); sink.ProcessMessagesAndThrow(); FillCompatibleSettersFromReader(sink, setters, metaData.FieldMetaData, value); } setters.EndElements(sink); sink.ProcessMessagesAndThrow(); }
private static void SetDataTable_Unchecked( SmiEventSink_Default sink, SmiTypedGetterSetter setters, int ordinal, SmiMetaData metaData, DataTable value ) { // Get the target gettersetter setters = setters.GetTypedGetterSetter(sink, ordinal); sink.ProcessMessagesAndThrow(); // iterate over all records // if first record was obtained earlier, use it prior to pulling more ExtendedClrTypeCode[] cellTypes = new ExtendedClrTypeCode[metaData.FieldMetaData.Count]; for(int i=0; i<metaData.FieldMetaData.Count; i++) { cellTypes[i] = ExtendedClrTypeCode.Invalid; } foreach(DataRow row in value.Rows) { setters.NewElement(sink); sink.ProcessMessagesAndThrow(); // Set all columns in the record for(int i=0; i<metaData.FieldMetaData.Count; i++) { SmiMetaData fieldMetaData = metaData.FieldMetaData[i]; if (row.IsNull(i)) { SetDBNull_Unchecked(sink, setters, i); } else { object cellValue = row[i]; // Only determine cell types for first row, to save expensive if (ExtendedClrTypeCode.Invalid == cellTypes[i]) { cellTypes[i] = MetaDataUtilsSmi.DetermineExtendedTypeCodeForUseWithSqlDbType( fieldMetaData.SqlDbType, fieldMetaData.IsMultiValued, cellValue, fieldMetaData.Type, // SmiContextFactory.KatmaiVersion ); } SetCompatibleValueV200(sink, setters, i, fieldMetaData, cellValue, cellTypes[i], 0, NoLengthLimit, null); } } } setters.EndElements(sink); sink.ProcessMessagesAndThrow(); }
// dealing with v200 SMI internal static TimeSpan GetTimeSpan(SmiEventSink_Default sink, SmiTypedGetterSetter getters, int ordinal, SmiMetaData metaData) { ThrowIfITypedGettersIsNull(sink, getters, ordinal); if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.TimeSpan)) { return GetTimeSpan_Unchecked(sink, getters, ordinal); } return (TimeSpan)GetValue200(sink, getters, ordinal, metaData, null); }
internal static SqlXml GetSqlXml( SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, SmiContext context ) { SqlXml result; if ( CanAccessGetterDirectly( metaData, ExtendedClrTypeCode.SqlXml ) ) { if ( IsDBNull_Unchecked( sink, getters, ordinal ) ) { result = SqlXml.Null; } else { result = GetSqlXml_Unchecked( sink, getters, ordinal, context ); } } else { object obj = GetSqlValue( sink, getters, ordinal, metaData, null ); if (null == obj) { throw ADP.InvalidCast(); } result = (SqlXml) obj; } return result; }
bool _hadErrorInResultSet; // true if an exception was thrown from within various bodies; used to control cleanup during SendResultsEnd internal SqlPipe(SmiContext smiContext) { _smiContext = smiContext; _eventSink = new SmiEventSink_Default(); }
internal static String GetString( SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData ) { ThrowIfITypedGettersIsNull( sink, getters, ordinal ); if ( CanAccessGetterDirectly( metaData, ExtendedClrTypeCode.String ) ) { return GetString_Unchecked( sink, getters, ordinal ); } object obj = GetValue( sink, getters, ordinal, metaData, null ); if (null == obj) { throw ADP.InvalidCast(); } return (String) obj; }
// implements SqlClient 1.1-compatible GetSqlValue() semantics for everything except output parameters internal static object GetSqlValue( SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, SmiContext context ) { object result = null; if ( IsDBNull_Unchecked( sink, getters, ordinal ) ) { if (SqlDbType.Udt == metaData.SqlDbType) { result = NullUdtInstance(metaData); } else { result = __typeSpecificNullForSqlValue[(int)metaData.SqlDbType]; } } else { switch( metaData.SqlDbType ) { case SqlDbType.BigInt: result = new SqlInt64( GetInt64_Unchecked( sink, getters, ordinal ) ); break; case SqlDbType.Binary: result = GetSqlBinary_Unchecked( sink, getters, ordinal ); break; case SqlDbType.Bit: result = new SqlBoolean( GetBoolean_Unchecked( sink, getters, ordinal ) ); break; case SqlDbType.Char: result = new SqlString( GetString_Unchecked( sink, getters, ordinal ) ); break; case SqlDbType.DateTime: result = new SqlDateTime( GetDateTime_Unchecked( sink, getters, ordinal ) ); break; case SqlDbType.Decimal: result = GetSqlDecimal_Unchecked( sink, getters, ordinal ); break; case SqlDbType.Float: result = new SqlDouble( GetDouble_Unchecked( sink, getters, ordinal ) ); break; case SqlDbType.Image: result = GetSqlBinary_Unchecked( sink, getters, ordinal ); break; case SqlDbType.Int: result = new SqlInt32( GetInt32_Unchecked( sink, getters, ordinal ) ); break; case SqlDbType.Money: result = GetSqlMoney_Unchecked( sink, getters, ordinal ); break; case SqlDbType.NChar: result = new SqlString( GetString_Unchecked( sink, getters, ordinal ) ); break; case SqlDbType.NText: result = new SqlString( GetString_Unchecked( sink, getters, ordinal ) ); break; case SqlDbType.NVarChar: result = new SqlString( GetString_Unchecked( sink, getters, ordinal ) ); break; case SqlDbType.Real: result = new SqlSingle( GetSingle_Unchecked( sink, getters, ordinal ) ); break; case SqlDbType.UniqueIdentifier: result = new SqlGuid( GetGuid_Unchecked( sink, getters, ordinal ) ); break; case SqlDbType.SmallDateTime: result = new SqlDateTime( GetDateTime_Unchecked( sink, getters, ordinal ) ); break; case SqlDbType.SmallInt: result = new SqlInt16( GetInt16_Unchecked( sink, getters, ordinal ) ); break; case SqlDbType.SmallMoney: result = GetSqlMoney_Unchecked( sink, getters, ordinal ); break; case SqlDbType.Text: result = new SqlString( GetString_Unchecked( sink, getters, ordinal ) ); break; case SqlDbType.Timestamp: result = GetSqlBinary_Unchecked( sink, getters, ordinal ); break; case SqlDbType.TinyInt: result = new SqlByte( GetByte_Unchecked( sink, getters, ordinal ) ); break; case SqlDbType.VarBinary: result = GetSqlBinary_Unchecked( sink, getters, ordinal ); break; case SqlDbType.VarChar: result = new SqlString( GetString_Unchecked( sink, getters, ordinal ) ); break; case SqlDbType.Variant: metaData = getters.GetVariantType( sink, ordinal ); sink.ProcessMessagesAndThrow(); Debug.Assert( SqlDbType.Variant != metaData.SqlDbType, "Variant-within-variant causes endless recursion!" ); result = GetSqlValue( sink, getters, ordinal, metaData, context ); break; case SqlDbType.Xml: result = GetSqlXml_Unchecked( sink, getters, ordinal, context ); break; case SqlDbType.Udt: result = GetUdt_LengthChecked( sink, getters, ordinal, metaData ); break; } } return result; }
private static void SetXmlReader_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, XmlReader xmlReader) { // set up writer XmlWriterSettings WriterSettings = new XmlWriterSettings(); WriterSettings.CloseOutput = false; // don't close the memory stream WriterSettings.ConformanceLevel = ConformanceLevel.Fragment; WriterSettings.Encoding = System.Text.Encoding.Unicode; WriterSettings.OmitXmlDeclaration = true; System.IO.Stream target = new SmiSettersStream(sink, setters, ordinal, SmiMetaData.DefaultXml); XmlWriter xmlWriter = XmlWriter.Create(target, WriterSettings); // now spool the data into the writer (WriteNode will call Read()) xmlReader.Read(); while (!xmlReader.EOF) { xmlWriter.WriteNode(xmlReader, true); } xmlWriter.Flush(); sink.ProcessMessagesAndThrow(); }