2016-08-03 10:59:49 +00:00
//------------------------------------------------------------------------------
// <copyright file="SqlReferenceCollection.cs" company="Microsoft">
// Copyright (c) Microsoft Corporation. All rights reserved.
// </copyright>
2017-08-21 15:34:15 +00:00
// <owner current="true" primary="true">Microsoft</owner>
// <owner current="true" primary="false">Microsoft</owner>
2016-08-03 10:59:49 +00:00
//------------------------------------------------------------------------------
using System ;
using System.Data ;
using System.Data.Common ;
using System.Diagnostics ;
using System.Data.ProviderBase ;
using System.Threading ;
using System.Threading.Tasks ;
namespace System.Data.SqlClient {
sealed internal class SqlReferenceCollection : DbReferenceCollection {
internal const int DataReaderTag = 1 ;
internal const int CommandTag = 2 ;
internal const int BulkCopyTag = 3 ;
override public void Add ( object value , int tag ) {
Debug . Assert ( DataReaderTag = = tag | | CommandTag = = tag | | BulkCopyTag = = tag , "unexpected tag?" ) ;
Debug . Assert ( DataReaderTag ! = tag | | value is SqlDataReader , "tag doesn't match object type: SqlDataReader" ) ;
Debug . Assert ( CommandTag ! = tag | | value is SqlCommand , "tag doesn't match object type: SqlCommand" ) ;
Debug . Assert ( BulkCopyTag ! = tag | | value is SqlBulkCopy , "tag doesn't match object type: SqlBulkCopy" ) ;
base . AddItem ( value , tag ) ;
}
internal void Deactivate ( ) {
base . Notify ( 0 ) ;
}
internal SqlDataReader FindLiveReader ( SqlCommand command ) {
if ( command = = null ) {
// if null == command, will find first live datareader
return FindItem < SqlDataReader > ( DataReaderTag , ( dataReader ) = > ( ! dataReader . IsClosed ) ) ;
}
else {
// else will find live datareader assocated with the command
return FindItem < SqlDataReader > ( DataReaderTag , ( dataReader ) = > ( ( ! dataReader . IsClosed ) & & ( command = = dataReader . Command ) ) ) ;
}
}
// Finds a SqlCommand associated with the given StateObject
internal SqlCommand FindLiveCommand ( TdsParserStateObject stateObj ) {
return FindItem < SqlCommand > ( CommandTag , ( command ) = > ( command . StateObject = = stateObj ) ) ;
}
override protected void NotifyItem ( int message , int tag , object value ) {
Debug . Assert ( 0 = = message , "unexpected message?" ) ;
Debug . Assert ( DataReaderTag = = tag | | CommandTag = = tag | | BulkCopyTag = = tag , "unexpected tag?" ) ;
if ( tag = = DataReaderTag ) {
Debug . Assert ( value is SqlDataReader , "Incorrect object type" ) ;
var rdr = ( SqlDataReader ) value ;
if ( ! rdr . IsClosed ) {
rdr . CloseReaderFromConnection ( ) ;
}
}
else if ( tag = = CommandTag ) {
Debug . Assert ( value is SqlCommand , "Incorrect object type" ) ;
( ( SqlCommand ) value ) . OnConnectionClosed ( ) ;
}
else if ( tag = = BulkCopyTag ) {
Debug . Assert ( value is SqlBulkCopy , "Incorrect object type" ) ;
( ( SqlBulkCopy ) value ) . OnConnectionClosed ( ) ;
}
}
override public void Remove ( object value ) {
Debug . Assert ( value is SqlDataReader | | value is SqlCommand | | value is SqlBulkCopy , "SqlReferenceCollection.Remove expected a SqlDataReader or SqlCommand or SqlBulkCopy" ) ;
base . RemoveItem ( value ) ;
}
}
}