using System; using System.CodeDom; using System.CodeDom.Compiler; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.ComponentModel.Design.Serialization; using System.Configuration; using System.Data; using System.Data.Common; using System.Data.ProviderBase; using System.Data.Sql; using System.Data.SqlClient; using System.Data.SqlClient.SNI; using System.Data.SqlTypes; using System.Diagnostics; using System.Diagnostics.Tracing; using System.Dynamic; using System.EnterpriseServices; using System.Globalization; using System.IO; using System.IO.Pipes; using System.Linq; using System.Net; using System.Net.Security; using System.Net.Sockets; using System.Numerics; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.ConstrainedExecution; using System.Runtime.ExceptionServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Security; using System.Security.Authentication; using System.Security.Authentication.ExtendedProtection; using System.Security.Cryptography.X509Certificates; using System.Security.Permissions; using System.Security.Principal; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Transactions; using System.Xml; using System.Xml.Schema; using System.Xml.Serialization; using System.Xml.Serialization.Advanced; using System.Xml.XPath; using Microsoft.SqlServer.Server; using Microsoft.Win32.SafeHandles; using Unity; [assembly: AssemblyFileVersion("4.0.30319.17020")] [assembly: AllowPartiallyTrustedCallers] [assembly: ComVisible(false)] [assembly: NeutralResourcesLanguage("en-US")] [assembly: CLSCompliant(true)] [assembly: AssemblyInformationalVersion("4.0.30319.17020")] [assembly: SatelliteContractVersion("4.0.0.0")] [assembly: AssemblyCopyright("(c) Various Mono authors")] [assembly: AssemblyProduct("Mono Common Language Infrastructure")] [assembly: AssemblyCompany("Mono development team")] [assembly: AssemblyDefaultAlias("System.Data.dll")] [assembly: AssemblyDescription("System.Data.dll")] [assembly: AssemblyTitle("System.Data.dll")] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: CompilationRelaxations(8)] [assembly: InternalsVisibleTo("System.Web, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293")] [assembly: AssemblyDelaySign(true)] [assembly: InternalsVisibleTo("System.Design, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("4.0.0.0")] [module: UnverifiableCode] internal static class Interop { private static class Libraries { internal const string SystemNative = "System.Native"; internal const string HttpNative = "System.Net.Http.Native"; internal const string NetSecurityNative = "System.Net.Security.Native"; internal const string CryptoNative = "System.Security.Cryptography.Native.OpenSsl"; internal const string GlobalizationNative = "System.Globalization.Native"; internal const string CompressionNative = "System.IO.Compression.Native"; internal const string Libdl = "libdl"; } internal static class NetSecurityNative { internal sealed class GssApiException : Exception { private readonly Status _minorStatus; public Status MinorStatus => _minorStatus; public GssApiException(string message) : base(message) { } public GssApiException(Status majorStatus, Status minorStatus) : base(GetGssApiDisplayStatus(majorStatus, minorStatus)) { base.HResult = (int)majorStatus; _minorStatus = minorStatus; } private static string GetGssApiDisplayStatus(Status majorStatus, Status minorStatus) { string gssApiDisplayStatus = GetGssApiDisplayStatus(majorStatus, isMinor: false); string gssApiDisplayStatus2 = GetGssApiDisplayStatus(minorStatus, isMinor: true); if (gssApiDisplayStatus == null || gssApiDisplayStatus2 == null) { return SR.Format("GSSAPI operation failed with status: {0} (Minor status: {1}).", majorStatus.ToString("x"), minorStatus.ToString("x")); } return SR.Format("GSSAPI operation failed with error - {0} ({1}).", gssApiDisplayStatus, gssApiDisplayStatus2); } private static string GetGssApiDisplayStatus(Status status, bool isMinor) { GssBuffer buffer = default(GssBuffer); try { Status minorStatus; return ((isMinor ? DisplayMinorStatus(out minorStatus, status, ref buffer) : DisplayMajorStatus(out minorStatus, status, ref buffer)) != 0) ? null : Marshal.PtrToStringAnsi(buffer._data); } finally { buffer.Dispose(); } } } internal struct GssBuffer : IDisposable { internal ulong _length; internal IntPtr _data; internal int Copy(byte[] destination, int offset) { if (_data == IntPtr.Zero || _length == 0L) { return 0; } int num = Convert.ToInt32(_length); int num2 = destination.Length - offset; if (num > num2) { throw new GssApiException(SR.Format("Insufficient buffer space. Required: {0} Actual: {1}.", num, num2)); } Marshal.Copy(_data, destination, offset, num); return num; } internal byte[] ToByteArray() { if (_data == IntPtr.Zero || _length == 0L) { return Array.Empty(); } int num = Convert.ToInt32(_length); byte[] array = new byte[num]; Marshal.Copy(_data, array, 0, num); return array; } public void Dispose() { if (_data != IntPtr.Zero) { ReleaseGssBuffer(_data, _length); _data = IntPtr.Zero; } _length = 0uL; } } internal enum Status : uint { GSS_S_COMPLETE, GSS_S_CONTINUE_NEEDED } [Flags] internal enum GssFlags : uint { GSS_C_DELEG_FLAG = 1u, GSS_C_MUTUAL_FLAG = 2u, GSS_C_REPLAY_FLAG = 4u, GSS_C_SEQUENCE_FLAG = 8u, GSS_C_CONF_FLAG = 0x10u, GSS_C_INTEG_FLAG = 0x20u, GSS_C_ANON_FLAG = 0x40u, GSS_C_PROT_READY_FLAG = 0x80u, GSS_C_TRANS_FLAG = 0x100u, GSS_C_DCE_STYLE = 0x1000u, GSS_C_IDENTIFY_FLAG = 0x2000u, GSS_C_EXTENDED_ERROR_FLAG = 0x4000u, GSS_C_DELEG_POLICY_FLAG = 0x8000u } [DllImport("System.Net.Security.Native", EntryPoint = "NetSecurityNative_ReleaseGssBuffer")] internal static extern void ReleaseGssBuffer(IntPtr bufferPtr, ulong length); [DllImport("System.Net.Security.Native", EntryPoint = "NetSecurityNative_DisplayMinorStatus")] internal static extern Status DisplayMinorStatus(out Status minorStatus, Status statusValue, ref GssBuffer buffer); [DllImport("System.Net.Security.Native", EntryPoint = "NetSecurityNative_DisplayMajorStatus")] internal static extern Status DisplayMajorStatus(out Status minorStatus, Status statusValue, ref GssBuffer buffer); [DllImport("System.Net.Security.Native", EntryPoint = "NetSecurityNative_ImportUserName")] internal static extern Status ImportUserName(out Status minorStatus, string inputName, int inputNameByteCount, out Microsoft.Win32.SafeHandles.SafeGssNameHandle outputName); [DllImport("System.Net.Security.Native", EntryPoint = "NetSecurityNative_ImportPrincipalName")] internal static extern Status ImportPrincipalName(out Status minorStatus, string inputName, int inputNameByteCount, out Microsoft.Win32.SafeHandles.SafeGssNameHandle outputName); [DllImport("System.Net.Security.Native", EntryPoint = "NetSecurityNative_ReleaseName")] internal static extern Status ReleaseName(out Status minorStatus, ref IntPtr inputName); [DllImport("System.Net.Security.Native", EntryPoint = "NetSecurityNative_InitiateCredSpNego")] internal static extern Status InitiateCredSpNego(out Status minorStatus, Microsoft.Win32.SafeHandles.SafeGssNameHandle desiredName, out Microsoft.Win32.SafeHandles.SafeGssCredHandle outputCredHandle); [DllImport("System.Net.Security.Native", EntryPoint = "NetSecurityNative_InitiateCredWithPassword")] internal static extern Status InitiateCredWithPassword(out Status minorStatus, bool isNtlm, Microsoft.Win32.SafeHandles.SafeGssNameHandle desiredName, string password, int passwordLen, out Microsoft.Win32.SafeHandles.SafeGssCredHandle outputCredHandle); [DllImport("System.Net.Security.Native", EntryPoint = "NetSecurityNative_ReleaseCred")] internal static extern Status ReleaseCred(out Status minorStatus, ref IntPtr credHandle); [DllImport("System.Net.Security.Native", EntryPoint = "NetSecurityNative_InitSecContext")] internal static extern Status InitSecContext(out Status minorStatus, Microsoft.Win32.SafeHandles.SafeGssCredHandle initiatorCredHandle, ref Microsoft.Win32.SafeHandles.SafeGssContextHandle contextHandle, bool isNtlmOnly, Microsoft.Win32.SafeHandles.SafeGssNameHandle targetName, uint reqFlags, byte[] inputBytes, int inputLength, ref GssBuffer token, out uint retFlags, out int isNtlmUsed); [DllImport("System.Net.Security.Native", EntryPoint = "NetSecurityNative_AcceptSecContext")] internal static extern Status AcceptSecContext(out Status minorStatus, ref Microsoft.Win32.SafeHandles.SafeGssContextHandle acceptContextHandle, byte[] inputBytes, int inputLength, ref GssBuffer token); [DllImport("System.Net.Security.Native", EntryPoint = "NetSecurityNative_DeleteSecContext")] internal static extern Status DeleteSecContext(out Status minorStatus, ref IntPtr contextHandle); [DllImport("System.Net.Security.Native", EntryPoint = "NetSecurityNative_Wrap")] private static extern Status Wrap(out Status minorStatus, Microsoft.Win32.SafeHandles.SafeGssContextHandle contextHandle, bool isEncrypt, byte[] inputBytes, int offset, int count, ref GssBuffer outBuffer); [DllImport("System.Net.Security.Native", EntryPoint = "NetSecurityNative_Unwrap")] private static extern Status Unwrap(out Status minorStatus, Microsoft.Win32.SafeHandles.SafeGssContextHandle contextHandle, byte[] inputBytes, int offset, int count, ref GssBuffer outBuffer); internal static Status WrapBuffer(out Status minorStatus, Microsoft.Win32.SafeHandles.SafeGssContextHandle contextHandle, bool isEncrypt, byte[] inputBytes, int offset, int count, ref GssBuffer outBuffer) { return Wrap(out minorStatus, contextHandle, isEncrypt, inputBytes, offset, count, ref outBuffer); } internal static Status UnwrapBuffer(out Status minorStatus, Microsoft.Win32.SafeHandles.SafeGssContextHandle contextHandle, byte[] inputBytes, int offset, int count, ref GssBuffer outBuffer) { return Unwrap(out minorStatus, contextHandle, inputBytes, offset, count, ref outBuffer); } } } internal class SqlDependencyProcessDispatcher : MarshalByRefObject { private class SqlConnectionContainer { private SqlConnection _con; private SqlCommand _com; private SqlParameter _conversationGuidParam; private SqlParameter _timeoutParam; private SqlConnectionContainerHashHelper _hashHelper; private string _queue; private string _receiveQuery; private string _beginConversationQuery; private string _endConversationQuery; private string _concatQuery; private readonly int _defaultWaitforTimeout = 60000; private string _escapedQueueName; private string _sprocName; private string _dialogHandle; private string _cachedServer; private string _cachedDatabase; private volatile bool _errorState; private volatile bool _stop; private volatile bool _stopped; private volatile bool _serviceQueueCreated; private int _startCount; private Timer _retryTimer; private Dictionary _appDomainKeyHash; internal string Database { get { if (_cachedDatabase == null) { _cachedDatabase = _con.Database; } return _cachedDatabase; } } internal SqlConnectionContainerHashHelper HashHelper => _hashHelper; internal bool InErrorState => _errorState; internal string Queue => _queue; internal string Server => _cachedServer; internal SqlConnectionContainer(SqlConnectionContainerHashHelper hashHelper, string appDomainKey, bool useDefaults) { bool flag = false; try { _hashHelper = hashHelper; string text = null; if (useDefaults) { text = Guid.NewGuid().ToString(); _queue = "SqlQueryNotificationService-" + text; _hashHelper.ConnectionStringBuilder.ApplicationName = _queue; } else { _queue = _hashHelper.Queue; } _con = new SqlConnection(_hashHelper.ConnectionStringBuilder.ConnectionString); _ = (SqlConnectionString)_con.ConnectionOptions; _con.Open(); _cachedServer = _con.DataSource; _escapedQueueName = SqlConnection.FixupDatabaseTransactionName(_queue); _appDomainKeyHash = new Dictionary(); _com = new SqlCommand { Connection = _con, CommandText = "select is_broker_enabled from sys.databases where database_id=db_id()" }; if (!(bool)_com.ExecuteScalar()) { throw SQL.SqlDependencyDatabaseBrokerDisabled(); } _conversationGuidParam = new SqlParameter("@p1", SqlDbType.UniqueIdentifier); _timeoutParam = new SqlParameter("@p2", SqlDbType.Int) { Value = 0 }; _com.Parameters.Add(_timeoutParam); flag = true; _receiveQuery = "WAITFOR(RECEIVE TOP (1) message_type_name, conversation_handle, cast(message_body AS XML) as message_body from " + _escapedQueueName + "), TIMEOUT @p2;"; if (useDefaults) { _sprocName = SqlConnection.FixupDatabaseTransactionName("SqlQueryNotificationStoredProcedure-" + text); CreateQueueAndService(restart: false); } else { _com.CommandText = _receiveQuery; _endConversationQuery = "END CONVERSATION @p1; "; _concatQuery = _endConversationQuery + _receiveQuery; } IncrementStartCount(appDomainKey, out var _); SynchronouslyQueryServiceBrokerQueue(); _timeoutParam.Value = _defaultWaitforTimeout; AsynchronouslyQueryServiceBrokerQueue(); } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } ADP.TraceExceptionWithoutRethrow(e); if (flag) { TearDownAndDispose(); } else { if (_com != null) { _com.Dispose(); _com = null; } if (_con != null) { _con.Dispose(); _con = null; } } throw; } } internal bool AppDomainUnload(string appDomainKey) { lock (_appDomainKeyHash) { if (_appDomainKeyHash.ContainsKey(appDomainKey)) { int num = _appDomainKeyHash[appDomainKey]; bool appDomainStop = false; while (num > 0) { Stop(appDomainKey, out appDomainStop); num--; } } } return _stopped; } private void AsynchronouslyQueryServiceBrokerQueue() { AsyncCallback callback = AsyncResultCallback; _com.BeginExecuteReader(CommandBehavior.Default, callback, null); } private void AsyncResultCallback(IAsyncResult asyncResult) { try { using (SqlDataReader reader = _com.EndExecuteReader(asyncResult)) { ProcessNotificationResults(reader); } if (!_stop) { AsynchronouslyQueryServiceBrokerQueue(); } else { TearDownAndDispose(); } } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { _errorState = true; throw; } if (!_stop) { ADP.TraceExceptionWithoutRethrow(e); } if (_stop) { TearDownAndDispose(); return; } _errorState = true; Restart(null); } } private void CreateQueueAndService(bool restart) { SqlCommand sqlCommand = new SqlCommand { Connection = _con }; SqlTransaction sqlTransaction = null; try { sqlTransaction = (sqlCommand.Transaction = _con.BeginTransaction()); string text = SqlServerEscapeHelper.MakeStringLiteral(_queue); sqlCommand.CommandText = "CREATE PROCEDURE " + _sprocName + " AS BEGIN BEGIN TRANSACTION; RECEIVE TOP(0) conversation_handle FROM " + _escapedQueueName + "; IF (SELECT COUNT(*) FROM " + _escapedQueueName + " WHERE message_type_name = 'http://schemas.microsoft.com/SQL/ServiceBroker/DialogTimer') > 0 BEGIN if ((SELECT COUNT(*) FROM sys.services WHERE name = " + text + ") > 0) DROP SERVICE " + _escapedQueueName + "; if (OBJECT_ID(" + text + ", 'SQ') IS NOT NULL) DROP QUEUE " + _escapedQueueName + "; DROP PROCEDURE " + _sprocName + "; END COMMIT TRANSACTION; END"; if (!restart) { sqlCommand.ExecuteNonQuery(); } else { try { sqlCommand.ExecuteNonQuery(); } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } ADP.TraceExceptionWithoutRethrow(e); try { if (sqlTransaction != null) { sqlTransaction.Rollback(); sqlTransaction = null; } } catch (Exception e2) { if (!ADP.IsCatchableExceptionType(e2)) { throw; } ADP.TraceExceptionWithoutRethrow(e2); } } if (sqlTransaction == null) { sqlTransaction = (sqlCommand.Transaction = _con.BeginTransaction()); } } sqlCommand.CommandText = "IF OBJECT_ID(" + text + ", 'SQ') IS NULL BEGIN CREATE QUEUE " + _escapedQueueName + " WITH ACTIVATION (PROCEDURE_NAME=" + _sprocName + ", MAX_QUEUE_READERS=1, EXECUTE AS OWNER); END; IF (SELECT COUNT(*) FROM sys.services WHERE NAME=" + text + ") = 0 BEGIN CREATE SERVICE " + _escapedQueueName + " ON QUEUE " + _escapedQueueName + " ([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]); IF (SELECT COUNT(*) FROM sys.database_principals WHERE name='sql_dependency_subscriber' AND type='R') <> 0 BEGIN GRANT SEND ON SERVICE::" + _escapedQueueName + " TO sql_dependency_subscriber; END; END; BEGIN DIALOG @dialog_handle FROM SERVICE " + _escapedQueueName + " TO SERVICE " + text; SqlParameter sqlParameter = new SqlParameter { ParameterName = "@dialog_handle", DbType = DbType.Guid, Direction = ParameterDirection.Output }; sqlCommand.Parameters.Add(sqlParameter); sqlCommand.ExecuteNonQuery(); _dialogHandle = ((Guid)sqlParameter.Value).ToString(); _beginConversationQuery = "BEGIN CONVERSATION TIMER ('" + _dialogHandle + "') TIMEOUT = 120; " + _receiveQuery; _com.CommandText = _beginConversationQuery; _endConversationQuery = "END CONVERSATION @p1; "; _concatQuery = _endConversationQuery + _com.CommandText; sqlTransaction.Commit(); sqlTransaction = null; _serviceQueueCreated = true; } finally { if (sqlTransaction != null) { try { sqlTransaction.Rollback(); sqlTransaction = null; } catch (Exception e3) { if (!ADP.IsCatchableExceptionType(e3)) { throw; } ADP.TraceExceptionWithoutRethrow(e3); } } } } internal void IncrementStartCount(string appDomainKey, out bool appDomainStart) { appDomainStart = false; Interlocked.Increment(ref _startCount); lock (_appDomainKeyHash) { if (_appDomainKeyHash.ContainsKey(appDomainKey)) { _appDomainKeyHash[appDomainKey] += 1; return; } _appDomainKeyHash[appDomainKey] = 1; appDomainStart = true; } } private void ProcessNotificationResults(SqlDataReader reader) { Guid guid = Guid.Empty; try { if (_stop) { return; } while (reader.Read()) { string @string = reader.GetString(0); guid = reader.GetGuid(1); if (string.Compare(@string, "http://schemas.microsoft.com/SQL/Notifications/QueryNotification", StringComparison.OrdinalIgnoreCase) == 0) { SqlXml sqlXml = reader.GetSqlXml(2); if (sqlXml == null) { continue; } SqlNotification sqlNotification = SqlNotificationParser.ProcessMessage(sqlXml); if (sqlNotification == null) { continue; } string key = sqlNotification.Key; int num = key.IndexOf(';'); if (num < 0) { continue; } string key2 = key.Substring(0, num); SqlDependencyPerAppDomainDispatcher sqlDependencyPerAppDomainDispatcher; lock (s_staticInstance._sqlDependencyPerAppDomainDispatchers) { sqlDependencyPerAppDomainDispatcher = s_staticInstance._sqlDependencyPerAppDomainDispatchers[key2]; } if (sqlDependencyPerAppDomainDispatcher == null) { continue; } try { sqlDependencyPerAppDomainDispatcher.InvalidateCommandID(sqlNotification); } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } ADP.TraceExceptionWithoutRethrow(e); } } else { guid = Guid.Empty; } } } finally { if (guid == Guid.Empty) { _com.CommandText = _beginConversationQuery ?? _receiveQuery; if (_com.Parameters.Count > 1) { _com.Parameters.Remove(_conversationGuidParam); } } else { _com.CommandText = _concatQuery; _conversationGuidParam.Value = guid; if (_com.Parameters.Count == 1) { _com.Parameters.Add(_conversationGuidParam); } } } } private void Restart(object unused) { try { lock (this) { if (!_stop) { try { _con.Close(); } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } ADP.TraceExceptionWithoutRethrow(e); } } } lock (this) { if (!_stop) { _con.Open(); } } lock (this) { if (!_stop && _serviceQueueCreated) { bool flag = false; try { CreateQueueAndService(restart: true); } catch (Exception e2) { if (!ADP.IsCatchableExceptionType(e2)) { throw; } ADP.TraceExceptionWithoutRethrow(e2); flag = true; } if (flag) { s_staticInstance.Invalidate(Server, new SqlNotification(SqlNotificationInfo.Error, SqlNotificationSource.Client, SqlNotificationType.Change, null)); } } } lock (this) { if (!_stop) { _timeoutParam.Value = 0; SynchronouslyQueryServiceBrokerQueue(); _timeoutParam.Value = _defaultWaitforTimeout; AsynchronouslyQueryServiceBrokerQueue(); _errorState = false; _retryTimer = null; } } if (_stop) { TearDownAndDispose(); } } catch (Exception e3) { if (!ADP.IsCatchableExceptionType(e3)) { throw; } ADP.TraceExceptionWithoutRethrow(e3); try { s_staticInstance.Invalidate(Server, new SqlNotification(SqlNotificationInfo.Error, SqlNotificationSource.Client, SqlNotificationType.Change, null)); } catch (Exception e4) { if (!ADP.IsCatchableExceptionType(e4)) { throw; } ADP.TraceExceptionWithoutRethrow(e4); } try { _con.Close(); } catch (Exception e5) { if (!ADP.IsCatchableExceptionType(e5)) { throw; } ADP.TraceExceptionWithoutRethrow(e5); } if (!_stop) { _retryTimer = new Timer(Restart, null, _defaultWaitforTimeout, -1); } } } internal bool Stop(string appDomainKey, out bool appDomainStop) { appDomainStop = false; if (appDomainKey != null) { lock (_appDomainKeyHash) { if (_appDomainKeyHash.ContainsKey(appDomainKey)) { int num = _appDomainKeyHash[appDomainKey]; if (num > 0) { _appDomainKeyHash[appDomainKey] = num - 1; } if (1 == num) { _appDomainKeyHash.Remove(appDomainKey); appDomainStop = true; } } } } if (Interlocked.Decrement(ref _startCount) == 0) { lock (this) { try { _com.Cancel(); } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } ADP.TraceExceptionWithoutRethrow(e); } _stop = true; } Stopwatch stopwatch = Stopwatch.StartNew(); while (true) { lock (this) { if (!_stopped) { if (!_errorState && stopwatch.Elapsed.Seconds < 30) { goto IL_0127; } Timer retryTimer = _retryTimer; _retryTimer = null; retryTimer?.Dispose(); TearDownAndDispose(); } } break; IL_0127: Thread.Sleep(1); } } return _stopped; } private void SynchronouslyQueryServiceBrokerQueue() { using SqlDataReader reader = _com.ExecuteReader(); ProcessNotificationResults(reader); } private void TearDownAndDispose() { lock (this) { try { if (_con.State == ConnectionState.Closed || ConnectionState.Broken == _con.State) { return; } if (_com.Parameters.Count > 1) { try { _com.CommandText = _endConversationQuery; _com.Parameters.Remove(_timeoutParam); _com.ExecuteNonQuery(); } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } ADP.TraceExceptionWithoutRethrow(e); } } if (!_serviceQueueCreated || _errorState) { return; } _com.CommandText = "BEGIN TRANSACTION; DROP SERVICE " + _escapedQueueName + "; DROP QUEUE " + _escapedQueueName + "; DROP PROCEDURE " + _sprocName + "; COMMIT TRANSACTION;"; try { _com.ExecuteNonQuery(); } catch (Exception e2) { if (!ADP.IsCatchableExceptionType(e2)) { throw; } ADP.TraceExceptionWithoutRethrow(e2); } } finally { _stopped = true; _con.Dispose(); } } } } private class SqlNotificationParser { [Flags] private enum MessageAttributes { None = 0, Type = 1, Source = 2, Info = 4, All = 7 } private const string RootNode = "QueryNotification"; private const string MessageNode = "Message"; private const string InfoAttribute = "info"; private const string SourceAttribute = "source"; private const string TypeAttribute = "type"; internal static SqlNotification ProcessMessage(SqlXml xmlMessage) { using XmlReader xmlReader = xmlMessage.CreateReader(); _ = string.Empty; MessageAttributes messageAttributes = MessageAttributes.None; SqlNotificationType type = SqlNotificationType.Unknown; SqlNotificationInfo info = SqlNotificationInfo.Unknown; SqlNotificationSource source = SqlNotificationSource.Unknown; string key = string.Empty; xmlReader.Read(); if (XmlNodeType.Element == xmlReader.NodeType && "QueryNotification" == xmlReader.LocalName && 3 <= xmlReader.AttributeCount) { while (MessageAttributes.All != messageAttributes && xmlReader.MoveToNextAttribute()) { try { switch (xmlReader.LocalName) { case "type": try { SqlNotificationType sqlNotificationType = (SqlNotificationType)Enum.Parse(typeof(SqlNotificationType), xmlReader.Value, ignoreCase: true); if (Enum.IsDefined(typeof(SqlNotificationType), sqlNotificationType)) { type = sqlNotificationType; } } catch (Exception e2) { if (!ADP.IsCatchableExceptionType(e2)) { throw; } ADP.TraceExceptionWithoutRethrow(e2); } messageAttributes |= MessageAttributes.Type; break; case "source": try { SqlNotificationSource sqlNotificationSource = (SqlNotificationSource)Enum.Parse(typeof(SqlNotificationSource), xmlReader.Value, ignoreCase: true); if (Enum.IsDefined(typeof(SqlNotificationSource), sqlNotificationSource)) { source = sqlNotificationSource; } } catch (Exception e3) { if (!ADP.IsCatchableExceptionType(e3)) { throw; } ADP.TraceExceptionWithoutRethrow(e3); } messageAttributes |= MessageAttributes.Source; break; case "info": try { string value = xmlReader.Value; switch (value) { case "set options": info = SqlNotificationInfo.Options; break; case "previous invalid": info = SqlNotificationInfo.PreviousFire; break; case "query template limit": info = SqlNotificationInfo.TemplateLimit; break; default: { SqlNotificationInfo sqlNotificationInfo = (SqlNotificationInfo)Enum.Parse(typeof(SqlNotificationInfo), value, ignoreCase: true); if (Enum.IsDefined(typeof(SqlNotificationInfo), sqlNotificationInfo)) { info = sqlNotificationInfo; } break; } } } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } ADP.TraceExceptionWithoutRethrow(e); } messageAttributes |= MessageAttributes.Info; break; } } catch (ArgumentException e4) { ADP.TraceExceptionWithoutRethrow(e4); return null; } } if (MessageAttributes.All != messageAttributes) { return null; } if (!xmlReader.Read()) { return null; } if (XmlNodeType.Element != xmlReader.NodeType || string.Compare(xmlReader.LocalName, "Message", StringComparison.OrdinalIgnoreCase) != 0) { return null; } if (!xmlReader.Read()) { return null; } if (xmlReader.NodeType != XmlNodeType.Text) { return null; } using (XmlTextReader xmlTextReader = new XmlTextReader(xmlReader.Value, XmlNodeType.Element, null)) { if (!xmlTextReader.Read()) { return null; } if (xmlTextReader.NodeType != XmlNodeType.Text) { return null; } key = xmlTextReader.Value; xmlTextReader.Close(); } return new SqlNotification(info, source, type, key); } return null; } } private class SqlConnectionContainerHashHelper { private DbConnectionPoolIdentity _identity; private string _connectionString; private string _queue; private SqlConnectionStringBuilder _connectionStringBuilder; internal SqlConnectionStringBuilder ConnectionStringBuilder => _connectionStringBuilder; internal DbConnectionPoolIdentity Identity => _identity; internal string Queue => _queue; internal SqlConnectionContainerHashHelper(DbConnectionPoolIdentity identity, string connectionString, string queue, SqlConnectionStringBuilder connectionStringBuilder) { _identity = identity; _connectionString = connectionString; _queue = queue; _connectionStringBuilder = connectionStringBuilder; } public override bool Equals(object value) { SqlConnectionContainerHashHelper sqlConnectionContainerHashHelper = (SqlConnectionContainerHashHelper)value; bool flag = false; if (sqlConnectionContainerHashHelper == null) { return false; } if (this == sqlConnectionContainerHashHelper) { return true; } if ((_identity != null && sqlConnectionContainerHashHelper._identity == null) || (_identity == null && sqlConnectionContainerHashHelper._identity != null)) { return false; } if (_identity == null && sqlConnectionContainerHashHelper._identity == null) { if (sqlConnectionContainerHashHelper._connectionString == _connectionString && string.Equals(sqlConnectionContainerHashHelper._queue, _queue, StringComparison.OrdinalIgnoreCase)) { return true; } return false; } if (sqlConnectionContainerHashHelper._identity.Equals(_identity) && sqlConnectionContainerHashHelper._connectionString == _connectionString && string.Equals(sqlConnectionContainerHashHelper._queue, _queue, StringComparison.OrdinalIgnoreCase)) { return true; } return false; } public override int GetHashCode() { int num = 0; if (_identity != null) { num = _identity.GetHashCode(); } if (_queue != null) { return _connectionString.GetHashCode() + _queue.GetHashCode() + num; } return _connectionString.GetHashCode() + num; } } private static SqlDependencyProcessDispatcher s_staticInstance = new SqlDependencyProcessDispatcher(null); private Dictionary _connectionContainers; private Dictionary _sqlDependencyPerAppDomainDispatchers; internal static SqlDependencyProcessDispatcher SingletonProcessDispatcher => s_staticInstance; private SqlDependencyProcessDispatcher(object dummyVariable) { _connectionContainers = new Dictionary(); _sqlDependencyPerAppDomainDispatchers = new Dictionary(); } public SqlDependencyProcessDispatcher() { } private static SqlConnectionContainerHashHelper GetHashHelper(string connectionString, out SqlConnectionStringBuilder connectionStringBuilder, out DbConnectionPoolIdentity identity, out string user, string queue) { connectionStringBuilder = new SqlConnectionStringBuilder(connectionString) { Pooling = false, Enlist = false, ConnectRetryCount = 0 }; if (queue != null) { connectionStringBuilder.ApplicationName = queue; } if (connectionStringBuilder.IntegratedSecurity) { identity = DbConnectionPoolIdentity.GetCurrent(); user = null; } else { identity = null; user = connectionStringBuilder.UserID; } return new SqlConnectionContainerHashHelper(identity, connectionStringBuilder.ConnectionString, queue, connectionStringBuilder); } public override object InitializeLifetimeService() { return null; } private void Invalidate(string server, SqlNotification sqlNotification) { lock (_sqlDependencyPerAppDomainDispatchers) { foreach (KeyValuePair sqlDependencyPerAppDomainDispatcher in _sqlDependencyPerAppDomainDispatchers) { SqlDependencyPerAppDomainDispatcher value = sqlDependencyPerAppDomainDispatcher.Value; try { value.InvalidateServer(server, sqlNotification); } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } ADP.TraceExceptionWithoutRethrow(e); } } } } internal void QueueAppDomainUnloading(string appDomainKey) { ThreadPool.QueueUserWorkItem(AppDomainUnloading, appDomainKey); } private void AppDomainUnloading(object state) { string text = (string)state; lock (_connectionContainers) { List list = new List(); foreach (KeyValuePair connectionContainer in _connectionContainers) { SqlConnectionContainer value = connectionContainer.Value; if (value.AppDomainUnload(text)) { list.Add(value.HashHelper); } } foreach (SqlConnectionContainerHashHelper item in list) { _connectionContainers.Remove(item); } } lock (_sqlDependencyPerAppDomainDispatchers) { _sqlDependencyPerAppDomainDispatchers.Remove(text); } } internal bool StartWithDefault(string connectionString, out string server, out DbConnectionPoolIdentity identity, out string user, out string database, ref string service, string appDomainKey, SqlDependencyPerAppDomainDispatcher dispatcher, out bool errorOccurred, out bool appDomainStart) { return Start(connectionString, out server, out identity, out user, out database, ref service, appDomainKey, dispatcher, out errorOccurred, out appDomainStart, useDefaults: true); } internal bool Start(string connectionString, string queue, string appDomainKey, SqlDependencyPerAppDomainDispatcher dispatcher) { string server; DbConnectionPoolIdentity identity; bool errorOccurred; return Start(connectionString, out server, out identity, out server, out server, ref queue, appDomainKey, dispatcher, out errorOccurred, out errorOccurred, useDefaults: false); } private bool Start(string connectionString, out string server, out DbConnectionPoolIdentity identity, out string user, out string database, ref string queueService, string appDomainKey, SqlDependencyPerAppDomainDispatcher dispatcher, out bool errorOccurred, out bool appDomainStart, bool useDefaults) { server = null; identity = null; user = null; database = null; errorOccurred = false; appDomainStart = false; lock (_sqlDependencyPerAppDomainDispatchers) { if (!_sqlDependencyPerAppDomainDispatchers.ContainsKey(appDomainKey)) { _sqlDependencyPerAppDomainDispatchers[appDomainKey] = dispatcher; } } SqlConnectionStringBuilder connectionStringBuilder; SqlConnectionContainerHashHelper hashHelper = GetHashHelper(connectionString, out connectionStringBuilder, out identity, out user, queueService); bool result = false; SqlConnectionContainer sqlConnectionContainer = null; lock (_connectionContainers) { if (!_connectionContainers.ContainsKey(hashHelper)) { sqlConnectionContainer = new SqlConnectionContainer(hashHelper, appDomainKey, useDefaults); _connectionContainers.Add(hashHelper, sqlConnectionContainer); result = true; appDomainStart = true; } else { sqlConnectionContainer = _connectionContainers[hashHelper]; if (sqlConnectionContainer.InErrorState) { errorOccurred = true; } else { sqlConnectionContainer.IncrementStartCount(appDomainKey, out appDomainStart); } } } if (useDefaults && !errorOccurred) { server = sqlConnectionContainer.Server; database = sqlConnectionContainer.Database; queueService = sqlConnectionContainer.Queue; } return result; } internal bool Stop(string connectionString, out string server, out DbConnectionPoolIdentity identity, out string user, out string database, ref string queueService, string appDomainKey, out bool appDomainStop) { server = null; identity = null; user = null; database = null; appDomainStop = false; SqlConnectionStringBuilder connectionStringBuilder; SqlConnectionContainerHashHelper hashHelper = GetHashHelper(connectionString, out connectionStringBuilder, out identity, out user, queueService); bool result = false; lock (_connectionContainers) { if (_connectionContainers.ContainsKey(hashHelper)) { SqlConnectionContainer sqlConnectionContainer = _connectionContainers[hashHelper]; server = sqlConnectionContainer.Server; database = sqlConnectionContainer.Database; queueService = sqlConnectionContainer.Queue; if (sqlConnectionContainer.Stop(appDomainKey, out appDomainStop)) { result = true; _connectionContainers.Remove(hashHelper); } } } return result; } } internal static class AssemblyRef { internal const string SystemConfiguration = "System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; internal const string System = "System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; public const string EcmaPublicKey = "b77a5c561934e089"; public const string FrameworkPublicKeyFull = "0024000004800000940000000602000000240000525341310004000001000100B5FC90E7027F67871E773A8FDE8938C81DD402BA65B9201D60593E96C492651E889CC13F1415EBB53FAC1131AE0BD333C5EE6021672D9718EA31A8AEBD0DA0072F25D87DBA6FC90FFD598ED4DA35E44C398C454307E8E33B8426143DAEC9F596836F97C8F74750E5975C64E2189F45DEF46B2A2B1247ADC3652BF5C308055DA9"; public const string FrameworkPublicKeyFull2 = "00240000048000009400000006020000002400005253413100040000010001008D56C76F9E8649383049F383C44BE0EC204181822A6C31CF5EB7EF486944D032188EA1D3920763712CCB12D75FB77E9811149E6148E5D32FBAAB37611C1878DDC19E20EF135D0CB2CFF2BFEC3D115810C3D9069638FE4BE215DBF795861920E5AB6F7DB2E2CEEF136AC23D5DD2BF031700AEC232F6C6B1C785B4305C123B37AB"; public const string MicrosoftPublicKey = "b03f5f7f11d50a3a"; public const string MicrosoftJScript = "Microsoft.JScript, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string MicrosoftVSDesigner = "Microsoft.VSDesigner, Version=0.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string SystemData = "System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string SystemDesign = "System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string SystemDrawing = "System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string SystemWeb = "System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string SystemWebExtensions = "System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; public const string SystemWindowsForms = "System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; } internal static class Consts { public const string MonoVersion = "5.11.0.0"; public const string MonoCompany = "Mono development team"; public const string MonoProduct = "Mono Common Language Infrastructure"; public const string MonoCopyright = "(c) Various Mono authors"; public const int MonoCorlibVersion = 1051100001; public const string FxVersion = "4.0.0.0"; public const string FxFileVersion = "4.0.30319.17020"; public const string EnvironmentVersion = "4.0.30319.17020"; public const string VsVersion = "0.0.0.0"; public const string VsFileVersion = "11.0.0.0"; private const string PublicKeyToken = "b77a5c561934e089"; public const string AssemblyI18N = "I18N, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; public const string AssemblyMicrosoft_JScript = "Microsoft.JScript, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblyMicrosoft_VisualStudio = "Microsoft.VisualStudio, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblyMicrosoft_VisualStudio_Web = "Microsoft.VisualStudio.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblyMicrosoft_VSDesigner = "Microsoft.VSDesigner, Version=0.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblyMono_Http = "Mono.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; public const string AssemblyMono_Posix = "Mono.Posix, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; public const string AssemblyMono_Security = "Mono.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; public const string AssemblyMono_Messaging_RabbitMQ = "Mono.Messaging.RabbitMQ, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; public const string AssemblyCorlib = "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystem = "System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystem_Data = "System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystem_Design = "System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_DirectoryServices = "System.DirectoryServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Drawing = "System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Drawing_Design = "System.Drawing.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Messaging = "System.Messaging, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Security = "System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_ServiceProcess = "System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Web = "System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Windows_Forms = "System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystem_2_0 = "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystemCore_3_5 = "System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystem_Core = "System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string WindowsBase_3_0 = "WindowsBase, Version=3.0.0.0, PublicKeyToken=31bf3856ad364e35"; public const string AssemblyWindowsBase = "WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; public const string AssemblyPresentationCore_3_5 = "PresentationCore, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; public const string AssemblyPresentationCore_4_0 = "PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; public const string AssemblyPresentationFramework_3_5 = "PresentationFramework, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; public const string AssemblySystemServiceModel_3_0 = "System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; } internal sealed class Locale { private Locale() { } public static string GetText(string msg) { return msg; } public static string GetText(string fmt, params object[] args) { return string.Format(fmt, args); } } internal static class SR { public const string ADP_CollectionIndexString = "An {0} with {1} '{2}' is not contained by this {3}."; public const string ADP_CollectionInvalidType = "The {0} only accepts non-null {1} type objects, not {2} objects."; public const string ADP_CollectionIsNotParent = "The {0} is already contained by another {1}."; public const string ADP_CollectionNullValue = "The {0} only accepts non-null {1} type objects."; public const string ADP_CollectionRemoveInvalidObject = "Attempted to remove an {0} that is not contained by this {1}."; public const string ADP_CollectionUniqueValue = "The {0}.{1} is required to be unique, '{2}' already exists in the collection."; public const string ADP_ConnectionStateMsg_Closed = "The connection's current state is closed."; public const string ADP_ConnectionStateMsg_Connecting = "The connection's current state is connecting."; public const string ADP_ConnectionStateMsg_Open = "The connection's current state is open."; public const string ADP_ConnectionStateMsg_OpenExecuting = "The connection's current state is executing."; public const string ADP_ConnectionStateMsg_OpenFetching = "The connection's current state is fetching."; public const string ADP_ConnectionStateMsg = "The connection's current state: {0}."; public const string ADP_ConnectionStringSyntax = "Format of the initialization string does not conform to specification starting at index {0}."; public const string ADP_DataReaderClosed = "Invalid attempt to call {0} when reader is closed."; public const string ADP_EmptyString = "Expecting non-empty string for '{0}' parameter."; public const string ADP_InvalidEnumerationValue = "The {0} enumeration value, {1}, is invalid."; public const string ADP_InvalidKey = "Invalid keyword, contain one or more of 'no characters', 'control characters', 'leading or trailing whitespace' or 'leading semicolons'."; public const string ADP_InvalidValue = "The value contains embedded nulls (\\\\u0000)."; public const string Xml_SimpleTypeNotSupported = "DataSet doesn't support 'union' or 'list' as simpleType."; public const string Xml_MissingAttribute = "Invalid {0} syntax: missing required '{1}' attribute."; public const string Xml_ValueOutOfRange = "Value '{1}' is invalid for attribute '{0}'."; public const string Xml_AttributeValues = "The value of attribute '{0}' should be '{1}' or '{2}'."; public const string Xml_RelationParentNameMissing = "Parent table name is missing in relation '{0}'."; public const string Xml_RelationChildNameMissing = "Child table name is missing in relation '{0}'."; public const string Xml_RelationTableKeyMissing = "Parent table key is missing in relation '{0}'."; public const string Xml_RelationChildKeyMissing = "Child table key is missing in relation '{0}'."; public const string Xml_UndefinedDatatype = "Undefined data type: '{0}'."; public const string Xml_DatatypeNotDefined = "Data type not defined."; public const string Xml_InvalidField = "Invalid XPath selection inside field node. Cannot find: {0}."; public const string Xml_InvalidSelector = "Invalid XPath selection inside selector node: {0}."; public const string Xml_InvalidKey = "Invalid 'Key' node inside constraint named: {0}."; public const string Xml_DuplicateConstraint = "The constraint name {0} is already used in the schema."; public const string Xml_CannotConvert = " Cannot convert '{0}' to type '{1}'."; public const string Xml_MissingRefer = "Missing '{0}' part in '{1}' constraint named '{2}'."; public const string Xml_MismatchKeyLength = "Invalid Relation definition: different length keys."; public const string Xml_CircularComplexType = "DataSet doesn't allow the circular reference in the ComplexType named '{0}'."; public const string Xml_CannotInstantiateAbstract = "DataSet cannot instantiate an abstract ComplexType for the node {0}."; public const string Xml_MultipleTargetConverterError = "An error occurred with the multiple target converter while writing an Xml Schema. See the inner exception for details."; public const string Xml_MultipleTargetConverterEmpty = "An error occurred with the multiple target converter while writing an Xml Schema. A null or empty string was returned."; public const string Xml_MergeDuplicateDeclaration = "Duplicated declaration '{0}'."; public const string Xml_MissingTable = "Cannot load diffGram. Table '{0}' is missing in the destination dataset."; public const string Xml_MissingSQL = "Cannot load diffGram. The 'sql' node is missing."; public const string Xml_ColumnConflict = "Column name '{0}' is defined for different mapping types."; public const string Xml_InvalidPrefix = "Prefix '{0}' is not valid, because it contains special characters."; public const string Xml_NestedCircular = "Circular reference in self-nested table '{0}'."; public const string Xml_FoundEntity = "DataSet cannot expand entities. Use XmlValidatingReader and set the EntityHandling property accordingly."; public const string Xml_PolymorphismNotSupported = "Type '{0}' does not implement IXmlSerializable interface therefore can not proceed with serialization."; public const string Xml_CanNotDeserializeObjectType = "Unable to proceed with deserialization. Data does not implement IXMLSerializable, therefore polymorphism is not supported."; public const string Xml_DataTableInferenceNotSupported = "DataTable does not support schema inference from Xml."; public const string Xml_MultipleParentRows = "Cannot proceed with serializing DataTable '{0}'. It contains a DataRow which has multiple parent rows on the same Foreign Key."; public const string Xml_IsDataSetAttributeMissingInSchema = "IsDataSet attribute is missing in input Schema."; public const string Xml_TooManyIsDataSetAtributeInSchema = "Cannot determine the DataSet Element. IsDataSet attribute exist more than once."; public const string Xml_DynamicWithoutXmlSerializable = "DataSet will not serialize types that implement IDynamicMetaObjectProvider but do not also implement IXmlSerializable."; public const string Expr_NYI = "The feature not implemented. {0}."; public const string Expr_MissingOperand = "Syntax error: Missing operand after '{0}' operator."; public const string Expr_TypeMismatch = "Type mismatch in expression '{0}'."; public const string Expr_ExpressionTooComplex = "Expression is too complex."; public const string Expr_UnboundName = "Cannot find column [{0}]."; public const string Expr_InvalidString = "The expression contains an invalid string constant: {0}."; public const string Expr_UndefinedFunction = "The expression contains undefined function call {0}()."; public const string Expr_Syntax = "Syntax error in the expression."; public const string Expr_FunctionArgumentCount = "Invalid number of arguments: function {0}()."; public const string Expr_MissingRightParen = "The expression is missing the closing parenthesis."; public const string Expr_UnknownToken = "Cannot interpret token '{0}' at position {1}."; public const string Expr_UnknownToken1 = "Expected {0}, but actual token at the position {2} is {1}."; public const string Expr_DatatypeConvertion = "Cannot convert from {0} to {1}."; public const string Expr_DatavalueConvertion = "Cannot convert value '{0}' to Type: {1}."; public const string Expr_InvalidName = "Invalid column name [{0}]."; public const string Expr_InvalidDate = "The expression contains invalid date constant '{0}'."; public const string Expr_NonConstantArgument = "Only constant expressions are allowed in the expression list for the IN operator."; public const string Expr_InvalidPattern = "Error in Like operator: the string pattern '{0}' is invalid."; public const string Expr_InWithoutParentheses = "Syntax error: The items following the IN keyword must be separated by commas and be enclosed in parentheses."; public const string Expr_ArgumentType = "Type mismatch in function argument: {0}(), argument {1}, expected {2}."; public const string Expr_ArgumentTypeInteger = "Type mismatch in function argument: {0}(), argument {1}, expected one of the Integer types."; public const string Expr_TypeMismatchInBinop = "Cannot perform '{0}' operation on {1} and {2}."; public const string Expr_AmbiguousBinop = "Operator '{0}' is ambiguous on operands of type '{1}' and '{2}'. Cannot mix signed and unsigned types. Please use explicit Convert() function."; public const string Expr_InWithoutList = "Syntax error: The IN keyword must be followed by a non-empty list of expressions separated by commas, and also must be enclosed in parentheses."; public const string Expr_UnsupportedOperator = "The expression contains unsupported operator '{0}'."; public const string Expr_InvalidNameBracketing = "The expression contains invalid name: '{0}'."; public const string Expr_MissingOperandBefore = "Syntax error: Missing operand before '{0}' operator."; public const string Expr_TooManyRightParentheses = "The expression has too many closing parentheses."; public const string Expr_UnresolvedRelation = "The table [{0}] involved in more than one relation. You must explicitly mention a relation name in the expression '{1}'."; public const string Expr_AggregateArgument = "Syntax error in aggregate argument: Expecting a single column argument with possible 'Child' qualifier."; public const string Expr_AggregateUnbound = "Unbound reference in the aggregate expression '{0}'."; public const string Expr_EvalNoContext = "Cannot evaluate non-constant expression without current row."; public const string Expr_ExpressionUnbound = "Unbound reference in the expression '{0}'."; public const string Expr_ComputeNotAggregate = "Cannot evaluate. Expression '{0}' is not an aggregate."; public const string Expr_FilterConvertion = "Filter expression '{0}' does not evaluate to a Boolean term."; public const string Expr_InvalidType = "Invalid type name '{0}'."; public const string Expr_LookupArgument = "Syntax error in Lookup expression: Expecting keyword 'Parent' followed by a single column argument with possible relation qualifier: Parent[()].."; public const string Expr_InvokeArgument = "Need a row or a table to Invoke DataFilter."; public const string Expr_ArgumentOutofRange = "{0}() argument is out of range."; public const string Expr_IsSyntax = "Syntax error: Invalid usage of 'Is' operator. Correct syntax: Is [Not] Null."; public const string Expr_Overflow = "Value is either too large or too small for Type '{0}'."; public const string Expr_BindFailure = "Cannot find the parent relation '{0}'."; public const string Expr_InvalidHoursArgument = "'hours' argument is out of range. Value must be between -14 and +14."; public const string Expr_InvalidMinutesArgument = "'minutes' argument is out of range. Value must be between -59 and +59."; public const string Expr_InvalidTimeZoneRange = "Provided range for time one exceeds total of 14 hours."; public const string Expr_MismatchKindandTimeSpan = "Kind property of provided DateTime argument, does not match 'hours' and 'minutes' arguments."; public const string Expr_UnsupportedType = "A DataColumn of type '{0}' does not support expression."; public const string Data_EnforceConstraints = "Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints."; public const string Data_CannotModifyCollection = "Collection itself is not modifiable."; public const string Data_CaseInsensitiveNameConflict = "The given name '{0}' matches at least two names in the collection object with different cases, but does not match either of them with the same case."; public const string Data_NamespaceNameConflict = "The given name '{0}' matches at least two names in the collection object with different namespaces."; public const string Data_InvalidOffsetLength = "Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection."; public const string Data_ArgumentOutOfRange = "'{0}' argument is out of range."; public const string Data_ArgumentNull = "'{0}' argument cannot be null."; public const string Data_ArgumentContainsNull = "'{0}' argument contains null value."; public const string DataColumns_OutOfRange = "Cannot find column {0}."; public const string DataColumns_Add1 = "Column '{0}' already belongs to this DataTable."; public const string DataColumns_Add2 = "Column '{0}' already belongs to another DataTable."; public const string DataColumns_Add3 = "Cannot have more than one SimpleContent columns in a DataTable."; public const string DataColumns_Add4 = "Cannot add a SimpleContent column to a table containing element columns or nested relations."; public const string DataColumns_AddDuplicate = "A column named '{0}' already belongs to this DataTable."; public const string DataColumns_AddDuplicate2 = "Cannot add a column named '{0}': a nested table with the same name already belongs to this DataTable."; public const string DataColumns_AddDuplicate3 = "A column named '{0}' already belongs to this DataTable: cannot set a nested table name to the same name."; public const string DataColumns_Remove = "Cannot remove a column that doesn't belong to this table."; public const string DataColumns_RemovePrimaryKey = "Cannot remove this column, because it's part of the primary key."; public const string DataColumns_RemoveChildKey = "Cannot remove this column, because it is part of the parent key for relationship {0}."; public const string DataColumns_RemoveConstraint = "Cannot remove this column, because it is a part of the constraint {0} on the table {1}."; public const string DataColumn_AutoIncrementAndExpression = "Cannot set AutoIncrement property for a computed column."; public const string DataColumn_AutoIncrementAndDefaultValue = "Cannot set AutoIncrement property for a column with DefaultValue set."; public const string DataColumn_DefaultValueAndAutoIncrement = "Cannot set a DefaultValue on an AutoIncrement column."; public const string DataColumn_AutoIncrementSeed = "AutoIncrementStep must be a non-zero value."; public const string DataColumn_NameRequired = "ColumnName is required when it is part of a DataTable."; public const string DataColumn_ChangeDataType = "Cannot change DataType of a column once it has data."; public const string DataColumn_NullDataType = "Column requires a valid DataType."; public const string DataColumn_DefaultValueDataType = "The DefaultValue for column {0} is of type {1} and cannot be converted to {2}."; public const string DataColumn_DefaultValueDataType1 = "The DefaultValue for the column is of type {0} and cannot be converted to {1}."; public const string DataColumn_DefaultValueColumnDataType = "The DefaultValue for column {0} is of type {1}, but the column is of type {2}."; public const string DataColumn_ReadOnlyAndExpression = "Cannot change ReadOnly property for the expression column."; public const string DataColumn_UniqueAndExpression = "Cannot change Unique property for the expression column."; public const string DataColumn_ExpressionAndUnique = "Cannot create an expression on a column that has AutoIncrement or Unique."; public const string DataColumn_ExpressionAndReadOnly = "Cannot set expression because column cannot be made ReadOnly."; public const string DataColumn_ExpressionAndConstraint = "Cannot set Expression property on column {0}, because it is a part of a constraint."; public const string DataColumn_ExpressionInConstraint = "Cannot create a constraint based on Expression column {0}."; public const string DataColumn_ExpressionCircular = "Cannot set Expression property due to circular reference in the expression."; public const string DataColumn_NullKeyValues = "Column '{0}' has null values in it."; public const string DataColumn_NullValues = "Column '{0}' does not allow nulls."; public const string DataColumn_ReadOnly = "Column '{0}' is read only."; public const string DataColumn_NonUniqueValues = "Column '{0}' contains non-unique values."; public const string DataColumn_NotInTheTable = "Column '{0}' does not belong to table {1}."; public const string DataColumn_NotInAnyTable = "Column must belong to a table."; public const string DataColumn_SetFailed = "Couldn't store <{0}> in {1} Column. Expected type is {2}."; public const string DataColumn_CannotSetToNull = "Cannot set Column '{0}' to be null. Please use DBNull instead."; public const string DataColumn_LongerThanMaxLength = "Cannot set column '{0}'. The value violates the MaxLength limit of this column."; public const string DataColumn_HasToBeStringType = "MaxLength applies to string data type only. You cannot set Column '{0}' property MaxLength to be non-negative number."; public const string DataColumn_CannotSetMaxLength = "Cannot set Column '{0}' property MaxLength to '{1}'. There is at least one string in the table longer than the new limit."; public const string DataColumn_CannotSetMaxLength2 = "Cannot set Column '{0}' property MaxLength. The Column is SimpleContent."; public const string DataColumn_CannotSimpleContentType = "Cannot set Column '{0}' property DataType to {1}. The Column is SimpleContent."; public const string DataColumn_CannotSimpleContent = "Cannot set Column '{0}' property MappingType to SimpleContent. The Column DataType is {1}."; public const string DataColumn_ExceedMaxLength = "Column '{0}' exceeds the MaxLength limit."; public const string DataColumn_NotAllowDBNull = "Column '{0}' does not allow DBNull.Value."; public const string DataColumn_CannotChangeNamespace = "Cannot change the Column '{0}' property Namespace. The Column is SimpleContent."; public const string DataColumn_AutoIncrementCannotSetIfHasData = "Cannot change AutoIncrement of a DataColumn with type '{0}' once it has data."; public const string DataColumn_NotInTheUnderlyingTable = "Column '{0}' does not belong to underlying table '{1}'."; public const string DataColumn_InvalidDataColumnMapping = "DataColumn with type '{0}' is a complexType. Can not serialize value of a complex type as Attribute"; public const string DataColumn_CannotSetDateTimeModeForNonDateTimeColumns = "The DateTimeMode can be set only on DataColumns of type DateTime."; public const string DataColumn_DateTimeMode = "Cannot change DateTimeMode from '{0}' to '{1}' once the table has data."; public const string DataColumn_INullableUDTwithoutStaticNull = "Type '{0}' does not contain static Null property or field."; public const string DataColumn_UDTImplementsIChangeTrackingButnotIRevertible = "Type '{0}' does not implement IRevertibleChangeTracking; therefore can not proceed with RejectChanges()."; public const string DataColumn_SetAddedAndModifiedCalledOnNonUnchanged = "SetAdded and SetModified can only be called on DataRows with Unchanged DataRowState."; public const string DataColumn_OrdinalExceedMaximun = "Ordinal '{0}' exceeds the maximum number."; public const string DataColumn_NullableTypesNotSupported = "DataSet does not support System.Nullable<>."; public const string DataConstraint_NoName = "Cannot change the name of a constraint to empty string when it is in the ConstraintCollection."; public const string DataConstraint_Violation = "Cannot enforce constraints on constraint {0}."; public const string DataConstraint_ViolationValue = "Column '{0}' is constrained to be unique. Value '{1}' is already present."; public const string DataConstraint_NotInTheTable = "Constraint '{0}' does not belong to this DataTable."; public const string DataConstraint_OutOfRange = "Cannot find constraint {0}."; public const string DataConstraint_Duplicate = "Constraint matches constraint named {0} already in collection."; public const string DataConstraint_DuplicateName = "A Constraint named '{0}' already belongs to this DataTable."; public const string DataConstraint_UniqueViolation = "These columns don't currently have unique values."; public const string DataConstraint_ForeignTable = "These columns don't point to this table."; public const string DataConstraint_ParentValues = "This constraint cannot be enabled as not all values have corresponding parent values."; public const string DataConstraint_AddFailed = "This constraint cannot be added since ForeignKey doesn't belong to table {0}."; public const string DataConstraint_RemoveFailed = "Cannot remove a constraint that doesn't belong to this table."; public const string DataConstraint_NeededForForeignKeyConstraint = "Cannot remove unique constraint '{0}'. Remove foreign key constraint '{1}' first."; public const string DataConstraint_CascadeDelete = "Cannot delete this row because constraints are enforced on relation {0}, and deleting this row will strand child rows."; public const string DataConstraint_CascadeUpdate = "Cannot make this change because constraints are enforced on relation {0}, and changing this value will strand child rows."; public const string DataConstraint_ClearParentTable = "Cannot clear table {0} because ForeignKeyConstraint {1} enforces constraints and there are child rows in {2}."; public const string DataConstraint_ForeignKeyViolation = "ForeignKeyConstraint {0} requires the child key values ({1}) to exist in the parent table."; public const string DataConstraint_BadObjectPropertyAccess = "Property not accessible because '{0}'."; public const string DataConstraint_RemoveParentRow = "Cannot remove this row because it has child rows, and constraints on relation {0} are enforced."; public const string DataConstraint_AddPrimaryKeyConstraint = "Cannot add primary key constraint since primary key is already set for the table."; public const string DataConstraint_CantAddConstraintToMultipleNestedTable = "Cannot add constraint to DataTable '{0}' which is a child table in two nested relations."; public const string DataKey_TableMismatch = "Cannot create a Key from Columns that belong to different tables."; public const string DataKey_NoColumns = "Cannot have 0 columns."; public const string DataKey_TooManyColumns = "Cannot have more than {0} columns."; public const string DataKey_DuplicateColumns = "Cannot create a Key when the same column is listed more than once: '{0}'"; public const string DataKey_RemovePrimaryKey = "Cannot remove unique constraint since it's the primary key of a table."; public const string DataKey_RemovePrimaryKey1 = "Cannot remove unique constraint since it's the primary key of table {0}."; public const string DataRelation_ColumnsTypeMismatch = "Parent Columns and Child Columns don't have type-matching columns."; public const string DataRelation_KeyColumnsIdentical = "ParentKey and ChildKey are identical."; public const string DataRelation_KeyLengthMismatch = "ParentColumns and ChildColumns should be the same length."; public const string DataRelation_KeyZeroLength = "ParentColumns and ChildColumns must not be zero length."; public const string DataRelation_ForeignRow = "The row doesn't belong to the same DataSet as this relation."; public const string DataRelation_NoName = "RelationName is required when it is part of a DataSet."; public const string DataRelation_ForeignTable = "GetChildRows requires a row whose Table is {0}, but the specified row's Table is {1}."; public const string DataRelation_ForeignDataSet = "This relation should connect two tables in this DataSet to be added to this DataSet."; public const string DataRelation_GetParentRowTableMismatch = "GetParentRow requires a row whose Table is {0}, but the specified row's Table is {1}."; public const string DataRelation_SetParentRowTableMismatch = "SetParentRow requires a child row whose Table is {0}, but the specified row's Table is {1}."; public const string DataRelation_DataSetMismatch = "Cannot have a relationship between tables in different DataSets."; public const string DataRelation_TablesInDifferentSets = "Cannot create a relation between tables in different DataSets."; public const string DataRelation_AlreadyExists = "A relation already exists for these child columns."; public const string DataRelation_DoesNotExist = "This relation doesn't belong to this relation collection."; public const string DataRelation_AlreadyInOtherDataSet = "This relation already belongs to another DataSet."; public const string DataRelation_AlreadyInTheDataSet = "This relation already belongs to this DataSet."; public const string DataRelation_DuplicateName = "A Relation named '{0}' already belongs to this DataSet."; public const string DataRelation_NotInTheDataSet = "Relation {0} does not belong to this DataSet."; public const string DataRelation_OutOfRange = "Cannot find relation {0}."; public const string DataRelation_TableNull = "Cannot create a collection on a null table."; public const string DataRelation_TableWasRemoved = "The table this collection displays relations for has been removed from its DataSet."; public const string DataRelation_ChildTableMismatch = "Cannot add a relation to this table's ParentRelation collection where this table isn't the child table."; public const string DataRelation_ParentTableMismatch = "Cannot add a relation to this table's ChildRelation collection where this table isn't the parent table."; public const string DataRelation_RelationNestedReadOnly = "Cannot set the 'Nested' property to false for this relation."; public const string DataRelation_TableCantBeNestedInTwoTables = "The same table '{0}' cannot be the child table in two nested relations."; public const string DataRelation_LoopInNestedRelations = "The table ({0}) cannot be the child table to itself in nested relations."; public const string DataRelation_CaseLocaleMismatch = "Cannot add a DataRelation or Constraint that has different Locale or CaseSensitive settings between its parent and child tables."; public const string DataRelation_ParentOrChildColumnsDoNotHaveDataSet = "Cannot create a DataRelation if Parent or Child Columns are not in a DataSet."; public const string DataRelation_InValidNestedRelation = "Nested table '{0}' which inherits its namespace cannot have multiple parent tables in different namespaces."; public const string DataRelation_InValidNamespaceInNestedRelation = "Nested table '{0}' with empty namespace cannot have multiple parent tables in different namespaces."; public const string DataRow_NotInTheDataSet = "The row doesn't belong to the same DataSet as this relation."; public const string DataRow_NotInTheTable = "Cannot perform this operation on a row not in the table."; public const string DataRow_ParentRowNotInTheDataSet = "This relation and child row don't belong to same DataSet."; public const string DataRow_EditInRowChanging = "Cannot change a proposed value in the RowChanging event."; public const string DataRow_EndEditInRowChanging = "Cannot call EndEdit() inside an OnRowChanging event."; public const string DataRow_BeginEditInRowChanging = "Cannot call BeginEdit() inside the RowChanging event."; public const string DataRow_CancelEditInRowChanging = "Cannot call CancelEdit() inside an OnRowChanging event. Throw an exception to cancel this update."; public const string DataRow_DeleteInRowDeleting = "Cannot call Delete inside an OnRowDeleting event. Throw an exception to cancel this delete."; public const string DataRow_ValuesArrayLength = "Input array is longer than the number of columns in this table."; public const string DataRow_NoCurrentData = "There is no Current data to access."; public const string DataRow_NoOriginalData = "There is no Original data to access."; public const string DataRow_NoProposedData = "There is no Proposed data to access."; public const string DataRow_RemovedFromTheTable = "This row has been removed from a table and does not have any data. BeginEdit() will allow creation of new data in this row."; public const string DataRow_DeletedRowInaccessible = "Deleted row information cannot be accessed through the row."; public const string DataRow_InvalidVersion = "Version must be Original, Current, or Proposed."; public const string DataRow_OutOfRange = "There is no row at position {0}."; public const string DataRow_RowInsertOutOfRange = "The row insert position {0} is invalid."; public const string DataRow_RowInsertMissing = "Values are missing in the rowOrder sequence for table '{0}'."; public const string DataRow_RowOutOfRange = "The given DataRow is not in the current DataRowCollection."; public const string DataRow_AlreadyInOtherCollection = "This row already belongs to another table."; public const string DataRow_AlreadyInTheCollection = "This row already belongs to this table."; public const string DataRow_AlreadyDeleted = "Cannot delete this row since it's already deleted."; public const string DataRow_Empty = "This row is empty."; public const string DataRow_AlreadyRemoved = "Cannot remove a row that's already been removed."; public const string DataRow_MultipleParents = "A child row has multiple parents."; public const string DataRow_InvalidRowBitPattern = "Unrecognized row state bit pattern."; public const string DataSet_SetNameToEmpty = "Cannot change the name of the DataSet to an empty string."; public const string DataSet_SetDataSetNameConflicting = "The name '{0}' is invalid. A DataSet cannot have the same name of the DataTable."; public const string DataSet_UnsupportedSchema = "The schema namespace is invalid. Please use this one instead: {0}."; public const string DataSet_CannotChangeCaseLocale = "Cannot change CaseSensitive or Locale property. This change would lead to at least one DataRelation or Constraint to have different Locale or CaseSensitive settings between its related tables."; public const string DataSet_CannotChangeSchemaSerializationMode = "SchemaSerializationMode property can be set only if it is overridden by derived DataSet."; public const string DataTable_ForeignPrimaryKey = "PrimaryKey columns do not belong to this table."; public const string DataTable_CannotAddToSimpleContent = "Cannot add a nested relation or an element column to a table containing a SimpleContent column."; public const string DataTable_NoName = "TableName is required when it is part of a DataSet."; public const string DataTable_MultipleSimpleContentColumns = "DataTable already has a simple content column."; public const string DataTable_MissingPrimaryKey = "Table doesn't have a primary key."; public const string DataTable_InvalidSortString = " {0} isn't a valid Sort string entry."; public const string DataTable_CanNotSerializeDataTableHierarchy = "Cannot serialize the DataTable. A DataTable being used in one or more DataColumn expressions is not a descendant of current DataTable."; public const string DataTable_CanNotRemoteDataTable = "This DataTable can only be remoted as part of DataSet. One or more Expression Columns has reference to other DataTable(s)."; public const string DataTable_CanNotSetRemotingFormat = "Cannot have different remoting format property value for DataSet and DataTable."; public const string DataTable_CanNotSerializeDataTableWithEmptyName = "Cannot serialize the DataTable. DataTable name is not set."; public const string DataTable_DuplicateName = "A DataTable named '{0}' already belongs to this DataSet."; public const string DataTable_DuplicateName2 = "A DataTable named '{0}' with the same Namespace '{1}' already belongs to this DataSet."; public const string DataTable_SelfnestedDatasetConflictingName = "The table ({0}) cannot be the child table to itself in a nested relation: the DataSet name conflicts with the table name."; public const string DataTable_DatasetConflictingName = "The name '{0}' is invalid. A DataTable cannot have the same name of the DataSet."; public const string DataTable_AlreadyInOtherDataSet = "DataTable already belongs to another DataSet."; public const string DataTable_AlreadyInTheDataSet = "DataTable already belongs to this DataSet."; public const string DataTable_NotInTheDataSet = "Table {0} does not belong to this DataSet."; public const string DataTable_OutOfRange = "Cannot find table {0}."; public const string DataTable_InRelation = "Cannot remove a table that has existing relations. Remove relations first."; public const string DataTable_InConstraint = "Cannot remove table {0}, because it referenced in ForeignKeyConstraint {1}. Remove the constraint first."; public const string DataTable_TableNotFound = "DataTable '{0}' does not match to any DataTable in source."; public const string DataMerge_MissingDefinition = "Target DataSet missing definition for {0}."; public const string DataMerge_MissingConstraint = "Target DataSet missing {0} {1}."; public const string DataMerge_DataTypeMismatch = ".{0} and .{0} have conflicting properties: DataType property mismatch."; public const string DataMerge_PrimaryKeyMismatch = ".PrimaryKey and .PrimaryKey have different Length."; public const string DataMerge_PrimaryKeyColumnsMismatch = "Mismatch columns in the PrimaryKey : .{0} versus .{1}."; public const string DataMerge_ReltionKeyColumnsMismatch = "Relation {0} cannot be merged, because keys have mismatch columns."; public const string DataMerge_MissingColumnDefinition = "Target table {0} missing definition for column {1}."; public const string DataIndex_RecordStateRange = "The RowStates parameter must be set to a valid combination of values from the DataViewRowState enumeration."; public const string DataIndex_FindWithoutSortOrder = "Find finds a row based on a Sort order, and no Sort order is specified."; public const string DataIndex_KeyLength = "Expecting {0} value(s) for the key being indexed, but received {1} value(s)."; public const string DataStorage_AggregateException = "Invalid usage of aggregate function {0}() and Type: {1}."; public const string DataStorage_InvalidStorageType = "Invalid storage type: {0}."; public const string DataStorage_ProblematicChars = "The DataSet Xml persistency does not support the value '{0}' as Char value, please use Byte storage instead."; public const string DataStorage_SetInvalidDataType = "Type of value has a mismatch with column type"; public const string DataStorage_IComparableNotDefined = " Type '{0}' does not implement IComparable interface. Comparison cannot be done."; public const string DataView_SetFailed = "Cannot set {0}."; public const string DataView_SetDataSetFailed = "Cannot change DataSet on a DataViewManager that's already the default view for a DataSet."; public const string DataView_SetRowStateFilter = "RowStateFilter cannot show ModifiedOriginals and ModifiedCurrents at the same time."; public const string DataView_SetTable = "Cannot change Table property on a DefaultView or a DataView coming from a DataViewManager."; public const string DataView_CanNotSetDataSet = "Cannot change DataSet property once it is set."; public const string DataView_CanNotUseDataViewManager = "DataSet must be set prior to using DataViewManager."; public const string DataView_CanNotSetTable = "Cannot change Table property once it is set."; public const string DataView_CanNotUse = "DataTable must be set prior to using DataView."; public const string DataView_CanNotBindTable = "Cannot bind to DataTable with no name."; public const string DataView_SetIListObject = "Cannot set an object into this list."; public const string DataView_AddNewNotAllowNull = "Cannot call AddNew on a DataView where AllowNew is false."; public const string DataView_NotOpen = "DataView is not open."; public const string DataView_CreateChildView = "The relation is not parented to the table to which this DataView points."; public const string DataView_CanNotDelete = "Cannot delete on a DataSource where AllowDelete is false."; public const string DataView_CanNotEdit = "Cannot edit on a DataSource where AllowEdit is false."; public const string DataView_GetElementIndex = "Index {0} is either negative or above rows count."; public const string DataView_AddExternalObject = "Cannot add external objects to this list."; public const string DataView_CanNotClear = "Cannot clear this list."; public const string DataView_InsertExternalObject = "Cannot insert external objects to this list."; public const string DataView_RemoveExternalObject = "Cannot remove objects not in the list."; public const string DataROWView_PropertyNotFound = "{0} is neither a DataColumn nor a DataRelation for table {1}."; public const string Range_Argument = "Min ({0}) must be less than or equal to max ({1}) in a Range object."; public const string Range_NullRange = "This is a null range."; public const string RecordManager_MinimumCapacity = "MinimumCapacity must be non-negative."; public const string SqlConvert_ConvertFailed = " Cannot convert object of type '{0}' to object of type '{1}'."; public const string DataSet_DefaultDataException = "Data Exception."; public const string DataSet_DefaultConstraintException = "Constraint Exception."; public const string DataSet_DefaultDeletedRowInaccessibleException = "Deleted rows inaccessible."; public const string DataSet_DefaultDuplicateNameException = "Duplicate name not allowed."; public const string DataSet_DefaultInRowChangingEventException = "Operation not supported in the RowChanging event."; public const string DataSet_DefaultInvalidConstraintException = "Invalid constraint."; public const string DataSet_DefaultMissingPrimaryKeyException = "Missing primary key."; public const string DataSet_DefaultNoNullAllowedException = "Null not allowed."; public const string DataSet_DefaultReadOnlyException = "Column is marked read only."; public const string DataSet_DefaultRowNotInTableException = "Row not found in table."; public const string DataSet_DefaultVersionNotFoundException = "Version not found."; public const string Load_ReadOnlyDataModified = "ReadOnly Data is Modified."; public const string DataTableReader_InvalidDataTableReader = "DataTableReader is invalid for current DataTable '{0}'."; public const string DataTableReader_SchemaInvalidDataTableReader = "Schema of current DataTable '{0}' in DataTableReader has changed, DataTableReader is invalid."; public const string DataTableReader_CannotCreateDataReaderOnEmptyDataSet = "DataTableReader Cannot be created. There is no DataTable in DataSet."; public const string DataTableReader_DataTableReaderArgumentIsEmpty = "Cannot create DataTableReader. Argument is Empty."; public const string DataTableReader_ArgumentContainsNullValue = "Cannot create DataTableReader. Arguments contain null value."; public const string DataTableReader_InvalidRowInDataTableReader = "Current DataRow is either in Deleted or Detached state."; public const string DataTableReader_DataTableCleared = "Current DataTable '{0}' is empty. There is no DataRow in DataTable."; public const string RbTree_InvalidState = "DataTable internal index is corrupted: '{0}'."; public const string RbTree_EnumerationBroken = "Collection was modified; enumeration operation might not execute."; public const string NamedSimpleType_InvalidDuplicateNamedSimpleTypeDelaration = "Simple type '{0}' has already be declared with different '{1}'."; public const string DataDom_Foliation = "Invalid foliation."; public const string DataDom_TableNameChange = "Cannot change the table name once the associated DataSet is mapped to a loaded XML document."; public const string DataDom_TableNamespaceChange = "Cannot change the table namespace once the associated DataSet is mapped to a loaded XML document."; public const string DataDom_ColumnNameChange = "Cannot change the column name once the associated DataSet is mapped to a loaded XML document."; public const string DataDom_ColumnNamespaceChange = "Cannot change the column namespace once the associated DataSet is mapped to a loaded XML document."; public const string DataDom_ColumnMappingChange = "Cannot change the ColumnMapping property once the associated DataSet is mapped to a loaded XML document."; public const string DataDom_TableColumnsChange = "Cannot add or remove columns from the table once the DataSet is mapped to a loaded XML document."; public const string DataDom_DataSetTablesChange = "Cannot add or remove tables from the DataSet once the DataSet is mapped to a loaded XML document."; public const string DataDom_DataSetNestedRelationsChange = "Cannot add, remove, or change Nested relations from the DataSet once the DataSet is mapped to a loaded XML document."; public const string DataDom_DataSetNull = "The DataSet parameter is invalid. It cannot be null."; public const string DataDom_DataSetNameChange = "Cannot change the DataSet name once the DataSet is mapped to a loaded XML document."; public const string DataDom_CloneNode = "This type of node cannot be cloned: {0}."; public const string DataDom_MultipleLoad = "Cannot load XmlDataDocument if it already contains data. Please use a new XmlDataDocument."; public const string DataDom_MultipleDataSet = "DataSet can be associated with at most one XmlDataDocument. Cannot associate the DataSet with the current XmlDataDocument because the DataSet is already associated with another XmlDataDocument."; public const string DataDom_NotSupport_GetElementById = "GetElementById() is not supported on DataDocument."; public const string DataDom_NotSupport_EntRef = "Cannot create entity references on DataDocument."; public const string DataDom_NotSupport_Clear = "Clear function on DateSet and DataTable is not supported on XmlDataDocument."; public const string ADP_EmptyArray = "Expecting non-empty array for '{0}' parameter."; public const string SQL_WrongType = "Expecting argument of type {1}, but received type {0}."; public const string ADP_InvalidConnectionOptionValue = "Invalid value for key '{0}'."; public const string ADP_KeywordNotSupported = "Keyword not supported: '{0}'."; public const string ADP_InternalProviderError = "Internal .Net Framework Data Provider error {0}."; public const string ADP_NoQuoteChange = "The QuotePrefix and QuoteSuffix properties cannot be changed once an Insert, Update, or Delete command has been generated."; public const string ADP_MissingSourceCommand = "The DataAdapter.SelectCommand property needs to be initialized."; public const string ADP_MissingSourceCommandConnection = "The DataAdapter.SelectCommand.Connection property needs to be initialized;"; public const string ADP_InvalidMultipartName = "{0} \"{1}\"."; public const string ADP_InvalidMultipartNameQuoteUsage = "{0} \"{1}\", incorrect usage of quotes."; public const string ADP_InvalidMultipartNameToManyParts = "{0} \"{1}\", the current limit of \"{2}\" is insufficient."; public const string ADP_ColumnSchemaExpression = "The column mapping from SourceColumn '{0}' failed because the DataColumn '{1}' is a computed column."; public const string ADP_ColumnSchemaMismatch = "Inconvertible type mismatch between SourceColumn '{0}' of {1} and the DataColumn '{2}' of {3}."; public const string ADP_ColumnSchemaMissing1 = "Missing the DataColumn '{0}' for the SourceColumn '{2}'."; public const string ADP_ColumnSchemaMissing2 = "Missing the DataColumn '{0}' in the DataTable '{1}' for the SourceColumn '{2}'."; public const string ADP_InvalidSourceColumn = "SourceColumn is required to be a non-empty string."; public const string ADP_MissingColumnMapping = "Missing SourceColumn mapping for '{0}'."; public const string ADP_NotSupportedEnumerationValue = "The {0} enumeration value, {1}, is not supported by the {2} method."; public const string ADP_MissingTableSchema = "Missing the '{0}' DataTable for the '{1}' SourceTable."; public const string ADP_InvalidSourceTable = "SourceTable is required to be a non-empty string"; public const string ADP_MissingTableMapping = "Missing SourceTable mapping: '{0}'"; public const string ADP_ConnectionRequired_Insert = "Update requires the InsertCommand to have a connection object. The Connection property of the InsertCommand has not been initialized."; public const string ADP_ConnectionRequired_Update = "Update requires the UpdateCommand to have a connection object. The Connection property of the UpdateCommand has not been initialized."; public const string ADP_ConnectionRequired_Delete = "Update requires the DeleteCommand to have a connection object. The Connection property of the DeleteCommand has not been initialized."; public const string ADP_ConnectionRequired_Batch = "Update requires a connection object. The Connection property has not been initialized."; public const string ADP_ConnectionRequired_Clone = "Update requires the command clone to have a connection object. The Connection property of the command clone has not been initialized."; public const string ADP_OpenConnectionRequired_Insert = "Update requires the {0}Command to have an open connection object. {1}"; public const string ADP_OpenConnectionRequired_Update = "Update requires the {0}Command to have an open connection object. {1}"; public const string ADP_OpenConnectionRequired_Delete = "Update requires the {0}Command to have an open connection object. {1}"; public const string ADP_OpenConnectionRequired_Clone = "Update requires the updating command to have an open connection object. {1}"; public const string ADP_MissingSelectCommand = "The SelectCommand property has not been initialized before calling '{0}'."; public const string ADP_UnwantedStatementType = "The StatementType {0} is not expected here."; public const string ADP_FillSchemaRequiresSourceTableName = "FillSchema: expected a non-empty string for the SourceTable name."; public const string ADP_FillRequiresSourceTableName = "Fill: expected a non-empty string for the SourceTable name."; public const string ADP_FillChapterAutoIncrement = "Hierarchical chapter columns must map to an AutoIncrement DataColumn."; public const string ADP_MissingDataReaderFieldType = "DataReader.GetFieldType({0}) returned null."; public const string ADP_OnlyOneTableForStartRecordOrMaxRecords = "Only specify one item in the dataTables array when using non-zero values for startRecords or maxRecords."; public const string ADP_UpdateRequiresSourceTable = "Update unable to find TableMapping['{0}'] or DataTable '{0}'."; public const string ADP_UpdateRequiresSourceTableName = "Update: expected a non-empty SourceTable name."; public const string ADP_UpdateRequiresCommandClone = "Update requires the command clone to be valid."; public const string ADP_UpdateRequiresCommandSelect = "Auto SQL generation during Update requires a valid SelectCommand."; public const string ADP_UpdateRequiresCommandInsert = "Update requires a valid InsertCommand when passed DataRow collection with new rows."; public const string ADP_UpdateRequiresCommandUpdate = "Update requires a valid UpdateCommand when passed DataRow collection with modified rows."; public const string ADP_UpdateRequiresCommandDelete = "Update requires a valid DeleteCommand when passed DataRow collection with deleted rows."; public const string ADP_UpdateMismatchRowTable = "DataRow[{0}] is from a different DataTable than DataRow[0]."; public const string ADP_RowUpdatedErrors = "RowUpdatedEvent: Errors occurred; no additional is information available."; public const string ADP_RowUpdatingErrors = "RowUpdatingEvent: Errors occurred; no additional is information available."; public const string ADP_ResultsNotAllowedDuringBatch = "When batching, the command's UpdatedRowSource property value of UpdateRowSource.FirstReturnedRecord or UpdateRowSource.Both is invalid."; public const string ADP_UpdateConcurrencyViolation_Update = "Concurrency violation: the UpdateCommand affected {0} of the expected {1} records."; public const string ADP_UpdateConcurrencyViolation_Delete = "Concurrency violation: the DeleteCommand affected {0} of the expected {1} records."; public const string ADP_UpdateConcurrencyViolation_Batch = "Concurrency violation: the batched command affected {0} of the expected {1} records."; public const string ADP_InvalidSourceBufferIndex = "Invalid source buffer (size of {0}) offset: {1}"; public const string ADP_InvalidDestinationBufferIndex = "Invalid destination buffer (size of {0}) offset: {1}"; public const string ADP_StreamClosed = "Invalid attempt to {0} when stream is closed."; public const string ADP_InvalidSeekOrigin = "Specified SeekOrigin value is invalid."; public const string ADP_DynamicSQLJoinUnsupported = "Dynamic SQL generation is not supported against multiple base tables."; public const string ADP_DynamicSQLNoTableInfo = "Dynamic SQL generation is not supported against a SelectCommand that does not return any base table information."; public const string ADP_DynamicSQLNoKeyInfoDelete = "Dynamic SQL generation for the DeleteCommand is not supported against a SelectCommand that does not return any key column information."; public const string ADP_DynamicSQLNoKeyInfoUpdate = "Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not return any key column information."; public const string ADP_DynamicSQLNoKeyInfoRowVersionDelete = "Dynamic SQL generation for the DeleteCommand is not supported against a SelectCommand that does not contain a row version column."; public const string ADP_DynamicSQLNoKeyInfoRowVersionUpdate = "Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not contain a row version column."; public const string ADP_DynamicSQLNestedQuote = "Dynamic SQL generation not supported against table names '{0}' that contain the QuotePrefix or QuoteSuffix character '{1}'."; public const string SQL_InvalidBufferSizeOrIndex = "Buffer offset '{1}' plus the bytes available '{0}' is greater than the length of the passed in buffer."; public const string SQL_InvalidDataLength = "Data length '{0}' is less than 0."; public const string SqlMisc_NullString = "Null"; public const string SqlMisc_MessageString = "Message"; public const string SqlMisc_ArithOverflowMessage = "Arithmetic Overflow."; public const string SqlMisc_DivideByZeroMessage = "Divide by zero error encountered."; public const string SqlMisc_NullValueMessage = "Data is Null. This method or property cannot be called on Null values."; public const string SqlMisc_TruncationMessage = "Numeric arithmetic causes truncation."; public const string SqlMisc_DateTimeOverflowMessage = "SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM."; public const string SqlMisc_ConcatDiffCollationMessage = "Two strings to be concatenated have different collation."; public const string SqlMisc_CompareDiffCollationMessage = "Two strings to be compared have different collation."; public const string SqlMisc_InvalidFlagMessage = "Invalid flag value."; public const string SqlMisc_NumeToDecOverflowMessage = "Conversion from SqlDecimal to Decimal overflows."; public const string SqlMisc_ConversionOverflowMessage = "Conversion overflows."; public const string SqlMisc_InvalidDateTimeMessage = "Invalid SqlDateTime."; public const string SqlMisc_TimeZoneSpecifiedMessage = "A time zone was specified. SqlDateTime does not support time zones."; public const string SqlMisc_InvalidArraySizeMessage = "Invalid array size."; public const string SqlMisc_InvalidPrecScaleMessage = "Invalid numeric precision/scale."; public const string SqlMisc_FormatMessage = "The input wasn't in a correct format."; public const string SqlMisc_SqlTypeMessage = "SqlType error."; public const string SqlMisc_NoBufferMessage = "There is no buffer. Read or write operation failed."; public const string SqlMisc_BufferInsufficientMessage = "The buffer is insufficient. Read or write operation failed."; public const string SqlMisc_WriteNonZeroOffsetOnNullMessage = "Cannot write to non-zero offset, because current value is Null."; public const string SqlMisc_WriteOffsetLargerThanLenMessage = "Cannot write from an offset that is larger than current length. It would leave uninitialized data in the buffer."; public const string SqlMisc_NotFilledMessage = "SQL Type has not been loaded with data."; public const string SqlMisc_AlreadyFilledMessage = "SQL Type has already been loaded with data."; public const string SqlMisc_ClosedXmlReaderMessage = "Invalid attempt to access a closed XmlReader."; public const string SqlMisc_InvalidOpStreamClosed = "Invalid attempt to call {0} when the stream is closed."; public const string SqlMisc_InvalidOpStreamNonWritable = "Invalid attempt to call {0} when the stream non-writable."; public const string SqlMisc_InvalidOpStreamNonReadable = "Invalid attempt to call {0} when the stream non-readable."; public const string SqlMisc_InvalidOpStreamNonSeekable = "Invalid attempt to call {0} when the stream is non-seekable."; public const string ADP_DBConcurrencyExceptionMessage = "DB concurrency violation."; public const string ADP_InvalidMaxRecords = "The MaxRecords value of {0} is invalid; the value must be >= 0."; public const string ADP_CollectionIndexInt32 = "Invalid index {0} for this {1} with Count={2}."; public const string ADP_MissingTableMappingDestination = "Missing TableMapping when TableMapping.DataSetTable='{0}'."; public const string ADP_InvalidStartRecord = "The StartRecord value of {0} is invalid; the value must be >= 0."; public const string DataDom_EnforceConstraintsShouldBeOff = "Please set DataSet.EnforceConstraints == false before trying to edit XmlDataDocument using XML operations."; public const string DataColumns_RemoveExpression = "Cannot remove this column, because it is part of an expression: {0} = {1}."; public const string DataRow_RowInsertTwice = "The rowOrder value={0} has been found twice for table named '{1}'."; public const string Xml_ElementTypeNotFound = "Cannot find ElementType name='{0}'."; public const string ADP_ConnectionAlreadyOpen = "The connection was not closed. {0}"; public const string ADP_InternalConnectionError = "Internal DbConnection Error: {0}"; public const string ADP_InvalidOffsetValue = "Invalid parameter Offset value '{0}'. The value must be greater than or equal to 0."; public const string ADP_TransactionPresent = "Connection currently has transaction enlisted. Finish current transaction and retry."; public const string ADP_LocalTransactionPresent = "Cannot enlist in the transaction because a local transaction is in progress on the connection. Finish local transaction and retry."; public const string ADP_NoConnectionString = "The ConnectionString property has not been initialized."; public const string ADP_OpenConnectionPropertySet = "Not allowed to change the '{0}' property. {1}"; public const string ADP_PendingAsyncOperation = "Can not start another operation while there is an asynchronous operation pending."; public const string ADP_PooledOpenTimeout = "Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached."; public const string ADP_NonPooledOpenTimeout = "Timeout attempting to open the connection. The time period elapsed prior to attempting to open the connection has been exceeded. This may have occurred because of too many simultaneous non-pooled connection attempts."; public const string ADP_SingleValuedProperty = "The only acceptable value for the property '{0}' is '{1}'."; public const string ADP_DoubleValuedProperty = "The acceptable values for the property '{0}' are '{1}' or '{2}'."; public const string ADP_InvalidPrefixSuffix = "Specified QuotePrefix and QuoteSuffix values do not match."; public const string Arg_ArrayPlusOffTooSmall = "Destination array is not long enough to copy all the items in the collection. Check array index and length."; public const string Arg_RankMultiDimNotSupported = "Only single dimensional arrays are supported for the requested action."; public const string Arg_RemoveArgNotFound = "Cannot remove the specified item because it was not found in the specified Collection."; public const string ArgumentOutOfRange_NeedNonNegNum = "Non-negative number required."; public const string ADP_DeriveParametersNotSupported = "{0} DeriveParameters only supports CommandType.StoredProcedure, not CommandType.{1}."; public const string ADP_NoStoredProcedureExists = "The stored procedure '{0}' doesn't exist."; public const string ADP_MissingConnectionOptionValue = "Use of key '{0}' requires the key '{1}' to be present."; public const string ADP_InvalidConnectionOptionValueLength = "The value's length for key '{0}' exceeds it's limit of '{1}'."; public const string SQL_SqlCommandCommandText = "SqlCommand.DeriveParameters failed because the SqlCommand.CommandText property value is an invalid multipart name"; public const string SQL_BatchedUpdatesNotAvailableOnContextConnection = "Batching updates is not supported on the context connection."; public const string SQL_BulkCopyDestinationTableName = "SqlBulkCopy.WriteToServer failed because the SqlBulkCopy.DestinationTableName is an invalid multipart name"; public const string SQL_TDSParserTableName = "Processing of results from SQL Server failed because of an invalid multipart name"; public const string SQL_TypeName = "SqlParameter.TypeName is an invalid multipart name"; public const string SQLMSF_FailoverPartnerNotSupported = "Connecting to a mirrored SQL Server instance using the MultiSubnetFailover connection option is not supported."; public const string SQL_NotSupportedEnumerationValue = "The {0} enumeration value, {1}, is not supported by the .Net Framework SqlClient Data Provider."; public const string ADP_CommandTextRequired = "{0}: CommandText property has not been initialized"; public const string ADP_ConnectionRequired = "{0}: Connection property has not been initialized."; public const string ADP_OpenConnectionRequired = "{0} requires an open and available Connection. {1}"; public const string ADP_TransactionConnectionMismatch = "The transaction is either not associated with the current connection or has been completed."; public const string ADP_TransactionRequired = "{0} requires the command to have a transaction when the connection assigned to the command is in a pending local transaction. The Transaction property of the command has not been initialized."; public const string ADP_OpenReaderExists = "There is already an open DataReader associated with this Command which must be closed first."; public const string ADP_CalledTwice = "The method '{0}' cannot be called more than once for the same execution."; public const string ADP_InvalidCommandTimeout = "Invalid CommandTimeout value {0}; the value must be >= 0."; public const string ADP_UninitializedParameterSize = "{1}[{0}]: the Size property has an invalid size of 0."; public const string ADP_PrepareParameterType = "{0}.Prepare method requires all parameters to have an explicitly set type."; public const string ADP_PrepareParameterSize = "{0}.Prepare method requires all variable length parameters to have an explicitly set non-zero Size."; public const string ADP_PrepareParameterScale = "{0}.Prepare method requires parameters of type '{1}' have an explicitly set Precision and Scale."; public const string ADP_MismatchedAsyncResult = "Mismatched end method call for asyncResult. Expected call to {0} but {1} was called instead."; public const string ADP_ClosedConnectionError = "Invalid operation. The connection is closed."; public const string ADP_ConnectionIsDisabled = "The connection has been disabled."; public const string ADP_EmptyDatabaseName = "Database cannot be null, the empty string, or string of only whitespace."; public const string ADP_NonSequentialColumnAccess = "Invalid attempt to read from column ordinal '{0}'. With CommandBehavior.SequentialAccess, you may only read from column ordinal '{1}' or greater."; public const string ADP_InvalidDataType = "The parameter data type of {0} is invalid."; public const string ADP_UnknownDataType = "No mapping exists from object type {0} to a known managed provider native type."; public const string ADP_DbTypeNotSupported = "No mapping exists from DbType {0} to a known {1}."; public const string ADP_VersionDoesNotSupportDataType = "The version of SQL Server in use does not support datatype '{0}'."; public const string ADP_ParameterValueOutOfRange = "Parameter value '{0}' is out of range."; public const string ADP_BadParameterName = "Specified parameter name '{0}' is not valid."; public const string ADP_InvalidSizeValue = "Invalid parameter Size value '{0}'. The value must be greater than or equal to 0."; public const string ADP_NegativeParameter = "Invalid value for argument '{0}'. The value must be greater than or equal to 0."; public const string ADP_InvalidMetaDataValue = "Invalid value for this metadata."; public const string ADP_ParameterConversionFailed = "Failed to convert parameter value from a {0} to a {1}."; public const string ADP_ParallelTransactionsNotSupported = "{0} does not support parallel transactions."; public const string ADP_TransactionZombied = "This {0} has completed; it is no longer usable."; public const string ADP_InvalidDataLength2 = "Specified length '{0}' is out of range."; public const string ADP_NonSeqByteAccess = "Invalid {2} attempt at dataIndex '{0}'. With CommandBehavior.SequentialAccess, you may only read from dataIndex '{1}' or greater."; public const string ADP_InvalidMinMaxPoolSizeValues = "Invalid min or max pool size values, min pool size cannot be greater than the max pool size."; public const string SQL_InvalidPacketSizeValue = "Invalid 'Packet Size'. The value must be an integer >= 512 and <= 32768."; public const string SQL_NullEmptyTransactionName = "Invalid transaction or invalid name for a point at which to save within the transaction."; public const string SQL_UserInstanceFailoverNotCompatible = "User Instance and Failover are not compatible options. Please choose only one of the two in the connection string."; public const string SQL_EncryptionNotSupportedByClient = "The instance of SQL Server you attempted to connect to requires encryption but this machine does not support it."; public const string SQL_EncryptionNotSupportedByServer = "The instance of SQL Server you attempted to connect to does not support encryption."; public const string SQL_InvalidSQLServerVersionUnknown = "Unsupported SQL Server version. The .Net Framework SqlClient Data Provider can only be used with SQL Server versions 7.0 and later."; public const string SQL_CannotModifyPropertyAsyncOperationInProgress = "{0} cannot be changed while async operation is in progress."; public const string SQL_InstanceFailure = "Instance failure."; public const string SQL_InvalidPartnerConfiguration = "Server {0}, database {1} is not configured for database mirroring."; public const string SQL_MarsUnsupportedOnConnection = "The connection does not support MultipleActiveResultSets."; public const string SQL_NonLocalSSEInstance = "SSE Instance re-direction is not supported for non-local user instances."; public const string SQL_PendingBeginXXXExists = "The command execution cannot proceed due to a pending asynchronous operation already in progress."; public const string SQL_NonXmlResult = "Invalid command sent to ExecuteXmlReader. The command must return an Xml result."; public const string SQL_InvalidParameterTypeNameFormat = "Invalid 3 part name format for TypeName."; public const string SQL_InvalidParameterNameLength = "The length of the parameter '{0}' exceeds the limit of 128 characters."; public const string SQL_PrecisionValueOutOfRange = "Precision value '{0}' is either less than 0 or greater than the maximum allowed precision of 38."; public const string SQL_ScaleValueOutOfRange = "Scale value '{0}' is either less than 0 or greater than the maximum allowed scale of 38."; public const string SQL_TimeScaleValueOutOfRange = "Scale value '{0}' is either less than 0 or greater than the maximum allowed scale of 7."; public const string SQL_ParameterInvalidVariant = "Parameter '{0}' exceeds the size limit for the sql_variant datatype."; public const string SQL_ParameterTypeNameRequired = "The {0} type parameter '{1}' must have a valid type name."; public const string SQL_InvalidInternalPacketSize = "Invalid internal packet size:"; public const string SQL_InvalidTDSVersion = "The SQL Server instance returned an invalid or unsupported protocol version during login negotiation."; public const string SQL_InvalidTDSPacketSize = "Invalid Packet Size."; public const string SQL_ParsingError = "Internal connection fatal error."; public const string SQL_ConnectionLockedForBcpEvent = "The connection cannot be used because there is an ongoing operation that must be finished."; public const string SQL_SNIPacketAllocationFailure = "Memory allocation for internal connection failed."; public const string SQL_SmallDateTimeOverflow = "SqlDbType.SmallDateTime overflow. Value '{0}' is out of range. Must be between 1/1/1900 12:00:00 AM and 6/6/2079 11:59:59 PM."; public const string SQL_TimeOverflow = "SqlDbType.Time overflow. Value '{0}' is out of range. Must be between 00:00:00.0000000 and 23:59:59.9999999."; public const string SQL_MoneyOverflow = "SqlDbType.SmallMoney overflow. Value '{0}' is out of range. Must be between -214,748.3648 and 214,748.3647."; public const string SQL_CultureIdError = "The Collation specified by SQL Server is not supported."; public const string SQL_OperationCancelled = "Operation cancelled by user."; public const string SQL_SevereError = "A severe error occurred on the current command. The results, if any, should be discarded."; public const string SQL_SSPIGenerateError = "Failed to generate SSPI context."; public const string SQL_KerberosTicketMissingError = "Cannot access Kerberos ticket. Ensure Kerberos has been initialized with 'kinit'."; public const string SQL_SqlServerBrowserNotAccessible = "Cannot connect to SQL Server Browser. Ensure SQL Server Browser has been started."; public const string SQL_InvalidSSPIPacketSize = "Invalid SSPI packet size."; public const string SQL_SSPIInitializeError = "Cannot initialize SSPI package."; public const string SQL_Timeout = "Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding."; public const string SQL_Timeout_PreLogin_Begin = "Connection Timeout Expired. The timeout period elapsed at the start of the pre-login phase. This could be because of insufficient time provided for connection timeout."; public const string SQL_Timeout_PreLogin_InitializeConnection = "Connection Timeout Expired. The timeout period elapsed while attempting to create and initialize a socket to the server. This could be either because the server was unreachable or unable to respond back in time."; public const string SQL_Timeout_PreLogin_SendHandshake = "Connection Timeout Expired. The timeout period elapsed while making a pre-login handshake request. This could be because the server was unable to respond back in time."; public const string SQL_Timeout_PreLogin_ConsumeHandshake = "Connection Timeout Expired. The timeout period elapsed while attempting to consume the pre-login handshake acknowledgement. This could be because the pre-login handshake failed or the server was unable to respond back in time."; public const string SQL_Timeout_Login_Begin = "Connection Timeout Expired. The timeout period elapsed at the start of the login phase. This could be because of insufficient time provided for connection timeout."; public const string SQL_Timeout_Login_ProcessConnectionAuth = "Connection Timeout Expired. The timeout period elapsed while attempting to authenticate the login. This could be because the server failed to authenticate the user or the server was unable to respond back in time."; public const string SQL_Timeout_PostLogin = "Connection Timeout Expired. The timeout period elapsed during the post-login phase. The connection could have timed out while waiting for server to complete the login process and respond; Or it could have timed out while attempting to create multiple active connections."; public const string SQL_Timeout_FailoverInfo = "This failure occurred while attempting to connect to the {0} server."; public const string SQL_Timeout_RoutingDestinationInfo = "This failure occurred while attempting to connect to the routing destination. The duration spent while attempting to connect to the original server was - [Pre-Login] initialization={0}; handshake={1}; [Login] initialization={2}; authentication={3}; [Post-Login] complete={4}; "; public const string SQL_Duration_PreLogin_Begin = "The duration spent while attempting to connect to this server was - [Pre-Login] initialization={0};"; public const string SQL_Duration_PreLoginHandshake = "The duration spent while attempting to connect to this server was - [Pre-Login] initialization={0}; handshake={1}; "; public const string SQL_Duration_Login_Begin = "The duration spent while attempting to connect to this server was - [Pre-Login] initialization={0}; handshake={1}; [Login] initialization={2}; "; public const string SQL_Duration_Login_ProcessConnectionAuth = "The duration spent while attempting to connect to this server was - [Pre-Login] initialization={0}; handshake={1}; [Login] initialization={2}; authentication={3}; "; public const string SQL_Duration_PostLogin = "The duration spent while attempting to connect to this server was - [Pre-Login] initialization={0}; handshake={1}; [Login] initialization={2}; authentication={3}; [Post-Login] complete={4}; "; public const string SQL_UserInstanceFailure = "A user instance was requested in the connection string but the server specified does not support this option."; public const string SQL_InvalidRead = "Invalid attempt to read when no data is present."; public const string SQL_NonBlobColumn = "Invalid attempt to GetBytes on column '{0}'. The GetBytes function can only be used on columns of type Text, NText, or Image."; public const string SQL_NonCharColumn = "Invalid attempt to GetChars on column '{0}'. The GetChars function can only be used on columns of type Text, NText, Xml, VarChar or NVarChar."; public const string SQL_StreamNotSupportOnColumnType = "Invalid attempt to GetStream on column '{0}'. The GetStream function can only be used on columns of type Binary, Image, Udt or VarBinary."; public const string SQL_TextReaderNotSupportOnColumnType = "Invalid attempt to GetTextReader on column '{0}'. The GetTextReader function can only be used on columns of type Char, NChar, NText, NVarChar, Text or VarChar."; public const string SQL_XmlReaderNotSupportOnColumnType = "Invalid attempt to GetXmlReader on column '{0}'. The GetXmlReader function can only be used on columns of type Xml."; public const string SqlDelegatedTransaction_PromotionFailed = "Failure while attempting to promote transaction."; public const string SQL_BulkLoadMappingInaccessible = "The mapped collection is in use and cannot be accessed at this time;"; public const string SQL_BulkLoadMappingsNamesOrOrdinalsOnly = "Mappings must be either all name or all ordinal based."; public const string SQL_BulkLoadCannotConvertValue = "The given value of type {0} from the data source cannot be converted to type {1} of the specified target column."; public const string SQL_BulkLoadNonMatchingColumnMapping = "The given ColumnMapping does not match up with any column in the source or destination."; public const string SQL_BulkLoadNonMatchingColumnName = "The given ColumnName '{0}' does not match up with any column in data source."; public const string SQL_BulkLoadStringTooLong = "String or binary data would be truncated."; public const string SQL_BulkLoadInvalidTimeout = "Timeout Value '{0}' is less than 0."; public const string SQL_BulkLoadInvalidVariantValue = "Value cannot be converted to SqlVariant."; public const string SQL_BulkLoadExistingTransaction = "Unexpected existing transaction."; public const string SQL_BulkLoadNoCollation = "Failed to obtain column collation information for the destination table. If the table is not in the current database the name must be qualified using the database name (e.g. [mydb]..[mytable](e.g. [mydb]..[mytable]); this also applies to temporary-tables (e.g. #mytable would be specified as tempdb..#mytable)."; public const string SQL_BulkLoadConflictingTransactionOption = "Must not specify SqlBulkCopyOption.UseInternalTransaction and pass an external Transaction at the same time."; public const string SQL_BulkLoadInvalidOperationInsideEvent = "Function must not be called during event."; public const string SQL_BulkLoadMissingDestinationTable = "The DestinationTableName property must be set before calling this method."; public const string SQL_BulkLoadInvalidDestinationTable = "Cannot access destination table '{0}'."; public const string SQL_BulkLoadNotAllowDBNull = "Column '{0}' does not allow DBNull.Value."; public const string Sql_BulkLoadLcidMismatch = "The locale id '{0}' of the source column '{1}' and the locale id '{2}' of the destination column '{3}' do not match."; public const string SQL_BulkLoadPendingOperation = "Attempt to invoke bulk copy on an object that has a pending operation."; public const string SQL_CannotGetDTCAddress = "Unable to get the address of the distributed transaction coordinator for the server, from the server. Is DTC enabled on the server?"; public const string SQL_ConnectionDoomed = "The requested operation cannot be completed because the connection has been broken."; public const string SQL_OpenResultCountExceeded = "Open result count exceeded."; public const string SQL_StreamWriteNotSupported = "The Stream does not support writing."; public const string SQL_StreamReadNotSupported = "The Stream does not support reading."; public const string SQL_StreamSeekNotSupported = "The Stream does not support seeking."; public const string SQL_ExClientConnectionId = "ClientConnectionId:{0}"; public const string SQL_ExErrorNumberStateClass = "Error Number:{0},State:{1},Class:{2}"; public const string SQL_ExOriginalClientConnectionId = "ClientConnectionId before routing:{0}"; public const string SQL_ExRoutingDestination = "Routing Destination:{0}"; public const string SQL_UnsupportedSysTxVersion = "The currently loaded System.Transactions.dll does not support Global Transactions."; public const string SqlMisc_StreamErrorMessage = "An error occurred while reading."; public const string SqlMisc_TruncationMaxDataMessage = "Data returned is larger than 2Gb in size. Use SequentialAccess command behavior in order to get all of the data."; public const string SqlMisc_SubclassMustOverride = "Subclass did not override a required method."; public const string Sql_InternalError = "Internal Error"; public const string ADP_OperationAborted = "Operation aborted."; public const string ADP_OperationAbortedExceptionMessage = "Operation aborted due to an exception (see InnerException for details)."; public const string ADP_TransactionCompletedButNotDisposed = "The transaction associated with the current connection has completed but has not been disposed. The transaction must be disposed before the connection can be used to execute SQL statements."; public const string SqlParameter_UnsupportedTVPOutputParameter = "ParameterDirection '{0}' specified for parameter '{1}' is not supported. Table-valued parameters only support ParameterDirection.Input."; public const string SqlParameter_DBNullNotSupportedForTVP = "DBNull value for parameter '{0}' is not supported. Table-valued parameters cannot be DBNull."; public const string SqlParameter_UnexpectedTypeNameForNonStruct = "TypeName specified for parameter '{0}'. TypeName must only be set for Structured parameters."; public const string NullSchemaTableDataTypeNotSupported = "DateType column for field '{0}' in schema table is null. DataType must be non-null."; public const string InvalidSchemaTableOrdinals = "Invalid column ordinals in schema table. ColumnOrdinals, if present, must not have duplicates or gaps."; public const string SQL_EnumeratedRecordMetaDataChanged = "Metadata for field '{0}' of record '{1}' did not match the original record's metadata."; public const string SQL_EnumeratedRecordFieldCountChanged = "Number of fields in record '{0}' does not match the number in the original record."; public const string GT_Disabled = "Global Transactions are not enabled for this Azure SQL Database. Please contact Azure SQL Database support for assistance."; public const string SQL_UnknownSysTxIsolationLevel = "Unrecognized System.Transactions.IsolationLevel enumeration value: {0}."; public const string SQLNotify_AlreadyHasCommand = "This SqlCommand object is already associated with another SqlDependency object."; public const string SqlDependency_DatabaseBrokerDisabled = "The SQL Server Service Broker for the current database is not enabled, and as a result query notifications are not supported. Please enable the Service Broker for this database if you wish to use notifications."; public const string SqlDependency_DefaultOptionsButNoStart = "When using SqlDependency without providing an options value, SqlDependency.Start() must be called prior to execution of a command added to the SqlDependency instance."; public const string SqlDependency_NoMatchingServerStart = "When using SqlDependency without providing an options value, SqlDependency.Start() must be called for each server that is being executed against."; public const string SqlDependency_NoMatchingServerDatabaseStart = "SqlDependency.Start has been called for the server the command is executing against more than once, but there is no matching server/user/database Start() call for current command."; public const string SqlDependency_EventNoDuplicate = "SqlDependency.OnChange does not support multiple event registrations for the same delegate."; public const string SqlDependency_IdMismatch = "No SqlDependency exists for the key."; public const string SqlDependency_InvalidTimeout = "Timeout specified is invalid. Timeout cannot be < 0."; public const string SqlDependency_DuplicateStart = "SqlDependency does not support calling Start() with different connection strings having the same server, user, and database in the same app domain."; public const string SqlMetaData_InvalidSqlDbTypeForConstructorFormat = "The dbType {0} is invalid for this constructor."; public const string SqlMetaData_NameTooLong = "The name is too long."; public const string SqlMetaData_SpecifyBothSortOrderAndOrdinal = "The sort order and ordinal must either both be specified, or neither should be specified (SortOrder.Unspecified and -1). The values given were: order = {0}, ordinal = {1}."; public const string SqlProvider_InvalidDataColumnType = "The type of column '{0}' is not supported. The type is '{1}'"; public const string SqlProvider_NotEnoughColumnsInStructuredType = "There are not enough fields in the Structured type. Structured types must have at least one field."; public const string SqlProvider_DuplicateSortOrdinal = "The sort ordinal {0} was specified twice."; public const string SqlProvider_MissingSortOrdinal = "The sort ordinal {0} was not specified."; public const string SqlProvider_SortOrdinalGreaterThanFieldCount = "The sort ordinal {0} on field {1} exceeds the total number of fields."; public const string IEnumerableOfSqlDataRecordHasNoRows = "There are no records in the SqlDataRecord enumeration. To send a table-valued parameter with no rows, use a null reference for the value instead."; public const string SNI_ERROR_1 = "I/O Error detected in read/write operation"; public const string SNI_ERROR_2 = "Connection was terminated"; public const string SNI_ERROR_3 = "Asynchronous operations not supported"; public const string SNI_ERROR_5 = "Invalid parameter(s) found"; public const string SNI_ERROR_6 = "Unsupported protocol specified"; public const string SNI_ERROR_7 = "Invalid connection found when setting up new session protocol"; public const string SNI_ERROR_8 = "Protocol not supported"; public const string SNI_ERROR_9 = "Associating port with I/O completion mechanism failed"; public const string SNI_ERROR_11 = "Timeout error"; public const string SNI_ERROR_12 = "No server name supplied"; public const string SNI_ERROR_13 = "TerminateListener() has been called"; public const string SNI_ERROR_14 = "Win9x not supported"; public const string SNI_ERROR_15 = "Function not supported"; public const string SNI_ERROR_16 = "Shared-Memory heap error"; public const string SNI_ERROR_17 = "Cannot find an ip/ipv6 type address to connect"; public const string SNI_ERROR_18 = "Connection has been closed by peer"; public const string SNI_ERROR_19 = "Physical connection is not usable"; public const string SNI_ERROR_20 = "Connection has been closed"; public const string SNI_ERROR_21 = "Encryption is enforced but there is no valid certificate"; public const string SNI_ERROR_22 = "Couldn't load library"; public const string SNI_ERROR_23 = "Cannot open a new thread in server process"; public const string SNI_ERROR_24 = "Cannot post event to completion port"; public const string SNI_ERROR_25 = "Connection string is not valid"; public const string SNI_ERROR_26 = "Error Locating Server/Instance Specified"; public const string SNI_ERROR_27 = "Error getting enabled protocols list from registry"; public const string SNI_ERROR_28 = "Server doesn't support requested protocol"; public const string SNI_ERROR_29 = "Shared Memory is not supported for clustered server connectivity"; public const string SNI_ERROR_30 = "Invalid attempt bind to shared memory segment"; public const string SNI_ERROR_31 = "Encryption(ssl/tls) handshake failed"; public const string SNI_ERROR_32 = "Packet size too large for SSL Encrypt/Decrypt operations"; public const string SNI_ERROR_33 = "SSRP error"; public const string SNI_ERROR_34 = "Could not connect to the Shared Memory pipe"; public const string SNI_ERROR_35 = "An internal exception was caught"; public const string SNI_ERROR_36 = "The Shared Memory dll used to connect to SQL Server 2000 was not found"; public const string SNI_ERROR_37 = "The SQL Server 2000 Shared Memory client dll appears to be invalid/corrupted"; public const string SNI_ERROR_38 = "Cannot open a Shared Memory connection to SQL Server 2000"; public const string SNI_ERROR_39 = "Shared memory connectivity to SQL Server 2000 is either disabled or not available on this machine"; public const string SNI_ERROR_40 = "Could not open a connection to SQL Server"; public const string SNI_ERROR_41 = "Cannot open a Shared Memory connection to a remote SQL server"; public const string SNI_ERROR_42 = "Could not establish dedicated administrator connection (DAC) on default port. Make sure that DAC is enabled"; public const string SNI_ERROR_43 = "An error occurred while obtaining the dedicated administrator connection (DAC) port. Make sure that SQL Browser is running, or check the error log for the port number"; public const string SNI_ERROR_44 = "Could not compose Service Principal Name (SPN) for Windows Integrated Authentication. Possible causes are server(s) incorrectly specified to connection API calls, Domain Name System (DNS) lookup failure or memory shortage"; public const string SNI_ERROR_47 = "Connecting with the MultiSubnetFailover connection option to a SQL Server instance configured with more than 64 IP addresses is not supported."; public const string SNI_ERROR_48 = "Connecting to a named SQL Server instance using the MultiSubnetFailover connection option is not supported."; public const string SNI_ERROR_49 = "Connecting to a SQL Server instance using the MultiSubnetFailover connection option is only supported when using the TCP protocol."; public const string SNI_ERROR_50 = "Local Database Runtime error occurred. "; public const string SNI_ERROR_51 = "An instance name was not specified while connecting to a Local Database Runtime. Specify an instance name in the format (localdb)\\instance_name."; public const string SNI_ERROR_52 = "Unable to locate a Local Database Runtime installation. Verify that SQL Server Express is properly installed and that the Local Database Runtime feature is enabled."; public const string SNI_ERROR_53 = "Invalid Local Database Runtime registry configuration found. Verify that SQL Server Express is properly installed."; public const string SNI_ERROR_54 = "Unable to locate the registry entry for SQLUserInstance.dll file path. Verify that the Local Database Runtime feature of SQL Server Express is properly installed."; public const string SNI_ERROR_55 = "Registry value contains an invalid SQLUserInstance.dll file path. Verify that the Local Database Runtime feature of SQL Server Express is properly installed."; public const string SNI_ERROR_56 = "Unable to load the SQLUserInstance.dll from the location specified in the registry. Verify that the Local Database Runtime feature of SQL Server Express is properly installed."; public const string SNI_ERROR_57 = "Invalid SQLUserInstance.dll found at the location specified in the registry. Verify that the Local Database Runtime feature of SQL Server Express is properly installed."; public const string Snix_Connect = "A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections."; public const string Snix_PreLoginBeforeSuccessfulWrite = "The client was unable to establish a connection because of an error during connection initialization process before login. Possible causes include the following: the client tried to connect to an unsupported version of SQL Server; the server was too busy to accept new connections; or there was a resource limitation (insufficient memory or maximum allowed connections) on the server."; public const string Snix_PreLogin = "A connection was successfully established with the server, but then an error occurred during the pre-login handshake."; public const string Snix_LoginSspi = "A connection was successfully established with the server, but then an error occurred when obtaining the security/SSPI context information for integrated security login."; public const string Snix_Login = "A connection was successfully established with the server, but then an error occurred during the login process."; public const string Snix_EnableMars = "Connection open and login was successful, but then an error occurred while enabling MARS for this connection."; public const string Snix_AutoEnlist = "Connection open and login was successful, but then an error occurred while enlisting the connection into the current distributed transaction."; public const string Snix_GetMarsSession = "Failed to establish a MARS session in preparation to send the request to the server."; public const string Snix_Execute = "A transport-level error has occurred when sending the request to the server."; public const string Snix_Read = "A transport-level error has occurred when receiving results from the server."; public const string Snix_Close = "A transport-level error has occurred during connection clean-up."; public const string Snix_SendRows = "A transport-level error has occurred while sending information to the server."; public const string Snix_ProcessSspi = "A transport-level error has occurred during SSPI handshake."; public const string LocalDB_FailedGetDLLHandle = "Local Database Runtime: Cannot load SQLUserInstance.dll."; public const string LocalDB_MethodNotFound = "Invalid SQLUserInstance.dll found at the location specified in the registry. Verify that the Local Database Runtime feature of SQL Server Express is properly installed."; public const string LocalDB_UnobtainableMessage = "Cannot obtain Local Database Runtime error message"; public const string SQLROR_RecursiveRoutingNotSupported = "Two or more redirections have occurred. Only one redirection per login is allowed."; public const string SQLROR_FailoverNotSupported = "Connecting to a mirrored SQL Server instance using the ApplicationIntent ReadOnly connection option is not supported."; public const string SQLROR_UnexpectedRoutingInfo = "Unexpected routing information received."; public const string SQLROR_InvalidRoutingInfo = "Invalid routing information received."; public const string SQLROR_TimeoutAfterRoutingInfo = "Server provided routing information, but timeout already expired."; public const string SQLCR_InvalidConnectRetryCountValue = "Invalid ConnectRetryCount value (should be 0-255)."; public const string SQLCR_InvalidConnectRetryIntervalValue = "Invalid ConnectRetryInterval value (should be 1-60)."; public const string SQLCR_NextAttemptWillExceedQueryTimeout = "Next reconnection attempt will exceed query timeout. Reconnection was terminated."; public const string SQLCR_EncryptionChanged = "The server did not preserve SSL encryption during a recovery attempt, connection recovery is not possible."; public const string SQLCR_TDSVestionNotPreserved = "The server did not preserve the exact client TDS version requested during a recovery attempt, connection recovery is not possible."; public const string SQLCR_AllAttemptsFailed = "The connection is broken and recovery is not possible. The client driver attempted to recover the connection one or more times and all attempts failed. Increase the value of ConnectRetryCount to increase the number of recovery attempts."; public const string SQLCR_UnrecoverableServer = "The connection is broken and recovery is not possible. The connection is marked by the server as unrecoverable. No attempt was made to restore the connection."; public const string SQLCR_UnrecoverableClient = "The connection is broken and recovery is not possible. The connection is marked by the client driver as unrecoverable. No attempt was made to restore the connection."; public const string SQLCR_NoCRAckAtReconnection = "The server did not acknowledge a recovery attempt, connection recovery is not possible."; public const string SQL_UnsupportedKeyword = "The keyword '{0}' is not supported on this platform."; public const string SQL_UnsupportedFeature = "The server is attempting to use a feature that is not supported on this platform."; public const string SQL_UnsupportedToken = "Received an unsupported token '{0}' while reading data from the server."; public const string SQL_DbTypeNotSupportedOnThisPlatform = "Type {0} is not supported on this platform."; public const string SQL_NetworkLibraryNotSupported = "The keyword 'Network Library' is not supported on this platform, prefix the 'Data Source' with the protocol desired instead ('tcp:' for a TCP connection, or 'np:' for a Named Pipe connection)."; public const string SNI_PN0 = "HTTP Provider"; public const string SNI_PN1 = "Named Pipes Provider"; public const string SNI_PN2 = "Session Provider"; public const string SNI_PN3 = "Sign Provider"; public const string SNI_PN4 = "Shared Memory Provider"; public const string SNI_PN5 = "SMux Provider"; public const string SNI_PN6 = "SSL Provider"; public const string SNI_PN7 = "TCP Provider"; public const string SNI_PN8 = ""; public const string SNI_PN9 = "SQL Network Interfaces"; public const string AZURESQL_GenericEndpoint = ".database.windows.net"; public const string AZURESQL_GermanEndpoint = ".database.cloudapi.de"; public const string AZURESQL_UsGovEndpoint = ".database.usgovcloudapi.net"; public const string AZURESQL_ChinaEndpoint = ".database.chinacloudapi.cn"; public const string net_nego_channel_binding_not_supported = "No support for channel binding on operating systems other than Windows."; public const string net_gssapi_operation_failed_detailed = "GSSAPI operation failed with error - {0} ({1})."; public const string net_gssapi_operation_failed = "GSSAPI operation failed with status: {0} (Minor status: {1})."; public const string net_ntlm_not_possible_default_cred = "NTLM authentication is not possible with default credentials on this platform."; public const string net_nego_not_supported_empty_target_with_defaultcreds = "Target name should be non-empty if default credentials are passed."; public const string net_nego_server_not_supported = "Server implementation is not supported."; public const string net_nego_protection_level_not_supported = "Requested protection level is not supported with the GSSAPI implementation currently installed."; public const string net_context_buffer_too_small = "Insufficient buffer space. Required: {0} Actual: {1}."; public const string net_auth_message_not_encrypted = "Protocol error: A received message contains a valid signature but it was not encrypted as required by the effective Protection Level."; public const string net_securitypackagesupport = "The requested security package is not supported."; public const string net_log_operation_failed_with_error = "{0} failed with error {1}."; public const string net_MethodNotImplementedException = "This method is not implemented by this class."; public const string event_OperationReturnedSomething = "{0} returned {1}."; public const string net_invalid_enum = "The specified value is not valid in the '{0}' enumeration."; public const string SSPIInvalidHandleType = "'{0}' is not a supported handle type."; public const string LocalDBNotSupported = "LocalDB is not supported on this platform."; public const string PlatformNotSupported_DataSqlClient = "System.Data.SqlClient is not supported on this platform."; public const string SqlParameter_InvalidTableDerivedPrecisionForTvp = "Precision '{0}' required to send all values in column '{1}' exceeds the maximum supported precision '{2}'. The values must all fit in a single precision."; public const string SqlProvider_InvalidDataColumnMaxLength = "The size of column '{0}' is not supported. The size is {1}."; public const string MDF_InvalidXmlInvalidValue = "The metadata XML is invalid. The {1} column of the {0} collection must contain a non-empty string."; public const string MDF_CollectionNameISNotUnique = "There are multiple collections named '{0}'."; public const string MDF_InvalidXmlMissingColumn = "The metadata XML is invalid. The {0} collection must contain a {1} column and it must be a string column."; public const string MDF_InvalidXml = "The metadata XML is invalid."; public const string MDF_NoColumns = "The schema table contains no columns."; public const string MDF_QueryFailed = "Unable to build the '{0}' collection because execution of the SQL query failed. See the inner exception for details."; public const string MDF_TooManyRestrictions = "More restrictions were provided than the requested schema ('{0}') supports."; public const string MDF_DataTableDoesNotExist = "The collection '{0}' is missing from the metadata XML."; public const string MDF_UndefinedCollection = "The requested collection ({0}) is not defined."; public const string MDF_UnsupportedVersion = " requested collection ({0}) is not supported by this version of the provider."; public const string MDF_MissingRestrictionColumn = "One or more of the required columns of the restrictions collection is missing."; public const string MDF_MissingRestrictionRow = "A restriction exists for which there is no matching row in the restrictions collection."; public const string MDF_IncorrectNumberOfDataSourceInformationRows = "The DataSourceInformation table must contain exactly one row."; public const string MDF_MissingDataSourceInformationColumn = "One of the required DataSourceInformation tables columns is missing."; public const string MDF_AmbigousCollectionName = "The collection name '{0}' matches at least two collections with the same name but with different case, but does not match any of them exactly."; public const string MDF_UnableToBuildCollection = "Unable to build schema collection '{0}';"; public const string ADP_CollectionIsParent = "The {0} with is already contained by this {1}."; public const string ADP_InvalidDataDirectory = "The DataDirectory substitute is not a string."; public const string ADP_QuotePrefixNotSet = "{0} requires an open connection when the quote prefix has not been set."; public const string MDF_InvalidRestrictionValue = "'{2}' is not a valid value for the '{1}' restriction of the '{0}' schema collection."; public const string MDF_UndefinedPopulationMechanism = "The population mechanism '{0}' is not defined."; public const string ODBC_ODBCCommandText = "OdbcCommandBuilder.DeriveParameters failed because the OdbcCommand.CommandText property value is an invalid multipart name"; public const string ODBC_NotSupportedEnumerationValue = "The {0} enumeration value, {1}, is not supported by the .Net Framework Odbc Data Provider."; public const string ADP_DatabaseNameTooLong = "The argument is too long."; public const string ADP_DataReaderNoData = "No data exists for the row/column."; public const string ADP_NumericToDecimalOverflow = "The numerical value is too large to fit into a 96 bit decimal."; public const string ADP_UnknownDataTypeCode = "Unable to handle an unknown TypeCode {0} returned by Type {1}."; public const string ADP_DbRecordReadOnly = "'{0}' cannot be called when the record is read only."; public const string ADP_OffsetOutOfRangeException = "Offset must refer to a location within the value."; public const string ODBC_GetSchemaRestrictionRequired = "The ODBC managed provider requires that the TABLE_NAME restriction be specified and non-null for the GetSchema indexes collection."; public const string ADP_OdbcNoTypesFromProvider = "The ODBC provider did not return results from SQLGETTYPEINFO."; public const string OdbcConnection_ConnectionStringTooLong = "Connection string exceeds maximum allowed length of {0}."; public const string Odbc_UnknownSQLType = "Unknown SQL type - {0}."; public const string Odbc_NegativeArgument = "Invalid negative argument!"; public const string Odbc_CantSetPropertyOnOpenConnection = "Can't set property on an open connection."; public const string Odbc_NoMappingForSqlTransactionLevel = "No valid mapping for a SQL_TRANSACTION '{0}' to a System.Data.IsolationLevel enumeration value."; public const string Odbc_CantEnableConnectionpooling = "{0} - unable to enable connection pooling..."; public const string Odbc_CantAllocateEnvironmentHandle = "{0} - unable to allocate an environment handle."; public const string Odbc_FailedToGetDescriptorHandle = "{0} - unable to get descriptor handle."; public const string Odbc_NotInTransaction = "Not in a transaction"; public const string Odbc_ExceptionMessage = "{0} [{1}] {2}"; public const string Odbc_ConnectionClosed = "The connection is closed."; public const string Odbc_OpenConnectionNoOwner = "An internal connection does not have an owner."; public const string Odbc_PlatformNotSupported = "System.Data.ODBC is not supported on this platform."; public const string Odbc_UnixOdbcNotFound = "Dependency unixODBC with minimum version 2.3.1 is required."; internal static string GetString(string name, params object[] args) { return GetString(CultureInfo.InvariantCulture, name, args); } internal static string GetString(CultureInfo culture, string name, params object[] args) { return string.Format(culture, name, args); } internal static string GetString(string name) { return name; } internal static string GetString(CultureInfo culture, string name) { return name; } internal static string Format(string resourceFormat, params object[] args) { if (args != null) { return string.Format(CultureInfo.InvariantCulture, resourceFormat, args); } return resourceFormat; } internal static string Format(string resourceFormat, object p1) { return string.Format(CultureInfo.InvariantCulture, resourceFormat, p1); } internal static string Format(string resourceFormat, object p1, object p2) { return string.Format(CultureInfo.InvariantCulture, resourceFormat, p1, p2); } internal static string Format(string resourceFormat, object p1, object p2, object p3) { return string.Format(CultureInfo.InvariantCulture, resourceFormat, p1, p2, p3); } public static string GetResourceString(string resourceKey, string defaultString) { return defaultString; } } internal class DiagnosticListener { internal static bool DiagnosticListenerEnabled; internal DiagnosticListener(string s) { } internal bool IsEnabled(string s) { return DiagnosticListenerEnabled; } internal void Write(string s1, object s2) { Console.WriteLine($"|| {s1}, {s2}"); } } internal static class Res { internal const string CodeGen_InvalidIdentifier = "Cannot generate identifier for name '{0}'"; internal const string CodeGen_DuplicateTableName = "There is more than one table with the same name '{0}' (even if namespace is different)"; internal const string CodeGen_TypeCantBeNull = "Column '{0}': Type '{1}' cannot be null"; internal const string CodeGen_NoCtor0 = "Column '{0}': Type '{1}' does not have parameterless constructor"; internal const string CodeGen_NoCtor1 = "Column '{0}': Type '{1}' does not have constructor with string argument"; internal const string SQLUDT_MaxByteSizeValue = "range: 0-8000"; internal const string SqlUdt_InvalidUdtMessage = "'{0}' is an invalid user defined type, reason: {1}."; internal const string Sql_NullCommandText = "Command parameter must have a non null and non empty command text."; internal const string Sql_MismatchedMetaDataDirectionArrayLengths = "MetaData parameter array must have length equivalent to ParameterDirection array argument."; public const string ADP_InvalidXMLBadVersion = "Invalid Xml; can only parse elements of version one."; public const string ADP_NotAPermissionElement = "Given security element is not a permission element."; public const string ADP_PermissionTypeMismatch = "Type mismatch."; public const string ConfigProviderNotFound = "Unable to find the requested .Net Framework Data Provider. It may not be installed."; public const string ConfigProviderInvalid = "The requested .Net Framework Data Provider's implementation does not have an Instance field of a System.Data.Common.DbProviderFactory derived type."; public const string ConfigProviderNotInstalled = "Failed to find or load the registered .Net Framework Data Provider."; public const string ConfigProviderMissing = "The missing .Net Framework Data Provider's assembly qualified name is required."; public const string ConfigBaseElementsOnly = "Only elements allowed."; public const string ConfigBaseNoChildNodes = "Child nodes not allowed."; public const string ConfigUnrecognizedAttributes = "Unrecognized attribute '{0}'."; public const string ConfigUnrecognizedElement = "Unrecognized element."; public const string ConfigSectionsUnique = "The '{0}' section can only appear once per config file."; public const string ConfigRequiredAttributeMissing = "Required attribute '{0}' not found."; public const string ConfigRequiredAttributeEmpty = "Required attribute '{0}' cannot be empty."; public const string ADP_QuotePrefixNotSet = "{0} requires open connection when the quote prefix has not been set."; internal static string GetString(string name) { return name; } internal static string GetString(string name, params object[] args) { return string.Format(name, args); } } internal static class ThisAssembly { public const string InformationalVersion = "4.0.30319.17020"; } namespace System { internal static class NotImplemented { internal static Exception ByDesign => new NotImplementedException(); internal static Exception ByDesignWithMessage(string message) { return new NotImplementedException(message); } internal static Exception ActiveIssue(string issue) { return new NotImplementedException(); } } internal static class HResults { internal const int Data = -2146232032; internal const int DataDeletedRowInaccessible = -2146232031; internal const int DataDuplicateName = -2146232030; internal const int DataInRowChangingEvent = -2146232029; internal const int DataInvalidConstraint = -2146232028; internal const int DataMissingPrimaryKey = -2146232027; internal const int DataNoNullAllowed = -2146232026; internal const int DataReadOnly = -2146232025; internal const int DataRowNotInTable = -2146232024; internal const int DataVersionNotFound = -2146232023; internal const int DataConstraint = -2146232022; internal const int StrongTyping = -2146232021; internal const int SqlType = -2146232016; internal const int SqlNullValue = -2146232015; internal const int SqlTruncate = -2146232014; internal const int DBConcurrency = -2146232011; internal const int OperationAborted = -2146232010; } [AttributeUsage(AttributeTargets.All, AllowMultiple = true)] internal class MonoTODOAttribute : Attribute { private string comment; public string Comment => comment; public MonoTODOAttribute() { } public MonoTODOAttribute(string comment) { this.comment = comment; } } [AttributeUsage(AttributeTargets.All, AllowMultiple = true)] internal class MonoDocumentationNoteAttribute : MonoTODOAttribute { public MonoDocumentationNoteAttribute(string comment) : base(comment) { } } [AttributeUsage(AttributeTargets.All, AllowMultiple = true)] internal class MonoExtensionAttribute : MonoTODOAttribute { public MonoExtensionAttribute(string comment) : base(comment) { } } [AttributeUsage(AttributeTargets.All, AllowMultiple = true)] internal class MonoInternalNoteAttribute : MonoTODOAttribute { public MonoInternalNoteAttribute(string comment) : base(comment) { } } [AttributeUsage(AttributeTargets.All, AllowMultiple = true)] internal class MonoLimitationAttribute : MonoTODOAttribute { public MonoLimitationAttribute(string comment) : base(comment) { } } [AttributeUsage(AttributeTargets.All, AllowMultiple = true)] internal class MonoNotSupportedAttribute : MonoTODOAttribute { public MonoNotSupportedAttribute(string comment) : base(comment) { } } } namespace System.Runtime.CompilerServices { internal class FriendAccessAllowedAttribute : Attribute { } } namespace System.Xml { internal abstract class BaseTreeIterator { protected DataSetMapper mapper; internal abstract XmlNode CurrentNode { get; } internal BaseTreeIterator(DataSetMapper mapper) { this.mapper = mapper; } internal abstract bool Next(); internal abstract bool NextRight(); internal bool NextRowElement() { while (Next()) { if (OnRowElement()) { return true; } } return false; } internal bool NextRightRowElement() { if (NextRight()) { if (OnRowElement()) { return true; } return NextRowElement(); } return false; } internal bool OnRowElement() { if (CurrentNode is XmlBoundElement xmlBoundElement) { return xmlBoundElement.Row != null; } return false; } } internal sealed class DataDocumentXPathNavigator : XPathNavigator, IHasXmlNode { private readonly XPathNodePointer _curNode; private XmlDataDocument _doc; private readonly XPathNodePointer _temp; internal XPathNodePointer CurNode => _curNode; internal XmlDataDocument Document => _doc; public override XPathNodeType NodeType => _curNode.NodeType; public override string LocalName => _curNode.LocalName; public override string NamespaceURI => _curNode.NamespaceURI; public override string Name => _curNode.Name; public override string Prefix => _curNode.Prefix; public override string Value { get { XPathNodeType nodeType = _curNode.NodeType; if (nodeType != XPathNodeType.Element && nodeType != 0) { return _curNode.Value; } return _curNode.InnerText; } } public override string BaseURI => _curNode.BaseURI; public override string XmlLang => _curNode.XmlLang; public override bool IsEmptyElement => _curNode.IsEmptyElement; public override XmlNameTable NameTable => _doc.NameTable; public override bool HasAttributes => _curNode.AttributeCount > 0; public override bool HasChildren => _curNode.HasChildren; internal DataDocumentXPathNavigator(XmlDataDocument doc, XmlNode node) { _curNode = new XPathNodePointer(this, doc, node); _temp = new XPathNodePointer(this, doc, node); _doc = doc; } private DataDocumentXPathNavigator(DataDocumentXPathNavigator other) { _curNode = other._curNode.Clone(this); _temp = other._temp.Clone(this); _doc = other._doc; } public override XPathNavigator Clone() { return new DataDocumentXPathNavigator(this); } public override string GetAttribute(string localName, string namespaceURI) { if (_curNode.NodeType != XPathNodeType.Element) { return string.Empty; } _temp.MoveTo(_curNode); if (!_temp.MoveToAttribute(localName, namespaceURI)) { return string.Empty; } return _temp.Value; } public override string GetNamespace(string name) { return _curNode.GetNamespace(name); } public override bool MoveToNamespace(string name) { if (_curNode.NodeType == XPathNodeType.Element) { return _curNode.MoveToNamespace(name); } return false; } public override bool MoveToFirstNamespace(XPathNamespaceScope namespaceScope) { if (_curNode.NodeType == XPathNodeType.Element) { return _curNode.MoveToFirstNamespace(namespaceScope); } return false; } public override bool MoveToNextNamespace(XPathNamespaceScope namespaceScope) { if (_curNode.NodeType == XPathNodeType.Namespace) { return _curNode.MoveToNextNamespace(namespaceScope); } return false; } public override bool MoveToAttribute(string localName, string namespaceURI) { if (_curNode.NodeType == XPathNodeType.Element) { return _curNode.MoveToAttribute(localName, namespaceURI); } return false; } public override bool MoveToFirstAttribute() { if (_curNode.NodeType == XPathNodeType.Element) { return _curNode.MoveToNextAttribute(bFirst: true); } return false; } public override bool MoveToNextAttribute() { if (_curNode.NodeType == XPathNodeType.Attribute) { return _curNode.MoveToNextAttribute(bFirst: false); } return false; } public override bool MoveToNext() { if (_curNode.NodeType != XPathNodeType.Attribute) { return _curNode.MoveToNextSibling(); } return false; } public override bool MoveToPrevious() { if (_curNode.NodeType != XPathNodeType.Attribute) { return _curNode.MoveToPreviousSibling(); } return false; } public override bool MoveToFirst() { if (_curNode.NodeType != XPathNodeType.Attribute) { return _curNode.MoveToFirst(); } return false; } public override bool MoveToFirstChild() { return _curNode.MoveToFirstChild(); } public override bool MoveToParent() { return _curNode.MoveToParent(); } public override void MoveToRoot() { _curNode.MoveToRoot(); } public override bool MoveTo(XPathNavigator other) { if (other != null && other is DataDocumentXPathNavigator dataDocumentXPathNavigator && _curNode.MoveTo(dataDocumentXPathNavigator.CurNode)) { _doc = _curNode.Document; return true; } return false; } public override bool MoveToId(string id) { return false; } public override bool IsSamePosition(XPathNavigator other) { if (other != null && other is DataDocumentXPathNavigator dataDocumentXPathNavigator && _doc == dataDocumentXPathNavigator.Document && _curNode.IsSamePosition(dataDocumentXPathNavigator.CurNode)) { return true; } return false; } XmlNode IHasXmlNode.GetNode() { return _curNode.Node; } public override XmlNodeOrder ComparePosition(XPathNavigator other) { if (other == null) { return XmlNodeOrder.Unknown; } if (other is DataDocumentXPathNavigator dataDocumentXPathNavigator && dataDocumentXPathNavigator.Document == _doc) { return _curNode.ComparePosition(dataDocumentXPathNavigator.CurNode); } return XmlNodeOrder.Unknown; } } internal sealed class DataPointer : IXmlDataVirtualNode { private XmlDataDocument _doc; private XmlNode _node; private DataColumn _column; private bool _fOnValue; private bool _bNeedFoliate; private bool _isInUse; private DataRow Row => GetRowElement()?.Row; internal int AttributeCount { get { RealFoliate(); if (_node != null && _column == null && _node.NodeType == XmlNodeType.Element) { if (!IsFoliated(_node)) { return ColumnCount(Row, fAttribute: true, fNulls: false); } return _node.Attributes.Count; } return 0; } } internal XmlNodeType NodeType { get { RealFoliate(); if (_node == null) { return XmlNodeType.None; } if (_column == null) { return _node.NodeType; } if (_fOnValue) { return XmlNodeType.Text; } if (_column.ColumnMapping == MappingType.Attribute) { return XmlNodeType.Attribute; } return XmlNodeType.Element; } } internal string LocalName { get { RealFoliate(); if (_node == null) { return string.Empty; } if (_column == null) { string localName = _node.LocalName; if (IsLocalNameEmpty(_node.NodeType)) { return string.Empty; } return localName; } if (_fOnValue) { return string.Empty; } return _doc.NameTable.Add(_column.EncodedColumnName); } } internal string NamespaceURI { get { RealFoliate(); if (_node == null) { return string.Empty; } if (_column == null) { return _node.NamespaceURI; } if (_fOnValue) { return string.Empty; } return _doc.NameTable.Add(_column.Namespace); } } internal string Name { get { RealFoliate(); if (_node == null) { return string.Empty; } if (_column == null) { string name = _node.Name; if (IsLocalNameEmpty(_node.NodeType)) { return string.Empty; } return name; } string prefix = Prefix; string localName = LocalName; if (prefix != null && prefix.Length > 0) { if (localName != null && localName.Length > 0) { return _doc.NameTable.Add(prefix + ":" + localName); } return prefix; } return localName; } } internal string Prefix { get { RealFoliate(); if (_node == null) { return string.Empty; } if (_column == null) { return _node.Prefix; } return string.Empty; } } internal string Value { get { RealFoliate(); if (_node == null) { return null; } if (_column == null) { return _node.Value; } if (_column.ColumnMapping == MappingType.Attribute || _fOnValue) { DataRow row = Row; DataRowVersion version = ((row.RowState == DataRowState.Detached) ? DataRowVersion.Proposed : DataRowVersion.Current); object value = row[_column, version]; if (!Convert.IsDBNull(value)) { return _column.ConvertObjectToXml(value); } return null; } return null; } } internal bool IsEmptyElement { get { RealFoliate(); if (_node != null && _column == null && _node.NodeType == XmlNodeType.Element) { return ((XmlElement)_node).IsEmpty; } return false; } } internal bool IsDefault { get { RealFoliate(); if (_node != null && _column == null && _node.NodeType == XmlNodeType.Attribute) { return !((XmlAttribute)_node).Specified; } return false; } } internal string PublicId => NodeType switch { XmlNodeType.DocumentType => ((XmlDocumentType)_node).PublicId, XmlNodeType.Entity => ((XmlEntity)_node).PublicId, XmlNodeType.Notation => ((XmlNotation)_node).PublicId, _ => null, }; internal string SystemId => NodeType switch { XmlNodeType.DocumentType => ((XmlDocumentType)_node).SystemId, XmlNodeType.Entity => ((XmlEntity)_node).SystemId, XmlNodeType.Notation => ((XmlNotation)_node).SystemId, _ => null, }; internal string InternalSubset { get { if (NodeType == XmlNodeType.DocumentType) { return ((XmlDocumentType)_node).InternalSubset; } return null; } } internal XmlDeclaration Declaration { get { XmlNode xmlNode = _doc.SafeFirstChild(_doc); if (xmlNode != null && xmlNode.NodeType == XmlNodeType.XmlDeclaration) { return (XmlDeclaration)xmlNode; } return null; } } internal string Encoding { get { if (NodeType == XmlNodeType.XmlDeclaration) { return ((XmlDeclaration)_node).Encoding; } if (NodeType == XmlNodeType.Document) { XmlDeclaration declaration = Declaration; if (declaration != null) { return declaration.Encoding; } } return null; } } internal string Standalone { get { if (NodeType == XmlNodeType.XmlDeclaration) { return ((XmlDeclaration)_node).Standalone; } if (NodeType == XmlNodeType.Document) { XmlDeclaration declaration = Declaration; if (declaration != null) { return declaration.Standalone; } } return null; } } internal string Version { get { if (NodeType == XmlNodeType.XmlDeclaration) { return ((XmlDeclaration)_node).Version; } if (NodeType == XmlNodeType.Document) { XmlDeclaration declaration = Declaration; if (declaration != null) { return declaration.Version; } } return null; } } internal DataPointer(XmlDataDocument doc, XmlNode node) { _doc = doc; _node = node; _column = null; _fOnValue = false; _bNeedFoliate = false; _isInUse = true; } internal DataPointer(DataPointer pointer) { _doc = pointer._doc; _node = pointer._node; _column = pointer._column; _fOnValue = pointer._fOnValue; _bNeedFoliate = false; _isInUse = true; } internal void AddPointer() { _doc.AddPointer(this); } private XmlBoundElement GetRowElement() { if (_column != null) { return _node as XmlBoundElement; } _doc.Mapper.GetRegion(_node, out var rowElem); return rowElem; } private static bool IsFoliated(XmlNode node) { if (node == null || !(node is XmlBoundElement)) { return true; } return ((XmlBoundElement)node).IsFoliated; } internal void MoveTo(DataPointer pointer) { _doc = pointer._doc; _node = pointer._node; _column = pointer._column; _fOnValue = pointer._fOnValue; } private void MoveTo(XmlNode node) { _node = node; _column = null; _fOnValue = false; } private void MoveTo(XmlNode node, DataColumn column, bool fOnValue) { _node = node; _column = column; _fOnValue = fOnValue; } private DataColumn NextColumn(DataRow row, DataColumn col, bool fAttribute, bool fNulls) { if (row.RowState == DataRowState.Deleted) { return null; } DataColumnCollection columns = row.Table.Columns; int i = ((col != null) ? (col.Ordinal + 1) : 0); int count = columns.Count; DataRowVersion version = ((row.RowState == DataRowState.Detached) ? DataRowVersion.Proposed : DataRowVersion.Current); for (; i < count; i++) { DataColumn dataColumn = columns[i]; if (!_doc.IsNotMapped(dataColumn) && dataColumn.ColumnMapping == MappingType.Attribute == fAttribute && (fNulls || !Convert.IsDBNull(row[dataColumn, version]))) { return dataColumn; } } return null; } private DataColumn NthColumn(DataRow row, bool fAttribute, int iColumn, bool fNulls) { DataColumn dataColumn = null; while ((dataColumn = NextColumn(row, dataColumn, fAttribute, fNulls)) != null) { if (iColumn == 0) { return dataColumn; } iColumn = checked(iColumn - 1); } return null; } private int ColumnCount(DataRow row, bool fAttribute, bool fNulls) { DataColumn col = null; int num = 0; while ((col = NextColumn(row, col, fAttribute, fNulls)) != null) { num++; } return num; } internal bool MoveToFirstChild() { RealFoliate(); if (_node == null) { return false; } if (_column != null) { if (_fOnValue) { return false; } _fOnValue = true; return true; } if (!IsFoliated(_node)) { DataColumn dataColumn = NextColumn(Row, null, fAttribute: false, fNulls: false); if (dataColumn != null) { MoveTo(_node, dataColumn, _doc.IsTextOnly(dataColumn)); return true; } } XmlNode xmlNode = _doc.SafeFirstChild(_node); if (xmlNode != null) { MoveTo(xmlNode); return true; } return false; } internal bool MoveToNextSibling() { RealFoliate(); if (_node != null) { if (_column != null) { if (_fOnValue && !_doc.IsTextOnly(_column)) { return false; } DataColumn dataColumn = NextColumn(Row, _column, fAttribute: false, fNulls: false); if (dataColumn != null) { MoveTo(_node, dataColumn, fOnValue: false); return true; } XmlNode xmlNode = _doc.SafeFirstChild(_node); if (xmlNode != null) { MoveTo(xmlNode); return true; } } else { XmlNode xmlNode2 = _doc.SafeNextSibling(_node); if (xmlNode2 != null) { MoveTo(xmlNode2); return true; } } } return false; } internal bool MoveToParent() { RealFoliate(); if (_node != null) { if (_column != null) { if (_fOnValue && !_doc.IsTextOnly(_column)) { MoveTo(_node, _column, fOnValue: false); return true; } if (_column.ColumnMapping != MappingType.Attribute) { MoveTo(_node, null, fOnValue: false); return true; } } else { XmlNode parentNode = _node.ParentNode; if (parentNode != null) { MoveTo(parentNode); return true; } } } return false; } internal bool MoveToOwnerElement() { RealFoliate(); if (_node != null) { if (_column != null) { if (_fOnValue || _doc.IsTextOnly(_column) || _column.ColumnMapping != MappingType.Attribute) { return false; } MoveTo(_node, null, fOnValue: false); return true; } if (_node.NodeType == XmlNodeType.Attribute) { XmlNode ownerElement = ((XmlAttribute)_node).OwnerElement; if (ownerElement != null) { MoveTo(ownerElement, null, fOnValue: false); return true; } } } return false; } internal bool MoveToAttribute(int i) { RealFoliate(); if (i < 0) { return false; } if (_node != null && (_column == null || _column.ColumnMapping == MappingType.Attribute) && _node.NodeType == XmlNodeType.Element) { if (!IsFoliated(_node)) { DataColumn dataColumn = NthColumn(Row, fAttribute: true, i, fNulls: false); if (dataColumn != null) { MoveTo(_node, dataColumn, fOnValue: false); return true; } } else { XmlNode xmlNode = _node.Attributes.Item(i); if (xmlNode != null) { MoveTo(xmlNode, null, fOnValue: false); return true; } } } return false; } private bool IsLocalNameEmpty(XmlNodeType nt) { switch (nt) { case XmlNodeType.None: case XmlNodeType.Text: case XmlNodeType.CDATA: case XmlNodeType.Comment: case XmlNodeType.Document: case XmlNodeType.DocumentFragment: case XmlNodeType.Whitespace: case XmlNodeType.SignificantWhitespace: case XmlNodeType.EndElement: case XmlNodeType.EndEntity: return true; case XmlNodeType.Element: case XmlNodeType.Attribute: case XmlNodeType.EntityReference: case XmlNodeType.Entity: case XmlNodeType.ProcessingInstruction: case XmlNodeType.DocumentType: case XmlNodeType.Notation: case XmlNodeType.XmlDeclaration: return false; default: return true; } } bool IXmlDataVirtualNode.IsOnNode(XmlNode nodeToCheck) { RealFoliate(); return nodeToCheck == _node; } bool IXmlDataVirtualNode.IsOnColumn(DataColumn col) { RealFoliate(); return col == _column; } internal XmlNode GetNode() { return _node; } void IXmlDataVirtualNode.OnFoliated(XmlNode foliatedNode) { if (_node == foliatedNode && _column != null) { _bNeedFoliate = true; } } internal void RealFoliate() { if (!_bNeedFoliate) { return; } XmlNode xmlNode = null; if (_doc.IsTextOnly(_column)) { xmlNode = _node.FirstChild; } else { if (_column.ColumnMapping == MappingType.Attribute) { xmlNode = _node.Attributes.GetNamedItem(_column.EncodedColumnName, _column.Namespace); } else { xmlNode = _node.FirstChild; while (xmlNode != null && (!(xmlNode.LocalName == _column.EncodedColumnName) || !(xmlNode.NamespaceURI == _column.Namespace))) { xmlNode = xmlNode.NextSibling; } } if (xmlNode != null && _fOnValue) { xmlNode = xmlNode.FirstChild; } } if (xmlNode == null) { throw new InvalidOperationException("Invalid foliation."); } _node = xmlNode; _column = null; _fOnValue = false; _bNeedFoliate = false; } [Conditional("DEBUG")] private void AssertValid() { if (_column != null) { XmlBoundElement obj = _node as XmlBoundElement; DataRow row = obj.Row; _ = obj.ElementState; _ = row.RowState; _ = 1; } } bool IXmlDataVirtualNode.IsInUse() { return _isInUse; } internal void SetNoLongerUse() { _node = null; _column = null; _fOnValue = false; _bNeedFoliate = false; _isInUse = false; } } internal sealed class DataSetMapper { private Hashtable _tableSchemaMap; private Hashtable _columnSchemaMap; private XmlDataDocument _doc; private DataSet _dataSet; internal const string strReservedXmlns = "http://www.w3.org/2000/xmlns/"; internal DataSetMapper() { _tableSchemaMap = new Hashtable(); _columnSchemaMap = new Hashtable(); } internal void SetupMapping(XmlDataDocument xd, DataSet ds) { if (IsMapped()) { _tableSchemaMap = new Hashtable(); _columnSchemaMap = new Hashtable(); } _doc = xd; _dataSet = ds; foreach (DataTable table in _dataSet.Tables) { AddTableSchema(table); foreach (DataColumn column in table.Columns) { if (!IsNotMapped(column)) { AddColumnSchema(column); } } } } internal bool IsMapped() { return _dataSet != null; } internal DataTable SearchMatchingTableSchema(string localName, string namespaceURI) { object identity = GetIdentity(localName, namespaceURI); return (DataTable)_tableSchemaMap[identity]; } internal DataTable SearchMatchingTableSchema(XmlBoundElement rowElem, XmlBoundElement elem) { DataTable dataTable = SearchMatchingTableSchema(elem.LocalName, elem.NamespaceURI); if (dataTable == null) { return null; } if (rowElem == null) { return dataTable; } if (GetColumnSchemaForNode(rowElem, elem) == null) { return dataTable; } foreach (XmlAttribute attribute in elem.Attributes) { if ((object)attribute.NamespaceURI != "http://www.w3.org/2000/xmlns/") { return dataTable; } } for (XmlNode xmlNode = elem.FirstChild; xmlNode != null; xmlNode = xmlNode.NextSibling) { if (xmlNode.NodeType == XmlNodeType.Element) { return dataTable; } } return null; } internal DataColumn GetColumnSchemaForNode(XmlBoundElement rowElem, XmlNode node) { object identity = GetIdentity(rowElem.LocalName, rowElem.NamespaceURI); object identity2 = GetIdentity(node.LocalName, node.NamespaceURI); Hashtable hashtable = (Hashtable)_columnSchemaMap[identity]; if (hashtable != null) { DataColumn dataColumn = (DataColumn)hashtable[identity2]; if (dataColumn == null) { return null; } MappingType columnMapping = dataColumn.ColumnMapping; if (node.NodeType == XmlNodeType.Attribute && columnMapping == MappingType.Attribute) { return dataColumn; } if (node.NodeType == XmlNodeType.Element && columnMapping == MappingType.Element) { return dataColumn; } return null; } return null; } internal DataTable GetTableSchemaForElement(XmlElement elem) { if (!(elem is XmlBoundElement be)) { return null; } return GetTableSchemaForElement(be); } internal DataTable GetTableSchemaForElement(XmlBoundElement be) { return be.Row?.Table; } internal static bool IsNotMapped(DataColumn c) { return c.ColumnMapping == MappingType.Hidden; } internal DataRow GetRowFromElement(XmlElement e) { return (e as XmlBoundElement)?.Row; } internal DataRow GetRowFromElement(XmlBoundElement be) { return be.Row; } internal bool GetRegion(XmlNode node, out XmlBoundElement rowElem) { while (node != null) { if (node is XmlBoundElement xmlBoundElement && GetRowFromElement(xmlBoundElement) != null) { rowElem = xmlBoundElement; return true; } node = ((node.NodeType != XmlNodeType.Attribute) ? node.ParentNode : ((XmlAttribute)node).OwnerElement); } rowElem = null; return false; } internal bool IsRegionRadical(XmlBoundElement rowElem) { if (rowElem.ElementState == ElementState.Defoliated) { return true; } DataColumnCollection columns = GetTableSchemaForElement(rowElem).Columns; int iColumn = 0; int count = rowElem.Attributes.Count; for (int i = 0; i < count; i++) { XmlAttribute xmlAttribute = rowElem.Attributes[i]; if (!xmlAttribute.Specified) { return false; } DataColumn columnSchemaForNode = GetColumnSchemaForNode(rowElem, xmlAttribute); if (columnSchemaForNode == null) { return false; } if (!IsNextColumn(columns, ref iColumn, columnSchemaForNode)) { return false; } XmlNode firstChild = xmlAttribute.FirstChild; if (firstChild == null || firstChild.NodeType != XmlNodeType.Text || firstChild.NextSibling != null) { return false; } } iColumn = 0; XmlNode xmlNode; for (xmlNode = rowElem.FirstChild; xmlNode != null; xmlNode = xmlNode.NextSibling) { if (xmlNode.NodeType != XmlNodeType.Element) { return false; } XmlElement xmlElement = xmlNode as XmlElement; if (GetRowFromElement(xmlElement) != null) { break; } DataColumn columnSchemaForNode2 = GetColumnSchemaForNode(rowElem, xmlElement); if (columnSchemaForNode2 == null) { return false; } if (!IsNextColumn(columns, ref iColumn, columnSchemaForNode2)) { return false; } if (xmlElement.HasAttributes) { return false; } XmlNode firstChild2 = xmlElement.FirstChild; if (firstChild2 == null || firstChild2.NodeType != XmlNodeType.Text || firstChild2.NextSibling != null) { return false; } } while (xmlNode != null) { if (xmlNode.NodeType != XmlNodeType.Element) { return false; } if (GetRowFromElement((XmlElement)xmlNode) == null) { return false; } xmlNode = xmlNode.NextSibling; } return true; } private void AddTableSchema(DataTable table) { object identity = GetIdentity(table.EncodedTableName, table.Namespace); _tableSchemaMap[identity] = table; } private void AddColumnSchema(DataColumn col) { DataTable table = col.Table; object identity = GetIdentity(table.EncodedTableName, table.Namespace); object identity2 = GetIdentity(col.EncodedColumnName, col.Namespace); Hashtable hashtable = (Hashtable)_columnSchemaMap[identity]; if (hashtable == null) { hashtable = new Hashtable(); _columnSchemaMap[identity] = hashtable; } hashtable[identity2] = col; } private static object GetIdentity(string localName, string namespaceURI) { return localName + ":" + namespaceURI; } private bool IsNextColumn(DataColumnCollection columns, ref int iColumn, DataColumn col) { while (iColumn < columns.Count) { if (columns[iColumn] == col) { iColumn++; return true; } iColumn++; } return false; } } internal interface IXmlDataVirtualNode { bool IsOnNode(XmlNode nodeToCheck); bool IsOnColumn(DataColumn col); bool IsInUse(); void OnFoliated(XmlNode foliatedNode); } internal abstract class BaseRegionIterator : BaseTreeIterator { internal BaseRegionIterator(DataSetMapper mapper) : base(mapper) { } } internal sealed class RegionIterator : BaseRegionIterator { private XmlBoundElement _rowElement; private XmlNode _currentNode; internal override XmlNode CurrentNode => _currentNode; internal RegionIterator(XmlBoundElement rowElement) : base(((XmlDataDocument)rowElement.OwnerDocument).Mapper) { _rowElement = rowElement; _currentNode = rowElement; } internal override bool Next() { ElementState elementState = _rowElement.ElementState; XmlNode firstChild = _currentNode.FirstChild; if (firstChild != null) { _currentNode = firstChild; _rowElement.ElementState = elementState; return true; } return NextRight(); } internal override bool NextRight() { if (_currentNode == _rowElement) { _currentNode = null; return false; } ElementState elementState = _rowElement.ElementState; XmlNode nextSibling = _currentNode.NextSibling; if (nextSibling != null) { _currentNode = nextSibling; _rowElement.ElementState = elementState; return true; } nextSibling = _currentNode; while (nextSibling != _rowElement && nextSibling.NextSibling == null) { nextSibling = nextSibling.ParentNode; } if (nextSibling == _rowElement) { _currentNode = null; _rowElement.ElementState = elementState; return false; } _currentNode = nextSibling.NextSibling; _rowElement.ElementState = elementState; return true; } internal bool NextInitialTextLikeNodes(out string value) { ElementState elementState = _rowElement.ElementState; XmlNode n = CurrentNode.FirstChild; value = GetInitialTextFromNodes(ref n); if (n == null) { _rowElement.ElementState = elementState; return NextRight(); } _currentNode = n; _rowElement.ElementState = elementState; return true; } private static string GetInitialTextFromNodes(ref XmlNode n) { string text = null; if (n != null) { while (n.NodeType == XmlNodeType.Whitespace) { n = n.NextSibling; if (n == null) { return string.Empty; } } if (XmlDataDocument.IsTextLikeNode(n) && (n.NextSibling == null || !XmlDataDocument.IsTextLikeNode(n.NextSibling))) { text = n.Value; n = n.NextSibling; } else { StringBuilder stringBuilder = new StringBuilder(); while (n != null && XmlDataDocument.IsTextLikeNode(n)) { if (n.NodeType != XmlNodeType.Whitespace) { stringBuilder.Append(n.Value); } n = n.NextSibling; } text = stringBuilder.ToString(); } } return text ?? string.Empty; } } internal sealed class TreeIterator : BaseTreeIterator { private readonly XmlNode _nodeTop; private XmlNode _currentNode; internal override XmlNode CurrentNode => _currentNode; internal TreeIterator(XmlNode nodeTop) : base(((XmlDataDocument)nodeTop.OwnerDocument).Mapper) { _nodeTop = nodeTop; _currentNode = nodeTop; } internal override bool Next() { XmlNode firstChild = _currentNode.FirstChild; if (firstChild != null) { _currentNode = firstChild; return true; } return NextRight(); } internal override bool NextRight() { if (_currentNode == _nodeTop) { _currentNode = null; return false; } XmlNode nextSibling = _currentNode.NextSibling; if (nextSibling != null) { _currentNode = nextSibling; return true; } nextSibling = _currentNode; while (nextSibling != _nodeTop && nextSibling.NextSibling == null) { nextSibling = nextSibling.ParentNode; } if (nextSibling == _nodeTop) { _currentNode = null; return false; } _currentNode = nextSibling.NextSibling; return true; } } internal sealed class XPathNodePointer : IXmlDataVirtualNode { private readonly WeakReference _owner; private readonly XmlDataDocument _doc; private XmlNode _node; private DataColumn _column; private bool _fOnValue; internal XmlBoundElement _parentOfNS; internal static readonly int[] s_xmlNodeType_To_XpathNodeType_Map; internal const string StrReservedXmlns = "http://www.w3.org/2000/xmlns/"; internal const string StrReservedXml = "http://www.w3.org/XML/1998/namespace"; internal const string StrXmlNS = "xmlns"; private bool _bNeedFoliate; internal bool IsEmptyElement { get { if (_node != null && _column == null && _node.NodeType == XmlNodeType.Element) { return ((XmlElement)_node).IsEmpty; } return false; } } internal XPathNodeType NodeType { get { RealFoliate(); if (_node == null) { return XPathNodeType.All; } if (_column == null) { return ConvertNodeType(_node); } if (_fOnValue) { return XPathNodeType.Text; } if (_column.ColumnMapping == MappingType.Attribute) { if (_column.Namespace == "http://www.w3.org/2000/xmlns/") { return XPathNodeType.Namespace; } return XPathNodeType.Attribute; } return XPathNodeType.Element; } } internal string LocalName { get { RealFoliate(); if (_node == null) { return string.Empty; } if (_column == null) { XmlNodeType nodeType = _node.NodeType; if (IsNamespaceNode(nodeType, _node.NamespaceURI) && _node.LocalName == "xmlns") { return string.Empty; } if (nodeType == XmlNodeType.Element || nodeType == XmlNodeType.Attribute || nodeType == XmlNodeType.ProcessingInstruction) { return _node.LocalName; } return string.Empty; } if (_fOnValue) { return string.Empty; } return _doc.NameTable.Add(_column.EncodedColumnName); } } internal string Name { get { RealFoliate(); if (_node == null) { return string.Empty; } if (_column == null) { XmlNodeType nodeType = _node.NodeType; if (IsNamespaceNode(nodeType, _node.NamespaceURI)) { if (_node.LocalName == "xmlns") { return string.Empty; } return _node.LocalName; } if (nodeType == XmlNodeType.Element || nodeType == XmlNodeType.Attribute || nodeType == XmlNodeType.ProcessingInstruction) { return _node.Name; } return string.Empty; } if (_fOnValue) { return string.Empty; } return _doc.NameTable.Add(_column.EncodedColumnName); } } internal string NamespaceURI { get { RealFoliate(); if (_node == null) { return string.Empty; } if (_column == null) { XPathNodeType xPathNodeType = ConvertNodeType(_node); if (xPathNodeType == XPathNodeType.Element || xPathNodeType == XPathNodeType.Root || xPathNodeType == XPathNodeType.Attribute) { return _node.NamespaceURI; } return string.Empty; } if (_fOnValue) { return string.Empty; } if (_column.Namespace == "http://www.w3.org/2000/xmlns/") { return string.Empty; } return _doc.NameTable.Add(_column.Namespace); } } internal string Prefix { get { RealFoliate(); if (_node == null) { return string.Empty; } if (_column == null) { if (IsNamespaceNode(_node.NodeType, _node.NamespaceURI)) { return string.Empty; } return _node.Prefix; } return string.Empty; } } internal string Value { get { RealFoliate(); if (_node == null) { return null; } if (_column == null) { string text = _node.Value; if (XmlDataDocument.IsTextNode(_node.NodeType)) { if (_node.ParentNode == null) { return text; } XmlNode xmlNode = _doc.SafeNextSibling(_node); while (xmlNode != null && XmlDataDocument.IsTextNode(xmlNode.NodeType)) { text += xmlNode.Value; xmlNode = _doc.SafeNextSibling(xmlNode); } } return text; } if (_column.ColumnMapping == MappingType.Attribute || _fOnValue) { DataRow row = Row; DataRowVersion version = ((row.RowState == DataRowState.Detached) ? DataRowVersion.Proposed : DataRowVersion.Current); object value = row[_column, version]; if (!Convert.IsDBNull(value)) { return _column.ConvertObjectToXml(value); } return null; } return null; } } internal string InnerText { get { RealFoliate(); if (_node == null) { return string.Empty; } if (_column == null) { if (_node.NodeType == XmlNodeType.Document) { XmlElement documentElement = ((XmlDocument)_node).DocumentElement; if (documentElement != null) { return documentElement.InnerText; } return string.Empty; } return _node.InnerText; } DataRow row = Row; DataRowVersion version = ((row.RowState == DataRowState.Detached) ? DataRowVersion.Proposed : DataRowVersion.Current); object value = row[_column, version]; if (!Convert.IsDBNull(value)) { return _column.ConvertObjectToXml(value); } return string.Empty; } } internal string BaseURI { get { RealFoliate(); if (_node != null) { return _node.BaseURI; } return string.Empty; } } internal string XmlLang { get { RealFoliate(); XmlNode xmlNode = _node; XmlBoundElement xmlBoundElement = null; object obj = null; while (xmlNode != null) { if (xmlNode is XmlBoundElement xmlBoundElement2) { if (xmlBoundElement2.ElementState == ElementState.Defoliated) { DataRow row = xmlBoundElement2.Row; foreach (DataColumn column in row.Table.Columns) { if (column.Prefix == "xml" && column.EncodedColumnName == "lang") { obj = row[column]; if (obj == DBNull.Value) { break; } return (string)obj; } } } else if (xmlBoundElement2.HasAttribute("xml:lang")) { return xmlBoundElement2.GetAttribute("xml:lang"); } } xmlNode = ((xmlNode.NodeType != XmlNodeType.Attribute) ? xmlNode.ParentNode : ((XmlAttribute)xmlNode).OwnerElement); } return string.Empty; } } private DataRow Row => GetRowElement()?.Row; internal int AttributeCount { get { RealFoliate(); if (_node != null && _column == null && _node.NodeType == XmlNodeType.Element) { if (!IsFoliated(_node)) { return ColumnCount(Row, fAttribute: true); } int num = 0; { foreach (XmlAttribute attribute in _node.Attributes) { if (attribute.NamespaceURI != "http://www.w3.org/2000/xmlns/") { num++; } } return num; } } return 0; } } internal bool HasChildren { get { RealFoliate(); if (_node == null) { return false; } if (_column != null) { if (_column.ColumnMapping == MappingType.Attribute || _column.ColumnMapping == MappingType.Hidden) { return false; } return !_fOnValue; } if (!IsFoliated(_node)) { DataRow row = Row; for (DataColumn dataColumn = NextColumn(row, null, fAttribute: false); dataColumn != null; dataColumn = NextColumn(row, dataColumn, fAttribute: false)) { if (IsValidChild(_node, dataColumn)) { return true; } } } for (XmlNode xmlNode = _doc.SafeFirstChild(_node); xmlNode != null; xmlNode = _doc.SafeNextSibling(xmlNode)) { if (IsValidChild(_node, xmlNode)) { return true; } } return false; } } internal XmlNode Node { get { RealFoliate(); if (_node == null) { return null; } XmlBoundElement rowElement = GetRowElement(); if (rowElement != null) { bool isFoliationEnabled = _doc.IsFoliationEnabled; _doc.IsFoliationEnabled = true; _doc.Foliate(rowElement, ElementState.StrongFoliation); _doc.IsFoliationEnabled = isFoliationEnabled; } RealFoliate(); return _node; } } internal XmlDataDocument Document => _doc; static XPathNodePointer() { s_xmlNodeType_To_XpathNodeType_Map = new int[20]; s_xmlNodeType_To_XpathNodeType_Map[0] = -1; s_xmlNodeType_To_XpathNodeType_Map[1] = 1; s_xmlNodeType_To_XpathNodeType_Map[2] = 2; s_xmlNodeType_To_XpathNodeType_Map[3] = 4; s_xmlNodeType_To_XpathNodeType_Map[4] = 4; s_xmlNodeType_To_XpathNodeType_Map[5] = -1; s_xmlNodeType_To_XpathNodeType_Map[6] = -1; s_xmlNodeType_To_XpathNodeType_Map[7] = 7; s_xmlNodeType_To_XpathNodeType_Map[8] = 8; s_xmlNodeType_To_XpathNodeType_Map[9] = 0; s_xmlNodeType_To_XpathNodeType_Map[10] = -1; s_xmlNodeType_To_XpathNodeType_Map[11] = 0; s_xmlNodeType_To_XpathNodeType_Map[12] = -1; s_xmlNodeType_To_XpathNodeType_Map[13] = 6; s_xmlNodeType_To_XpathNodeType_Map[14] = 5; s_xmlNodeType_To_XpathNodeType_Map[15] = -1; s_xmlNodeType_To_XpathNodeType_Map[16] = -1; s_xmlNodeType_To_XpathNodeType_Map[17] = -1; } private XPathNodeType DecideXPNodeTypeForTextNodes(XmlNode node) { XPathNodeType result = XPathNodeType.Whitespace; while (node != null) { switch (node.NodeType) { case XmlNodeType.SignificantWhitespace: result = XPathNodeType.SignificantWhitespace; break; case XmlNodeType.Text: case XmlNodeType.CDATA: return XPathNodeType.Text; default: return result; case XmlNodeType.Whitespace: break; } node = _doc.SafeNextSibling(node); } return result; } private XPathNodeType ConvertNodeType(XmlNode node) { int num = -1; if (XmlDataDocument.IsTextNode(node.NodeType)) { return DecideXPNodeTypeForTextNodes(node); } num = s_xmlNodeType_To_XpathNodeType_Map[(int)node.NodeType]; if (num == 2) { if (node.NamespaceURI == "http://www.w3.org/2000/xmlns/") { return XPathNodeType.Namespace; } return XPathNodeType.Attribute; } return (XPathNodeType)num; } private bool IsNamespaceNode(XmlNodeType nt, string ns) { if (nt == XmlNodeType.Attribute) { return ns == "http://www.w3.org/2000/xmlns/"; } return false; } internal XPathNodePointer(DataDocumentXPathNavigator owner, XmlDataDocument doc, XmlNode node) : this(owner, doc, node, null, bOnValue: false, null) { } internal XPathNodePointer(DataDocumentXPathNavigator owner, XPathNodePointer pointer) : this(owner, pointer._doc, pointer._node, pointer._column, pointer._fOnValue, pointer._parentOfNS) { } private XPathNodePointer(DataDocumentXPathNavigator owner, XmlDataDocument doc, XmlNode node, DataColumn c, bool bOnValue, XmlBoundElement parentOfNS) { _owner = new WeakReference(owner); _doc = doc; _node = node; _column = c; _fOnValue = bOnValue; _parentOfNS = parentOfNS; _doc.AddPointer(this); _bNeedFoliate = false; } internal XPathNodePointer Clone(DataDocumentXPathNavigator owner) { RealFoliate(); return new XPathNodePointer(owner, this); } private XmlBoundElement GetRowElement() { if (_column != null) { return _node as XmlBoundElement; } _doc.Mapper.GetRegion(_node, out var rowElem); return rowElem; } internal bool MoveTo(XPathNodePointer pointer) { if (_doc != pointer._doc) { return false; } _node = pointer._node; _column = pointer._column; _fOnValue = pointer._fOnValue; _bNeedFoliate = pointer._bNeedFoliate; return true; } private void MoveTo(XmlNode node) { _node = node; _column = null; _fOnValue = false; } private void MoveTo(XmlNode node, DataColumn column, bool fOnValue) { _node = node; _column = column; _fOnValue = fOnValue; } private bool IsFoliated(XmlNode node) { if (node != null && node is XmlBoundElement) { return ((XmlBoundElement)node).IsFoliated; } return true; } private int ColumnCount(DataRow row, bool fAttribute) { DataColumn dataColumn = null; int num = 0; while ((dataColumn = NextColumn(row, dataColumn, fAttribute)) != null) { if (dataColumn.Namespace != "http://www.w3.org/2000/xmlns/") { num++; } } return num; } internal DataColumn NextColumn(DataRow row, DataColumn col, bool fAttribute) { if (row.RowState == DataRowState.Deleted) { return null; } DataColumnCollection columns = row.Table.Columns; int i = ((col != null) ? (col.Ordinal + 1) : 0); int count = columns.Count; DataRowVersion version = ((row.RowState == DataRowState.Detached) ? DataRowVersion.Proposed : DataRowVersion.Current); for (; i < count; i++) { DataColumn dataColumn = columns[i]; if (!_doc.IsNotMapped(dataColumn) && dataColumn.ColumnMapping == MappingType.Attribute == fAttribute && !Convert.IsDBNull(row[dataColumn, version])) { return dataColumn; } } return null; } internal DataColumn PreviousColumn(DataRow row, DataColumn col, bool fAttribute) { if (row.RowState == DataRowState.Deleted) { return null; } DataColumnCollection columns = row.Table.Columns; int num = ((col != null) ? (col.Ordinal - 1) : (columns.Count - 1)); _ = columns.Count; DataRowVersion version = ((row.RowState == DataRowState.Detached) ? DataRowVersion.Proposed : DataRowVersion.Current); while (num >= 0) { DataColumn dataColumn = columns[num]; if (!_doc.IsNotMapped(dataColumn) && dataColumn.ColumnMapping == MappingType.Attribute == fAttribute && !Convert.IsDBNull(row[dataColumn, version])) { return dataColumn; } num--; } return null; } internal bool MoveToAttribute(string localName, string namespaceURI) { RealFoliate(); if (namespaceURI == "http://www.w3.org/2000/xmlns/") { return false; } if (_node != null && (_column == null || _column.ColumnMapping == MappingType.Attribute) && _node.NodeType == XmlNodeType.Element) { if (!IsFoliated(_node)) { DataColumn dataColumn = null; while ((dataColumn = NextColumn(Row, dataColumn, fAttribute: true)) != null) { if (dataColumn.EncodedColumnName == localName && dataColumn.Namespace == namespaceURI) { MoveTo(_node, dataColumn, fOnValue: false); return true; } } } else { XmlNode namedItem = _node.Attributes.GetNamedItem(localName, namespaceURI); if (namedItem != null) { MoveTo(namedItem, null, fOnValue: false); return true; } } } return false; } internal bool MoveToNextAttribute(bool bFirst) { RealFoliate(); if (_node != null) { if (bFirst && (_column != null || _node.NodeType != XmlNodeType.Element)) { return false; } if (!bFirst) { if (_column != null && _column.ColumnMapping != MappingType.Attribute) { return false; } if (_column == null && _node.NodeType != XmlNodeType.Attribute) { return false; } } if (!IsFoliated(_node)) { DataColumn dataColumn = _column; while ((dataColumn = NextColumn(Row, dataColumn, fAttribute: true)) != null) { if (dataColumn.Namespace != "http://www.w3.org/2000/xmlns/") { MoveTo(_node, dataColumn, fOnValue: false); return true; } } return false; } if (bFirst) { foreach (XmlAttribute attribute in _node.Attributes) { if (attribute.NamespaceURI != "http://www.w3.org/2000/xmlns/") { MoveTo(attribute, null, fOnValue: false); return true; } } } else { XmlAttributeCollection attributes = ((XmlAttribute)_node).OwnerElement.Attributes; bool flag = false; foreach (XmlAttribute item in attributes) { if (flag && item.NamespaceURI != "http://www.w3.org/2000/xmlns/") { MoveTo(item, null, fOnValue: false); return true; } if (item == _node) { flag = true; } } } } return false; } private bool IsValidChild(XmlNode parent, XmlNode child) { int num = s_xmlNodeType_To_XpathNodeType_Map[(int)child.NodeType]; if (num == -1) { return false; } switch (s_xmlNodeType_To_XpathNodeType_Map[(int)parent.NodeType]) { case 0: if (num != 1 && num != 8) { return num == 7; } return true; case 1: if (num != 1 && num != 4 && num != 8 && num != 6 && num != 5) { return num == 7; } return true; default: return false; } } private bool IsValidChild(XmlNode parent, DataColumn c) { switch (s_xmlNodeType_To_XpathNodeType_Map[(int)parent.NodeType]) { case 0: return c.ColumnMapping == MappingType.Element; case 1: if (c.ColumnMapping != MappingType.Element) { return c.ColumnMapping == MappingType.SimpleContent; } return true; default: return false; } } internal bool MoveToNextSibling() { RealFoliate(); if (_node != null) { if (_column != null) { if (_fOnValue) { return false; } DataRow row = Row; for (DataColumn dataColumn = NextColumn(row, _column, fAttribute: false); dataColumn != null; dataColumn = NextColumn(row, dataColumn, fAttribute: false)) { if (IsValidChild(_node, dataColumn)) { MoveTo(_node, dataColumn, _doc.IsTextOnly(dataColumn)); return true; } } XmlNode xmlNode = _doc.SafeFirstChild(_node); if (xmlNode != null) { MoveTo(xmlNode); return true; } } else { XmlNode xmlNode2 = _node; XmlNode parentNode = _node.ParentNode; if (parentNode == null) { return false; } bool flag = XmlDataDocument.IsTextNode(_node.NodeType); do { xmlNode2 = _doc.SafeNextSibling(xmlNode2); } while ((xmlNode2 != null && flag && XmlDataDocument.IsTextNode(xmlNode2.NodeType)) || (xmlNode2 != null && !IsValidChild(parentNode, xmlNode2))); if (xmlNode2 != null) { MoveTo(xmlNode2); return true; } } } return false; } internal bool MoveToPreviousSibling() { RealFoliate(); if (_node != null) { if (_column != null) { if (_fOnValue) { return false; } DataRow row = Row; for (DataColumn dataColumn = PreviousColumn(row, _column, fAttribute: false); dataColumn != null; dataColumn = PreviousColumn(row, dataColumn, fAttribute: false)) { if (IsValidChild(_node, dataColumn)) { MoveTo(_node, dataColumn, _doc.IsTextOnly(dataColumn)); return true; } } } else { XmlNode xmlNode = _node; XmlNode parentNode = _node.ParentNode; if (parentNode == null) { return false; } bool flag = XmlDataDocument.IsTextNode(_node.NodeType); do { xmlNode = _doc.SafePreviousSibling(xmlNode); } while ((xmlNode != null && flag && XmlDataDocument.IsTextNode(xmlNode.NodeType)) || (xmlNode != null && !IsValidChild(parentNode, xmlNode))); if (xmlNode != null) { MoveTo(xmlNode); return true; } if (!IsFoliated(parentNode) && parentNode is XmlBoundElement) { DataRow row2 = ((XmlBoundElement)parentNode).Row; if (row2 != null) { DataColumn dataColumn2 = PreviousColumn(row2, null, fAttribute: false); if (dataColumn2 != null) { MoveTo(parentNode, dataColumn2, _doc.IsTextOnly(dataColumn2)); return true; } } } } } return false; } internal bool MoveToFirst() { RealFoliate(); if (_node != null) { DataRow dataRow = null; XmlNode xmlNode = null; if (_column != null) { dataRow = Row; xmlNode = _node; } else { xmlNode = _node.ParentNode; if (xmlNode == null) { return false; } if (!IsFoliated(xmlNode) && xmlNode is XmlBoundElement) { dataRow = ((XmlBoundElement)xmlNode).Row; } } if (dataRow != null) { for (DataColumn dataColumn = NextColumn(dataRow, null, fAttribute: false); dataColumn != null; dataColumn = NextColumn(dataRow, dataColumn, fAttribute: false)) { if (IsValidChild(_node, dataColumn)) { MoveTo(_node, dataColumn, _doc.IsTextOnly(dataColumn)); return true; } } } for (XmlNode xmlNode2 = _doc.SafeFirstChild(xmlNode); xmlNode2 != null; xmlNode2 = _doc.SafeNextSibling(xmlNode2)) { if (IsValidChild(xmlNode, xmlNode2)) { MoveTo(xmlNode2); return true; } } } return false; } internal bool MoveToFirstChild() { RealFoliate(); if (_node == null) { return false; } if (_column != null) { if (_column.ColumnMapping == MappingType.Attribute || _column.ColumnMapping == MappingType.Hidden) { return false; } if (_fOnValue) { return false; } _fOnValue = true; return true; } if (!IsFoliated(_node)) { DataRow row = Row; for (DataColumn dataColumn = NextColumn(row, null, fAttribute: false); dataColumn != null; dataColumn = NextColumn(row, dataColumn, fAttribute: false)) { if (IsValidChild(_node, dataColumn)) { MoveTo(_node, dataColumn, _doc.IsTextOnly(dataColumn)); return true; } } } for (XmlNode xmlNode = _doc.SafeFirstChild(_node); xmlNode != null; xmlNode = _doc.SafeNextSibling(xmlNode)) { if (IsValidChild(_node, xmlNode)) { MoveTo(xmlNode); return true; } } return false; } internal bool MoveToParent() { RealFoliate(); if (NodeType == XPathNodeType.Namespace) { MoveTo(_parentOfNS); return true; } if (_node != null) { if (_column != null) { if (_fOnValue && !_doc.IsTextOnly(_column)) { MoveTo(_node, _column, fOnValue: false); return true; } MoveTo(_node, null, fOnValue: false); return true; } XmlNode xmlNode = null; xmlNode = ((_node.NodeType != XmlNodeType.Attribute) ? _node.ParentNode : ((XmlAttribute)_node).OwnerElement); if (xmlNode != null) { MoveTo(xmlNode); return true; } } return false; } private XmlNode GetParent(XmlNode node) { return ConvertNodeType(node) switch { XPathNodeType.Namespace => _parentOfNS, XPathNodeType.Attribute => ((XmlAttribute)node).OwnerElement, _ => node.ParentNode, }; } internal void MoveToRoot() { XmlNode node = _node; for (XmlNode xmlNode = _node; xmlNode != null; xmlNode = GetParent(xmlNode)) { node = xmlNode; } _node = node; _column = null; _fOnValue = false; } internal bool IsSamePosition(XPathNodePointer pointer) { RealFoliate(); pointer.RealFoliate(); if (_column == null && pointer._column == null) { if (pointer._node == _node) { return pointer._parentOfNS == _parentOfNS; } return false; } if (pointer._doc == _doc && pointer._node == _node && pointer._column == _column && pointer._fOnValue == _fOnValue) { return pointer._parentOfNS == _parentOfNS; } return false; } private XmlNodeOrder CompareNamespacePosition(XPathNodePointer other) { XPathNodePointer xPathNodePointer = Clone((DataDocumentXPathNavigator)_owner.Target); other.Clone((DataDocumentXPathNavigator)other._owner.Target); while (xPathNodePointer.MoveToNextNamespace(XPathNamespaceScope.All)) { if (xPathNodePointer.IsSamePosition(other)) { return XmlNodeOrder.Before; } } return XmlNodeOrder.After; } private static XmlNode GetRoot(XmlNode node, ref int depth) { depth = 0; XmlNode xmlNode = node; XmlNode xmlNode2 = ((xmlNode.NodeType == XmlNodeType.Attribute) ? ((XmlAttribute)xmlNode).OwnerElement : xmlNode.ParentNode); while (xmlNode2 != null) { xmlNode = xmlNode2; xmlNode2 = xmlNode.ParentNode; depth++; } return xmlNode; } internal XmlNodeOrder ComparePosition(XPathNodePointer other) { RealFoliate(); other.RealFoliate(); if (IsSamePosition(other)) { return XmlNodeOrder.Same; } XmlNode xmlNode = null; XmlNode xmlNode2 = null; if (NodeType == XPathNodeType.Namespace && other.NodeType == XPathNodeType.Namespace) { if (_parentOfNS == other._parentOfNS) { return CompareNamespacePosition(other); } xmlNode = _parentOfNS; xmlNode2 = other._parentOfNS; } else if (NodeType == XPathNodeType.Namespace) { if (_parentOfNS == other._node) { if (other._column == null) { return XmlNodeOrder.After; } return XmlNodeOrder.Before; } xmlNode = _parentOfNS; xmlNode2 = other._node; } else if (other.NodeType == XPathNodeType.Namespace) { if (_node == other._parentOfNS) { if (_column == null) { return XmlNodeOrder.Before; } return XmlNodeOrder.After; } xmlNode = _node; xmlNode2 = other._parentOfNS; } else { if (_node == other._node) { if (_column == other._column) { if (_fOnValue) { return XmlNodeOrder.After; } return XmlNodeOrder.Before; } if (_column == null) { return XmlNodeOrder.Before; } if (other._column == null) { return XmlNodeOrder.After; } if (_column.Ordinal < other._column.Ordinal) { return XmlNodeOrder.Before; } return XmlNodeOrder.After; } xmlNode = _node; xmlNode2 = other._node; } if (xmlNode == null || xmlNode2 == null) { return XmlNodeOrder.Unknown; } int depth = -1; int depth2 = -1; XmlNode root = GetRoot(xmlNode, ref depth); XmlNode root2 = GetRoot(xmlNode2, ref depth2); if (root != root2) { return XmlNodeOrder.Unknown; } if (depth > depth2) { while (xmlNode != null && depth > depth2) { xmlNode = ((xmlNode.NodeType == XmlNodeType.Attribute) ? ((XmlAttribute)xmlNode).OwnerElement : xmlNode.ParentNode); depth--; } if (xmlNode == xmlNode2) { return XmlNodeOrder.After; } } else if (depth2 > depth) { while (xmlNode2 != null && depth2 > depth) { xmlNode2 = ((xmlNode2.NodeType == XmlNodeType.Attribute) ? ((XmlAttribute)xmlNode2).OwnerElement : xmlNode2.ParentNode); depth2--; } if (xmlNode == xmlNode2) { return XmlNodeOrder.Before; } } XmlNode xmlNode3 = GetParent(xmlNode); XmlNode xmlNode4 = GetParent(xmlNode2); XmlNode xmlNode5 = null; while (xmlNode3 != null && xmlNode4 != null) { if (xmlNode3 == xmlNode4) { while (xmlNode != null) { xmlNode5 = xmlNode.NextSibling; if (xmlNode5 == xmlNode2) { return XmlNodeOrder.Before; } xmlNode = xmlNode5; } return XmlNodeOrder.After; } xmlNode = xmlNode3; xmlNode2 = xmlNode4; xmlNode3 = xmlNode.ParentNode; xmlNode4 = xmlNode2.ParentNode; } return XmlNodeOrder.Unknown; } bool IXmlDataVirtualNode.IsOnNode(XmlNode nodeToCheck) { RealFoliate(); return nodeToCheck == _node; } bool IXmlDataVirtualNode.IsOnColumn(DataColumn col) { RealFoliate(); return col == _column; } void IXmlDataVirtualNode.OnFoliated(XmlNode foliatedNode) { if (_node == foliatedNode && _column != null) { _bNeedFoliate = true; } } private void RealFoliate() { if (!_bNeedFoliate) { return; } _bNeedFoliate = false; XmlNode xmlNode = null; if (_doc.IsTextOnly(_column)) { xmlNode = _node.FirstChild; } else { if (_column.ColumnMapping == MappingType.Attribute) { xmlNode = _node.Attributes.GetNamedItem(_column.EncodedColumnName, _column.Namespace); } else { xmlNode = _node.FirstChild; while (xmlNode != null && (!(xmlNode.LocalName == _column.EncodedColumnName) || !(xmlNode.NamespaceURI == _column.Namespace))) { xmlNode = xmlNode.NextSibling; } } if (xmlNode != null && _fOnValue) { xmlNode = xmlNode.FirstChild; } } if (xmlNode == null) { throw new InvalidOperationException("Invalid foliation."); } _node = xmlNode; _column = null; _fOnValue = false; _bNeedFoliate = false; } private string GetNamespace(XmlBoundElement be, string name) { if (be == null) { return null; } XmlAttribute xmlAttribute = null; if (be.IsFoliated) { return be.GetAttributeNode(name, "http://www.w3.org/2000/xmlns/")?.Value; } DataRow row = be.Row; if (row == null) { return null; } for (DataColumn dataColumn = PreviousColumn(row, null, fAttribute: true); dataColumn != null; dataColumn = PreviousColumn(row, dataColumn, fAttribute: true)) { if (dataColumn.Namespace == "http://www.w3.org/2000/xmlns/") { DataRowVersion version = ((row.RowState == DataRowState.Detached) ? DataRowVersion.Proposed : DataRowVersion.Current); return dataColumn.ConvertObjectToXml(row[dataColumn, version]); } } return null; } internal string GetNamespace(string name) { switch (name) { case "xml": return "http://www.w3.org/XML/1998/namespace"; case "xmlns": return "http://www.w3.org/2000/xmlns/"; default: if (name.Length == 0) { name = "xmlns"; } break; case null: break; } RealFoliate(); XmlNode xmlNode = _node; XmlNodeType nodeType = xmlNode.NodeType; string text = null; while (xmlNode != null) { while (xmlNode != null && (nodeType = xmlNode.NodeType) != XmlNodeType.Element) { xmlNode = ((nodeType != XmlNodeType.Attribute) ? xmlNode.ParentNode : ((XmlAttribute)xmlNode).OwnerElement); } if (xmlNode != null) { text = GetNamespace((XmlBoundElement)xmlNode, name); if (text != null) { return text; } xmlNode = xmlNode.ParentNode; } } return string.Empty; } internal bool MoveToNamespace(string name) { _parentOfNS = _node as XmlBoundElement; if (_parentOfNS == null) { return false; } string text = name; if (text == "xmlns") { text = "xmlns:xmlns"; } if (text != null && text.Length == 0) { text = "xmlns"; } RealFoliate(); XmlNode xmlNode = _node; _ = xmlNode.NodeType; XmlAttribute xmlAttribute = null; XmlBoundElement xmlBoundElement = null; while (xmlNode != null) { if (xmlNode is XmlBoundElement xmlBoundElement2) { if (xmlBoundElement2.IsFoliated) { xmlAttribute = xmlBoundElement2.GetAttributeNode(name, "http://www.w3.org/2000/xmlns/"); if (xmlAttribute != null) { MoveTo(xmlAttribute); return true; } } else { DataRow row = xmlBoundElement2.Row; if (row == null) { return false; } for (DataColumn dataColumn = PreviousColumn(row, null, fAttribute: true); dataColumn != null; dataColumn = PreviousColumn(row, dataColumn, fAttribute: true)) { if (dataColumn.Namespace == "http://www.w3.org/2000/xmlns/" && dataColumn.ColumnName == name) { MoveTo(xmlBoundElement2, dataColumn, fOnValue: false); return true; } } } } do { xmlNode = xmlNode.ParentNode; } while (xmlNode != null && xmlNode.NodeType != XmlNodeType.Element); } _parentOfNS = null; return false; } private bool MoveToNextNamespace(XmlBoundElement be, DataColumn col, XmlAttribute curAttr) { if (be != null) { if (be.IsFoliated) { XmlAttributeCollection attributes = be.Attributes; XmlAttribute xmlAttribute = null; bool flag = false; if (curAttr == null) { flag = true; } int num = attributes.Count; while (num > 0) { num--; xmlAttribute = attributes[num]; if (flag && xmlAttribute.NamespaceURI == "http://www.w3.org/2000/xmlns/" && !DuplicateNS(be, xmlAttribute.LocalName)) { MoveTo(xmlAttribute); return true; } if (xmlAttribute == curAttr) { flag = true; } } } else { DataRow row = be.Row; if (row == null) { return false; } for (DataColumn dataColumn = PreviousColumn(row, col, fAttribute: true); dataColumn != null; dataColumn = PreviousColumn(row, dataColumn, fAttribute: true)) { if (dataColumn.Namespace == "http://www.w3.org/2000/xmlns/" && !DuplicateNS(be, dataColumn.ColumnName)) { MoveTo(be, dataColumn, fOnValue: false); return true; } } } } return false; } internal bool MoveToFirstNamespace(XPathNamespaceScope namespaceScope) { RealFoliate(); _parentOfNS = _node as XmlBoundElement; if (_parentOfNS == null) { return false; } XmlNode xmlNode = _node; XmlBoundElement xmlBoundElement = null; while (true) { if (xmlNode != null) { xmlBoundElement = xmlNode as XmlBoundElement; if (MoveToNextNamespace(xmlBoundElement, null, null)) { return true; } if (namespaceScope == XPathNamespaceScope.Local) { break; } do { xmlNode = xmlNode.ParentNode; } while (xmlNode != null && xmlNode.NodeType != XmlNodeType.Element); continue; } if (namespaceScope != 0) { break; } MoveTo(_doc._attrXml, null, fOnValue: false); return true; } _parentOfNS = null; return false; } private bool DuplicateNS(XmlBoundElement endElem, string lname) { if (_parentOfNS == null || endElem == null) { return false; } XmlBoundElement xmlBoundElement = _parentOfNS; XmlNode xmlNode = null; while (xmlBoundElement != null && xmlBoundElement != endElem) { if (GetNamespace(xmlBoundElement, lname) != null) { return true; } xmlNode = xmlBoundElement; do { xmlNode = xmlNode.ParentNode; } while (xmlNode != null && xmlNode.NodeType != XmlNodeType.Element); xmlBoundElement = xmlNode as XmlBoundElement; } return false; } internal bool MoveToNextNamespace(XPathNamespaceScope namespaceScope) { RealFoliate(); XmlNode xmlNode = _node; if (_column != null) { if (namespaceScope == XPathNamespaceScope.Local && _parentOfNS != _node) { return false; } XmlBoundElement xmlBoundElement = _node as XmlBoundElement; DataRow row = xmlBoundElement.Row; for (DataColumn dataColumn = PreviousColumn(row, _column, fAttribute: true); dataColumn != null; dataColumn = PreviousColumn(row, dataColumn, fAttribute: true)) { if (dataColumn.Namespace == "http://www.w3.org/2000/xmlns/") { MoveTo(xmlBoundElement, dataColumn, fOnValue: false); return true; } } if (namespaceScope == XPathNamespaceScope.Local) { return false; } do { xmlNode = xmlNode.ParentNode; } while (xmlNode != null && xmlNode.NodeType != XmlNodeType.Element); } else if (_node.NodeType == XmlNodeType.Attribute) { XmlAttribute xmlAttribute = (XmlAttribute)_node; xmlNode = xmlAttribute.OwnerElement; if (xmlNode == null) { return false; } if (namespaceScope == XPathNamespaceScope.Local && _parentOfNS != xmlNode) { return false; } if (MoveToNextNamespace((XmlBoundElement)xmlNode, null, xmlAttribute)) { return true; } if (namespaceScope == XPathNamespaceScope.Local) { return false; } do { xmlNode = xmlNode.ParentNode; } while (xmlNode != null && xmlNode.NodeType != XmlNodeType.Element); } while (xmlNode != null) { XmlBoundElement be = xmlNode as XmlBoundElement; if (MoveToNextNamespace(be, null, null)) { return true; } do { xmlNode = xmlNode.ParentNode; } while (xmlNode != null && xmlNode.NodeType == XmlNodeType.Element); } if (namespaceScope == XPathNamespaceScope.All) { MoveTo(_doc._attrXml, null, fOnValue: false); return true; } return false; } [Conditional("DEBUG")] private void AssertValid() { if (_column != null) { _ = (_node as XmlBoundElement).Row.RowState; _ = 1; } _ = _column; } bool IXmlDataVirtualNode.IsInUse() { return _owner.IsAlive; } } internal enum ElementState { None, Defoliated, WeakFoliation, StrongFoliation, Foliating, Defoliating } internal sealed class XmlBoundElement : XmlElement { private DataRow _row; private ElementState _state; public override XmlAttributeCollection Attributes { get { AutoFoliate(); return base.Attributes; } } public override bool HasAttributes => Attributes.Count > 0; public override XmlNode FirstChild { get { AutoFoliate(); return base.FirstChild; } } internal XmlNode SafeFirstChild => base.FirstChild; public override XmlNode LastChild { get { AutoFoliate(); return base.LastChild; } } public override XmlNode PreviousSibling { get { XmlNode previousSibling = base.PreviousSibling; if (previousSibling == null && ParentNode is XmlBoundElement xmlBoundElement) { xmlBoundElement.AutoFoliate(); return base.PreviousSibling; } return previousSibling; } } internal XmlNode SafePreviousSibling => base.PreviousSibling; public override XmlNode NextSibling { get { XmlNode nextSibling = base.NextSibling; if (nextSibling == null && ParentNode is XmlBoundElement xmlBoundElement) { xmlBoundElement.AutoFoliate(); return base.NextSibling; } return nextSibling; } } internal XmlNode SafeNextSibling => base.NextSibling; public override bool HasChildNodes { get { AutoFoliate(); return base.HasChildNodes; } } public override string InnerXml { get { return base.InnerXml; } set { RemoveAllChildren(); XmlDataDocument obj = (XmlDataDocument)OwnerDocument; bool ignoreXmlEvents = obj.IgnoreXmlEvents; bool ignoreDataSetEvents = obj.IgnoreDataSetEvents; obj.IgnoreXmlEvents = true; obj.IgnoreDataSetEvents = true; base.InnerXml = value; obj.SyncTree(this); obj.IgnoreDataSetEvents = ignoreDataSetEvents; obj.IgnoreXmlEvents = ignoreXmlEvents; } } internal DataRow Row { get { return _row; } set { _row = value; } } internal bool IsFoliated { get { while (_state == ElementState.Foliating || _state == ElementState.Defoliating) { Thread.Sleep(0); } return _state != ElementState.Defoliated; } } internal ElementState ElementState { get { return _state; } set { _state = value; } } internal XmlBoundElement(string prefix, string localName, string namespaceURI, XmlDocument doc) : base(prefix, localName, namespaceURI, doc) { _state = ElementState.None; } public override XmlNode InsertBefore(XmlNode newChild, XmlNode refChild) { AutoFoliate(); return base.InsertBefore(newChild, refChild); } public override XmlNode InsertAfter(XmlNode newChild, XmlNode refChild) { AutoFoliate(); return base.InsertAfter(newChild, refChild); } public override XmlNode ReplaceChild(XmlNode newChild, XmlNode oldChild) { AutoFoliate(); return base.ReplaceChild(newChild, oldChild); } public override XmlNode AppendChild(XmlNode newChild) { AutoFoliate(); return base.AppendChild(newChild); } internal void RemoveAllChildren() { XmlNode xmlNode = FirstChild; while (xmlNode != null) { XmlNode? nextSibling = xmlNode.NextSibling; RemoveChild(xmlNode); xmlNode = nextSibling; } } internal void Foliate(ElementState newState) { ((XmlDataDocument)OwnerDocument)?.Foliate(this, newState); } private void AutoFoliate() { XmlDataDocument xmlDataDocument = (XmlDataDocument)OwnerDocument; xmlDataDocument?.Foliate(this, xmlDataDocument.AutoFoliationState); } public override XmlNode CloneNode(bool deep) { XmlDataDocument xmlDataDocument = (XmlDataDocument)OwnerDocument; ElementState autoFoliationState = xmlDataDocument.AutoFoliationState; xmlDataDocument.AutoFoliationState = ElementState.WeakFoliation; try { Foliate(ElementState.WeakFoliation); return (XmlElement)base.CloneNode(deep); } finally { xmlDataDocument.AutoFoliationState = autoFoliationState; } } public override void WriteContentTo(XmlWriter w) { DataPointer dataPointer = new DataPointer((XmlDataDocument)OwnerDocument, this); try { dataPointer.AddPointer(); WriteBoundElementContentTo(dataPointer, w); } finally { dataPointer.SetNoLongerUse(); } } public override void WriteTo(XmlWriter w) { DataPointer dataPointer = new DataPointer((XmlDataDocument)OwnerDocument, this); try { dataPointer.AddPointer(); WriteRootBoundElementTo(dataPointer, w); } finally { dataPointer.SetNoLongerUse(); } } private void WriteRootBoundElementTo(DataPointer dp, XmlWriter w) { XmlDataDocument xmlDataDocument = (XmlDataDocument)OwnerDocument; w.WriteStartElement(dp.Prefix, dp.LocalName, dp.NamespaceURI); int attributeCount = dp.AttributeCount; bool flag = false; if (attributeCount > 0) { for (int i = 0; i < attributeCount; i++) { dp.MoveToAttribute(i); if (dp.Prefix == "xmlns" && dp.LocalName == "xsi") { flag = true; } WriteTo(dp, w); dp.MoveToOwnerElement(); } } if (!flag && xmlDataDocument._bLoadFromDataSet && xmlDataDocument._bHasXSINIL) { w.WriteAttributeString("xmlns", "xsi", "http://www.w3.org/2000/xmlns/", "http://www.w3.org/2001/XMLSchema-instance"); } WriteBoundElementContentTo(dp, w); if (dp.IsEmptyElement) { w.WriteEndElement(); } else { w.WriteFullEndElement(); } } private static void WriteBoundElementTo(DataPointer dp, XmlWriter w) { w.WriteStartElement(dp.Prefix, dp.LocalName, dp.NamespaceURI); int attributeCount = dp.AttributeCount; if (attributeCount > 0) { for (int i = 0; i < attributeCount; i++) { dp.MoveToAttribute(i); WriteTo(dp, w); dp.MoveToOwnerElement(); } } WriteBoundElementContentTo(dp, w); if (dp.IsEmptyElement) { w.WriteEndElement(); } else { w.WriteFullEndElement(); } } private static void WriteBoundElementContentTo(DataPointer dp, XmlWriter w) { if (!dp.IsEmptyElement && dp.MoveToFirstChild()) { do { WriteTo(dp, w); } while (dp.MoveToNextSibling()); dp.MoveToParent(); } } private static void WriteTo(DataPointer dp, XmlWriter w) { switch (dp.NodeType) { case XmlNodeType.Attribute: if (dp.IsDefault) { break; } w.WriteStartAttribute(dp.Prefix, dp.LocalName, dp.NamespaceURI); if (dp.MoveToFirstChild()) { do { WriteTo(dp, w); } while (dp.MoveToNextSibling()); dp.MoveToParent(); } w.WriteEndAttribute(); break; case XmlNodeType.Element: WriteBoundElementTo(dp, w); break; case XmlNodeType.Text: w.WriteString(dp.Value); break; default: if (dp.GetNode() != null) { dp.GetNode().WriteTo(w); } break; } } public override XmlNodeList GetElementsByTagName(string name) { XmlNodeList elementsByTagName = base.GetElementsByTagName(name); _ = elementsByTagName.Count; return elementsByTagName; } } [Obsolete("XmlDataDocument class will be removed in a future release.")] public class XmlDataDocument : XmlDocument { private DataSet _dataSet; private DataSetMapper _mapper; internal Hashtable _pointers; private int _countAddPointer; private ArrayList _columnChangeList; private DataRowState _rollbackState; private bool _fBoundToDataSet; private bool _fBoundToDocument; private bool _fDataRowCreatedSpecial; private bool _ignoreXmlEvents; private bool _ignoreDataSetEvents; private bool _isFoliationEnabled; private bool _optimizeStorage; private ElementState _autoFoliationState; private bool _fAssociateDataRow; private object _foliationLock; internal const string XSI_NIL = "xsi:nil"; internal const string XSI = "xsi"; private bool _bForceExpandEntity; internal XmlAttribute _attrXml; internal bool _bLoadFromDataSet; internal bool _bHasXSINIL; internal ElementState AutoFoliationState { get { return _autoFoliationState; } set { _autoFoliationState = value; } } public DataSet DataSet => _dataSet; internal bool IgnoreXmlEvents { get { return _ignoreXmlEvents; } set { _ignoreXmlEvents = value; } } internal bool IgnoreDataSetEvents { get { return _ignoreDataSetEvents; } set { _ignoreDataSetEvents = value; } } internal bool IsFoliationEnabled { get { return _isFoliationEnabled; } set { _isFoliationEnabled = value; } } internal DataSetMapper Mapper => _mapper; internal void AddPointer(IXmlDataVirtualNode pointer) { lock (_pointers) { _countAddPointer++; if (_countAddPointer >= 5) { ArrayList arrayList = new ArrayList(); foreach (DictionaryEntry pointer2 in _pointers) { IXmlDataVirtualNode xmlDataVirtualNode = (IXmlDataVirtualNode)pointer2.Value; if (!xmlDataVirtualNode.IsInUse()) { arrayList.Add(xmlDataVirtualNode); } } for (int i = 0; i < arrayList.Count; i++) { _pointers.Remove(arrayList[i]); } _countAddPointer = 0; } _pointers[pointer] = pointer; } } [Conditional("DEBUG")] internal void AssertPointerPresent(IXmlDataVirtualNode pointer) { } private void AttachDataSet(DataSet ds) { if (ds.FBoundToDocument) { throw new ArgumentException("DataSet can be associated with at most one XmlDataDocument. Cannot associate the DataSet with the current XmlDataDocument because the DataSet is already associated with another XmlDataDocument."); } ds.FBoundToDocument = true; _dataSet = ds; BindSpecialListeners(); } internal void SyncRows(DataRow parentRow, XmlNode node, bool fAddRowsToTable) { if (node is XmlBoundElement xmlBoundElement) { DataRow row = xmlBoundElement.Row; if (row != null && xmlBoundElement.ElementState == ElementState.Defoliated) { return; } if (row != null) { SynchronizeRowFromRowElement(xmlBoundElement); xmlBoundElement.ElementState = ElementState.WeakFoliation; DefoliateRegion(xmlBoundElement); if (parentRow != null) { SetNestedParentRow(row, parentRow); } if (fAddRowsToTable && row.RowState == DataRowState.Detached) { row.Table.Rows.Add(row); } parentRow = row; } } for (XmlNode xmlNode = node.FirstChild; xmlNode != null; xmlNode = xmlNode.NextSibling) { SyncRows(parentRow, xmlNode, fAddRowsToTable); } } internal void SyncTree(XmlNode node) { XmlBoundElement rowElem = null; _mapper.GetRegion(node, out rowElem); DataRow parentRow = null; bool flag = IsConnected(node); if (rowElem != null) { DataRow row = rowElem.Row; if (row != null && rowElem.ElementState == ElementState.Defoliated) { return; } if (row != null) { SynchronizeRowFromRowElement(rowElem); if (node == rowElem) { rowElem.ElementState = ElementState.WeakFoliation; DefoliateRegion(rowElem); } if (flag && row.RowState == DataRowState.Detached) { row.Table.Rows.Add(row); } parentRow = row; } } for (XmlNode xmlNode = node.FirstChild; xmlNode != null; xmlNode = xmlNode.NextSibling) { SyncRows(parentRow, xmlNode, flag); } } private void BindForLoad() { _ignoreDataSetEvents = true; _mapper.SetupMapping(this, _dataSet); if (_dataSet.Tables.Count > 0) { LoadDataSetFromTree(); } BindListeners(); _ignoreDataSetEvents = false; } private void Bind(bool fLoadFromDataSet) { _ignoreDataSetEvents = true; _ignoreXmlEvents = true; _mapper.SetupMapping(this, _dataSet); if (base.DocumentElement != null) { LoadDataSetFromTree(); BindListeners(); } else if (fLoadFromDataSet) { _bLoadFromDataSet = true; LoadTreeFromDataSet(DataSet); BindListeners(); } _ignoreDataSetEvents = false; _ignoreXmlEvents = false; } internal void Bind(DataRow r, XmlBoundElement e) { r.Element = e; e.Row = r; } private void BindSpecialListeners() { _dataSet.DataRowCreated += OnDataRowCreatedSpecial; _fDataRowCreatedSpecial = true; } private void UnBindSpecialListeners() { _dataSet.DataRowCreated -= OnDataRowCreatedSpecial; _fDataRowCreatedSpecial = false; } private void BindListeners() { BindToDocument(); BindToDataSet(); } private void BindToDataSet() { if (_fBoundToDataSet) { return; } if (_fDataRowCreatedSpecial) { UnBindSpecialListeners(); } _dataSet.Tables.CollectionChanging += OnDataSetTablesChanging; _dataSet.Relations.CollectionChanging += OnDataSetRelationsChanging; _dataSet.DataRowCreated += OnDataRowCreated; _dataSet.PropertyChanging += OnDataSetPropertyChanging; _dataSet.ClearFunctionCalled += OnClearCalled; if (_dataSet.Tables.Count > 0) { foreach (DataTable table in _dataSet.Tables) { BindToTable(table); } } foreach (DataRelation relation in _dataSet.Relations) { relation.PropertyChanging += OnRelationPropertyChanging; } _fBoundToDataSet = true; } private void BindToDocument() { if (!_fBoundToDocument) { base.NodeInserting += OnNodeInserting; base.NodeInserted += OnNodeInserted; base.NodeRemoving += OnNodeRemoving; base.NodeRemoved += OnNodeRemoved; base.NodeChanging += OnNodeChanging; base.NodeChanged += OnNodeChanged; _fBoundToDocument = true; } } private void BindToTable(DataTable t) { t.ColumnChanged += OnColumnChanged; t.RowChanging += OnRowChanging; t.RowChanged += OnRowChanged; t.RowDeleting += OnRowChanging; t.RowDeleted += OnRowChanged; t.PropertyChanging += OnTablePropertyChanging; t.Columns.CollectionChanging += OnTableColumnsChanging; foreach (DataColumn column in t.Columns) { column.PropertyChanging += OnColumnPropertyChanging; } } public override XmlElement CreateElement(string prefix, string localName, string namespaceURI) { if (prefix == null) { prefix = string.Empty; } if (namespaceURI == null) { namespaceURI = string.Empty; } if (!_fAssociateDataRow) { return new XmlBoundElement(prefix, localName, namespaceURI, this); } EnsurePopulatedMode(); DataTable dataTable = _mapper.SearchMatchingTableSchema(localName, namespaceURI); if (dataTable != null) { DataRow dataRow = dataTable.CreateEmptyRow(); foreach (DataColumn column in dataTable.Columns) { if (column.ColumnMapping != MappingType.Hidden) { SetRowValueToNull(dataRow, column); } } XmlBoundElement element = dataRow.Element; element.Prefix = prefix; return element; } return new XmlBoundElement(prefix, localName, namespaceURI, this); } public override XmlEntityReference CreateEntityReference(string name) { throw new NotSupportedException("Cannot create entity references on DataDocument."); } private void DefoliateRegion(XmlBoundElement rowElem) { if (!_optimizeStorage || rowElem.ElementState != ElementState.WeakFoliation || !_mapper.IsRegionRadical(rowElem)) { return; } bool ignoreXmlEvents = IgnoreXmlEvents; IgnoreXmlEvents = true; rowElem.ElementState = ElementState.Defoliating; try { rowElem.RemoveAllAttributes(); XmlNode xmlNode = rowElem.FirstChild; while (xmlNode != null) { XmlNode nextSibling = xmlNode.NextSibling; if (xmlNode is XmlBoundElement xmlBoundElement && xmlBoundElement.Row != null) { break; } rowElem.RemoveChild(xmlNode); xmlNode = nextSibling; } rowElem.ElementState = ElementState.Defoliated; } finally { IgnoreXmlEvents = ignoreXmlEvents; } } private XmlElement EnsureDocumentElement() { XmlElement xmlElement = base.DocumentElement; if (xmlElement == null) { string text = XmlConvert.EncodeLocalName(DataSet.DataSetName); if (text == null || text.Length == 0) { text = "Xml"; } string text2 = DataSet.Namespace; if (text2 == null) { text2 = string.Empty; } xmlElement = new XmlBoundElement(string.Empty, text, text2, this); AppendChild(xmlElement); } return xmlElement; } private XmlElement EnsureNonRowDocumentElement() { XmlElement documentElement = base.DocumentElement; if (documentElement == null) { return EnsureDocumentElement(); } if (GetRowFromElement(documentElement) == null) { return documentElement; } return DemoteDocumentElement(); } private XmlElement DemoteDocumentElement() { XmlElement documentElement = base.DocumentElement; RemoveChild(documentElement); XmlElement xmlElement = EnsureDocumentElement(); xmlElement.AppendChild(documentElement); return xmlElement; } private void EnsurePopulatedMode() { if (_fDataRowCreatedSpecial) { UnBindSpecialListeners(); _mapper.SetupMapping(this, _dataSet); BindListeners(); _fAssociateDataRow = true; } } private void FixNestedChildren(DataRow row, XmlElement rowElement) { foreach (DataRelation nestedChildRelation in GetNestedChildRelations(row)) { DataRow[] childRows = row.GetChildRows(nestedChildRelation); for (int i = 0; i < childRows.Length; i++) { XmlElement element = childRows[i].Element; if (element != null && element.ParentNode != rowElement) { element.ParentNode.RemoveChild(element); rowElement.AppendChild(element); } } } } internal void Foliate(XmlBoundElement node, ElementState newState) { if (IsFoliationEnabled) { if (node.ElementState == ElementState.Defoliated) { ForceFoliation(node, newState); } else if (node.ElementState == ElementState.WeakFoliation && newState == ElementState.StrongFoliation) { node.ElementState = newState; } } } private void Foliate(XmlElement element) { if (element is XmlBoundElement) { ((XmlBoundElement)element).Foliate(ElementState.WeakFoliation); } } private void FoliateIfDataPointers(DataRow row, XmlElement rowElement) { if (!IsFoliated(rowElement) && HasPointers(rowElement)) { bool isFoliationEnabled = IsFoliationEnabled; IsFoliationEnabled = true; try { Foliate(rowElement); } finally { IsFoliationEnabled = isFoliationEnabled; } } } private void EnsureFoliation(XmlBoundElement rowElem, ElementState foliation) { if (!rowElem.IsFoliated) { ForceFoliation(rowElem, foliation); } } private void ForceFoliation(XmlBoundElement node, ElementState newState) { lock (_foliationLock) { if (node.ElementState != ElementState.Defoliated) { return; } node.ElementState = ElementState.Foliating; bool ignoreXmlEvents = IgnoreXmlEvents; IgnoreXmlEvents = true; try { XmlNode xmlNode = null; DataRow row = node.Row; DataRowVersion version = ((row.RowState == DataRowState.Detached) ? DataRowVersion.Proposed : DataRowVersion.Current); foreach (DataColumn column in row.Table.Columns) { if (IsNotMapped(column)) { continue; } object value = row[column, version]; if (!Convert.IsDBNull(value)) { if (column.ColumnMapping == MappingType.Attribute) { node.SetAttribute(column.EncodedColumnName, column.Namespace, column.ConvertObjectToXml(value)); continue; } XmlNode xmlNode2 = null; if (column.ColumnMapping == MappingType.Element) { xmlNode2 = new XmlBoundElement(string.Empty, column.EncodedColumnName, column.Namespace, this); xmlNode2.AppendChild(CreateTextNode(column.ConvertObjectToXml(value))); if (xmlNode != null) { node.InsertAfter(xmlNode2, xmlNode); } else if (node.FirstChild != null) { node.InsertBefore(xmlNode2, node.FirstChild); } else { node.AppendChild(xmlNode2); } xmlNode = xmlNode2; } else { xmlNode2 = CreateTextNode(column.ConvertObjectToXml(value)); if (node.FirstChild != null) { node.InsertBefore(xmlNode2, node.FirstChild); } else { node.AppendChild(xmlNode2); } if (xmlNode == null) { xmlNode = xmlNode2; } } } else if (column.ColumnMapping == MappingType.SimpleContent) { XmlAttribute xmlAttribute = CreateAttribute("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance"); xmlAttribute.Value = "true"; node.SetAttributeNode(xmlAttribute); _bHasXSINIL = true; } } } finally { IgnoreXmlEvents = ignoreXmlEvents; node.ElementState = newState; } OnFoliated(node); } } private XmlNode GetColumnInsertAfterLocation(DataRow row, DataColumn col, XmlBoundElement rowElement) { XmlNode result = null; XmlNode xmlNode = null; if (IsTextOnly(col)) { return null; } xmlNode = rowElement.FirstChild; while (xmlNode != null && IsTextLikeNode(xmlNode)) { result = xmlNode; xmlNode = xmlNode.NextSibling; } while (xmlNode != null && xmlNode.NodeType == XmlNodeType.Element) { XmlElement e = xmlNode as XmlElement; if (_mapper.GetRowFromElement(e) != null) { break; } object columnSchemaForNode = _mapper.GetColumnSchemaForNode(rowElement, xmlNode); if (columnSchemaForNode == null || !(columnSchemaForNode is DataColumn) || ((DataColumn)columnSchemaForNode).Ordinal > col.Ordinal) { break; } result = xmlNode; xmlNode = xmlNode.NextSibling; } return result; } private ArrayList GetNestedChildRelations(DataRow row) { ArrayList arrayList = new ArrayList(); foreach (DataRelation childRelation in row.Table.ChildRelations) { if (childRelation.Nested) { arrayList.Add(childRelation); } } return arrayList; } private DataRow GetNestedParent(DataRow row) { DataRelation nestedParentRelation = GetNestedParentRelation(row); if (nestedParentRelation != null) { return row.GetParentRow(nestedParentRelation); } return null; } private static DataRelation GetNestedParentRelation(DataRow row) { DataRelation[] nestedParentRelations = row.Table.NestedParentRelations; if (nestedParentRelations.Length == 0) { return null; } return nestedParentRelations[0]; } private DataColumn GetTextOnlyColumn(DataRow row) { return row.Table.XmlText; } public DataRow GetRowFromElement(XmlElement e) { return _mapper.GetRowFromElement(e); } private XmlNode GetRowInsertBeforeLocation(DataRow row, XmlElement rowElement, XmlNode parentElement) { DataRow dataRow = row; int num = 0; for (num = 0; num < row.Table.Rows.Count && row != row.Table.Rows[num]; num++) { } int num2 = num; DataRow nestedParent = GetNestedParent(row); for (num = num2 + 1; num < row.Table.Rows.Count; num++) { dataRow = row.Table.Rows[num]; if (GetNestedParent(dataRow) == nestedParent && GetElementFromRow(dataRow).ParentNode == parentElement) { break; } } if (num < row.Table.Rows.Count) { return GetElementFromRow(dataRow); } return null; } public XmlElement GetElementFromRow(DataRow r) { return r.Element; } internal bool HasPointers(XmlNode node) { while (true) { try { if (_pointers.Count > 0) { foreach (DictionaryEntry pointer in _pointers) { if (((IXmlDataVirtualNode)pointer.Value).IsOnNode(node)) { return true; } } } return false; } catch (Exception e) when (ADP.IsCatchableExceptionType(e)) { } } } private bool IsFoliated(XmlElement element) { if (element is XmlBoundElement) { return ((XmlBoundElement)element).IsFoliated; } return true; } private bool IsFoliated(XmlBoundElement be) { return be.IsFoliated; } internal XmlNode CloneTree(DataPointer other) { EnsurePopulatedMode(); bool ignoreDataSetEvents = _ignoreDataSetEvents; bool ignoreXmlEvents = _ignoreXmlEvents; bool isFoliationEnabled = IsFoliationEnabled; bool fAssociateDataRow = _fAssociateDataRow; try { _ignoreDataSetEvents = true; _ignoreXmlEvents = true; IsFoliationEnabled = false; _fAssociateDataRow = false; XmlNode xmlNode = CloneTreeInternal(other); LoadRows(null, xmlNode); SyncRows(null, xmlNode, fAddRowsToTable: false); return xmlNode; } finally { _ignoreDataSetEvents = ignoreDataSetEvents; _ignoreXmlEvents = ignoreXmlEvents; IsFoliationEnabled = isFoliationEnabled; _fAssociateDataRow = fAssociateDataRow; } } private XmlNode CloneTreeInternal(DataPointer other) { XmlNode xmlNode = CloneNode(other); DataPointer dataPointer = new DataPointer(other); try { dataPointer.AddPointer(); if (xmlNode.NodeType == XmlNodeType.Element) { int attributeCount = dataPointer.AttributeCount; for (int i = 0; i < attributeCount; i++) { dataPointer.MoveToOwnerElement(); if (dataPointer.MoveToAttribute(i)) { xmlNode.Attributes.Append((XmlAttribute)CloneTreeInternal(dataPointer)); } } dataPointer.MoveTo(other); } bool flag = dataPointer.MoveToFirstChild(); while (flag) { xmlNode.AppendChild(CloneTreeInternal(dataPointer)); flag = dataPointer.MoveToNextSibling(); } return xmlNode; } finally { dataPointer.SetNoLongerUse(); } } public override XmlNode CloneNode(bool deep) { XmlDataDocument xmlDataDocument = (XmlDataDocument)base.CloneNode(deep: false); xmlDataDocument.Init(DataSet.Clone()); xmlDataDocument._dataSet.EnforceConstraints = _dataSet.EnforceConstraints; if (deep) { DataPointer dataPointer = new DataPointer(this, this); try { dataPointer.AddPointer(); bool flag = dataPointer.MoveToFirstChild(); while (flag) { XmlNode newChild = ((dataPointer.NodeType != XmlNodeType.Element) ? xmlDataDocument.CloneNode(dataPointer) : xmlDataDocument.CloneTree(dataPointer)); xmlDataDocument.AppendChild(newChild); flag = dataPointer.MoveToNextSibling(); } } finally { dataPointer.SetNoLongerUse(); } } return xmlDataDocument; } private XmlNode CloneNode(DataPointer dp) { return dp.NodeType switch { XmlNodeType.DocumentFragment => CreateDocumentFragment(), XmlNodeType.DocumentType => CreateDocumentType(dp.Name, dp.PublicId, dp.SystemId, dp.InternalSubset), XmlNodeType.XmlDeclaration => CreateXmlDeclaration(dp.Version, dp.Encoding, dp.Standalone), XmlNodeType.Text => CreateTextNode(dp.Value), XmlNodeType.CDATA => CreateCDataSection(dp.Value), XmlNodeType.ProcessingInstruction => CreateProcessingInstruction(dp.Name, dp.Value), XmlNodeType.Comment => CreateComment(dp.Value), XmlNodeType.Whitespace => CreateWhitespace(dp.Value), XmlNodeType.SignificantWhitespace => CreateSignificantWhitespace(dp.Value), XmlNodeType.Element => CreateElement(dp.Prefix, dp.LocalName, dp.NamespaceURI), XmlNodeType.Attribute => CreateAttribute(dp.Prefix, dp.LocalName, dp.NamespaceURI), XmlNodeType.EntityReference => CreateEntityReference(dp.Name), _ => throw new InvalidOperationException(SR.Format("This type of node cannot be cloned: {0}.", dp.NodeType.ToString())), }; } internal static bool IsTextLikeNode(XmlNode n) { switch (n.NodeType) { case XmlNodeType.Text: case XmlNodeType.CDATA: case XmlNodeType.Whitespace: case XmlNodeType.SignificantWhitespace: return true; case XmlNodeType.EntityReference: return false; default: return false; } } internal bool IsNotMapped(DataColumn c) { return DataSetMapper.IsNotMapped(c); } private bool IsSame(DataColumn c, int recNo1, int recNo2) { if (c.Compare(recNo1, recNo2) == 0) { return true; } return false; } internal bool IsTextOnly(DataColumn c) { return c.ColumnMapping == MappingType.SimpleContent; } public override void Load(string filename) { _bForceExpandEntity = true; base.Load(filename); _bForceExpandEntity = false; } public override void Load(Stream inStream) { _bForceExpandEntity = true; base.Load(inStream); _bForceExpandEntity = false; } public override void Load(TextReader txtReader) { _bForceExpandEntity = true; base.Load(txtReader); _bForceExpandEntity = false; } public override void Load(XmlReader reader) { if (FirstChild != null) { throw new InvalidOperationException("Cannot load XmlDataDocument if it already contains data. Please use a new XmlDataDocument."); } try { _ignoreXmlEvents = true; if (_fDataRowCreatedSpecial) { UnBindSpecialListeners(); } _fAssociateDataRow = false; _isFoliationEnabled = false; if (_bForceExpandEntity) { ((XmlTextReader)reader).EntityHandling = EntityHandling.ExpandEntities; } base.Load(reader); BindForLoad(); } finally { _ignoreXmlEvents = false; _isFoliationEnabled = true; _autoFoliationState = ElementState.StrongFoliation; _fAssociateDataRow = true; } } private void LoadDataSetFromTree() { _ignoreDataSetEvents = true; _ignoreXmlEvents = true; bool isFoliationEnabled = IsFoliationEnabled; IsFoliationEnabled = false; bool enforceConstraints = _dataSet.EnforceConstraints; _dataSet.EnforceConstraints = false; try { LoadRows(null, base.DocumentElement); SyncRows(null, base.DocumentElement, fAddRowsToTable: true); _dataSet.EnforceConstraints = enforceConstraints; } finally { _ignoreDataSetEvents = false; _ignoreXmlEvents = false; IsFoliationEnabled = isFoliationEnabled; } } private void LoadTreeFromDataSet(DataSet ds) { _ignoreDataSetEvents = true; _ignoreXmlEvents = true; bool isFoliationEnabled = IsFoliationEnabled; IsFoliationEnabled = false; _fAssociateDataRow = false; DataTable[] array = OrderTables(ds); try { for (int i = 0; i < array.Length; i++) { foreach (DataRow row in array[i].Rows) { AttachBoundElementToDataRow(row); switch (row.RowState) { case DataRowState.Unchanged: case DataRowState.Added: case DataRowState.Modified: OnAddRow(row); break; } } } } finally { _ignoreDataSetEvents = false; _ignoreXmlEvents = false; IsFoliationEnabled = isFoliationEnabled; _fAssociateDataRow = true; } } private void LoadRows(XmlBoundElement rowElem, XmlNode node) { if (node is XmlBoundElement xmlBoundElement) { DataTable dataTable = _mapper.SearchMatchingTableSchema(rowElem, xmlBoundElement); if (dataTable != null) { DataRow rowFromElement = GetRowFromElement(xmlBoundElement); if (xmlBoundElement.ElementState == ElementState.None) { xmlBoundElement.ElementState = ElementState.WeakFoliation; } rowFromElement = dataTable.CreateEmptyRow(); Bind(rowFromElement, xmlBoundElement); rowElem = xmlBoundElement; } } for (XmlNode xmlNode = node.FirstChild; xmlNode != null; xmlNode = xmlNode.NextSibling) { LoadRows(rowElem, xmlNode); } } internal void OnDataRowCreated(object oDataSet, DataRow row) { OnNewRow(row); } internal void OnClearCalled(object oDataSet, DataTable table) { throw new NotSupportedException("Clear function on DateSet and DataTable is not supported on XmlDataDocument."); } internal void OnDataRowCreatedSpecial(object oDataSet, DataRow row) { Bind(fLoadFromDataSet: true); OnNewRow(row); } internal void OnNewRow(DataRow row) { AttachBoundElementToDataRow(row); } private XmlBoundElement AttachBoundElementToDataRow(DataRow row) { DataTable table = row.Table; XmlBoundElement xmlBoundElement = new XmlBoundElement(string.Empty, table.EncodedTableName, table.Namespace, this); xmlBoundElement.IsEmpty = false; Bind(row, xmlBoundElement); xmlBoundElement.ElementState = ElementState.Defoliated; return xmlBoundElement; } private bool NeedXSI_NilAttr(DataRow row) { DataTable table = row.Table; if (table._xmlText == null) { return false; } return Convert.IsDBNull(row[table._xmlText]); } private void OnAddRow(DataRow row) { XmlBoundElement xmlBoundElement = (XmlBoundElement)GetElementFromRow(row); if (NeedXSI_NilAttr(row) && !xmlBoundElement.IsFoliated) { ForceFoliation(xmlBoundElement, AutoFoliationState); } if (GetRowFromElement(base.DocumentElement) != null && GetNestedParent(row) == null) { DemoteDocumentElement(); } EnsureDocumentElement().AppendChild(xmlBoundElement); FixNestedChildren(row, xmlBoundElement); OnNestedParentChange(row, xmlBoundElement, null); } private void OnColumnValueChanged(DataRow row, DataColumn col, XmlBoundElement rowElement) { if (!IsNotMapped(col)) { object value = row[col]; if (col.ColumnMapping == MappingType.SimpleContent && Convert.IsDBNull(value) && !rowElement.IsFoliated) { ForceFoliation(rowElement, ElementState.WeakFoliation); } else if (!IsFoliated(rowElement)) { goto IL_0318; } if (IsTextOnly(col)) { if (Convert.IsDBNull(value)) { value = string.Empty; XmlAttribute attributeNode = rowElement.GetAttributeNode("xsi:nil"); if (attributeNode == null) { attributeNode = CreateAttribute("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance"); attributeNode.Value = "true"; rowElement.SetAttributeNode(attributeNode); _bHasXSINIL = true; } else { attributeNode.Value = "true"; } } else { XmlAttribute attributeNode2 = rowElement.GetAttributeNode("xsi:nil"); if (attributeNode2 != null) { attributeNode2.Value = "false"; } } ReplaceInitialChildText(rowElement, col.ConvertObjectToXml(value)); } else { bool flag = false; if (col.ColumnMapping == MappingType.Attribute) { foreach (XmlAttribute attribute in rowElement.Attributes) { if (attribute.LocalName == col.EncodedColumnName && attribute.NamespaceURI == col.Namespace) { if (Convert.IsDBNull(value)) { attribute.OwnerElement.Attributes.Remove(attribute); } else { attribute.Value = col.ConvertObjectToXml(value); } flag = true; break; } } if (!flag && !Convert.IsDBNull(value)) { rowElement.SetAttribute(col.EncodedColumnName, col.Namespace, col.ConvertObjectToXml(value)); } } else { RegionIterator regionIterator = new RegionIterator(rowElement); bool flag2 = regionIterator.Next(); while (true) { if (flag2) { if (regionIterator.CurrentNode.NodeType == XmlNodeType.Element) { XmlElement xmlElement = (XmlElement)regionIterator.CurrentNode; if (xmlElement is XmlBoundElement xmlBoundElement && xmlBoundElement.Row != null) { flag2 = regionIterator.NextRight(); continue; } if (xmlElement.LocalName == col.EncodedColumnName && xmlElement.NamespaceURI == col.Namespace) { flag = true; if (Convert.IsDBNull(value)) { PromoteNonValueChildren(xmlElement); flag2 = regionIterator.NextRight(); xmlElement.ParentNode.RemoveChild(xmlElement); continue; } ReplaceInitialChildText(xmlElement, col.ConvertObjectToXml(value)); XmlAttribute attributeNode3 = xmlElement.GetAttributeNode("xsi:nil"); if (attributeNode3 != null) { attributeNode3.Value = "false"; } break; } } flag2 = regionIterator.Next(); continue; } if (!flag && !Convert.IsDBNull(value)) { XmlElement xmlElement2 = new XmlBoundElement(string.Empty, col.EncodedColumnName, col.Namespace, this); xmlElement2.AppendChild(CreateTextNode(col.ConvertObjectToXml(value))); XmlNode columnInsertAfterLocation = GetColumnInsertAfterLocation(row, col, rowElement); if (columnInsertAfterLocation != null) { rowElement.InsertAfter(xmlElement2, columnInsertAfterLocation); } else if (rowElement.FirstChild != null) { rowElement.InsertBefore(xmlElement2, rowElement.FirstChild); } else { rowElement.AppendChild(xmlElement2); } } break; } } } } goto IL_0318; IL_0318: DataRelation nestedParentRelation = GetNestedParentRelation(row); if (nestedParentRelation != null && nestedParentRelation.ChildKey.ContainsColumn(col)) { OnNestedParentChange(row, rowElement, col); } } private void OnColumnChanged(object sender, DataColumnChangeEventArgs args) { if (_ignoreDataSetEvents) { return; } bool ignoreXmlEvents = _ignoreXmlEvents; _ignoreXmlEvents = true; bool isFoliationEnabled = IsFoliationEnabled; IsFoliationEnabled = false; try { DataRow row = args.Row; DataColumn column = args.Column; _ = args.ProposedValue; if (row.RowState == DataRowState.Detached) { XmlBoundElement element = row.Element; if (element.IsFoliated) { OnColumnValueChanged(row, column, element); } } } finally { IsFoliationEnabled = isFoliationEnabled; _ignoreXmlEvents = ignoreXmlEvents; } } private void OnColumnValuesChanged(DataRow row, XmlBoundElement rowElement) { if (_columnChangeList.Count > 0) { if (((DataColumn)_columnChangeList[0]).Table == row.Table) { foreach (DataColumn columnChange in _columnChangeList) { OnColumnValueChanged(row, columnChange, rowElement); } } else { foreach (DataColumn column in row.Table.Columns) { OnColumnValueChanged(row, column, rowElement); } } } else { foreach (DataColumn column2 in row.Table.Columns) { OnColumnValueChanged(row, column2, rowElement); } } _columnChangeList.Clear(); } private void OnDeleteRow(DataRow row, XmlBoundElement rowElement) { if (rowElement == base.DocumentElement) { DemoteDocumentElement(); } PromoteInnerRegions(rowElement); rowElement.ParentNode.RemoveChild(rowElement); } private void OnDeletingRow(DataRow row, XmlBoundElement rowElement) { if (IsFoliated(rowElement)) { return; } bool ignoreXmlEvents = IgnoreXmlEvents; IgnoreXmlEvents = true; bool isFoliationEnabled = IsFoliationEnabled; IsFoliationEnabled = true; try { Foliate(rowElement); } finally { IsFoliationEnabled = isFoliationEnabled; IgnoreXmlEvents = ignoreXmlEvents; } } private void OnFoliated(XmlNode node) { while (true) { try { if (_pointers.Count <= 0) { break; } foreach (DictionaryEntry pointer in _pointers) { ((IXmlDataVirtualNode)pointer.Value).OnFoliated(node); } break; } catch (Exception e) when (ADP.IsCatchableExceptionType(e)) { } } } private DataColumn FindAssociatedParentColumn(DataRelation relation, DataColumn childCol) { DataColumn[] columnsReference = relation.ChildKey.ColumnsReference; for (int i = 0; i < columnsReference.Length; i++) { if (childCol == columnsReference[i]) { return relation.ParentKey.ColumnsReference[i]; } } return null; } private void OnNestedParentChange(DataRow child, XmlBoundElement childElement, DataColumn childCol) { DataRow dataRow = ((childElement != base.DocumentElement && childElement.ParentNode != null) ? GetRowFromElement((XmlElement)childElement.ParentNode) : null); DataRow nestedParent = GetNestedParent(child); if (dataRow == nestedParent) { return; } if (nestedParent != null) { GetElementFromRow(nestedParent).AppendChild(childElement); return; } DataRelation nestedParentRelation = GetNestedParentRelation(child); if (childCol == null || nestedParentRelation == null || Convert.IsDBNull(child[childCol])) { EnsureNonRowDocumentElement().AppendChild(childElement); return; } DataColumn dataColumn = FindAssociatedParentColumn(nestedParentRelation, childCol); object value = dataColumn.ConvertValue(child[childCol]); if (dataRow._tempRecord != -1 && dataColumn.CompareValueTo(dataRow._tempRecord, value) != 0) { EnsureNonRowDocumentElement().AppendChild(childElement); } } private void OnNodeChanged(object sender, XmlNodeChangedEventArgs args) { if (_ignoreXmlEvents) { return; } bool ignoreDataSetEvents = _ignoreDataSetEvents; bool ignoreXmlEvents = _ignoreXmlEvents; bool isFoliationEnabled = IsFoliationEnabled; _ignoreDataSetEvents = true; _ignoreXmlEvents = true; IsFoliationEnabled = false; bool fEnableCascading = DataSet._fEnableCascading; DataSet._fEnableCascading = false; try { XmlBoundElement rowElem = null; if (_mapper.GetRegion(args.Node, out rowElem)) { SynchronizeRowFromRowElement(rowElem); } } finally { _ignoreDataSetEvents = ignoreDataSetEvents; _ignoreXmlEvents = ignoreXmlEvents; IsFoliationEnabled = isFoliationEnabled; DataSet._fEnableCascading = fEnableCascading; } } private void OnNodeChanging(object sender, XmlNodeChangedEventArgs args) { if (_ignoreXmlEvents || !DataSet.EnforceConstraints) { return; } throw new InvalidOperationException("Please set DataSet.EnforceConstraints == false before trying to edit XmlDataDocument using XML operations."); } private void OnNodeInserted(object sender, XmlNodeChangedEventArgs args) { if (_ignoreXmlEvents) { return; } bool ignoreDataSetEvents = _ignoreDataSetEvents; bool ignoreXmlEvents = _ignoreXmlEvents; bool isFoliationEnabled = IsFoliationEnabled; _ignoreDataSetEvents = true; _ignoreXmlEvents = true; IsFoliationEnabled = false; bool fEnableCascading = DataSet._fEnableCascading; DataSet._fEnableCascading = false; try { XmlNode node = args.Node; _ = args.OldParent; XmlNode newParent = args.NewParent; if (IsConnected(newParent)) { OnNodeInsertedInTree(node); } else { OnNodeInsertedInFragment(node); } } finally { _ignoreDataSetEvents = ignoreDataSetEvents; _ignoreXmlEvents = ignoreXmlEvents; IsFoliationEnabled = isFoliationEnabled; DataSet._fEnableCascading = fEnableCascading; } } private void OnNodeInserting(object sender, XmlNodeChangedEventArgs args) { if (_ignoreXmlEvents || !DataSet.EnforceConstraints) { return; } throw new InvalidOperationException("Please set DataSet.EnforceConstraints == false before trying to edit XmlDataDocument using XML operations."); } private void OnNodeRemoved(object sender, XmlNodeChangedEventArgs args) { if (_ignoreXmlEvents) { return; } bool ignoreDataSetEvents = _ignoreDataSetEvents; bool ignoreXmlEvents = _ignoreXmlEvents; bool isFoliationEnabled = IsFoliationEnabled; _ignoreDataSetEvents = true; _ignoreXmlEvents = true; IsFoliationEnabled = false; bool fEnableCascading = DataSet._fEnableCascading; DataSet._fEnableCascading = false; try { XmlNode node = args.Node; XmlNode oldParent = args.OldParent; if (IsConnected(oldParent)) { OnNodeRemovedFromTree(node, oldParent); } else { OnNodeRemovedFromFragment(node, oldParent); } } finally { _ignoreDataSetEvents = ignoreDataSetEvents; _ignoreXmlEvents = ignoreXmlEvents; IsFoliationEnabled = isFoliationEnabled; DataSet._fEnableCascading = fEnableCascading; } } private void OnNodeRemoving(object sender, XmlNodeChangedEventArgs args) { if (_ignoreXmlEvents || !DataSet.EnforceConstraints) { return; } throw new InvalidOperationException("Please set DataSet.EnforceConstraints == false before trying to edit XmlDataDocument using XML operations."); } private void OnNodeRemovedFromTree(XmlNode node, XmlNode oldParent) { if (_mapper.GetRegion(oldParent, out var rowElem)) { SynchronizeRowFromRowElement(rowElem); } if (node is XmlBoundElement xmlBoundElement && xmlBoundElement.Row != null) { EnsureDisconnectedDataRow(xmlBoundElement); } TreeIterator treeIterator = new TreeIterator(node); bool flag = treeIterator.NextRowElement(); while (flag) { XmlBoundElement rowElem2 = (XmlBoundElement)treeIterator.CurrentNode; EnsureDisconnectedDataRow(rowElem2); flag = treeIterator.NextRowElement(); } } private void OnNodeRemovedFromFragment(XmlNode node, XmlNode oldParent) { if (_mapper.GetRegion(oldParent, out var rowElem)) { _ = rowElem.Row; if (rowElem.Row.RowState == DataRowState.Detached) { SynchronizeRowFromRowElement(rowElem); } } if (node is XmlBoundElement xmlBoundElement && xmlBoundElement.Row != null) { SetNestedParentRegion(xmlBoundElement, null); return; } TreeIterator treeIterator = new TreeIterator(node); bool flag = treeIterator.NextRowElement(); while (flag) { XmlBoundElement childRowElem = (XmlBoundElement)treeIterator.CurrentNode; SetNestedParentRegion(childRowElem, null); flag = treeIterator.NextRightRowElement(); } } private void OnRowChanged(object sender, DataRowChangeEventArgs args) { if (_ignoreDataSetEvents) { return; } _ignoreXmlEvents = true; bool isFoliationEnabled = IsFoliationEnabled; IsFoliationEnabled = false; try { DataRow row = args.Row; XmlBoundElement element = row.Element; switch (args.Action) { case DataRowAction.Add: OnAddRow(row); break; case DataRowAction.Delete: OnDeleteRow(row, element); break; case DataRowAction.Rollback: switch (_rollbackState) { case DataRowState.Deleted: OnUndeleteRow(row, element); UpdateAllColumns(row, element); break; case DataRowState.Added: element.ParentNode.RemoveChild(element); break; case DataRowState.Modified: OnColumnValuesChanged(row, element); break; } break; case DataRowAction.Change: OnColumnValuesChanged(row, element); break; case DataRowAction.Commit: if (row.RowState == DataRowState.Detached) { element.RemoveAll(); } break; } } finally { IsFoliationEnabled = isFoliationEnabled; _ignoreXmlEvents = false; } } private void OnRowChanging(object sender, DataRowChangeEventArgs args) { DataRow row = args.Row; if (args.Action == DataRowAction.Delete && row.Element != null) { OnDeletingRow(row, row.Element); } else { if (_ignoreDataSetEvents) { return; } bool isFoliationEnabled = IsFoliationEnabled; IsFoliationEnabled = false; try { _ignoreXmlEvents = true; XmlElement elementFromRow = GetElementFromRow(row); int num = -1; int num2 = -1; if (elementFromRow == null) { return; } switch (args.Action) { case DataRowAction.Rollback: _rollbackState = row.RowState; switch (_rollbackState) { case DataRowState.Modified: _columnChangeList.Clear(); num = row.GetRecordFromVersion(DataRowVersion.Original); num2 = row.GetRecordFromVersion(DataRowVersion.Current); { foreach (DataColumn column in row.Table.Columns) { if (!IsSame(column, num, num2)) { _columnChangeList.Add(column); } } break; } } break; case DataRowAction.Change: _columnChangeList.Clear(); num = row.GetRecordFromVersion(DataRowVersion.Proposed); num2 = row.GetRecordFromVersion(DataRowVersion.Current); { foreach (DataColumn column2 in row.Table.Columns) { object value = row[column2, DataRowVersion.Proposed]; object value2 = row[column2, DataRowVersion.Current]; if (Convert.IsDBNull(value) && !Convert.IsDBNull(value2) && column2.ColumnMapping != MappingType.Hidden) { FoliateIfDataPointers(row, elementFromRow); } if (!IsSame(column2, num, num2)) { _columnChangeList.Add(column2); } } break; } } } finally { _ignoreXmlEvents = false; IsFoliationEnabled = isFoliationEnabled; } } } private void OnDataSetPropertyChanging(object oDataSet, PropertyChangedEventArgs args) { if (args.PropertyName == "DataSetName") { throw new InvalidOperationException("Cannot change the DataSet name once the DataSet is mapped to a loaded XML document."); } } private void OnColumnPropertyChanging(object oColumn, PropertyChangedEventArgs args) { if (args.PropertyName == "ColumnName") { throw new InvalidOperationException("Cannot change the column name once the associated DataSet is mapped to a loaded XML document."); } if (args.PropertyName == "Namespace") { throw new InvalidOperationException("Cannot change the column namespace once the associated DataSet is mapped to a loaded XML document."); } if (args.PropertyName == "ColumnMapping") { throw new InvalidOperationException("Cannot change the ColumnMapping property once the associated DataSet is mapped to a loaded XML document."); } } private void OnTablePropertyChanging(object oTable, PropertyChangedEventArgs args) { if (args.PropertyName == "TableName") { throw new InvalidOperationException("Cannot change the table name once the associated DataSet is mapped to a loaded XML document."); } if (args.PropertyName == "Namespace") { throw new InvalidOperationException("Cannot change the table namespace once the associated DataSet is mapped to a loaded XML document."); } } private void OnTableColumnsChanging(object oColumnsCollection, CollectionChangeEventArgs args) { throw new InvalidOperationException("Cannot add or remove columns from the table once the DataSet is mapped to a loaded XML document."); } private void OnDataSetTablesChanging(object oTablesCollection, CollectionChangeEventArgs args) { throw new InvalidOperationException("Cannot add or remove tables from the DataSet once the DataSet is mapped to a loaded XML document."); } private void OnDataSetRelationsChanging(object oRelationsCollection, CollectionChangeEventArgs args) { DataRelation dataRelation = (DataRelation)args.Element; if (dataRelation != null && dataRelation.Nested) { throw new InvalidOperationException("Cannot add, remove, or change Nested relations from the DataSet once the DataSet is mapped to a loaded XML document."); } if (args.Action != CollectionChangeAction.Refresh) { return; } foreach (DataRelation item in (DataRelationCollection)oRelationsCollection) { if (item.Nested) { throw new InvalidOperationException("Cannot add, remove, or change Nested relations from the DataSet once the DataSet is mapped to a loaded XML document."); } } } private void OnRelationPropertyChanging(object oRelationsCollection, PropertyChangedEventArgs args) { if (args.PropertyName == "Nested") { throw new InvalidOperationException("Cannot add, remove, or change Nested relations from the DataSet once the DataSet is mapped to a loaded XML document."); } } private void OnUndeleteRow(DataRow row, XmlElement rowElement) { if (rowElement.ParentNode != null) { rowElement.ParentNode.RemoveChild(rowElement); } DataRow nestedParent = GetNestedParent(row); XmlElement xmlElement = ((nestedParent != null) ? GetElementFromRow(nestedParent) : EnsureNonRowDocumentElement()); XmlNode rowInsertBeforeLocation; if ((rowInsertBeforeLocation = GetRowInsertBeforeLocation(row, rowElement, xmlElement)) != null) { xmlElement.InsertBefore(rowElement, rowInsertBeforeLocation); } else { xmlElement.AppendChild(rowElement); } FixNestedChildren(row, rowElement); } private void PromoteChild(XmlNode child, XmlNode prevSibling) { if (child.ParentNode != null) { child.ParentNode.RemoveChild(child); } prevSibling.ParentNode.InsertAfter(child, prevSibling); } private void PromoteInnerRegions(XmlNode parent) { _mapper.GetRegion(parent.ParentNode, out var rowElem); TreeIterator treeIterator = new TreeIterator(parent); bool flag = treeIterator.NextRowElement(); while (flag) { XmlBoundElement xmlBoundElement = (XmlBoundElement)treeIterator.CurrentNode; flag = treeIterator.NextRightRowElement(); PromoteChild(xmlBoundElement, parent); SetNestedParentRegion(xmlBoundElement, rowElem); } } private void PromoteNonValueChildren(XmlNode parent) { XmlNode prevSibling = parent; XmlNode xmlNode = parent.FirstChild; bool flag = true; XmlNode xmlNode2 = null; while (xmlNode != null) { xmlNode2 = xmlNode.NextSibling; if (!flag || !IsTextLikeNode(xmlNode)) { flag = false; xmlNode2 = xmlNode.NextSibling; PromoteChild(xmlNode, prevSibling); prevSibling = xmlNode; } xmlNode = xmlNode2; } } private void RemoveInitialTextNodes(XmlNode node) { while (node != null && IsTextLikeNode(node)) { XmlNode? nextSibling = node.NextSibling; node.ParentNode.RemoveChild(node); node = nextSibling; } } private void ReplaceInitialChildText(XmlNode parent, string value) { XmlNode xmlNode = parent.FirstChild; while (xmlNode != null && xmlNode.NodeType == XmlNodeType.Whitespace) { xmlNode = xmlNode.NextSibling; } if (xmlNode != null) { if (xmlNode.NodeType == XmlNodeType.Text) { xmlNode.Value = value; } else { xmlNode = parent.InsertBefore(CreateTextNode(value), xmlNode); } RemoveInitialTextNodes(xmlNode.NextSibling); } else { parent.AppendChild(CreateTextNode(value)); } } internal XmlNode SafeFirstChild(XmlNode n) { if (n is XmlBoundElement xmlBoundElement) { return xmlBoundElement.SafeFirstChild; } return n.FirstChild; } internal XmlNode SafeNextSibling(XmlNode n) { if (n is XmlBoundElement xmlBoundElement) { return xmlBoundElement.SafeNextSibling; } return n.NextSibling; } internal XmlNode SafePreviousSibling(XmlNode n) { if (n is XmlBoundElement xmlBoundElement) { return xmlBoundElement.SafePreviousSibling; } return n.PreviousSibling; } internal static void SetRowValueToNull(DataRow row, DataColumn col) { if (!row.IsNull(col)) { row[col] = DBNull.Value; } } internal static void SetRowValueFromXmlText(DataRow row, DataColumn col, string xmlText) { object obj; try { obj = col.ConvertXmlToObject(xmlText); } catch (Exception e) when (ADP.IsCatchableExceptionType(e)) { SetRowValueToNull(row, col); return; } if (!obj.Equals(row[col])) { row[col] = obj; } } private void SynchronizeRowFromRowElement(XmlBoundElement rowElement) { SynchronizeRowFromRowElement(rowElement, null); } private void SynchronizeRowFromRowElement(XmlBoundElement rowElement, ArrayList rowElemList) { DataRow row = rowElement.Row; if (row.RowState != DataRowState.Deleted) { row.BeginEdit(); SynchronizeRowFromRowElementEx(rowElement, rowElemList); row.EndEdit(); } } private void SynchronizeRowFromRowElementEx(XmlBoundElement rowElement, ArrayList rowElemList) { DataRow row = rowElement.Row; _ = row.Table; Hashtable hashtable = new Hashtable(); string empty = string.Empty; RegionIterator regionIterator = new RegionIterator(rowElement); DataColumn textOnlyColumn = GetTextOnlyColumn(row); bool flag; if (textOnlyColumn != null) { hashtable[textOnlyColumn] = textOnlyColumn; flag = regionIterator.NextInitialTextLikeNodes(out var value); if (value.Length == 0 && ((empty = rowElement.GetAttribute("xsi:nil")) == "1" || empty == "true")) { row[textOnlyColumn] = DBNull.Value; } else { SetRowValueFromXmlText(row, textOnlyColumn, value); } } else { flag = regionIterator.Next(); } while (flag) { if (!(regionIterator.CurrentNode is XmlElement xmlElement)) { flag = regionIterator.Next(); continue; } if (xmlElement is XmlBoundElement xmlBoundElement && xmlBoundElement.Row != null) { rowElemList?.Add(xmlElement); flag = regionIterator.NextRight(); continue; } DataColumn columnSchemaForNode = _mapper.GetColumnSchemaForNode(rowElement, xmlElement); if (columnSchemaForNode != null && hashtable[columnSchemaForNode] == null) { hashtable[columnSchemaForNode] = columnSchemaForNode; flag = regionIterator.NextInitialTextLikeNodes(out var value2); if (value2.Length == 0 && ((empty = xmlElement.GetAttribute("xsi:nil")) == "1" || empty == "true")) { row[columnSchemaForNode] = DBNull.Value; } else { SetRowValueFromXmlText(row, columnSchemaForNode, value2); } } else { flag = regionIterator.Next(); } } foreach (XmlAttribute attribute in rowElement.Attributes) { DataColumn columnSchemaForNode2 = _mapper.GetColumnSchemaForNode(rowElement, attribute); if (columnSchemaForNode2 != null && hashtable[columnSchemaForNode2] == null) { hashtable[columnSchemaForNode2] = columnSchemaForNode2; SetRowValueFromXmlText(row, columnSchemaForNode2, attribute.Value); } } foreach (DataColumn column in row.Table.Columns) { if (hashtable[column] == null && !IsNotMapped(column)) { if (!column.AutoIncrement) { SetRowValueToNull(row, column); } else { column.Init(row._tempRecord); } } } } private void UpdateAllColumns(DataRow row, XmlBoundElement rowElement) { foreach (DataColumn column in row.Table.Columns) { OnColumnValueChanged(row, column, rowElement); } } public XmlDataDocument() : base(new XmlDataImplementation()) { Init(); AttachDataSet(new DataSet()); _dataSet.EnforceConstraints = false; } public XmlDataDocument(DataSet dataset) : base(new XmlDataImplementation()) { Init(dataset); } internal XmlDataDocument(XmlImplementation imp) : base(imp) { } private void Init() { _pointers = new Hashtable(); _countAddPointer = 0; _columnChangeList = new ArrayList(); _ignoreDataSetEvents = false; _isFoliationEnabled = true; _optimizeStorage = true; _fDataRowCreatedSpecial = false; _autoFoliationState = ElementState.StrongFoliation; _fAssociateDataRow = true; _mapper = new DataSetMapper(); _foliationLock = new object(); _ignoreXmlEvents = true; _attrXml = CreateAttribute("xmlns", "xml", "http://www.w3.org/2000/xmlns/"); _attrXml.Value = "http://www.w3.org/XML/1998/namespace"; _ignoreXmlEvents = false; } private void Init(DataSet ds) { if (ds == null) { throw new ArgumentException("The DataSet parameter is invalid. It cannot be null."); } Init(); if (ds.FBoundToDocument) { throw new ArgumentException("DataSet can be associated with at most one XmlDataDocument. Cannot associate the DataSet with the current XmlDataDocument because the DataSet is already associated with another XmlDataDocument."); } ds.FBoundToDocument = true; _dataSet = ds; Bind(fLoadFromDataSet: true); } private bool IsConnected(XmlNode node) { while (true) { if (node == null) { return false; } if (node == this) { break; } node = ((!(node is XmlAttribute xmlAttribute)) ? node.ParentNode : xmlAttribute.OwnerElement); } return true; } private bool IsRowLive(DataRow row) { return (row.RowState & (DataRowState.Unchanged | DataRowState.Added | DataRowState.Modified)) != 0; } private static void SetNestedParentRow(DataRow childRow, DataRow parentRow) { DataRelation nestedParentRelation = GetNestedParentRelation(childRow); if (nestedParentRelation != null) { if (parentRow == null || nestedParentRelation.ParentKey.Table != parentRow.Table) { childRow.SetParentRow(null, nestedParentRelation); } else { childRow.SetParentRow(parentRow, nestedParentRelation); } } } private void OnNodeInsertedInTree(XmlNode node) { ArrayList arrayList = new ArrayList(); if (_mapper.GetRegion(node, out var rowElem)) { if (rowElem == node) { OnRowElementInsertedInTree(rowElem, arrayList); } else { OnNonRowElementInsertedInTree(node, rowElem, arrayList); } } else { TreeIterator treeIterator = new TreeIterator(node); bool flag = treeIterator.NextRowElement(); while (flag) { arrayList.Add(treeIterator.CurrentNode); flag = treeIterator.NextRightRowElement(); } } while (arrayList.Count > 0) { XmlBoundElement rowElem2 = (XmlBoundElement)arrayList[0]; arrayList.RemoveAt(0); OnRowElementInsertedInTree(rowElem2, arrayList); } } private void OnNodeInsertedInFragment(XmlNode node) { if (!_mapper.GetRegion(node, out var rowElem)) { return; } if (rowElem == node) { SetNestedParentRegion(rowElem); return; } ArrayList arrayList = new ArrayList(); OnNonRowElementInsertedInFragment(node, rowElem, arrayList); while (arrayList.Count > 0) { XmlBoundElement childRowElem = (XmlBoundElement)arrayList[0]; arrayList.RemoveAt(0); SetNestedParentRegion(childRowElem, rowElem); } } private void OnRowElementInsertedInTree(XmlBoundElement rowElem, ArrayList rowElemList) { DataRow row = rowElem.Row; switch (row.RowState) { case DataRowState.Detached: row.Table.Rows.Add(row); SetNestedParentRegion(rowElem); if (rowElemList != null) { RegionIterator regionIterator = new RegionIterator(rowElem); bool flag = regionIterator.NextRowElement(); while (flag) { rowElemList.Add(regionIterator.CurrentNode); flag = regionIterator.NextRightRowElement(); } } break; case DataRowState.Deleted: row.RejectChanges(); SynchronizeRowFromRowElement(rowElem, rowElemList); SetNestedParentRegion(rowElem); break; } } private void EnsureDisconnectedDataRow(XmlBoundElement rowElem) { DataRow row = rowElem.Row; switch (row.RowState) { case DataRowState.Detached: SetNestedParentRegion(rowElem); break; case DataRowState.Unchanged: case DataRowState.Modified: EnsureFoliation(rowElem, ElementState.WeakFoliation); row.Delete(); break; case DataRowState.Added: EnsureFoliation(rowElem, ElementState.WeakFoliation); row.Delete(); SetNestedParentRegion(rowElem); break; } } private void OnNonRowElementInsertedInTree(XmlNode node, XmlBoundElement rowElement, ArrayList rowElemList) { _ = rowElement.Row; SynchronizeRowFromRowElement(rowElement); if (rowElemList != null) { TreeIterator treeIterator = new TreeIterator(node); bool flag = treeIterator.NextRowElement(); while (flag) { rowElemList.Add(treeIterator.CurrentNode); flag = treeIterator.NextRightRowElement(); } } } private void OnNonRowElementInsertedInFragment(XmlNode node, XmlBoundElement rowElement, ArrayList rowElemList) { if (rowElement.Row.RowState == DataRowState.Detached) { SynchronizeRowFromRowElementEx(rowElement, rowElemList); } } private void SetNestedParentRegion(XmlBoundElement childRowElem) { _mapper.GetRegion(childRowElem.ParentNode, out var rowElem); SetNestedParentRegion(childRowElem, rowElem); } private void SetNestedParentRegion(XmlBoundElement childRowElem, XmlBoundElement parentRowElem) { DataRow row = childRowElem.Row; if (parentRowElem == null) { SetNestedParentRow(row, null); return; } DataRow row2 = parentRowElem.Row; DataRelation[] nestedParentRelations = row.Table.NestedParentRelations; if (nestedParentRelations.Length != 0 && nestedParentRelations[0].ParentTable == row2.Table) { SetNestedParentRow(row, row2); } else { SetNestedParentRow(row, null); } } internal static bool IsTextNode(XmlNodeType nt) { if ((uint)(nt - 3) <= 1u || (uint)(nt - 13) <= 1u) { return true; } return false; } protected override XPathNavigator CreateNavigator(XmlNode node) { if (XPathNodePointer.s_xmlNodeType_To_XpathNodeType_Map[(int)node.NodeType] == -1) { return null; } if (IsTextNode(node.NodeType)) { XmlNode xmlNode = node.ParentNode; if (xmlNode != null && xmlNode.NodeType == XmlNodeType.Attribute) { return null; } XmlNode xmlNode2 = node.PreviousSibling; while (xmlNode2 != null && IsTextNode(xmlNode2.NodeType)) { node = xmlNode2; xmlNode2 = SafePreviousSibling(node); } } return new DataDocumentXPathNavigator(this, node); } [Conditional("DEBUG")] private void AssertLiveRows(XmlNode node) { bool isFoliationEnabled = IsFoliationEnabled; IsFoliationEnabled = false; try { if (node is XmlBoundElement xmlBoundElement) { _ = xmlBoundElement.Row; } TreeIterator treeIterator = new TreeIterator(node); bool flag = treeIterator.NextRowElement(); while (flag) { XmlBoundElement xmlBoundElement2 = treeIterator.CurrentNode as XmlBoundElement; flag = treeIterator.NextRowElement(); } } finally { IsFoliationEnabled = isFoliationEnabled; } } [Conditional("DEBUG")] private void AssertNonLiveRows(XmlNode node) { bool isFoliationEnabled = IsFoliationEnabled; IsFoliationEnabled = false; try { if (node is XmlBoundElement xmlBoundElement) { _ = xmlBoundElement.Row; } TreeIterator treeIterator = new TreeIterator(node); bool flag = treeIterator.NextRowElement(); while (flag) { XmlBoundElement xmlBoundElement2 = treeIterator.CurrentNode as XmlBoundElement; flag = treeIterator.NextRowElement(); } } finally { IsFoliationEnabled = isFoliationEnabled; } } public override XmlElement GetElementById(string elemId) { throw new NotSupportedException("GetElementById() is not supported on DataDocument."); } public override XmlNodeList GetElementsByTagName(string name) { XmlNodeList elementsByTagName = base.GetElementsByTagName(name); _ = elementsByTagName.Count; return elementsByTagName; } private DataTable[] OrderTables(DataSet ds) { DataTable[] array = null; if (ds == null || ds.Tables.Count == 0) { array = Array.Empty(); } else if (TablesAreOrdered(ds)) { array = new DataTable[ds.Tables.Count]; ds.Tables.CopyTo(array, 0); } if (array == null) { array = new DataTable[ds.Tables.Count]; List list = new List(); foreach (DataTable table in ds.Tables) { if (table.ParentRelations.Count == 0) { list.Add(table); } } if (list.Count > 0) { foreach (DataTable table2 in ds.Tables) { if (IsSelfRelatedDataTable(table2)) { list.Add(table2); } } for (int i = 0; i < list.Count; i++) { foreach (DataRelation childRelation in list[i].ChildRelations) { DataTable childTable = childRelation.ChildTable; if (!list.Contains(childTable)) { list.Add(childTable); } } } list.CopyTo(array); } else { ds.Tables.CopyTo(array, 0); } } return array; } private bool IsSelfRelatedDataTable(DataTable rootTable) { List list = new List(); bool flag = false; foreach (DataRelation childRelation in rootTable.ChildRelations) { DataTable childTable = childRelation.ChildTable; if (childTable == rootTable) { flag = true; break; } if (!list.Contains(childTable)) { list.Add(childTable); } } if (!flag) { for (int i = 0; i < list.Count; i++) { foreach (DataRelation childRelation2 in list[i].ChildRelations) { DataTable childTable2 = childRelation2.ChildTable; if (childTable2 == rootTable) { flag = true; break; } if (!list.Contains(childTable2)) { list.Add(childTable2); } } if (flag) { break; } } } return flag; } private bool TablesAreOrdered(DataSet ds) { foreach (DataTable table in ds.Tables) { if (table.Namespace != ds.Namespace) { return false; } } return true; } } internal sealed class XmlDataImplementation : XmlImplementation { public override XmlDocument CreateDocument() { return new XmlDataDocument(this); } } } namespace System.Threading.Tasks { internal static class TaskToApm { private sealed class TaskWrapperAsyncResult : IAsyncResult { internal readonly Task Task; private readonly object _state; private readonly bool _completedSynchronously; object IAsyncResult.AsyncState => _state; bool IAsyncResult.CompletedSynchronously => _completedSynchronously; bool IAsyncResult.IsCompleted => Task.IsCompleted; WaitHandle IAsyncResult.AsyncWaitHandle => ((IAsyncResult)Task).AsyncWaitHandle; internal TaskWrapperAsyncResult(Task task, object state, bool completedSynchronously) { Task = task; _state = state; _completedSynchronously = completedSynchronously; } } public static IAsyncResult Begin(Task task, AsyncCallback callback, object state) { IAsyncResult asyncResult; if (task.IsCompleted) { asyncResult = new TaskWrapperAsyncResult(task, state, completedSynchronously: true); callback?.Invoke(asyncResult); } else { IAsyncResult asyncResult3; if (task.AsyncState != state) { IAsyncResult asyncResult2 = new TaskWrapperAsyncResult(task, state, completedSynchronously: false); asyncResult3 = asyncResult2; } else { IAsyncResult asyncResult2 = task; asyncResult3 = asyncResult2; } asyncResult = asyncResult3; if (callback != null) { InvokeCallbackWhenTaskCompletes(task, callback, asyncResult); } } return asyncResult; } public static void End(IAsyncResult asyncResult) { Task task = ((!(asyncResult is TaskWrapperAsyncResult taskWrapperAsyncResult)) ? (asyncResult as Task) : taskWrapperAsyncResult.Task); if (task == null) { throw new ArgumentNullException(); } task.GetAwaiter().GetResult(); } public static TResult End(IAsyncResult asyncResult) { Task task = ((!(asyncResult is TaskWrapperAsyncResult taskWrapperAsyncResult)) ? (asyncResult as Task) : (taskWrapperAsyncResult.Task as Task)); if (task == null) { throw new ArgumentNullException(); } return task.GetAwaiter().GetResult(); } private static void InvokeCallbackWhenTaskCompletes(Task antecedent, AsyncCallback callback, IAsyncResult asyncResult) { antecedent.ConfigureAwait(continueOnCapturedContext: false).GetAwaiter().OnCompleted(delegate { callback(asyncResult); }); } } } namespace System.Net { internal static class ContextFlagsAdapterPal { private struct ContextFlagMapping { public readonly global::Interop.NetSecurityNative.GssFlags GssFlags; public readonly System.Net.ContextFlagsPal ContextFlag; public ContextFlagMapping(global::Interop.NetSecurityNative.GssFlags gssFlag, System.Net.ContextFlagsPal contextFlag) { GssFlags = gssFlag; ContextFlag = contextFlag; } } private static readonly ContextFlagMapping[] s_contextFlagMapping = new ContextFlagMapping[5] { new ContextFlagMapping(global::Interop.NetSecurityNative.GssFlags.GSS_C_CONF_FLAG, System.Net.ContextFlagsPal.Confidentiality), new ContextFlagMapping(global::Interop.NetSecurityNative.GssFlags.GSS_C_IDENTIFY_FLAG, System.Net.ContextFlagsPal.AcceptIntegrity), new ContextFlagMapping(global::Interop.NetSecurityNative.GssFlags.GSS_C_MUTUAL_FLAG, System.Net.ContextFlagsPal.MutualAuth), new ContextFlagMapping(global::Interop.NetSecurityNative.GssFlags.GSS_C_REPLAY_FLAG, System.Net.ContextFlagsPal.ReplayDetect), new ContextFlagMapping(global::Interop.NetSecurityNative.GssFlags.GSS_C_SEQUENCE_FLAG, System.Net.ContextFlagsPal.SequenceDetect) }; internal static System.Net.ContextFlagsPal GetContextFlagsPalFromInterop(global::Interop.NetSecurityNative.GssFlags gssFlags, bool isServer) { System.Net.ContextFlagsPal contextFlagsPal = System.Net.ContextFlagsPal.None; if ((gssFlags & global::Interop.NetSecurityNative.GssFlags.GSS_C_INTEG_FLAG) != 0) { contextFlagsPal |= (isServer ? System.Net.ContextFlagsPal.AcceptIntegrity : System.Net.ContextFlagsPal.AcceptStream); } ContextFlagMapping[] array = s_contextFlagMapping; for (int i = 0; i < array.Length; i++) { ContextFlagMapping contextFlagMapping = array[i]; if ((gssFlags & contextFlagMapping.GssFlags) == contextFlagMapping.GssFlags) { contextFlagsPal |= contextFlagMapping.ContextFlag; } } return contextFlagsPal; } internal static global::Interop.NetSecurityNative.GssFlags GetInteropFromContextFlagsPal(System.Net.ContextFlagsPal flags, bool isServer) { global::Interop.NetSecurityNative.GssFlags gssFlags = (global::Interop.NetSecurityNative.GssFlags)0u; if (isServer) { if ((flags & System.Net.ContextFlagsPal.AcceptIntegrity) != 0) { gssFlags |= global::Interop.NetSecurityNative.GssFlags.GSS_C_INTEG_FLAG; } } else if ((flags & System.Net.ContextFlagsPal.AcceptStream) != 0) { gssFlags |= global::Interop.NetSecurityNative.GssFlags.GSS_C_INTEG_FLAG; } ContextFlagMapping[] array = s_contextFlagMapping; for (int i = 0; i < array.Length; i++) { ContextFlagMapping contextFlagMapping = array[i]; if ((flags & contextFlagMapping.ContextFlag) == contextFlagMapping.ContextFlag) { gssFlags |= contextFlagMapping.GssFlags; } } return gssFlags; } } [Flags] internal enum ContextFlagsPal { None = 0, Delegate = 1, MutualAuth = 2, ReplayDetect = 4, SequenceDetect = 8, Confidentiality = 0x10, UseSessionKey = 0x20, AllocateMemory = 0x100, Connection = 0x800, InitExtendedError = 0x4000, AcceptExtendedError = 0x8000, InitStream = 0x8000, AcceptStream = 0x10000, InitIntegrity = 0x10000, AcceptIntegrity = 0x20000, InitManualCredValidation = 0x80000, InitUseSuppliedCreds = 0x80, InitIdentify = 0x20000, AcceptIdentify = 0x80000, ProxyBindings = 0x4000000, AllowMissingBindings = 0x10000000, UnverifiedTargetName = 0x20000000 } internal class InternalException : Exception { internal InternalException() { System.Net.NetEventSource.Fail(this, "InternalException thrown.", ".ctor"); } } internal static class DebugThreadTracking { private class ThreadKindFrame : IDisposable { private readonly int _frameNumber; internal ThreadKindFrame() { _frameNumber = ThreadKindStack.Count; } void IDisposable.Dispose() { if (!Environment.HasShutdownStarted) { if (_frameNumber != ThreadKindStack.Count) { throw new System.Net.InternalException(); } ThreadKinds threadKinds = ThreadKindStack.Pop(); if (CurrentThreadKind != threadKinds && System.Net.NetEventSource.IsEnabled && System.Net.NetEventSource.IsEnabled) { System.Net.NetEventSource.Info(this, $"Thread reverts:({CurrentThreadKind})", "Dispose"); } } } } [ThreadStatic] private static Stack t_threadKindStack; private static Stack ThreadKindStack => t_threadKindStack ?? (t_threadKindStack = new Stack()); internal static ThreadKinds CurrentThreadKind { get { if (ThreadKindStack.Count <= 0) { return ThreadKinds.Other; } return ThreadKindStack.Peek(); } } internal static IDisposable SetThreadKind(ThreadKinds kind) { if ((kind & ThreadKinds.SourceMask) != 0) { throw new System.Net.InternalException(); } if (Environment.HasShutdownStarted) { return null; } ThreadKinds currentThreadKind = CurrentThreadKind; ThreadKinds threadKinds = currentThreadKind & ThreadKinds.SourceMask; if ((currentThreadKind & ThreadKinds.User) != 0 && (kind & ThreadKinds.System) != 0 && System.Net.NetEventSource.IsEnabled) { System.Net.NetEventSource.Error(null, "Thread changed from User to System; user's thread shouldn't be hijacked.", "SetThreadKind"); } if ((currentThreadKind & ThreadKinds.Async) != 0 && (kind & ThreadKinds.Sync) != 0) { if (System.Net.NetEventSource.IsEnabled) { System.Net.NetEventSource.Error(null, "Thread changed from Async to Sync, may block an Async thread.", "SetThreadKind"); } } else if ((currentThreadKind & (ThreadKinds.CompletionPort | ThreadKinds.Other)) == 0 && (kind & ThreadKinds.Sync) != 0 && System.Net.NetEventSource.IsEnabled) { System.Net.NetEventSource.Error(null, "Thread from a limited resource changed to Sync, may deadlock or bottleneck.", "SetThreadKind"); } ThreadKindStack.Push(((((kind & ThreadKinds.OwnerMask) == 0) ? currentThreadKind : kind) & ThreadKinds.OwnerMask) | ((((kind & ThreadKinds.SyncMask) == 0) ? currentThreadKind : kind) & ThreadKinds.SyncMask) | (kind & ~(ThreadKinds.OwnerMask | ThreadKinds.SyncMask)) | threadKinds); if (CurrentThreadKind != currentThreadKind && System.Net.NetEventSource.IsEnabled) { System.Net.NetEventSource.Info(null, $"Thread becomes:({CurrentThreadKind})", "SetThreadKind"); } return new ThreadKindFrame(); } internal static void SetThreadSource(ThreadKinds source) { if ((source & ThreadKinds.SourceMask) != source || source == ThreadKinds.Unknown) { throw new ArgumentException("Must specify the thread source.", "source"); } if (ThreadKindStack.Count == 0) { ThreadKindStack.Push(source); return; } if (ThreadKindStack.Count > 1) { if (System.Net.NetEventSource.IsEnabled) { System.Net.NetEventSource.Error(null, "SetThreadSource must be called at the base of the stack, or the stack has been corrupted.", "SetThreadSource"); } while (ThreadKindStack.Count > 1) { ThreadKindStack.Pop(); } } if (ThreadKindStack.Peek() != source) { if (System.Net.NetEventSource.IsEnabled) { System.Net.NetEventSource.Error(null, "The stack has been corrupted.", "SetThreadSource"); } ThreadKinds threadKinds = ThreadKindStack.Pop() & ThreadKinds.SourceMask; if (threadKinds != source && threadKinds != ThreadKinds.Other && System.Net.NetEventSource.IsEnabled) { System.Net.NetEventSource.Fail(null, $"Thread source changed.|Was:({threadKinds}) Now:({source})", "SetThreadSource"); } ThreadKindStack.Push(source); } } } [Flags] internal enum ThreadKinds { Unknown = 0, User = 1, System = 2, Sync = 4, Async = 8, Timer = 0x10, CompletionPort = 0x20, Worker = 0x40, Finalization = 0x80, Other = 0x100, OwnerMask = 3, SyncMask = 0xC, SourceMask = 0x1F0, SafeSources = 0x160, ThreadPool = 0x60 } internal sealed class NetEventSource : EventSource { public class Keywords { public const EventKeywords Default = (EventKeywords)1L; public const EventKeywords Debug = (EventKeywords)2L; public const EventKeywords EnterExit = (EventKeywords)4L; } public static readonly System.Net.NetEventSource Log = new System.Net.NetEventSource(); private const string MissingMember = "(?)"; private const string NullInstance = "(null)"; private const string StaticMethodObject = "(static)"; private const string NoParameters = ""; private const int MaxDumpSize = 1024; private const int EnterEventId = 1; private const int ExitEventId = 2; private const int AssociateEventId = 3; private const int InfoEventId = 4; private const int ErrorEventId = 5; private const int CriticalFailureEventId = 6; private const int DumpArrayEventId = 7; private const int NextAvailableEventId = 8; public new static bool IsEnabled => Log.IsEnabled(); [NonEvent] public static void Enter(object thisOrContextObject, FormattableString formattableString = null, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.Enter(IdOf(thisOrContextObject), memberName, (formattableString != null) ? Format(formattableString) : ""); } } [NonEvent] public static void Enter(object thisOrContextObject, object arg0, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.Enter(IdOf(thisOrContextObject), memberName, $"({Format(arg0)})"); } } [NonEvent] public static void Enter(object thisOrContextObject, object arg0, object arg1, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.Enter(IdOf(thisOrContextObject), memberName, $"({Format(arg0)}, {Format(arg1)})"); } } [NonEvent] public static void Enter(object thisOrContextObject, object arg0, object arg1, object arg2, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.Enter(IdOf(thisOrContextObject), memberName, $"({Format(arg0)}, {Format(arg1)}, {Format(arg2)})"); } } [Event(1, Level = EventLevel.Informational, Keywords = (EventKeywords)4L)] private void Enter(string thisOrContextObject, string memberName, string parameters) { WriteEvent(1, thisOrContextObject, memberName ?? "(?)", parameters); } [NonEvent] public static void Exit(object thisOrContextObject, FormattableString formattableString = null, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.Exit(IdOf(thisOrContextObject), memberName, (formattableString != null) ? Format(formattableString) : ""); } } [NonEvent] public static void Exit(object thisOrContextObject, object arg0, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.Exit(IdOf(thisOrContextObject), memberName, Format(arg0).ToString()); } } [NonEvent] public static void Exit(object thisOrContextObject, object arg0, object arg1, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.Exit(IdOf(thisOrContextObject), memberName, $"{Format(arg0)}, {Format(arg1)}"); } } [Event(2, Level = EventLevel.Informational, Keywords = (EventKeywords)4L)] private void Exit(string thisOrContextObject, string memberName, string result) { WriteEvent(2, thisOrContextObject, memberName ?? "(?)", result); } [NonEvent] public static void Info(object thisOrContextObject, FormattableString formattableString = null, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.Info(IdOf(thisOrContextObject), memberName, (formattableString != null) ? Format(formattableString) : ""); } } [NonEvent] public static void Info(object thisOrContextObject, object message, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.Info(IdOf(thisOrContextObject), memberName, Format(message).ToString()); } } [Event(4, Level = EventLevel.Informational, Keywords = (EventKeywords)1L)] private void Info(string thisOrContextObject, string memberName, string message) { WriteEvent(4, thisOrContextObject, memberName ?? "(?)", message); } [NonEvent] public static void Error(object thisOrContextObject, FormattableString formattableString, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.ErrorMessage(IdOf(thisOrContextObject), memberName, Format(formattableString)); } } [NonEvent] public static void Error(object thisOrContextObject, object message, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.ErrorMessage(IdOf(thisOrContextObject), memberName, Format(message).ToString()); } } [Event(5, Level = EventLevel.Warning, Keywords = (EventKeywords)1L)] private void ErrorMessage(string thisOrContextObject, string memberName, string message) { WriteEvent(5, thisOrContextObject, memberName ?? "(?)", message); } [NonEvent] public static void Fail(object thisOrContextObject, FormattableString formattableString, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.CriticalFailure(IdOf(thisOrContextObject), memberName, Format(formattableString)); } } [NonEvent] public static void Fail(object thisOrContextObject, object message, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.CriticalFailure(IdOf(thisOrContextObject), memberName, Format(message).ToString()); } } [Event(6, Level = EventLevel.Critical, Keywords = (EventKeywords)2L)] private void CriticalFailure(string thisOrContextObject, string memberName, string message) { WriteEvent(6, thisOrContextObject, memberName ?? "(?)", message); } [NonEvent] public static void DumpBuffer(object thisOrContextObject, byte[] buffer, [CallerMemberName] string memberName = null) { DumpBuffer(thisOrContextObject, buffer, 0, buffer.Length, memberName); } [NonEvent] public static void DumpBuffer(object thisOrContextObject, byte[] buffer, int offset, int count, [CallerMemberName] string memberName = null) { if (!IsEnabled) { return; } if (offset < 0 || offset > buffer.Length - count) { Fail(thisOrContextObject, FormattableStringFactory.Create("Invalid {0} Args. Length={1}, Offset={2}, Count={3}", "DumpBuffer", buffer.Length, offset, count), memberName); return; } count = Math.Min(count, 1024); byte[] array = buffer; if (offset != 0 || count != buffer.Length) { array = new byte[count]; Buffer.BlockCopy(buffer, offset, array, 0, count); } Log.DumpBuffer(IdOf(thisOrContextObject), memberName, array); } [NonEvent] public unsafe static void DumpBuffer(object thisOrContextObject, IntPtr bufferPtr, int count, [CallerMemberName] string memberName = null) { if (IsEnabled) { byte[] array = new byte[Math.Min(count, 1024)]; fixed (byte* destination = array) { Buffer.MemoryCopy((void*)bufferPtr, destination, array.Length, array.Length); } Log.DumpBuffer(IdOf(thisOrContextObject), memberName, array); } } [Event(7, Level = EventLevel.Verbose, Keywords = (EventKeywords)2L)] private void DumpBuffer(string thisOrContextObject, string memberName, byte[] buffer) { WriteEvent(7, thisOrContextObject, memberName ?? "(?)", buffer); } [NonEvent] public static void Associate(object first, object second, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.Associate(IdOf(first), memberName, IdOf(first), IdOf(second)); } } [NonEvent] public static void Associate(object thisOrContextObject, object first, object second, [CallerMemberName] string memberName = null) { if (IsEnabled) { Log.Associate(IdOf(thisOrContextObject), memberName, IdOf(first), IdOf(second)); } } [Event(3, Level = EventLevel.Informational, Keywords = (EventKeywords)1L, Message = "[{2}]<-->[{3}]")] private void Associate(string thisOrContextObject, string memberName, string first, string second) { WriteEvent(3, thisOrContextObject, memberName ?? "(?)", first, second); } [Conditional("DEBUG_NETEVENTSOURCE_MISUSE")] private static void DebugValidateArg(object arg) { _ = IsEnabled; } [Conditional("DEBUG_NETEVENTSOURCE_MISUSE")] private static void DebugValidateArg(FormattableString arg) { } [NonEvent] public static string IdOf(object value) { if (value == null) { return "(null)"; } return value.GetType().Name + "#" + GetHashCode(value); } [NonEvent] public static int GetHashCode(object value) { return value?.GetHashCode() ?? 0; } [NonEvent] public static object Format(object value) { if (value == null) { return "(null)"; } string text = null; if (text != null) { return text; } if (value is Array array) { return $"{array.GetType().GetElementType()}[{((Array)value).Length}]"; } if (value is ICollection collection) { return $"{collection.GetType().Name}({collection.Count})"; } if (value is SafeHandle safeHandle) { return $"{safeHandle.GetType().Name}:{safeHandle.GetHashCode()}(0x{safeHandle.DangerousGetHandle():X})"; } if (value is IntPtr) { return $"0x{value:X}"; } string text2 = value.ToString(); if (text2 == null || text2 == value.GetType().FullName) { return IdOf(value); } return value; } [NonEvent] private static string Format(FormattableString s) { switch (s.ArgumentCount) { case 0: return s.Format; case 1: return string.Format(s.Format, Format(s.GetArgument(0))); case 2: return string.Format(s.Format, Format(s.GetArgument(0)), Format(s.GetArgument(1))); case 3: return string.Format(s.Format, Format(s.GetArgument(0)), Format(s.GetArgument(1)), Format(s.GetArgument(2))); default: { object[] arguments = s.GetArguments(); object[] array = new object[arguments.Length]; for (int i = 0; i < arguments.Length; i++) { array[i] = Format(arguments[i]); } return string.Format(s.Format, array); } } } [NonEvent] private unsafe void WriteEvent(int eventId, string arg1, string arg2, string arg3, string arg4) { if (!IsEnabled()) { return; } if (arg1 == null) { arg1 = ""; } if (arg2 == null) { arg2 = ""; } if (arg3 == null) { arg3 = ""; } if (arg4 == null) { arg4 = ""; } fixed (char* ptr2 = arg1) { fixed (char* ptr3 = arg2) { fixed (char* ptr4 = arg3) { fixed (char* ptr5 = arg4) { EventData* ptr = stackalloc EventData[4]; ptr->DataPointer = (IntPtr)ptr2; ptr->Size = (arg1.Length + 1) * 2; ptr[1].DataPointer = (IntPtr)ptr3; ptr[1].Size = (arg2.Length + 1) * 2; ptr[2].DataPointer = (IntPtr)ptr4; ptr[2].Size = (arg3.Length + 1) * 2; ptr[3].DataPointer = (IntPtr)ptr5; ptr[3].Size = (arg4.Length + 1) * 2; WriteEventCore(eventId, 4, ptr); } } } } } [NonEvent] private unsafe void WriteEvent(int eventId, string arg1, string arg2, byte[] arg3) { if (!IsEnabled()) { return; } if (arg1 == null) { arg1 = ""; } if (arg2 == null) { arg2 = ""; } if (arg3 == null) { arg3 = Array.Empty(); } fixed (char* ptr2 = arg1) { fixed (char* ptr3 = arg2) { fixed (byte* ptr4 = arg3) { int size = arg3.Length; EventData* ptr = stackalloc EventData[4]; ptr->DataPointer = (IntPtr)ptr2; ptr->Size = (arg1.Length + 1) * 2; ptr[1].DataPointer = (IntPtr)ptr3; ptr[1].Size = (arg2.Length + 1) * 2; ptr[2].DataPointer = (IntPtr)(&size); ptr[2].Size = 4; ptr[3].DataPointer = (IntPtr)ptr4; ptr[3].Size = size; WriteEventCore(eventId, 4, ptr); } } } } [NonEvent] private unsafe void WriteEvent(int eventId, string arg1, int arg2, int arg3, int arg4) { if (IsEnabled()) { if (arg1 == null) { arg1 = ""; } fixed (char* ptr2 = arg1) { EventData* ptr = stackalloc EventData[4]; ptr->DataPointer = (IntPtr)ptr2; ptr->Size = (arg1.Length + 1) * 2; ptr[1].DataPointer = (IntPtr)(&arg2); ptr[1].Size = 4; ptr[2].DataPointer = (IntPtr)(&arg3); ptr[2].Size = 4; ptr[3].DataPointer = (IntPtr)(&arg4); ptr[3].Size = 4; WriteEventCore(eventId, 4, ptr); } } } [NonEvent] private unsafe void WriteEvent(int eventId, string arg1, int arg2, string arg3) { if (!IsEnabled()) { return; } if (arg1 == null) { arg1 = ""; } if (arg3 == null) { arg3 = ""; } fixed (char* ptr2 = arg1) { fixed (char* ptr3 = arg3) { EventData* ptr = stackalloc EventData[3]; ptr->DataPointer = (IntPtr)ptr2; ptr->Size = (arg1.Length + 1) * 2; ptr[1].DataPointer = (IntPtr)(&arg2); ptr[1].Size = 4; ptr[2].DataPointer = (IntPtr)ptr3; ptr[2].Size = (arg3.Length + 1) * 2; WriteEventCore(eventId, 3, ptr); } } } [NonEvent] private unsafe void WriteEvent(int eventId, string arg1, string arg2, int arg3) { if (!IsEnabled()) { return; } if (arg1 == null) { arg1 = ""; } if (arg2 == null) { arg2 = ""; } fixed (char* ptr2 = arg1) { fixed (char* ptr3 = arg2) { EventData* ptr = stackalloc EventData[3]; ptr->DataPointer = (IntPtr)ptr2; ptr->Size = (arg1.Length + 1) * 2; ptr[1].DataPointer = (IntPtr)ptr3; ptr[1].Size = (arg2.Length + 1) * 2; ptr[2].DataPointer = (IntPtr)(&arg3); ptr[2].Size = 4; WriteEventCore(eventId, 3, ptr); } } } [NonEvent] private unsafe void WriteEvent(int eventId, string arg1, string arg2, string arg3, int arg4) { if (!IsEnabled()) { return; } if (arg1 == null) { arg1 = ""; } if (arg2 == null) { arg2 = ""; } if (arg3 == null) { arg3 = ""; } fixed (char* ptr2 = arg1) { fixed (char* ptr3 = arg2) { fixed (char* ptr4 = arg3) { EventData* ptr = stackalloc EventData[4]; ptr->DataPointer = (IntPtr)ptr2; ptr->Size = (arg1.Length + 1) * 2; ptr[1].DataPointer = (IntPtr)ptr3; ptr[1].Size = (arg2.Length + 1) * 2; ptr[2].DataPointer = (IntPtr)ptr4; ptr[2].Size = (arg3.Length + 1) * 2; ptr[3].DataPointer = (IntPtr)(&arg4); ptr[3].Size = 4; WriteEventCore(eventId, 4, ptr); } } } } } internal class NegotiationInfoClass { internal const string NTLM = "NTLM"; internal const string Kerberos = "Kerberos"; internal const string Negotiate = "Negotiate"; internal const string Basic = "Basic"; } internal struct SecurityStatusPal { public readonly System.Net.SecurityStatusPalErrorCode ErrorCode; public readonly Exception Exception; public SecurityStatusPal(System.Net.SecurityStatusPalErrorCode errorCode, Exception exception = null) { ErrorCode = errorCode; Exception = exception; } public override string ToString() { if (Exception != null) { return string.Format("{0}={1}, {2}={3}", "ErrorCode", ErrorCode, "Exception", Exception); } return string.Format("{0}={1}", "ErrorCode", ErrorCode); } } internal enum SecurityStatusPalErrorCode { NotSet, OK, ContinueNeeded, CompleteNeeded, CompAndContinue, ContextExpired, CredentialsNeeded, Renegotiate, OutOfMemory, InvalidHandle, Unsupported, TargetUnknown, InternalError, PackageNotFound, NotOwner, CannotInstall, InvalidToken, CannotPack, QopNotSupported, NoImpersonation, LogonDenied, UnknownCredentials, NoCredentials, MessageAltered, OutOfSequence, NoAuthenticatingAuthority, IncompleteMessage, IncompleteCredentials, BufferNotEnough, WrongPrincipal, TimeSkew, UntrustedRoot, IllegalMessage, CertUnknown, CertExpired, AlgorithmMismatch, SecurityQosFailed, SmartcardLogonRequired, UnsupportedPreauth, BadBinding, DowngradeDetected } } namespace System.Net.Security { internal static class NegotiateStreamPal { private const int NTE_FAIL = -2146893792; internal static string QueryContextClientSpecifiedSpn(System.Net.Security.SafeDeleteContext securityContext) { throw new PlatformNotSupportedException("Server implementation is not supported."); } internal static string QueryContextAuthenticationPackage(System.Net.Security.SafeDeleteContext securityContext) { if (!((System.Net.Security.SafeDeleteNegoContext)securityContext).IsNtlmUsed) { return "Kerberos"; } return "NTLM"; } private static byte[] GssWrap(Microsoft.Win32.SafeHandles.SafeGssContextHandle context, bool encrypt, byte[] buffer, int offset, int count) { global::Interop.NetSecurityNative.GssBuffer outBuffer = default(global::Interop.NetSecurityNative.GssBuffer); try { global::Interop.NetSecurityNative.Status minorStatus; global::Interop.NetSecurityNative.Status status = global::Interop.NetSecurityNative.WrapBuffer(out minorStatus, context, encrypt, buffer, offset, count, ref outBuffer); if (status != 0) { throw new global::Interop.NetSecurityNative.GssApiException(status, minorStatus); } return outBuffer.ToByteArray(); } finally { outBuffer.Dispose(); } } private static int GssUnwrap(Microsoft.Win32.SafeHandles.SafeGssContextHandle context, byte[] buffer, int offset, int count) { global::Interop.NetSecurityNative.GssBuffer outBuffer = default(global::Interop.NetSecurityNative.GssBuffer); try { global::Interop.NetSecurityNative.Status minorStatus; global::Interop.NetSecurityNative.Status status = global::Interop.NetSecurityNative.UnwrapBuffer(out minorStatus, context, buffer, offset, count, ref outBuffer); if (status != 0) { throw new global::Interop.NetSecurityNative.GssApiException(status, minorStatus); } return outBuffer.Copy(buffer, offset); } finally { outBuffer.Dispose(); } } private static bool GssInitSecurityContext(ref Microsoft.Win32.SafeHandles.SafeGssContextHandle context, Microsoft.Win32.SafeHandles.SafeGssCredHandle credential, bool isNtlm, Microsoft.Win32.SafeHandles.SafeGssNameHandle targetName, global::Interop.NetSecurityNative.GssFlags inFlags, byte[] buffer, out byte[] outputBuffer, out uint outFlags, out int isNtlmUsed) { outputBuffer = null; outFlags = 0u; if (context == null) { context = new Microsoft.Win32.SafeHandles.SafeGssContextHandle(); } global::Interop.NetSecurityNative.GssBuffer token = default(global::Interop.NetSecurityNative.GssBuffer); global::Interop.NetSecurityNative.Status status; try { status = global::Interop.NetSecurityNative.InitSecContext(out var minorStatus, credential, ref context, isNtlm, targetName, (uint)inFlags, buffer, (buffer != null) ? buffer.Length : 0, ref token, out outFlags, out isNtlmUsed); if (status != 0 && status != global::Interop.NetSecurityNative.Status.GSS_S_CONTINUE_NEEDED) { throw new global::Interop.NetSecurityNative.GssApiException(status, minorStatus); } outputBuffer = token.ToByteArray(); } finally { token.Dispose(); } return status == global::Interop.NetSecurityNative.Status.GSS_S_COMPLETE; } private static System.Net.SecurityStatusPal EstablishSecurityContext(System.Net.Security.SafeFreeNegoCredentials credential, ref System.Net.Security.SafeDeleteContext context, string targetName, System.Net.ContextFlagsPal inFlags, SecurityBuffer inputBuffer, SecurityBuffer outputBuffer, ref System.Net.ContextFlagsPal outFlags) { bool isNtlmOnly = credential.IsNtlmOnly; if (context == null) { context = (isNtlmOnly ? new System.Net.Security.SafeDeleteNegoContext(credential, credential.UserName) : new System.Net.Security.SafeDeleteNegoContext(credential, targetName)); } System.Net.Security.SafeDeleteNegoContext safeDeleteNegoContext = (System.Net.Security.SafeDeleteNegoContext)context; try { global::Interop.NetSecurityNative.GssFlags interopFromContextFlagsPal = System.Net.ContextFlagsAdapterPal.GetInteropFromContextFlagsPal(inFlags, isServer: false); Microsoft.Win32.SafeHandles.SafeGssContextHandle context2 = safeDeleteNegoContext.GssContext; uint outFlags2; int isNtlmUsed; bool num = GssInitSecurityContext(ref context2, credential.GssCredential, isNtlmOnly, safeDeleteNegoContext.TargetName, interopFromContextFlagsPal, inputBuffer?.token, out outputBuffer.token, out outFlags2, out isNtlmUsed); outputBuffer.size = outputBuffer.token.Length; outputBuffer.offset = 0; outFlags = System.Net.ContextFlagsAdapterPal.GetContextFlagsPalFromInterop((global::Interop.NetSecurityNative.GssFlags)outFlags2, isServer: false); if (safeDeleteNegoContext.GssContext == null) { safeDeleteNegoContext.SetGssContext(context2); } if (num) { safeDeleteNegoContext.SetAuthenticationPackage(Convert.ToBoolean(isNtlmUsed)); } return new System.Net.SecurityStatusPal((!num) ? System.Net.SecurityStatusPalErrorCode.ContinueNeeded : ((safeDeleteNegoContext.IsNtlmUsed && outputBuffer.size > 0) ? System.Net.SecurityStatusPalErrorCode.OK : System.Net.SecurityStatusPalErrorCode.CompleteNeeded)); } catch (Exception ex) { if (System.Net.NetEventSource.IsEnabled) { System.Net.NetEventSource.Error(null, ex, "EstablishSecurityContext"); } return new System.Net.SecurityStatusPal(System.Net.SecurityStatusPalErrorCode.InternalError, ex); } } internal static System.Net.SecurityStatusPal InitializeSecurityContext(System.Net.Security.SafeFreeCredentials credentialsHandle, ref System.Net.Security.SafeDeleteContext securityContext, string spn, System.Net.ContextFlagsPal requestedContextFlags, SecurityBuffer[] inSecurityBufferArray, SecurityBuffer outSecurityBuffer, ref System.Net.ContextFlagsPal contextFlags) { if (inSecurityBufferArray != null && inSecurityBufferArray.Length > 1) { throw new PlatformNotSupportedException("No support for channel binding on operating systems other than Windows."); } System.Net.Security.SafeFreeNegoCredentials obj = (System.Net.Security.SafeFreeNegoCredentials)credentialsHandle; if (obj.IsDefault && string.IsNullOrEmpty(spn)) { throw new PlatformNotSupportedException("Target name should be non-empty if default credentials are passed."); } System.Net.SecurityStatusPal result = EstablishSecurityContext(obj, ref securityContext, spn, requestedContextFlags, (inSecurityBufferArray != null && inSecurityBufferArray.Length != 0) ? inSecurityBufferArray[0] : null, outSecurityBuffer, ref contextFlags); if (result.ErrorCode == System.Net.SecurityStatusPalErrorCode.CompleteNeeded) { System.Net.ContextFlagsPal contextFlagsPal = System.Net.ContextFlagsPal.Confidentiality; if ((requestedContextFlags & contextFlagsPal) != (contextFlags & contextFlagsPal)) { throw new PlatformNotSupportedException("Requested protection level is not supported with the GSSAPI implementation currently installed."); } } return result; } internal static System.Net.SecurityStatusPal AcceptSecurityContext(System.Net.Security.SafeFreeCredentials credentialsHandle, ref System.Net.Security.SafeDeleteContext securityContext, System.Net.ContextFlagsPal requestedContextFlags, SecurityBuffer[] inSecurityBufferArray, SecurityBuffer outSecurityBuffer, ref System.Net.ContextFlagsPal contextFlags) { throw new PlatformNotSupportedException("Server implementation is not supported."); } internal static Win32Exception CreateExceptionFromError(System.Net.SecurityStatusPal statusCode) { return new Win32Exception(-2146893792, (statusCode.Exception != null) ? statusCode.Exception.Message : statusCode.ErrorCode.ToString()); } internal static int QueryMaxTokenSize(string package) { return 0; } internal static System.Net.Security.SafeFreeCredentials AcquireDefaultCredential(string package, bool isServer) { return AcquireCredentialsHandle(package, isServer, new NetworkCredential(string.Empty, string.Empty, string.Empty)); } internal static System.Net.Security.SafeFreeCredentials AcquireCredentialsHandle(string package, bool isServer, NetworkCredential credential) { if (isServer) { throw new PlatformNotSupportedException("Server implementation is not supported."); } bool flag = string.IsNullOrWhiteSpace(credential.UserName) || string.IsNullOrWhiteSpace(credential.Password); bool flag2 = string.Equals(package, "NTLM", StringComparison.OrdinalIgnoreCase); if (flag2 && flag) { throw new PlatformNotSupportedException("NTLM authentication is not possible with default credentials on this platform."); } try { return flag ? new System.Net.Security.SafeFreeNegoCredentials(isNtlmOnly: false, string.Empty, string.Empty, string.Empty) : new System.Net.Security.SafeFreeNegoCredentials(flag2, credential.UserName, credential.Password, credential.Domain); } catch (Exception ex) { throw new Win32Exception(-2146893792, ex.Message); } } internal static System.Net.SecurityStatusPal CompleteAuthToken(ref System.Net.Security.SafeDeleteContext securityContext, SecurityBuffer[] inSecurityBufferArray) { return new System.Net.SecurityStatusPal(System.Net.SecurityStatusPalErrorCode.OK); } internal static int Encrypt(System.Net.Security.SafeDeleteContext securityContext, byte[] buffer, int offset, int count, bool isConfidential, bool isNtlm, ref byte[] output, uint sequenceNumber) { byte[] array = GssWrap(((System.Net.Security.SafeDeleteNegoContext)securityContext).GssContext, isConfidential, buffer, offset, count); output = new byte[array.Length + 4]; Array.Copy(array, 0, output, 4, array.Length); int num = array.Length; output[0] = (byte)((uint)num & 0xFFu); output[1] = (byte)((uint)(num >> 8) & 0xFFu); output[2] = (byte)((uint)(num >> 16) & 0xFFu); output[3] = (byte)((uint)(num >> 24) & 0xFFu); return num + 4; } internal static int Decrypt(System.Net.Security.SafeDeleteContext securityContext, byte[] buffer, int offset, int count, bool isConfidential, bool isNtlm, out int newOffset, uint sequenceNumber) { if (offset < 0 || offset > ((buffer != null) ? buffer.Length : 0)) { System.Net.NetEventSource.Fail(securityContext, "Argument 'offset' out of range", "Decrypt"); throw new ArgumentOutOfRangeException("offset"); } if (count < 0 || count > ((buffer != null) ? (buffer.Length - offset) : 0)) { System.Net.NetEventSource.Fail(securityContext, "Argument 'count' out of range.", "Decrypt"); throw new ArgumentOutOfRangeException("count"); } newOffset = offset; return GssUnwrap(((System.Net.Security.SafeDeleteNegoContext)securityContext).GssContext, buffer, offset, count); } internal static int VerifySignature(System.Net.Security.SafeDeleteContext securityContext, byte[] buffer, int offset, int count) { if (offset < 0 || offset > ((buffer != null) ? buffer.Length : 0)) { System.Net.NetEventSource.Fail(securityContext, "Argument 'offset' out of range", "VerifySignature"); throw new ArgumentOutOfRangeException("offset"); } if (count < 0 || count > ((buffer != null) ? (buffer.Length - offset) : 0)) { System.Net.NetEventSource.Fail(securityContext, "Argument 'count' out of range.", "VerifySignature"); throw new ArgumentOutOfRangeException("count"); } return GssUnwrap(((System.Net.Security.SafeDeleteNegoContext)securityContext).GssContext, buffer, offset, count); } internal static int MakeSignature(System.Net.Security.SafeDeleteContext securityContext, byte[] buffer, int offset, int count, ref byte[] output) { byte[] array = GssWrap(((System.Net.Security.SafeDeleteNegoContext)securityContext).GssContext, encrypt: false, buffer, offset, count); output = new byte[array.Length + 4]; Array.Copy(array, 0, output, 4, array.Length); int num = array.Length; output[0] = (byte)((uint)num & 0xFFu); output[1] = (byte)((uint)(num >> 8) & 0xFFu); output[2] = (byte)((uint)(num >> 16) & 0xFFu); output[3] = (byte)((uint)(num >> 24) & 0xFFu); return num + 4; } } internal class SecurityBuffer { public int size; public SecurityBufferType type; public byte[] token; public SafeHandle unmanagedToken; public int offset; public SecurityBuffer(byte[] data, int offset, int size, SecurityBufferType tokentype) { if (offset < 0 || offset > ((data != null) ? data.Length : 0)) { System.Net.NetEventSource.Fail(this, $"'offset' out of range. [{offset}]", ".ctor"); } if (size < 0 || size > ((data != null) ? (data.Length - offset) : 0)) { System.Net.NetEventSource.Fail(this, $"'size' out of range. [{size}]", ".ctor"); } this.offset = ((data != null && offset >= 0) ? Math.Min(offset, data.Length) : 0); this.size = ((data != null && size >= 0) ? Math.Min(size, data.Length - this.offset) : 0); type = tokentype; token = ((size == 0) ? null : data); } public SecurityBuffer(byte[] data, SecurityBufferType tokentype) { size = ((data != null) ? data.Length : 0); type = tokentype; token = ((size == 0) ? null : data); } public SecurityBuffer(int size, SecurityBufferType tokentype) { if (size < 0) { System.Net.NetEventSource.Fail(this, $"'size' out of range. [{size}]", ".ctor"); } this.size = size; type = tokentype; token = ((size == 0) ? null : new byte[size]); } public SecurityBuffer(ChannelBinding binding) { size = binding?.Size ?? 0; type = SecurityBufferType.SECBUFFER_CHANNEL_BINDINGS; unmanagedToken = binding; } } internal enum SecurityBufferType { SECBUFFER_EMPTY = 0, SECBUFFER_DATA = 1, SECBUFFER_TOKEN = 2, SECBUFFER_PKG_PARAMS = 3, SECBUFFER_MISSING = 4, SECBUFFER_EXTRA = 5, SECBUFFER_STREAM_TRAILER = 6, SECBUFFER_STREAM_HEADER = 7, SECBUFFER_PADDING = 9, SECBUFFER_STREAM = 10, SECBUFFER_CHANNEL_BINDINGS = 14, SECBUFFER_TARGET_HOST = 16, SECBUFFER_ALERT = 17, SECBUFFER_APPLICATION_PROTOCOLS = 18, SECBUFFER_READONLY = int.MinValue, SECBUFFER_READONLY_WITH_CHECKSUM = 268435456 } internal abstract class SafeDeleteContext : SafeHandle { private System.Net.Security.SafeFreeCredentials _credential; public override bool IsInvalid => _credential == null; protected SafeDeleteContext(System.Net.Security.SafeFreeCredentials credential) : base(IntPtr.Zero, ownsHandle: true) { bool success = false; _credential = credential; _credential.DangerousAddRef(ref success); } protected override bool ReleaseHandle() { _credential.DangerousRelease(); _credential = null; return true; } } internal sealed class SafeDeleteNegoContext : System.Net.Security.SafeDeleteContext { private Microsoft.Win32.SafeHandles.SafeGssNameHandle _targetName; private Microsoft.Win32.SafeHandles.SafeGssContextHandle _context; private bool _isNtlmUsed; public Microsoft.Win32.SafeHandles.SafeGssNameHandle TargetName => _targetName; public bool IsNtlmUsed => _isNtlmUsed; public Microsoft.Win32.SafeHandles.SafeGssContextHandle GssContext => _context; public SafeDeleteNegoContext(System.Net.Security.SafeFreeNegoCredentials credential, string targetName) : base(credential) { try { _targetName = Microsoft.Win32.SafeHandles.SafeGssNameHandle.CreatePrincipal(targetName); } catch { Dispose(); throw; } } public void SetGssContext(Microsoft.Win32.SafeHandles.SafeGssContextHandle context) { _context = context; } public void SetAuthenticationPackage(bool isNtlmUsed) { _isNtlmUsed = isNtlmUsed; } protected override void Dispose(bool disposing) { if (disposing) { if (_context != null) { _context.Dispose(); _context = null; } if (_targetName != null) { _targetName.Dispose(); _targetName = null; } } base.Dispose(disposing); } } internal abstract class SafeFreeCredentials : SafeHandle { protected SafeFreeCredentials(IntPtr handle, bool ownsHandle) : base(handle, ownsHandle) { } } internal sealed class SafeCredentialReference : CriticalHandleMinusOneIsInvalid { internal System.Net.Security.SafeFreeCredentials Target; internal static System.Net.Security.SafeCredentialReference CreateReference(System.Net.Security.SafeFreeCredentials target) { System.Net.Security.SafeCredentialReference safeCredentialReference = new System.Net.Security.SafeCredentialReference(target); if (safeCredentialReference.IsInvalid) { return null; } return safeCredentialReference; } private SafeCredentialReference(System.Net.Security.SafeFreeCredentials target) { bool success = false; target.DangerousAddRef(ref success); Target = target; SetHandle(new IntPtr(0)); } protected override bool ReleaseHandle() { Target?.DangerousRelease(); Target = null; return true; } } internal sealed class SafeFreeNegoCredentials : System.Net.Security.SafeFreeCredentials { private Microsoft.Win32.SafeHandles.SafeGssCredHandle _credential; private readonly bool _isNtlmOnly; private readonly string _userName; private readonly bool _isDefault; public Microsoft.Win32.SafeHandles.SafeGssCredHandle GssCredential => _credential; public bool IsNtlmOnly => _isNtlmOnly; public string UserName => _userName; public bool IsDefault => _isDefault; public override bool IsInvalid => _credential == null; public SafeFreeNegoCredentials(bool isNtlmOnly, string username, string password, string domain) : base(IntPtr.Zero, ownsHandle: true) { int num = username.IndexOf('\\'); if (num > 0 && username.IndexOf('\\', num + 1) < 0 && string.IsNullOrEmpty(domain)) { domain = username.Substring(0, num); username = username.Substring(num + 1); } if (domain != null) { domain = domain.Trim(); } username = username.Trim(); if (username.IndexOf('@') < 0 && !string.IsNullOrEmpty(domain)) { username = username + "@" + domain; } bool success = false; _isNtlmOnly = isNtlmOnly; _userName = username; _isDefault = string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password); _credential = Microsoft.Win32.SafeHandles.SafeGssCredHandle.Create(username, password, isNtlmOnly); _credential.DangerousAddRef(ref success); } protected override bool ReleaseHandle() { _credential.DangerousRelease(); _credential = null; return true; } } } namespace System.Data { public enum AcceptRejectRule { None, Cascade } internal enum AggregateType { None = 0, Sum = 4, Mean = 5, Min = 6, Max = 7, First = 8, Count = 9, Var = 10, StDev = 11 } public class InternalDataCollectionBase : ICollection, IEnumerable { internal static readonly CollectionChangeEventArgs s_refreshEventArgs = new CollectionChangeEventArgs(CollectionChangeAction.Refresh, null); [Browsable(false)] public virtual int Count => List.Count; [Browsable(false)] public bool IsReadOnly => false; [Browsable(false)] public bool IsSynchronized => false; [Browsable(false)] public object SyncRoot => this; protected virtual ArrayList List => null; public virtual void CopyTo(Array ar, int index) { List.CopyTo(ar, index); } public virtual IEnumerator GetEnumerator() { return List.GetEnumerator(); } internal int NamesEqual(string s1, string s2, bool fCaseSensitive, CultureInfo locale) { if (fCaseSensitive) { if (string.Compare(s1, s2, ignoreCase: false, locale) != 0) { return 0; } return 1; } if (locale.CompareInfo.Compare(s1, s2, CompareOptions.IgnoreCase | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth) == 0) { if (string.Compare(s1, s2, ignoreCase: false, locale) != 0) { return -1; } return 1; } return 0; } } internal sealed class ColumnTypeConverter : TypeConverter { private static readonly Type[] s_types = new Type[35] { typeof(bool), typeof(byte), typeof(byte[]), typeof(char), typeof(DateTime), typeof(decimal), typeof(double), typeof(Guid), typeof(short), typeof(int), typeof(long), typeof(object), typeof(sbyte), typeof(float), typeof(string), typeof(TimeSpan), typeof(ushort), typeof(uint), typeof(ulong), typeof(SqlInt16), typeof(SqlInt32), typeof(SqlInt64), typeof(SqlDecimal), typeof(SqlSingle), typeof(SqlDouble), typeof(SqlString), typeof(SqlBoolean), typeof(SqlBinary), typeof(SqlByte), typeof(SqlDateTime), typeof(SqlGuid), typeof(SqlMoney), typeof(SqlBytes), typeof(SqlChars), typeof(SqlXml) }; private StandardValuesCollection _values; public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { if (!(destinationType == typeof(InstanceDescriptor))) { return base.CanConvertTo(context, destinationType); } return true; } public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (destinationType == null) { throw new ArgumentNullException("destinationType"); } if (destinationType == typeof(string)) { if (value == null) { return string.Empty; } return value.ToString(); } if (value != null && destinationType == typeof(InstanceDescriptor)) { object obj = value; if (value is string) { for (int i = 0; i < s_types.Length; i++) { if (s_types[i].ToString().Equals(value)) { obj = s_types[i]; } } } if (value is Type || value is string) { MethodInfo method = typeof(Type).GetMethod("GetType", new Type[1] { typeof(string) }); if (method != null) { return new InstanceDescriptor(method, new object[1] { ((Type)obj).AssemblyQualifiedName }); } } } return base.ConvertTo(context, culture, value, destinationType); } public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { if (!(sourceType == typeof(string))) { return base.CanConvertTo(context, sourceType); } return true; } public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value != null && value.GetType() == typeof(string)) { for (int i = 0; i < s_types.Length; i++) { if (s_types[i].ToString().Equals(value)) { return s_types[i]; } } return typeof(string); } return base.ConvertFrom(context, culture, value); } public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) { if (_values == null) { object[] array; if (s_types != null) { array = new object[s_types.Length]; Array.Copy(s_types, 0, array, 0, s_types.Length); } else { array = null; } _values = new StandardValuesCollection(array); } return _values; } public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) { return true; } public override bool GetStandardValuesSupported(ITypeDescriptorContext context) { return true; } } [Flags] public enum CommandBehavior { Default = 0, SingleResult = 1, SchemaOnly = 2, KeyInfo = 4, SingleRow = 8, SequentialAccess = 0x10, CloseConnection = 0x20 } public enum CommandType { Text = 1, StoredProcedure = 4, TableDirect = 0x200 } [EventSource(Name = "System.Data.DataCommonEventSource")] internal class DataCommonEventSource : EventSource { internal static readonly DataCommonEventSource Log = new DataCommonEventSource(); private static long s_nextScopeId = 0L; private const int TraceEventId = 1; private const int EnterScopeId = 2; private const int ExitScopeId = 3; [Event(1, Level = EventLevel.Informational)] internal void Trace(string message) { WriteEvent(1, message); } [NonEvent] internal void Trace(string format, T0 arg0) { if (Log.IsEnabled()) { Trace(string.Format(format, arg0)); } } [NonEvent] internal void Trace(string format, T0 arg0, T1 arg1) { if (Log.IsEnabled()) { Trace(string.Format(format, arg0, arg1)); } } [NonEvent] internal void Trace(string format, T0 arg0, T1 arg1, T2 arg2) { if (Log.IsEnabled()) { Trace(string.Format(format, arg0, arg1, arg2)); } } [NonEvent] internal void Trace(string format, T0 arg0, T1 arg1, T2 arg2, T3 arg3) { if (Log.IsEnabled()) { Trace(string.Format(format, arg0, arg1, arg2, arg3)); } } [NonEvent] internal void Trace(string format, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { if (Log.IsEnabled()) { Trace(string.Format(format, arg0, arg1, arg2, arg3, arg4)); } } [NonEvent] internal void Trace(string format, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6) { if (Log.IsEnabled()) { Trace(string.Format(format, arg0, arg1, arg2, arg3, arg4, arg5, arg6)); } } [Event(2, Level = EventLevel.Verbose)] internal long EnterScope(string message) { long num = 0L; if (Log.IsEnabled()) { num = Interlocked.Increment(ref s_nextScopeId); WriteEvent(2, num, message); } return num; } [NonEvent] internal long EnterScope(string format, T1 arg1) { if (!Log.IsEnabled()) { return 0L; } return EnterScope(string.Format(format, arg1)); } [NonEvent] internal long EnterScope(string format, T1 arg1, T2 arg2) { if (!Log.IsEnabled()) { return 0L; } return EnterScope(string.Format(format, arg1, arg2)); } [NonEvent] internal long EnterScope(string format, T1 arg1, T2 arg2, T3 arg3) { if (!Log.IsEnabled()) { return 0L; } return EnterScope(string.Format(format, arg1, arg2, arg3)); } [NonEvent] internal long EnterScope(string format, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { if (!Log.IsEnabled()) { return 0L; } return EnterScope(string.Format(format, arg1, arg2, arg3, arg4)); } [Event(3, Level = EventLevel.Verbose)] internal void ExitScope(long scopeId) { WriteEvent(3, scopeId); } } public enum ConflictOption { CompareAllSearchableValues = 1, CompareRowVersion, OverwriteChanges } [Flags] public enum ConnectionState { Closed = 0, Open = 1, Connecting = 2, Executing = 4, Fetching = 8, Broken = 0x10 } [TypeConverter(typeof(ConstraintConverter))] [DefaultProperty("ConstraintName")] public abstract class Constraint { private string _schemaName = string.Empty; private bool _inCollection; private DataSet _dataSet; internal string _name = string.Empty; internal PropertyCollection _extendedProperties; [DefaultValue("")] public virtual string ConstraintName { get { return _name; } set { if (value == null) { value = string.Empty; } if (string.IsNullOrEmpty(value) && Table != null && InCollection) { throw ExceptionBuilder.NoConstraintName(); } CultureInfo culture = ((Table != null) ? Table.Locale : CultureInfo.CurrentCulture); if (string.Compare(_name, value, ignoreCase: true, culture) != 0) { if (Table != null && InCollection) { Table.Constraints.RegisterName(value); if (_name.Length != 0) { Table.Constraints.UnregisterName(_name); } } _name = value; } else if (string.Compare(_name, value, ignoreCase: false, culture) != 0) { _name = value; } } } internal string SchemaName { get { if (!string.IsNullOrEmpty(_schemaName)) { return _schemaName; } return ConstraintName; } set { if (!string.IsNullOrEmpty(value)) { _schemaName = value; } } } internal virtual bool InCollection { get { return _inCollection; } set { _inCollection = value; _dataSet = (value ? Table.DataSet : null); } } public abstract DataTable Table { get; } [Browsable(false)] public PropertyCollection ExtendedProperties => _extendedProperties ?? (_extendedProperties = new PropertyCollection()); [CLSCompliant(false)] protected virtual DataSet _DataSet => _dataSet; internal abstract bool ContainsColumn(DataColumn column); internal abstract bool CanEnableConstraint(); internal abstract Constraint Clone(DataSet destination); internal abstract Constraint Clone(DataSet destination, bool ignoreNSforTableLookup); internal void CheckConstraint() { if (!CanEnableConstraint()) { throw ExceptionBuilder.ConstraintViolation(ConstraintName); } } internal abstract void CheckCanAddToCollection(ConstraintCollection constraint); internal abstract bool CanBeRemovedFromCollection(ConstraintCollection constraint, bool fThrowException); internal abstract void CheckConstraint(DataRow row, DataRowAction action); internal abstract void CheckState(); protected void CheckStateForProperty() { try { CheckState(); } catch (Exception ex) when (ADP.IsCatchableExceptionType(ex)) { throw ExceptionBuilder.BadObjectPropertyAccess(ex.Message); } } protected internal void SetDataSet(DataSet dataSet) { _dataSet = dataSet; } internal abstract bool IsConstraintViolated(); public override string ToString() { return ConstraintName; } } [DefaultEvent("CollectionChanged")] public sealed class ConstraintCollection : InternalDataCollectionBase { private readonly DataTable _table; private readonly ArrayList _list; private int _defaultNameIndex; private CollectionChangeEventHandler _onCollectionChanged; private Constraint[] _delayLoadingConstraints; private bool _fLoadForeignKeyConstraintsOnly; protected override ArrayList List => _list; public Constraint this[int index] { get { if (index >= 0 && index < List.Count) { return (Constraint)List[index]; } throw ExceptionBuilder.ConstraintOutOfRange(index); } } internal DataTable Table => _table; public Constraint this[string name] { get { int num = InternalIndexOf(name); if (num == -2) { throw ExceptionBuilder.CaseInsensitiveNameConflict(name); } if (num >= 0) { return (Constraint)List[num]; } return null; } } public event CollectionChangeEventHandler CollectionChanged { add { _onCollectionChanged = (CollectionChangeEventHandler)Delegate.Combine(_onCollectionChanged, value); } remove { _onCollectionChanged = (CollectionChangeEventHandler)Delegate.Remove(_onCollectionChanged, value); } } internal ConstraintCollection(DataTable table) { _list = new ArrayList(); _defaultNameIndex = 1; base..ctor(); _table = table; } public void Add(Constraint constraint) { Add(constraint, addUniqueWhenAddingForeign: true); } internal void Add(Constraint constraint, bool addUniqueWhenAddingForeign) { if (constraint == null) { throw ExceptionBuilder.ArgumentNull("constraint"); } if (FindConstraint(constraint) != null) { throw ExceptionBuilder.DuplicateConstraint(FindConstraint(constraint).ConstraintName); } if (1 < _table.NestedParentRelations.Length && !AutoGenerated(constraint)) { throw ExceptionBuilder.CantAddConstraintToMultipleNestedTable(_table.TableName); } if (constraint is UniqueConstraint) { if (((UniqueConstraint)constraint)._bPrimaryKey && Table._primaryKey != null) { throw ExceptionBuilder.AddPrimaryKeyConstraint(); } AddUniqueConstraint((UniqueConstraint)constraint); } else if (constraint is ForeignKeyConstraint) { ForeignKeyConstraint foreignKeyConstraint = (ForeignKeyConstraint)constraint; if (addUniqueWhenAddingForeign) { UniqueConstraint uniqueConstraint = foreignKeyConstraint.RelatedTable.Constraints.FindKeyConstraint(foreignKeyConstraint.RelatedColumnsReference); if (uniqueConstraint == null) { if (constraint.ConstraintName.Length == 0) { constraint.ConstraintName = AssignName(); } else { RegisterName(constraint.ConstraintName); } uniqueConstraint = new UniqueConstraint(foreignKeyConstraint.RelatedColumnsReference); foreignKeyConstraint.RelatedTable.Constraints.Add(uniqueConstraint); } } AddForeignKeyConstraint((ForeignKeyConstraint)constraint); } BaseAdd(constraint); ArrayAdd(constraint); OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Add, constraint)); if (constraint is UniqueConstraint && ((UniqueConstraint)constraint)._bPrimaryKey) { Table.PrimaryKey = ((UniqueConstraint)constraint).ColumnsReference; } } public Constraint Add(string name, DataColumn[] columns, bool primaryKey) { UniqueConstraint uniqueConstraint = new UniqueConstraint(name, columns); Add(uniqueConstraint); if (primaryKey) { Table.PrimaryKey = columns; } return uniqueConstraint; } public Constraint Add(string name, DataColumn column, bool primaryKey) { UniqueConstraint uniqueConstraint = new UniqueConstraint(name, column); Add(uniqueConstraint); if (primaryKey) { Table.PrimaryKey = uniqueConstraint.ColumnsReference; } return uniqueConstraint; } public Constraint Add(string name, DataColumn primaryKeyColumn, DataColumn foreignKeyColumn) { ForeignKeyConstraint foreignKeyConstraint = new ForeignKeyConstraint(name, primaryKeyColumn, foreignKeyColumn); Add(foreignKeyConstraint); return foreignKeyConstraint; } public Constraint Add(string name, DataColumn[] primaryKeyColumns, DataColumn[] foreignKeyColumns) { ForeignKeyConstraint foreignKeyConstraint = new ForeignKeyConstraint(name, primaryKeyColumns, foreignKeyColumns); Add(foreignKeyConstraint); return foreignKeyConstraint; } public void AddRange(Constraint[] constraints) { if (_table.fInitInProgress) { _delayLoadingConstraints = constraints; _fLoadForeignKeyConstraintsOnly = false; } else { if (constraints == null) { return; } foreach (Constraint constraint in constraints) { if (constraint != null) { Add(constraint); } } } } private void AddUniqueConstraint(UniqueConstraint constraint) { DataColumn[] columnsReference = constraint.ColumnsReference; for (int i = 0; i < columnsReference.Length; i++) { if (columnsReference[i].Table != _table) { throw ExceptionBuilder.ConstraintForeignTable(); } } constraint.ConstraintIndexInitialize(); if (!constraint.CanEnableConstraint()) { constraint.ConstraintIndexClear(); throw ExceptionBuilder.UniqueConstraintViolation(); } } private void AddForeignKeyConstraint(ForeignKeyConstraint constraint) { if (!constraint.CanEnableConstraint()) { throw ExceptionBuilder.ConstraintParentValues(); } constraint.CheckCanAddToCollection(this); } private bool AutoGenerated(Constraint constraint) { if (constraint is ForeignKeyConstraint fk) { return XmlTreeGen.AutoGenerated(fk, checkRelation: false); } return XmlTreeGen.AutoGenerated((UniqueConstraint)constraint); } private void ArrayAdd(Constraint constraint) { List.Add(constraint); } private void ArrayRemove(Constraint constraint) { List.Remove(constraint); } internal string AssignName() { string result = MakeName(_defaultNameIndex); _defaultNameIndex++; return result; } private void BaseAdd(Constraint constraint) { if (constraint == null) { throw ExceptionBuilder.ArgumentNull("constraint"); } if (constraint.ConstraintName.Length == 0) { constraint.ConstraintName = AssignName(); } else { RegisterName(constraint.ConstraintName); } constraint.InCollection = true; } private void BaseGroupSwitch(Constraint[] oldArray, int oldLength, Constraint[] newArray, int newLength) { int num = 0; for (int i = 0; i < oldLength; i++) { bool flag = false; for (int j = num; j < newLength; j++) { if (oldArray[i] == newArray[j]) { if (num == j) { num++; } flag = true; break; } } if (!flag) { BaseRemove(oldArray[i]); List.Remove(oldArray[i]); } } for (int k = 0; k < newLength; k++) { if (!newArray[k].InCollection) { BaseAdd(newArray[k]); } List.Add(newArray[k]); } } private void BaseRemove(Constraint constraint) { if (constraint == null) { throw ExceptionBuilder.ArgumentNull("constraint"); } if (constraint.Table != _table) { throw ExceptionBuilder.ConstraintRemoveFailed(); } UnregisterName(constraint.ConstraintName); constraint.InCollection = false; if (constraint is UniqueConstraint) { for (int i = 0; i < Table.ChildRelations.Count; i++) { DataRelation dataRelation = Table.ChildRelations[i]; if (dataRelation.ParentKeyConstraint == constraint) { dataRelation.SetParentKeyConstraint(null); } } ((UniqueConstraint)constraint).ConstraintIndexClear(); } else { if (!(constraint is ForeignKeyConstraint)) { return; } for (int j = 0; j < Table.ParentRelations.Count; j++) { DataRelation dataRelation2 = Table.ParentRelations[j]; if (dataRelation2.ChildKeyConstraint == constraint) { dataRelation2.SetChildKeyConstraint(null); } } } } public bool CanRemove(Constraint constraint) { return CanRemove(constraint, fThrowException: false); } internal bool CanRemove(Constraint constraint, bool fThrowException) { return constraint.CanBeRemovedFromCollection(this, fThrowException); } public void Clear() { if (_table != null) { _table.PrimaryKey = null; for (int i = 0; i < _table.ParentRelations.Count; i++) { _table.ParentRelations[i].SetChildKeyConstraint(null); } for (int j = 0; j < _table.ChildRelations.Count; j++) { _table.ChildRelations[j].SetParentKeyConstraint(null); } } if (_table.fInitInProgress && _delayLoadingConstraints != null) { _delayLoadingConstraints = null; _fLoadForeignKeyConstraintsOnly = false; } int count = List.Count; Constraint[] array = new Constraint[List.Count]; List.CopyTo(array, 0); try { BaseGroupSwitch(array, count, null, 0); } catch (Exception e) when (ADP.IsCatchableOrSecurityExceptionType(e)) { BaseGroupSwitch(null, 0, array, count); List.Clear(); for (int k = 0; k < count; k++) { List.Add(array[k]); } throw; } List.Clear(); OnCollectionChanged(InternalDataCollectionBase.s_refreshEventArgs); } public bool Contains(string name) { return InternalIndexOf(name) >= 0; } internal bool Contains(string name, bool caseSensitive) { if (!caseSensitive) { return Contains(name); } int num = InternalIndexOf(name); if (num < 0) { return false; } return name == ((Constraint)List[num]).ConstraintName; } public void CopyTo(Constraint[] array, int index) { if (array == null) { throw ExceptionBuilder.ArgumentNull("array"); } if (index < 0) { throw ExceptionBuilder.ArgumentOutOfRange("index"); } if (array.Length - index < _list.Count) { throw ExceptionBuilder.InvalidOffsetLength(); } for (int i = 0; i < _list.Count; i++) { array[index + i] = (Constraint)_list[i]; } } internal Constraint FindConstraint(Constraint constraint) { int count = List.Count; for (int i = 0; i < count; i++) { if (((Constraint)List[i]).Equals(constraint)) { return (Constraint)List[i]; } } return null; } internal UniqueConstraint FindKeyConstraint(DataColumn[] columns) { int count = List.Count; for (int i = 0; i < count; i++) { if (List[i] is UniqueConstraint uniqueConstraint && CompareArrays(uniqueConstraint.Key.ColumnsReference, columns)) { return uniqueConstraint; } } return null; } internal UniqueConstraint FindKeyConstraint(DataColumn column) { int count = List.Count; for (int i = 0; i < count; i++) { if (List[i] is UniqueConstraint uniqueConstraint && uniqueConstraint.Key.ColumnsReference.Length == 1 && uniqueConstraint.Key.ColumnsReference[0] == column) { return uniqueConstraint; } } return null; } internal ForeignKeyConstraint FindForeignKeyConstraint(DataColumn[] parentColumns, DataColumn[] childColumns) { int count = List.Count; for (int i = 0; i < count; i++) { if (List[i] is ForeignKeyConstraint foreignKeyConstraint && CompareArrays(foreignKeyConstraint.ParentKey.ColumnsReference, parentColumns) && CompareArrays(foreignKeyConstraint.ChildKey.ColumnsReference, childColumns)) { return foreignKeyConstraint; } } return null; } private static bool CompareArrays(DataColumn[] a1, DataColumn[] a2) { if (a1.Length != a2.Length) { return false; } for (int i = 0; i < a1.Length; i++) { bool flag = false; for (int j = 0; j < a2.Length; j++) { if (a1[i] == a2[j]) { flag = true; break; } } if (!flag) { return false; } } return true; } public int IndexOf(Constraint constraint) { if (constraint != null) { int count = Count; for (int i = 0; i < count; i++) { if (constraint == (Constraint)List[i]) { return i; } } } return -1; } public int IndexOf(string constraintName) { int num = InternalIndexOf(constraintName); if (num >= 0) { return num; } return -1; } internal int InternalIndexOf(string constraintName) { int num = -1; if (constraintName != null && 0 < constraintName.Length) { int count = List.Count; int num2 = 0; for (int i = 0; i < count; i++) { Constraint constraint = (Constraint)List[i]; switch (NamesEqual(constraint.ConstraintName, constraintName, fCaseSensitive: false, _table.Locale)) { case 1: return i; case -1: num = ((num == -1) ? i : (-2)); break; } } } return num; } private string MakeName(int index) { if (1 == index) { return "Constraint1"; } return "Constraint" + index.ToString(CultureInfo.InvariantCulture); } private void OnCollectionChanged(CollectionChangeEventArgs ccevent) { _onCollectionChanged?.Invoke(this, ccevent); } internal void RegisterName(string name) { int count = List.Count; for (int i = 0; i < count; i++) { if (NamesEqual(name, ((Constraint)List[i]).ConstraintName, fCaseSensitive: true, _table.Locale) != 0) { throw ExceptionBuilder.DuplicateConstraintName(((Constraint)List[i]).ConstraintName); } } if (NamesEqual(name, MakeName(_defaultNameIndex), fCaseSensitive: true, _table.Locale) != 0) { _defaultNameIndex++; } } public void Remove(Constraint constraint) { if (constraint == null) { throw ExceptionBuilder.ArgumentNull("constraint"); } if (CanRemove(constraint, fThrowException: true)) { BaseRemove(constraint); ArrayRemove(constraint); if (constraint is UniqueConstraint && ((UniqueConstraint)constraint).IsPrimaryKey) { Table.PrimaryKey = null; } OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Remove, constraint)); } } public void RemoveAt(int index) { Constraint constraint = this[index]; if (constraint == null) { throw ExceptionBuilder.ConstraintOutOfRange(index); } Remove(constraint); } public void Remove(string name) { Constraint constraint = this[name]; if (constraint == null) { throw ExceptionBuilder.ConstraintNotInTheTable(name); } Remove(constraint); } internal void UnregisterName(string name) { if (NamesEqual(name, MakeName(_defaultNameIndex - 1), fCaseSensitive: true, _table.Locale) != 0) { do { _defaultNameIndex--; } while (_defaultNameIndex > 1 && !Contains(MakeName(_defaultNameIndex - 1))); } } internal void FinishInitConstraints() { if (_delayLoadingConstraints == null) { return; } for (int i = 0; i < _delayLoadingConstraints.Length; i++) { int num; DataColumn[] array; if (_delayLoadingConstraints[i] is UniqueConstraint) { if (_fLoadForeignKeyConstraintsOnly) { continue; } UniqueConstraint uniqueConstraint = (UniqueConstraint)_delayLoadingConstraints[i]; if (uniqueConstraint._columnNames == null) { Add(uniqueConstraint); continue; } num = uniqueConstraint._columnNames.Length; array = new DataColumn[num]; for (int j = 0; j < num; j++) { array[j] = _table.Columns[uniqueConstraint._columnNames[j]]; } if (uniqueConstraint._bPrimaryKey) { if (_table._primaryKey != null) { throw ExceptionBuilder.AddPrimaryKeyConstraint(); } Add(uniqueConstraint.ConstraintName, array, primaryKey: true); } else { UniqueConstraint constraint = new UniqueConstraint(uniqueConstraint._constraintName, array); if (FindConstraint(constraint) == null) { Add(constraint); } } continue; } ForeignKeyConstraint foreignKeyConstraint = (ForeignKeyConstraint)_delayLoadingConstraints[i]; if (foreignKeyConstraint._parentColumnNames == null || foreignKeyConstraint._childColumnNames == null) { Add(foreignKeyConstraint); continue; } if (_table.DataSet == null) { _fLoadForeignKeyConstraintsOnly = true; continue; } num = foreignKeyConstraint._parentColumnNames.Length; array = new DataColumn[num]; DataColumn[] array2 = new DataColumn[num]; for (int k = 0; k < num; k++) { if (foreignKeyConstraint._parentTableNamespace == null) { array[k] = _table.DataSet.Tables[foreignKeyConstraint._parentTableName].Columns[foreignKeyConstraint._parentColumnNames[k]]; } else { array[k] = _table.DataSet.Tables[foreignKeyConstraint._parentTableName, foreignKeyConstraint._parentTableNamespace].Columns[foreignKeyConstraint._parentColumnNames[k]]; } array2[k] = _table.Columns[foreignKeyConstraint._childColumnNames[k]]; } ForeignKeyConstraint foreignKeyConstraint2 = new ForeignKeyConstraint(foreignKeyConstraint._constraintName, array, array2); foreignKeyConstraint2.AcceptRejectRule = foreignKeyConstraint._acceptRejectRule; foreignKeyConstraint2.DeleteRule = foreignKeyConstraint._deleteRule; foreignKeyConstraint2.UpdateRule = foreignKeyConstraint._updateRule; Add(foreignKeyConstraint2); } if (!_fLoadForeignKeyConstraintsOnly) { _delayLoadingConstraints = null; } } internal ConstraintCollection() { ThrowStub.ThrowNotSupportedException(); } } internal sealed class ConstraintConverter : ExpandableObjectConverter { public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { if (!(destinationType == typeof(InstanceDescriptor))) { return base.CanConvertTo(context, destinationType); } return true; } public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (destinationType == null) { throw new ArgumentNullException("destinationType"); } if (destinationType == typeof(InstanceDescriptor) && value is Constraint) { if (value is UniqueConstraint) { UniqueConstraint uniqueConstraint = (UniqueConstraint)value; ConstructorInfo constructor = typeof(UniqueConstraint).GetConstructor(new Type[3] { typeof(string), typeof(string[]), typeof(bool) }); if (constructor != null) { return new InstanceDescriptor(constructor, new object[3] { uniqueConstraint.ConstraintName, uniqueConstraint.ColumnNames, uniqueConstraint.IsPrimaryKey }); } } else { ForeignKeyConstraint foreignKeyConstraint = (ForeignKeyConstraint)value; ConstructorInfo constructor2 = typeof(ForeignKeyConstraint).GetConstructor(new Type[7] { typeof(string), typeof(string), typeof(string[]), typeof(string[]), typeof(AcceptRejectRule), typeof(Rule), typeof(Rule) }); if (constructor2 != null) { return new InstanceDescriptor(constructor2, new object[7] { foreignKeyConstraint.ConstraintName, foreignKeyConstraint.ParentKey.Table.TableName, foreignKeyConstraint.ParentColumnNames, foreignKeyConstraint.ChildColumnNames, foreignKeyConstraint.AcceptRejectRule, foreignKeyConstraint.DeleteRule, foreignKeyConstraint.UpdateRule }); } } } return base.ConvertTo(context, culture, value, destinationType); } } internal class ConstraintEnumerator { private IEnumerator _tables; private IEnumerator _constraints; private Constraint _currentObject; protected Constraint CurrentObject => _currentObject; public ConstraintEnumerator(DataSet dataSet) { _tables = dataSet?.Tables.GetEnumerator(); _currentObject = null; } public bool GetNext() { _currentObject = null; while (_tables != null) { if (_constraints == null) { if (!_tables.MoveNext()) { _tables = null; return false; } _constraints = ((DataTable)_tables.Current).Constraints.GetEnumerator(); } if (!_constraints.MoveNext()) { _constraints = null; continue; } Constraint constraint = (Constraint)_constraints.Current; if (!IsValidCandidate(constraint)) { continue; } _currentObject = constraint; return true; } return false; } public Constraint GetConstraint() { return _currentObject; } protected virtual bool IsValidCandidate(Constraint constraint) { return true; } } internal class ForeignKeyConstraintEnumerator : ConstraintEnumerator { public ForeignKeyConstraintEnumerator(DataSet dataSet) : base(dataSet) { } protected override bool IsValidCandidate(Constraint constraint) { return constraint is ForeignKeyConstraint; } public ForeignKeyConstraint GetForeignKeyConstraint() { return (ForeignKeyConstraint)base.CurrentObject; } } internal sealed class ChildForeignKeyConstraintEnumerator : ForeignKeyConstraintEnumerator { private readonly DataTable _table; public ChildForeignKeyConstraintEnumerator(DataSet dataSet, DataTable inTable) : base(dataSet) { _table = inTable; } protected override bool IsValidCandidate(Constraint constraint) { if (constraint is ForeignKeyConstraint) { return ((ForeignKeyConstraint)constraint).Table == _table; } return false; } } internal sealed class ParentForeignKeyConstraintEnumerator : ForeignKeyConstraintEnumerator { private readonly DataTable _table; public ParentForeignKeyConstraintEnumerator(DataSet dataSet, DataTable inTable) : base(dataSet) { _table = inTable; } protected override bool IsValidCandidate(Constraint constraint) { if (constraint is ForeignKeyConstraint) { return ((ForeignKeyConstraint)constraint).RelatedTable == _table; } return false; } } [Serializable] public sealed class DBConcurrencyException : SystemException { private DataRow[] _dataRows; public DataRow Row { get { DataRow[] dataRows = _dataRows; if (dataRows == null || dataRows.Length == 0) { return null; } return dataRows[0]; } set { _dataRows = new DataRow[1] { value }; } } public int RowCount { get { DataRow[] dataRows = _dataRows; if (dataRows == null) { return 0; } return dataRows.Length; } } public DBConcurrencyException() : this("DB concurrency violation.", null) { } public DBConcurrencyException(string message) : this(message, null) { } public DBConcurrencyException(string message, Exception inner) : base(message, inner) { base.HResult = -2146232011; } public DBConcurrencyException(string message, Exception inner, DataRow[] dataRows) : base(message, inner) { base.HResult = -2146232011; _dataRows = dataRows; } [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)] public override void GetObjectData(SerializationInfo si, StreamingContext context) { base.GetObjectData(si, context); } public void CopyToRows(DataRow[] array) { CopyToRows(array, 0); } public void CopyToRows(DataRow[] array, int arrayIndex) { _dataRows?.CopyTo(array, arrayIndex); } } [DefaultProperty("ColumnName")] [DesignTimeVisible(false)] [ToolboxItem(false)] public class DataColumn : MarshalByValueComponent { private bool _allowNull = true; private string _caption; private string _columnName; private Type _dataType; private StorageType _storageType; internal object _defaultValue = DBNull.Value; private DataSetDateTime _dateTimeMode = DataSetDateTime.UnspecifiedLocal; private DataExpression _expression; private int _maxLength = -1; private int _ordinal = -1; private bool _readOnly; internal Index _sortIndex; internal DataTable _table; private bool _unique; internal MappingType _columnMapping = MappingType.Element; internal int _hashCode; internal int _errors; private bool _isSqlType; private bool _implementsINullable; private bool _implementsIChangeTracking; private bool _implementsIRevertibleChangeTracking; private bool _implementsIXMLSerializable; private bool _defaultValueIsNull = true; internal List _dependentColumns; internal PropertyCollection _extendedProperties; private DataStorage _storage; private AutoIncrementValue _autoInc; internal string _columnUri; private string _columnPrefix = string.Empty; internal string _encodedColumnName; internal SimpleType _simpleType; private static int s_objectTypeCount; private readonly int _objectID = Interlocked.Increment(ref s_objectTypeCount); [DefaultValue(true)] public bool AllowDBNull { get { return _allowNull; } set { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, {1}", ObjectID, value); try { if (_allowNull != value) { if (_table != null && !value && _table.EnforceConstraints) { CheckNotAllowNull(); } _allowNull = value; } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } } [RefreshProperties(RefreshProperties.All)] [DefaultValue(false)] public bool AutoIncrement { get { if (_autoInc != null) { return _autoInc.Auto; } return false; } set { DataCommonEventSource.Log.Trace(" {0}, {1}", ObjectID, value); if (AutoIncrement == value) { return; } if (value) { if (_expression != null) { throw ExceptionBuilder.AutoIncrementAndExpression(); } if (!DefaultValueIsNull) { throw ExceptionBuilder.AutoIncrementAndDefaultValue(); } if (!IsAutoIncrementType(DataType)) { if (HasData) { throw ExceptionBuilder.AutoIncrementCannotSetIfHasData(DataType.Name); } DataType = typeof(int); } } AutoInc.Auto = value; } } internal object AutoIncrementCurrent { get { if (_autoInc == null) { return AutoIncrementSeed; } return _autoInc.Current; } set { if ((BigInteger)AutoIncrementSeed != BigIntegerStorage.ConvertToBigInteger(value, FormatProvider)) { AutoInc.SetCurrent(value, FormatProvider); } } } internal AutoIncrementValue AutoInc => _autoInc ?? (_autoInc = ((DataType == typeof(BigInteger)) ? ((AutoIncrementValue)new AutoIncrementBigInteger()) : ((AutoIncrementValue)new AutoIncrementInt64()))); [DefaultValue(0L)] public long AutoIncrementSeed { get { if (_autoInc == null) { return 0L; } return _autoInc.Seed; } set { DataCommonEventSource.Log.Trace(" {0}, {1}", ObjectID, value); if (AutoIncrementSeed != value) { AutoInc.Seed = value; } } } [DefaultValue(1L)] public long AutoIncrementStep { get { if (_autoInc == null) { return 1L; } return _autoInc.Step; } set { DataCommonEventSource.Log.Trace(" {0}, {1}", ObjectID, value); if (AutoIncrementStep != value) { AutoInc.Step = value; } } } public string Caption { get { if (_caption == null) { return _columnName; } return _caption; } set { if (value == null) { value = string.Empty; } if (_caption == null || string.Compare(_caption, value, ignoreCase: true, Locale) != 0) { _caption = value; } } } [DefaultValue("")] [RefreshProperties(RefreshProperties.All)] public string ColumnName { get { return _columnName; } set { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, '{1}'", ObjectID, value); try { if (value == null) { value = string.Empty; } if (string.Compare(_columnName, value, ignoreCase: true, Locale) != 0) { if (_table != null) { if (value.Length == 0) { throw ExceptionBuilder.ColumnNameRequired(); } _table.Columns.RegisterColumnName(value, this); if (_columnName.Length != 0) { _table.Columns.UnregisterName(_columnName); } } RaisePropertyChanging("ColumnName"); _columnName = value; _encodedColumnName = null; if (_table != null) { _table.Columns.OnColumnPropertyChanged(new CollectionChangeEventArgs(CollectionChangeAction.Refresh, this)); } } else if (_columnName != value) { RaisePropertyChanging("ColumnName"); _columnName = value; _encodedColumnName = null; if (_table != null) { _table.Columns.OnColumnPropertyChanged(new CollectionChangeEventArgs(CollectionChangeAction.Refresh, this)); } } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } } internal string EncodedColumnName { get { if (_encodedColumnName == null) { _encodedColumnName = XmlConvert.EncodeLocalName(ColumnName); } return _encodedColumnName; } } internal IFormatProvider FormatProvider { get { if (_table == null) { return CultureInfo.CurrentCulture; } return _table.FormatProvider; } } internal CultureInfo Locale { get { if (_table == null) { return CultureInfo.CurrentCulture; } return _table.Locale; } } internal int ObjectID => _objectID; [DefaultValue("")] public string Prefix { get { return _columnPrefix; } set { if (value == null) { value = string.Empty; } DataCommonEventSource.Log.Trace(" {0}, '{1}'", ObjectID, value); if (XmlConvert.DecodeName(value) == value && XmlConvert.EncodeName(value) != value) { throw ExceptionBuilder.InvalidPrefix(value); } _columnPrefix = value; } } internal bool Computed => _expression != null; internal DataExpression DataExpression => _expression; [DefaultValue(typeof(string))] [TypeConverter(typeof(ColumnTypeConverter))] [RefreshProperties(RefreshProperties.All)] public Type DataType { get { return _dataType; } set { if (!(_dataType != value)) { return; } if (HasData) { throw ExceptionBuilder.CantChangeDataType(); } if (value == null) { throw ExceptionBuilder.NullDataType(); } StorageType storageType = DataStorage.GetStorageType(value); if (DataStorage.ImplementsINullableValue(storageType, value)) { throw ExceptionBuilder.ColumnTypeNotSupported(); } if (_table != null && IsInRelation()) { throw ExceptionBuilder.ColumnsTypeMismatch(); } if (storageType == StorageType.BigInteger && _expression != null) { throw ExprException.UnsupportedDataType(value); } if (!DefaultValueIsNull) { try { if (_defaultValue is BigInteger) { _defaultValue = BigIntegerStorage.ConvertFromBigInteger((BigInteger)_defaultValue, value, FormatProvider); } else if (typeof(BigInteger) == value) { _defaultValue = BigIntegerStorage.ConvertToBigInteger(_defaultValue, FormatProvider); } else if (typeof(string) == value) { _defaultValue = DefaultValue.ToString(); } else if (typeof(SqlString) == value) { _defaultValue = SqlConvert.ConvertToSqlString(DefaultValue); } else if (typeof(object) != value) { DefaultValue = SqlConvert.ChangeTypeForDefaultValue(DefaultValue, value, FormatProvider); } } catch (InvalidCastException inner) { throw ExceptionBuilder.DefaultValueDataType(ColumnName, DefaultValue.GetType(), value, inner); } catch (FormatException inner2) { throw ExceptionBuilder.DefaultValueDataType(ColumnName, DefaultValue.GetType(), value, inner2); } } if (ColumnMapping == MappingType.SimpleContent && value == typeof(char)) { throw ExceptionBuilder.CannotSetSimpleContentType(ColumnName, value); } SimpleType = SimpleType.CreateSimpleType(storageType, value); if (StorageType.String == storageType) { _maxLength = -1; } UpdateColumnType(value, storageType); XmlDataType = null; if (!AutoIncrement) { return; } if (!IsAutoIncrementType(value)) { AutoIncrement = false; } if (_autoInc != null) { AutoIncrementValue autoInc = _autoInc; _autoInc = null; AutoInc.Auto = autoInc.Auto; AutoInc.Seed = autoInc.Seed; AutoInc.Step = autoInc.Step; if (_autoInc.DataType == autoInc.DataType) { _autoInc.Current = autoInc.Current; } else if (autoInc.DataType == typeof(long)) { AutoInc.Current = (BigInteger)(long)autoInc.Current; } else { AutoInc.Current = (long)(BigInteger)autoInc.Current; } } } } [DefaultValue(DataSetDateTime.UnspecifiedLocal)] [RefreshProperties(RefreshProperties.All)] public DataSetDateTime DateTimeMode { get { return _dateTimeMode; } set { if (_dateTimeMode == value) { return; } if (DataType != typeof(DateTime) && value != DataSetDateTime.UnspecifiedLocal) { throw ExceptionBuilder.CannotSetDateTimeModeForNonDateTimeColumns(); } switch (value) { case DataSetDateTime.Local: case DataSetDateTime.Utc: if (HasData) { throw ExceptionBuilder.CantChangeDateTimeMode(_dateTimeMode, value); } break; case DataSetDateTime.Unspecified: case DataSetDateTime.UnspecifiedLocal: if (_dateTimeMode != DataSetDateTime.Unspecified && _dateTimeMode != DataSetDateTime.UnspecifiedLocal && HasData) { throw ExceptionBuilder.CantChangeDateTimeMode(_dateTimeMode, value); } break; default: throw ExceptionBuilder.InvalidDateTimeMode(value); } _dateTimeMode = value; } } [TypeConverter(typeof(DefaultValueTypeConverter))] public object DefaultValue { get { if (_defaultValue == DBNull.Value && _implementsINullable) { if (_storage != null) { _defaultValue = _storage._nullValue; } else if (_isSqlType) { _defaultValue = SqlConvert.ChangeTypeForDefaultValue(_defaultValue, _dataType, FormatProvider); } else if (_implementsINullable) { PropertyInfo property = _dataType.GetProperty("Null", BindingFlags.Static | BindingFlags.Public); if (property != null) { _defaultValue = property.GetValue(null, null); } } } return _defaultValue; } set { DataCommonEventSource.Log.Trace(" {0}", ObjectID); if (_defaultValue != null && DefaultValue.Equals(value)) { return; } if (AutoIncrement) { throw ExceptionBuilder.DefaultValueAndAutoIncrement(); } object obj = ((value == null) ? DBNull.Value : value); if (obj != DBNull.Value && DataType != typeof(object)) { try { obj = SqlConvert.ChangeTypeForDefaultValue(obj, DataType, FormatProvider); } catch (InvalidCastException inner) { throw ExceptionBuilder.DefaultValueColumnDataType(ColumnName, obj.GetType(), DataType, inner); } } _defaultValue = obj; _defaultValueIsNull = ((obj == DBNull.Value || (ImplementsINullable && DataStorage.IsObjectSqlNull(obj))) ? true : false); } } internal bool DefaultValueIsNull => _defaultValueIsNull; [RefreshProperties(RefreshProperties.All)] [DefaultValue("")] public string Expression { get { if (_expression != null) { return _expression.Expression; } return ""; } set { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, '{1}'", ObjectID, value); if (value == null) { value = string.Empty; } try { DataExpression dataExpression = null; if (value.Length > 0) { DataExpression dataExpression2 = new DataExpression(_table, value, _dataType); if (dataExpression2.HasValue) { dataExpression = dataExpression2; } } if (_expression == null && dataExpression != null) { if (AutoIncrement || Unique) { throw ExceptionBuilder.ExpressionAndUnique(); } if (_table != null) { for (int i = 0; i < _table.Constraints.Count; i++) { if (_table.Constraints[i].ContainsColumn(this)) { throw ExceptionBuilder.ExpressionAndConstraint(this, _table.Constraints[i]); } } } bool readOnly = ReadOnly; try { ReadOnly = true; } catch (ReadOnlyException e) { ExceptionBuilder.TraceExceptionForCapture(e); ReadOnly = readOnly; throw ExceptionBuilder.ExpressionAndReadOnly(); } } if (_table != null) { if (dataExpression != null && dataExpression.DependsOn(this)) { throw ExceptionBuilder.ExpressionCircular(); } HandleDependentColumnList(_expression, dataExpression); DataExpression expression = _expression; _expression = dataExpression; try { if (dataExpression == null) { for (int j = 0; j < _table.RecordCapacity; j++) { InitializeRecord(j); } } else { _table.EvaluateExpressions(this); } _table.ResetInternalIndexes(this); _table.EvaluateDependentExpressions(this); return; } catch (Exception e2) when (ADP.IsCatchableExceptionType(e2)) { ExceptionBuilder.TraceExceptionForCapture(e2); try { _expression = expression; HandleDependentColumnList(dataExpression, _expression); if (expression == null) { for (int k = 0; k < _table.RecordCapacity; k++) { InitializeRecord(k); } } else { _table.EvaluateExpressions(this); } _table.ResetInternalIndexes(this); _table.EvaluateDependentExpressions(this); } catch (Exception e3) when (ADP.IsCatchableExceptionType(e3)) { ExceptionBuilder.TraceExceptionWithoutRethrow(e3); } throw; } } _expression = dataExpression; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } } [Browsable(false)] public PropertyCollection ExtendedProperties => _extendedProperties ?? (_extendedProperties = new PropertyCollection()); internal bool HasData => _storage != null; internal bool ImplementsINullable => _implementsINullable; internal bool ImplementsIChangeTracking => _implementsIChangeTracking; internal bool ImplementsIRevertibleChangeTracking => _implementsIRevertibleChangeTracking; internal bool IsCloneable => _storage._isCloneable; internal bool IsStringType => _storage._isStringType; internal bool IsValueType => _storage._isValueType; internal bool IsSqlType => _isSqlType; [DefaultValue(-1)] public int MaxLength { get { return _maxLength; } set { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, {1}", ObjectID, value); try { if (_maxLength != value) { if (ColumnMapping == MappingType.SimpleContent) { throw ExceptionBuilder.CannotSetMaxLength2(this); } if (DataType != typeof(string) && DataType != typeof(SqlString)) { throw ExceptionBuilder.HasToBeStringType(this); } int maxLength = _maxLength; _maxLength = Math.Max(value, -1); if ((maxLength < 0 || value < maxLength) && _table != null && _table.EnforceConstraints && !CheckMaxLength()) { _maxLength = maxLength; throw ExceptionBuilder.CannotSetMaxLength(this, value); } SetMaxLengthSimpleType(); } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } } public string Namespace { get { if (_columnUri == null) { if (Table != null && _columnMapping != MappingType.Attribute) { return Table.Namespace; } return string.Empty; } return _columnUri; } set { DataCommonEventSource.Log.Trace(" {0}, '{1}'", ObjectID, value); if (_columnUri != value) { if (_columnMapping != MappingType.SimpleContent) { RaisePropertyChanging("Namespace"); _columnUri = value; } else if (value != Namespace) { throw ExceptionBuilder.CannotChangeNamespace(ColumnName); } } } } [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public int Ordinal => _ordinal; [DefaultValue(false)] public bool ReadOnly { get { return _readOnly; } set { DataCommonEventSource.Log.Trace(" {0}, {1}", ObjectID, value); if (_readOnly != value) { if (!value && _expression != null) { throw ExceptionBuilder.ReadOnlyAndExpression(); } _readOnly = value; } } } [DebuggerBrowsable(DebuggerBrowsableState.Never)] private Index SortIndex { get { if (_sortIndex == null) { IndexField[] indexDesc = new IndexField[1] { new IndexField(this, isDescending: false) }; _sortIndex = _table.GetIndex(indexDesc, DataViewRowState.CurrentRows, null); _sortIndex.AddRef(); } return _sortIndex; } } [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public DataTable Table => _table; internal object this[int record] { get { return _storage.Get(record); } set { try { _storage.Set(record, value); } catch (Exception ex) { ExceptionBuilder.TraceExceptionForCapture(ex); throw ExceptionBuilder.SetFailed(value, this, DataType, ex); } if (AutoIncrement && !_storage.IsNull(record)) { AutoInc.SetCurrentAndIncrement(_storage.Get(record)); } if (Computed) { DataRow dataRow = GetDataRow(record); if (dataRow != null) { dataRow.LastChangedColumn = this; } } } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [DefaultValue(false)] public bool Unique { get { return _unique; } set { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, {1}", ObjectID, value); try { if (_unique == value) { return; } if (value && _expression != null) { throw ExceptionBuilder.UniqueAndExpression(); } UniqueConstraint constraint = null; if (_table != null) { if (value) { CheckUnique(); } else { IEnumerator enumerator = Table.Constraints.GetEnumerator(); while (enumerator.MoveNext()) { if (enumerator.Current is UniqueConstraint uniqueConstraint && uniqueConstraint.ColumnsReference.Length == 1 && uniqueConstraint.ColumnsReference[0] == this) { constraint = uniqueConstraint; } } _table.Constraints.CanRemove(constraint, fThrowException: true); } } _unique = value; if (_table != null) { if (value) { UniqueConstraint constraint2 = new UniqueConstraint(this); _table.Constraints.Add(constraint2); } else { _table.Constraints.Remove(constraint); } } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } } internal string XmlDataType { get; set; } = string.Empty; internal SimpleType SimpleType { get { return _simpleType; } set { _simpleType = value; if (value != null && value.CanHaveMaxLength()) { _maxLength = _simpleType.MaxLength; } } } [DefaultValue(MappingType.Element)] public virtual MappingType ColumnMapping { get { return _columnMapping; } set { DataCommonEventSource.Log.Trace(" {0}, {1}", ObjectID, value); if (value == _columnMapping) { return; } if (value == MappingType.SimpleContent && _table != null) { int num = 0; if (_columnMapping == MappingType.Element) { num = 1; } if (_dataType == typeof(char)) { throw ExceptionBuilder.CannotSetSimpleContent(ColumnName, _dataType); } if (_table.XmlText != null && _table.XmlText != this) { throw ExceptionBuilder.CannotAddColumn3(); } if (_table.ElementColumnCount > num) { throw ExceptionBuilder.CannotAddColumn4(ColumnName); } } RaisePropertyChanging("ColumnMapping"); if (_table != null) { if (_columnMapping == MappingType.SimpleContent) { _table._xmlText = null; } if (value == MappingType.Element) { _table.ElementColumnCount++; } else if (_columnMapping == MappingType.Element) { _table.ElementColumnCount--; } } _columnMapping = value; if (value == MappingType.SimpleContent) { _columnUri = null; if (_table != null) { _table.XmlText = this; } SimpleType = null; } } } internal bool IsCustomType { get { if (_storage == null) { return DataStorage.IsTypeCustomType(DataType); } return _storage._isCustomDefinedType; } } internal bool ImplementsIXMLSerializable => _implementsIXMLSerializable; internal event PropertyChangedEventHandler PropertyChanging; public DataColumn() : this(null, typeof(string), null, MappingType.Element) { } public DataColumn(string columnName) : this(columnName, typeof(string), null, MappingType.Element) { } public DataColumn(string columnName, Type dataType) : this(columnName, dataType, null, MappingType.Element) { } public DataColumn(string columnName, Type dataType, string expr) : this(columnName, dataType, expr, MappingType.Element) { } public DataColumn(string columnName, Type dataType, string expr, MappingType type) { GC.SuppressFinalize(this); DataCommonEventSource.Log.Trace(" {0}, columnName='{1}', expr='{2}', type={3}", ObjectID, columnName, expr, type); if (dataType == null) { throw ExceptionBuilder.ArgumentNull("dataType"); } StorageType storageType = DataStorage.GetStorageType(dataType); if (DataStorage.ImplementsINullableValue(storageType, dataType)) { throw ExceptionBuilder.ColumnTypeNotSupported(); } _columnName = columnName ?? string.Empty; SimpleType simpleType = SimpleType.CreateSimpleType(storageType, dataType); if (simpleType != null) { SimpleType = simpleType; } UpdateColumnType(dataType, storageType); if (!string.IsNullOrEmpty(expr)) { Expression = expr; } _columnMapping = type; } private void UpdateColumnType(Type type, StorageType typeCode) { _dataType = type; _storageType = typeCode; if (StorageType.DateTime != typeCode) { _dateTimeMode = DataSetDateTime.UnspecifiedLocal; } DataStorage.ImplementsInterfaces(typeCode, type, out _isSqlType, out _implementsINullable, out _implementsIXMLSerializable, out _implementsIChangeTracking, out _implementsIRevertibleChangeTracking); if (!_isSqlType && _implementsINullable) { SqlUdtStorage.GetStaticNullForUdtType(type); } } private void ResetCaption() { if (_caption != null) { _caption = null; } } private bool ShouldSerializeCaption() { return _caption != null; } internal string GetColumnValueAsString(DataRow row, DataRowVersion version) { object value = this[row.GetRecordFromVersion(version)]; if (DataStorage.IsObjectNull(value)) { return null; } return ConvertObjectToXml(value); } internal void BindExpression() { DataExpression.Bind(_table); } private void SetMaxLengthSimpleType() { if (_simpleType != null) { _simpleType.MaxLength = _maxLength; if (_simpleType.IsPlainString()) { _simpleType = null; } else if (_simpleType.Name != null && XmlDataType != null) { _simpleType.ConvertToAnnonymousSimpleType(); XmlDataType = null; } } else if (-1 < _maxLength) { SimpleType = SimpleType.CreateLimitedStringType(_maxLength); } } private bool ShouldSerializeNamespace() { return _columnUri != null; } private void ResetNamespace() { Namespace = null; } public void SetOrdinal(int ordinal) { if (_ordinal == -1) { throw ExceptionBuilder.ColumnNotInAnyTable(); } if (_ordinal != ordinal) { _table.Columns.MoveTo(this, ordinal); } } internal void SetOrdinalInternal(int ordinal) { if (_ordinal == ordinal) { return; } if (Unique && _ordinal != -1 && ordinal == -1) { UniqueConstraint uniqueConstraint = _table.Constraints.FindKeyConstraint(this); if (uniqueConstraint != null) { _table.Constraints.Remove(uniqueConstraint); } } if (_sortIndex != null && -1 == ordinal) { _sortIndex.RemoveRef(); _sortIndex.RemoveRef(); _sortIndex = null; } int ordinal2 = _ordinal; _ordinal = ordinal; if (ordinal2 == -1 && _ordinal != -1 && Unique) { UniqueConstraint constraint = new UniqueConstraint(this); _table.Constraints.Add(constraint); } } internal void SetTable(DataTable table) { if (_table == table) { return; } if (Computed && (table == null || (!table.fInitInProgress && (table.DataSet == null || (!table.DataSet._fIsSchemaLoading && !table.DataSet._fInitInProgress))))) { DataExpression.Bind(table); } if (Unique && _table != null) { UniqueConstraint uniqueConstraint = table.Constraints.FindKeyConstraint(this); if (uniqueConstraint != null) { table.Constraints.CanRemove(uniqueConstraint, fThrowException: true); } } _table = table; _storage = null; } private DataRow GetDataRow(int index) { return _table._recordManager[index]; } internal void InitializeRecord(int record) { _storage.Set(record, DefaultValue); } internal void SetValue(int record, object value) { try { _storage.Set(record, value); } catch (Exception ex) { ExceptionBuilder.TraceExceptionForCapture(ex); throw ExceptionBuilder.SetFailed(value, this, DataType, ex); } DataRow dataRow = GetDataRow(record); if (dataRow != null) { dataRow.LastChangedColumn = this; } } internal void FreeRecord(int record) { _storage.Set(record, _storage._nullValue); } internal void InternalUnique(bool value) { _unique = value; } internal void CheckColumnConstraint(DataRow row, DataRowAction action) { if (_table.UpdatingCurrent(row, action)) { CheckNullable(row); CheckMaxLength(row); } } internal bool CheckMaxLength() { if (0 <= _maxLength && Table != null && 0 < Table.Rows.Count) { foreach (DataRow row in Table.Rows) { if (row.HasVersion(DataRowVersion.Current) && _maxLength < GetStringLength(row.GetCurrentRecordNo())) { return false; } } } return true; } internal void CheckMaxLength(DataRow dr) { if (0 <= _maxLength && _maxLength < GetStringLength(dr.GetDefaultRecord())) { throw ExceptionBuilder.LongerThanMaxLength(this); } } protected internal void CheckNotAllowNull() { if (_storage == null) { return; } if (_sortIndex != null) { if (!_sortIndex.IsKeyInIndex(_storage._nullValue)) { return; } throw ExceptionBuilder.NullKeyValues(ColumnName); } foreach (DataRow row in _table.Rows) { if (row.RowState == DataRowState.Deleted) { continue; } if (!_implementsINullable) { if (row[this] == DBNull.Value) { throw ExceptionBuilder.NullKeyValues(ColumnName); } } else if (DataStorage.IsObjectNull(row[this])) { throw ExceptionBuilder.NullKeyValues(ColumnName); } } } internal void CheckNullable(DataRow row) { if (!AllowDBNull && _storage.IsNull(row.GetDefaultRecord())) { throw ExceptionBuilder.NullValues(ColumnName); } } protected void CheckUnique() { if (!SortIndex.CheckUnique()) { throw ExceptionBuilder.NonUniqueValues(ColumnName); } } internal int Compare(int record1, int record2) { return _storage.Compare(record1, record2); } internal bool CompareValueTo(int record1, object value, bool checkType) { if (CompareValueTo(record1, value) == 0) { Type type = value.GetType(); Type type2 = _storage.Get(record1).GetType(); if (type == typeof(string) && type2 == typeof(string)) { if (string.CompareOrdinal((string)_storage.Get(record1), (string)value) != 0) { return false; } return true; } if (type == type2) { return true; } } return false; } internal int CompareValueTo(int record1, object value) { return _storage.CompareValueTo(record1, value); } internal object ConvertValue(object value) { return _storage.ConvertValue(value); } internal void Copy(int srcRecordNo, int dstRecordNo) { _storage.Copy(srcRecordNo, dstRecordNo); } [MethodImpl(MethodImplOptions.NoInlining)] internal DataColumn Clone() { DataColumn dataColumn = (DataColumn)Activator.CreateInstance(GetType()); dataColumn.SimpleType = SimpleType; dataColumn._allowNull = _allowNull; if (_autoInc != null) { dataColumn._autoInc = _autoInc.Clone(); } dataColumn._caption = _caption; dataColumn.ColumnName = ColumnName; dataColumn._columnUri = _columnUri; dataColumn._columnPrefix = _columnPrefix; dataColumn.DataType = DataType; dataColumn._defaultValue = _defaultValue; dataColumn._defaultValueIsNull = ((_defaultValue == DBNull.Value || (dataColumn.ImplementsINullable && DataStorage.IsObjectSqlNull(_defaultValue))) ? true : false); dataColumn._columnMapping = _columnMapping; dataColumn._readOnly = _readOnly; dataColumn.MaxLength = MaxLength; dataColumn.XmlDataType = XmlDataType; dataColumn._dateTimeMode = _dateTimeMode; if (_extendedProperties != null) { foreach (object key in _extendedProperties.Keys) { dataColumn.ExtendedProperties[key] = _extendedProperties[key]; } } return dataColumn; } internal DataRelation FindParentRelation() { DataRelation[] array = new DataRelation[Table.ParentRelations.Count]; Table.ParentRelations.CopyTo(array, 0); foreach (DataRelation dataRelation in array) { DataKey childKey = dataRelation.ChildKey; if (childKey.ColumnsReference.Length == 1 && childKey.ColumnsReference[0] == this) { return dataRelation; } } return null; } internal object GetAggregateValue(int[] records, AggregateType kind) { if (_storage == null) { if (kind != AggregateType.Count) { return DBNull.Value; } return 0; } return _storage.Aggregate(records, kind); } private int GetStringLength(int record) { return _storage.GetStringLength(record); } internal void Init(int record) { if (AutoIncrement) { object current = _autoInc.Current; _autoInc.MoveAfter(); _storage.Set(record, current); } else { this[record] = _defaultValue; } } internal static bool IsAutoIncrementType(Type dataType) { if (!(dataType == typeof(int)) && !(dataType == typeof(long)) && !(dataType == typeof(short)) && !(dataType == typeof(decimal)) && !(dataType == typeof(BigInteger)) && !(dataType == typeof(SqlInt32)) && !(dataType == typeof(SqlInt64)) && !(dataType == typeof(SqlInt16))) { return dataType == typeof(SqlDecimal); } return true; } private bool IsColumnMappingValid(StorageType typeCode, MappingType mapping) { if (mapping != MappingType.Element) { return !DataStorage.IsTypeCustomType(typeCode); } return true; } internal bool IsValueCustomTypeInstance(object value) { if (DataStorage.IsTypeCustomType(value.GetType())) { return !(value is Type); } return false; } internal bool IsNull(int record) { return _storage.IsNull(record); } internal bool IsInRelation() { DataRelationCollection parentRelations = _table.ParentRelations; for (int i = 0; i < parentRelations.Count; i++) { if (parentRelations[i].ChildKey.ContainsColumn(this)) { return true; } } parentRelations = _table.ChildRelations; for (int j = 0; j < parentRelations.Count; j++) { if (parentRelations[j].ParentKey.ContainsColumn(this)) { return true; } } return false; } internal bool IsMaxLengthViolated() { if (MaxLength < 0) { return true; } bool result = false; string text = null; foreach (DataRow row in Table.Rows) { if (!row.HasVersion(DataRowVersion.Current)) { continue; } object obj = row[this]; if (!_isSqlType) { if (obj != null && obj != DBNull.Value && ((string)obj).Length > MaxLength) { if (text == null) { text = ExceptionBuilder.MaxLengthViolationText(ColumnName); } row.RowError = text; row.SetColumnError(this, text); result = true; } } else if (!DataStorage.IsObjectNull(obj) && ((SqlString)obj).Value.Length > MaxLength) { if (text == null) { text = ExceptionBuilder.MaxLengthViolationText(ColumnName); } row.RowError = text; row.SetColumnError(this, text); result = true; } } return result; } internal bool IsNotAllowDBNullViolated() { Index sortIndex = SortIndex; DataRow[] rows = sortIndex.GetRows(sortIndex.FindRecords(DBNull.Value)); for (int i = 0; i < rows.Length; i++) { string text = ExceptionBuilder.NotAllowDBNullViolationText(ColumnName); rows[i].RowError = text; rows[i].SetColumnError(this, text); } return rows.Length != 0; } internal void FinishInitInProgress() { if (Computed) { BindExpression(); } } protected virtual void OnPropertyChanging(PropertyChangedEventArgs pcevent) { this.PropertyChanging?.Invoke(this, pcevent); } protected internal void RaisePropertyChanging(string name) { OnPropertyChanging(new PropertyChangedEventArgs(name)); } private void InsureStorage() { if (_storage == null) { _storage = DataStorage.CreateStorage(this, _dataType, _storageType); } } internal void SetCapacity(int capacity) { InsureStorage(); _storage.SetCapacity(capacity); } private bool ShouldSerializeDefaultValue() { return !DefaultValueIsNull; } internal void OnSetDataSet() { } public override string ToString() { if (_expression != null) { return ColumnName + " + " + Expression; } return ColumnName; } internal object ConvertXmlToObject(string s) { InsureStorage(); return _storage.ConvertXmlToObject(s); } internal object ConvertXmlToObject(XmlReader xmlReader, XmlRootAttribute xmlAttrib) { InsureStorage(); return _storage.ConvertXmlToObject(xmlReader, xmlAttrib); } internal string ConvertObjectToXml(object value) { InsureStorage(); return _storage.ConvertObjectToXml(value); } internal void ConvertObjectToXml(object value, XmlWriter xmlWriter, XmlRootAttribute xmlAttrib) { InsureStorage(); _storage.ConvertObjectToXml(value, xmlWriter, xmlAttrib); } internal object GetEmptyColumnStore(int recordCount) { InsureStorage(); return _storage.GetEmptyStorageInternal(recordCount); } internal void CopyValueIntoStore(int record, object store, BitArray nullbits, int storeIndex) { _storage.CopyValueInternal(record, store, nullbits, storeIndex); } internal void SetStorage(object store, BitArray nullbits) { InsureStorage(); _storage.SetStorageInternal(store, nullbits); } internal void AddDependentColumn(DataColumn expressionColumn) { if (_dependentColumns == null) { _dependentColumns = new List(); } _dependentColumns.Add(expressionColumn); _table.AddDependentColumn(expressionColumn); } internal void RemoveDependentColumn(DataColumn expressionColumn) { if (_dependentColumns != null && _dependentColumns.Contains(expressionColumn)) { _dependentColumns.Remove(expressionColumn); } _table.RemoveDependentColumn(expressionColumn); } internal void HandleDependentColumnList(DataExpression oldExpression, DataExpression newExpression) { DataColumn[] dependency; if (oldExpression != null) { dependency = oldExpression.GetDependency(); foreach (DataColumn obj in dependency) { obj.RemoveDependentColumn(this); if (obj._table != _table) { _table.RemoveDependentColumn(this); } } _table.RemoveDependentColumn(this); } if (newExpression == null) { return; } dependency = newExpression.GetDependency(); foreach (DataColumn obj2 in dependency) { obj2.AddDependentColumn(this); if (obj2._table != _table) { _table.AddDependentColumn(this); } } _table.AddDependentColumn(this); } } internal abstract class AutoIncrementValue { internal bool Auto { get; set; } internal abstract object Current { get; set; } internal abstract long Seed { get; set; } internal abstract long Step { get; set; } internal abstract Type DataType { get; } internal abstract void SetCurrent(object value, IFormatProvider formatProvider); internal abstract void SetCurrentAndIncrement(object value); internal abstract void MoveAfter(); internal AutoIncrementValue Clone() { AutoIncrementValue obj = ((this is AutoIncrementInt64) ? ((AutoIncrementValue)new AutoIncrementInt64()) : ((AutoIncrementValue)new AutoIncrementBigInteger())); obj.Auto = Auto; obj.Seed = Seed; obj.Step = Step; obj.Current = Current; return obj; } } internal sealed class AutoIncrementInt64 : AutoIncrementValue { private long _current; private long _seed; private long _step = 1L; internal override object Current { get { return _current; } set { _current = (long)value; } } internal override Type DataType => typeof(long); internal override long Seed { get { return _seed; } set { if (_current == _seed || BoundaryCheck(value)) { _current = value; } _seed = value; } } internal override long Step { get { return _step; } set { if (value == 0L) { throw ExceptionBuilder.AutoIncrementSeed(); } if (_step != value) { if (_current != Seed) { _current = _current - _step + value; } _step = value; } } } internal override void MoveAfter() { _current += _step; } internal override void SetCurrent(object value, IFormatProvider formatProvider) { _current = Convert.ToInt64(value, formatProvider); } internal override void SetCurrentAndIncrement(object value) { long num = (long)SqlConvert.ChangeType2(value, StorageType.Int64, typeof(long), CultureInfo.InvariantCulture); if (BoundaryCheck(num)) { _current = num + _step; } } private bool BoundaryCheck(BigInteger value) { if (_step >= 0 || !(value <= _current)) { if (0 < _step) { return _current <= value; } return false; } return true; } } internal sealed class AutoIncrementBigInteger : AutoIncrementValue { private BigInteger _current; private long _seed; private BigInteger _step = 1; internal override object Current { get { return _current; } set { _current = (BigInteger)value; } } internal override Type DataType => typeof(BigInteger); internal override long Seed { get { return _seed; } set { if (_current == _seed || BoundaryCheck(value)) { _current = value; } _seed = value; } } internal override long Step { get { return (long)_step; } set { if (value == 0L) { throw ExceptionBuilder.AutoIncrementSeed(); } if (_step != value) { if (_current != Seed) { _current = _current - _step + value; } _step = value; } } } internal override void MoveAfter() { _current += _step; } internal override void SetCurrent(object value, IFormatProvider formatProvider) { _current = BigIntegerStorage.ConvertToBigInteger(value, formatProvider); } internal override void SetCurrentAndIncrement(object value) { BigInteger bigInteger = (BigInteger)value; if (BoundaryCheck(bigInteger)) { _current = bigInteger + _step; } } private bool BoundaryCheck(BigInteger value) { if (!(_step < 0L) || !(value <= _current)) { if (0L < _step) { return _current <= value; } return false; } return true; } } public class DataColumnChangeEventArgs : EventArgs { private DataColumn _column; public DataColumn Column => _column; public DataRow Row { get; } public object ProposedValue { get; set; } internal DataColumnChangeEventArgs(DataRow row) { Row = row; } public DataColumnChangeEventArgs(DataRow row, DataColumn column, object value) { Row = row; _column = column; ProposedValue = value; } internal void InitializeColumnChangeEvent(DataColumn column, object value) { _column = column; ProposedValue = value; } } public delegate void DataColumnChangeEventHandler(object sender, DataColumnChangeEventArgs e); [DefaultEvent("CollectionChanged")] public sealed class DataColumnCollection : InternalDataCollectionBase { private readonly DataTable _table; private readonly ArrayList _list; private int _defaultNameIndex; private DataColumn[] _delayedAddRangeColumns; private readonly Dictionary _columnFromName; private bool _fInClear; private DataColumn[] _columnsImplementingIChangeTracking; private int _nColumnsImplementingIChangeTracking; private int _nColumnsImplementingIRevertibleChangeTracking; protected override ArrayList List => _list; internal DataColumn[] ColumnsImplementingIChangeTracking => _columnsImplementingIChangeTracking; internal int ColumnsImplementingIChangeTrackingCount => _nColumnsImplementingIChangeTracking; internal int ColumnsImplementingIRevertibleChangeTrackingCount => _nColumnsImplementingIRevertibleChangeTracking; public DataColumn this[int index] { get { try { return (DataColumn)_list[index]; } catch (ArgumentOutOfRangeException) { throw ExceptionBuilder.ColumnOutOfRange(index); } } } public DataColumn this[string name] { get { if (name == null) { throw ExceptionBuilder.ArgumentNull("name"); } if (!_columnFromName.TryGetValue(name, out var value) || value == null) { int num = IndexOfCaseInsensitive(name); if (0 <= num) { return (DataColumn)_list[num]; } if (-2 == num) { throw ExceptionBuilder.CaseInsensitiveNameConflict(name); } } return value; } } internal DataColumn this[string name, string ns] { get { if (_columnFromName.TryGetValue(name, out var value) && value != null && value.Namespace == ns) { return value; } return null; } } public event CollectionChangeEventHandler CollectionChanged; internal event CollectionChangeEventHandler CollectionChanging; internal event CollectionChangeEventHandler ColumnPropertyChanged; internal DataColumnCollection(DataTable table) { _list = new ArrayList(); _defaultNameIndex = 1; _columnsImplementingIChangeTracking = Array.Empty(); base..ctor(); _table = table; _columnFromName = new Dictionary(); } internal void EnsureAdditionalCapacity(int capacity) { if (_list.Capacity < capacity + _list.Count) { _list.Capacity = capacity + _list.Count; } } public void Add(DataColumn column) { AddAt(-1, column); } internal void AddAt(int index, DataColumn column) { if (column != null && column.ColumnMapping == MappingType.SimpleContent) { if (_table.XmlText != null && _table.XmlText != column) { throw ExceptionBuilder.CannotAddColumn3(); } if (_table.ElementColumnCount > 0) { throw ExceptionBuilder.CannotAddColumn4(column.ColumnName); } OnCollectionChanging(new CollectionChangeEventArgs(CollectionChangeAction.Add, column)); BaseAdd(column); if (index != -1) { ArrayAdd(index, column); } else { ArrayAdd(column); } _table.XmlText = column; } else { OnCollectionChanging(new CollectionChangeEventArgs(CollectionChangeAction.Add, column)); BaseAdd(column); if (index != -1) { ArrayAdd(index, column); } else { ArrayAdd(column); } if (column.ColumnMapping == MappingType.Element) { _table.ElementColumnCount++; } } if (!_table.fInitInProgress && column != null && column.Computed) { column.Expression = column.Expression; } OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Add, column)); } public void AddRange(DataColumn[] columns) { if (_table.fInitInProgress) { _delayedAddRangeColumns = columns; } else { if (columns == null) { return; } foreach (DataColumn dataColumn in columns) { if (dataColumn != null) { Add(dataColumn); } } } } public DataColumn Add(string columnName, Type type, string expression) { DataColumn dataColumn = new DataColumn(columnName, type, expression); Add(dataColumn); return dataColumn; } public DataColumn Add(string columnName, Type type) { DataColumn dataColumn = new DataColumn(columnName, type); Add(dataColumn); return dataColumn; } public DataColumn Add(string columnName) { DataColumn dataColumn = new DataColumn(columnName); Add(dataColumn); return dataColumn; } public DataColumn Add() { DataColumn dataColumn = new DataColumn(); Add(dataColumn); return dataColumn; } private void ArrayAdd(DataColumn column) { _list.Add(column); column.SetOrdinalInternal(_list.Count - 1); CheckIChangeTracking(column); } private void ArrayAdd(int index, DataColumn column) { _list.Insert(index, column); CheckIChangeTracking(column); } private void ArrayRemove(DataColumn column) { column.SetOrdinalInternal(-1); _list.Remove(column); int count = _list.Count; for (int i = 0; i < count; i++) { ((DataColumn)_list[i]).SetOrdinalInternal(i); } if (column.ImplementsIChangeTracking) { RemoveColumnsImplementingIChangeTrackingList(column); } } internal string AssignName() { string text = MakeName(_defaultNameIndex++); while (_columnFromName.ContainsKey(text)) { text = MakeName(_defaultNameIndex++); } return text; } private void BaseAdd(DataColumn column) { if (column == null) { throw ExceptionBuilder.ArgumentNull("column"); } if (column._table == _table) { throw ExceptionBuilder.CannotAddColumn1(column.ColumnName); } if (column._table != null) { throw ExceptionBuilder.CannotAddColumn2(column.ColumnName); } if (column.ColumnName.Length == 0) { column.ColumnName = AssignName(); } RegisterColumnName(column.ColumnName, column); try { column.SetTable(_table); if (!_table.fInitInProgress && column.Computed && column.DataExpression.DependsOn(column)) { throw ExceptionBuilder.ExpressionCircular(); } if (0 < _table.RecordCapacity) { column.SetCapacity(_table.RecordCapacity); } for (int i = 0; i < _table.RecordCapacity; i++) { column.InitializeRecord(i); } if (_table.DataSet != null) { column.OnSetDataSet(); } } catch (Exception e) when (ADP.IsCatchableOrSecurityExceptionType(e)) { UnregisterName(column.ColumnName); throw; } } private void BaseGroupSwitch(DataColumn[] oldArray, int oldLength, DataColumn[] newArray, int newLength) { int num = 0; for (int i = 0; i < oldLength; i++) { bool flag = false; for (int j = num; j < newLength; j++) { if (oldArray[i] == newArray[j]) { if (num == j) { num++; } flag = true; break; } } if (!flag && oldArray[i].Table == _table) { BaseRemove(oldArray[i]); _list.Remove(oldArray[i]); oldArray[i].SetOrdinalInternal(-1); } } for (int k = 0; k < newLength; k++) { if (newArray[k].Table != _table) { BaseAdd(newArray[k]); _list.Add(newArray[k]); } newArray[k].SetOrdinalInternal(k); } } private void BaseRemove(DataColumn column) { if (!CanRemove(column, fThrowException: true)) { return; } if (column._errors > 0) { for (int i = 0; i < _table.Rows.Count; i++) { _table.Rows[i].ClearError(column); } } UnregisterName(column.ColumnName); column.SetTable(null); } public bool CanRemove(DataColumn column) { return CanRemove(column, fThrowException: false); } internal bool CanRemove(DataColumn column, bool fThrowException) { if (column == null) { if (!fThrowException) { return false; } throw ExceptionBuilder.ArgumentNull("column"); } if (column._table != _table) { if (!fThrowException) { return false; } throw ExceptionBuilder.CannotRemoveColumn(); } _table.OnRemoveColumnInternal(column); if (_table._primaryKey != null && _table._primaryKey.Key.ContainsColumn(column)) { if (!fThrowException) { return false; } throw ExceptionBuilder.CannotRemovePrimaryKey(); } for (int i = 0; i < _table.ParentRelations.Count; i++) { if (_table.ParentRelations[i].ChildKey.ContainsColumn(column)) { if (!fThrowException) { return false; } throw ExceptionBuilder.CannotRemoveChildKey(_table.ParentRelations[i].RelationName); } } for (int j = 0; j < _table.ChildRelations.Count; j++) { if (_table.ChildRelations[j].ParentKey.ContainsColumn(column)) { if (!fThrowException) { return false; } throw ExceptionBuilder.CannotRemoveChildKey(_table.ChildRelations[j].RelationName); } } for (int k = 0; k < _table.Constraints.Count; k++) { if (_table.Constraints[k].ContainsColumn(column)) { if (!fThrowException) { return false; } throw ExceptionBuilder.CannotRemoveConstraint(_table.Constraints[k].ConstraintName, _table.Constraints[k].Table.TableName); } } if (_table.DataSet != null) { ParentForeignKeyConstraintEnumerator parentForeignKeyConstraintEnumerator = new ParentForeignKeyConstraintEnumerator(_table.DataSet, _table); while (parentForeignKeyConstraintEnumerator.GetNext()) { Constraint constraint = parentForeignKeyConstraintEnumerator.GetConstraint(); if (((ForeignKeyConstraint)constraint).ParentKey.ContainsColumn(column)) { if (!fThrowException) { return false; } throw ExceptionBuilder.CannotRemoveConstraint(constraint.ConstraintName, constraint.Table.TableName); } } } if (column._dependentColumns != null) { for (int l = 0; l < column._dependentColumns.Count; l++) { DataColumn dataColumn = column._dependentColumns[l]; if ((_fInClear && (dataColumn.Table == _table || dataColumn.Table == null)) || dataColumn.Table == null) { continue; } DataExpression dataExpression = dataColumn.DataExpression; if (dataExpression != null && dataExpression.DependsOn(column)) { if (!fThrowException) { return false; } throw ExceptionBuilder.CannotRemoveExpression(dataColumn.ColumnName, dataColumn.Expression); } } } foreach (Index liveIndex in _table.LiveIndexes) { _ = liveIndex; } return true; } private void CheckIChangeTracking(DataColumn column) { if (column.ImplementsIRevertibleChangeTracking) { _nColumnsImplementingIRevertibleChangeTracking++; _nColumnsImplementingIChangeTracking++; AddColumnsImplementingIChangeTrackingList(column); } else if (column.ImplementsIChangeTracking) { _nColumnsImplementingIChangeTracking++; AddColumnsImplementingIChangeTrackingList(column); } } public void Clear() { int count = _list.Count; DataColumn[] array = new DataColumn[_list.Count]; _list.CopyTo(array, 0); OnCollectionChanging(InternalDataCollectionBase.s_refreshEventArgs); if (_table.fInitInProgress && _delayedAddRangeColumns != null) { _delayedAddRangeColumns = null; } try { _fInClear = true; BaseGroupSwitch(array, count, null, 0); _fInClear = false; } catch (Exception e) when (ADP.IsCatchableOrSecurityExceptionType(e)) { _fInClear = false; BaseGroupSwitch(null, 0, array, count); _list.Clear(); for (int i = 0; i < count; i++) { _list.Add(array[i]); } throw; } _list.Clear(); _table.ElementColumnCount = 0; OnCollectionChanged(InternalDataCollectionBase.s_refreshEventArgs); } public bool Contains(string name) { if (_columnFromName.TryGetValue(name, out var value) && value != null) { return true; } return IndexOfCaseInsensitive(name) >= 0; } internal bool Contains(string name, bool caseSensitive) { if (_columnFromName.TryGetValue(name, out var value) && value != null) { return true; } if (!caseSensitive) { return IndexOfCaseInsensitive(name) >= 0; } return false; } public void CopyTo(DataColumn[] array, int index) { if (array == null) { throw ExceptionBuilder.ArgumentNull("array"); } if (index < 0) { throw ExceptionBuilder.ArgumentOutOfRange("index"); } if (array.Length - index < _list.Count) { throw ExceptionBuilder.InvalidOffsetLength(); } for (int i = 0; i < _list.Count; i++) { array[index + i] = (DataColumn)_list[i]; } } public int IndexOf(DataColumn column) { int count = _list.Count; for (int i = 0; i < count; i++) { if (column == (DataColumn)_list[i]) { return i; } } return -1; } public int IndexOf(string columnName) { if (columnName != null && 0 < columnName.Length) { int count = Count; if (!_columnFromName.TryGetValue(columnName, out var value) || value == null) { int num = IndexOfCaseInsensitive(columnName); if (num >= 0) { return num; } return -1; } for (int i = 0; i < count; i++) { if (value == _list[i]) { return i; } } } return -1; } internal int IndexOfCaseInsensitive(string name) { int specialHashCode = _table.GetSpecialHashCode(name); int num = -1; DataColumn dataColumn = null; for (int i = 0; i < Count; i++) { dataColumn = (DataColumn)_list[i]; if ((specialHashCode == 0 || dataColumn._hashCode == 0 || dataColumn._hashCode == specialHashCode) && NamesEqual(dataColumn.ColumnName, name, fCaseSensitive: false, _table.Locale) != 0) { if (num != -1) { return -2; } num = i; } } return num; } internal void FinishInitCollection() { if (_delayedAddRangeColumns == null) { return; } DataColumn[] delayedAddRangeColumns = _delayedAddRangeColumns; foreach (DataColumn dataColumn in delayedAddRangeColumns) { if (dataColumn != null) { Add(dataColumn); } } delayedAddRangeColumns = _delayedAddRangeColumns; for (int i = 0; i < delayedAddRangeColumns.Length; i++) { delayedAddRangeColumns[i]?.FinishInitInProgress(); } _delayedAddRangeColumns = null; } private string MakeName(int index) { if (index != 1) { return "Column" + index.ToString(CultureInfo.InvariantCulture); } return "Column1"; } internal void MoveTo(DataColumn column, int newPosition) { if (0 > newPosition || newPosition > Count - 1) { throw ExceptionBuilder.InvalidOrdinal("ordinal", newPosition); } if (column.ImplementsIChangeTracking) { RemoveColumnsImplementingIChangeTrackingList(column); } _list.Remove(column); _list.Insert(newPosition, column); int count = _list.Count; for (int i = 0; i < count; i++) { ((DataColumn)_list[i]).SetOrdinalInternal(i); } CheckIChangeTracking(column); OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Refresh, column)); } private void OnCollectionChanged(CollectionChangeEventArgs ccevent) { _table.UpdatePropertyDescriptorCollectionCache(); if (ccevent != null && !_table.SchemaLoading && !_table.fInitInProgress) { _ = (DataColumn)ccevent.Element; } this.CollectionChanged?.Invoke(this, ccevent); } private void OnCollectionChanging(CollectionChangeEventArgs ccevent) { this.CollectionChanging?.Invoke(this, ccevent); } internal void OnColumnPropertyChanged(CollectionChangeEventArgs ccevent) { _table.UpdatePropertyDescriptorCollectionCache(); this.ColumnPropertyChanged?.Invoke(this, ccevent); } internal void RegisterColumnName(string name, DataColumn column) { try { _columnFromName.Add(name, column); if (column != null) { column._hashCode = _table.GetSpecialHashCode(name); } } catch (ArgumentException) { if (_columnFromName[name] != null) { if (column != null) { throw ExceptionBuilder.CannotAddDuplicate(name); } throw ExceptionBuilder.CannotAddDuplicate3(name); } throw ExceptionBuilder.CannotAddDuplicate2(name); } if (column == null && NamesEqual(name, MakeName(_defaultNameIndex), fCaseSensitive: true, _table.Locale) != 0) { do { _defaultNameIndex++; } while (Contains(MakeName(_defaultNameIndex))); } } internal bool CanRegisterName(string name) { return !_columnFromName.ContainsKey(name); } public void Remove(DataColumn column) { OnCollectionChanging(new CollectionChangeEventArgs(CollectionChangeAction.Remove, column)); BaseRemove(column); ArrayRemove(column); OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Remove, column)); if (column.ColumnMapping == MappingType.Element) { _table.ElementColumnCount--; } } public void RemoveAt(int index) { DataColumn dataColumn = this[index]; if (dataColumn == null) { throw ExceptionBuilder.ColumnOutOfRange(index); } Remove(dataColumn); } public void Remove(string name) { DataColumn dataColumn = this[name]; if (dataColumn == null) { throw ExceptionBuilder.ColumnNotInTheTable(name, _table.TableName); } Remove(dataColumn); } internal void UnregisterName(string name) { _columnFromName.Remove(name); if (NamesEqual(name, MakeName(_defaultNameIndex - 1), fCaseSensitive: true, _table.Locale) != 0) { do { _defaultNameIndex--; } while (_defaultNameIndex > 1 && !Contains(MakeName(_defaultNameIndex - 1))); } } private void AddColumnsImplementingIChangeTrackingList(DataColumn dataColumn) { DataColumn[] columnsImplementingIChangeTracking = _columnsImplementingIChangeTracking; DataColumn[] array = new DataColumn[columnsImplementingIChangeTracking.Length + 1]; columnsImplementingIChangeTracking.CopyTo(array, 0); array[columnsImplementingIChangeTracking.Length] = dataColumn; _columnsImplementingIChangeTracking = array; } private void RemoveColumnsImplementingIChangeTrackingList(DataColumn dataColumn) { DataColumn[] columnsImplementingIChangeTracking = _columnsImplementingIChangeTracking; DataColumn[] array = new DataColumn[columnsImplementingIChangeTracking.Length - 1]; int i = 0; int num = 0; for (; i < columnsImplementingIChangeTracking.Length; i++) { if (columnsImplementingIChangeTracking[i] != dataColumn) { array[num++] = columnsImplementingIChangeTracking[i]; } } _columnsImplementingIChangeTracking = array; } internal DataColumnCollection() { ThrowStub.ThrowNotSupportedException(); } } internal sealed class DataColumnPropertyDescriptor : PropertyDescriptor { public override AttributeCollection Attributes { get { if (typeof(IList).IsAssignableFrom(PropertyType)) { Attribute[] array = new Attribute[base.Attributes.Count + 1]; base.Attributes.CopyTo(array, 0); array[^1] = new ListBindableAttribute(listBindable: false); return new AttributeCollection(array); } return base.Attributes; } } internal DataColumn Column { get; } public override Type ComponentType => typeof(DataRowView); public override bool IsReadOnly => Column.ReadOnly; public override Type PropertyType => Column.DataType; public override bool IsBrowsable { get { if (Column.ColumnMapping != MappingType.Hidden) { return base.IsBrowsable; } return false; } } internal DataColumnPropertyDescriptor(DataColumn dataColumn) : base(dataColumn.ColumnName, null) { Column = dataColumn; } public override bool Equals(object other) { if (other is DataColumnPropertyDescriptor) { return ((DataColumnPropertyDescriptor)other).Column == Column; } return false; } public override int GetHashCode() { return Column.GetHashCode(); } public override bool CanResetValue(object component) { DataRowView dataRowView = (DataRowView)component; if (!Column.IsSqlType) { return dataRowView.GetColumnValue(Column) != DBNull.Value; } return !DataStorage.IsObjectNull(dataRowView.GetColumnValue(Column)); } public override object GetValue(object component) { return ((DataRowView)component).GetColumnValue(Column); } public override void ResetValue(object component) { ((DataRowView)component).SetColumnValue(Column, DBNull.Value); } public override void SetValue(object component, object value) { ((DataRowView)component).SetColumnValue(Column, value); OnValueChanged(component, EventArgs.Empty); } public override bool ShouldSerializeValue(object component) { return false; } } internal sealed class DataError { internal struct ColumnError { internal DataColumn _column; internal string _error; } private string _rowError = string.Empty; private int _count; private ColumnError[] _errorList; internal const int initialCapacity = 1; internal string Text { get { return _rowError; } set { SetText(value); } } internal bool HasErrors { get { if (_rowError.Length == 0) { return _count != 0; } return true; } } internal DataError() { } internal DataError(string rowError) { SetText(rowError); } internal void SetColumnError(DataColumn column, string error) { if (error == null || error.Length == 0) { Clear(column); return; } if (_errorList == null) { _errorList = new ColumnError[1]; } int num = IndexOf(column); _errorList[num]._column = column; _errorList[num]._error = error; column._errors++; if (num == _count) { _count++; } } internal string GetColumnError(DataColumn column) { for (int i = 0; i < _count; i++) { if (_errorList[i]._column == column) { return _errorList[i]._error; } } return string.Empty; } internal void Clear(DataColumn column) { if (_count == 0) { return; } for (int i = 0; i < _count; i++) { if (_errorList[i]._column == column) { Array.Copy(_errorList, i + 1, _errorList, i, _count - i - 1); _count--; column._errors--; } } } internal void Clear() { for (int i = 0; i < _count; i++) { _errorList[i]._column._errors--; } _count = 0; _rowError = string.Empty; } internal DataColumn[] GetColumnsInError() { DataColumn[] array = new DataColumn[_count]; for (int i = 0; i < _count; i++) { array[i] = _errorList[i]._column; } return array; } private void SetText(string errorText) { if (errorText == null) { errorText = string.Empty; } _rowError = errorText; } internal int IndexOf(DataColumn column) { for (int i = 0; i < _count; i++) { if (_errorList[i]._column == column) { return i; } } if (_count >= _errorList.Length) { ColumnError[] array = new ColumnError[Math.Min(_count * 2, column.Table.Columns.Count)]; Array.Copy(_errorList, 0, array, 0, _count); _errorList = array; } return _count; } } [Serializable] public class DataException : SystemException { protected DataException(SerializationInfo info, StreamingContext context) : base(info, context) { throw new PlatformNotSupportedException(); } public DataException() : base("Data Exception.") { base.HResult = -2146232032; } public DataException(string s) : base(s) { base.HResult = -2146232032; } public DataException(string s, Exception innerException) : base(s, innerException) { } } [Serializable] public class ConstraintException : DataException { protected ConstraintException(SerializationInfo info, StreamingContext context) : base(info, context) { throw new PlatformNotSupportedException(); } public ConstraintException() : base("Constraint Exception.") { base.HResult = -2146232022; } public ConstraintException(string s) : base(s) { base.HResult = -2146232022; } public ConstraintException(string message, Exception innerException) : base(message, innerException) { base.HResult = -2146232022; } } [Serializable] public class DeletedRowInaccessibleException : DataException { protected DeletedRowInaccessibleException(SerializationInfo info, StreamingContext context) : base(info, context) { throw new PlatformNotSupportedException(); } public DeletedRowInaccessibleException() : base("Deleted rows inaccessible.") { base.HResult = -2146232031; } public DeletedRowInaccessibleException(string s) : base(s) { base.HResult = -2146232031; } public DeletedRowInaccessibleException(string message, Exception innerException) : base(message, innerException) { base.HResult = -2146232031; } } [Serializable] public class DuplicateNameException : DataException { protected DuplicateNameException(SerializationInfo info, StreamingContext context) : base(info, context) { throw new PlatformNotSupportedException(); } public DuplicateNameException() : base("Duplicate name not allowed.") { base.HResult = -2146232030; } public DuplicateNameException(string s) : base(s) { base.HResult = -2146232030; } public DuplicateNameException(string message, Exception innerException) : base(message, innerException) { base.HResult = -2146232030; } } [Serializable] public class InRowChangingEventException : DataException { protected InRowChangingEventException(SerializationInfo info, StreamingContext context) : base(info, context) { throw new PlatformNotSupportedException(); } public InRowChangingEventException() : base("Operation not supported in the RowChanging event.") { base.HResult = -2146232029; } public InRowChangingEventException(string s) : base(s) { base.HResult = -2146232029; } public InRowChangingEventException(string message, Exception innerException) : base(message, innerException) { base.HResult = -2146232029; } } [Serializable] public class InvalidConstraintException : DataException { protected InvalidConstraintException(SerializationInfo info, StreamingContext context) : base(info, context) { throw new PlatformNotSupportedException(); } public InvalidConstraintException() : base("Invalid constraint.") { base.HResult = -2146232028; } public InvalidConstraintException(string s) : base(s) { base.HResult = -2146232028; } public InvalidConstraintException(string message, Exception innerException) : base(message, innerException) { base.HResult = -2146232028; } } [Serializable] public class MissingPrimaryKeyException : DataException { protected MissingPrimaryKeyException(SerializationInfo info, StreamingContext context) : base(info, context) { throw new PlatformNotSupportedException(); } public MissingPrimaryKeyException() : base("Missing primary key.") { base.HResult = -2146232027; } public MissingPrimaryKeyException(string s) : base(s) { base.HResult = -2146232027; } public MissingPrimaryKeyException(string message, Exception innerException) : base(message, innerException) { base.HResult = -2146232027; } } [Serializable] public class NoNullAllowedException : DataException { protected NoNullAllowedException(SerializationInfo info, StreamingContext context) : base(info, context) { throw new PlatformNotSupportedException(); } public NoNullAllowedException() : base("Null not allowed.") { base.HResult = -2146232026; } public NoNullAllowedException(string s) : base(s) { base.HResult = -2146232026; } public NoNullAllowedException(string message, Exception innerException) : base(message, innerException) { base.HResult = -2146232026; } } [Serializable] public class ReadOnlyException : DataException { protected ReadOnlyException(SerializationInfo info, StreamingContext context) : base(info, context) { throw new PlatformNotSupportedException(); } public ReadOnlyException() : base("Column is marked read only.") { base.HResult = -2146232025; } public ReadOnlyException(string s) : base(s) { base.HResult = -2146232025; } public ReadOnlyException(string message, Exception innerException) : base(message, innerException) { base.HResult = -2146232025; } } [Serializable] public class RowNotInTableException : DataException { protected RowNotInTableException(SerializationInfo info, StreamingContext context) : base(info, context) { throw new PlatformNotSupportedException(); } public RowNotInTableException() : base("Row not found in table.") { base.HResult = -2146232024; } public RowNotInTableException(string s) : base(s) { base.HResult = -2146232024; } public RowNotInTableException(string message, Exception innerException) : base(message, innerException) { base.HResult = -2146232024; } } [Serializable] public class VersionNotFoundException : DataException { protected VersionNotFoundException(SerializationInfo info, StreamingContext context) : base(info, context) { throw new PlatformNotSupportedException(); } public VersionNotFoundException() : base("Version not found.") { base.HResult = -2146232023; } public VersionNotFoundException(string s) : base(s) { base.HResult = -2146232023; } public VersionNotFoundException(string message, Exception innerException) : base(message, innerException) { base.HResult = -2146232023; } } internal static class ExceptionBuilder { private static void TraceException(string trace, Exception e) { if (e != null) { DataCommonEventSource.Log.Trace(trace, e); } } internal static Exception TraceExceptionAsReturnValue(Exception e) { TraceException(" '{0}'", e); return e; } internal static Exception TraceExceptionForCapture(Exception e) { TraceException(" '{0}'", e); return e; } internal static Exception TraceExceptionWithoutRethrow(Exception e) { TraceException(" '{0}'", e); return e; } internal static Exception _Argument(string error) { return TraceExceptionAsReturnValue(new ArgumentException(error)); } internal static Exception _Argument(string paramName, string error) { return TraceExceptionAsReturnValue(new ArgumentException(error)); } internal static Exception _Argument(string error, Exception innerException) { return TraceExceptionAsReturnValue(new ArgumentException(error, innerException)); } private static Exception _ArgumentNull(string paramName, string msg) { return TraceExceptionAsReturnValue(new ArgumentNullException(paramName, msg)); } internal static Exception _ArgumentOutOfRange(string paramName, string msg) { return TraceExceptionAsReturnValue(new ArgumentOutOfRangeException(paramName, msg)); } private static Exception _IndexOutOfRange(string error) { return TraceExceptionAsReturnValue(new IndexOutOfRangeException(error)); } private static Exception _InvalidOperation(string error) { return TraceExceptionAsReturnValue(new InvalidOperationException(error)); } private static Exception _InvalidEnumArgumentException(string error) { return TraceExceptionAsReturnValue(new InvalidEnumArgumentException(error)); } private static Exception _InvalidEnumArgumentException(T value) { return _InvalidEnumArgumentException(SR.Format("The {0} enumeration value, {1}, is invalid.", typeof(T).Name, value.ToString())); } private static void ThrowDataException(string error, Exception innerException) { throw TraceExceptionAsReturnValue(new DataException(error, innerException)); } private static Exception _Data(string error) { return TraceExceptionAsReturnValue(new DataException(error)); } private static Exception _Constraint(string error) { return TraceExceptionAsReturnValue(new ConstraintException(error)); } private static Exception _InvalidConstraint(string error) { return TraceExceptionAsReturnValue(new InvalidConstraintException(error)); } private static Exception _DeletedRowInaccessible(string error) { return TraceExceptionAsReturnValue(new DeletedRowInaccessibleException(error)); } private static Exception _DuplicateName(string error) { return TraceExceptionAsReturnValue(new DuplicateNameException(error)); } private static Exception _InRowChangingEvent(string error) { return TraceExceptionAsReturnValue(new InRowChangingEventException(error)); } private static Exception _MissingPrimaryKey(string error) { return TraceExceptionAsReturnValue(new MissingPrimaryKeyException(error)); } private static Exception _NoNullAllowed(string error) { return TraceExceptionAsReturnValue(new NoNullAllowedException(error)); } private static Exception _ReadOnly(string error) { return TraceExceptionAsReturnValue(new ReadOnlyException(error)); } private static Exception _RowNotInTable(string error) { return TraceExceptionAsReturnValue(new RowNotInTableException(error)); } private static Exception _VersionNotFound(string error) { return TraceExceptionAsReturnValue(new VersionNotFoundException(error)); } public static Exception ArgumentNull(string paramName) { return _ArgumentNull(paramName, SR.Format("'{0}' argument cannot be null.", paramName)); } public static Exception ArgumentOutOfRange(string paramName) { return _ArgumentOutOfRange(paramName, SR.Format("'{0}' argument is out of range.", paramName)); } public static Exception BadObjectPropertyAccess(string error) { return _InvalidOperation(SR.Format("Property not accessible because '{0}'.", error)); } public static Exception ArgumentContainsNull(string paramName) { return _Argument(paramName, SR.Format("'{0}' argument contains null value.", paramName)); } public static Exception CannotModifyCollection() { return _Argument("Collection itself is not modifiable."); } public static Exception CaseInsensitiveNameConflict(string name) { return _Argument(SR.Format("The given name '{0}' matches at least two names in the collection object with different cases, but does not match either of them with the same case.", name)); } public static Exception NamespaceNameConflict(string name) { return _Argument(SR.Format("The given name '{0}' matches at least two names in the collection object with different namespaces.", name)); } public static Exception InvalidOffsetLength() { return _Argument("Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection."); } public static Exception ColumnNotInTheTable(string column, string table) { return _Argument(SR.Format("Column '{0}' does not belong to table {1}.", column, table)); } public static Exception ColumnNotInAnyTable() { return _Argument("Column must belong to a table."); } public static Exception ColumnOutOfRange(int index) { return _IndexOutOfRange(SR.Format("Cannot find column {0}.", index.ToString(CultureInfo.InvariantCulture))); } public static Exception ColumnOutOfRange(string column) { return _IndexOutOfRange(SR.Format("Cannot find column {0}.", column)); } public static Exception CannotAddColumn1(string column) { return _Argument(SR.Format("Column '{0}' already belongs to this DataTable.", column)); } public static Exception CannotAddColumn2(string column) { return _Argument(SR.Format("Column '{0}' already belongs to another DataTable.", column)); } public static Exception CannotAddColumn3() { return _Argument("Cannot have more than one SimpleContent columns in a DataTable."); } public static Exception CannotAddColumn4(string column) { return _Argument(SR.Format("Cannot add a SimpleContent column to a table containing element columns or nested relations.", column)); } public static Exception CannotAddDuplicate(string column) { return _DuplicateName(SR.Format("A column named '{0}' already belongs to this DataTable.", column)); } public static Exception CannotAddDuplicate2(string table) { return _DuplicateName(SR.Format("Cannot add a column named '{0}': a nested table with the same name already belongs to this DataTable.", table)); } public static Exception CannotAddDuplicate3(string table) { return _DuplicateName(SR.Format("A column named '{0}' already belongs to this DataTable: cannot set a nested table name to the same name.", table)); } public static Exception CannotRemoveColumn() { return _Argument("Cannot remove a column that doesn't belong to this table."); } public static Exception CannotRemovePrimaryKey() { return _Argument("Cannot remove this column, because it's part of the primary key."); } public static Exception CannotRemoveChildKey(string relation) { return _Argument(SR.Format("Cannot remove this column, because it is part of the parent key for relationship {0}.", relation)); } public static Exception CannotRemoveConstraint(string constraint, string table) { return _Argument(SR.Format("Cannot remove this column, because it is a part of the constraint {0} on the table {1}.", constraint, table)); } public static Exception CannotRemoveExpression(string column, string expression) { return _Argument(SR.Format("Cannot remove this column, because it is part of an expression: {0} = {1}.", column, expression)); } public static Exception ColumnNotInTheUnderlyingTable(string column, string table) { return _Argument(SR.Format("Column '{0}' does not belong to underlying table '{1}'.", column, table)); } public static Exception InvalidOrdinal(string name, int ordinal) { return _ArgumentOutOfRange(name, SR.Format("Ordinal '{0}' exceeds the maximum number.", ordinal.ToString(CultureInfo.InvariantCulture))); } public static Exception AddPrimaryKeyConstraint() { return _Argument("Cannot add primary key constraint since primary key is already set for the table."); } public static Exception NoConstraintName() { return _Argument("Cannot change the name of a constraint to empty string when it is in the ConstraintCollection."); } public static Exception ConstraintViolation(string constraint) { return _Constraint(SR.Format("Cannot enforce constraints on constraint {0}.", constraint)); } public static Exception ConstraintNotInTheTable(string constraint) { return _Argument(SR.Format("Constraint '{0}' does not belong to this DataTable.", constraint)); } public static string KeysToString(object[] keys) { string text = string.Empty; for (int i = 0; i < keys.Length; i++) { text = text + Convert.ToString(keys[i], null) + ((i < keys.Length - 1) ? ", " : string.Empty); } return text; } public static string UniqueConstraintViolationText(DataColumn[] columns, object[] values) { if (columns.Length > 1) { string text = string.Empty; for (int i = 0; i < columns.Length; i++) { text = text + columns[i].ColumnName + ((i < columns.Length - 1) ? ", " : ""); } return SR.Format("Column '{0}' is constrained to be unique. Value '{1}' is already present.", text, KeysToString(values)); } return SR.Format("Column '{0}' is constrained to be unique. Value '{1}' is already present.", columns[0].ColumnName, Convert.ToString(values[0], null)); } public static Exception ConstraintViolation(DataColumn[] columns, object[] values) { return _Constraint(UniqueConstraintViolationText(columns, values)); } public static Exception ConstraintOutOfRange(int index) { return _IndexOutOfRange(SR.Format("Cannot find constraint {0}.", index.ToString(CultureInfo.InvariantCulture))); } public static Exception DuplicateConstraint(string constraint) { return _Data(SR.Format("Constraint matches constraint named {0} already in collection.", constraint)); } public static Exception DuplicateConstraintName(string constraint) { return _DuplicateName(SR.Format("A Constraint named '{0}' already belongs to this DataTable.", constraint)); } public static Exception NeededForForeignKeyConstraint(UniqueConstraint key, ForeignKeyConstraint fk) { return _Argument(SR.Format("Cannot remove unique constraint '{0}'. Remove foreign key constraint '{1}' first.", key.ConstraintName, fk.ConstraintName)); } public static Exception UniqueConstraintViolation() { return _Argument("These columns don't currently have unique values."); } public static Exception ConstraintForeignTable() { return _Argument("These columns don't point to this table."); } public static Exception ConstraintParentValues() { return _Argument("This constraint cannot be enabled as not all values have corresponding parent values."); } public static Exception ConstraintAddFailed(DataTable table) { return _InvalidConstraint(SR.Format("This constraint cannot be added since ForeignKey doesn't belong to table {0}.", table.TableName)); } public static Exception ConstraintRemoveFailed() { return _Argument("Cannot remove a constraint that doesn't belong to this table."); } public static Exception FailedCascadeDelete(string constraint) { return _InvalidConstraint(SR.Format("Cannot delete this row because constraints are enforced on relation {0}, and deleting this row will strand child rows.", constraint)); } public static Exception FailedCascadeUpdate(string constraint) { return _InvalidConstraint(SR.Format("Cannot make this change because constraints are enforced on relation {0}, and changing this value will strand child rows.", constraint)); } public static Exception FailedClearParentTable(string table, string constraint, string childTable) { return _InvalidConstraint(SR.Format("Cannot clear table {0} because ForeignKeyConstraint {1} enforces constraints and there are child rows in {2}.", table, constraint, childTable)); } public static Exception ForeignKeyViolation(string constraint, object[] keys) { return _InvalidConstraint(SR.Format("ForeignKeyConstraint {0} requires the child key values ({1}) to exist in the parent table.", constraint, KeysToString(keys))); } public static Exception RemoveParentRow(ForeignKeyConstraint constraint) { return _InvalidConstraint(SR.Format("Cannot remove this row because it has child rows, and constraints on relation {0} are enforced.", constraint.ConstraintName)); } public static string MaxLengthViolationText(string columnName) { return SR.Format("Column '{0}' exceeds the MaxLength limit.", columnName); } public static string NotAllowDBNullViolationText(string columnName) { return SR.Format("Column '{0}' does not allow DBNull.Value.", columnName); } public static Exception CantAddConstraintToMultipleNestedTable(string tableName) { return _Argument(SR.Format("Cannot add constraint to DataTable '{0}' which is a child table in two nested relations.", tableName)); } public static Exception AutoIncrementAndExpression() { return _Argument("Cannot set AutoIncrement property for a computed column."); } public static Exception AutoIncrementAndDefaultValue() { return _Argument("Cannot set AutoIncrement property for a column with DefaultValue set."); } public static Exception AutoIncrementSeed() { return _Argument("AutoIncrementStep must be a non-zero value."); } public static Exception CantChangeDataType() { return _Argument("Cannot change DataType of a column once it has data."); } public static Exception NullDataType() { return _Argument("Column requires a valid DataType."); } public static Exception ColumnNameRequired() { return _Argument("ColumnName is required when it is part of a DataTable."); } public static Exception DefaultValueAndAutoIncrement() { return _Argument("Cannot set a DefaultValue on an AutoIncrement column."); } public static Exception DefaultValueDataType(string column, Type defaultType, Type columnType, Exception inner) { if (column.Length != 0) { return _Argument(SR.Format("The DefaultValue for column {0} is of type {1} and cannot be converted to {2}.", column, defaultType.FullName, columnType.FullName), inner); } return _Argument(SR.Format("The DefaultValue for the column is of type {0} and cannot be converted to {1}.", defaultType.FullName, columnType.FullName), inner); } public static Exception DefaultValueColumnDataType(string column, Type defaultType, Type columnType, Exception inner) { return _Argument(SR.Format("The DefaultValue for column {0} is of type {1}, but the column is of type {2}.", column, defaultType.FullName, columnType.FullName), inner); } public static Exception ExpressionAndUnique() { return _Argument("Cannot create an expression on a column that has AutoIncrement or Unique."); } public static Exception ExpressionAndReadOnly() { return _Argument("Cannot set expression because column cannot be made ReadOnly."); } public static Exception ExpressionAndConstraint(DataColumn column, Constraint constraint) { return _Argument(SR.Format("Cannot set Expression property on column {0}, because it is a part of a constraint.", column.ColumnName, constraint.ConstraintName)); } public static Exception ExpressionInConstraint(DataColumn column) { return _Argument(SR.Format("Cannot create a constraint based on Expression column {0}.", column.ColumnName)); } public static Exception ExpressionCircular() { return _Argument("Cannot set Expression property due to circular reference in the expression."); } public static Exception NonUniqueValues(string column) { return _InvalidConstraint(SR.Format("Column '{0}' contains non-unique values.", column)); } public static Exception NullKeyValues(string column) { return _Data(SR.Format("Column '{0}' has null values in it.", column)); } public static Exception NullValues(string column) { return _NoNullAllowed(SR.Format("Column '{0}' does not allow nulls.", column)); } public static Exception ReadOnlyAndExpression() { return _ReadOnly("Cannot change ReadOnly property for the expression column."); } public static Exception ReadOnly(string column) { return _ReadOnly(SR.Format("Column '{0}' is read only.", column)); } public static Exception UniqueAndExpression() { return _Argument("Cannot change Unique property for the expression column."); } public static Exception SetFailed(object value, DataColumn column, Type type, Exception innerException) { return _Argument(innerException.Message + SR.Format("Couldn't store <{0}> in {1} Column. Expected type is {2}.", value.ToString(), column.ColumnName, type.Name), innerException); } public static Exception CannotSetToNull(DataColumn column) { return _Argument(SR.Format("Cannot set Column '{0}' to be null. Please use DBNull instead.", column.ColumnName)); } public static Exception LongerThanMaxLength(DataColumn column) { return _Argument(SR.Format("Cannot set column '{0}'. The value violates the MaxLength limit of this column.", column.ColumnName)); } public static Exception CannotSetMaxLength(DataColumn column, int value) { return _Argument(SR.Format("Cannot set Column '{0}' property MaxLength to '{1}'. There is at least one string in the table longer than the new limit.", column.ColumnName, value.ToString(CultureInfo.InvariantCulture))); } public static Exception CannotSetMaxLength2(DataColumn column) { return _Argument(SR.Format("Cannot set Column '{0}' property MaxLength. The Column is SimpleContent.", column.ColumnName)); } public static Exception CannotSetSimpleContentType(string columnName, Type type) { return _Argument(SR.Format("Cannot set Column '{0}' property DataType to {1}. The Column is SimpleContent.", columnName, type)); } public static Exception CannotSetSimpleContent(string columnName, Type type) { return _Argument(SR.Format("Cannot set Column '{0}' property MappingType to SimpleContent. The Column DataType is {1}.", columnName, type)); } public static Exception CannotChangeNamespace(string columnName) { return _Argument(SR.Format("Cannot change the Column '{0}' property Namespace. The Column is SimpleContent.", columnName)); } public static Exception HasToBeStringType(DataColumn column) { return _Argument(SR.Format("MaxLength applies to string data type only. You cannot set Column '{0}' property MaxLength to be non-negative number.", column.ColumnName)); } public static Exception AutoIncrementCannotSetIfHasData(string typeName) { return _Argument(SR.Format("Cannot change AutoIncrement of a DataColumn with type '{0}' once it has data.", typeName)); } public static Exception INullableUDTwithoutStaticNull(string typeName) { return _Argument(SR.Format("Type '{0}' does not contain static Null property or field.", typeName)); } public static Exception IComparableNotImplemented(string typeName) { return _Data(SR.Format(" Type '{0}' does not implement IComparable interface. Comparison cannot be done.", typeName)); } public static Exception UDTImplementsIChangeTrackingButnotIRevertible(string typeName) { return _InvalidOperation(SR.Format("Type '{0}' does not implement IRevertibleChangeTracking; therefore can not proceed with RejectChanges().", typeName)); } public static Exception SetAddedAndModifiedCalledOnnonUnchanged() { return _InvalidOperation("SetAdded and SetModified can only be called on DataRows with Unchanged DataRowState."); } public static Exception InvalidDataColumnMapping(Type type) { return _Argument(SR.Format("DataColumn with type '{0}' is a complexType. Can not serialize value of a complex type as Attribute", type.AssemblyQualifiedName)); } public static Exception CannotSetDateTimeModeForNonDateTimeColumns() { return _InvalidOperation("The DateTimeMode can be set only on DataColumns of type DateTime."); } public static Exception InvalidDateTimeMode(DataSetDateTime mode) { return _InvalidEnumArgumentException(mode); } public static Exception CantChangeDateTimeMode(DataSetDateTime oldValue, DataSetDateTime newValue) { return _InvalidOperation(SR.Format("Cannot change DateTimeMode from '{0}' to '{1}' once the table has data.", oldValue.ToString(), newValue.ToString())); } public static Exception ColumnTypeNotSupported() { return ADP.NotSupported("DataSet does not support System.Nullable<>."); } public static Exception SetFailed(string name) { return _Data(SR.Format("Cannot set {0}.", name)); } public static Exception SetDataSetFailed() { return _Data("Cannot change DataSet on a DataViewManager that's already the default view for a DataSet."); } public static Exception SetRowStateFilter() { return _Data("RowStateFilter cannot show ModifiedOriginals and ModifiedCurrents at the same time."); } public static Exception CanNotSetDataSet() { return _Data("Cannot change DataSet property once it is set."); } public static Exception CanNotUseDataViewManager() { return _Data("DataSet must be set prior to using DataViewManager."); } public static Exception CanNotSetTable() { return _Data("Cannot change Table property once it is set."); } public static Exception CanNotUse() { return _Data("DataTable must be set prior to using DataView."); } public static Exception CanNotBindTable() { return _Data("Cannot bind to DataTable with no name."); } public static Exception SetTable() { return _Data("Cannot change Table property on a DefaultView or a DataView coming from a DataViewManager."); } public static Exception SetIListObject() { return _Argument("Cannot set an object into this list."); } public static Exception AddNewNotAllowNull() { return _Data("Cannot call AddNew on a DataView where AllowNew is false."); } public static Exception NotOpen() { return _Data("DataView is not open."); } public static Exception CreateChildView() { return _Argument("The relation is not parented to the table to which this DataView points."); } public static Exception CanNotDelete() { return _Data("Cannot delete on a DataSource where AllowDelete is false."); } public static Exception CanNotEdit() { return _Data("Cannot edit on a DataSource where AllowEdit is false."); } public static Exception GetElementIndex(int index) { return _IndexOutOfRange(SR.Format("Index {0} is either negative or above rows count.", index.ToString(CultureInfo.InvariantCulture))); } public static Exception AddExternalObject() { return _Argument("Cannot add external objects to this list."); } public static Exception CanNotClear() { return _Argument("Cannot clear this list."); } public static Exception InsertExternalObject() { return _Argument("Cannot insert external objects to this list."); } public static Exception RemoveExternalObject() { return _Argument("Cannot remove objects not in the list."); } public static Exception PropertyNotFound(string property, string table) { return _Argument(SR.Format("{0} is neither a DataColumn nor a DataRelation for table {1}.", property, table)); } public static Exception ColumnToSortIsOutOfRange(string column) { return _Argument(SR.Format("Cannot find column {0}.", column)); } public static Exception KeyTableMismatch() { return _InvalidConstraint("Cannot create a Key from Columns that belong to different tables."); } public static Exception KeyNoColumns() { return _InvalidConstraint("Cannot have 0 columns."); } public static Exception KeyTooManyColumns(int cols) { return _InvalidConstraint(SR.Format("Cannot have more than {0} columns.", cols.ToString(CultureInfo.InvariantCulture))); } public static Exception KeyDuplicateColumns(string columnName) { return _InvalidConstraint(SR.Format("Cannot create a Key when the same column is listed more than once: '{0}'", columnName)); } public static Exception RelationDataSetMismatch() { return _InvalidConstraint("Cannot have a relationship between tables in different DataSets."); } public static Exception NoRelationName() { return _Argument("RelationName is required when it is part of a DataSet."); } public static Exception ColumnsTypeMismatch() { return _InvalidConstraint("Parent Columns and Child Columns don't have type-matching columns."); } public static Exception KeyLengthMismatch() { return _Argument("ParentColumns and ChildColumns should be the same length."); } public static Exception KeyLengthZero() { return _Argument("ParentColumns and ChildColumns must not be zero length."); } public static Exception ForeignRelation() { return _Argument("This relation should connect two tables in this DataSet to be added to this DataSet."); } public static Exception KeyColumnsIdentical() { return _InvalidConstraint("ParentKey and ChildKey are identical."); } public static Exception RelationForeignTable(string t1, string t2) { return _InvalidConstraint(SR.Format("GetChildRows requires a row whose Table is {0}, but the specified row's Table is {1}.", t1, t2)); } public static Exception GetParentRowTableMismatch(string t1, string t2) { return _InvalidConstraint(SR.Format("GetParentRow requires a row whose Table is {0}, but the specified row's Table is {1}.", t1, t2)); } public static Exception SetParentRowTableMismatch(string t1, string t2) { return _InvalidConstraint(SR.Format("SetParentRow requires a child row whose Table is {0}, but the specified row's Table is {1}.", t1, t2)); } public static Exception RelationForeignRow() { return _Argument("The row doesn't belong to the same DataSet as this relation."); } public static Exception RelationNestedReadOnly() { return _Argument("Cannot set the 'Nested' property to false for this relation."); } public static Exception TableCantBeNestedInTwoTables(string tableName) { return _Argument(SR.Format("The same table '{0}' cannot be the child table in two nested relations.", tableName)); } public static Exception LoopInNestedRelations(string tableName) { return _Argument(SR.Format("The table ({0}) cannot be the child table to itself in nested relations.", tableName)); } public static Exception RelationDoesNotExist() { return _Argument("This relation doesn't belong to this relation collection."); } public static Exception ParentRowNotInTheDataSet() { return _Argument("This relation and child row don't belong to same DataSet."); } public static Exception ParentOrChildColumnsDoNotHaveDataSet() { return _InvalidConstraint("Cannot create a DataRelation if Parent or Child Columns are not in a DataSet."); } public static Exception InValidNestedRelation(string childTableName) { return _InvalidOperation(SR.Format("Nested table '{0}' which inherits its namespace cannot have multiple parent tables in different namespaces.", childTableName)); } public static Exception InvalidParentNamespaceinNestedRelation(string childTableName) { return _InvalidOperation(SR.Format("Nested table '{0}' with empty namespace cannot have multiple parent tables in different namespaces.", childTableName)); } public static Exception RowNotInTheDataSet() { return _Argument("The row doesn't belong to the same DataSet as this relation."); } public static Exception RowNotInTheTable() { return _RowNotInTable("Cannot perform this operation on a row not in the table."); } public static Exception EditInRowChanging() { return _InRowChangingEvent("Cannot change a proposed value in the RowChanging event."); } public static Exception EndEditInRowChanging() { return _InRowChangingEvent("Cannot call EndEdit() inside an OnRowChanging event."); } public static Exception BeginEditInRowChanging() { return _InRowChangingEvent("Cannot call BeginEdit() inside the RowChanging event."); } public static Exception CancelEditInRowChanging() { return _InRowChangingEvent("Cannot call CancelEdit() inside an OnRowChanging event. Throw an exception to cancel this update."); } public static Exception DeleteInRowDeleting() { return _InRowChangingEvent("Cannot call Delete inside an OnRowDeleting event. Throw an exception to cancel this delete."); } public static Exception ValueArrayLength() { return _Argument("Input array is longer than the number of columns in this table."); } public static Exception NoCurrentData() { return _VersionNotFound("There is no Current data to access."); } public static Exception NoOriginalData() { return _VersionNotFound("There is no Original data to access."); } public static Exception NoProposedData() { return _VersionNotFound("There is no Proposed data to access."); } public static Exception RowRemovedFromTheTable() { return _RowNotInTable("This row has been removed from a table and does not have any data. BeginEdit() will allow creation of new data in this row."); } public static Exception DeletedRowInaccessible() { return _DeletedRowInaccessible("Deleted row information cannot be accessed through the row."); } public static Exception RowAlreadyDeleted() { return _DeletedRowInaccessible("Cannot delete this row since it's already deleted."); } public static Exception RowEmpty() { return _Argument("This row is empty."); } public static Exception InvalidRowVersion() { return _Data("Version must be Original, Current, or Proposed."); } public static Exception RowOutOfRange() { return _IndexOutOfRange("The given DataRow is not in the current DataRowCollection."); } public static Exception RowOutOfRange(int index) { return _IndexOutOfRange(SR.Format("There is no row at position {0}.", index.ToString(CultureInfo.InvariantCulture))); } public static Exception RowInsertOutOfRange(int index) { return _IndexOutOfRange(SR.Format("The row insert position {0} is invalid.", index.ToString(CultureInfo.InvariantCulture))); } public static Exception RowInsertTwice(int index, string tableName) { return _IndexOutOfRange(SR.Format("The rowOrder value={0} has been found twice for table named '{1}'.", index.ToString(CultureInfo.InvariantCulture), tableName)); } public static Exception RowInsertMissing(string tableName) { return _IndexOutOfRange(SR.Format("Values are missing in the rowOrder sequence for table '{0}'.", tableName)); } public static Exception RowAlreadyRemoved() { return _Data("Cannot remove a row that's already been removed."); } public static Exception MultipleParents() { return _Data("A child row has multiple parents."); } public static Exception InvalidRowState(DataRowState state) { return _InvalidEnumArgumentException(state); } public static Exception InvalidRowBitPattern() { return _Argument("Unrecognized row state bit pattern."); } internal static Exception SetDataSetNameToEmpty() { return _Argument("Cannot change the name of the DataSet to an empty string."); } internal static Exception SetDataSetNameConflicting(string name) { return _Argument(SR.Format("The name '{0}' is invalid. A DataSet cannot have the same name of the DataTable.", name)); } public static Exception DataSetUnsupportedSchema(string ns) { return _Argument(SR.Format("The schema namespace is invalid. Please use this one instead: {0}.", ns)); } public static Exception MergeMissingDefinition(string obj) { return _Argument(SR.Format("Target DataSet missing definition for {0}.", obj)); } public static Exception TablesInDifferentSets() { return _Argument("Cannot create a relation between tables in different DataSets."); } public static Exception RelationAlreadyExists() { return _Argument("A relation already exists for these child columns."); } public static Exception RowAlreadyInOtherCollection() { return _Argument("This row already belongs to another table."); } public static Exception RowAlreadyInTheCollection() { return _Argument("This row already belongs to this table."); } public static Exception TableMissingPrimaryKey() { return _MissingPrimaryKey("Table doesn't have a primary key."); } public static Exception RecordStateRange() { return _Argument("The RowStates parameter must be set to a valid combination of values from the DataViewRowState enumeration."); } public static Exception IndexKeyLength(int length, int keyLength) { if (length != 0) { return _Argument(SR.Format("Expecting {0} value(s) for the key being indexed, but received {1} value(s).", length.ToString(CultureInfo.InvariantCulture), keyLength.ToString(CultureInfo.InvariantCulture))); } return _Argument("Find finds a row based on a Sort order, and no Sort order is specified."); } public static Exception RemovePrimaryKey(DataTable table) { if (table.TableName.Length != 0) { return _Argument(SR.Format("Cannot remove unique constraint since it's the primary key of table {0}.", table.TableName)); } return _Argument("Cannot remove unique constraint since it's the primary key of a table."); } public static Exception RelationAlreadyInOtherDataSet() { return _Argument("This relation already belongs to another DataSet."); } public static Exception RelationAlreadyInTheDataSet() { return _Argument("This relation already belongs to this DataSet."); } public static Exception RelationNotInTheDataSet(string relation) { return _Argument(SR.Format("Relation {0} does not belong to this DataSet.", relation)); } public static Exception RelationOutOfRange(object index) { return _IndexOutOfRange(SR.Format("Cannot find relation {0}.", Convert.ToString(index, null))); } public static Exception DuplicateRelation(string relation) { return _DuplicateName(SR.Format("A Relation named '{0}' already belongs to this DataSet.", relation)); } public static Exception RelationTableNull() { return _Argument("Cannot create a collection on a null table."); } public static Exception RelationDataSetNull() { return _Argument("Cannot create a collection on a null table."); } public static Exception RelationTableWasRemoved() { return _Argument("The table this collection displays relations for has been removed from its DataSet."); } public static Exception ParentTableMismatch() { return _Argument("Cannot add a relation to this table's ChildRelation collection where this table isn't the parent table."); } public static Exception ChildTableMismatch() { return _Argument("Cannot add a relation to this table's ParentRelation collection where this table isn't the child table."); } public static Exception EnforceConstraint() { return _Constraint("Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints."); } public static Exception CaseLocaleMismatch() { return _Argument("Cannot add a DataRelation or Constraint that has different Locale or CaseSensitive settings between its parent and child tables."); } public static Exception CannotChangeCaseLocale() { return CannotChangeCaseLocale(null); } public static Exception CannotChangeCaseLocale(Exception innerException) { return _Argument("Cannot change CaseSensitive or Locale property. This change would lead to at least one DataRelation or Constraint to have different Locale or CaseSensitive settings between its related tables.", innerException); } public static Exception CannotChangeSchemaSerializationMode() { return _InvalidOperation("SchemaSerializationMode property can be set only if it is overridden by derived DataSet."); } public static Exception InvalidSchemaSerializationMode(Type enumType, string mode) { return _InvalidEnumArgumentException(SR.Format("The {0} enumeration value, {1}, is invalid.", enumType.Name, mode)); } public static Exception InvalidRemotingFormat(SerializationFormat mode) { return _InvalidEnumArgumentException(mode); } public static Exception TableForeignPrimaryKey() { return _Argument("PrimaryKey columns do not belong to this table."); } public static Exception TableCannotAddToSimpleContent() { return _Argument("Cannot add a nested relation or an element column to a table containing a SimpleContent column."); } public static Exception NoTableName() { return _Argument("TableName is required when it is part of a DataSet."); } public static Exception MultipleTextOnlyColumns() { return _Argument("DataTable already has a simple content column."); } public static Exception InvalidSortString(string sort) { return _Argument(SR.Format(" {0} isn't a valid Sort string entry.", sort)); } public static Exception DuplicateTableName(string table) { return _DuplicateName(SR.Format("A DataTable named '{0}' already belongs to this DataSet.", table)); } public static Exception DuplicateTableName2(string table, string ns) { return _DuplicateName(SR.Format("A DataTable named '{0}' with the same Namespace '{1}' already belongs to this DataSet.", table, ns)); } public static Exception SelfnestedDatasetConflictingName(string table) { return _DuplicateName(SR.Format("The table ({0}) cannot be the child table to itself in a nested relation: the DataSet name conflicts with the table name.", table)); } public static Exception DatasetConflictingName(string table) { return _DuplicateName(SR.Format("The name '{0}' is invalid. A DataTable cannot have the same name of the DataSet.", table)); } public static Exception TableAlreadyInOtherDataSet() { return _Argument("DataTable already belongs to another DataSet."); } public static Exception TableAlreadyInTheDataSet() { return _Argument("DataTable already belongs to this DataSet."); } public static Exception TableOutOfRange(int index) { return _IndexOutOfRange(SR.Format("Cannot find table {0}.", index.ToString(CultureInfo.InvariantCulture))); } public static Exception TableNotInTheDataSet(string table) { return _Argument(SR.Format("Table {0} does not belong to this DataSet.", table)); } public static Exception TableInRelation() { return _Argument("Cannot remove a table that has existing relations. Remove relations first."); } public static Exception TableInConstraint(DataTable table, Constraint constraint) { return _Argument(SR.Format("Cannot remove table {0}, because it referenced in ForeignKeyConstraint {1}. Remove the constraint first.", table.TableName, constraint.ConstraintName)); } public static Exception CanNotSerializeDataTableHierarchy() { return _InvalidOperation("Cannot serialize the DataTable. A DataTable being used in one or more DataColumn expressions is not a descendant of current DataTable."); } public static Exception CanNotRemoteDataTable() { return _InvalidOperation("This DataTable can only be remoted as part of DataSet. One or more Expression Columns has reference to other DataTable(s)."); } public static Exception CanNotSetRemotingFormat() { return _Argument("Cannot have different remoting format property value for DataSet and DataTable."); } public static Exception CanNotSerializeDataTableWithEmptyName() { return _InvalidOperation("Cannot serialize the DataTable. DataTable name is not set."); } public static Exception TableNotFound(string tableName) { return _Argument(SR.Format("DataTable '{0}' does not match to any DataTable in source.", tableName)); } public static Exception AggregateException(AggregateType aggregateType, Type type) { return _Data(SR.Format("Invalid usage of aggregate function {0}() and Type: {1}.", aggregateType.ToString(), type.Name)); } public static Exception InvalidStorageType(TypeCode typecode) { return _Data(SR.Format("Invalid storage type: {0}.", typecode.ToString())); } public static Exception RangeArgument(int min, int max) { return _Argument(SR.Format("Min ({0}) must be less than or equal to max ({1}) in a Range object.", min.ToString(CultureInfo.InvariantCulture), max.ToString(CultureInfo.InvariantCulture))); } public static Exception NullRange() { return _Data("This is a null range."); } public static Exception NegativeMinimumCapacity() { return _Argument("MinimumCapacity must be non-negative."); } public static Exception ProblematicChars(char charValue) { ushort num = charValue; return _Argument(SR.Format("The DataSet Xml persistency does not support the value '{0}' as Char value, please use Byte storage instead.", "0x" + num.ToString("X", CultureInfo.InvariantCulture))); } public static Exception StorageSetFailed() { return _Argument("Type of value has a mismatch with column type"); } public static Exception SimpleTypeNotSupported() { return _Data("DataSet doesn't support 'union' or 'list' as simpleType."); } public static Exception MissingAttribute(string attribute) { return MissingAttribute(string.Empty, attribute); } public static Exception MissingAttribute(string element, string attribute) { return _Data(SR.Format("Invalid {0} syntax: missing required '{1}' attribute.", element, attribute)); } public static Exception InvalidAttributeValue(string name, string value) { return _Data(SR.Format("Value '{1}' is invalid for attribute '{0}'.", name, value)); } public static Exception AttributeValues(string name, string value1, string value2) { return _Data(SR.Format("The value of attribute '{0}' should be '{1}' or '{2}'.", name, value1, value2)); } public static Exception ElementTypeNotFound(string name) { return _Data(SR.Format("Cannot find ElementType name='{0}'.", name)); } public static Exception RelationParentNameMissing(string rel) { return _Data(SR.Format("Parent table name is missing in relation '{0}'.", rel)); } public static Exception RelationChildNameMissing(string rel) { return _Data(SR.Format("Child table name is missing in relation '{0}'.", rel)); } public static Exception RelationTableKeyMissing(string rel) { return _Data(SR.Format("Parent table key is missing in relation '{0}'.", rel)); } public static Exception RelationChildKeyMissing(string rel) { return _Data(SR.Format("Child table key is missing in relation '{0}'.", rel)); } public static Exception UndefinedDatatype(string name) { return _Data(SR.Format("Undefined data type: '{0}'.", name)); } public static Exception DatatypeNotDefined() { return _Data("Data type not defined."); } public static Exception MismatchKeyLength() { return _Data("Invalid Relation definition: different length keys."); } public static Exception InvalidField(string name) { return _Data(SR.Format("Invalid XPath selection inside field node. Cannot find: {0}.", name)); } public static Exception InvalidSelector(string name) { return _Data(SR.Format("Invalid XPath selection inside selector node: {0}.", name)); } public static Exception CircularComplexType(string name) { return _Data(SR.Format("DataSet doesn't allow the circular reference in the ComplexType named '{0}'.", name)); } public static Exception CannotInstantiateAbstract(string name) { return _Data(SR.Format("DataSet cannot instantiate an abstract ComplexType for the node {0}.", name)); } public static Exception InvalidKey(string name) { return _Data(SR.Format("Invalid 'Key' node inside constraint named: {0}.", name)); } public static Exception DiffgramMissingTable(string name) { return _Data(SR.Format("Cannot load diffGram. Table '{0}' is missing in the destination dataset.", name)); } public static Exception DiffgramMissingSQL() { return _Data("Cannot load diffGram. The 'sql' node is missing."); } public static Exception DuplicateConstraintRead(string str) { return _Data(SR.Format("The constraint name {0} is already used in the schema.", str)); } public static Exception ColumnTypeConflict(string name) { return _Data(SR.Format("Column name '{0}' is defined for different mapping types.", name)); } public static Exception CannotConvert(string name, string type) { return _Data(SR.Format(" Cannot convert '{0}' to type '{1}'.", name, type)); } public static Exception MissingRefer(string name) { return _Data(SR.Format("Missing '{0}' part in '{1}' constraint named '{2}'.", "refer", "keyref", name)); } public static Exception InvalidPrefix(string name) { return _Data(SR.Format("Prefix '{0}' is not valid, because it contains special characters.", name)); } public static Exception CanNotDeserializeObjectType() { return _InvalidOperation("Unable to proceed with deserialization. Data does not implement IXMLSerializable, therefore polymorphism is not supported."); } public static Exception IsDataSetAttributeMissingInSchema() { return _Data("IsDataSet attribute is missing in input Schema."); } public static Exception TooManyIsDataSetAtributeInSchema() { return _Data("Cannot determine the DataSet Element. IsDataSet attribute exist more than once."); } public static Exception NestedCircular(string name) { return _Data(SR.Format("Circular reference in self-nested table '{0}'.", name)); } public static Exception MultipleParentRows(string tableQName) { return _Data(SR.Format("Cannot proceed with serializing DataTable '{0}'. It contains a DataRow which has multiple parent rows on the same Foreign Key.", tableQName)); } public static Exception PolymorphismNotSupported(string typeName) { return _InvalidOperation(SR.Format("Type '{0}' does not implement IXmlSerializable interface therefore can not proceed with serialization.", typeName)); } public static Exception DataTableInferenceNotSupported() { return _InvalidOperation("DataTable does not support schema inference from Xml."); } internal static void ThrowMultipleTargetConverter(Exception innerException) { ThrowDataException((innerException != null) ? "An error occurred with the multiple target converter while writing an Xml Schema. See the inner exception for details." : "An error occurred with the multiple target converter while writing an Xml Schema. A null or empty string was returned.", innerException); } public static Exception DuplicateDeclaration(string name) { return _Data(SR.Format("Duplicated declaration '{0}'.", name)); } public static Exception FoundEntity() { return _Data("DataSet cannot expand entities. Use XmlValidatingReader and set the EntityHandling property accordingly."); } public static Exception MergeFailed(string name) { return _Data(name); } public static Exception ConvertFailed(Type type1, Type type2) { return _Data(SR.Format(" Cannot convert object of type '{0}' to object of type '{1}'.", type1.FullName, type2.FullName)); } public static Exception InvalidDataTableReader(string tableName) { return _InvalidOperation(SR.Format("DataTableReader is invalid for current DataTable '{0}'.", tableName)); } public static Exception DataTableReaderSchemaIsInvalid(string tableName) { return _InvalidOperation(SR.Format("Schema of current DataTable '{0}' in DataTableReader has changed, DataTableReader is invalid.", tableName)); } public static Exception CannotCreateDataReaderOnEmptyDataSet() { return _Argument("DataTableReader Cannot be created. There is no DataTable in DataSet."); } public static Exception DataTableReaderArgumentIsEmpty() { return _Argument("Cannot create DataTableReader. Argument is Empty."); } public static Exception ArgumentContainsNullValue() { return _Argument("Cannot create DataTableReader. Arguments contain null value."); } public static Exception InvalidCurrentRowInDataTableReader() { return _DeletedRowInaccessible("Current DataRow is either in Deleted or Detached state."); } public static Exception EmptyDataTableReader(string tableName) { return _DeletedRowInaccessible(SR.Format("Current DataTable '{0}' is empty. There is no DataRow in DataTable.", tableName)); } internal static Exception InvalidDuplicateNamedSimpleTypeDelaration(string stName, string errorStr) { return _Argument(SR.Format("Simple type '{0}' has already be declared with different '{1}'.", stName, errorStr)); } internal static Exception InternalRBTreeError(RBTreeError internalError) { return _InvalidOperation(SR.Format("DataTable internal index is corrupted: '{0}'.", (int)internalError)); } public static Exception EnumeratorModified() { return _InvalidOperation("Collection was modified; enumeration operation might not execute."); } } internal struct DataKey { private const int maxColumns = 32; private readonly DataColumn[] _columns; internal DataColumn[] ColumnsReference => _columns; internal bool HasValue => _columns != null; internal DataTable Table => _columns[0].Table; internal DataKey(DataColumn[] columns, bool copyColumns) { if (columns == null) { throw ExceptionBuilder.ArgumentNull("columns"); } if (columns.Length == 0) { throw ExceptionBuilder.KeyNoColumns(); } if (columns.Length > 32) { throw ExceptionBuilder.KeyTooManyColumns(32); } for (int i = 0; i < columns.Length; i++) { if (columns[i] == null) { throw ExceptionBuilder.ArgumentNull("column"); } } for (int j = 0; j < columns.Length; j++) { for (int k = 0; k < j; k++) { if (columns[j] == columns[k]) { throw ExceptionBuilder.KeyDuplicateColumns(columns[j].ColumnName); } } } if (copyColumns) { _columns = new DataColumn[columns.Length]; for (int l = 0; l < columns.Length; l++) { _columns[l] = columns[l]; } } else { _columns = columns; } CheckState(); } internal void CheckState() { DataTable table = _columns[0].Table; if (table == null) { throw ExceptionBuilder.ColumnNotInAnyTable(); } for (int i = 1; i < _columns.Length; i++) { if (_columns[i].Table == null) { throw ExceptionBuilder.ColumnNotInAnyTable(); } if (_columns[i].Table != table) { throw ExceptionBuilder.KeyTableMismatch(); } } } internal bool ColumnsEqual(DataKey key) { return ColumnsEqual(_columns, key._columns); } internal static bool ColumnsEqual(DataColumn[] column1, DataColumn[] column2) { if (column1 == column2) { return true; } if (column1 == null || column2 == null) { return false; } if (column1.Length != column2.Length) { return false; } for (int i = 0; i < column1.Length; i++) { bool flag = false; for (int j = 0; j < column2.Length; j++) { if (column1[i].Equals(column2[j])) { flag = true; break; } } if (!flag) { return false; } } return true; } internal bool ContainsColumn(DataColumn column) { for (int i = 0; i < _columns.Length; i++) { if (column == _columns[i]) { return true; } } return false; } public override int GetHashCode() { return base.GetHashCode(); } public override bool Equals(object value) { return Equals((DataKey)value); } internal bool Equals(DataKey value) { DataColumn[] columns = _columns; DataColumn[] columns2 = value._columns; if (columns == columns2) { return true; } if (columns == null || columns2 == null) { return false; } if (columns.Length != columns2.Length) { return false; } for (int i = 0; i < columns.Length; i++) { if (!columns[i].Equals(columns2[i])) { return false; } } return true; } internal string[] GetColumnNames() { string[] array = new string[_columns.Length]; for (int i = 0; i < _columns.Length; i++) { array[i] = _columns[i].ColumnName; } return array; } internal IndexField[] GetIndexDesc() { IndexField[] array = new IndexField[_columns.Length]; for (int i = 0; i < _columns.Length; i++) { array[i] = new IndexField(_columns[i], isDescending: false); } return array; } internal object[] GetKeyValues(int record) { object[] array = new object[_columns.Length]; for (int i = 0; i < _columns.Length; i++) { array[i] = _columns[i][record]; } return array; } internal Index GetSortIndex() { return GetSortIndex(DataViewRowState.CurrentRows); } internal Index GetSortIndex(DataViewRowState recordStates) { IndexField[] indexDesc = GetIndexDesc(); return _columns[0].Table.GetIndex(indexDesc, recordStates, null); } internal bool RecordsEqual(int record1, int record2) { for (int i = 0; i < _columns.Length; i++) { if (_columns[i].Compare(record1, record2) != 0) { return false; } } return true; } internal DataColumn[] ToArray() { DataColumn[] array = new DataColumn[_columns.Length]; for (int i = 0; i < _columns.Length; i++) { array[i] = _columns[i]; } return array; } } [DefaultProperty("RelationName")] [TypeConverter(typeof(RelationshipConverter))] public class DataRelation { private DataSet _dataSet; internal PropertyCollection _extendedProperties; internal string _relationName = string.Empty; private DataKey _childKey; private DataKey _parentKey; private UniqueConstraint _parentKeyConstraint; private ForeignKeyConstraint _childKeyConstraint; internal string[] _parentColumnNames; internal string[] _childColumnNames; internal string _parentTableName; internal string _childTableName; internal string _parentTableNamespace; internal string _childTableNamespace; internal bool _nested; internal bool _createConstraints; private bool _checkMultipleNested = true; private static int s_objectTypeCount; private readonly int _objectID = Interlocked.Increment(ref s_objectTypeCount); public virtual DataColumn[] ChildColumns { get { CheckStateForProperty(); return _childKey.ToArray(); } } internal DataColumn[] ChildColumnsReference { get { CheckStateForProperty(); return _childKey.ColumnsReference; } } internal DataKey ChildKey { get { CheckStateForProperty(); return _childKey; } } public virtual DataTable ChildTable { get { CheckStateForProperty(); return _childKey.Table; } } [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public virtual DataSet DataSet { get { CheckStateForProperty(); return _dataSet; } } internal string[] ParentColumnNames => _parentKey.GetColumnNames(); internal string[] ChildColumnNames => _childKey.GetColumnNames(); public virtual DataColumn[] ParentColumns { get { CheckStateForProperty(); return _parentKey.ToArray(); } } internal DataColumn[] ParentColumnsReference => _parentKey.ColumnsReference; internal DataKey ParentKey { get { CheckStateForProperty(); return _parentKey; } } public virtual DataTable ParentTable { get { CheckStateForProperty(); return _parentKey.Table; } } [DefaultValue("")] public virtual string RelationName { get { CheckStateForProperty(); return _relationName; } set { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, '{1}'", ObjectID, value); try { if (value == null) { value = string.Empty; } CultureInfo culture = ((_dataSet != null) ? _dataSet.Locale : CultureInfo.CurrentCulture); if (string.Compare(_relationName, value, ignoreCase: true, culture) != 0) { if (_dataSet != null) { if (value.Length == 0) { throw ExceptionBuilder.NoRelationName(); } _dataSet.Relations.RegisterName(value); if (_relationName.Length != 0) { _dataSet.Relations.UnregisterName(_relationName); } } _relationName = value; ((DataRelationCollection.DataTableRelationCollection)ParentTable.ChildRelations).OnRelationPropertyChanged(new CollectionChangeEventArgs(CollectionChangeAction.Refresh, this)); ((DataRelationCollection.DataTableRelationCollection)ChildTable.ParentRelations).OnRelationPropertyChanged(new CollectionChangeEventArgs(CollectionChangeAction.Refresh, this)); } else if (string.Compare(_relationName, value, ignoreCase: false, culture) != 0) { _relationName = value; ((DataRelationCollection.DataTableRelationCollection)ParentTable.ChildRelations).OnRelationPropertyChanged(new CollectionChangeEventArgs(CollectionChangeAction.Refresh, this)); ((DataRelationCollection.DataTableRelationCollection)ChildTable.ParentRelations).OnRelationPropertyChanged(new CollectionChangeEventArgs(CollectionChangeAction.Refresh, this)); } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } } [DefaultValue(false)] public virtual bool Nested { get { CheckStateForProperty(); return _nested; } set { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, {1}", ObjectID, value); try { if (_nested == value) { return; } if (_dataSet != null && value) { if (ChildTable.IsNamespaceInherited()) { CheckNamespaceValidityForNestedRelations(ParentTable.Namespace); } ChildTable.Constraints.FindForeignKeyConstraint(ChildKey.ColumnsReference, ParentKey.ColumnsReference)?.CheckConstraint(); ValidateMultipleNestedRelations(); } if (!value && _parentKey.ColumnsReference[0].ColumnMapping == MappingType.Hidden) { throw ExceptionBuilder.RelationNestedReadOnly(); } if (value) { ParentTable.Columns.RegisterColumnName(ChildTable.TableName, null); } else { ParentTable.Columns.UnregisterName(ChildTable.TableName); } RaisePropertyChanging("Nested"); if (value) { CheckNestedRelations(); if (DataSet != null) { if (ParentTable == ChildTable) { foreach (DataRow row in ChildTable.Rows) { row.CheckForLoops(this); } if (ChildTable.DataSet != null && string.Compare(ChildTable.TableName, ChildTable.DataSet.DataSetName, ignoreCase: true, ChildTable.DataSet.Locale) == 0) { throw ExceptionBuilder.DatasetConflictingName(_dataSet.DataSetName); } ChildTable._fNestedInDataset = false; } else { foreach (DataRow row2 in ChildTable.Rows) { row2.GetParentRow(this); } } } ParentTable.ElementColumnCount++; } else { ParentTable.ElementColumnCount--; } _nested = value; ChildTable.CacheNestedParent(); if (!value || !string.IsNullOrEmpty(ChildTable.Namespace) || (ChildTable.NestedParentsCount <= 1 && (ChildTable.NestedParentsCount <= 0 || ChildTable.DataSet.Relations.Contains(RelationName)))) { return; } string text = null; foreach (DataRelation parentRelation in ChildTable.ParentRelations) { if (parentRelation.Nested) { if (text == null) { text = parentRelation.ParentTable.Namespace; } else if (string.Compare(text, parentRelation.ParentTable.Namespace, StringComparison.Ordinal) != 0) { _nested = false; throw ExceptionBuilder.InvalidParentNamespaceinNestedRelation(ChildTable.TableName); } } } if (CheckMultipleNested && ChildTable._tableNamespace != null && ChildTable._tableNamespace.Length == 0) { throw ExceptionBuilder.TableCantBeNestedInTwoTables(ChildTable.TableName); } ChildTable._tableNamespace = null; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } } public virtual UniqueConstraint ParentKeyConstraint { get { CheckStateForProperty(); return _parentKeyConstraint; } } public virtual ForeignKeyConstraint ChildKeyConstraint { get { CheckStateForProperty(); return _childKeyConstraint; } } [Browsable(false)] public PropertyCollection ExtendedProperties => _extendedProperties ?? (_extendedProperties = new PropertyCollection()); internal bool CheckMultipleNested { get { return _checkMultipleNested; } set { _checkMultipleNested = value; } } internal int ObjectID => _objectID; internal event PropertyChangedEventHandler PropertyChanging; public DataRelation(string relationName, DataColumn parentColumn, DataColumn childColumn) : this(relationName, parentColumn, childColumn, createConstraints: true) { } public DataRelation(string relationName, DataColumn parentColumn, DataColumn childColumn, bool createConstraints) { DataCommonEventSource.Log.Trace(" {0}, relationName='{1}', parentColumn={2}, childColumn={3}, createConstraints={4}", ObjectID, relationName, parentColumn?.ObjectID ?? 0, childColumn?.ObjectID ?? 0, createConstraints); Create(relationName, new DataColumn[1] { parentColumn }, new DataColumn[1] { childColumn }, createConstraints); } public DataRelation(string relationName, DataColumn[] parentColumns, DataColumn[] childColumns) : this(relationName, parentColumns, childColumns, createConstraints: true) { } public DataRelation(string relationName, DataColumn[] parentColumns, DataColumn[] childColumns, bool createConstraints) { Create(relationName, parentColumns, childColumns, createConstraints); } [Browsable(false)] public DataRelation(string relationName, string parentTableName, string childTableName, string[] parentColumnNames, string[] childColumnNames, bool nested) { _relationName = relationName; _parentColumnNames = parentColumnNames; _childColumnNames = childColumnNames; _parentTableName = parentTableName; _childTableName = childTableName; _nested = nested; } [Browsable(false)] public DataRelation(string relationName, string parentTableName, string parentTableNamespace, string childTableName, string childTableNamespace, string[] parentColumnNames, string[] childColumnNames, bool nested) { _relationName = relationName; _parentColumnNames = parentColumnNames; _childColumnNames = childColumnNames; _parentTableName = parentTableName; _childTableName = childTableName; _parentTableNamespace = parentTableNamespace; _childTableNamespace = childTableNamespace; _nested = nested; } private static bool IsKeyNull(object[] values) { for (int i = 0; i < values.Length; i++) { if (!DataStorage.IsObjectNull(values[i])) { return false; } } return true; } internal static DataRow[] GetChildRows(DataKey parentKey, DataKey childKey, DataRow parentRow, DataRowVersion version) { object[] keyValues = parentRow.GetKeyValues(parentKey, version); if (IsKeyNull(keyValues)) { return childKey.Table.NewRowArray(0); } return childKey.GetSortIndex((version == DataRowVersion.Original) ? DataViewRowState.OriginalRows : DataViewRowState.CurrentRows).GetRows(keyValues); } internal static DataRow[] GetParentRows(DataKey parentKey, DataKey childKey, DataRow childRow, DataRowVersion version) { object[] keyValues = childRow.GetKeyValues(childKey, version); if (IsKeyNull(keyValues)) { return parentKey.Table.NewRowArray(0); } return parentKey.GetSortIndex((version == DataRowVersion.Original) ? DataViewRowState.OriginalRows : DataViewRowState.CurrentRows).GetRows(keyValues); } internal static DataRow GetParentRow(DataKey parentKey, DataKey childKey, DataRow childRow, DataRowVersion version) { if (!childRow.HasVersion((version == DataRowVersion.Original) ? DataRowVersion.Original : DataRowVersion.Current) && childRow._tempRecord == -1) { return null; } object[] keyValues = childRow.GetKeyValues(childKey, version); if (IsKeyNull(keyValues)) { return null; } Index sortIndex = parentKey.GetSortIndex((version == DataRowVersion.Original) ? DataViewRowState.OriginalRows : DataViewRowState.CurrentRows); Range range = sortIndex.FindRecords(keyValues); if (range.IsNull) { return null; } if (range.Count > 1) { throw ExceptionBuilder.MultipleParents(); } return parentKey.Table._recordManager[sortIndex.GetRecord(range.Min)]; } internal void SetDataSet(DataSet dataSet) { if (_dataSet != dataSet) { _dataSet = dataSet; } } internal void SetParentRowRecords(DataRow childRow, DataRow parentRow) { object[] keyValues = parentRow.GetKeyValues(ParentKey); if (childRow._tempRecord != -1) { ChildTable._recordManager.SetKeyValues(childRow._tempRecord, ChildKey, keyValues); } if (childRow._newRecord != -1) { ChildTable._recordManager.SetKeyValues(childRow._newRecord, ChildKey, keyValues); } if (childRow._oldRecord != -1) { ChildTable._recordManager.SetKeyValues(childRow._oldRecord, ChildKey, keyValues); } } internal void CheckNamespaceValidityForNestedRelations(string ns) { foreach (DataRelation parentRelation in ChildTable.ParentRelations) { if ((parentRelation == this || parentRelation.Nested) && parentRelation.ParentTable.Namespace != ns) { throw ExceptionBuilder.InValidNestedRelation(ChildTable.TableName); } } } internal void CheckNestedRelations() { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _ = ParentTable; if (ChildTable == ParentTable) { if (string.Compare(ChildTable.TableName, ChildTable.DataSet.DataSetName, ignoreCase: true, ChildTable.DataSet.Locale) == 0) { throw ExceptionBuilder.SelfnestedDatasetConflictingName(ChildTable.TableName); } return; } List list = new List(); list.Add(ChildTable); for (int i = 0; i < list.Count; i++) { DataRelation[] nestedParentRelations = list[i].NestedParentRelations; foreach (DataRelation dataRelation in nestedParentRelations) { if (dataRelation.ParentTable == ChildTable && dataRelation.ChildTable != ChildTable) { throw ExceptionBuilder.LoopInNestedRelations(ChildTable.TableName); } if (!list.Contains(dataRelation.ParentTable)) { list.Add(dataRelation.ParentTable); } } } } internal void SetParentKeyConstraint(UniqueConstraint value) { _parentKeyConstraint = value; } internal void SetChildKeyConstraint(ForeignKeyConstraint value) { _childKeyConstraint = value; } internal void CheckState() { if (_dataSet != null) { return; } _parentKey.CheckState(); _childKey.CheckState(); if (_parentKey.Table.DataSet != _childKey.Table.DataSet) { throw ExceptionBuilder.RelationDataSetMismatch(); } if (_childKey.ColumnsEqual(_parentKey)) { throw ExceptionBuilder.KeyColumnsIdentical(); } for (int i = 0; i < _parentKey.ColumnsReference.Length; i++) { if (_parentKey.ColumnsReference[i].DataType != _childKey.ColumnsReference[i].DataType || (_parentKey.ColumnsReference[i].DataType == typeof(DateTime) && _parentKey.ColumnsReference[i].DateTimeMode != _childKey.ColumnsReference[i].DateTimeMode && (_parentKey.ColumnsReference[i].DateTimeMode & _childKey.ColumnsReference[i].DateTimeMode) != DataSetDateTime.Unspecified)) { throw ExceptionBuilder.ColumnsTypeMismatch(); } } } protected void CheckStateForProperty() { try { CheckState(); } catch (Exception ex) when (ADP.IsCatchableExceptionType(ex)) { throw ExceptionBuilder.BadObjectPropertyAccess(ex.Message); } } private void Create(string relationName, DataColumn[] parentColumns, DataColumn[] childColumns, bool createConstraints) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, relationName='{1}', createConstraints={2}", ObjectID, relationName, createConstraints); try { _parentKey = new DataKey(parentColumns, copyColumns: true); _childKey = new DataKey(childColumns, copyColumns: true); if (parentColumns.Length != childColumns.Length) { throw ExceptionBuilder.KeyLengthMismatch(); } for (int i = 0; i < parentColumns.Length; i++) { if (parentColumns[i].Table.DataSet == null || childColumns[i].Table.DataSet == null) { throw ExceptionBuilder.ParentOrChildColumnsDoNotHaveDataSet(); } } CheckState(); _relationName = ((relationName == null) ? "" : relationName); _createConstraints = createConstraints; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } internal DataRelation Clone(DataSet destination) { DataCommonEventSource.Log.Trace(" {0}, destination={1}", ObjectID, destination?.ObjectID ?? 0); DataTable dataTable = destination.Tables[ParentTable.TableName, ParentTable.Namespace]; DataTable dataTable2 = destination.Tables[ChildTable.TableName, ChildTable.Namespace]; int num = _parentKey.ColumnsReference.Length; DataColumn[] array = new DataColumn[num]; DataColumn[] array2 = new DataColumn[num]; for (int i = 0; i < num; i++) { array[i] = dataTable.Columns[ParentKey.ColumnsReference[i].ColumnName]; array2[i] = dataTable2.Columns[ChildKey.ColumnsReference[i].ColumnName]; } DataRelation dataRelation = new DataRelation(_relationName, array, array2, createConstraints: false); dataRelation.CheckMultipleNested = false; dataRelation.Nested = Nested; dataRelation.CheckMultipleNested = true; if (_extendedProperties != null) { foreach (object key in _extendedProperties.Keys) { dataRelation.ExtendedProperties[key] = _extendedProperties[key]; } } return dataRelation; } protected internal void OnPropertyChanging(PropertyChangedEventArgs pcevent) { if (this.PropertyChanging != null) { DataCommonEventSource.Log.Trace(" {0}", ObjectID); this.PropertyChanging(this, pcevent); } } protected internal void RaisePropertyChanging(string name) { OnPropertyChanging(new PropertyChangedEventArgs(name)); } public override string ToString() { return RelationName; } internal void ValidateMultipleNestedRelations() { if (!Nested || !CheckMultipleNested || ChildTable.NestedParentRelations.Length == 0) { return; } DataColumn[] childColumns = ChildColumns; if (childColumns.Length != 1 || !IsAutoGenerated(childColumns[0])) { throw ExceptionBuilder.TableCantBeNestedInTwoTables(ChildTable.TableName); } if (!XmlTreeGen.AutoGenerated(this)) { throw ExceptionBuilder.TableCantBeNestedInTwoTables(ChildTable.TableName); } foreach (Constraint constraint in ChildTable.Constraints) { if (constraint is ForeignKeyConstraint) { if (!XmlTreeGen.AutoGenerated((ForeignKeyConstraint)constraint, checkRelation: true)) { throw ExceptionBuilder.TableCantBeNestedInTwoTables(ChildTable.TableName); } } else if (!XmlTreeGen.AutoGenerated((UniqueConstraint)constraint)) { throw ExceptionBuilder.TableCantBeNestedInTwoTables(ChildTable.TableName); } } } private bool IsAutoGenerated(DataColumn col) { if (col.ColumnMapping != MappingType.Hidden) { return false; } if (col.DataType != typeof(int)) { return false; } string text = col.Table.TableName + "_Id"; if (col.ColumnName == text || col.ColumnName == text + "_0") { return true; } text = ParentColumnsReference[0].Table.TableName + "_Id"; if (col.ColumnName == text || col.ColumnName == text + "_0") { return true; } return false; } } [DefaultEvent("CollectionChanged")] [DefaultProperty("Table")] public abstract class DataRelationCollection : InternalDataCollectionBase { internal sealed class DataTableRelationCollection : DataRelationCollection { private readonly DataTable _table; private readonly ArrayList _relations; private readonly bool _fParentCollection; protected override ArrayList List => _relations; public override DataRelation this[int index] { get { if (index >= 0 && index < _relations.Count) { return (DataRelation)_relations[index]; } throw ExceptionBuilder.RelationOutOfRange(index); } } public override DataRelation this[string name] { get { int num = InternalIndexOf(name); if (num == -2) { throw ExceptionBuilder.CaseInsensitiveNameConflict(name); } if (num >= 0) { return (DataRelation)List[num]; } return null; } } internal event CollectionChangeEventHandler RelationPropertyChanged; internal DataTableRelationCollection(DataTable table, bool fParentCollection) { if (table == null) { throw ExceptionBuilder.RelationTableNull(); } _table = table; _fParentCollection = fParentCollection; _relations = new ArrayList(); } private void EnsureDataSet() { if (_table.DataSet == null) { throw ExceptionBuilder.RelationTableWasRemoved(); } } protected override DataSet GetDataSet() { EnsureDataSet(); return _table.DataSet; } internal void OnRelationPropertyChanged(CollectionChangeEventArgs ccevent) { if (!_fParentCollection) { _table.UpdatePropertyDescriptorCollectionCache(); } this.RelationPropertyChanged?.Invoke(this, ccevent); } private void AddCache(DataRelation relation) { _relations.Add(relation); if (!_fParentCollection) { _table.UpdatePropertyDescriptorCollectionCache(); } } protected override void AddCore(DataRelation relation) { if (_fParentCollection) { if (relation.ChildTable != _table) { throw ExceptionBuilder.ChildTableMismatch(); } } else if (relation.ParentTable != _table) { throw ExceptionBuilder.ParentTableMismatch(); } GetDataSet().Relations.Add(relation); AddCache(relation); } public override bool CanRemove(DataRelation relation) { if (!base.CanRemove(relation)) { return false; } if (_fParentCollection) { if (relation.ChildTable != _table) { return false; } } else if (relation.ParentTable != _table) { return false; } return true; } private void RemoveCache(DataRelation relation) { for (int i = 0; i < _relations.Count; i++) { if (relation == _relations[i]) { _relations.RemoveAt(i); if (!_fParentCollection) { _table.UpdatePropertyDescriptorCollectionCache(); } return; } } throw ExceptionBuilder.RelationDoesNotExist(); } protected override void RemoveCore(DataRelation relation) { if (_fParentCollection) { if (relation.ChildTable != _table) { throw ExceptionBuilder.ChildTableMismatch(); } } else if (relation.ParentTable != _table) { throw ExceptionBuilder.ParentTableMismatch(); } GetDataSet().Relations.Remove(relation); RemoveCache(relation); } } internal sealed class DataSetRelationCollection : DataRelationCollection { private readonly DataSet _dataSet; private readonly ArrayList _relations; private DataRelation[] _delayLoadingRelations; protected override ArrayList List => _relations; public override DataRelation this[int index] { get { if (index >= 0 && index < _relations.Count) { return (DataRelation)_relations[index]; } throw ExceptionBuilder.RelationOutOfRange(index); } } public override DataRelation this[string name] { get { int num = InternalIndexOf(name); if (num == -2) { throw ExceptionBuilder.CaseInsensitiveNameConflict(name); } if (num >= 0) { return (DataRelation)List[num]; } return null; } } internal DataSetRelationCollection(DataSet dataSet) { if (dataSet == null) { throw ExceptionBuilder.RelationDataSetNull(); } _dataSet = dataSet; _relations = new ArrayList(); } public override void AddRange(DataRelation[] relations) { if (_dataSet._fInitInProgress) { _delayLoadingRelations = relations; } else { if (relations == null) { return; } foreach (DataRelation dataRelation in relations) { if (dataRelation != null) { Add(dataRelation); } } } } public override void Clear() { base.Clear(); if (_dataSet._fInitInProgress && _delayLoadingRelations != null) { _delayLoadingRelations = null; } } protected override DataSet GetDataSet() { return _dataSet; } protected override void AddCore(DataRelation relation) { base.AddCore(relation); if (relation.ChildTable.DataSet != _dataSet || relation.ParentTable.DataSet != _dataSet) { throw ExceptionBuilder.ForeignRelation(); } relation.CheckState(); if (relation.Nested) { relation.CheckNestedRelations(); } if (relation._relationName.Length == 0) { relation._relationName = AssignName(); } else { RegisterName(relation._relationName); } DataKey childKey = relation.ChildKey; for (int i = 0; i < _relations.Count; i++) { if (childKey.ColumnsEqual(((DataRelation)_relations[i]).ChildKey) && relation.ParentKey.ColumnsEqual(((DataRelation)_relations[i]).ParentKey)) { throw ExceptionBuilder.RelationAlreadyExists(); } } _relations.Add(relation); ((DataTableRelationCollection)relation.ParentTable.ChildRelations).Add(relation); ((DataTableRelationCollection)relation.ChildTable.ParentRelations).Add(relation); relation.SetDataSet(_dataSet); relation.ChildKey.GetSortIndex().AddRef(); if (relation.Nested) { relation.ChildTable.CacheNestedParent(); } ForeignKeyConstraint foreignKeyConstraint = relation.ChildTable.Constraints.FindForeignKeyConstraint(relation.ParentColumnsReference, relation.ChildColumnsReference); if (relation._createConstraints && foreignKeyConstraint == null) { relation.ChildTable.Constraints.Add(foreignKeyConstraint = new ForeignKeyConstraint(relation.ParentColumnsReference, relation.ChildColumnsReference)); try { foreignKeyConstraint.ConstraintName = relation.RelationName; } catch (Exception e) when (ADP.IsCatchableExceptionType(e)) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); } } UniqueConstraint parentKeyConstraint = relation.ParentTable.Constraints.FindKeyConstraint(relation.ParentColumnsReference); relation.SetParentKeyConstraint(parentKeyConstraint); relation.SetChildKeyConstraint(foreignKeyConstraint); } protected override void RemoveCore(DataRelation relation) { base.RemoveCore(relation); _dataSet.OnRemoveRelationHack(relation); relation.SetDataSet(null); relation.ChildKey.GetSortIndex().RemoveRef(); if (relation.Nested) { relation.ChildTable.CacheNestedParent(); } for (int i = 0; i < _relations.Count; i++) { if (relation == _relations[i]) { _relations.RemoveAt(i); ((DataTableRelationCollection)relation.ParentTable.ChildRelations).Remove(relation); ((DataTableRelationCollection)relation.ChildTable.ParentRelations).Remove(relation); if (relation.Nested) { relation.ChildTable.CacheNestedParent(); } UnregisterName(relation.RelationName); relation.SetParentKeyConstraint(null); relation.SetChildKeyConstraint(null); return; } } throw ExceptionBuilder.RelationDoesNotExist(); } internal void FinishInitRelations() { if (_delayLoadingRelations == null) { return; } for (int i = 0; i < _delayLoadingRelations.Length; i++) { DataRelation dataRelation = _delayLoadingRelations[i]; if (dataRelation._parentColumnNames == null || dataRelation._childColumnNames == null) { Add(dataRelation); continue; } int num = dataRelation._parentColumnNames.Length; DataColumn[] array = new DataColumn[num]; DataColumn[] array2 = new DataColumn[num]; for (int j = 0; j < num; j++) { if (dataRelation._parentTableNamespace == null) { array[j] = _dataSet.Tables[dataRelation._parentTableName].Columns[dataRelation._parentColumnNames[j]]; } else { array[j] = _dataSet.Tables[dataRelation._parentTableName, dataRelation._parentTableNamespace].Columns[dataRelation._parentColumnNames[j]]; } if (dataRelation._childTableNamespace == null) { array2[j] = _dataSet.Tables[dataRelation._childTableName].Columns[dataRelation._childColumnNames[j]]; } else { array2[j] = _dataSet.Tables[dataRelation._childTableName, dataRelation._childTableNamespace].Columns[dataRelation._childColumnNames[j]]; } } DataRelation dataRelation2 = new DataRelation(dataRelation._relationName, array, array2, createConstraints: false); dataRelation2.Nested = dataRelation._nested; Add(dataRelation2); } _delayLoadingRelations = null; } } private DataRelation _inTransition; private int _defaultNameIndex = 1; private CollectionChangeEventHandler _onCollectionChangedDelegate; private CollectionChangeEventHandler _onCollectionChangingDelegate; private static int s_objectTypeCount; private readonly int _objectID = Interlocked.Increment(ref s_objectTypeCount); internal int ObjectID => _objectID; public abstract DataRelation this[int index] { get; } public abstract DataRelation this[string name] { get; } public event CollectionChangeEventHandler CollectionChanged { add { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onCollectionChangedDelegate = (CollectionChangeEventHandler)Delegate.Combine(_onCollectionChangedDelegate, value); } remove { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onCollectionChangedDelegate = (CollectionChangeEventHandler)Delegate.Remove(_onCollectionChangedDelegate, value); } } internal event CollectionChangeEventHandler CollectionChanging { add { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onCollectionChangingDelegate = (CollectionChangeEventHandler)Delegate.Combine(_onCollectionChangingDelegate, value); } remove { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onCollectionChangingDelegate = (CollectionChangeEventHandler)Delegate.Remove(_onCollectionChangingDelegate, value); } } public void Add(DataRelation relation) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, relation={1}", ObjectID, relation?.ObjectID ?? 0); try { if (_inTransition == relation) { return; } _inTransition = relation; try { OnCollectionChanging(new CollectionChangeEventArgs(CollectionChangeAction.Add, relation)); AddCore(relation); OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Add, relation)); } finally { _inTransition = null; } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public virtual void AddRange(DataRelation[] relations) { if (relations == null) { return; } foreach (DataRelation dataRelation in relations) { if (dataRelation != null) { Add(dataRelation); } } } public virtual DataRelation Add(string name, DataColumn[] parentColumns, DataColumn[] childColumns) { DataRelation dataRelation = new DataRelation(name, parentColumns, childColumns); Add(dataRelation); return dataRelation; } public virtual DataRelation Add(string name, DataColumn[] parentColumns, DataColumn[] childColumns, bool createConstraints) { DataRelation dataRelation = new DataRelation(name, parentColumns, childColumns, createConstraints); Add(dataRelation); return dataRelation; } public virtual DataRelation Add(DataColumn[] parentColumns, DataColumn[] childColumns) { DataRelation dataRelation = new DataRelation(null, parentColumns, childColumns); Add(dataRelation); return dataRelation; } public virtual DataRelation Add(string name, DataColumn parentColumn, DataColumn childColumn) { DataRelation dataRelation = new DataRelation(name, parentColumn, childColumn); Add(dataRelation); return dataRelation; } public virtual DataRelation Add(string name, DataColumn parentColumn, DataColumn childColumn, bool createConstraints) { DataRelation dataRelation = new DataRelation(name, parentColumn, childColumn, createConstraints); Add(dataRelation); return dataRelation; } public virtual DataRelation Add(DataColumn parentColumn, DataColumn childColumn) { DataRelation dataRelation = new DataRelation(null, parentColumn, childColumn); Add(dataRelation); return dataRelation; } protected virtual void AddCore(DataRelation relation) { DataCommonEventSource.Log.Trace(" {0}, relation={1}", ObjectID, relation?.ObjectID ?? 0); if (relation == null) { throw ExceptionBuilder.ArgumentNull("relation"); } relation.CheckState(); DataSet dataSet = GetDataSet(); if (relation.DataSet == dataSet) { throw ExceptionBuilder.RelationAlreadyInTheDataSet(); } if (relation.DataSet != null) { throw ExceptionBuilder.RelationAlreadyInOtherDataSet(); } if (relation.ChildTable.Locale.LCID != relation.ParentTable.Locale.LCID || relation.ChildTable.CaseSensitive != relation.ParentTable.CaseSensitive) { throw ExceptionBuilder.CaseLocaleMismatch(); } if (relation.Nested) { relation.CheckNamespaceValidityForNestedRelations(relation.ParentTable.Namespace); relation.ValidateMultipleNestedRelations(); relation.ParentTable.ElementColumnCount++; } } internal string AssignName() { string result = MakeName(_defaultNameIndex); _defaultNameIndex++; return result; } public virtual void Clear() { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { int count = Count; OnCollectionChanging(InternalDataCollectionBase.s_refreshEventArgs); for (int num = count - 1; num >= 0; num--) { _inTransition = this[num]; RemoveCore(_inTransition); } OnCollectionChanged(InternalDataCollectionBase.s_refreshEventArgs); _inTransition = null; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public virtual bool Contains(string name) { return InternalIndexOf(name) >= 0; } public void CopyTo(DataRelation[] array, int index) { if (array == null) { throw ExceptionBuilder.ArgumentNull("array"); } if (index < 0) { throw ExceptionBuilder.ArgumentOutOfRange("index"); } ArrayList list = List; if (array.Length - index < list.Count) { throw ExceptionBuilder.InvalidOffsetLength(); } for (int i = 0; i < list.Count; i++) { array[index + i] = (DataRelation)list[i]; } } public virtual int IndexOf(DataRelation relation) { int count = List.Count; for (int i = 0; i < count; i++) { if (relation == (DataRelation)List[i]) { return i; } } return -1; } public virtual int IndexOf(string relationName) { int num = InternalIndexOf(relationName); if (num >= 0) { return num; } return -1; } internal int InternalIndexOf(string name) { int num = -1; if (name != null && 0 < name.Length) { int count = List.Count; int num2 = 0; for (int i = 0; i < count; i++) { DataRelation dataRelation = (DataRelation)List[i]; switch (NamesEqual(dataRelation.RelationName, name, fCaseSensitive: false, GetDataSet().Locale)) { case 1: return i; case -1: num = ((num == -1) ? i : (-2)); break; } } } return num; } protected abstract DataSet GetDataSet(); private string MakeName(int index) { if (index != 1) { return "Relation" + index.ToString(CultureInfo.InvariantCulture); } return "Relation1"; } protected virtual void OnCollectionChanged(CollectionChangeEventArgs ccevent) { if (_onCollectionChangedDelegate != null) { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onCollectionChangedDelegate(this, ccevent); } } protected virtual void OnCollectionChanging(CollectionChangeEventArgs ccevent) { if (_onCollectionChangingDelegate != null) { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onCollectionChangingDelegate(this, ccevent); } } internal void RegisterName(string name) { DataCommonEventSource.Log.Trace(" {0}, name='{1}'", ObjectID, name); CultureInfo locale = GetDataSet().Locale; int count = Count; for (int i = 0; i < count; i++) { if (NamesEqual(name, this[i].RelationName, fCaseSensitive: true, locale) != 0) { throw ExceptionBuilder.DuplicateRelation(this[i].RelationName); } } if (NamesEqual(name, MakeName(_defaultNameIndex), fCaseSensitive: true, locale) != 0) { _defaultNameIndex++; } } public virtual bool CanRemove(DataRelation relation) { if (relation != null) { return relation.DataSet == GetDataSet(); } return false; } public void Remove(DataRelation relation) { DataCommonEventSource.Log.Trace(" {0}, relation={1}", ObjectID, relation?.ObjectID ?? 0); if (_inTransition == relation) { return; } _inTransition = relation; try { OnCollectionChanging(new CollectionChangeEventArgs(CollectionChangeAction.Remove, relation)); RemoveCore(relation); OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Remove, relation)); } finally { _inTransition = null; } } public void RemoveAt(int index) { DataRelation dataRelation = this[index]; if (dataRelation == null) { throw ExceptionBuilder.RelationOutOfRange(index); } Remove(dataRelation); } public void Remove(string name) { DataRelation dataRelation = this[name]; if (dataRelation == null) { throw ExceptionBuilder.RelationNotInTheDataSet(name); } Remove(dataRelation); } protected virtual void RemoveCore(DataRelation relation) { DataCommonEventSource.Log.Trace(" {0}, relation={1}", ObjectID, relation?.ObjectID ?? 0); if (relation == null) { throw ExceptionBuilder.ArgumentNull("relation"); } DataSet dataSet = GetDataSet(); if (relation.DataSet != dataSet) { throw ExceptionBuilder.RelationNotInTheDataSet(relation.RelationName); } if (relation.Nested) { relation.ParentTable.ElementColumnCount--; relation.ParentTable.Columns.UnregisterName(relation.ChildTable.TableName); } } internal void UnregisterName(string name) { DataCommonEventSource.Log.Trace(" {0}, name='{1}'", ObjectID, name); if (NamesEqual(name, MakeName(_defaultNameIndex - 1), fCaseSensitive: true, GetDataSet().Locale) != 0) { do { _defaultNameIndex--; } while (_defaultNameIndex > 1 && !Contains(MakeName(_defaultNameIndex - 1))); } } } internal sealed class DataRelationPropertyDescriptor : PropertyDescriptor { internal DataRelation Relation { get; } public override Type ComponentType => typeof(DataRowView); public override bool IsReadOnly => false; public override Type PropertyType => typeof(IBindingList); internal DataRelationPropertyDescriptor(DataRelation dataRelation) : base(dataRelation.RelationName, null) { Relation = dataRelation; } public override bool Equals(object other) { if (other is DataRelationPropertyDescriptor) { return ((DataRelationPropertyDescriptor)other).Relation == Relation; } return false; } public override int GetHashCode() { return Relation.GetHashCode(); } public override bool CanResetValue(object component) { return false; } public override object GetValue(object component) { return ((DataRowView)component).CreateChildView(Relation); } public override void ResetValue(object component) { } public override void SetValue(object component, object value) { } public override bool ShouldSerializeValue(object component) { return false; } } public class DataRow { private readonly DataTable _table; private readonly DataColumnCollection _columns; internal int _oldRecord = -1; internal int _newRecord = -1; internal int _tempRecord; internal long _rowID = -1L; internal DataRowAction _action; internal bool _inChangingEvent; internal bool _inDeletingEvent; internal bool _inCascade; private DataColumn _lastChangedColumn; private int _countColumnChange; private DataError _error; private object _element; private int _rbTreeNodeId; private static int s_objectTypeCount; internal readonly int _objectID = Interlocked.Increment(ref s_objectTypeCount); internal XmlBoundElement Element { get { return (XmlBoundElement)_element; } set { _element = value; } } internal DataColumn LastChangedColumn { get { if (_countColumnChange == 1) { return _lastChangedColumn; } return null; } set { _countColumnChange++; _lastChangedColumn = value; } } internal bool HasPropertyChanged => 0 < _countColumnChange; internal int RBTreeNodeId { get { return _rbTreeNodeId; } set { DataCommonEventSource.Log.Trace(" {0}, value={1}", _objectID, value); _rbTreeNodeId = value; } } public string RowError { get { if (_error != null) { return _error.Text; } return string.Empty; } set { DataCommonEventSource.Log.Trace(" {0}, value='{1}'", _objectID, value); if (_error == null) { if (!string.IsNullOrEmpty(value)) { _error = new DataError(value); } RowErrorChanged(); } else if (_error.Text != value) { _error.Text = value; RowErrorChanged(); } } } internal long rowID { get { return _rowID; } set { ResetLastChangedColumn(); _rowID = value; } } public DataRowState RowState { get { if (_oldRecord == _newRecord) { if (_oldRecord == -1) { return DataRowState.Detached; } if (0 < _columns.ColumnsImplementingIChangeTrackingCount) { DataColumn[] columnsImplementingIChangeTracking = _columns.ColumnsImplementingIChangeTracking; foreach (DataColumn column in columnsImplementingIChangeTracking) { object obj = this[column]; if (DBNull.Value != obj && ((IChangeTracking)obj).IsChanged) { return DataRowState.Modified; } } } return DataRowState.Unchanged; } if (_oldRecord == -1) { return DataRowState.Added; } if (_newRecord == -1) { return DataRowState.Deleted; } return DataRowState.Modified; } } public DataTable Table => _table; public object this[int columnIndex] { get { DataColumn dataColumn = _columns[columnIndex]; int defaultRecord = GetDefaultRecord(); return dataColumn[defaultRecord]; } set { DataColumn column = _columns[columnIndex]; this[column] = value; } } public object this[string columnName] { get { DataColumn dataColumn = GetDataColumn(columnName); int defaultRecord = GetDefaultRecord(); return dataColumn[defaultRecord]; } set { DataColumn dataColumn = GetDataColumn(columnName); this[dataColumn] = value; } } public object this[DataColumn column] { get { CheckColumn(column); int defaultRecord = GetDefaultRecord(); return column[defaultRecord]; } set { CheckColumn(column); if (_inChangingEvent) { throw ExceptionBuilder.EditInRowChanging(); } if (-1 != rowID && column.ReadOnly) { throw ExceptionBuilder.ReadOnly(column.ColumnName); } DataColumnChangeEventArgs dataColumnChangeEventArgs = null; if (_table.NeedColumnChangeEvents) { dataColumnChangeEventArgs = new DataColumnChangeEventArgs(this, column, value); _table.OnColumnChanging(dataColumnChangeEventArgs); } if (column.Table != _table) { throw ExceptionBuilder.ColumnNotInTheTable(column.ColumnName, _table.TableName); } if (-1 != rowID && column.ReadOnly) { throw ExceptionBuilder.ReadOnly(column.ColumnName); } object obj = ((dataColumnChangeEventArgs != null) ? dataColumnChangeEventArgs.ProposedValue : value); if (obj == null) { if (column.IsValueType) { throw ExceptionBuilder.CannotSetToNull(column); } obj = DBNull.Value; } bool flag = BeginEditInternal(); try { int proposedRecordNo = GetProposedRecordNo(); column[proposedRecordNo] = obj; } catch (Exception e) when (ADP.IsCatchableOrSecurityExceptionType(e)) { if (flag) { CancelEdit(); } throw; } LastChangedColumn = column; if (dataColumnChangeEventArgs != null) { _table.OnColumnChanged(dataColumnChangeEventArgs); } if (flag) { EndEdit(); } } } public object this[int columnIndex, DataRowVersion version] { get { DataColumn dataColumn = _columns[columnIndex]; int recordFromVersion = GetRecordFromVersion(version); return dataColumn[recordFromVersion]; } } public object this[string columnName, DataRowVersion version] { get { DataColumn dataColumn = GetDataColumn(columnName); int recordFromVersion = GetRecordFromVersion(version); return dataColumn[recordFromVersion]; } } public object this[DataColumn column, DataRowVersion version] { get { CheckColumn(column); int recordFromVersion = GetRecordFromVersion(version); return column[recordFromVersion]; } } public object[] ItemArray { get { int defaultRecord = GetDefaultRecord(); object[] array = new object[_columns.Count]; for (int i = 0; i < array.Length; i++) { DataColumn dataColumn = _columns[i]; array[i] = dataColumn[defaultRecord]; } return array; } set { if (value == null) { throw ExceptionBuilder.ArgumentNull("ItemArray"); } if (_columns.Count < value.Length) { throw ExceptionBuilder.ValueArrayLength(); } DataColumnChangeEventArgs dataColumnChangeEventArgs = null; if (_table.NeedColumnChangeEvents) { dataColumnChangeEventArgs = new DataColumnChangeEventArgs(this); } bool flag = BeginEditInternal(); for (int i = 0; i < value.Length; i++) { if (value[i] == null) { continue; } DataColumn dataColumn = _columns[i]; if (-1 != rowID && dataColumn.ReadOnly) { throw ExceptionBuilder.ReadOnly(dataColumn.ColumnName); } if (dataColumnChangeEventArgs != null) { dataColumnChangeEventArgs.InitializeColumnChangeEvent(dataColumn, value[i]); _table.OnColumnChanging(dataColumnChangeEventArgs); } if (dataColumn.Table != _table) { throw ExceptionBuilder.ColumnNotInTheTable(dataColumn.ColumnName, _table.TableName); } if (-1 != rowID && dataColumn.ReadOnly) { throw ExceptionBuilder.ReadOnly(dataColumn.ColumnName); } if (_tempRecord == -1) { BeginEditInternal(); } object obj = ((dataColumnChangeEventArgs != null) ? dataColumnChangeEventArgs.ProposedValue : value[i]); if (obj == null) { if (dataColumn.IsValueType) { throw ExceptionBuilder.CannotSetToNull(dataColumn); } obj = DBNull.Value; } try { int proposedRecordNo = GetProposedRecordNo(); dataColumn[proposedRecordNo] = obj; } catch (Exception e) when (ADP.IsCatchableOrSecurityExceptionType(e)) { if (flag) { CancelEdit(); } throw; } LastChangedColumn = dataColumn; if (dataColumnChangeEventArgs != null) { _table.OnColumnChanged(dataColumnChangeEventArgs); } } EndEdit(); } } public bool HasErrors { get { if (_error != null) { return _error.HasErrors; } return false; } } protected internal DataRow(DataRowBuilder builder) { _tempRecord = builder._record; _table = builder._table; _columns = _table.Columns; } private void RowErrorChanged() { if (_oldRecord != -1) { _table.RecordChanged(_oldRecord); } if (_newRecord != -1) { _table.RecordChanged(_newRecord); } } internal void CheckForLoops(DataRelation rel) { if (_table._fInLoadDiffgram || (_table.DataSet != null && _table.DataSet._fInLoadDiffgram)) { return; } int count = _table.Rows.Count; int num = 0; for (DataRow parentRow = GetParentRow(rel); parentRow != null; parentRow = parentRow.GetParentRow(rel)) { if (parentRow == this || num > count) { throw ExceptionBuilder.NestedCircular(_table.TableName); } num++; } } internal int GetNestedParentCount() { int num = 0; DataRelation[] nestedParentRelations = _table.NestedParentRelations; foreach (DataRelation dataRelation in nestedParentRelations) { if (dataRelation != null) { if (dataRelation.ParentTable == _table) { CheckForLoops(dataRelation); } if (GetParentRow(dataRelation) != null) { num++; } } } return num; } public void AcceptChanges() { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", _objectID); try { EndEdit(); if (RowState != DataRowState.Detached && RowState != DataRowState.Deleted && _columns.ColumnsImplementingIChangeTrackingCount > 0) { DataColumn[] columnsImplementingIChangeTracking = _columns.ColumnsImplementingIChangeTracking; foreach (DataColumn column in columnsImplementingIChangeTracking) { object obj = this[column]; if (DBNull.Value != obj) { IChangeTracking changeTracking = (IChangeTracking)obj; if (changeTracking.IsChanged) { changeTracking.AcceptChanges(); } } } } _table.CommitRow(this); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } [EditorBrowsable(EditorBrowsableState.Advanced)] public void BeginEdit() { BeginEditInternal(); } private bool BeginEditInternal() { if (_inChangingEvent) { throw ExceptionBuilder.BeginEditInRowChanging(); } if (_tempRecord != -1) { if (_tempRecord < _table._recordManager.LastFreeRecord) { return false; } _tempRecord = -1; } if (_oldRecord != -1 && _newRecord == -1) { throw ExceptionBuilder.DeletedRowInaccessible(); } ResetLastChangedColumn(); _tempRecord = _table.NewRecord(_newRecord); return true; } [EditorBrowsable(EditorBrowsableState.Advanced)] public void CancelEdit() { if (_inChangingEvent) { throw ExceptionBuilder.CancelEditInRowChanging(); } _table.FreeRecord(ref _tempRecord); ResetLastChangedColumn(); } private void CheckColumn(DataColumn column) { if (column == null) { throw ExceptionBuilder.ArgumentNull("column"); } if (column.Table != _table) { throw ExceptionBuilder.ColumnNotInTheTable(column.ColumnName, _table.TableName); } } internal void CheckInTable() { if (rowID == -1) { throw ExceptionBuilder.RowNotInTheTable(); } } public void Delete() { if (_inDeletingEvent) { throw ExceptionBuilder.DeleteInRowDeleting(); } if (_newRecord != -1) { _table.DeleteRow(this); } } [EditorBrowsable(EditorBrowsableState.Advanced)] public void EndEdit() { if (_inChangingEvent) { throw ExceptionBuilder.EndEditInRowChanging(); } if (_newRecord == -1 || _tempRecord == -1) { return; } try { _table.SetNewRecord(this, _tempRecord, DataRowAction.Change, isInMerge: false, fireEvent: true, suppressEnsurePropertyChanged: true); } finally { ResetLastChangedColumn(); } } public void SetColumnError(int columnIndex, string error) { DataColumn dataColumn = _columns[columnIndex]; if (dataColumn == null) { throw ExceptionBuilder.ColumnOutOfRange(columnIndex); } SetColumnError(dataColumn, error); } public void SetColumnError(string columnName, string error) { DataColumn dataColumn = GetDataColumn(columnName); SetColumnError(dataColumn, error); } public void SetColumnError(DataColumn column, string error) { CheckColumn(column); long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, column={1}, error='{2}'", _objectID, column.ObjectID, error); try { if (_error == null) { _error = new DataError(); } if (GetColumnError(column) != error) { _error.SetColumnError(column, error); RowErrorChanged(); } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public string GetColumnError(int columnIndex) { return GetColumnError(_columns[columnIndex]); } public string GetColumnError(string columnName) { return GetColumnError(GetDataColumn(columnName)); } public string GetColumnError(DataColumn column) { CheckColumn(column); if (_error == null) { _error = new DataError(); } return _error.GetColumnError(column); } public void ClearErrors() { if (_error != null) { _error.Clear(); RowErrorChanged(); } } internal void ClearError(DataColumn column) { if (_error != null) { _error.Clear(column); RowErrorChanged(); } } public DataColumn[] GetColumnsInError() { if (_error != null) { return _error.GetColumnsInError(); } return Array.Empty(); } public DataRow[] GetChildRows(string relationName) { return GetChildRows(_table.ChildRelations[relationName], DataRowVersion.Default); } public DataRow[] GetChildRows(string relationName, DataRowVersion version) { return GetChildRows(_table.ChildRelations[relationName], version); } public DataRow[] GetChildRows(DataRelation relation) { return GetChildRows(relation, DataRowVersion.Default); } public DataRow[] GetChildRows(DataRelation relation, DataRowVersion version) { if (relation == null) { return _table.NewRowArray(0); } if (relation.DataSet != _table.DataSet) { throw ExceptionBuilder.RowNotInTheDataSet(); } if (relation.ParentKey.Table != _table) { throw ExceptionBuilder.RelationForeignTable(relation.ParentTable.TableName, _table.TableName); } return DataRelation.GetChildRows(relation.ParentKey, relation.ChildKey, this, version); } internal DataColumn GetDataColumn(string columnName) { DataColumn dataColumn = _columns[columnName]; if (dataColumn != null) { return dataColumn; } throw ExceptionBuilder.ColumnNotInTheTable(columnName, _table.TableName); } public DataRow GetParentRow(string relationName) { return GetParentRow(_table.ParentRelations[relationName], DataRowVersion.Default); } public DataRow GetParentRow(string relationName, DataRowVersion version) { return GetParentRow(_table.ParentRelations[relationName], version); } public DataRow GetParentRow(DataRelation relation) { return GetParentRow(relation, DataRowVersion.Default); } public DataRow GetParentRow(DataRelation relation, DataRowVersion version) { if (relation == null) { return null; } if (relation.DataSet != _table.DataSet) { throw ExceptionBuilder.RelationForeignRow(); } if (relation.ChildKey.Table != _table) { throw ExceptionBuilder.GetParentRowTableMismatch(relation.ChildTable.TableName, _table.TableName); } return DataRelation.GetParentRow(relation.ParentKey, relation.ChildKey, this, version); } internal DataRow GetNestedParentRow(DataRowVersion version) { DataRelation[] nestedParentRelations = _table.NestedParentRelations; foreach (DataRelation dataRelation in nestedParentRelations) { if (dataRelation != null) { if (dataRelation.ParentTable == _table) { CheckForLoops(dataRelation); } DataRow parentRow = GetParentRow(dataRelation, version); if (parentRow != null) { return parentRow; } } } return null; } public DataRow[] GetParentRows(string relationName) { return GetParentRows(_table.ParentRelations[relationName], DataRowVersion.Default); } public DataRow[] GetParentRows(string relationName, DataRowVersion version) { return GetParentRows(_table.ParentRelations[relationName], version); } public DataRow[] GetParentRows(DataRelation relation) { return GetParentRows(relation, DataRowVersion.Default); } public DataRow[] GetParentRows(DataRelation relation, DataRowVersion version) { if (relation == null) { return _table.NewRowArray(0); } if (relation.DataSet != _table.DataSet) { throw ExceptionBuilder.RowNotInTheDataSet(); } if (relation.ChildKey.Table != _table) { throw ExceptionBuilder.GetParentRowTableMismatch(relation.ChildTable.TableName, _table.TableName); } return DataRelation.GetParentRows(relation.ParentKey, relation.ChildKey, this, version); } internal object[] GetColumnValues(DataColumn[] columns) { return GetColumnValues(columns, DataRowVersion.Default); } internal object[] GetColumnValues(DataColumn[] columns, DataRowVersion version) { DataKey key = new DataKey(columns, copyColumns: false); return GetKeyValues(key, version); } internal object[] GetKeyValues(DataKey key) { int defaultRecord = GetDefaultRecord(); return key.GetKeyValues(defaultRecord); } internal object[] GetKeyValues(DataKey key, DataRowVersion version) { int recordFromVersion = GetRecordFromVersion(version); return key.GetKeyValues(recordFromVersion); } internal int GetCurrentRecordNo() { if (_newRecord == -1) { throw ExceptionBuilder.NoCurrentData(); } return _newRecord; } internal int GetDefaultRecord() { if (_tempRecord != -1) { return _tempRecord; } if (_newRecord != -1) { return _newRecord; } throw (_oldRecord == -1) ? ExceptionBuilder.RowRemovedFromTheTable() : ExceptionBuilder.DeletedRowInaccessible(); } internal int GetOriginalRecordNo() { if (_oldRecord == -1) { throw ExceptionBuilder.NoOriginalData(); } return _oldRecord; } private int GetProposedRecordNo() { if (_tempRecord == -1) { throw ExceptionBuilder.NoProposedData(); } return _tempRecord; } internal int GetRecordFromVersion(DataRowVersion version) { return version switch { DataRowVersion.Original => GetOriginalRecordNo(), DataRowVersion.Current => GetCurrentRecordNo(), DataRowVersion.Proposed => GetProposedRecordNo(), DataRowVersion.Default => GetDefaultRecord(), _ => throw ExceptionBuilder.InvalidRowVersion(), }; } internal DataRowVersion GetDefaultRowVersion(DataViewRowState viewState) { if (_oldRecord == _newRecord) { _ = _oldRecord; _ = -1; return DataRowVersion.Default; } if (_oldRecord == -1) { return DataRowVersion.Default; } if (_newRecord == -1) { return DataRowVersion.Original; } if ((DataViewRowState.ModifiedCurrent & viewState) != 0) { return DataRowVersion.Default; } return DataRowVersion.Original; } internal DataViewRowState GetRecordState(int record) { if (record == -1) { return DataViewRowState.None; } if (record == _oldRecord && record == _newRecord) { return DataViewRowState.Unchanged; } if (record == _oldRecord) { if (_newRecord == -1) { return DataViewRowState.Deleted; } return DataViewRowState.ModifiedOriginal; } if (record == _newRecord) { if (_oldRecord == -1) { return DataViewRowState.Added; } return DataViewRowState.ModifiedCurrent; } return DataViewRowState.None; } internal bool HasKeyChanged(DataKey key) { return HasKeyChanged(key, DataRowVersion.Current, DataRowVersion.Proposed); } internal bool HasKeyChanged(DataKey key, DataRowVersion version1, DataRowVersion version2) { if (!HasVersion(version1) || !HasVersion(version2)) { return true; } return !key.RecordsEqual(GetRecordFromVersion(version1), GetRecordFromVersion(version2)); } public bool HasVersion(DataRowVersion version) { switch (version) { case DataRowVersion.Original: return _oldRecord != -1; case DataRowVersion.Current: return _newRecord != -1; case DataRowVersion.Proposed: return _tempRecord != -1; case DataRowVersion.Default: if (_tempRecord == -1) { return _newRecord != -1; } return true; default: throw ExceptionBuilder.InvalidRowVersion(); } } internal bool HasChanges() { if (!HasVersion(DataRowVersion.Original) || !HasVersion(DataRowVersion.Current)) { return true; } foreach (DataColumn column in Table.Columns) { if (column.Compare(_oldRecord, _newRecord) != 0) { return true; } } return false; } internal bool HaveValuesChanged(DataColumn[] columns) { return HaveValuesChanged(columns, DataRowVersion.Current, DataRowVersion.Proposed); } internal bool HaveValuesChanged(DataColumn[] columns, DataRowVersion version1, DataRowVersion version2) { for (int i = 0; i < columns.Length; i++) { CheckColumn(columns[i]); } DataKey key = new DataKey(columns, copyColumns: false); return HasKeyChanged(key, version1, version2); } public bool IsNull(int columnIndex) { DataColumn dataColumn = _columns[columnIndex]; int defaultRecord = GetDefaultRecord(); return dataColumn.IsNull(defaultRecord); } public bool IsNull(string columnName) { DataColumn dataColumn = GetDataColumn(columnName); int defaultRecord = GetDefaultRecord(); return dataColumn.IsNull(defaultRecord); } public bool IsNull(DataColumn column) { CheckColumn(column); int defaultRecord = GetDefaultRecord(); return column.IsNull(defaultRecord); } public bool IsNull(DataColumn column, DataRowVersion version) { CheckColumn(column); int recordFromVersion = GetRecordFromVersion(version); return column.IsNull(recordFromVersion); } public void RejectChanges() { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", _objectID); try { if (RowState != DataRowState.Detached) { DataColumn[] columnsImplementingIChangeTracking; if (_columns.ColumnsImplementingIChangeTrackingCount != _columns.ColumnsImplementingIRevertibleChangeTrackingCount) { columnsImplementingIChangeTracking = _columns.ColumnsImplementingIChangeTracking; foreach (DataColumn dataColumn in columnsImplementingIChangeTracking) { if (!dataColumn.ImplementsIRevertibleChangeTracking) { object obj = null; obj = ((RowState == DataRowState.Deleted) ? this[dataColumn, DataRowVersion.Original] : this[dataColumn]); if (DBNull.Value != obj && ((IChangeTracking)obj).IsChanged) { throw ExceptionBuilder.UDTImplementsIChangeTrackingButnotIRevertible(dataColumn.DataType.AssemblyQualifiedName); } } } } columnsImplementingIChangeTracking = _columns.ColumnsImplementingIChangeTracking; foreach (DataColumn column in columnsImplementingIChangeTracking) { object obj2 = null; obj2 = ((RowState == DataRowState.Deleted) ? this[column, DataRowVersion.Original] : this[column]); if (DBNull.Value != obj2 && ((IChangeTracking)obj2).IsChanged) { ((IRevertibleChangeTracking)obj2).RejectChanges(); } } } _table.RollbackRow(this); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } internal void ResetLastChangedColumn() { _lastChangedColumn = null; _countColumnChange = 0; } internal void SetKeyValues(DataKey key, object[] keyValues) { bool flag = true; bool flag2 = _tempRecord == -1; for (int i = 0; i < keyValues.Length; i++) { if (!this[key.ColumnsReference[i]].Equals(keyValues[i])) { if (flag2 && flag) { flag = false; BeginEditInternal(); } this[key.ColumnsReference[i]] = keyValues[i]; } } if (!flag) { EndEdit(); } } protected void SetNull(DataColumn column) { this[column] = DBNull.Value; } internal void SetNestedParentRow(DataRow parentRow, bool setNonNested) { if (parentRow == null) { SetParentRowToDBNull(); return; } foreach (DataRelation parentRelation in _table.ParentRelations) { if (!(parentRelation.Nested || setNonNested) || parentRelation.ParentKey.Table != parentRow._table) { continue; } object[] keyValues = parentRow.GetKeyValues(parentRelation.ParentKey); SetKeyValues(parentRelation.ChildKey, keyValues); if (parentRelation.Nested) { if (parentRow._table == _table) { CheckForLoops(parentRelation); } else { GetParentRow(parentRelation); } } } } public void SetParentRow(DataRow parentRow) { SetNestedParentRow(parentRow, setNonNested: true); } public void SetParentRow(DataRow parentRow, DataRelation relation) { if (relation == null) { SetParentRow(parentRow); return; } if (parentRow == null) { SetParentRowToDBNull(relation); return; } if (_table.DataSet != parentRow._table.DataSet) { throw ExceptionBuilder.ParentRowNotInTheDataSet(); } if (relation.ChildKey.Table != _table) { throw ExceptionBuilder.SetParentRowTableMismatch(relation.ChildKey.Table.TableName, _table.TableName); } if (relation.ParentKey.Table != parentRow._table) { throw ExceptionBuilder.SetParentRowTableMismatch(relation.ParentKey.Table.TableName, parentRow._table.TableName); } object[] keyValues = parentRow.GetKeyValues(relation.ParentKey); SetKeyValues(relation.ChildKey, keyValues); } internal void SetParentRowToDBNull() { foreach (DataRelation parentRelation in _table.ParentRelations) { SetParentRowToDBNull(parentRelation); } } internal void SetParentRowToDBNull(DataRelation relation) { if (relation.ChildKey.Table != _table) { throw ExceptionBuilder.SetParentRowTableMismatch(relation.ChildKey.Table.TableName, _table.TableName); } SetKeyValues(keyValues: new object[1] { DBNull.Value }, key: relation.ChildKey); } public void SetAdded() { if (RowState == DataRowState.Unchanged) { _table.SetOldRecord(this, -1); return; } throw ExceptionBuilder.SetAddedAndModifiedCalledOnnonUnchanged(); } public void SetModified() { if (RowState == DataRowState.Unchanged) { _tempRecord = _table.NewRecord(_newRecord); if (_tempRecord != -1) { _table.SetNewRecord(this, _tempRecord, DataRowAction.Change, isInMerge: false, fireEvent: true, suppressEnsurePropertyChanged: true); } return; } throw ExceptionBuilder.SetAddedAndModifiedCalledOnnonUnchanged(); } internal int CopyValuesIntoStore(ArrayList storeList, ArrayList nullbitList, int storeIndex) { int num = 0; if (_oldRecord != -1) { for (int i = 0; i < _columns.Count; i++) { _columns[i].CopyValueIntoStore(_oldRecord, storeList[i], (BitArray)nullbitList[i], storeIndex); } num++; storeIndex++; } DataRowState rowState = RowState; if (DataRowState.Added == rowState || DataRowState.Modified == rowState) { for (int j = 0; j < _columns.Count; j++) { _columns[j].CopyValueIntoStore(_newRecord, storeList[j], (BitArray)nullbitList[j], storeIndex); } num++; storeIndex++; } if (-1 != _tempRecord) { for (int k = 0; k < _columns.Count; k++) { _columns[k].CopyValueIntoStore(_tempRecord, storeList[k], (BitArray)nullbitList[k], storeIndex); } num++; storeIndex++; } return num; } [Conditional("DEBUG")] private void VerifyValueFromStorage(DataColumn column, DataRowVersion version, object valueFromStorage) { if (column.DataExpression != null && !_inChangingEvent && _tempRecord == -1 && _newRecord != -1 && version == DataRowVersion.Original && _oldRecord == _newRecord) { version = DataRowVersion.Current; } } } public sealed class DataRowBuilder { internal readonly DataTable _table; internal int _record; internal DataRowBuilder(DataTable table, int record) { _table = table; _record = record; } internal DataRowBuilder() { ThrowStub.ThrowNotSupportedException(); } } [Flags] public enum DataRowAction { Nothing = 0, Delete = 1, Change = 2, Rollback = 4, Commit = 8, Add = 0x10, ChangeOriginal = 0x20, ChangeCurrentAndOriginal = 0x40 } public class DataRowChangeEventArgs : EventArgs { public DataRow Row { get; } public DataRowAction Action { get; } public DataRowChangeEventArgs(DataRow row, DataRowAction action) { Row = row; Action = action; } } public delegate void DataRowChangeEventHandler(object sender, DataRowChangeEventArgs e); public sealed class DataRowCollection : InternalDataCollectionBase { private sealed class DataRowTree : RBTree { internal DataRowTree() : base(TreeAccessMethod.INDEX_ONLY) { } protected override int CompareNode(DataRow record1, DataRow record2) { throw ExceptionBuilder.InternalRBTreeError(RBTreeError.CompareNodeInDataRowTree); } protected override int CompareSateliteTreeNode(DataRow record1, DataRow record2) { throw ExceptionBuilder.InternalRBTreeError(RBTreeError.CompareSateliteTreeNodeInDataRowTree); } } private readonly DataTable _table; private readonly DataRowTree _list; internal int _nullInList; public override int Count => _list.Count; public DataRow this[int index] => _list[index]; internal DataRowCollection(DataTable table) { _list = new DataRowTree(); base..ctor(); _table = table; } public void Add(DataRow row) { _table.AddRow(row, -1); } public void InsertAt(DataRow row, int pos) { if (pos < 0) { throw ExceptionBuilder.RowInsertOutOfRange(pos); } if (pos >= _list.Count) { _table.AddRow(row, -1); } else { _table.InsertRow(row, -1, pos); } } internal void DiffInsertAt(DataRow row, int pos) { if (pos < 0 || pos == _list.Count) { _table.AddRow(row, (pos > -1) ? (pos + 1) : (-1)); } else if (_table.NestedParentRelations.Length != 0) { if (pos < _list.Count) { if (_list[pos] != null) { throw ExceptionBuilder.RowInsertTwice(pos, _table.TableName); } _list.RemoveAt(pos); _nullInList--; _table.InsertRow(row, pos + 1, pos); } else { while (pos > _list.Count) { _list.Add(null); _nullInList++; } _table.AddRow(row, pos + 1); } } else { _table.InsertRow(row, pos + 1, (pos > _list.Count) ? (-1) : pos); } } public int IndexOf(DataRow row) { if (row != null && row.Table == _table && (row.RBTreeNodeId != 0 || row.RowState != DataRowState.Detached)) { return _list.IndexOf(row.RBTreeNodeId, row); } return -1; } internal DataRow AddWithColumnEvents(params object[] values) { DataRow dataRow = _table.NewRow(-1); dataRow.ItemArray = values; _table.AddRow(dataRow, -1); return dataRow; } public DataRow Add(params object[] values) { int record = _table.NewRecordFromArray(values); DataRow dataRow = _table.NewRow(record); _table.AddRow(dataRow, -1); return dataRow; } internal void ArrayAdd(DataRow row) { row.RBTreeNodeId = _list.Add(row); } internal void ArrayInsert(DataRow row, int pos) { row.RBTreeNodeId = _list.Insert(pos, row); } internal void ArrayClear() { _list.Clear(); } internal void ArrayRemove(DataRow row) { if (row.RBTreeNodeId == 0) { throw ExceptionBuilder.InternalRBTreeError(RBTreeError.AttachedNodeWithZerorbTreeNodeId); } _list.RBDelete(row.RBTreeNodeId); row.RBTreeNodeId = 0; } public DataRow Find(object key) { return _table.FindByPrimaryKey(key); } public DataRow Find(object[] keys) { return _table.FindByPrimaryKey(keys); } public void Clear() { _table.Clear(clearAll: false); } public bool Contains(object key) { return _table.FindByPrimaryKey(key) != null; } public bool Contains(object[] keys) { return _table.FindByPrimaryKey(keys) != null; } public override void CopyTo(Array ar, int index) { _list.CopyTo(ar, index); } public void CopyTo(DataRow[] array, int index) { _list.CopyTo(array, index); } public override IEnumerator GetEnumerator() { return _list.GetEnumerator(); } public void Remove(DataRow row) { if (row == null || row.Table != _table || -1 == row.rowID) { throw ExceptionBuilder.RowOutOfRange(); } if (row.RowState != DataRowState.Deleted && row.RowState != DataRowState.Detached) { row.Delete(); } if (row.RowState != DataRowState.Detached) { row.AcceptChanges(); } } public void RemoveAt(int index) { Remove(this[index]); } internal DataRowCollection() { ThrowStub.ThrowNotSupportedException(); } } internal delegate void DataRowCreatedEventHandler(object sender, DataRow r); internal delegate void DataSetClearEventhandler(object sender, DataTable table); [Flags] public enum DataRowState { Detached = 1, Unchanged = 2, Added = 4, Deleted = 8, Modified = 0x10 } public enum DataRowVersion { Original = 256, Current = 512, Proposed = 1024, Default = 1536 } public class DataRowView : ICustomTypeDescriptor, IEditableObject, IDataErrorInfo, INotifyPropertyChanged { private readonly DataView _dataView; private readonly DataRow _row; private bool _delayBeginEdit; private static readonly PropertyDescriptorCollection s_zeroPropertyDescriptorCollection = new PropertyDescriptorCollection(null); public DataView DataView => _dataView; internal int ObjectID => _row._objectID; public object this[int ndx] { get { return Row[ndx, RowVersionDefault]; } set { if (!_dataView.AllowEdit && !IsNew) { throw ExceptionBuilder.CanNotEdit(); } SetColumnValue(_dataView.Table.Columns[ndx], value); } } public object this[string property] { get { DataColumn dataColumn = _dataView.Table.Columns[property]; if (dataColumn != null) { return Row[dataColumn, RowVersionDefault]; } if (_dataView.Table.DataSet != null && _dataView.Table.DataSet.Relations.Contains(property)) { return CreateChildView(property); } throw ExceptionBuilder.PropertyNotFound(property, _dataView.Table.TableName); } set { DataColumn dataColumn = _dataView.Table.Columns[property]; if (dataColumn == null) { throw ExceptionBuilder.SetFailed(property); } if (!_dataView.AllowEdit && !IsNew) { throw ExceptionBuilder.CanNotEdit(); } SetColumnValue(dataColumn, value); } } string IDataErrorInfo.this[string colName] => Row.GetColumnError(colName); string IDataErrorInfo.Error => Row.RowError; public DataRowVersion RowVersion => RowVersionDefault & (DataRowVersion)(-1025); private DataRowVersion RowVersionDefault => Row.GetDefaultRowVersion(_dataView.RowStateFilter); public DataRow Row => _row; public bool IsNew => _row == _dataView._addNewRow; public bool IsEdit { get { if (!Row.HasVersion(DataRowVersion.Proposed)) { return _delayBeginEdit; } return true; } } public event PropertyChangedEventHandler PropertyChanged; internal DataRowView(DataView dataView, DataRow row) { _dataView = dataView; _row = row; } public override bool Equals(object other) { return this == other; } public override int GetHashCode() { return Row.GetHashCode(); } internal int GetRecord() { return Row.GetRecordFromVersion(RowVersionDefault); } internal bool HasRecord() { return Row.HasVersion(RowVersionDefault); } internal object GetColumnValue(DataColumn column) { return Row[column, RowVersionDefault]; } internal void SetColumnValue(DataColumn column, object value) { if (_delayBeginEdit) { _delayBeginEdit = false; Row.BeginEdit(); } if (DataRowVersion.Original == RowVersionDefault) { throw ExceptionBuilder.SetFailed(column.ColumnName); } Row[column] = value; } public DataView CreateChildView(DataRelation relation, bool followParent) { if (relation == null || relation.ParentKey.Table != DataView.Table) { throw ExceptionBuilder.CreateChildView(); } RelatedView relatedView; if (!followParent) { int record = GetRecord(); object[] keyValues = relation.ParentKey.GetKeyValues(record); relatedView = new RelatedView(relation.ChildColumnsReference, keyValues); } else { relatedView = new RelatedView(this, relation.ParentKey, relation.ChildColumnsReference); } relatedView.SetIndex("", DataViewRowState.CurrentRows, null); relatedView.SetDataViewManager(DataView.DataViewManager); return relatedView; } public DataView CreateChildView(DataRelation relation) { return CreateChildView(relation, followParent: false); } public DataView CreateChildView(string relationName, bool followParent) { return CreateChildView(DataView.Table.ChildRelations[relationName], followParent); } public DataView CreateChildView(string relationName) { return CreateChildView(relationName, followParent: false); } public void BeginEdit() { _delayBeginEdit = true; } public void CancelEdit() { DataRow row = Row; if (IsNew) { _dataView.FinishAddNew(success: false); } else { row.CancelEdit(); } _delayBeginEdit = false; } public void EndEdit() { if (IsNew) { _dataView.FinishAddNew(success: true); } else { Row.EndEdit(); } _delayBeginEdit = false; } public void Delete() { _dataView.Delete(Row); } internal void RaisePropertyChangedEvent(string propName) { this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName)); } AttributeCollection ICustomTypeDescriptor.GetAttributes() { return new AttributeCollection((Attribute[]?)null); } string ICustomTypeDescriptor.GetClassName() { return null; } string ICustomTypeDescriptor.GetComponentName() { return null; } TypeConverter ICustomTypeDescriptor.GetConverter() { return null; } EventDescriptor ICustomTypeDescriptor.GetDefaultEvent() { return null; } PropertyDescriptor ICustomTypeDescriptor.GetDefaultProperty() { return null; } object ICustomTypeDescriptor.GetEditor(Type editorBaseType) { return null; } EventDescriptorCollection ICustomTypeDescriptor.GetEvents() { return new EventDescriptorCollection(null); } EventDescriptorCollection ICustomTypeDescriptor.GetEvents(Attribute[] attributes) { return new EventDescriptorCollection(null); } PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties() { return ((ICustomTypeDescriptor)this).GetProperties((Attribute[]?)null); } PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes) { if (_dataView.Table == null) { return s_zeroPropertyDescriptorCollection; } return _dataView.Table.GetPropertyDescriptorCollection(attributes); } object ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor pd) { return this; } internal DataRowView() { ThrowStub.ThrowNotSupportedException(); } } public enum SerializationFormat { Xml, Binary } [Serializable] [DefaultProperty("DataSetName")] [XmlSchemaProvider("GetDataSetSchema")] [XmlRoot("DataSet")] public class DataSet : MarshalByValueComponent, IListSource, IXmlSerializable, ISupportInitializeNotification, ISupportInitialize, ISerializable { private struct TableChanges { private BitArray _rowChanges; internal int HasChanges { get; set; } internal bool this[int index] { get { return _rowChanges[index]; } set { _rowChanges[index] = value; HasChanges++; } } internal TableChanges(int rowCount) { _rowChanges = new BitArray(rowCount); HasChanges = 0; } } private const string KEY_XMLSCHEMA = "XmlSchema"; private const string KEY_XMLDIFFGRAM = "XmlDiffGram"; private DataViewManager _defaultViewManager; private readonly DataTableCollection _tableCollection; private readonly DataRelationCollection _relationCollection; internal PropertyCollection _extendedProperties; private string _dataSetName = "NewDataSet"; private string _datasetPrefix = string.Empty; internal string _namespaceURI = string.Empty; private bool _enforceConstraints = true; private bool _caseSensitive; private CultureInfo _culture; private bool _cultureUserSet; internal bool _fInReadXml; internal bool _fInLoadDiffgram; internal bool _fTopLevelTable; internal bool _fInitInProgress; internal bool _fEnableCascading = true; internal bool _fIsSchemaLoading; private bool _fBoundToDocument; internal string _mainTableName = string.Empty; private SerializationFormat _remotingFormat; private object _defaultViewManagerLock = new object(); private static int s_objectTypeCount; private readonly int _objectID = Interlocked.Increment(ref s_objectTypeCount); private static XmlSchemaComplexType s_schemaTypeForWSDL; internal bool _useDataSetSchemaOnly; internal bool _udtIsWrapped; [DefaultValue(SerializationFormat.Xml)] public SerializationFormat RemotingFormat { get { return _remotingFormat; } set { if (value != SerializationFormat.Binary && value != 0) { throw ExceptionBuilder.InvalidRemotingFormat(value); } _remotingFormat = value; for (int i = 0; i < Tables.Count; i++) { Tables[i].RemotingFormat = value; } } } [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public virtual SchemaSerializationMode SchemaSerializationMode { get { return SchemaSerializationMode.IncludeSchema; } set { if (value != SchemaSerializationMode.IncludeSchema) { throw ExceptionBuilder.CannotChangeSchemaSerializationMode(); } } } [DefaultValue(false)] public bool CaseSensitive { get { return _caseSensitive; } set { if (_caseSensitive == value) { return; } bool caseSensitive = _caseSensitive; _caseSensitive = value; if (!ValidateCaseConstraint()) { _caseSensitive = caseSensitive; throw ExceptionBuilder.CannotChangeCaseLocale(); } foreach (DataTable table in Tables) { table.SetCaseSensitiveValue(value, userSet: false, resetIndexes: true); } } } bool IListSource.ContainsListCollection => true; [Browsable(false)] public DataViewManager DefaultViewManager { get { if (_defaultViewManager == null) { lock (_defaultViewManagerLock) { if (_defaultViewManager == null) { _defaultViewManager = new DataViewManager(this, locked: true); } } } return _defaultViewManager; } } [DefaultValue(true)] public bool EnforceConstraints { get { return _enforceConstraints; } set { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, {1}", ObjectID, value); try { if (_enforceConstraints != value) { if (value) { EnableConstraints(); } _enforceConstraints = value; } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } } [DefaultValue("")] public string DataSetName { get { return _dataSetName; } set { DataCommonEventSource.Log.Trace(" {0}, '{1}'", ObjectID, value); if (value != _dataSetName) { if (value == null || value.Length == 0) { throw ExceptionBuilder.SetDataSetNameToEmpty(); } DataTable dataTable = Tables[value, Namespace]; if (dataTable != null && !dataTable._fNestedInDataset) { throw ExceptionBuilder.SetDataSetNameConflicting(value); } RaisePropertyChanging("DataSetName"); _dataSetName = value; } } } [DefaultValue("")] public string Namespace { get { return _namespaceURI; } set { DataCommonEventSource.Log.Trace(" {0}, '{1}'", ObjectID, value); if (value == null) { value = string.Empty; } if (!(value != _namespaceURI)) { return; } RaisePropertyChanging("Namespace"); foreach (DataTable table in Tables) { if (table._tableNamespace == null && (table.NestedParentRelations.Length == 0 || (table.NestedParentRelations.Length == 1 && table.NestedParentRelations[0].ChildTable == table))) { if (Tables.Contains(table.TableName, value, checkProperty: false, caseSensitive: true)) { throw ExceptionBuilder.DuplicateTableName2(table.TableName, value); } table.CheckCascadingNamespaceConflict(value); table.DoRaiseNamespaceChange(); } } _namespaceURI = value; if (string.IsNullOrEmpty(value)) { _datasetPrefix = string.Empty; } } } [DefaultValue("")] public string Prefix { get { return _datasetPrefix; } set { if (value == null) { value = string.Empty; } if (XmlConvert.DecodeName(value) == value && XmlConvert.EncodeName(value) != value) { throw ExceptionBuilder.InvalidPrefix(value); } if (value != _datasetPrefix) { RaisePropertyChanging("Prefix"); _datasetPrefix = value; } } } [Browsable(false)] public PropertyCollection ExtendedProperties => _extendedProperties ?? (_extendedProperties = new PropertyCollection()); [Browsable(false)] public bool HasErrors { get { for (int i = 0; i < Tables.Count; i++) { if (Tables[i].HasErrors) { return true; } } return false; } } [Browsable(false)] public bool IsInitialized => !_fInitInProgress; public CultureInfo Locale { get { return _culture; } set { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { if (value != null) { if (!_culture.Equals(value)) { SetLocaleValue(value, userSet: true); } _cultureUserSet = true; } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public override ISite Site { get { return base.Site; } set { ISite site = Site; if (value == null && site != null) { IContainer container = site.Container; if (container != null) { for (int i = 0; i < Tables.Count; i++) { if (Tables[i].Site != null) { container.Remove(Tables[i]); } } } } base.Site = value; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public DataRelationCollection Relations => _relationCollection; [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public DataTableCollection Tables => _tableCollection; internal bool FBoundToDocument { get { return _fBoundToDocument; } set { _fBoundToDocument = value; } } internal string MainTableName { get { return _mainTableName; } set { _mainTableName = value; } } internal int ObjectID => _objectID; internal event PropertyChangedEventHandler PropertyChanging; public event MergeFailedEventHandler MergeFailed; internal event DataRowCreatedEventHandler DataRowCreated; internal event DataSetClearEventhandler ClearFunctionCalled; public event EventHandler Initialized; public DataSet() { GC.SuppressFinalize(this); DataCommonEventSource.Log.Trace(" {0}", ObjectID); _tableCollection = new DataTableCollection(this); _relationCollection = new DataRelationCollection.DataSetRelationCollection(this); _culture = CultureInfo.CurrentCulture; } public DataSet(string dataSetName) : this() { DataSetName = dataSetName; } protected bool IsBinarySerialized(SerializationInfo info, StreamingContext context) { SerializationFormat serializationFormat = SerializationFormat.Xml; SerializationInfoEnumerator enumerator = info.GetEnumerator(); while (enumerator.MoveNext()) { if (enumerator.Name == "DataSet.RemotingFormat") { serializationFormat = (SerializationFormat)enumerator.Value; break; } } return serializationFormat == SerializationFormat.Binary; } protected SchemaSerializationMode DetermineSchemaSerializationMode(SerializationInfo info, StreamingContext context) { SchemaSerializationMode result = SchemaSerializationMode.IncludeSchema; SerializationInfoEnumerator enumerator = info.GetEnumerator(); while (enumerator.MoveNext()) { if (enumerator.Name == "SchemaSerializationMode.DataSet") { result = (SchemaSerializationMode)enumerator.Value; break; } } return result; } protected SchemaSerializationMode DetermineSchemaSerializationMode(XmlReader reader) { SchemaSerializationMode result = SchemaSerializationMode.IncludeSchema; reader.MoveToContent(); if (reader.NodeType == XmlNodeType.Element && reader.HasAttributes) { string attribute = reader.GetAttribute("SchemaSerializationMode", "urn:schemas-microsoft-com:xml-msdata"); if (string.Equals(attribute, "ExcludeSchema", StringComparison.OrdinalIgnoreCase)) { result = SchemaSerializationMode.ExcludeSchema; } else if (string.Equals(attribute, "IncludeSchema", StringComparison.OrdinalIgnoreCase)) { result = SchemaSerializationMode.IncludeSchema; } else if (attribute != null) { throw ExceptionBuilder.InvalidSchemaSerializationMode(typeof(SchemaSerializationMode), attribute); } } return result; } protected void GetSerializationData(SerializationInfo info, StreamingContext context) { SerializationFormat remotingFormat = SerializationFormat.Xml; SerializationInfoEnumerator enumerator = info.GetEnumerator(); while (enumerator.MoveNext()) { if (enumerator.Name == "DataSet.RemotingFormat") { remotingFormat = (SerializationFormat)enumerator.Value; break; } } DeserializeDataSetData(info, context, remotingFormat); } protected DataSet(SerializationInfo info, StreamingContext context) : this(info, context, ConstructSchema: true) { } protected DataSet(SerializationInfo info, StreamingContext context, bool ConstructSchema) : this() { SerializationFormat serializationFormat = SerializationFormat.Xml; SchemaSerializationMode schemaSerializationMode = SchemaSerializationMode.IncludeSchema; SerializationInfoEnumerator enumerator = info.GetEnumerator(); while (enumerator.MoveNext()) { string name = enumerator.Name; if (!(name == "DataSet.RemotingFormat")) { if (name == "SchemaSerializationMode.DataSet") { schemaSerializationMode = (SchemaSerializationMode)enumerator.Value; } } else { serializationFormat = (SerializationFormat)enumerator.Value; } } if (schemaSerializationMode == SchemaSerializationMode.ExcludeSchema) { InitializeDerivedDataSet(); } if (serializationFormat != 0 || ConstructSchema) { DeserializeDataSet(info, context, serializationFormat, schemaSerializationMode); } } [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)] public virtual void GetObjectData(SerializationInfo info, StreamingContext context) { SerializationFormat remotingFormat = RemotingFormat; SerializeDataSet(info, context, remotingFormat); } protected virtual void InitializeDerivedDataSet() { } private void SerializeDataSet(SerializationInfo info, StreamingContext context, SerializationFormat remotingFormat) { info.AddValue("DataSet.RemotingVersion", new Version(2, 0)); if (remotingFormat != 0) { info.AddValue("DataSet.RemotingFormat", remotingFormat); } if (SchemaSerializationMode.IncludeSchema != SchemaSerializationMode) { info.AddValue("SchemaSerializationMode.DataSet", SchemaSerializationMode); } if (remotingFormat != 0) { if (SchemaSerializationMode == SchemaSerializationMode.IncludeSchema) { SerializeDataSetProperties(info, context); info.AddValue("DataSet.Tables.Count", Tables.Count); for (int i = 0; i < Tables.Count; i++) { BinaryFormatter binaryFormatter = new BinaryFormatter(null, new StreamingContext(context.State, false)); MemoryStream memoryStream = new MemoryStream(); binaryFormatter.Serialize(memoryStream, Tables[i]); memoryStream.Position = 0L; info.AddValue(string.Format(CultureInfo.InvariantCulture, "DataSet.Tables_{0}", i), memoryStream.GetBuffer()); } for (int j = 0; j < Tables.Count; j++) { Tables[j].SerializeConstraints(info, context, j, allConstraints: true); } SerializeRelations(info, context); for (int k = 0; k < Tables.Count; k++) { Tables[k].SerializeExpressionColumns(info, context, k); } } else { SerializeDataSetProperties(info, context); } for (int l = 0; l < Tables.Count; l++) { Tables[l].SerializeTableData(info, context, l); } } else { string xmlSchemaForRemoting = GetXmlSchemaForRemoting(null); string text = null; info.AddValue("XmlSchema", xmlSchemaForRemoting); StringWriter stringWriter = new StringWriter(new StringBuilder(EstimatedXmlStringSize() * 2), CultureInfo.InvariantCulture); XmlTextWriter writer = new XmlTextWriter(stringWriter); WriteXml(writer, XmlWriteMode.DiffGram); text = stringWriter.ToString(); info.AddValue("XmlDiffGram", text); } } internal void DeserializeDataSet(SerializationInfo info, StreamingContext context, SerializationFormat remotingFormat, SchemaSerializationMode schemaSerializationMode) { DeserializeDataSetSchema(info, context, remotingFormat, schemaSerializationMode); DeserializeDataSetData(info, context, remotingFormat); } private void DeserializeDataSetSchema(SerializationInfo info, StreamingContext context, SerializationFormat remotingFormat, SchemaSerializationMode schemaSerializationMode) { if (remotingFormat != 0) { if (schemaSerializationMode == SchemaSerializationMode.IncludeSchema) { DeserializeDataSetProperties(info, context); int @int = info.GetInt32("DataSet.Tables.Count"); for (int i = 0; i < @int; i++) { MemoryStream memoryStream = new MemoryStream((byte[])info.GetValue(string.Format(CultureInfo.InvariantCulture, "DataSet.Tables_{0}", i), typeof(byte[]))); memoryStream.Position = 0L; DataTable table = (DataTable)new BinaryFormatter(null, new StreamingContext(context.State, false)).Deserialize(memoryStream); Tables.Add(table); } for (int j = 0; j < @int; j++) { Tables[j].DeserializeConstraints(info, context, j, allConstraints: true); } DeserializeRelations(info, context); for (int k = 0; k < @int; k++) { Tables[k].DeserializeExpressionColumns(info, context, k); } } else { DeserializeDataSetProperties(info, context); } } else { string text = (string)info.GetValue("XmlSchema", typeof(string)); if (text != null) { ReadXmlSchema(new XmlTextReader(new StringReader(text)), denyResolving: true); } } } private void DeserializeDataSetData(SerializationInfo info, StreamingContext context, SerializationFormat remotingFormat) { if (remotingFormat != 0) { for (int i = 0; i < Tables.Count; i++) { Tables[i].DeserializeTableData(info, context, i); } return; } string text = (string)info.GetValue("XmlDiffGram", typeof(string)); if (text != null) { ReadXml(new XmlTextReader(new StringReader(text)), XmlReadMode.DiffGram); } } private void SerializeDataSetProperties(SerializationInfo info, StreamingContext context) { info.AddValue("DataSet.DataSetName", DataSetName); info.AddValue("DataSet.Namespace", Namespace); info.AddValue("DataSet.Prefix", Prefix); info.AddValue("DataSet.CaseSensitive", CaseSensitive); info.AddValue("DataSet.LocaleLCID", Locale.LCID); info.AddValue("DataSet.EnforceConstraints", EnforceConstraints); info.AddValue("DataSet.ExtendedProperties", ExtendedProperties); } private void DeserializeDataSetProperties(SerializationInfo info, StreamingContext context) { _dataSetName = info.GetString("DataSet.DataSetName"); _namespaceURI = info.GetString("DataSet.Namespace"); _datasetPrefix = info.GetString("DataSet.Prefix"); _caseSensitive = info.GetBoolean("DataSet.CaseSensitive"); int culture = (int)info.GetValue("DataSet.LocaleLCID", typeof(int)); _culture = new CultureInfo(culture); _cultureUserSet = true; _enforceConstraints = info.GetBoolean("DataSet.EnforceConstraints"); _extendedProperties = (PropertyCollection)info.GetValue("DataSet.ExtendedProperties", typeof(PropertyCollection)); } private void SerializeRelations(SerializationInfo info, StreamingContext context) { ArrayList arrayList = new ArrayList(); foreach (DataRelation relation in Relations) { int[] array = new int[relation.ParentColumns.Length + 1]; array[0] = Tables.IndexOf(relation.ParentTable); for (int i = 1; i < array.Length; i++) { array[i] = relation.ParentColumns[i - 1].Ordinal; } int[] array2 = new int[relation.ChildColumns.Length + 1]; array2[0] = Tables.IndexOf(relation.ChildTable); for (int j = 1; j < array2.Length; j++) { array2[j] = relation.ChildColumns[j - 1].Ordinal; } ArrayList arrayList2 = new ArrayList(); arrayList2.Add(relation.RelationName); arrayList2.Add(array); arrayList2.Add(array2); arrayList2.Add(relation.Nested); arrayList2.Add(relation._extendedProperties); arrayList.Add(arrayList2); } info.AddValue("DataSet.Relations", arrayList); } private void DeserializeRelations(SerializationInfo info, StreamingContext context) { foreach (ArrayList item in (ArrayList)info.GetValue("DataSet.Relations", typeof(ArrayList))) { string relationName = (string)item[0]; int[] array = (int[])item[1]; int[] array2 = (int[])item[2]; bool nested = (bool)item[3]; PropertyCollection extendedProperties = (PropertyCollection)item[4]; DataColumn[] array3 = new DataColumn[array.Length - 1]; for (int i = 0; i < array3.Length; i++) { array3[i] = Tables[array[0]].Columns[array[i + 1]]; } DataColumn[] array4 = new DataColumn[array2.Length - 1]; for (int j = 0; j < array4.Length; j++) { array4[j] = Tables[array2[0]].Columns[array2[j + 1]]; } DataRelation dataRelation = new DataRelation(relationName, array3, array4, createConstraints: false); dataRelation.CheckMultipleNested = false; dataRelation.Nested = nested; dataRelation._extendedProperties = extendedProperties; Relations.Add(dataRelation); dataRelation.CheckMultipleNested = true; } } internal void FailedEnableConstraints() { EnforceConstraints = false; throw ExceptionBuilder.EnforceConstraint(); } internal void RestoreEnforceConstraints(bool value) { _enforceConstraints = value; } internal void EnableConstraints() { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { bool flag = false; ConstraintEnumerator constraintEnumerator = new ConstraintEnumerator(this); while (constraintEnumerator.GetNext()) { Constraint constraint = constraintEnumerator.GetConstraint(); flag |= constraint.IsConstraintViolated(); } foreach (DataTable table in Tables) { foreach (DataColumn column in table.Columns) { if (!column.AllowDBNull) { flag |= column.IsNotAllowDBNullViolated(); } if (column.MaxLength >= 0) { flag |= column.IsMaxLengthViolated(); } } } if (flag) { FailedEnableConstraints(); } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } internal void SetLocaleValue(CultureInfo value, bool userSet) { bool flag = false; bool flag2 = false; int num = 0; CultureInfo culture = _culture; bool cultureUserSet = _cultureUserSet; try { _culture = value; _cultureUserSet = userSet; foreach (DataTable table in Tables) { if (!table.ShouldSerializeLocale()) { table.SetLocaleValue(value, userSet: false, resetIndexes: false); } } flag = ValidateLocaleConstraint(); if (!flag) { return; } flag = false; foreach (DataTable table2 in Tables) { num++; if (!table2.ShouldSerializeLocale()) { table2.SetLocaleValue(value, userSet: false, resetIndexes: true); } } flag = true; } catch { flag2 = true; throw; } finally { if (!flag) { _culture = culture; _cultureUserSet = cultureUserSet; foreach (DataTable table3 in Tables) { if (!table3.ShouldSerializeLocale()) { table3.SetLocaleValue(culture, userSet: false, resetIndexes: false); } } try { for (int i = 0; i < num; i++) { if (!Tables[i].ShouldSerializeLocale()) { Tables[i].SetLocaleValue(culture, userSet: false, resetIndexes: true); } } } catch (Exception e) when (ADP.IsCatchableExceptionType(e)) { ADP.TraceExceptionWithoutRethrow(e); } if (!flag2) { throw ExceptionBuilder.CannotChangeCaseLocale(null); } } } } internal bool ShouldSerializeLocale() { return _cultureUserSet; } protected virtual bool ShouldSerializeRelations() { return true; } private void ResetRelations() { Relations.Clear(); } protected virtual bool ShouldSerializeTables() { return true; } private void ResetTables() { Tables.Clear(); } public void AcceptChanges() { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { for (int i = 0; i < Tables.Count; i++) { Tables[i].AcceptChanges(); } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public void BeginInit() { _fInitInProgress = true; } public void EndInit() { Tables.FinishInitCollection(); for (int i = 0; i < Tables.Count; i++) { Tables[i].Columns.FinishInitCollection(); } for (int j = 0; j < Tables.Count; j++) { Tables[j].Constraints.FinishInitConstraints(); } ((DataRelationCollection.DataSetRelationCollection)Relations).FinishInitRelations(); _fInitInProgress = false; OnInitialized(); } public void Clear() { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { OnClearFunctionCalled(null); bool enforceConstraints = EnforceConstraints; EnforceConstraints = false; for (int i = 0; i < Tables.Count; i++) { Tables[i].Clear(); } EnforceConstraints = enforceConstraints; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } [MethodImpl(MethodImplOptions.NoInlining)] public virtual DataSet Clone() { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { DataSet dataSet = (DataSet)Activator.CreateInstance(GetType(), nonPublic: true); if (dataSet.Tables.Count > 0) { dataSet.Reset(); } dataSet.DataSetName = DataSetName; dataSet.CaseSensitive = CaseSensitive; dataSet._culture = _culture; dataSet._cultureUserSet = _cultureUserSet; dataSet.EnforceConstraints = EnforceConstraints; dataSet.Namespace = Namespace; dataSet.Prefix = Prefix; dataSet.RemotingFormat = RemotingFormat; dataSet._fIsSchemaLoading = true; DataTableCollection tables = Tables; for (int i = 0; i < tables.Count; i++) { DataTable dataTable = tables[i].Clone(dataSet); dataTable._tableNamespace = tables[i].Namespace; dataSet.Tables.Add(dataTable); } for (int j = 0; j < tables.Count; j++) { ConstraintCollection constraints = tables[j].Constraints; for (int k = 0; k < constraints.Count; k++) { if (!(constraints[k] is UniqueConstraint)) { ForeignKeyConstraint foreignKeyConstraint = constraints[k] as ForeignKeyConstraint; if (foreignKeyConstraint.Table != foreignKeyConstraint.RelatedTable) { dataSet.Tables[j].Constraints.Add(constraints[k].Clone(dataSet)); } } } } DataRelationCollection relations = Relations; for (int l = 0; l < relations.Count; l++) { DataRelation dataRelation = relations[l].Clone(dataSet); dataRelation.CheckMultipleNested = false; dataSet.Relations.Add(dataRelation); dataRelation.CheckMultipleNested = true; } if (_extendedProperties != null) { foreach (object key in _extendedProperties.Keys) { dataSet.ExtendedProperties[key] = _extendedProperties[key]; } } foreach (DataTable table in Tables) { foreach (DataColumn column in table.Columns) { if (column.Expression.Length != 0) { dataSet.Tables[table.TableName, table.Namespace].Columns[column.ColumnName].Expression = column.Expression; } } } for (int m = 0; m < tables.Count; m++) { dataSet.Tables[m]._tableNamespace = tables[m]._tableNamespace; } dataSet._fIsSchemaLoading = false; return dataSet; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public DataSet Copy() { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { DataSet dataSet = Clone(); bool enforceConstraints = dataSet.EnforceConstraints; dataSet.EnforceConstraints = false; foreach (DataTable table2 in Tables) { DataTable table = dataSet.Tables[table2.TableName, table2.Namespace]; foreach (DataRow row in table2.Rows) { table2.CopyRow(table, row); } } dataSet.EnforceConstraints = enforceConstraints; return dataSet; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } internal int EstimatedXmlStringSize() { int num = 100; for (int i = 0; i < Tables.Count; i++) { int num2 = Tables[i].TableName.Length + 4 << 2; DataTable dataTable = Tables[i]; for (int j = 0; j < dataTable.Columns.Count; j++) { num2 += dataTable.Columns[j].ColumnName.Length + 4 << 2; num2 += 20; } num += dataTable.Rows.Count * num2; } return num; } public DataSet GetChanges() { return GetChanges(DataRowState.Added | DataRowState.Deleted | DataRowState.Modified); } public DataSet GetChanges(DataRowState rowStates) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, rowStates={1}", ObjectID, rowStates); try { DataSet dataSet = null; bool enforceConstraints = false; if (((uint)rowStates & 0xFFFFFFE1u) != 0) { throw ExceptionBuilder.InvalidRowState(rowStates); } TableChanges[] array = new TableChanges[Tables.Count]; for (int i = 0; i < array.Length; i++) { array[i] = new TableChanges(Tables[i].Rows.Count); } MarkModifiedRows(array, rowStates); for (int j = 0; j < array.Length; j++) { if (0 >= array[j].HasChanges) { continue; } if (dataSet == null) { dataSet = Clone(); enforceConstraints = dataSet.EnforceConstraints; dataSet.EnforceConstraints = false; } DataTable dataTable = Tables[j]; DataTable table = dataSet.Tables[dataTable.TableName, dataTable.Namespace]; int num = 0; while (0 < array[j].HasChanges) { if (array[j][num]) { dataTable.CopyRow(table, dataTable.Rows[num]); array[j].HasChanges--; } num++; } } if (dataSet != null) { dataSet.EnforceConstraints = enforceConstraints; } return dataSet; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } private void MarkModifiedRows(TableChanges[] bitMatrix, DataRowState rowStates) { for (int i = 0; i < bitMatrix.Length; i++) { DataRowCollection rows = Tables[i].Rows; int count = rows.Count; for (int j = 0; j < count; j++) { DataRow dataRow = rows[j]; DataRowState rowState = dataRow.RowState; if ((rowStates & rowState) != 0 && !bitMatrix[i][j]) { bitMatrix[i][j] = true; if (DataRowState.Deleted != rowState) { MarkRelatedRowsAsModified(bitMatrix, dataRow); } } } } } private void MarkRelatedRowsAsModified(TableChanges[] bitMatrix, DataRow row) { DataRelationCollection parentRelations = row.Table.ParentRelations; int count = parentRelations.Count; for (int i = 0; i < count; i++) { DataRow[] parentRows = row.GetParentRows(parentRelations[i], DataRowVersion.Current); foreach (DataRow dataRow in parentRows) { int num = Tables.IndexOf(dataRow.Table); int index = dataRow.Table.Rows.IndexOf(dataRow); if (!bitMatrix[num][index]) { bitMatrix[num][index] = true; if (DataRowState.Deleted != dataRow.RowState) { MarkRelatedRowsAsModified(bitMatrix, dataRow); } } } } } IList IListSource.GetList() { return DefaultViewManager; } internal string GetRemotingDiffGram(DataTable table) { StringWriter stringWriter = new StringWriter(CultureInfo.InvariantCulture); XmlTextWriter xmlw = new XmlTextWriter(stringWriter) { Formatting = Formatting.Indented }; if (stringWriter != null) { new NewDiffgramGen(table, writeHierarchy: false).Save(xmlw, table); } return stringWriter.ToString(); } public string GetXml() { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { StringWriter stringWriter = new StringWriter(CultureInfo.InvariantCulture); if (stringWriter != null) { XmlTextWriter xmlTextWriter = new XmlTextWriter(stringWriter); xmlTextWriter.Formatting = Formatting.Indented; new XmlDataTreeWriter(this).Save(xmlTextWriter, writeSchema: false); } return stringWriter.ToString(); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public string GetXmlSchema() { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { StringWriter stringWriter = new StringWriter(CultureInfo.InvariantCulture); XmlTextWriter xw = new XmlTextWriter(stringWriter) { Formatting = Formatting.Indented }; if (stringWriter != null) { new XmlTreeGen(SchemaFormat.Public).Save(this, xw); } return stringWriter.ToString(); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } internal string GetXmlSchemaForRemoting(DataTable table) { StringWriter stringWriter = new StringWriter(CultureInfo.InvariantCulture); XmlTextWriter xw = new XmlTextWriter(stringWriter) { Formatting = Formatting.Indented }; if (stringWriter != null) { if (table == null) { if (SchemaSerializationMode == SchemaSerializationMode.ExcludeSchema) { new XmlTreeGen(SchemaFormat.RemotingSkipSchema).Save(this, xw); } else { new XmlTreeGen(SchemaFormat.Remoting).Save(this, xw); } } else { new XmlTreeGen(SchemaFormat.Remoting).Save(table, xw); } } return stringWriter.ToString(); } public bool HasChanges() { return HasChanges(DataRowState.Added | DataRowState.Deleted | DataRowState.Modified); } public bool HasChanges(DataRowState rowStates) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, rowStates={1}", ObjectID, (int)rowStates); try { if (((uint)rowStates & 0xFFFFFFE0u) != 0) { throw ExceptionBuilder.ArgumentOutOfRange("rowState"); } for (int i = 0; i < Tables.Count; i++) { DataTable dataTable = Tables[i]; for (int j = 0; j < dataTable.Rows.Count; j++) { if ((dataTable.Rows[j].RowState & rowStates) != 0) { return true; } } } return false; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public void InferXmlSchema(XmlReader reader, string[] nsArray) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { if (reader != null) { XmlDocument xmlDocument = new XmlDocument(); if (reader.NodeType == XmlNodeType.Element) { XmlNode newChild = xmlDocument.ReadNode(reader); xmlDocument.AppendChild(newChild); } else { xmlDocument.Load(reader); } if (xmlDocument.DocumentElement != null) { InferSchema(xmlDocument, nsArray, XmlReadMode.InferSchema); } } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public void InferXmlSchema(Stream stream, string[] nsArray) { if (stream != null) { InferXmlSchema(new XmlTextReader(stream), nsArray); } } public void InferXmlSchema(TextReader reader, string[] nsArray) { if (reader != null) { InferXmlSchema(new XmlTextReader(reader), nsArray); } } public void InferXmlSchema(string fileName, string[] nsArray) { XmlTextReader xmlTextReader = new XmlTextReader(fileName); try { InferXmlSchema(xmlTextReader, nsArray); } finally { xmlTextReader.Close(); } } public void ReadXmlSchema(XmlReader reader) { ReadXmlSchema(reader, denyResolving: false); } internal void ReadXmlSchema(XmlReader reader, bool denyResolving) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, reader, denyResolving={1}", ObjectID, denyResolving); try { int depth = -1; if (reader == null) { return; } if (reader is XmlTextReader) { ((XmlTextReader)reader).WhitespaceHandling = WhitespaceHandling.None; } XmlDocument xmlDocument = new XmlDocument(); if (reader.NodeType == XmlNodeType.Element) { depth = reader.Depth; } reader.MoveToContent(); if (reader.NodeType != XmlNodeType.Element) { return; } if (reader.LocalName == "Schema" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-data") { ReadXDRSchema(reader); return; } if (reader.LocalName == "schema" && reader.NamespaceURI == "http://www.w3.org/2001/XMLSchema") { ReadXSDSchema(reader, denyResolving); return; } if (reader.LocalName == "schema" && reader.NamespaceURI.StartsWith("http://www.w3.org/", StringComparison.Ordinal)) { throw ExceptionBuilder.DataSetUnsupportedSchema("http://www.w3.org/2001/XMLSchema"); } XmlElement xmlElement = xmlDocument.CreateElement(reader.Prefix, reader.LocalName, reader.NamespaceURI); if (reader.HasAttributes) { int attributeCount = reader.AttributeCount; for (int i = 0; i < attributeCount; i++) { reader.MoveToAttribute(i); if (reader.NamespaceURI.Equals("http://www.w3.org/2000/xmlns/")) { xmlElement.SetAttribute(reader.Name, reader.GetAttribute(i)); continue; } XmlAttribute xmlAttribute = xmlElement.SetAttributeNode(reader.LocalName, reader.NamespaceURI); xmlAttribute.Prefix = reader.Prefix; xmlAttribute.Value = reader.GetAttribute(i); } } reader.Read(); while (MoveToElement(reader, depth)) { if (reader.LocalName == "Schema" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-data") { ReadXDRSchema(reader); return; } if (reader.LocalName == "schema" && reader.NamespaceURI == "http://www.w3.org/2001/XMLSchema") { ReadXSDSchema(reader, denyResolving); return; } if (reader.LocalName == "schema" && reader.NamespaceURI.StartsWith("http://www.w3.org/", StringComparison.Ordinal)) { throw ExceptionBuilder.DataSetUnsupportedSchema("http://www.w3.org/2001/XMLSchema"); } XmlNode newChild = xmlDocument.ReadNode(reader); xmlElement.AppendChild(newChild); } ReadEndElement(reader); xmlDocument.AppendChild(xmlElement); InferSchema(xmlDocument, null, XmlReadMode.Auto); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } internal bool MoveToElement(XmlReader reader, int depth) { while (!reader.EOF && reader.NodeType != XmlNodeType.EndElement && reader.NodeType != XmlNodeType.Element && reader.Depth > depth) { reader.Read(); } return reader.NodeType == XmlNodeType.Element; } private static void MoveToElement(XmlReader reader) { while (!reader.EOF && reader.NodeType != XmlNodeType.EndElement && reader.NodeType != XmlNodeType.Element) { reader.Read(); } } internal void ReadEndElement(XmlReader reader) { while (reader.NodeType == XmlNodeType.Whitespace) { reader.Skip(); } if (reader.NodeType == XmlNodeType.None) { reader.Skip(); } else if (reader.NodeType == XmlNodeType.EndElement) { reader.ReadEndElement(); } } internal void ReadXSDSchema(XmlReader reader, bool denyResolving) { XmlSchemaSet xmlSchemaSet = new XmlSchemaSet(); int num = 1; if (reader.LocalName == "schema" && reader.NamespaceURI == "http://www.w3.org/2001/XMLSchema" && reader.HasAttributes) { string attribute = reader.GetAttribute("schemafragmentcount", "urn:schemas-microsoft-com:xml-msdata"); if (!string.IsNullOrEmpty(attribute)) { num = int.Parse(attribute, null); } } while (reader.LocalName == "schema" && reader.NamespaceURI == "http://www.w3.org/2001/XMLSchema") { XmlSchema schema = XmlSchema.Read(reader, null); xmlSchemaSet.Add(schema); ReadEndElement(reader); if (--num > 0) { MoveToElement(reader); } while (reader.NodeType == XmlNodeType.Whitespace) { reader.Skip(); } } xmlSchemaSet.Compile(); new XSDSchema().LoadSchema(xmlSchemaSet, this); } internal void ReadXDRSchema(XmlReader reader) { XmlDocument xmlDocument = new XmlDocument(); XmlNode xmlNode = xmlDocument.ReadNode(reader); xmlDocument.AppendChild(xmlNode); XDRSchema xDRSchema = new XDRSchema(this, fInline: false); DataSetName = xmlDocument.DocumentElement.LocalName; xDRSchema.LoadSchema((XmlElement)xmlNode, this); } public void ReadXmlSchema(Stream stream) { if (stream != null) { ReadXmlSchema(new XmlTextReader(stream), denyResolving: false); } } public void ReadXmlSchema(TextReader reader) { if (reader != null) { ReadXmlSchema(new XmlTextReader(reader), denyResolving: false); } } public void ReadXmlSchema(string fileName) { XmlTextReader xmlTextReader = new XmlTextReader(fileName); try { ReadXmlSchema(xmlTextReader, denyResolving: false); } finally { xmlTextReader.Close(); } } public void WriteXmlSchema(Stream stream) { WriteXmlSchema(stream, SchemaFormat.Public, null); } public void WriteXmlSchema(Stream stream, Converter multipleTargetConverter) { ADP.CheckArgumentNull(multipleTargetConverter, "multipleTargetConverter"); WriteXmlSchema(stream, SchemaFormat.Public, multipleTargetConverter); } public void WriteXmlSchema(string fileName) { WriteXmlSchema(fileName, SchemaFormat.Public, null); } public void WriteXmlSchema(string fileName, Converter multipleTargetConverter) { ADP.CheckArgumentNull(multipleTargetConverter, "multipleTargetConverter"); WriteXmlSchema(fileName, SchemaFormat.Public, multipleTargetConverter); } public void WriteXmlSchema(TextWriter writer) { WriteXmlSchema(writer, SchemaFormat.Public, null); } public void WriteXmlSchema(TextWriter writer, Converter multipleTargetConverter) { ADP.CheckArgumentNull(multipleTargetConverter, "multipleTargetConverter"); WriteXmlSchema(writer, SchemaFormat.Public, multipleTargetConverter); } public void WriteXmlSchema(XmlWriter writer) { WriteXmlSchema(writer, SchemaFormat.Public, null); } public void WriteXmlSchema(XmlWriter writer, Converter multipleTargetConverter) { ADP.CheckArgumentNull(multipleTargetConverter, "multipleTargetConverter"); WriteXmlSchema(writer, SchemaFormat.Public, multipleTargetConverter); } private void WriteXmlSchema(string fileName, SchemaFormat schemaFormat, Converter multipleTargetConverter) { XmlTextWriter xmlTextWriter = new XmlTextWriter(fileName, null); try { xmlTextWriter.Formatting = Formatting.Indented; xmlTextWriter.WriteStartDocument(standalone: true); WriteXmlSchema(xmlTextWriter, schemaFormat, multipleTargetConverter); xmlTextWriter.WriteEndDocument(); } finally { xmlTextWriter.Close(); } } private void WriteXmlSchema(Stream stream, SchemaFormat schemaFormat, Converter multipleTargetConverter) { if (stream != null) { XmlTextWriter xmlTextWriter = new XmlTextWriter(stream, null); xmlTextWriter.Formatting = Formatting.Indented; WriteXmlSchema(xmlTextWriter, schemaFormat, multipleTargetConverter); } } private void WriteXmlSchema(TextWriter writer, SchemaFormat schemaFormat, Converter multipleTargetConverter) { if (writer != null) { XmlTextWriter xmlTextWriter = new XmlTextWriter(writer); xmlTextWriter.Formatting = Formatting.Indented; WriteXmlSchema(xmlTextWriter, schemaFormat, multipleTargetConverter); } } private void WriteXmlSchema(XmlWriter writer, SchemaFormat schemaFormat, Converter multipleTargetConverter) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, schemaFormat={1}", ObjectID, schemaFormat); try { if (writer != null) { XmlTreeGen xmlTreeGen = null; xmlTreeGen = ((schemaFormat != SchemaFormat.WebService || SchemaSerializationMode != SchemaSerializationMode.ExcludeSchema || writer.WriteState != WriteState.Element) ? new XmlTreeGen(schemaFormat) : new XmlTreeGen(SchemaFormat.WebServiceSkipSchema)); xmlTreeGen.Save(this, null, writer, writeHierarchy: false, multipleTargetConverter); } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public XmlReadMode ReadXml(XmlReader reader) { return ReadXml(reader, denyResolving: false); } internal XmlReadMode ReadXml(XmlReader reader, bool denyResolving) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, denyResolving={1}", ObjectID, denyResolving); try { DataTable.DSRowDiffIdUsageSection dSRowDiffIdUsageSection = default(DataTable.DSRowDiffIdUsageSection); try { bool flag = false; bool flag2 = false; bool flag3 = false; bool isXdr = false; int depth = -1; XmlReadMode result = XmlReadMode.Auto; bool flag4 = false; bool flag5 = false; dSRowDiffIdUsageSection.Prepare(this); if (reader == null) { return result; } if (Tables.Count == 0) { flag4 = true; } if (reader is XmlTextReader) { ((XmlTextReader)reader).WhitespaceHandling = WhitespaceHandling.Significant; } XmlDocument xmlDocument = new XmlDocument(); XmlDataLoader xmlDataLoader = null; reader.MoveToContent(); if (reader.NodeType == XmlNodeType.Element) { depth = reader.Depth; } if (reader.NodeType == XmlNodeType.Element) { if (reader.LocalName == "diffgram" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-diffgram-v1") { ReadXmlDiffgram(reader); ReadEndElement(reader); return XmlReadMode.DiffGram; } if (reader.LocalName == "Schema" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-data") { ReadXDRSchema(reader); return XmlReadMode.ReadSchema; } if (reader.LocalName == "schema" && reader.NamespaceURI == "http://www.w3.org/2001/XMLSchema") { ReadXSDSchema(reader, denyResolving); return XmlReadMode.ReadSchema; } if (reader.LocalName == "schema" && reader.NamespaceURI.StartsWith("http://www.w3.org/", StringComparison.Ordinal)) { throw ExceptionBuilder.DataSetUnsupportedSchema("http://www.w3.org/2001/XMLSchema"); } XmlElement xmlElement = xmlDocument.CreateElement(reader.Prefix, reader.LocalName, reader.NamespaceURI); if (reader.HasAttributes) { int attributeCount = reader.AttributeCount; for (int i = 0; i < attributeCount; i++) { reader.MoveToAttribute(i); if (reader.NamespaceURI.Equals("http://www.w3.org/2000/xmlns/")) { xmlElement.SetAttribute(reader.Name, reader.GetAttribute(i)); continue; } XmlAttribute xmlAttribute = xmlElement.SetAttributeNode(reader.LocalName, reader.NamespaceURI); xmlAttribute.Prefix = reader.Prefix; xmlAttribute.Value = reader.GetAttribute(i); } } reader.Read(); string value = reader.Value; while (MoveToElement(reader, depth)) { if (reader.LocalName == "diffgram" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-diffgram-v1") { ReadXmlDiffgram(reader); result = XmlReadMode.DiffGram; } if (!flag2 && !flag && reader.LocalName == "Schema" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-data") { ReadXDRSchema(reader); flag2 = true; isXdr = true; continue; } if (reader.LocalName == "schema" && reader.NamespaceURI == "http://www.w3.org/2001/XMLSchema") { ReadXSDSchema(reader, denyResolving); flag2 = true; continue; } if (reader.LocalName == "schema" && reader.NamespaceURI.StartsWith("http://www.w3.org/", StringComparison.Ordinal)) { throw ExceptionBuilder.DataSetUnsupportedSchema("http://www.w3.org/2001/XMLSchema"); } if (reader.LocalName == "diffgram" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-diffgram-v1") { ReadXmlDiffgram(reader); flag3 = true; result = XmlReadMode.DiffGram; continue; } while (!reader.EOF && reader.NodeType == XmlNodeType.Whitespace) { reader.Read(); } if (reader.NodeType != XmlNodeType.Element) { continue; } flag = true; if (!flag2 && Tables.Count == 0) { XmlNode newChild = xmlDocument.ReadNode(reader); xmlElement.AppendChild(newChild); continue; } if (xmlDataLoader == null) { xmlDataLoader = new XmlDataLoader(this, isXdr, xmlElement, ignoreSchema: false); } xmlDataLoader.LoadData(reader); flag5 = true; result = (flag2 ? XmlReadMode.ReadSchema : XmlReadMode.IgnoreSchema); } ReadEndElement(reader); bool flag6 = false; bool fTopLevelTable = _fTopLevelTable; if (!flag2 && Tables.Count == 0 && !xmlElement.HasChildNodes) { _fTopLevelTable = true; flag6 = true; if (value != null && value.Length > 0) { xmlElement.InnerText = value; } } if (!flag4 && value != null && value.Length > 0) { xmlElement.InnerText = value; } xmlDocument.AppendChild(xmlElement); if (xmlDataLoader == null) { xmlDataLoader = new XmlDataLoader(this, isXdr, xmlElement, ignoreSchema: false); } if (!flag4 && !flag5) { XmlElement documentElement = xmlDocument.DocumentElement; if (documentElement.ChildNodes.Count == 0 || (documentElement.ChildNodes.Count == 1 && documentElement.FirstChild.GetType() == typeof(XmlText))) { bool fTopLevelTable2 = _fTopLevelTable; if (DataSetName != documentElement.Name && _namespaceURI != documentElement.NamespaceURI && Tables.Contains(documentElement.Name, (documentElement.NamespaceURI.Length == 0) ? null : documentElement.NamespaceURI, checkProperty: false, caseSensitive: true)) { _fTopLevelTable = true; } try { xmlDataLoader.LoadData(xmlDocument); } finally { _fTopLevelTable = fTopLevelTable2; } } } if (!flag3) { if (!flag2 && Tables.Count == 0) { InferSchema(xmlDocument, null, XmlReadMode.Auto); result = XmlReadMode.InferSchema; xmlDataLoader.FromInference = true; try { xmlDataLoader.LoadData(xmlDocument); } finally { xmlDataLoader.FromInference = false; } } if (flag6) { _fTopLevelTable = fTopLevelTable; } } } return result; } finally { } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public XmlReadMode ReadXml(Stream stream) { if (stream == null) { return XmlReadMode.Auto; } XmlTextReader xmlTextReader = new XmlTextReader(stream); xmlTextReader.XmlResolver = null; return ReadXml(xmlTextReader, denyResolving: false); } public XmlReadMode ReadXml(TextReader reader) { if (reader == null) { return XmlReadMode.Auto; } XmlTextReader xmlTextReader = new XmlTextReader(reader); xmlTextReader.XmlResolver = null; return ReadXml(xmlTextReader, denyResolving: false); } public XmlReadMode ReadXml(string fileName) { XmlTextReader xmlTextReader = new XmlTextReader(fileName); xmlTextReader.XmlResolver = null; try { return ReadXml(xmlTextReader, denyResolving: false); } finally { xmlTextReader.Close(); } } internal void InferSchema(XmlDocument xdoc, string[] excludedNamespaces, XmlReadMode mode) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, mode={1}", ObjectID, mode); try { _ = xdoc.DocumentElement.NamespaceURI; if (excludedNamespaces == null) { excludedNamespaces = Array.Empty(); } XmlNodeReader instanceDocument = new XmlIgnoreNamespaceReader(xdoc, excludedNamespaces); XmlSchemaSet xmlSchemaSet = new XmlSchemaInference { Occurrence = XmlSchemaInference.InferenceOption.Relaxed, TypeInference = ((mode != XmlReadMode.InferTypedSchema) ? XmlSchemaInference.InferenceOption.Relaxed : XmlSchemaInference.InferenceOption.Restricted) }.InferSchema(instanceDocument); xmlSchemaSet.Compile(); XSDSchema xSDSchema = new XSDSchema(); xSDSchema.FromInference = true; try { xSDSchema.LoadSchema(xmlSchemaSet, this); } finally { xSDSchema.FromInference = false; } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } private bool IsEmpty() { foreach (DataTable table in Tables) { if (table.Rows.Count > 0) { return false; } } return true; } private void ReadXmlDiffgram(XmlReader reader) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { int depth = reader.Depth; bool enforceConstraints = EnforceConstraints; EnforceConstraints = false; bool flag = IsEmpty(); DataSet dataSet; if (flag) { dataSet = this; } else { dataSet = Clone(); dataSet.EnforceConstraints = false; } foreach (DataTable table in dataSet.Tables) { table.Rows._nullInList = 0; } reader.MoveToContent(); if (reader.LocalName != "diffgram" && reader.NamespaceURI != "urn:schemas-microsoft-com:xml-diffgram-v1") { return; } reader.Read(); if (reader.NodeType == XmlNodeType.Whitespace) { MoveToElement(reader, reader.Depth - 1); } dataSet._fInLoadDiffgram = true; if (reader.Depth > depth) { if (reader.NamespaceURI != "urn:schemas-microsoft-com:xml-diffgram-v1" && reader.NamespaceURI != "urn:schemas-microsoft-com:xml-msdata") { XmlElement topNode = new XmlDocument().CreateElement(reader.Prefix, reader.LocalName, reader.NamespaceURI); reader.Read(); if (reader.NodeType == XmlNodeType.Whitespace) { MoveToElement(reader, reader.Depth - 1); } if (reader.Depth - 1 > depth) { XmlDataLoader xmlDataLoader = new XmlDataLoader(dataSet, IsXdr: false, topNode, ignoreSchema: false); xmlDataLoader._isDiffgram = true; xmlDataLoader.LoadData(reader); } ReadEndElement(reader); if (reader.NodeType == XmlNodeType.Whitespace) { MoveToElement(reader, reader.Depth - 1); } } if ((reader.LocalName == "before" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-diffgram-v1") || (reader.LocalName == "errors" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-diffgram-v1")) { new XMLDiffLoader().LoadDiffGram(dataSet, reader); } while (reader.Depth > depth) { reader.Read(); } ReadEndElement(reader); } foreach (DataTable table2 in dataSet.Tables) { if (table2.Rows._nullInList > 0) { throw ExceptionBuilder.RowInsertMissing(table2.TableName); } } dataSet._fInLoadDiffgram = false; foreach (DataTable table3 in dataSet.Tables) { DataRelation[] nestedParentRelations = table3.NestedParentRelations; DataRelation[] array = nestedParentRelations; for (int i = 0; i < array.Length; i++) { if (array[i].ParentTable != table3) { continue; } foreach (DataRow row in table3.Rows) { DataRelation[] array2 = nestedParentRelations; foreach (DataRelation rel in array2) { row.CheckForLoops(rel); } } } } if (!flag) { Merge(dataSet); if (_dataSetName == "NewDataSet") { _dataSetName = dataSet._dataSetName; } dataSet.EnforceConstraints = enforceConstraints; } EnforceConstraints = enforceConstraints; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public XmlReadMode ReadXml(XmlReader reader, XmlReadMode mode) { return ReadXml(reader, mode, denyResolving: false); } internal XmlReadMode ReadXml(XmlReader reader, XmlReadMode mode, bool denyResolving) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, mode={1}, denyResolving={2}", ObjectID, mode, denyResolving); try { XmlReadMode result = mode; if (reader == null) { return result; } if (mode == XmlReadMode.Auto) { return ReadXml(reader); } DataTable.DSRowDiffIdUsageSection dSRowDiffIdUsageSection = default(DataTable.DSRowDiffIdUsageSection); try { bool flag = false; bool flag2 = false; bool isXdr = false; int depth = -1; dSRowDiffIdUsageSection.Prepare(this); if (reader is XmlTextReader) { ((XmlTextReader)reader).WhitespaceHandling = WhitespaceHandling.Significant; } XmlDocument xmlDocument = new XmlDocument(); if (mode != XmlReadMode.Fragment && reader.NodeType == XmlNodeType.Element) { depth = reader.Depth; } reader.MoveToContent(); XmlDataLoader xmlDataLoader = null; if (reader.NodeType == XmlNodeType.Element) { XmlElement xmlElement = null; if (mode == XmlReadMode.Fragment) { xmlDocument.AppendChild(xmlDocument.CreateElement("ds_sqlXmlWraPPeR")); xmlElement = xmlDocument.DocumentElement; } else { if (reader.LocalName == "diffgram" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-diffgram-v1") { if (mode == XmlReadMode.DiffGram || mode == XmlReadMode.IgnoreSchema) { ReadXmlDiffgram(reader); ReadEndElement(reader); } else { reader.Skip(); } return result; } if (reader.LocalName == "Schema" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-data") { if (mode != XmlReadMode.IgnoreSchema && mode != XmlReadMode.InferSchema && mode != XmlReadMode.InferTypedSchema) { ReadXDRSchema(reader); } else { reader.Skip(); } return result; } if (reader.LocalName == "schema" && reader.NamespaceURI == "http://www.w3.org/2001/XMLSchema") { if (mode != XmlReadMode.IgnoreSchema && mode != XmlReadMode.InferSchema && mode != XmlReadMode.InferTypedSchema) { ReadXSDSchema(reader, denyResolving); } else { reader.Skip(); } return result; } if (reader.LocalName == "schema" && reader.NamespaceURI.StartsWith("http://www.w3.org/", StringComparison.Ordinal)) { throw ExceptionBuilder.DataSetUnsupportedSchema("http://www.w3.org/2001/XMLSchema"); } xmlElement = xmlDocument.CreateElement(reader.Prefix, reader.LocalName, reader.NamespaceURI); if (reader.HasAttributes) { int attributeCount = reader.AttributeCount; for (int i = 0; i < attributeCount; i++) { reader.MoveToAttribute(i); if (reader.NamespaceURI.Equals("http://www.w3.org/2000/xmlns/")) { xmlElement.SetAttribute(reader.Name, reader.GetAttribute(i)); continue; } XmlAttribute xmlAttribute = xmlElement.SetAttributeNode(reader.LocalName, reader.NamespaceURI); xmlAttribute.Prefix = reader.Prefix; xmlAttribute.Value = reader.GetAttribute(i); } } reader.Read(); } while (MoveToElement(reader, depth)) { if (reader.LocalName == "Schema" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-data") { if (!flag && !flag2 && mode != XmlReadMode.IgnoreSchema && mode != XmlReadMode.InferSchema && mode != XmlReadMode.InferTypedSchema) { ReadXDRSchema(reader); flag = true; isXdr = true; } else { reader.Skip(); } continue; } if (reader.LocalName == "schema" && reader.NamespaceURI == "http://www.w3.org/2001/XMLSchema") { if (mode != XmlReadMode.IgnoreSchema && mode != XmlReadMode.InferSchema && mode != XmlReadMode.InferTypedSchema) { ReadXSDSchema(reader, denyResolving); flag = true; } else { reader.Skip(); } continue; } if (reader.LocalName == "diffgram" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-diffgram-v1") { if (mode == XmlReadMode.DiffGram || mode == XmlReadMode.IgnoreSchema) { ReadXmlDiffgram(reader); result = XmlReadMode.DiffGram; } else { reader.Skip(); } continue; } if (reader.LocalName == "schema" && reader.NamespaceURI.StartsWith("http://www.w3.org/", StringComparison.Ordinal)) { throw ExceptionBuilder.DataSetUnsupportedSchema("http://www.w3.org/2001/XMLSchema"); } if (mode == XmlReadMode.DiffGram) { reader.Skip(); continue; } flag2 = true; if (mode == XmlReadMode.InferSchema || mode == XmlReadMode.InferTypedSchema) { XmlNode newChild = xmlDocument.ReadNode(reader); xmlElement.AppendChild(newChild); continue; } if (xmlDataLoader == null) { xmlDataLoader = new XmlDataLoader(this, isXdr, xmlElement, mode == XmlReadMode.IgnoreSchema); } xmlDataLoader.LoadData(reader); } ReadEndElement(reader); xmlDocument.AppendChild(xmlElement); if (xmlDataLoader == null) { xmlDataLoader = new XmlDataLoader(this, isXdr, mode == XmlReadMode.IgnoreSchema); } switch (mode) { case XmlReadMode.DiffGram: return result; case XmlReadMode.InferSchema: case XmlReadMode.InferTypedSchema: InferSchema(xmlDocument, null, mode); result = XmlReadMode.InferSchema; xmlDataLoader.FromInference = true; try { xmlDataLoader.LoadData(xmlDocument); } finally { xmlDataLoader.FromInference = false; } break; } } return result; } finally { } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public XmlReadMode ReadXml(Stream stream, XmlReadMode mode) { if (stream == null) { return XmlReadMode.Auto; } XmlTextReader xmlTextReader = ((mode == XmlReadMode.Fragment) ? new XmlTextReader(stream, XmlNodeType.Element, null) : new XmlTextReader(stream)); xmlTextReader.XmlResolver = null; return ReadXml(xmlTextReader, mode, denyResolving: false); } public XmlReadMode ReadXml(TextReader reader, XmlReadMode mode) { if (reader == null) { return XmlReadMode.Auto; } XmlTextReader xmlTextReader = ((mode == XmlReadMode.Fragment) ? new XmlTextReader(reader.ReadToEnd(), XmlNodeType.Element, null) : new XmlTextReader(reader)); xmlTextReader.XmlResolver = null; return ReadXml(xmlTextReader, mode, denyResolving: false); } public XmlReadMode ReadXml(string fileName, XmlReadMode mode) { XmlTextReader xmlTextReader = null; xmlTextReader = ((mode != XmlReadMode.Fragment) ? new XmlTextReader(fileName) : new XmlTextReader(new FileStream(fileName, FileMode.Open), XmlNodeType.Element, null)); xmlTextReader.XmlResolver = null; try { return ReadXml(xmlTextReader, mode, denyResolving: false); } finally { xmlTextReader.Close(); } } public void WriteXml(Stream stream) { WriteXml(stream, XmlWriteMode.IgnoreSchema); } public void WriteXml(TextWriter writer) { WriteXml(writer, XmlWriteMode.IgnoreSchema); } public void WriteXml(XmlWriter writer) { WriteXml(writer, XmlWriteMode.IgnoreSchema); } public void WriteXml(string fileName) { WriteXml(fileName, XmlWriteMode.IgnoreSchema); } public void WriteXml(Stream stream, XmlWriteMode mode) { if (stream != null) { XmlTextWriter xmlTextWriter = new XmlTextWriter(stream, null); xmlTextWriter.Formatting = Formatting.Indented; WriteXml(xmlTextWriter, mode); } } public void WriteXml(TextWriter writer, XmlWriteMode mode) { if (writer != null) { XmlTextWriter xmlTextWriter = new XmlTextWriter(writer); xmlTextWriter.Formatting = Formatting.Indented; WriteXml(xmlTextWriter, mode); } } public void WriteXml(XmlWriter writer, XmlWriteMode mode) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, mode={1}", ObjectID, mode); try { if (writer != null) { if (mode == XmlWriteMode.DiffGram) { new NewDiffgramGen(this).Save(writer); } else { new XmlDataTreeWriter(this).Save(writer, mode == XmlWriteMode.WriteSchema); } } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public void WriteXml(string fileName, XmlWriteMode mode) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, fileName='{1}', mode={2}", ObjectID, fileName, (int)mode); XmlTextWriter xmlTextWriter = new XmlTextWriter(fileName, null); try { xmlTextWriter.Formatting = Formatting.Indented; xmlTextWriter.WriteStartDocument(standalone: true); if (xmlTextWriter != null) { if (mode == XmlWriteMode.DiffGram) { new NewDiffgramGen(this).Save(xmlTextWriter); } else { new XmlDataTreeWriter(this).Save(xmlTextWriter, mode == XmlWriteMode.WriteSchema); } } xmlTextWriter.WriteEndDocument(); } finally { xmlTextWriter.Close(); DataCommonEventSource.Log.ExitScope(scopeId); } } internal DataRelationCollection GetParentRelations(DataTable table) { return table.ParentRelations; } public void Merge(DataSet dataSet) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, dataSet={1}", ObjectID, dataSet?.ObjectID ?? 0); try { Merge(dataSet, preserveChanges: false, MissingSchemaAction.Add); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public void Merge(DataSet dataSet, bool preserveChanges) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, dataSet={1}, preserveChanges={2}", ObjectID, dataSet?.ObjectID ?? 0, preserveChanges); try { Merge(dataSet, preserveChanges, MissingSchemaAction.Add); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public void Merge(DataSet dataSet, bool preserveChanges, MissingSchemaAction missingSchemaAction) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, dataSet={1}, preserveChanges={2}, missingSchemaAction={3}", ObjectID, dataSet?.ObjectID ?? 0, preserveChanges, missingSchemaAction); try { if (dataSet == null) { throw ExceptionBuilder.ArgumentNull("dataSet"); } if ((uint)(missingSchemaAction - 1) <= 3u) { new Merger(this, preserveChanges, missingSchemaAction).MergeDataSet(dataSet); return; } throw ADP.InvalidMissingSchemaAction(missingSchemaAction); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public void Merge(DataTable table) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, table={1}", ObjectID, table?.ObjectID ?? 0); try { Merge(table, preserveChanges: false, MissingSchemaAction.Add); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public void Merge(DataTable table, bool preserveChanges, MissingSchemaAction missingSchemaAction) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, table={1}, preserveChanges={2}, missingSchemaAction={3}", ObjectID, table?.ObjectID ?? 0, preserveChanges, missingSchemaAction); try { if (table == null) { throw ExceptionBuilder.ArgumentNull("table"); } if ((uint)(missingSchemaAction - 1) <= 3u) { new Merger(this, preserveChanges, missingSchemaAction).MergeTable(table); return; } throw ADP.InvalidMissingSchemaAction(missingSchemaAction); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public void Merge(DataRow[] rows) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, rows", ObjectID); try { Merge(rows, preserveChanges: false, MissingSchemaAction.Add); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public void Merge(DataRow[] rows, bool preserveChanges, MissingSchemaAction missingSchemaAction) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, preserveChanges={1}, missingSchemaAction={2}", ObjectID, preserveChanges, missingSchemaAction); try { if (rows == null) { throw ExceptionBuilder.ArgumentNull("rows"); } if ((uint)(missingSchemaAction - 1) <= 3u) { new Merger(this, preserveChanges, missingSchemaAction).MergeRows(rows); return; } throw ADP.InvalidMissingSchemaAction(missingSchemaAction); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } protected virtual void OnPropertyChanging(PropertyChangedEventArgs pcevent) { this.PropertyChanging?.Invoke(this, pcevent); } internal void OnMergeFailed(MergeFailedEventArgs mfevent) { if (this.MergeFailed != null) { this.MergeFailed(this, mfevent); return; } throw ExceptionBuilder.MergeFailed(mfevent.Conflict); } internal void RaiseMergeFailed(DataTable table, string conflict, MissingSchemaAction missingSchemaAction) { if (MissingSchemaAction.Error == missingSchemaAction) { throw ExceptionBuilder.MergeFailed(conflict); } OnMergeFailed(new MergeFailedEventArgs(table, conflict)); } internal void OnDataRowCreated(DataRow row) { this.DataRowCreated?.Invoke(this, row); } internal void OnClearFunctionCalled(DataTable table) { this.ClearFunctionCalled?.Invoke(this, table); } private void OnInitialized() { this.Initialized?.Invoke(this, EventArgs.Empty); } protected internal virtual void OnRemoveTable(DataTable table) { } internal void OnRemovedTable(DataTable table) { _defaultViewManager?.DataViewSettings.Remove(table); } protected virtual void OnRemoveRelation(DataRelation relation) { } internal void OnRemoveRelationHack(DataRelation relation) { OnRemoveRelation(relation); } protected internal void RaisePropertyChanging(string name) { OnPropertyChanging(new PropertyChangedEventArgs(name)); } internal DataTable[] TopLevelTables() { return TopLevelTables(forSchema: false); } internal DataTable[] TopLevelTables(bool forSchema) { List list = new List(); if (forSchema) { for (int i = 0; i < Tables.Count; i++) { DataTable dataTable = Tables[i]; if (dataTable.NestedParentsCount > 1 || dataTable.SelfNested) { list.Add(dataTable); } } } for (int j = 0; j < Tables.Count; j++) { DataTable dataTable2 = Tables[j]; if (dataTable2.NestedParentsCount == 0 && !list.Contains(dataTable2)) { list.Add(dataTable2); } } if (list.Count != 0) { return list.ToArray(); } return Array.Empty(); } public virtual void RejectChanges() { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { bool enforceConstraints = EnforceConstraints; EnforceConstraints = false; for (int i = 0; i < Tables.Count; i++) { Tables[i].RejectChanges(); } EnforceConstraints = enforceConstraints; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public virtual void Reset() { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { for (int i = 0; i < Tables.Count; i++) { ConstraintCollection constraints = Tables[i].Constraints; int num = 0; while (num < constraints.Count) { if (constraints[num] is ForeignKeyConstraint) { constraints.Remove(constraints[num]); } else { num++; } } } Clear(); Relations.Clear(); Tables.Clear(); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } internal bool ValidateCaseConstraint() { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { DataRelation dataRelation = null; for (int i = 0; i < Relations.Count; i++) { dataRelation = Relations[i]; if (dataRelation.ChildTable.CaseSensitive != dataRelation.ParentTable.CaseSensitive) { return false; } } ForeignKeyConstraint foreignKeyConstraint = null; ConstraintCollection constraintCollection = null; for (int j = 0; j < Tables.Count; j++) { constraintCollection = Tables[j].Constraints; for (int k = 0; k < constraintCollection.Count; k++) { if (constraintCollection[k] is ForeignKeyConstraint) { foreignKeyConstraint = (ForeignKeyConstraint)constraintCollection[k]; if (foreignKeyConstraint.Table.CaseSensitive != foreignKeyConstraint.RelatedTable.CaseSensitive) { return false; } } } } return true; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } internal bool ValidateLocaleConstraint() { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { DataRelation dataRelation = null; for (int i = 0; i < Relations.Count; i++) { dataRelation = Relations[i]; if (dataRelation.ChildTable.Locale.LCID != dataRelation.ParentTable.Locale.LCID) { return false; } } ForeignKeyConstraint foreignKeyConstraint = null; ConstraintCollection constraintCollection = null; for (int j = 0; j < Tables.Count; j++) { constraintCollection = Tables[j].Constraints; for (int k = 0; k < constraintCollection.Count; k++) { if (constraintCollection[k] is ForeignKeyConstraint) { foreignKeyConstraint = (ForeignKeyConstraint)constraintCollection[k]; if (foreignKeyConstraint.Table.Locale.LCID != foreignKeyConstraint.RelatedTable.Locale.LCID) { return false; } } } } return true; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } internal DataTable FindTable(DataTable baseTable, PropertyDescriptor[] props, int propStart) { if (props.Length < propStart + 1) { return baseTable; } PropertyDescriptor propertyDescriptor = props[propStart]; if (baseTable == null) { if (propertyDescriptor is DataTablePropertyDescriptor) { return FindTable(((DataTablePropertyDescriptor)propertyDescriptor).Table, props, propStart + 1); } return null; } if (propertyDescriptor is DataRelationPropertyDescriptor) { return FindTable(((DataRelationPropertyDescriptor)propertyDescriptor).Relation.ChildTable, props, propStart + 1); } return null; } protected virtual void ReadXmlSerializable(XmlReader reader) { _useDataSetSchemaOnly = false; _udtIsWrapped = false; if (reader.HasAttributes) { if (reader.MoveToAttribute("xsi:nil") && string.Equals(reader.GetAttribute("xsi:nil"), "true", StringComparison.Ordinal)) { MoveToElement(reader, 1); return; } if (reader.MoveToAttribute("msdata:UseDataSetSchemaOnly")) { string attribute = reader.GetAttribute("msdata:UseDataSetSchemaOnly"); if (string.Equals(attribute, "true", StringComparison.Ordinal) || string.Equals(attribute, "1", StringComparison.Ordinal)) { _useDataSetSchemaOnly = true; } else if (!string.Equals(attribute, "false", StringComparison.Ordinal) && !string.Equals(attribute, "0", StringComparison.Ordinal)) { throw ExceptionBuilder.InvalidAttributeValue("UseDataSetSchemaOnly", attribute); } } if (reader.MoveToAttribute("msdata:UDTColumnValueWrapped")) { string attribute2 = reader.GetAttribute("msdata:UDTColumnValueWrapped"); if (string.Equals(attribute2, "true", StringComparison.Ordinal) || string.Equals(attribute2, "1", StringComparison.Ordinal)) { _udtIsWrapped = true; } else if (!string.Equals(attribute2, "false", StringComparison.Ordinal) && !string.Equals(attribute2, "0", StringComparison.Ordinal)) { throw ExceptionBuilder.InvalidAttributeValue("UDTColumnValueWrapped", attribute2); } } } ReadXml(reader, XmlReadMode.DiffGram, denyResolving: true); } protected virtual XmlSchema GetSchemaSerializable() { return null; } public static XmlSchemaComplexType GetDataSetSchema(XmlSchemaSet schemaSet) { if (s_schemaTypeForWSDL == null) { XmlSchemaComplexType xmlSchemaComplexType = new XmlSchemaComplexType(); XmlSchemaSequence xmlSchemaSequence = new XmlSchemaSequence(); XmlSchemaAny item = new XmlSchemaAny { Namespace = "http://www.w3.org/2001/XMLSchema", MinOccurs = 0m, ProcessContents = XmlSchemaContentProcessing.Lax }; xmlSchemaSequence.Items.Add(item); item = new XmlSchemaAny { Namespace = "urn:schemas-microsoft-com:xml-diffgram-v1", MinOccurs = 0m, ProcessContents = XmlSchemaContentProcessing.Lax }; xmlSchemaSequence.Items.Add(item); xmlSchemaSequence.MaxOccurs = decimal.MaxValue; xmlSchemaComplexType.Particle = xmlSchemaSequence; s_schemaTypeForWSDL = xmlSchemaComplexType; } return s_schemaTypeForWSDL; } private static bool PublishLegacyWSDL() { return false; } XmlSchema IXmlSerializable.GetSchema() { if (GetType() == typeof(DataSet)) { return null; } MemoryStream memoryStream = new MemoryStream(); XmlWriter xmlWriter = new XmlTextWriter(memoryStream, null); if (xmlWriter != null) { new XmlTreeGen(SchemaFormat.WebService).Save(this, xmlWriter); } memoryStream.Position = 0L; return XmlSchema.Read(new XmlTextReader(memoryStream), null); } void IXmlSerializable.ReadXml(XmlReader reader) { bool flag = true; XmlTextReader xmlTextReader = null; IXmlTextParser xmlTextParser = reader as IXmlTextParser; if (xmlTextParser != null) { flag = xmlTextParser.Normalized; xmlTextParser.Normalized = false; } else { xmlTextReader = reader as XmlTextReader; if (xmlTextReader != null) { flag = xmlTextReader.Normalization; xmlTextReader.Normalization = false; } } ReadXmlSerializable(reader); if (xmlTextParser != null) { xmlTextParser.Normalized = flag; } else if (xmlTextReader != null) { xmlTextReader.Normalization = flag; } } void IXmlSerializable.WriteXml(XmlWriter writer) { WriteXmlSchema(writer, SchemaFormat.WebService, null); WriteXml(writer, XmlWriteMode.DiffGram); } public virtual void Load(IDataReader reader, LoadOption loadOption, FillErrorEventHandler errorHandler, params DataTable[] tables) { long scopeId = DataCommonEventSource.Log.EnterScope(" reader, loadOption={0}", loadOption); try { foreach (DataTable dataTable in tables) { ADP.CheckArgumentNull(dataTable, "tables"); if (dataTable.DataSet != this) { throw ExceptionBuilder.TableNotInTheDataSet(dataTable.TableName); } } LoadAdapter loadAdapter = new LoadAdapter(); loadAdapter.FillLoadOption = loadOption; loadAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; if (errorHandler != null) { loadAdapter.FillError += errorHandler; } loadAdapter.FillFromReader(tables, reader, 0, 0); if (!reader.IsClosed && !reader.NextResult()) { reader.Close(); } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public void Load(IDataReader reader, LoadOption loadOption, params DataTable[] tables) { Load(reader, loadOption, null, tables); } public void Load(IDataReader reader, LoadOption loadOption, params string[] tables) { ADP.CheckArgumentNull(tables, "tables"); DataTable[] array = new DataTable[tables.Length]; for (int i = 0; i < tables.Length; i++) { DataTable dataTable = Tables[tables[i]]; if (dataTable == null) { dataTable = new DataTable(tables[i]); Tables.Add(dataTable); } array[i] = dataTable; } Load(reader, loadOption, null, array); } public DataTableReader CreateDataReader() { if (Tables.Count == 0) { throw ExceptionBuilder.CannotCreateDataReaderOnEmptyDataSet(); } DataTable[] array = new DataTable[Tables.Count]; for (int i = 0; i < Tables.Count; i++) { array[i] = Tables[i]; } return CreateDataReader(array); } public DataTableReader CreateDataReader(params DataTable[] dataTables) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { if (dataTables.Length == 0) { throw ExceptionBuilder.DataTableReaderArgumentIsEmpty(); } for (int i = 0; i < dataTables.Length; i++) { if (dataTables[i] == null) { throw ExceptionBuilder.ArgumentContainsNullValue(); } } return new DataTableReader(dataTables); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } } public enum DataSetDateTime { Local = 1, Unspecified, UnspecifiedLocal, Utc } [Obsolete("DataSysDescriptionAttribute has been deprecated. http://go.microsoft.com/fwlink/?linkid=14202", false)] [AttributeUsage(AttributeTargets.All)] public class DataSysDescriptionAttribute : DescriptionAttribute { private bool _replaced; public override string Description { get { if (!_replaced) { _replaced = true; base.DescriptionValue = base.Description; } return base.Description; } } [Obsolete("DataSysDescriptionAttribute has been deprecated. http://go.microsoft.com/fwlink/?linkid=14202", false)] public DataSysDescriptionAttribute(string description) : base(description) { } } [Serializable] [ToolboxItem(false)] [DesignTimeVisible(false)] [DefaultProperty("TableName")] [DefaultEvent("RowChanging")] [XmlSchemaProvider("GetDataTableSchema")] public class DataTable : MarshalByValueComponent, IListSource, ISupportInitializeNotification, ISupportInitialize, ISerializable, IXmlSerializable { internal struct RowDiffIdUsageSection { private DataTable _targetTable; internal void Prepare(DataTable table) { _targetTable = table; table._rowDiffId = null; } [Conditional("DEBUG")] internal void Cleanup() { if (_targetTable != null) { _targetTable._rowDiffId = null; } } [Conditional("DEBUG")] internal static void Assert(string message) { } } internal struct DSRowDiffIdUsageSection { private DataSet _targetDS; internal void Prepare(DataSet ds) { _targetDS = ds; for (int i = 0; i < ds.Tables.Count; i++) { ds.Tables[i]._rowDiffId = null; } } [Conditional("DEBUG")] internal void Cleanup() { if (_targetDS != null) { for (int i = 0; i < _targetDS.Tables.Count; i++) { _targetDS.Tables[i]._rowDiffId = null; } } } } private DataSet _dataSet; private DataView _defaultView; internal long _nextRowID; internal readonly DataRowCollection _rowCollection; internal readonly DataColumnCollection _columnCollection; private readonly ConstraintCollection _constraintCollection; private int _elementColumnCount; internal DataRelationCollection _parentRelationsCollection; internal DataRelationCollection _childRelationsCollection; internal readonly RecordManager _recordManager; internal readonly List _indexes; private List _shadowIndexes; private int _shadowCount; internal PropertyCollection _extendedProperties; private string _tableName = string.Empty; internal string _tableNamespace; private string _tablePrefix = string.Empty; internal DataExpression _displayExpression; internal bool _fNestedInDataset = true; private CultureInfo _culture; private bool _cultureUserSet; private CompareInfo _compareInfo; private CompareOptions _compareFlags = CompareOptions.IgnoreCase | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth; private IFormatProvider _formatProvider; private StringComparer _hashCodeProvider; private bool _caseSensitive; private bool _caseSensitiveUserSet; internal string _encodedTableName; internal DataColumn _xmlText; internal DataColumn _colUnique; internal bool _textOnly; internal decimal _minOccurs = 1m; internal decimal _maxOccurs = 1m; internal bool _repeatableElement; private object _typeName; internal UniqueConstraint _primaryKey; internal IndexField[] _primaryIndex = Array.Empty(); private DataColumn[] _delayedSetPrimaryKey; private Index _loadIndex; private Index _loadIndexwithOriginalAdded; private Index _loadIndexwithCurrentDeleted; private int _suspendIndexEvents; private bool _savedEnforceConstraints; private bool _inDataLoad; private bool _initialLoad; private bool _schemaLoading; private bool _enforceConstraints = true; internal bool _suspendEnforceConstraints; protected internal bool fInitInProgress; private bool _inLoad; internal bool _fInLoadDiffgram; private byte _isTypedDataTable; private DataRow[] _emptyDataRowArray; private PropertyDescriptorCollection _propertyDescriptorCollectionCache; private DataRelation[] _nestedParentRelations = Array.Empty(); internal List _dependentColumns; private bool _mergingData; private DataRowChangeEventHandler _onRowChangedDelegate; private DataRowChangeEventHandler _onRowChangingDelegate; private DataRowChangeEventHandler _onRowDeletingDelegate; private DataRowChangeEventHandler _onRowDeletedDelegate; private DataColumnChangeEventHandler _onColumnChangedDelegate; private DataColumnChangeEventHandler _onColumnChangingDelegate; private DataTableClearEventHandler _onTableClearingDelegate; private DataTableClearEventHandler _onTableClearedDelegate; private DataTableNewRowEventHandler _onTableNewRowDelegate; private PropertyChangedEventHandler _onPropertyChangingDelegate; private EventHandler _onInitialized; private readonly DataRowBuilder _rowBuilder; private const string KEY_XMLSCHEMA = "XmlSchema"; private const string KEY_XMLDIFFGRAM = "XmlDiffGram"; private const string KEY_NAME = "TableName"; internal readonly List _delayedViews = new List(); private readonly List _dataViewListeners = new List(); internal Hashtable _rowDiffId; internal readonly ReaderWriterLockSlim _indexesLock = new ReaderWriterLockSlim(); internal int _ukColumnPositionForInference = -1; private SerializationFormat _remotingFormat; private static int s_objectTypeCount; private readonly int _objectID = Interlocked.Increment(ref s_objectTypeCount); public bool CaseSensitive { get { return _caseSensitive; } set { if (_caseSensitive != value) { bool caseSensitive = _caseSensitive; bool caseSensitiveUserSet = _caseSensitiveUserSet; _caseSensitive = value; _caseSensitiveUserSet = true; if (DataSet != null && !DataSet.ValidateCaseConstraint()) { _caseSensitive = caseSensitive; _caseSensitiveUserSet = caseSensitiveUserSet; throw ExceptionBuilder.CannotChangeCaseLocale(); } SetCaseSensitiveValue(value, userSet: true, resetIndexes: true); } _caseSensitiveUserSet = true; } } internal bool AreIndexEventsSuspended => 0 < _suspendIndexEvents; [Browsable(false)] public bool IsInitialized => !fInitInProgress; private bool IsTypedDataTable { get { switch (_isTypedDataTable) { case 0: _isTypedDataTable = (byte)((GetType() != typeof(DataTable)) ? 1u : 2u); return 1 == _isTypedDataTable; case 1: return true; default: return false; } } } internal bool SelfNested { get { foreach (DataRelation parentRelation in ParentRelations) { if (parentRelation.Nested && parentRelation.ParentTable == this) { return true; } } return false; } } [DebuggerBrowsable(DebuggerBrowsableState.Never)] internal List LiveIndexes { get { if (!AreIndexEventsSuspended) { int num = _indexes.Count - 1; while (0 <= num) { Index index = _indexes[num]; if (index.RefCount <= 1) { index.RemoveRef(); } num--; } } return _indexes; } } [DefaultValue(SerializationFormat.Xml)] public SerializationFormat RemotingFormat { get { return _remotingFormat; } set { if (value != SerializationFormat.Binary && value != 0) { throw ExceptionBuilder.InvalidRemotingFormat(value); } if (DataSet != null && value != DataSet.RemotingFormat) { throw ExceptionBuilder.CanNotSetRemotingFormat(); } _remotingFormat = value; } } internal int UKColumnPositionForInference { get { return _ukColumnPositionForInference; } set { _ukColumnPositionForInference = value; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public DataRelationCollection ChildRelations => _childRelationsCollection ?? (_childRelationsCollection = new DataRelationCollection.DataTableRelationCollection(this, fParentCollection: false)); [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public DataColumnCollection Columns => _columnCollection; private CompareInfo CompareInfo => _compareInfo ?? (_compareInfo = Locale.CompareInfo); [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public ConstraintCollection Constraints => _constraintCollection; [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public DataSet DataSet => _dataSet; [Browsable(false)] public DataView DefaultView { get { DataView dataView = _defaultView; if (dataView == null) { if (_dataSet != null) { dataView = _dataSet.DefaultViewManager.CreateDataView(this); } else { dataView = new DataView(this, locked: true); dataView.SetIndex2("", DataViewRowState.CurrentRows, null, fireEvent: true); } dataView = Interlocked.CompareExchange(ref _defaultView, dataView, null); if (dataView == null) { dataView = _defaultView; } } return dataView; } } [DefaultValue("")] public string DisplayExpression { get { return DisplayExpressionInternal; } set { _displayExpression = ((!string.IsNullOrEmpty(value)) ? new DataExpression(this, value) : null); } } internal string DisplayExpressionInternal { get { if (_displayExpression == null) { return string.Empty; } return _displayExpression.Expression; } } internal bool EnforceConstraints { get { if (SuspendEnforceConstraints) { return false; } if (_dataSet != null) { return _dataSet.EnforceConstraints; } return _enforceConstraints; } set { if (_dataSet == null && _enforceConstraints != value) { if (value) { EnableConstraints(); } _enforceConstraints = value; } } } internal bool SuspendEnforceConstraints { get { return _suspendEnforceConstraints; } set { _suspendEnforceConstraints = value; } } [Browsable(false)] public PropertyCollection ExtendedProperties => _extendedProperties ?? (_extendedProperties = new PropertyCollection()); internal IFormatProvider FormatProvider { get { if (_formatProvider == null) { CultureInfo cultureInfo = Locale; if (cultureInfo.IsNeutralCulture) { cultureInfo = CultureInfo.InvariantCulture; } _formatProvider = cultureInfo; } return _formatProvider; } } [Browsable(false)] public bool HasErrors { get { for (int i = 0; i < Rows.Count; i++) { if (Rows[i].HasErrors) { return true; } } return false; } } public CultureInfo Locale { get { return _culture; } set { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { bool cultureUserSet = true; if (value == null) { cultureUserSet = false; value = ((_dataSet != null) ? _dataSet.Locale : _culture); } if (_culture != value && !_culture.Equals(value)) { bool flag = false; bool flag2 = false; CultureInfo culture = _culture; bool cultureUserSet2 = _cultureUserSet; try { _cultureUserSet = true; SetLocaleValue(value, userSet: true, resetIndexes: false); if (DataSet == null || DataSet.ValidateLocaleConstraint()) { flag = false; SetLocaleValue(value, userSet: true, resetIndexes: true); flag = true; } } catch { flag2 = true; throw; } finally { if (!flag) { try { SetLocaleValue(culture, userSet: true, resetIndexes: true); } catch (Exception e) when (ADP.IsCatchableExceptionType(e)) { ADP.TraceExceptionWithoutRethrow(e); } _cultureUserSet = cultureUserSet2; if (!flag2) { throw ExceptionBuilder.CannotChangeCaseLocale(null); } } } SetLocaleValue(value, userSet: true, resetIndexes: true); } _cultureUserSet = cultureUserSet; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } } [DefaultValue(50)] public int MinimumCapacity { get { return _recordManager.MinimumCapacity; } set { if (value != _recordManager.MinimumCapacity) { _recordManager.MinimumCapacity = value; } } } internal int RecordCapacity => _recordManager.RecordCapacity; internal int ElementColumnCount { get { return _elementColumnCount; } set { if (value > 0 && _xmlText != null) { throw ExceptionBuilder.TableCannotAddToSimpleContent(); } _elementColumnCount = value; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public DataRelationCollection ParentRelations => _parentRelationsCollection ?? (_parentRelationsCollection = new DataRelationCollection.DataTableRelationCollection(this, fParentCollection: true)); internal bool MergingData { get { return _mergingData; } set { _mergingData = value; } } internal DataRelation[] NestedParentRelations => _nestedParentRelations; internal bool SchemaLoading => _schemaLoading; internal int NestedParentsCount { get { int num = 0; foreach (DataRelation parentRelation in ParentRelations) { if (parentRelation.Nested) { num++; } } return num; } } [TypeConverter(typeof(PrimaryKeyTypeConverter))] public DataColumn[] PrimaryKey { get { UniqueConstraint primaryKey = _primaryKey; if (primaryKey != null) { return primaryKey.Key.ToArray(); } return Array.Empty(); } set { UniqueConstraint uniqueConstraint = null; UniqueConstraint uniqueConstraint2 = null; if (fInitInProgress && value != null) { _delayedSetPrimaryKey = value; return; } if (value != null && value.Length != 0) { int num = 0; for (int i = 0; i < value.Length && value[i] != null; i++) { num++; } if (num != 0) { DataColumn[] array = value; if (num != value.Length) { array = new DataColumn[num]; for (int j = 0; j < num; j++) { array[j] = value[j]; } } uniqueConstraint = new UniqueConstraint(array); if (uniqueConstraint.Table != this) { throw ExceptionBuilder.TableForeignPrimaryKey(); } } } if (uniqueConstraint == _primaryKey || (uniqueConstraint != null && uniqueConstraint.Equals(_primaryKey))) { return; } if ((uniqueConstraint2 = (UniqueConstraint)Constraints.FindConstraint(uniqueConstraint)) != null) { uniqueConstraint.ColumnsReference.CopyTo(uniqueConstraint2.Key.ColumnsReference, 0); uniqueConstraint = uniqueConstraint2; } UniqueConstraint primaryKey = _primaryKey; _primaryKey = null; if (primaryKey != null) { primaryKey.ConstraintIndex.RemoveRef(); if (_loadIndex != null) { _loadIndex.RemoveRef(); _loadIndex = null; } if (_loadIndexwithOriginalAdded != null) { _loadIndexwithOriginalAdded.RemoveRef(); _loadIndexwithOriginalAdded = null; } if (_loadIndexwithCurrentDeleted != null) { _loadIndexwithCurrentDeleted.RemoveRef(); _loadIndexwithCurrentDeleted = null; } Constraints.Remove(primaryKey); } if (uniqueConstraint != null && uniqueConstraint2 == null) { Constraints.Add(uniqueConstraint); } _primaryKey = uniqueConstraint; _primaryIndex = ((uniqueConstraint != null) ? uniqueConstraint.Key.GetIndexDesc() : Array.Empty()); if (_primaryKey != null) { uniqueConstraint.ConstraintIndex.AddRef(); for (int k = 0; k < uniqueConstraint.ColumnsReference.Length; k++) { uniqueConstraint.ColumnsReference[k].AllowDBNull = false; } } } } [Browsable(false)] public DataRowCollection Rows => _rowCollection; [RefreshProperties(RefreshProperties.All)] [DefaultValue("")] public string TableName { get { return _tableName; } set { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, value='{1}'", ObjectID, value); try { if (value == null) { value = string.Empty; } CultureInfo locale = Locale; if (string.Compare(_tableName, value, ignoreCase: true, locale) != 0) { if (_dataSet != null) { if (value.Length == 0) { throw ExceptionBuilder.NoTableName(); } if (string.Compare(value, _dataSet.DataSetName, ignoreCase: true, _dataSet.Locale) == 0 && !_fNestedInDataset) { throw ExceptionBuilder.DatasetConflictingName(_dataSet.DataSetName); } DataRelation[] nestedParentRelations = NestedParentRelations; if (nestedParentRelations.Length == 0) { _dataSet.Tables.RegisterName(value, Namespace); } else { DataRelation[] array = nestedParentRelations; for (int i = 0; i < array.Length; i++) { if (!array[i].ParentTable.Columns.CanRegisterName(value)) { throw ExceptionBuilder.CannotAddDuplicate2(value); } } _dataSet.Tables.RegisterName(value, Namespace); array = nestedParentRelations; foreach (DataRelation obj in array) { obj.ParentTable.Columns.RegisterColumnName(value, null); obj.ParentTable.Columns.UnregisterName(TableName); } } if (_tableName.Length != 0) { _dataSet.Tables.UnregisterName(_tableName); } } RaisePropertyChanging("TableName"); _tableName = value; _encodedTableName = null; } else if (string.Compare(_tableName, value, ignoreCase: false, locale) != 0) { RaisePropertyChanging("TableName"); _tableName = value; _encodedTableName = null; } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } } internal string EncodedTableName { get { string text = _encodedTableName; if (text == null) { text = (_encodedTableName = XmlConvert.EncodeLocalName(TableName)); } return text; } } public string Namespace { get { return _tableNamespace ?? GetInheritedNamespace(new List()); } set { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, value='{1}'", ObjectID, value); try { if (value != _tableNamespace) { if (_dataSet != null) { string text = ((value == null) ? GetInheritedNamespace(new List()) : value); if (text != Namespace) { if (_dataSet.Tables.Contains(TableName, text, checkProperty: true, caseSensitive: true)) { throw ExceptionBuilder.DuplicateTableName2(TableName, text); } CheckCascadingNamespaceConflict(text); } } CheckNamespaceValidityForNestedRelations(value); DoRaiseNamespaceChange(); } _tableNamespace = value; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } } [DefaultValue("")] public string Prefix { get { return _tablePrefix; } set { if (value == null) { value = string.Empty; } DataCommonEventSource.Log.Trace(" {0}, value='{1}'", ObjectID, value); if (XmlConvert.DecodeName(value) == value && XmlConvert.EncodeName(value) != value) { throw ExceptionBuilder.InvalidPrefix(value); } _tablePrefix = value; } } internal DataColumn XmlText { get { return _xmlText; } set { if (_xmlText == value) { return; } if (_xmlText != null) { if (value != null) { throw ExceptionBuilder.MultipleTextOnlyColumns(); } Columns.Remove(_xmlText); } else if (value != Columns[value.ColumnName]) { Columns.Add(value); } _xmlText = value; } } internal decimal MaxOccurs { get { return _maxOccurs; } set { _maxOccurs = value; } } internal decimal MinOccurs { get { return _minOccurs; } set { _minOccurs = value; } } [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public override ISite Site { get { return base.Site; } set { ISite site = Site; if (value == null && site != null) { IContainer container = site.Container; if (container != null) { for (int i = 0; i < Columns.Count; i++) { if (Columns[i].Site != null) { container.Remove(Columns[i]); } } } } base.Site = value; } } bool IListSource.ContainsListCollection => false; internal bool NeedColumnChangeEvents { get { if (!IsTypedDataTable && _onColumnChangingDelegate == null) { return _onColumnChangedDelegate != null; } return true; } } internal XmlQualifiedName TypeName { get { if (_typeName != null) { return (XmlQualifiedName)_typeName; } return XmlQualifiedName.Empty; } set { _typeName = value; } } internal Hashtable RowDiffId { get { if (_rowDiffId == null) { _rowDiffId = new Hashtable(); } return _rowDiffId; } } internal int ObjectID => _objectID; public event DataColumnChangeEventHandler ColumnChanging { add { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onColumnChangingDelegate = (DataColumnChangeEventHandler)Delegate.Combine(_onColumnChangingDelegate, value); } remove { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onColumnChangingDelegate = (DataColumnChangeEventHandler)Delegate.Remove(_onColumnChangingDelegate, value); } } public event DataColumnChangeEventHandler ColumnChanged { add { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onColumnChangedDelegate = (DataColumnChangeEventHandler)Delegate.Combine(_onColumnChangedDelegate, value); } remove { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onColumnChangedDelegate = (DataColumnChangeEventHandler)Delegate.Remove(_onColumnChangedDelegate, value); } } public event EventHandler Initialized { add { _onInitialized = (EventHandler)Delegate.Combine(_onInitialized, value); } remove { _onInitialized = (EventHandler)Delegate.Remove(_onInitialized, value); } } internal event PropertyChangedEventHandler PropertyChanging { add { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onPropertyChangingDelegate = (PropertyChangedEventHandler)Delegate.Combine(_onPropertyChangingDelegate, value); } remove { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onPropertyChangingDelegate = (PropertyChangedEventHandler)Delegate.Remove(_onPropertyChangingDelegate, value); } } public event DataRowChangeEventHandler RowChanged { add { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onRowChangedDelegate = (DataRowChangeEventHandler)Delegate.Combine(_onRowChangedDelegate, value); } remove { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onRowChangedDelegate = (DataRowChangeEventHandler)Delegate.Remove(_onRowChangedDelegate, value); } } public event DataRowChangeEventHandler RowChanging { add { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onRowChangingDelegate = (DataRowChangeEventHandler)Delegate.Combine(_onRowChangingDelegate, value); } remove { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onRowChangingDelegate = (DataRowChangeEventHandler)Delegate.Remove(_onRowChangingDelegate, value); } } public event DataRowChangeEventHandler RowDeleting { add { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onRowDeletingDelegate = (DataRowChangeEventHandler)Delegate.Combine(_onRowDeletingDelegate, value); } remove { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onRowDeletingDelegate = (DataRowChangeEventHandler)Delegate.Remove(_onRowDeletingDelegate, value); } } public event DataRowChangeEventHandler RowDeleted { add { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onRowDeletedDelegate = (DataRowChangeEventHandler)Delegate.Combine(_onRowDeletedDelegate, value); } remove { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onRowDeletedDelegate = (DataRowChangeEventHandler)Delegate.Remove(_onRowDeletedDelegate, value); } } public event DataTableClearEventHandler TableClearing { add { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onTableClearingDelegate = (DataTableClearEventHandler)Delegate.Combine(_onTableClearingDelegate, value); } remove { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onTableClearingDelegate = (DataTableClearEventHandler)Delegate.Remove(_onTableClearingDelegate, value); } } public event DataTableClearEventHandler TableCleared { add { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onTableClearedDelegate = (DataTableClearEventHandler)Delegate.Combine(_onTableClearedDelegate, value); } remove { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onTableClearedDelegate = (DataTableClearEventHandler)Delegate.Remove(_onTableClearedDelegate, value); } } public event DataTableNewRowEventHandler TableNewRow { add { _onTableNewRowDelegate = (DataTableNewRowEventHandler)Delegate.Combine(_onTableNewRowDelegate, value); } remove { _onTableNewRowDelegate = (DataTableNewRowEventHandler)Delegate.Remove(_onTableNewRowDelegate, value); } } public DataTable() { GC.SuppressFinalize(this); DataCommonEventSource.Log.Trace(" {0}", ObjectID); _nextRowID = 1L; _recordManager = new RecordManager(this); _culture = CultureInfo.CurrentCulture; _columnCollection = new DataColumnCollection(this); _constraintCollection = new ConstraintCollection(this); _rowCollection = new DataRowCollection(this); _indexes = new List(); _rowBuilder = new DataRowBuilder(this, -1); } public DataTable(string tableName) : this() { _tableName = ((tableName == null) ? "" : tableName); } public DataTable(string tableName, string tableNamespace) : this(tableName) { Namespace = tableNamespace; } protected DataTable(SerializationInfo info, StreamingContext context) : this() { bool isSingleTable = context.Context == null || Convert.ToBoolean(context.Context, CultureInfo.InvariantCulture); SerializationFormat remotingFormat = SerializationFormat.Xml; SerializationInfoEnumerator enumerator = info.GetEnumerator(); while (enumerator.MoveNext()) { string name = enumerator.Name; if (name == "DataTable.RemotingFormat") { remotingFormat = (SerializationFormat)enumerator.Value; } } DeserializeDataTable(info, context, isSingleTable, remotingFormat); } [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)] public virtual void GetObjectData(SerializationInfo info, StreamingContext context) { SerializationFormat remotingFormat = RemotingFormat; bool isSingleTable = context.Context == null || Convert.ToBoolean(context.Context, CultureInfo.InvariantCulture); SerializeDataTable(info, context, isSingleTable, remotingFormat); } private void SerializeDataTable(SerializationInfo info, StreamingContext context, bool isSingleTable, SerializationFormat remotingFormat) { info.AddValue("DataTable.RemotingVersion", new Version(2, 0)); if (remotingFormat != 0) { info.AddValue("DataTable.RemotingFormat", remotingFormat); } if (remotingFormat != 0) { SerializeTableSchema(info, context, isSingleTable); if (isSingleTable) { SerializeTableData(info, context, 0); } return; } string namespaceURI = string.Empty; bool flag = false; if (_dataSet == null) { DataSet dataSet = new DataSet("tmpDataSet"); dataSet.SetLocaleValue(_culture, _cultureUserSet); dataSet.CaseSensitive = CaseSensitive; dataSet._namespaceURI = Namespace; dataSet.Tables.Add(this); flag = true; } else { namespaceURI = DataSet.Namespace; DataSet._namespaceURI = Namespace; } info.AddValue("XmlSchema", _dataSet.GetXmlSchemaForRemoting(this)); info.AddValue("XmlDiffGram", _dataSet.GetRemotingDiffGram(this)); if (flag) { _dataSet.Tables.Remove(this); } else { _dataSet._namespaceURI = namespaceURI; } } internal void DeserializeDataTable(SerializationInfo info, StreamingContext context, bool isSingleTable, SerializationFormat remotingFormat) { if (remotingFormat != 0) { DeserializeTableSchema(info, context, isSingleTable); if (isSingleTable) { DeserializeTableData(info, context, 0); ResetIndexes(); } return; } string text = (string)info.GetValue("XmlSchema", typeof(string)); string text2 = (string)info.GetValue("XmlDiffGram", typeof(string)); if (text != null) { DataSet dataSet = new DataSet(); dataSet.ReadXmlSchema(new XmlTextReader(new StringReader(text))); DataTable dataTable = dataSet.Tables[0]; dataTable.CloneTo(this, null, skipExpressionColumns: false); Namespace = dataTable.Namespace; if (text2 != null) { dataSet.Tables.Remove(dataSet.Tables[0]); dataSet.Tables.Add(this); dataSet.ReadXml(new XmlTextReader(new StringReader(text2)), XmlReadMode.DiffGram); dataSet.Tables.Remove(this); } } } internal void SerializeTableSchema(SerializationInfo info, StreamingContext context, bool isSingleTable) { info.AddValue("DataTable.TableName", TableName); info.AddValue("DataTable.Namespace", Namespace); info.AddValue("DataTable.Prefix", Prefix); info.AddValue("DataTable.CaseSensitive", _caseSensitive); info.AddValue("DataTable.caseSensitiveAmbient", !_caseSensitiveUserSet); info.AddValue("DataTable.LocaleLCID", Locale.LCID); info.AddValue("DataTable.MinimumCapacity", _recordManager.MinimumCapacity); info.AddValue("DataTable.NestedInDataSet", _fNestedInDataset); info.AddValue("DataTable.TypeName", TypeName.ToString()); info.AddValue("DataTable.RepeatableElement", _repeatableElement); info.AddValue("DataTable.ExtendedProperties", ExtendedProperties); info.AddValue("DataTable.Columns.Count", Columns.Count); if (isSingleTable) { List list = new List(); list.Add(this); if (!CheckForClosureOnExpressionTables(list)) { throw ExceptionBuilder.CanNotRemoteDataTable(); } } IFormatProvider invariantCulture = CultureInfo.InvariantCulture; for (int i = 0; i < Columns.Count; i++) { info.AddValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.ColumnName", i), Columns[i].ColumnName); info.AddValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.Namespace", i), Columns[i]._columnUri); info.AddValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.Prefix", i), Columns[i].Prefix); info.AddValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.ColumnMapping", i), Columns[i].ColumnMapping); info.AddValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.AllowDBNull", i), Columns[i].AllowDBNull); info.AddValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.AutoIncrement", i), Columns[i].AutoIncrement); info.AddValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.AutoIncrementStep", i), Columns[i].AutoIncrementStep); info.AddValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.AutoIncrementSeed", i), Columns[i].AutoIncrementSeed); info.AddValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.Caption", i), Columns[i].Caption); info.AddValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.DefaultValue", i), Columns[i].DefaultValue); info.AddValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.ReadOnly", i), Columns[i].ReadOnly); info.AddValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.MaxLength", i), Columns[i].MaxLength); info.AddValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.DataType", i), Columns[i].DataType); info.AddValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.XmlDataType", i), Columns[i].XmlDataType); info.AddValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.SimpleType", i), Columns[i].SimpleType); info.AddValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.DateTimeMode", i), Columns[i].DateTimeMode); info.AddValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.AutoIncrementCurrent", i), Columns[i].AutoIncrementCurrent); if (isSingleTable) { info.AddValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.Expression", i), Columns[i].Expression); } info.AddValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.ExtendedProperties", i), Columns[i]._extendedProperties); } if (isSingleTable) { SerializeConstraints(info, context, 0, allConstraints: false); } } internal void DeserializeTableSchema(SerializationInfo info, StreamingContext context, bool isSingleTable) { _tableName = info.GetString("DataTable.TableName"); _tableNamespace = info.GetString("DataTable.Namespace"); _tablePrefix = info.GetString("DataTable.Prefix"); bool boolean = info.GetBoolean("DataTable.CaseSensitive"); SetCaseSensitiveValue(boolean, userSet: true, resetIndexes: false); _caseSensitiveUserSet = !info.GetBoolean("DataTable.caseSensitiveAmbient"); CultureInfo culture = new CultureInfo((int)info.GetValue("DataTable.LocaleLCID", typeof(int))); SetLocaleValue(culture, userSet: true, resetIndexes: false); _cultureUserSet = true; MinimumCapacity = info.GetInt32("DataTable.MinimumCapacity"); _fNestedInDataset = info.GetBoolean("DataTable.NestedInDataSet"); string @string = info.GetString("DataTable.TypeName"); _typeName = new XmlQualifiedName(@string); _repeatableElement = info.GetBoolean("DataTable.RepeatableElement"); _extendedProperties = (PropertyCollection)info.GetValue("DataTable.ExtendedProperties", typeof(PropertyCollection)); int @int = info.GetInt32("DataTable.Columns.Count"); string[] array = new string[@int]; IFormatProvider invariantCulture = CultureInfo.InvariantCulture; for (int i = 0; i < @int; i++) { DataColumn dataColumn = new DataColumn(); dataColumn.ColumnName = info.GetString(string.Format(invariantCulture, "DataTable.DataColumn_{0}.ColumnName", i)); dataColumn._columnUri = info.GetString(string.Format(invariantCulture, "DataTable.DataColumn_{0}.Namespace", i)); dataColumn.Prefix = info.GetString(string.Format(invariantCulture, "DataTable.DataColumn_{0}.Prefix", i)); dataColumn.DataType = (Type)info.GetValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.DataType", i), typeof(Type)); dataColumn.XmlDataType = (string)info.GetValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.XmlDataType", i), typeof(string)); dataColumn.SimpleType = (SimpleType)info.GetValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.SimpleType", i), typeof(SimpleType)); dataColumn.ColumnMapping = (MappingType)info.GetValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.ColumnMapping", i), typeof(MappingType)); dataColumn.DateTimeMode = (DataSetDateTime)info.GetValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.DateTimeMode", i), typeof(DataSetDateTime)); dataColumn.AllowDBNull = info.GetBoolean(string.Format(invariantCulture, "DataTable.DataColumn_{0}.AllowDBNull", i)); dataColumn.AutoIncrement = info.GetBoolean(string.Format(invariantCulture, "DataTable.DataColumn_{0}.AutoIncrement", i)); dataColumn.AutoIncrementStep = info.GetInt64(string.Format(invariantCulture, "DataTable.DataColumn_{0}.AutoIncrementStep", i)); dataColumn.AutoIncrementSeed = info.GetInt64(string.Format(invariantCulture, "DataTable.DataColumn_{0}.AutoIncrementSeed", i)); dataColumn.Caption = info.GetString(string.Format(invariantCulture, "DataTable.DataColumn_{0}.Caption", i)); dataColumn.DefaultValue = info.GetValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.DefaultValue", i), typeof(object)); dataColumn.ReadOnly = info.GetBoolean(string.Format(invariantCulture, "DataTable.DataColumn_{0}.ReadOnly", i)); dataColumn.MaxLength = info.GetInt32(string.Format(invariantCulture, "DataTable.DataColumn_{0}.MaxLength", i)); dataColumn.AutoIncrementCurrent = info.GetValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.AutoIncrementCurrent", i), typeof(object)); if (isSingleTable) { array[i] = info.GetString(string.Format(invariantCulture, "DataTable.DataColumn_{0}.Expression", i)); } dataColumn._extendedProperties = (PropertyCollection)info.GetValue(string.Format(invariantCulture, "DataTable.DataColumn_{0}.ExtendedProperties", i), typeof(PropertyCollection)); Columns.Add(dataColumn); } if (isSingleTable) { for (int j = 0; j < @int; j++) { if (array[j] != null) { Columns[j].Expression = array[j]; } } } if (isSingleTable) { DeserializeConstraints(info, context, 0, allConstraints: false); } } internal void SerializeConstraints(SerializationInfo info, StreamingContext context, int serIndex, bool allConstraints) { ArrayList arrayList = new ArrayList(); for (int i = 0; i < Constraints.Count; i++) { Constraint constraint = Constraints[i]; if (constraint is UniqueConstraint uniqueConstraint) { int[] array = new int[uniqueConstraint.Columns.Length]; for (int j = 0; j < array.Length; j++) { array[j] = uniqueConstraint.Columns[j].Ordinal; } ArrayList arrayList2 = new ArrayList(); arrayList2.Add("U"); arrayList2.Add(uniqueConstraint.ConstraintName); arrayList2.Add(array); arrayList2.Add(uniqueConstraint.IsPrimaryKey); arrayList2.Add(uniqueConstraint.ExtendedProperties); arrayList.Add(arrayList2); continue; } ForeignKeyConstraint foreignKeyConstraint = constraint as ForeignKeyConstraint; if (allConstraints || (foreignKeyConstraint.Table == this && foreignKeyConstraint.RelatedTable == this)) { int[] array2 = new int[foreignKeyConstraint.RelatedColumns.Length + 1]; array2[0] = (allConstraints ? DataSet.Tables.IndexOf(foreignKeyConstraint.RelatedTable) : 0); for (int k = 1; k < array2.Length; k++) { array2[k] = foreignKeyConstraint.RelatedColumns[k - 1].Ordinal; } int[] array3 = new int[foreignKeyConstraint.Columns.Length + 1]; array3[0] = (allConstraints ? DataSet.Tables.IndexOf(foreignKeyConstraint.Table) : 0); for (int l = 1; l < array3.Length; l++) { array3[l] = foreignKeyConstraint.Columns[l - 1].Ordinal; } ArrayList arrayList3 = new ArrayList(); arrayList3.Add("F"); arrayList3.Add(foreignKeyConstraint.ConstraintName); arrayList3.Add(array2); arrayList3.Add(array3); arrayList3.Add(new int[3] { (int)foreignKeyConstraint.AcceptRejectRule, (int)foreignKeyConstraint.UpdateRule, (int)foreignKeyConstraint.DeleteRule }); arrayList3.Add(foreignKeyConstraint.ExtendedProperties); arrayList.Add(arrayList3); } } info.AddValue(string.Format(CultureInfo.InvariantCulture, "DataTable_{0}.Constraints", serIndex), arrayList); } internal void DeserializeConstraints(SerializationInfo info, StreamingContext context, int serIndex, bool allConstraints) { foreach (ArrayList item in (ArrayList)info.GetValue(string.Format(CultureInfo.InvariantCulture, "DataTable_{0}.Constraints", serIndex), typeof(ArrayList))) { if (((string)item[0]).Equals("U")) { string name = (string)item[1]; int[] array = (int[])item[2]; bool isPrimaryKey = (bool)item[3]; PropertyCollection extendedProperties = (PropertyCollection)item[4]; DataColumn[] array2 = new DataColumn[array.Length]; for (int i = 0; i < array.Length; i++) { array2[i] = Columns[array[i]]; } UniqueConstraint uniqueConstraint = new UniqueConstraint(name, array2, isPrimaryKey); uniqueConstraint._extendedProperties = extendedProperties; Constraints.Add(uniqueConstraint); continue; } string constraintName = (string)item[1]; int[] array3 = (int[])item[2]; int[] array4 = (int[])item[3]; int[] array5 = (int[])item[4]; PropertyCollection extendedProperties2 = (PropertyCollection)item[5]; DataTable dataTable = ((!allConstraints) ? this : DataSet.Tables[array3[0]]); DataColumn[] array6 = new DataColumn[array3.Length - 1]; for (int j = 0; j < array6.Length; j++) { array6[j] = dataTable.Columns[array3[j + 1]]; } DataTable dataTable2 = ((!allConstraints) ? this : DataSet.Tables[array4[0]]); DataColumn[] array7 = new DataColumn[array4.Length - 1]; for (int k = 0; k < array7.Length; k++) { array7[k] = dataTable2.Columns[array4[k + 1]]; } ForeignKeyConstraint foreignKeyConstraint = new ForeignKeyConstraint(constraintName, array6, array7); foreignKeyConstraint.AcceptRejectRule = (AcceptRejectRule)array5[0]; foreignKeyConstraint.UpdateRule = (Rule)array5[1]; foreignKeyConstraint.DeleteRule = (Rule)array5[2]; foreignKeyConstraint._extendedProperties = extendedProperties2; Constraints.Add(foreignKeyConstraint, addUniqueWhenAddingForeign: false); } } internal void SerializeExpressionColumns(SerializationInfo info, StreamingContext context, int serIndex) { int count = Columns.Count; for (int i = 0; i < count; i++) { info.AddValue(string.Format(CultureInfo.InvariantCulture, "DataTable_{0}.DataColumn_{1}.Expression", serIndex, i), Columns[i].Expression); } } internal void DeserializeExpressionColumns(SerializationInfo info, StreamingContext context, int serIndex) { int count = Columns.Count; for (int i = 0; i < count; i++) { string @string = info.GetString(string.Format(CultureInfo.InvariantCulture, "DataTable_{0}.DataColumn_{1}.Expression", serIndex, i)); if (@string.Length != 0) { Columns[i].Expression = @string; } } } internal void SerializeTableData(SerializationInfo info, StreamingContext context, int serIndex) { int count = Columns.Count; int count2 = Rows.Count; int num = 0; int num2 = 0; BitArray bitArray = new BitArray(count2 * 3, defaultValue: false); for (int i = 0; i < count2; i++) { int num3 = i * 3; DataRow dataRow = Rows[i]; DataRowState rowState = dataRow.RowState; switch (rowState) { case DataRowState.Added: bitArray[num3 + 1] = true; break; case DataRowState.Modified: bitArray[num3] = true; num++; break; case DataRowState.Deleted: bitArray[num3] = true; bitArray[num3 + 1] = true; break; default: throw ExceptionBuilder.InvalidRowState(rowState); case DataRowState.Unchanged: break; } if (-1 != dataRow._tempRecord) { bitArray[num3 + 2] = true; num2++; } } int num4 = count2 + num + num2; ArrayList arrayList = new ArrayList(); ArrayList arrayList2 = new ArrayList(); if (num4 > 0) { for (int j = 0; j < count; j++) { object emptyColumnStore = Columns[j].GetEmptyColumnStore(num4); arrayList.Add(emptyColumnStore); BitArray value = new BitArray(num4); arrayList2.Add(value); } } int num5 = 0; Hashtable hashtable = new Hashtable(); Hashtable hashtable2 = new Hashtable(); for (int k = 0; k < count2; k++) { int num6 = Rows[k].CopyValuesIntoStore(arrayList, arrayList2, num5); GetRowAndColumnErrors(k, hashtable, hashtable2); num5 += num6; } IFormatProvider invariantCulture = CultureInfo.InvariantCulture; info.AddValue(string.Format(invariantCulture, "DataTable_{0}.Rows.Count", serIndex), count2); info.AddValue(string.Format(invariantCulture, "DataTable_{0}.Records.Count", serIndex), num4); info.AddValue(string.Format(invariantCulture, "DataTable_{0}.RowStates", serIndex), bitArray); info.AddValue(string.Format(invariantCulture, "DataTable_{0}.Records", serIndex), arrayList); info.AddValue(string.Format(invariantCulture, "DataTable_{0}.NullBits", serIndex), arrayList2); info.AddValue(string.Format(invariantCulture, "DataTable_{0}.RowErrors", serIndex), hashtable); info.AddValue(string.Format(invariantCulture, "DataTable_{0}.ColumnErrors", serIndex), hashtable2); } internal void DeserializeTableData(SerializationInfo info, StreamingContext context, int serIndex) { bool enforceConstraints = _enforceConstraints; bool inDataLoad = _inDataLoad; try { _enforceConstraints = false; _inDataLoad = true; IFormatProvider invariantCulture = CultureInfo.InvariantCulture; int @int = info.GetInt32(string.Format(invariantCulture, "DataTable_{0}.Rows.Count", serIndex)); int int2 = info.GetInt32(string.Format(invariantCulture, "DataTable_{0}.Records.Count", serIndex)); BitArray bitArray = (BitArray)info.GetValue(string.Format(invariantCulture, "DataTable_{0}.RowStates", serIndex), typeof(BitArray)); ArrayList arrayList = (ArrayList)info.GetValue(string.Format(invariantCulture, "DataTable_{0}.Records", serIndex), typeof(ArrayList)); ArrayList arrayList2 = (ArrayList)info.GetValue(string.Format(invariantCulture, "DataTable_{0}.NullBits", serIndex), typeof(ArrayList)); Hashtable hashtable = (Hashtable)info.GetValue(string.Format(invariantCulture, "DataTable_{0}.RowErrors", serIndex), typeof(Hashtable)); hashtable.OnDeserialization(this); Hashtable hashtable2 = (Hashtable)info.GetValue(string.Format(invariantCulture, "DataTable_{0}.ColumnErrors", serIndex), typeof(Hashtable)); hashtable2.OnDeserialization(this); if (int2 <= 0) { return; } for (int i = 0; i < Columns.Count; i++) { Columns[i].SetStorage(arrayList[i], (BitArray)arrayList2[i]); } int num = 0; DataRow[] array = new DataRow[int2]; for (int j = 0; j < @int; j++) { DataRow dataRow = (array[num] = NewEmptyRow()); int num2 = j * 3; switch (ConvertToRowState(bitArray, num2)) { case DataRowState.Unchanged: dataRow._oldRecord = num; dataRow._newRecord = num; num++; break; case DataRowState.Added: dataRow._oldRecord = -1; dataRow._newRecord = num; num++; break; case DataRowState.Modified: dataRow._oldRecord = num; dataRow._newRecord = num + 1; array[num + 1] = dataRow; num += 2; break; case DataRowState.Deleted: dataRow._oldRecord = num; dataRow._newRecord = -1; num++; break; } if (bitArray[num2 + 2]) { dataRow._tempRecord = num; array[num] = dataRow; num++; } else { dataRow._tempRecord = -1; } Rows.ArrayAdd(dataRow); dataRow.rowID = _nextRowID; _nextRowID++; ConvertToRowError(j, hashtable, hashtable2); } _recordManager.SetRowCache(array); ResetIndexes(); } finally { _enforceConstraints = enforceConstraints; _inDataLoad = inDataLoad; } } private DataRowState ConvertToRowState(BitArray bitStates, int bitIndex) { bool flag = bitStates[bitIndex]; bool flag2 = bitStates[bitIndex + 1]; if (!flag && !flag2) { return DataRowState.Unchanged; } if (!flag && flag2) { return DataRowState.Added; } if (flag && !flag2) { return DataRowState.Modified; } if (flag && flag2) { return DataRowState.Deleted; } throw ExceptionBuilder.InvalidRowBitPattern(); } internal void GetRowAndColumnErrors(int rowIndex, Hashtable rowErrors, Hashtable colErrors) { DataRow dataRow = Rows[rowIndex]; if (!dataRow.HasErrors) { return; } rowErrors.Add(rowIndex, dataRow.RowError); DataColumn[] columnsInError = dataRow.GetColumnsInError(); if (columnsInError.Length != 0) { int[] array = new int[columnsInError.Length]; string[] array2 = new string[columnsInError.Length]; for (int i = 0; i < columnsInError.Length; i++) { array[i] = columnsInError[i].Ordinal; array2[i] = dataRow.GetColumnError(columnsInError[i]); } ArrayList arrayList = new ArrayList(); arrayList.Add(array); arrayList.Add(array2); colErrors.Add(rowIndex, arrayList); } } private void ConvertToRowError(int rowIndex, Hashtable rowErrors, Hashtable colErrors) { DataRow dataRow = Rows[rowIndex]; if (rowErrors.ContainsKey(rowIndex)) { dataRow.RowError = (string)rowErrors[rowIndex]; } if (colErrors.ContainsKey(rowIndex)) { ArrayList obj = (ArrayList)colErrors[rowIndex]; int[] array = (int[])obj[0]; string[] array2 = (string[])obj[1]; for (int i = 0; i < array.Length; i++) { dataRow.SetColumnError(array[i], array2[i]); } } } internal void RestoreIndexEvents(bool forceReset) { DataCommonEventSource.Log.Trace(" {0}, {1}", ObjectID, _suspendIndexEvents); if (0 >= _suspendIndexEvents) { return; } _suspendIndexEvents--; if (_suspendIndexEvents != 0) { return; } Exception ex = null; SetShadowIndexes(); try { int count = _shadowIndexes.Count; for (int i = 0; i < count; i++) { Index index = _shadowIndexes[i]; try { if (forceReset || index.HasRemoteAggregate) { index.Reset(); } else { index.FireResetEvent(); } } catch (Exception ex2) when (ADP.IsCatchableExceptionType(ex2)) { ExceptionBuilder.TraceExceptionWithoutRethrow(ex2); if (ex2 == null) { ex = ex2; } } } if (ex != null) { throw ex; } } finally { RestoreShadowIndexes(); } } internal void SuspendIndexEvents() { DataCommonEventSource.Log.Trace(" {0}, {1}", ObjectID, _suspendIndexEvents); _suspendIndexEvents++; } internal bool SetCaseSensitiveValue(bool isCaseSensitive, bool userSet, bool resetIndexes) { if (userSet || (!_caseSensitiveUserSet && _caseSensitive != isCaseSensitive)) { _caseSensitive = isCaseSensitive; if (isCaseSensitive) { _compareFlags = CompareOptions.None; } else { _compareFlags = CompareOptions.IgnoreCase | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth; } if (resetIndexes) { ResetIndexes(); foreach (Constraint constraint in Constraints) { constraint.CheckConstraint(); } } return true; } return false; } private void ResetCaseSensitive() { SetCaseSensitiveValue(_dataSet != null && _dataSet.CaseSensitive, userSet: true, resetIndexes: true); _caseSensitiveUserSet = false; } internal bool ShouldSerializeCaseSensitive() { return _caseSensitiveUserSet; } private void ResetColumns() { Columns.Clear(); } private void ResetConstraints() { Constraints.Clear(); } internal void SetDataSet(DataSet dataSet) { if (_dataSet != dataSet) { _dataSet = dataSet; DataColumnCollection columns = Columns; for (int i = 0; i < columns.Count; i++) { columns[i].OnSetDataSet(); } if (DataSet != null) { _defaultView = null; } if (dataSet != null) { _remotingFormat = dataSet.RemotingFormat; } } } internal void EnableConstraints() { bool flag = false; foreach (Constraint constraint in Constraints) { if (constraint is UniqueConstraint) { flag |= constraint.IsConstraintViolated(); } } foreach (DataColumn column in Columns) { if (!column.AllowDBNull) { flag |= column.IsNotAllowDBNullViolated(); } if (column.MaxLength >= 0) { flag |= column.IsMaxLengthViolated(); } } if (flag) { EnforceConstraints = false; throw ExceptionBuilder.EnforceConstraint(); } } internal bool SetLocaleValue(CultureInfo culture, bool userSet, bool resetIndexes) { if (userSet || resetIndexes || (!_cultureUserSet && !_culture.Equals(culture))) { _culture = culture; _compareInfo = null; _formatProvider = null; _hashCodeProvider = null; foreach (DataColumn column in Columns) { column._hashCode = GetSpecialHashCode(column.ColumnName); } if (resetIndexes) { ResetIndexes(); foreach (Constraint constraint in Constraints) { constraint.CheckConstraint(); } } return true; } return false; } internal bool ShouldSerializeLocale() { return _cultureUserSet; } internal void CacheNestedParent() { _nestedParentRelations = FindNestedParentRelations(); } private DataRelation[] FindNestedParentRelations() { List list = null; foreach (DataRelation parentRelation in ParentRelations) { if (parentRelation.Nested) { if (list == null) { list = new List(); } list.Add(parentRelation); } } if (list != null && list.Count != 0) { return list.ToArray(); } return Array.Empty(); } private bool ShouldSerializePrimaryKey() { return _primaryKey != null; } private void ResetPrimaryKey() { PrimaryKey = null; } private string GetInheritedNamespace(List visitedTables) { DataRelation[] nestedParentRelations = NestedParentRelations; if (nestedParentRelations.Length != 0) { foreach (DataRelation dataRelation in nestedParentRelations) { if (dataRelation.ParentTable._tableNamespace != null) { return dataRelation.ParentTable._tableNamespace; } } int j; for (j = 0; j < nestedParentRelations.Length && (nestedParentRelations[j].ParentTable == this || visitedTables.Contains(nestedParentRelations[j].ParentTable)); j++) { } if (j < nestedParentRelations.Length) { DataTable parentTable = nestedParentRelations[j].ParentTable; if (!visitedTables.Contains(parentTable)) { visitedTables.Add(parentTable); } return parentTable.GetInheritedNamespace(visitedTables); } } if (DataSet != null) { return DataSet.Namespace; } return string.Empty; } internal bool IsNamespaceInherited() { return _tableNamespace == null; } internal void CheckCascadingNamespaceConflict(string realNamespace) { foreach (DataRelation childRelation in ChildRelations) { if (childRelation.Nested && childRelation.ChildTable != this && childRelation.ChildTable._tableNamespace == null) { DataTable childTable = childRelation.ChildTable; if (_dataSet.Tables.Contains(childTable.TableName, realNamespace, checkProperty: false, caseSensitive: true)) { throw ExceptionBuilder.DuplicateTableName2(TableName, realNamespace); } childTable.CheckCascadingNamespaceConflict(realNamespace); } } } internal void CheckNamespaceValidityForNestedRelations(string realNamespace) { foreach (DataRelation childRelation in ChildRelations) { if (childRelation.Nested) { if (realNamespace != null) { childRelation.ChildTable.CheckNamespaceValidityForNestedParentRelations(realNamespace, this); } else { childRelation.ChildTable.CheckNamespaceValidityForNestedParentRelations(GetInheritedNamespace(new List()), this); } } } if (realNamespace == null) { CheckNamespaceValidityForNestedParentRelations(GetInheritedNamespace(new List()), this); } } internal void CheckNamespaceValidityForNestedParentRelations(string ns, DataTable parentTable) { foreach (DataRelation parentRelation in ParentRelations) { if (parentRelation.Nested && parentRelation.ParentTable != parentTable && parentRelation.ParentTable.Namespace != ns) { throw ExceptionBuilder.InValidNestedRelation(TableName); } } } internal void DoRaiseNamespaceChange() { RaisePropertyChanging("Namespace"); foreach (DataColumn column in Columns) { if (column._columnUri == null) { column.RaisePropertyChanging("Namespace"); } } foreach (DataRelation childRelation in ChildRelations) { if (childRelation.Nested && childRelation.ChildTable != this) { _ = childRelation.ChildTable; childRelation.ChildTable.DoRaiseNamespaceChange(); } } } private bool ShouldSerializeNamespace() { return _tableNamespace != null; } private void ResetNamespace() { Namespace = null; } public virtual void BeginInit() { fInitInProgress = true; } public virtual void EndInit() { if (_dataSet == null || !_dataSet._fInitInProgress) { Columns.FinishInitCollection(); Constraints.FinishInitConstraints(); foreach (DataColumn column in Columns) { if (column.Computed) { column.Expression = column.Expression; } } } fInitInProgress = false; if (_delayedSetPrimaryKey != null) { PrimaryKey = _delayedSetPrimaryKey; _delayedSetPrimaryKey = null; } if (_delayedViews.Count > 0) { foreach (DataView delayedView in _delayedViews) { delayedView.EndInit(); } _delayedViews.Clear(); } OnInitialized(); } internal void SetKeyValues(DataKey key, object[] keyValues, int record) { for (int i = 0; i < keyValues.Length; i++) { key.ColumnsReference[i][record] = keyValues[i]; } } internal DataRow FindByIndex(Index ndx, object[] key) { Range range = ndx.FindRecords(key); if (!range.IsNull) { return _recordManager[ndx.GetRecord(range.Min)]; } return null; } internal DataRow FindMergeTarget(DataRow row, DataKey key, Index ndx) { DataRow result = null; if (key.HasValue) { int record = ((row._oldRecord == -1) ? row._newRecord : row._oldRecord); object[] keyValues = key.GetKeyValues(record); result = FindByIndex(ndx, keyValues); } return result; } private void SetMergeRecords(DataRow row, int newRecord, int oldRecord, DataRowAction action) { if (newRecord != -1) { SetNewRecord(row, newRecord, action, isInMerge: true); SetOldRecord(row, oldRecord); return; } SetOldRecord(row, oldRecord); if (row._newRecord != -1) { SetNewRecord(row, newRecord, action, isInMerge: true); } } internal DataRow MergeRow(DataRow row, DataRow targetRow, bool preserveChanges, Index idxSearch) { if (targetRow == null) { targetRow = NewEmptyRow(); targetRow._oldRecord = _recordManager.ImportRecord(row.Table, row._oldRecord); targetRow._newRecord = targetRow._oldRecord; if (row._oldRecord != row._newRecord) { targetRow._newRecord = _recordManager.ImportRecord(row.Table, row._newRecord); } InsertRow(targetRow, -1L); } else { int tempRecord = targetRow._tempRecord; targetRow._tempRecord = -1; try { DataRowState rowState = targetRow.RowState; int oldRecord = ((rowState == DataRowState.Added) ? targetRow._newRecord : (oldRecord = targetRow._oldRecord)); if (targetRow.RowState == DataRowState.Unchanged && row.RowState == DataRowState.Unchanged) { int oldRecord2 = targetRow._oldRecord; int newRecord = (preserveChanges ? _recordManager.CopyRecord(this, oldRecord2, -1) : targetRow._newRecord); oldRecord2 = _recordManager.CopyRecord(row.Table, row._oldRecord, targetRow._oldRecord); SetMergeRecords(targetRow, newRecord, oldRecord2, DataRowAction.Change); } else if (row._newRecord == -1) { int oldRecord2 = targetRow._oldRecord; int newRecord = ((!preserveChanges) ? (-1) : ((targetRow.RowState == DataRowState.Unchanged) ? _recordManager.CopyRecord(this, oldRecord2, -1) : targetRow._newRecord)); oldRecord2 = _recordManager.CopyRecord(row.Table, row._oldRecord, oldRecord2); if (oldRecord != ((rowState == DataRowState.Added) ? newRecord : oldRecord2)) { SetMergeRecords(targetRow, newRecord, oldRecord2, (newRecord == -1) ? DataRowAction.Delete : DataRowAction.Change); idxSearch.Reset(); oldRecord = ((rowState == DataRowState.Added) ? newRecord : oldRecord2); } else { SetMergeRecords(targetRow, newRecord, oldRecord2, (newRecord == -1) ? DataRowAction.Delete : DataRowAction.Change); } } else { int oldRecord2 = targetRow._oldRecord; int newRecord = targetRow._newRecord; if (targetRow.RowState == DataRowState.Unchanged) { newRecord = _recordManager.CopyRecord(this, oldRecord2, -1); } oldRecord2 = _recordManager.CopyRecord(row.Table, row._oldRecord, oldRecord2); if (!preserveChanges) { newRecord = _recordManager.CopyRecord(row.Table, row._newRecord, newRecord); } SetMergeRecords(targetRow, newRecord, oldRecord2, DataRowAction.Change); } if (rowState == DataRowState.Added && targetRow._oldRecord != -1) { idxSearch.Reset(); } } finally { targetRow._tempRecord = tempRecord; } } if (row.HasErrors) { if (targetRow.RowError.Length == 0) { targetRow.RowError = row.RowError; } else { DataRow dataRow = targetRow; dataRow.RowError = dataRow.RowError + " ]:[ " + row.RowError; } DataColumn[] columnsInError = row.GetColumnsInError(); for (int i = 0; i < columnsInError.Length; i++) { DataColumn column = targetRow.Table.Columns[columnsInError[i].ColumnName]; targetRow.SetColumnError(column, row.GetColumnError(columnsInError[i])); } } else if (!preserveChanges) { targetRow.ClearErrors(); } return targetRow; } public void AcceptChanges() { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { DataRow[] array = new DataRow[Rows.Count]; Rows.CopyTo(array, 0); SuspendIndexEvents(); try { for (int i = 0; i < array.Length; i++) { if (array[i].rowID != -1) { array[i].AcceptChanges(); } } } finally { RestoreIndexEvents(forceReset: false); } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } [MethodImpl(MethodImplOptions.NoInlining)] protected virtual DataTable CreateInstance() { return (DataTable)Activator.CreateInstance(GetType(), nonPublic: true); } public virtual DataTable Clone() { return Clone(null); } internal DataTable Clone(DataSet cloneDS) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, cloneDS={1}", ObjectID, cloneDS?.ObjectID ?? 0); try { DataTable dataTable = CreateInstance(); if (dataTable.Columns.Count > 0) { dataTable.Reset(); } return CloneTo(dataTable, cloneDS, skipExpressionColumns: false); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } private DataTable IncrementalCloneTo(DataTable sourceTable, DataTable targetTable) { foreach (DataColumn column in sourceTable.Columns) { if (targetTable.Columns[column.ColumnName] == null) { targetTable.Columns.Add(column.Clone()); } } return targetTable; } private DataTable CloneHierarchy(DataTable sourceTable, DataSet ds, Hashtable visitedMap) { if (visitedMap == null) { visitedMap = new Hashtable(); } if (visitedMap.Contains(sourceTable)) { return (DataTable)visitedMap[sourceTable]; } DataTable dataTable = ds.Tables[sourceTable.TableName, sourceTable.Namespace]; if (dataTable != null && dataTable.Columns.Count > 0) { dataTable = IncrementalCloneTo(sourceTable, dataTable); } else { if (dataTable == null) { dataTable = new DataTable(); ds.Tables.Add(dataTable); } dataTable = sourceTable.CloneTo(dataTable, ds, skipExpressionColumns: true); } visitedMap[sourceTable] = dataTable; foreach (DataRelation childRelation in sourceTable.ChildRelations) { CloneHierarchy(childRelation.ChildTable, ds, visitedMap); } return dataTable; } private DataTable CloneTo(DataTable clone, DataSet cloneDS, bool skipExpressionColumns) { clone._tableName = _tableName; clone._tableNamespace = _tableNamespace; clone._tablePrefix = _tablePrefix; clone._fNestedInDataset = _fNestedInDataset; clone._culture = _culture; clone._cultureUserSet = _cultureUserSet; clone._compareInfo = _compareInfo; clone._compareFlags = _compareFlags; clone._formatProvider = _formatProvider; clone._hashCodeProvider = _hashCodeProvider; clone._caseSensitive = _caseSensitive; clone._caseSensitiveUserSet = _caseSensitiveUserSet; clone._displayExpression = _displayExpression; clone._typeName = _typeName; clone._repeatableElement = _repeatableElement; clone.MinimumCapacity = MinimumCapacity; clone.RemotingFormat = RemotingFormat; DataColumnCollection columns = Columns; for (int i = 0; i < columns.Count; i++) { clone.Columns.Add(columns[i].Clone()); } if (!skipExpressionColumns && cloneDS == null) { for (int j = 0; j < columns.Count; j++) { clone.Columns[columns[j].ColumnName].Expression = columns[j].Expression; } } DataColumn[] primaryKey = PrimaryKey; if (primaryKey.Length != 0) { DataColumn[] array = new DataColumn[primaryKey.Length]; for (int k = 0; k < primaryKey.Length; k++) { array[k] = clone.Columns[primaryKey[k].Ordinal]; } clone.PrimaryKey = array; } for (int l = 0; l < Constraints.Count; l++) { ForeignKeyConstraint foreignKeyConstraint = Constraints[l] as ForeignKeyConstraint; UniqueConstraint uniqueConstraint = Constraints[l] as UniqueConstraint; if (foreignKeyConstraint != null) { if (foreignKeyConstraint.Table == foreignKeyConstraint.RelatedTable) { ForeignKeyConstraint constraint = foreignKeyConstraint.Clone(clone); Constraint constraint2 = clone.Constraints.FindConstraint(constraint); if (constraint2 != null) { constraint2.ConstraintName = Constraints[l].ConstraintName; } } } else { if (uniqueConstraint == null) { continue; } UniqueConstraint uniqueConstraint2 = uniqueConstraint.Clone(clone); Constraint constraint3 = clone.Constraints.FindConstraint(uniqueConstraint2); if (constraint3 == null) { continue; } constraint3.ConstraintName = Constraints[l].ConstraintName; foreach (object key in uniqueConstraint2.ExtendedProperties.Keys) { constraint3.ExtendedProperties[key] = uniqueConstraint2.ExtendedProperties[key]; } } } for (int m = 0; m < Constraints.Count; m++) { if (clone.Constraints.Contains(Constraints[m].ConstraintName, caseSensitive: true)) { continue; } ForeignKeyConstraint foreignKeyConstraint2 = Constraints[m] as ForeignKeyConstraint; UniqueConstraint uniqueConstraint3 = Constraints[m] as UniqueConstraint; if (foreignKeyConstraint2 != null) { if (foreignKeyConstraint2.Table == foreignKeyConstraint2.RelatedTable) { ForeignKeyConstraint foreignKeyConstraint3 = foreignKeyConstraint2.Clone(clone); if (foreignKeyConstraint3 != null) { clone.Constraints.Add(foreignKeyConstraint3); } } } else if (uniqueConstraint3 != null) { clone.Constraints.Add(uniqueConstraint3.Clone(clone)); } } if (_extendedProperties != null) { foreach (object key2 in _extendedProperties.Keys) { clone.ExtendedProperties[key2] = _extendedProperties[key2]; } } return clone; } public DataTable Copy() { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { DataTable dataTable = Clone(); foreach (DataRow row in Rows) { CopyRow(dataTable, row); } return dataTable; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } internal DataRow AddRecords(int oldRecord, int newRecord) { DataRow dataRow; if (oldRecord == -1 && newRecord == -1) { dataRow = NewRow(-1); AddRow(dataRow); } else { dataRow = NewEmptyRow(); dataRow._oldRecord = oldRecord; dataRow._newRecord = newRecord; InsertRow(dataRow, -1L); } return dataRow; } internal void AddRow(DataRow row) { AddRow(row, -1); } internal void AddRow(DataRow row, int proposedID) { InsertRow(row, proposedID, -1); } internal void InsertRow(DataRow row, int proposedID, int pos) { InsertRow(row, proposedID, pos, fireEvent: true); } internal void InsertRow(DataRow row, long proposedID, int pos, bool fireEvent) { Exception deferredException = null; if (row == null) { throw ExceptionBuilder.ArgumentNull("row"); } if (row.Table != this) { throw ExceptionBuilder.RowAlreadyInOtherCollection(); } if (row.rowID != -1) { throw ExceptionBuilder.RowAlreadyInTheCollection(); } row.BeginEdit(); int tempRecord = row._tempRecord; row._tempRecord = -1; if (proposedID == -1) { proposedID = _nextRowID; } bool flag; if (flag = _nextRowID <= proposedID) { _nextRowID = checked(proposedID + 1); } try { try { row.rowID = proposedID; SetNewRecordWorker(row, tempRecord, DataRowAction.Add, isInMerge: false, suppressEnsurePropertyChanged: false, pos, fireEvent, out deferredException); } catch { if (flag && _nextRowID == proposedID + 1) { _nextRowID = proposedID; } row.rowID = -1L; row._tempRecord = tempRecord; throw; } if (deferredException != null) { throw deferredException; } if (!EnforceConstraints || _inLoad) { return; } int count = _columnCollection.Count; for (int i = 0; i < count; i++) { DataColumn dataColumn = _columnCollection[i]; if (dataColumn.Computed) { dataColumn.CheckColumnConstraint(row, DataRowAction.Add); } } } finally { row.ResetLastChangedColumn(); } } internal void CheckNotModifying(DataRow row) { if (row._tempRecord != -1) { row.EndEdit(); } } public void Clear() { Clear(clearAll: true); } internal void Clear(bool clearAll) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, clearAll={1}", ObjectID, clearAll); try { _rowDiffId = null; if (_dataSet != null) { _dataSet.OnClearFunctionCalled(this); } bool flag = Rows.Count != 0; DataTableClearEventArgs e = null; if (flag) { e = new DataTableClearEventArgs(this); OnTableClearing(e); } if (_dataSet != null && _dataSet.EnforceConstraints) { ParentForeignKeyConstraintEnumerator parentForeignKeyConstraintEnumerator = new ParentForeignKeyConstraintEnumerator(_dataSet, this); while (parentForeignKeyConstraintEnumerator.GetNext()) { parentForeignKeyConstraintEnumerator.GetForeignKeyConstraint().CheckCanClearParentTable(this); } } _recordManager.Clear(clearAll); foreach (DataRow row in Rows) { row._oldRecord = -1; row._newRecord = -1; row._tempRecord = -1; row.rowID = -1L; row.RBTreeNodeId = 0; } Rows.ArrayClear(); ResetIndexes(); if (flag) { OnTableCleared(e); } foreach (DataColumn column in Columns) { EvaluateDependentExpressions(column); } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } internal void CascadeAll(DataRow row, DataRowAction action) { if (DataSet != null && DataSet._fEnableCascading) { ParentForeignKeyConstraintEnumerator parentForeignKeyConstraintEnumerator = new ParentForeignKeyConstraintEnumerator(_dataSet, this); while (parentForeignKeyConstraintEnumerator.GetNext()) { parentForeignKeyConstraintEnumerator.GetForeignKeyConstraint().CheckCascade(row, action); } } } internal void CommitRow(DataRow row) { DataRowChangeEventArgs args = OnRowChanging(null, row, DataRowAction.Commit); if (!_inDataLoad) { CascadeAll(row, DataRowAction.Commit); } SetOldRecord(row, row._newRecord); OnRowChanged(args, row, DataRowAction.Commit); } internal int Compare(string s1, string s2) { return Compare(s1, s2, null); } internal int Compare(string s1, string s2, CompareInfo comparer) { if ((object)s1 == s2) { return 0; } if (s1 == null) { return -1; } if (s2 == null) { return 1; } int num = s1.Length; int num2 = s2.Length; while (num > 0 && (s1[num - 1] == ' ' || s1[num - 1] == '\u3000')) { num--; } while (num2 > 0 && (s2[num2 - 1] == ' ' || s2[num2 - 1] == '\u3000')) { num2--; } return (comparer ?? CompareInfo).Compare(s1, 0, num, s2, 0, num2, _compareFlags); } internal int IndexOf(string s1, string s2) { return CompareInfo.IndexOf(s1, s2, _compareFlags); } internal bool IsSuffix(string s1, string s2) { return CompareInfo.IsSuffix(s1, s2, _compareFlags); } public object Compute(string expression, string filter) { DataRow[] rows = Select(filter, "", DataViewRowState.CurrentRows); return new DataExpression(this, expression).Evaluate(rows); } internal void CopyRow(DataTable table, DataRow row) { int num = -1; int newRecord = -1; if (row == null) { return; } if (row._oldRecord != -1) { num = table._recordManager.ImportRecord(row.Table, row._oldRecord); } if (row._newRecord != -1) { newRecord = ((row._newRecord == row._oldRecord) ? num : table._recordManager.ImportRecord(row.Table, row._newRecord)); } DataRow dataRow = table.AddRecords(num, newRecord); if (row.HasErrors) { dataRow.RowError = row.RowError; DataColumn[] columnsInError = row.GetColumnsInError(); for (int i = 0; i < columnsInError.Length; i++) { DataColumn column = dataRow.Table.Columns[columnsInError[i].ColumnName]; dataRow.SetColumnError(column, row.GetColumnError(columnsInError[i])); } } } internal void DeleteRow(DataRow row) { if (row._newRecord == -1) { throw ExceptionBuilder.RowAlreadyDeleted(); } SetNewRecord(row, -1, DataRowAction.Delete); } private void CheckPrimaryKey() { if (_primaryKey == null) { throw ExceptionBuilder.TableMissingPrimaryKey(); } } internal DataRow FindByPrimaryKey(object[] values) { CheckPrimaryKey(); return FindRow(_primaryKey.Key, values); } internal DataRow FindByPrimaryKey(object value) { CheckPrimaryKey(); return FindRow(_primaryKey.Key, value); } private DataRow FindRow(DataKey key, object[] values) { Index index = GetIndex(NewIndexDesc(key)); Range range = index.FindRecords(values); if (range.IsNull) { return null; } return _recordManager[index.GetRecord(range.Min)]; } private DataRow FindRow(DataKey key, object value) { Index index = GetIndex(NewIndexDesc(key)); Range range = index.FindRecords(value); if (range.IsNull) { return null; } return _recordManager[index.GetRecord(range.Min)]; } internal string FormatSortString(IndexField[] indexDesc) { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < indexDesc.Length; i++) { IndexField indexField = indexDesc[i]; if (0 < stringBuilder.Length) { stringBuilder.Append(", "); } stringBuilder.Append(indexField.Column.ColumnName); if (indexField.IsDescending) { stringBuilder.Append(" DESC"); } } return stringBuilder.ToString(); } internal void FreeRecord(ref int record) { _recordManager.FreeRecord(ref record); } public DataTable GetChanges() { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { DataTable dataTable = Clone(); DataRow dataRow = null; for (int i = 0; i < Rows.Count; i++) { dataRow = Rows[i]; if (dataRow._oldRecord != dataRow._newRecord) { dataTable.ImportRow(dataRow); } } if (dataTable.Rows.Count == 0) { return null; } return dataTable; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public DataTable GetChanges(DataRowState rowStates) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, rowStates={1}", ObjectID, rowStates); try { DataTable dataTable = Clone(); DataRow dataRow = null; for (int i = 0; i < Rows.Count; i++) { dataRow = Rows[i]; if ((dataRow.RowState & rowStates) != 0) { dataTable.ImportRow(dataRow); } } if (dataTable.Rows.Count == 0) { return null; } return dataTable; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public DataRow[] GetErrors() { List list = new List(); for (int i = 0; i < Rows.Count; i++) { DataRow dataRow = Rows[i]; if (dataRow.HasErrors) { list.Add(dataRow); } } DataRow[] array = NewRowArray(list.Count); list.CopyTo(array); return array; } internal Index GetIndex(IndexField[] indexDesc) { return GetIndex(indexDesc, DataViewRowState.CurrentRows, null); } internal Index GetIndex(string sort, DataViewRowState recordStates, IFilter rowFilter) { return GetIndex(ParseSortString(sort), recordStates, rowFilter); } internal Index GetIndex(IndexField[] indexDesc, DataViewRowState recordStates, IFilter rowFilter) { _indexesLock.EnterUpgradeableReadLock(); try { for (int i = 0; i < _indexes.Count; i++) { Index index = _indexes[i]; if (index != null && index.Equal(indexDesc, recordStates, rowFilter)) { return index; } } } finally { _indexesLock.ExitUpgradeableReadLock(); } Index index2 = new Index(this, indexDesc, recordStates, rowFilter); index2.AddRef(); return index2; } IList IListSource.GetList() { return DefaultView; } internal List GetListeners() { return _dataViewListeners; } internal int GetSpecialHashCode(string name) { int i; for (i = 0; i < name.Length && '\u3000' > name[i]; i++) { } if (name.Length == i) { if (_hashCodeProvider == null) { _hashCodeProvider = StringComparer.Create(Locale, ignoreCase: true); } return _hashCodeProvider.GetHashCode(name); } return 0; } public void ImportRow(DataRow row) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { int num = -1; int num2 = -1; if (row == null) { return; } if (row._oldRecord != -1) { num = _recordManager.ImportRecord(row.Table, row._oldRecord); } if (row._newRecord != -1) { num2 = ((row.RowState == DataRowState.Unchanged) ? num : _recordManager.ImportRecord(row.Table, row._newRecord)); } if (num == -1 && num2 == -1) { return; } DataRow dataRow = AddRecords(num, num2); if (row.HasErrors) { dataRow.RowError = row.RowError; DataColumn[] columnsInError = row.GetColumnsInError(); for (int i = 0; i < columnsInError.Length; i++) { DataColumn column = dataRow.Table.Columns[columnsInError[i].ColumnName]; dataRow.SetColumnError(column, row.GetColumnError(columnsInError[i])); } } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } internal void InsertRow(DataRow row, long proposedID) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, row={1}", ObjectID, row._objectID); try { if (row.Table != this) { throw ExceptionBuilder.RowAlreadyInOtherCollection(); } if (row.rowID != -1) { throw ExceptionBuilder.RowAlreadyInTheCollection(); } if (row._oldRecord == -1 && row._newRecord == -1) { throw ExceptionBuilder.RowEmpty(); } if (proposedID == -1) { proposedID = _nextRowID; } row.rowID = proposedID; if (_nextRowID <= proposedID) { _nextRowID = checked(proposedID + 1); } DataRowChangeEventArgs args = null; if (row._newRecord != -1) { row._tempRecord = row._newRecord; row._newRecord = -1; try { args = RaiseRowChanging(null, row, DataRowAction.Add, fireEvent: true); } catch { row._tempRecord = -1; throw; } row._newRecord = row._tempRecord; row._tempRecord = -1; } if (row._oldRecord != -1) { _recordManager[row._oldRecord] = row; } if (row._newRecord != -1) { _recordManager[row._newRecord] = row; } Rows.ArrayAdd(row); if (row.RowState == DataRowState.Unchanged) { RecordStateChanged(row._oldRecord, DataViewRowState.None, DataViewRowState.Unchanged); } else { RecordStateChanged(row._oldRecord, DataViewRowState.None, row.GetRecordState(row._oldRecord), row._newRecord, DataViewRowState.None, row.GetRecordState(row._newRecord)); } if (_dependentColumns != null && _dependentColumns.Count > 0) { EvaluateExpressions(row, DataRowAction.Add, null); } RaiseRowChanged(args, row, DataRowAction.Add); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } private IndexField[] NewIndexDesc(DataKey key) { IndexField[] indexDesc = key.GetIndexDesc(); IndexField[] array = new IndexField[indexDesc.Length]; Array.Copy(indexDesc, 0, array, 0, indexDesc.Length); return array; } internal int NewRecord() { return NewRecord(-1); } internal int NewUninitializedRecord() { return _recordManager.NewRecordBase(); } internal int NewRecordFromArray(object[] value) { int count = _columnCollection.Count; if (count < value.Length) { throw ExceptionBuilder.ValueArrayLength(); } int record = _recordManager.NewRecordBase(); try { for (int i = 0; i < value.Length; i++) { if (value[i] != null) { _columnCollection[i][record] = value[i]; } else { _columnCollection[i].Init(record); } } for (int j = value.Length; j < count; j++) { _columnCollection[j].Init(record); } return record; } catch (Exception e) when (ADP.IsCatchableOrSecurityExceptionType(e)) { FreeRecord(ref record); throw; } } internal int NewRecord(int sourceRecord) { int num = _recordManager.NewRecordBase(); int count = _columnCollection.Count; if (-1 == sourceRecord) { for (int i = 0; i < count; i++) { _columnCollection[i].Init(num); } } else { for (int j = 0; j < count; j++) { _columnCollection[j].Copy(sourceRecord, num); } } return num; } internal DataRow NewEmptyRow() { _rowBuilder._record = -1; DataRow dataRow = NewRowFromBuilder(_rowBuilder); if (_dataSet != null) { DataSet.OnDataRowCreated(dataRow); } return dataRow; } private DataRow NewUninitializedRow() { return NewRow(NewUninitializedRecord()); } public DataRow NewRow() { DataRow dataRow = NewRow(-1); NewRowCreated(dataRow); return dataRow; } internal DataRow CreateEmptyRow() { DataRow dataRow = NewUninitializedRow(); foreach (DataColumn column in Columns) { if (XmlToDatasetMap.IsMappedColumn(column)) { continue; } if (!column.AutoIncrement) { if (column.AllowDBNull) { dataRow[column] = DBNull.Value; } else if (column.DefaultValue != null) { dataRow[column] = column.DefaultValue; } } else { column.Init(dataRow._tempRecord); } } return dataRow; } private void NewRowCreated(DataRow row) { if (_onTableNewRowDelegate != null) { DataTableNewRowEventArgs e = new DataTableNewRowEventArgs(row); OnTableNewRow(e); } } internal DataRow NewRow(int record) { if (-1 == record) { record = NewRecord(-1); } _rowBuilder._record = record; DataRow dataRow = NewRowFromBuilder(_rowBuilder); _recordManager[record] = dataRow; if (_dataSet != null) { DataSet.OnDataRowCreated(dataRow); } return dataRow; } protected virtual DataRow NewRowFromBuilder(DataRowBuilder builder) { return new DataRow(builder); } protected virtual Type GetRowType() { return typeof(DataRow); } [MethodImpl(MethodImplOptions.NoInlining)] protected internal DataRow[] NewRowArray(int size) { if (IsTypedDataTable) { if (size == 0) { if (_emptyDataRowArray == null) { _emptyDataRowArray = (DataRow[])Array.CreateInstance(GetRowType(), 0); } return _emptyDataRowArray; } return (DataRow[])Array.CreateInstance(GetRowType(), size); } if (size != 0) { return new DataRow[size]; } return Array.Empty(); } protected internal virtual void OnColumnChanging(DataColumnChangeEventArgs e) { if (_onColumnChangingDelegate != null) { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onColumnChangingDelegate(this, e); } } protected internal virtual void OnColumnChanged(DataColumnChangeEventArgs e) { if (_onColumnChangedDelegate != null) { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onColumnChangedDelegate(this, e); } } protected virtual void OnPropertyChanging(PropertyChangedEventArgs pcevent) { if (_onPropertyChangingDelegate != null) { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onPropertyChangingDelegate(this, pcevent); } } internal void OnRemoveColumnInternal(DataColumn column) { OnRemoveColumn(column); } protected virtual void OnRemoveColumn(DataColumn column) { } private DataRowChangeEventArgs OnRowChanged(DataRowChangeEventArgs args, DataRow eRow, DataRowAction eAction) { if (_onRowChangedDelegate != null || IsTypedDataTable) { if (args == null) { args = new DataRowChangeEventArgs(eRow, eAction); } OnRowChanged(args); } return args; } private DataRowChangeEventArgs OnRowChanging(DataRowChangeEventArgs args, DataRow eRow, DataRowAction eAction) { if (_onRowChangingDelegate != null || IsTypedDataTable) { if (args == null) { args = new DataRowChangeEventArgs(eRow, eAction); } OnRowChanging(args); } return args; } protected virtual void OnRowChanged(DataRowChangeEventArgs e) { if (_onRowChangedDelegate != null) { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onRowChangedDelegate(this, e); } } protected virtual void OnRowChanging(DataRowChangeEventArgs e) { if (_onRowChangingDelegate != null) { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onRowChangingDelegate(this, e); } } protected virtual void OnRowDeleting(DataRowChangeEventArgs e) { if (_onRowDeletingDelegate != null) { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onRowDeletingDelegate(this, e); } } protected virtual void OnRowDeleted(DataRowChangeEventArgs e) { if (_onRowDeletedDelegate != null) { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onRowDeletedDelegate(this, e); } } protected virtual void OnTableCleared(DataTableClearEventArgs e) { if (_onTableClearedDelegate != null) { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onTableClearedDelegate(this, e); } } protected virtual void OnTableClearing(DataTableClearEventArgs e) { if (_onTableClearingDelegate != null) { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onTableClearingDelegate(this, e); } } protected virtual void OnTableNewRow(DataTableNewRowEventArgs e) { if (_onTableNewRowDelegate != null) { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onTableNewRowDelegate(this, e); } } private void OnInitialized() { if (_onInitialized != null) { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onInitialized(this, EventArgs.Empty); } } internal IndexField[] ParseSortString(string sortString) { IndexField[] array = Array.Empty(); if (sortString != null && 0 < sortString.Length) { string[] array2 = sortString.Split(new char[1] { ',' }); array = new IndexField[array2.Length]; for (int i = 0; i < array2.Length; i++) { string text = array2[i].Trim(); int length = text.Length; bool isDescending = false; if (length >= 5 && string.Compare(text, length - 4, " ASC", 0, 4, StringComparison.OrdinalIgnoreCase) == 0) { text = text.Substring(0, length - 4).Trim(); } else if (length >= 6 && string.Compare(text, length - 5, " DESC", 0, 5, StringComparison.OrdinalIgnoreCase) == 0) { isDescending = true; text = text.Substring(0, length - 5).Trim(); } if (text.StartsWith("[", StringComparison.Ordinal)) { if (!text.EndsWith("]", StringComparison.Ordinal)) { throw ExceptionBuilder.InvalidSortString(array2[i]); } text = text.Substring(1, text.Length - 2); } DataColumn dataColumn = Columns[text]; if (dataColumn == null) { throw ExceptionBuilder.ColumnOutOfRange(text); } array[i] = new IndexField(dataColumn, isDescending); } } return array; } internal void RaisePropertyChanging(string name) { OnPropertyChanging(new PropertyChangedEventArgs(name)); } internal void RecordChanged(int record) { SetShadowIndexes(); try { int count = _shadowIndexes.Count; for (int i = 0; i < count; i++) { Index index = _shadowIndexes[i]; if (0 < index.RefCount) { index.RecordChanged(record); } } } finally { RestoreShadowIndexes(); } } internal void RecordChanged(int[] oldIndex, int[] newIndex) { SetShadowIndexes(); try { int count = _shadowIndexes.Count; for (int i = 0; i < count; i++) { Index index = _shadowIndexes[i]; if (0 < index.RefCount) { index.RecordChanged(oldIndex[i], newIndex[i]); } } } finally { RestoreShadowIndexes(); } } internal void RecordStateChanged(int record, DataViewRowState oldState, DataViewRowState newState) { SetShadowIndexes(); try { int count = _shadowIndexes.Count; for (int i = 0; i < count; i++) { Index index = _shadowIndexes[i]; if (0 < index.RefCount) { index.RecordStateChanged(record, oldState, newState); } } } finally { RestoreShadowIndexes(); } } internal void RecordStateChanged(int record1, DataViewRowState oldState1, DataViewRowState newState1, int record2, DataViewRowState oldState2, DataViewRowState newState2) { SetShadowIndexes(); try { int count = _shadowIndexes.Count; for (int i = 0; i < count; i++) { Index index = _shadowIndexes[i]; if (0 < index.RefCount) { if (record1 != -1 && record2 != -1) { index.RecordStateChanged(record1, oldState1, newState1, record2, oldState2, newState2); } else if (record1 != -1) { index.RecordStateChanged(record1, oldState1, newState1); } else if (record2 != -1) { index.RecordStateChanged(record2, oldState2, newState2); } } } } finally { RestoreShadowIndexes(); } } internal int[] RemoveRecordFromIndexes(DataRow row, DataRowVersion version) { int num = LiveIndexes.Count; int[] array = new int[num]; int recordFromVersion = row.GetRecordFromVersion(version); DataViewRowState recordState = row.GetRecordState(recordFromVersion); while (--num >= 0) { if (row.HasVersion(version) && (recordState & _indexes[num].RecordStates) != 0) { int index = _indexes[num].GetIndex(recordFromVersion); if (index > -1) { array[num] = index; _indexes[num].DeleteRecordFromIndex(index); } else { array[num] = -1; } } else { array[num] = -1; } } return array; } internal int[] InsertRecordToIndexes(DataRow row, DataRowVersion version) { int num = LiveIndexes.Count; int[] array = new int[num]; int recordFromVersion = row.GetRecordFromVersion(version); DataViewRowState recordState = row.GetRecordState(recordFromVersion); while (--num >= 0) { if (row.HasVersion(version)) { if ((recordState & _indexes[num].RecordStates) != 0) { array[num] = _indexes[num].InsertRecordToIndex(recordFromVersion); } else { array[num] = -1; } } } return array; } internal void SilentlySetValue(DataRow dr, DataColumn dc, DataRowVersion version, object newValue) { int recordFromVersion = dr.GetRecordFromVersion(version); bool flag = false; if ((DataStorage.IsTypeCustomType(dc.DataType) && newValue != dc[recordFromVersion]) || !dc.CompareValueTo(recordFromVersion, newValue, checkType: true)) { int[] oldIndex = dr.Table.RemoveRecordFromIndexes(dr, version); dc.SetValue(recordFromVersion, newValue); int[] newIndex = dr.Table.InsertRecordToIndexes(dr, version); if (dr.HasVersion(version)) { if (version != DataRowVersion.Original) { dr.Table.RecordChanged(oldIndex, newIndex); } if (dc._dependentColumns != null) { dc.Table.EvaluateDependentExpressions(dc._dependentColumns, dr, version, null); } } } dr.ResetLastChangedColumn(); } public void RejectChanges() { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { DataRow[] array = new DataRow[Rows.Count]; Rows.CopyTo(array, 0); for (int i = 0; i < array.Length; i++) { RollbackRow(array[i]); } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } internal void RemoveRow(DataRow row, bool check) { if (row.rowID == -1) { throw ExceptionBuilder.RowAlreadyRemoved(); } if (check && _dataSet != null) { ParentForeignKeyConstraintEnumerator parentForeignKeyConstraintEnumerator = new ParentForeignKeyConstraintEnumerator(_dataSet, this); while (parentForeignKeyConstraintEnumerator.GetNext()) { parentForeignKeyConstraintEnumerator.GetForeignKeyConstraint().CheckCanRemoveParentRow(row); } } int record = row._oldRecord; int record2 = row._newRecord; DataViewRowState recordState = row.GetRecordState(record); DataViewRowState recordState2 = row.GetRecordState(record2); row._oldRecord = -1; row._newRecord = -1; if (record == record2) { record = -1; } RecordStateChanged(record, recordState, DataViewRowState.None, record2, recordState2, DataViewRowState.None); FreeRecord(ref record); FreeRecord(ref record2); row.rowID = -1L; Rows.ArrayRemove(row); } public virtual void Reset() { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { Clear(); ResetConstraints(); DataRelationCollection parentRelations = ParentRelations; int num = parentRelations.Count; while (num > 0) { num--; parentRelations.RemoveAt(num); } parentRelations = ChildRelations; num = parentRelations.Count; while (num > 0) { num--; parentRelations.RemoveAt(num); } Columns.Clear(); _indexes.Clear(); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } internal void ResetIndexes() { ResetInternalIndexes(null); } internal void ResetInternalIndexes(DataColumn column) { SetShadowIndexes(); try { int count = _shadowIndexes.Count; for (int i = 0; i < count; i++) { Index index = _shadowIndexes[i]; if (0 >= index.RefCount) { continue; } if (column == null) { index.Reset(); continue; } bool flag = false; IndexField[] indexFields = index._indexFields; for (int j = 0; j < indexFields.Length; j++) { IndexField indexField = indexFields[j]; if (column == indexField.Column) { flag = true; break; } } if (flag) { index.Reset(); } } } finally { RestoreShadowIndexes(); } } internal void RollbackRow(DataRow row) { row.CancelEdit(); SetNewRecord(row, row._oldRecord, DataRowAction.Rollback); } private DataRowChangeEventArgs RaiseRowChanged(DataRowChangeEventArgs args, DataRow eRow, DataRowAction eAction) { try { if (UpdatingCurrent(eRow, eAction) && (IsTypedDataTable || _onRowChangedDelegate != null)) { args = OnRowChanged(args, eRow, eAction); } else if (DataRowAction.Delete == eAction && eRow._newRecord == -1 && (IsTypedDataTable || _onRowDeletedDelegate != null)) { if (args == null) { args = new DataRowChangeEventArgs(eRow, eAction); } OnRowDeleted(args); } } catch (Exception e) when (ADP.IsCatchableExceptionType(e)) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); } return args; } private DataRowChangeEventArgs RaiseRowChanging(DataRowChangeEventArgs args, DataRow eRow, DataRowAction eAction) { if (UpdatingCurrent(eRow, eAction) && (IsTypedDataTable || _onRowChangingDelegate != null)) { eRow._inChangingEvent = true; try { args = OnRowChanging(args, eRow, eAction); } finally { eRow._inChangingEvent = false; } } else if (DataRowAction.Delete == eAction && eRow._newRecord != -1 && (IsTypedDataTable || _onRowDeletingDelegate != null)) { eRow._inDeletingEvent = true; try { if (args == null) { args = new DataRowChangeEventArgs(eRow, eAction); } OnRowDeleting(args); } finally { eRow._inDeletingEvent = false; } } return args; } private DataRowChangeEventArgs RaiseRowChanging(DataRowChangeEventArgs args, DataRow eRow, DataRowAction eAction, bool fireEvent) { if (EnforceConstraints && !_inLoad) { int count = _columnCollection.Count; for (int i = 0; i < count; i++) { DataColumn dataColumn = _columnCollection[i]; if (!dataColumn.Computed || eAction != DataRowAction.Add) { dataColumn.CheckColumnConstraint(eRow, eAction); } } int count2 = _constraintCollection.Count; for (int j = 0; j < count2; j++) { _constraintCollection[j].CheckConstraint(eRow, eAction); } } if (fireEvent) { args = RaiseRowChanging(args, eRow, eAction); } if (!_inDataLoad && !MergingData && eAction != 0 && eAction != DataRowAction.ChangeOriginal) { CascadeAll(eRow, eAction); } return args; } public DataRow[] Select() { DataCommonEventSource.Log.Trace(" {0}", ObjectID); return new Select(this, "", "", DataViewRowState.CurrentRows).SelectRows(); } public DataRow[] Select(string filterExpression) { DataCommonEventSource.Log.Trace(" {0}, filterExpression='{1}'", ObjectID, filterExpression); return new Select(this, filterExpression, "", DataViewRowState.CurrentRows).SelectRows(); } public DataRow[] Select(string filterExpression, string sort) { DataCommonEventSource.Log.Trace(" {0}, filterExpression='{1}', sort='{2}'", ObjectID, filterExpression, sort); return new Select(this, filterExpression, sort, DataViewRowState.CurrentRows).SelectRows(); } public DataRow[] Select(string filterExpression, string sort, DataViewRowState recordStates) { DataCommonEventSource.Log.Trace(" {0}, filterExpression='{1}', sort='{2}', recordStates={3}", ObjectID, filterExpression, sort, recordStates); return new Select(this, filterExpression, sort, recordStates).SelectRows(); } internal void SetNewRecord(DataRow row, int proposedRecord, DataRowAction action = DataRowAction.Change, bool isInMerge = false, bool fireEvent = true, bool suppressEnsurePropertyChanged = false) { Exception deferredException = null; SetNewRecordWorker(row, proposedRecord, action, isInMerge, suppressEnsurePropertyChanged, -1, fireEvent, out deferredException); if (deferredException != null) { throw deferredException; } } private void SetNewRecordWorker(DataRow row, int proposedRecord, DataRowAction action, bool isInMerge, bool suppressEnsurePropertyChanged, int position, bool fireEvent, out Exception deferredException) { deferredException = null; if (row._tempRecord != proposedRecord) { if (!_inDataLoad) { row.CheckInTable(); CheckNotModifying(row); } if (proposedRecord == row._newRecord) { if (isInMerge) { RaiseRowChanged(null, row, action); } return; } row._tempRecord = proposedRecord; } DataRowChangeEventArgs args = null; try { row._action = action; args = RaiseRowChanging(null, row, action, fireEvent); } catch { row._tempRecord = -1; throw; } finally { row._action = DataRowAction.Nothing; } row._tempRecord = -1; int record = row._newRecord; int num = ((proposedRecord != -1) ? proposedRecord : ((row.RowState != DataRowState.Unchanged) ? row._oldRecord : (-1))); if (action == DataRowAction.Add) { if (position == -1) { Rows.ArrayAdd(row); } else { Rows.ArrayInsert(row, position); } } List list = null; if ((action == DataRowAction.Delete || action == DataRowAction.Change) && _dependentColumns != null && _dependentColumns.Count > 0) { list = new List(); for (int i = 0; i < ParentRelations.Count; i++) { DataRelation dataRelation = ParentRelations[i]; if (dataRelation.ChildTable == row.Table) { list.InsertRange(list.Count, row.GetParentRows(dataRelation)); } } for (int j = 0; j < ChildRelations.Count; j++) { DataRelation dataRelation2 = ChildRelations[j]; if (dataRelation2.ParentTable == row.Table) { list.InsertRange(list.Count, row.GetChildRows(dataRelation2)); } } } if (!suppressEnsurePropertyChanged && !row.HasPropertyChanged && row._newRecord != proposedRecord && -1 != proposedRecord && -1 != row._newRecord) { row.LastChangedColumn = null; row.LastChangedColumn = null; } if (LiveIndexes.Count != 0) { if (-1 == record && -1 != proposedRecord && -1 != row._oldRecord && proposedRecord != row._oldRecord) { record = row._oldRecord; } DataViewRowState recordState = row.GetRecordState(record); DataViewRowState recordState2 = row.GetRecordState(num); row._newRecord = proposedRecord; if (proposedRecord != -1) { _recordManager[proposedRecord] = row; } DataViewRowState recordState3 = row.GetRecordState(record); DataViewRowState recordState4 = row.GetRecordState(num); RecordStateChanged(record, recordState, recordState3, num, recordState2, recordState4); } else { row._newRecord = proposedRecord; if (proposedRecord != -1) { _recordManager[proposedRecord] = row; } } row.ResetLastChangedColumn(); if (-1 != record && record != row._oldRecord && record != row._tempRecord && record != row._newRecord && row == _recordManager[record]) { FreeRecord(ref record); } if (row.RowState == DataRowState.Detached && row.rowID != -1) { RemoveRow(row, check: false); } if (_dependentColumns != null && _dependentColumns.Count > 0) { try { EvaluateExpressions(row, action, list); } catch (Exception ex) { if (action != DataRowAction.Add) { throw ex; } deferredException = ex; } } try { if (fireEvent) { RaiseRowChanged(args, row, action); } } catch (Exception e) when (ADP.IsCatchableExceptionType(e)) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); } } internal void SetOldRecord(DataRow row, int proposedRecord) { if (!_inDataLoad) { row.CheckInTable(); CheckNotModifying(row); } if (proposedRecord == row._oldRecord) { return; } int record = row._oldRecord; try { if (LiveIndexes.Count != 0) { if (-1 == record && -1 != proposedRecord && -1 != row._newRecord && proposedRecord != row._newRecord) { record = row._newRecord; } DataViewRowState recordState = row.GetRecordState(record); DataViewRowState recordState2 = row.GetRecordState(proposedRecord); row._oldRecord = proposedRecord; if (proposedRecord != -1) { _recordManager[proposedRecord] = row; } DataViewRowState recordState3 = row.GetRecordState(record); DataViewRowState recordState4 = row.GetRecordState(proposedRecord); RecordStateChanged(record, recordState, recordState3, proposedRecord, recordState2, recordState4); } else { row._oldRecord = proposedRecord; if (proposedRecord != -1) { _recordManager[proposedRecord] = row; } } } finally { if (record != -1 && record != row._tempRecord && record != row._oldRecord && record != row._newRecord) { FreeRecord(ref record); } if (row.RowState == DataRowState.Detached && row.rowID != -1) { RemoveRow(row, check: false); } } } private void RestoreShadowIndexes() { _shadowCount--; if (_shadowCount == 0) { _shadowIndexes = null; } } private void SetShadowIndexes() { if (_shadowIndexes == null) { _shadowIndexes = LiveIndexes; _shadowCount = 1; } else { _shadowCount++; } } internal void ShadowIndexCopy() { if (_shadowIndexes == _indexes) { _shadowIndexes = new List(_indexes); } } public override string ToString() { if (_displayExpression != null) { return TableName + " + " + DisplayExpressionInternal; } return TableName; } public void BeginLoadData() { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { if (_inDataLoad) { return; } _inDataLoad = true; _loadIndex = null; _initialLoad = Rows.Count == 0; if (_initialLoad) { SuspendIndexEvents(); } else { if (_primaryKey != null) { _loadIndex = _primaryKey.Key.GetSortIndex(DataViewRowState.OriginalRows); } if (_loadIndex != null) { _loadIndex.AddRef(); } } if (DataSet != null) { _savedEnforceConstraints = DataSet.EnforceConstraints; DataSet.EnforceConstraints = false; } else { EnforceConstraints = false; } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public void EndLoadData() { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { if (_inDataLoad) { if (_loadIndex != null) { _loadIndex.RemoveRef(); } if (_loadIndexwithOriginalAdded != null) { _loadIndexwithOriginalAdded.RemoveRef(); } if (_loadIndexwithCurrentDeleted != null) { _loadIndexwithCurrentDeleted.RemoveRef(); } _loadIndex = null; _loadIndexwithOriginalAdded = null; _loadIndexwithCurrentDeleted = null; _inDataLoad = false; RestoreIndexEvents(forceReset: false); if (DataSet != null) { DataSet.EnforceConstraints = _savedEnforceConstraints; } else { EnforceConstraints = true; } } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public DataRow LoadDataRow(object[] values, bool fAcceptChanges) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, fAcceptChanges={1}", ObjectID, fAcceptChanges); try { DataRow dataRow; if (_inDataLoad) { int num = NewRecordFromArray(values); if (_loadIndex != null) { int num2 = _loadIndex.FindRecord(num); if (num2 != -1) { int record = _loadIndex.GetRecord(num2); dataRow = _recordManager[record]; dataRow.CancelEdit(); if (dataRow.RowState == DataRowState.Deleted) { SetNewRecord(dataRow, dataRow._oldRecord, DataRowAction.Rollback); } SetNewRecord(dataRow, num); if (fAcceptChanges) { dataRow.AcceptChanges(); } return dataRow; } } dataRow = NewRow(num); AddRow(dataRow); if (fAcceptChanges) { dataRow.AcceptChanges(); } return dataRow; } dataRow = UpdatingAdd(values); if (fAcceptChanges) { dataRow.AcceptChanges(); } return dataRow; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public DataRow LoadDataRow(object[] values, LoadOption loadOption) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, loadOption={1}", ObjectID, loadOption); try { Index searchIndex = null; if (_primaryKey != null) { if (loadOption == LoadOption.Upsert) { if (_loadIndexwithCurrentDeleted == null) { _loadIndexwithCurrentDeleted = _primaryKey.Key.GetSortIndex(DataViewRowState.CurrentRows | DataViewRowState.Deleted); if (_loadIndexwithCurrentDeleted != null) { _loadIndexwithCurrentDeleted.AddRef(); } } searchIndex = _loadIndexwithCurrentDeleted; } else { if (_loadIndexwithOriginalAdded == null) { _loadIndexwithOriginalAdded = _primaryKey.Key.GetSortIndex(DataViewRowState.OriginalRows | DataViewRowState.Added); if (_loadIndexwithOriginalAdded != null) { _loadIndexwithOriginalAdded.AddRef(); } } searchIndex = _loadIndexwithOriginalAdded; } } if (_inDataLoad && !AreIndexEventsSuspended) { SuspendIndexEvents(); } return LoadRow(values, loadOption, searchIndex); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } internal DataRow UpdatingAdd(object[] values) { Index index = null; if (_primaryKey != null) { index = _primaryKey.Key.GetSortIndex(DataViewRowState.OriginalRows); } if (index != null) { int num = NewRecordFromArray(values); int num2 = index.FindRecord(num); if (num2 != -1) { int record = index.GetRecord(num2); DataRow dataRow = _recordManager[record]; dataRow.RejectChanges(); SetNewRecord(dataRow, num); return dataRow; } DataRow dataRow2 = NewRow(num); Rows.Add(dataRow2); return dataRow2; } return Rows.Add(values); } internal bool UpdatingCurrent(DataRow row, DataRowAction action) { if (action != DataRowAction.Add && action != DataRowAction.Change && action != DataRowAction.Rollback && action != DataRowAction.ChangeOriginal) { return action == DataRowAction.ChangeCurrentAndOriginal; } return true; } internal DataColumn AddUniqueKey(int position) { if (_colUnique != null) { return _colUnique; } DataColumn[] primaryKey = PrimaryKey; if (primaryKey.Length == 1) { return primaryKey[0]; } DataColumn dataColumn = new DataColumn(XMLSchema.GenUniqueColumnName(TableName + "_Id", this), typeof(int), null, MappingType.Hidden); dataColumn.Prefix = _tablePrefix; dataColumn.AutoIncrement = true; dataColumn.AllowDBNull = false; dataColumn.Unique = true; if (position == -1) { Columns.Add(dataColumn); } else { for (int num = Columns.Count - 1; num >= position; num--) { Columns[num].SetOrdinalInternal(num + 1); } Columns.AddAt(position, dataColumn); dataColumn.SetOrdinalInternal(position); } if (primaryKey.Length == 0) { PrimaryKey = new DataColumn[1] { dataColumn }; } _colUnique = dataColumn; return _colUnique; } internal DataColumn AddUniqueKey() { return AddUniqueKey(-1); } internal DataColumn AddForeignKey(DataColumn parentKey) { DataColumn dataColumn = new DataColumn(XMLSchema.GenUniqueColumnName(parentKey.ColumnName, this), parentKey.DataType, null, MappingType.Hidden); Columns.Add(dataColumn); return dataColumn; } internal void UpdatePropertyDescriptorCollectionCache() { _propertyDescriptorCollectionCache = null; } internal PropertyDescriptorCollection GetPropertyDescriptorCollection(Attribute[] attributes) { if (_propertyDescriptorCollectionCache == null) { int count = Columns.Count; int count2 = ChildRelations.Count; PropertyDescriptor[] array = new PropertyDescriptor[count + count2]; for (int i = 0; i < count; i++) { array[i] = new DataColumnPropertyDescriptor(Columns[i]); } for (int j = 0; j < count2; j++) { array[count + j] = new DataRelationPropertyDescriptor(ChildRelations[j]); } _propertyDescriptorCollectionCache = new PropertyDescriptorCollection(array); } return _propertyDescriptorCollectionCache; } public void Merge(DataTable table) { Merge(table, preserveChanges: false, MissingSchemaAction.Add); } public void Merge(DataTable table, bool preserveChanges) { Merge(table, preserveChanges, MissingSchemaAction.Add); } public void Merge(DataTable table, bool preserveChanges, MissingSchemaAction missingSchemaAction) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, table={1}, preserveChanges={2}, missingSchemaAction={3}", ObjectID, table?.ObjectID ?? 0, preserveChanges, missingSchemaAction); try { if (table == null) { throw ExceptionBuilder.ArgumentNull("table"); } if ((uint)(missingSchemaAction - 1) <= 3u) { new Merger(this, preserveChanges, missingSchemaAction).MergeTable(table); return; } throw ADP.InvalidMissingSchemaAction(missingSchemaAction); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public void Load(IDataReader reader) { Load(reader, LoadOption.PreserveChanges, null); } public void Load(IDataReader reader, LoadOption loadOption) { Load(reader, loadOption, null); } public virtual void Load(IDataReader reader, LoadOption loadOption, FillErrorEventHandler errorHandler) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, loadOption={1}", ObjectID, loadOption); try { if (PrimaryKey.Length != 0 || !(reader is DataTableReader dataTableReader) || dataTableReader.CurrentDataTable != this) { LoadAdapter loadAdapter = new LoadAdapter(); loadAdapter.FillLoadOption = loadOption; loadAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; if (errorHandler != null) { loadAdapter.FillError += errorHandler; } loadAdapter.FillFromReader(new DataTable[1] { this }, reader, 0, 0); if (!reader.IsClosed && !reader.NextResult()) { reader.Close(); } } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } private DataRow LoadRow(object[] values, LoadOption loadOption, Index searchIndex) { DataRow dataRow = null; int num2; if (searchIndex != null) { int[] array = Array.Empty(); if (_primaryKey != null) { array = new int[_primaryKey.ColumnsReference.Length]; for (int i = 0; i < _primaryKey.ColumnsReference.Length; i++) { array[i] = _primaryKey.ColumnsReference[i].Ordinal; } } object[] array2 = new object[array.Length]; for (int j = 0; j < array.Length; j++) { array2[j] = values[array[j]]; } Range range = searchIndex.FindRecords(array2); if (!range.IsNull) { int num = 0; for (int k = range.Min; k <= range.Max; k++) { int record = searchIndex.GetRecord(k); dataRow = _recordManager[record]; num2 = NewRecordFromArray(values); for (int l = 0; l < values.Length; l++) { if (values[l] == null) { _columnCollection[l].Copy(record, num2); } } for (int m = values.Length; m < _columnCollection.Count; m++) { _columnCollection[m].Copy(record, num2); } if (loadOption != LoadOption.Upsert || dataRow.RowState != DataRowState.Deleted) { SetDataRowWithLoadOption(dataRow, num2, loadOption, checkReadOnly: true); } else { num++; } } if (num == 0) { return dataRow; } } } num2 = NewRecordFromArray(values); dataRow = NewRow(num2); DataRowChangeEventArgs dataRowChangeEventArgs = null; DataRowAction eAction; switch (loadOption) { case LoadOption.OverwriteChanges: case LoadOption.PreserveChanges: eAction = DataRowAction.ChangeCurrentAndOriginal; break; case LoadOption.Upsert: eAction = DataRowAction.Add; break; default: throw ExceptionBuilder.ArgumentOutOfRange("LoadOption"); } dataRowChangeEventArgs = RaiseRowChanging(null, dataRow, eAction); InsertRow(dataRow, -1L, -1, fireEvent: false); switch (loadOption) { case LoadOption.OverwriteChanges: case LoadOption.PreserveChanges: SetOldRecord(dataRow, num2); break; default: throw ExceptionBuilder.ArgumentOutOfRange("LoadOption"); case LoadOption.Upsert: break; } RaiseRowChanged(dataRowChangeEventArgs, dataRow, eAction); return dataRow; } private void SetDataRowWithLoadOption(DataRow dataRow, int recordNo, LoadOption loadOption, bool checkReadOnly) { bool flag = false; if (checkReadOnly) { foreach (DataColumn column in Columns) { if (!column.ReadOnly || column.Computed) { continue; } switch (loadOption) { case LoadOption.OverwriteChanges: if (dataRow[column, DataRowVersion.Current] != column[recordNo] || dataRow[column, DataRowVersion.Original] != column[recordNo]) { flag = true; } break; case LoadOption.Upsert: if (dataRow[column, DataRowVersion.Current] != column[recordNo]) { flag = true; } break; case LoadOption.PreserveChanges: if (dataRow[column, DataRowVersion.Original] != column[recordNo]) { flag = true; } break; } } } DataRowChangeEventArgs args = null; DataRowAction dataRowAction = DataRowAction.Nothing; int record = dataRow._tempRecord; dataRow._tempRecord = recordNo; switch (loadOption) { case LoadOption.OverwriteChanges: dataRowAction = DataRowAction.ChangeCurrentAndOriginal; break; case LoadOption.Upsert: switch (dataRow.RowState) { case DataRowState.Unchanged: foreach (DataColumn column2 in dataRow.Table.Columns) { if (column2.Compare(dataRow._newRecord, recordNo) != 0) { dataRowAction = DataRowAction.Change; break; } } break; default: dataRowAction = DataRowAction.Change; break; case DataRowState.Deleted: break; } break; case LoadOption.PreserveChanges: { DataRowState rowState = dataRow.RowState; dataRowAction = ((rowState != DataRowState.Unchanged) ? DataRowAction.ChangeOriginal : DataRowAction.ChangeCurrentAndOriginal); break; } default: throw ExceptionBuilder.ArgumentOutOfRange("LoadOption"); } try { args = RaiseRowChanging(null, dataRow, dataRowAction); if (dataRowAction == DataRowAction.Nothing) { dataRow._inChangingEvent = true; try { args = OnRowChanging(args, dataRow, dataRowAction); } finally { dataRow._inChangingEvent = false; } } } finally { if (DataRowState.Detached == dataRow.RowState) { if (-1 != record) { FreeRecord(ref record); } } else if (dataRow._tempRecord != recordNo) { if (-1 != record) { FreeRecord(ref record); } if (-1 != recordNo) { FreeRecord(ref recordNo); } recordNo = dataRow._tempRecord; } else { dataRow._tempRecord = record; } } if (dataRow._tempRecord != -1) { dataRow.CancelEdit(); } switch (loadOption) { case LoadOption.OverwriteChanges: SetNewRecord(dataRow, recordNo, DataRowAction.Change, isInMerge: false, fireEvent: false); SetOldRecord(dataRow, recordNo); break; case LoadOption.Upsert: if (dataRow.RowState == DataRowState.Unchanged) { SetNewRecord(dataRow, recordNo, DataRowAction.Change, isInMerge: false, fireEvent: false); if (!dataRow.HasChanges()) { SetOldRecord(dataRow, recordNo); } } else { if (dataRow.RowState == DataRowState.Deleted) { dataRow.RejectChanges(); } SetNewRecord(dataRow, recordNo, DataRowAction.Change, isInMerge: false, fireEvent: false); } break; case LoadOption.PreserveChanges: if (dataRow.RowState == DataRowState.Unchanged) { SetOldRecord(dataRow, recordNo); SetNewRecord(dataRow, recordNo, DataRowAction.Change, isInMerge: false, fireEvent: false); } else { SetOldRecord(dataRow, recordNo); } break; default: throw ExceptionBuilder.ArgumentOutOfRange("LoadOption"); } if (flag) { string text = "ReadOnly Data is Modified."; if (dataRow.RowError.Length == 0) { dataRow.RowError = text; } else { dataRow.RowError = dataRow.RowError + " ]:[ " + text; } foreach (DataColumn column3 in Columns) { if (column3.ReadOnly && !column3.Computed) { dataRow.SetColumnError(column3, text); } } } args = RaiseRowChanged(args, dataRow, dataRowAction); if (dataRowAction == DataRowAction.Nothing) { dataRow._inChangingEvent = true; try { OnRowChanged(args, dataRow, dataRowAction); } finally { dataRow._inChangingEvent = false; } } } public DataTableReader CreateDataReader() { return new DataTableReader(this); } public void WriteXml(Stream stream) { WriteXml(stream, XmlWriteMode.IgnoreSchema, writeHierarchy: false); } public void WriteXml(Stream stream, bool writeHierarchy) { WriteXml(stream, XmlWriteMode.IgnoreSchema, writeHierarchy); } public void WriteXml(TextWriter writer) { WriteXml(writer, XmlWriteMode.IgnoreSchema, writeHierarchy: false); } public void WriteXml(TextWriter writer, bool writeHierarchy) { WriteXml(writer, XmlWriteMode.IgnoreSchema, writeHierarchy); } public void WriteXml(XmlWriter writer) { WriteXml(writer, XmlWriteMode.IgnoreSchema, writeHierarchy: false); } public void WriteXml(XmlWriter writer, bool writeHierarchy) { WriteXml(writer, XmlWriteMode.IgnoreSchema, writeHierarchy); } public void WriteXml(string fileName) { WriteXml(fileName, XmlWriteMode.IgnoreSchema, writeHierarchy: false); } public void WriteXml(string fileName, bool writeHierarchy) { WriteXml(fileName, XmlWriteMode.IgnoreSchema, writeHierarchy); } public void WriteXml(Stream stream, XmlWriteMode mode) { WriteXml(stream, mode, writeHierarchy: false); } public void WriteXml(Stream stream, XmlWriteMode mode, bool writeHierarchy) { if (stream != null) { XmlTextWriter xmlTextWriter = new XmlTextWriter(stream, null); xmlTextWriter.Formatting = Formatting.Indented; WriteXml(xmlTextWriter, mode, writeHierarchy); } } public void WriteXml(TextWriter writer, XmlWriteMode mode) { WriteXml(writer, mode, writeHierarchy: false); } public void WriteXml(TextWriter writer, XmlWriteMode mode, bool writeHierarchy) { if (writer != null) { XmlTextWriter xmlTextWriter = new XmlTextWriter(writer); xmlTextWriter.Formatting = Formatting.Indented; WriteXml(xmlTextWriter, mode, writeHierarchy); } } public void WriteXml(XmlWriter writer, XmlWriteMode mode) { WriteXml(writer, mode, writeHierarchy: false); } public void WriteXml(XmlWriter writer, XmlWriteMode mode, bool writeHierarchy) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, mode={1}", ObjectID, mode); try { if (_tableName.Length == 0) { throw ExceptionBuilder.CanNotSerializeDataTableWithEmptyName(); } if (writer == null) { return; } switch (mode) { case XmlWriteMode.DiffGram: new NewDiffgramGen(this, writeHierarchy).Save(writer, this); break; case XmlWriteMode.WriteSchema: { DataSet dataSet = null; string tableNamespace = _tableNamespace; if (DataSet == null) { dataSet = new DataSet(); dataSet.SetLocaleValue(_culture, _cultureUserSet); dataSet.CaseSensitive = CaseSensitive; dataSet.Namespace = Namespace; dataSet.RemotingFormat = RemotingFormat; dataSet.Tables.Add(this); } if (writer != null) { new XmlDataTreeWriter(this, writeHierarchy).Save(writer, writeSchema: true); } if (dataSet != null) { dataSet.Tables.Remove(this); _tableNamespace = tableNamespace; } break; } default: new XmlDataTreeWriter(this, writeHierarchy).Save(writer, writeSchema: false); break; } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public void WriteXml(string fileName, XmlWriteMode mode) { WriteXml(fileName, mode, writeHierarchy: false); } public void WriteXml(string fileName, XmlWriteMode mode, bool writeHierarchy) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, fileName='{1}', mode={2}", ObjectID, fileName, mode); try { using XmlTextWriter xmlTextWriter = new XmlTextWriter(fileName, null); xmlTextWriter.Formatting = Formatting.Indented; xmlTextWriter.WriteStartDocument(standalone: true); WriteXml(xmlTextWriter, mode, writeHierarchy); xmlTextWriter.WriteEndDocument(); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public void WriteXmlSchema(Stream stream) { WriteXmlSchema(stream, writeHierarchy: false); } public void WriteXmlSchema(Stream stream, bool writeHierarchy) { if (stream != null) { XmlTextWriter xmlTextWriter = new XmlTextWriter(stream, null); xmlTextWriter.Formatting = Formatting.Indented; WriteXmlSchema(xmlTextWriter, writeHierarchy); } } public void WriteXmlSchema(TextWriter writer) { WriteXmlSchema(writer, writeHierarchy: false); } public void WriteXmlSchema(TextWriter writer, bool writeHierarchy) { if (writer != null) { XmlTextWriter xmlTextWriter = new XmlTextWriter(writer); xmlTextWriter.Formatting = Formatting.Indented; WriteXmlSchema(xmlTextWriter, writeHierarchy); } } private bool CheckForClosureOnExpressions(DataTable dt, bool writeHierarchy) { List list = new List(); list.Add(dt); if (writeHierarchy) { CreateTableList(dt, list); } return CheckForClosureOnExpressionTables(list); } private bool CheckForClosureOnExpressionTables(List tableList) { foreach (DataTable table in tableList) { foreach (DataColumn column in table.Columns) { if (column.Expression.Length == 0) { continue; } DataColumn[] dependency = column.DataExpression.GetDependency(); for (int i = 0; i < dependency.Length; i++) { if (!tableList.Contains(dependency[i].Table)) { return false; } } } } return true; } public void WriteXmlSchema(XmlWriter writer) { WriteXmlSchema(writer, writeHierarchy: false); } public void WriteXmlSchema(XmlWriter writer, bool writeHierarchy) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { if (_tableName.Length == 0) { throw ExceptionBuilder.CanNotSerializeDataTableWithEmptyName(); } if (!CheckForClosureOnExpressions(this, writeHierarchy)) { throw ExceptionBuilder.CanNotSerializeDataTableHierarchy(); } DataSet dataSet = null; string tableNamespace = _tableNamespace; if (DataSet == null) { dataSet = new DataSet(); dataSet.SetLocaleValue(_culture, _cultureUserSet); dataSet.CaseSensitive = CaseSensitive; dataSet.Namespace = Namespace; dataSet.RemotingFormat = RemotingFormat; dataSet.Tables.Add(this); } if (writer != null) { new XmlTreeGen(SchemaFormat.Public).Save(null, this, writer, writeHierarchy); } if (dataSet != null) { dataSet.Tables.Remove(this); _tableNamespace = tableNamespace; } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public void WriteXmlSchema(string fileName) { WriteXmlSchema(fileName, writeHierarchy: false); } public void WriteXmlSchema(string fileName, bool writeHierarchy) { XmlTextWriter xmlTextWriter = new XmlTextWriter(fileName, null); try { xmlTextWriter.Formatting = Formatting.Indented; xmlTextWriter.WriteStartDocument(standalone: true); WriteXmlSchema(xmlTextWriter, writeHierarchy); xmlTextWriter.WriteEndDocument(); } finally { xmlTextWriter.Close(); } } public XmlReadMode ReadXml(Stream stream) { if (stream == null) { return XmlReadMode.Auto; } XmlTextReader xmlTextReader = new XmlTextReader(stream); xmlTextReader.XmlResolver = null; return ReadXml(xmlTextReader, denyResolving: false); } public XmlReadMode ReadXml(TextReader reader) { if (reader == null) { return XmlReadMode.Auto; } XmlTextReader xmlTextReader = new XmlTextReader(reader); xmlTextReader.XmlResolver = null; return ReadXml(xmlTextReader, denyResolving: false); } public XmlReadMode ReadXml(string fileName) { XmlTextReader xmlTextReader = new XmlTextReader(fileName); xmlTextReader.XmlResolver = null; try { return ReadXml(xmlTextReader, denyResolving: false); } finally { xmlTextReader.Close(); } } public XmlReadMode ReadXml(XmlReader reader) { return ReadXml(reader, denyResolving: false); } private void RestoreConstraint(bool originalEnforceConstraint) { if (DataSet != null) { DataSet.EnforceConstraints = originalEnforceConstraint; } else { EnforceConstraints = originalEnforceConstraint; } } private bool IsEmptyXml(XmlReader reader) { if (reader.IsEmptyElement) { if (reader.AttributeCount == 0 || (reader.LocalName == "diffgram" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-diffgram-v1")) { return true; } if (reader.AttributeCount == 1) { reader.MoveToAttribute(0); if (Namespace == reader.Value && Prefix == reader.LocalName && reader.Prefix == "xmlns" && reader.NamespaceURI == "http://www.w3.org/2000/xmlns/") { return true; } } } return false; } internal XmlReadMode ReadXml(XmlReader reader, bool denyResolving) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, denyResolving={1}", ObjectID, denyResolving); try { RowDiffIdUsageSection rowDiffIdUsageSection = default(RowDiffIdUsageSection); try { bool flag = false; bool flag2 = false; bool flag3 = false; bool isXdr = false; int num = -1; XmlReadMode result = XmlReadMode.Auto; rowDiffIdUsageSection.Prepare(this); if (reader == null) { return result; } bool flag4 = false; if (DataSet != null) { flag4 = DataSet.EnforceConstraints; DataSet.EnforceConstraints = false; } else { flag4 = EnforceConstraints; EnforceConstraints = false; } if (reader is XmlTextReader) { ((XmlTextReader)reader).WhitespaceHandling = WhitespaceHandling.Significant; } XmlDocument xmlDocument = new XmlDocument(); XmlDataLoader xmlDataLoader = null; reader.MoveToContent(); if (Columns.Count == 0 && IsEmptyXml(reader)) { reader.Read(); return result; } if (reader.NodeType == XmlNodeType.Element) { num = reader.Depth; if (reader.LocalName == "diffgram" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-diffgram-v1") { if (Columns.Count == 0) { if (reader.IsEmptyElement) { reader.Read(); return XmlReadMode.DiffGram; } throw ExceptionBuilder.DataTableInferenceNotSupported(); } ReadXmlDiffgram(reader); ReadEndElement(reader); RestoreConstraint(flag4); return XmlReadMode.DiffGram; } if (reader.LocalName == "Schema" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-data") { ReadXDRSchema(reader); RestoreConstraint(flag4); return XmlReadMode.ReadSchema; } if (reader.LocalName == "schema" && reader.NamespaceURI == "http://www.w3.org/2001/XMLSchema") { ReadXmlSchema(reader, denyResolving); RestoreConstraint(flag4); return XmlReadMode.ReadSchema; } if (reader.LocalName == "schema" && reader.NamespaceURI.StartsWith("http://www.w3.org/", StringComparison.Ordinal)) { if (DataSet != null) { DataSet.RestoreEnforceConstraints(flag4); } else { _enforceConstraints = flag4; } throw ExceptionBuilder.DataSetUnsupportedSchema("http://www.w3.org/2001/XMLSchema"); } XmlElement xmlElement = xmlDocument.CreateElement(reader.Prefix, reader.LocalName, reader.NamespaceURI); if (reader.HasAttributes) { int attributeCount = reader.AttributeCount; for (int i = 0; i < attributeCount; i++) { reader.MoveToAttribute(i); if (reader.NamespaceURI.Equals("http://www.w3.org/2000/xmlns/")) { xmlElement.SetAttribute(reader.Name, reader.GetAttribute(i)); continue; } XmlAttribute xmlAttribute = xmlElement.SetAttributeNode(reader.LocalName, reader.NamespaceURI); xmlAttribute.Prefix = reader.Prefix; xmlAttribute.Value = reader.GetAttribute(i); } } reader.Read(); while (MoveToElement(reader, num)) { if (reader.LocalName == "diffgram" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-diffgram-v1") { ReadXmlDiffgram(reader); ReadEndElement(reader); RestoreConstraint(flag4); return XmlReadMode.DiffGram; } if (!flag2 && !flag && reader.LocalName == "Schema" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-data") { ReadXDRSchema(reader); flag2 = true; isXdr = true; continue; } if (reader.LocalName == "schema" && reader.NamespaceURI == "http://www.w3.org/2001/XMLSchema") { ReadXmlSchema(reader, denyResolving); flag2 = true; continue; } if (reader.LocalName == "schema" && reader.NamespaceURI.StartsWith("http://www.w3.org/", StringComparison.Ordinal)) { if (DataSet != null) { DataSet.RestoreEnforceConstraints(flag4); } else { _enforceConstraints = flag4; } throw ExceptionBuilder.DataSetUnsupportedSchema("http://www.w3.org/2001/XMLSchema"); } if (reader.LocalName == "diffgram" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-diffgram-v1") { ReadXmlDiffgram(reader); flag3 = true; result = XmlReadMode.DiffGram; continue; } flag = true; if (!flag2 && Columns.Count == 0) { XmlNode newChild = xmlDocument.ReadNode(reader); xmlElement.AppendChild(newChild); continue; } if (xmlDataLoader == null) { xmlDataLoader = new XmlDataLoader(this, isXdr, xmlElement, ignoreSchema: false); } xmlDataLoader.LoadData(reader); result = (flag2 ? XmlReadMode.ReadSchema : XmlReadMode.IgnoreSchema); } ReadEndElement(reader); xmlDocument.AppendChild(xmlElement); if (!flag2 && Columns.Count == 0) { if (IsEmptyXml(reader)) { reader.Read(); return result; } throw ExceptionBuilder.DataTableInferenceNotSupported(); } if (xmlDataLoader == null) { xmlDataLoader = new XmlDataLoader(this, isXdr, ignoreSchema: false); } } RestoreConstraint(flag4); return result; } finally { } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } internal XmlReadMode ReadXml(XmlReader reader, XmlReadMode mode, bool denyResolving) { RowDiffIdUsageSection rowDiffIdUsageSection = default(RowDiffIdUsageSection); try { bool flag = false; bool flag2 = false; bool isXdr = false; int depth = -1; XmlReadMode result = mode; rowDiffIdUsageSection.Prepare(this); if (reader == null) { return result; } bool flag3 = false; if (DataSet != null) { flag3 = DataSet.EnforceConstraints; DataSet.EnforceConstraints = false; } else { flag3 = EnforceConstraints; EnforceConstraints = false; } if (reader is XmlTextReader) { ((XmlTextReader)reader).WhitespaceHandling = WhitespaceHandling.Significant; } XmlDocument xmlDocument = new XmlDocument(); if (mode != XmlReadMode.Fragment && reader.NodeType == XmlNodeType.Element) { depth = reader.Depth; } reader.MoveToContent(); if (Columns.Count == 0 && IsEmptyXml(reader)) { reader.Read(); return result; } XmlDataLoader xmlDataLoader = null; if (reader.NodeType == XmlNodeType.Element) { XmlElement xmlElement = null; if (mode == XmlReadMode.Fragment) { xmlDocument.AppendChild(xmlDocument.CreateElement("ds_sqlXmlWraPPeR")); xmlElement = xmlDocument.DocumentElement; } else { if (reader.LocalName == "diffgram" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-diffgram-v1") { if (mode == XmlReadMode.DiffGram || mode == XmlReadMode.IgnoreSchema) { if (Columns.Count == 0) { if (reader.IsEmptyElement) { reader.Read(); return XmlReadMode.DiffGram; } throw ExceptionBuilder.DataTableInferenceNotSupported(); } ReadXmlDiffgram(reader); ReadEndElement(reader); } else { reader.Skip(); } RestoreConstraint(flag3); return result; } if (reader.LocalName == "Schema" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-data") { if (mode != XmlReadMode.IgnoreSchema && mode != XmlReadMode.InferSchema) { ReadXDRSchema(reader); } else { reader.Skip(); } RestoreConstraint(flag3); return result; } if (reader.LocalName == "schema" && reader.NamespaceURI == "http://www.w3.org/2001/XMLSchema") { if (mode != XmlReadMode.IgnoreSchema && mode != XmlReadMode.InferSchema) { ReadXmlSchema(reader, denyResolving); } else { reader.Skip(); } RestoreConstraint(flag3); return result; } if (reader.LocalName == "schema" && reader.NamespaceURI.StartsWith("http://www.w3.org/", StringComparison.Ordinal)) { if (DataSet != null) { DataSet.RestoreEnforceConstraints(flag3); } else { _enforceConstraints = flag3; } throw ExceptionBuilder.DataSetUnsupportedSchema("http://www.w3.org/2001/XMLSchema"); } xmlElement = xmlDocument.CreateElement(reader.Prefix, reader.LocalName, reader.NamespaceURI); if (reader.HasAttributes) { int attributeCount = reader.AttributeCount; for (int i = 0; i < attributeCount; i++) { reader.MoveToAttribute(i); if (reader.NamespaceURI.Equals("http://www.w3.org/2000/xmlns/")) { xmlElement.SetAttribute(reader.Name, reader.GetAttribute(i)); continue; } XmlAttribute xmlAttribute = xmlElement.SetAttributeNode(reader.LocalName, reader.NamespaceURI); xmlAttribute.Prefix = reader.Prefix; xmlAttribute.Value = reader.GetAttribute(i); } } reader.Read(); } while (MoveToElement(reader, depth)) { if (reader.LocalName == "Schema" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-data") { if (!flag && !flag2 && mode != XmlReadMode.IgnoreSchema && mode != XmlReadMode.InferSchema) { ReadXDRSchema(reader); flag = true; isXdr = true; } else { reader.Skip(); } continue; } if (reader.LocalName == "schema" && reader.NamespaceURI == "http://www.w3.org/2001/XMLSchema") { if (mode != XmlReadMode.IgnoreSchema && mode != XmlReadMode.InferSchema) { ReadXmlSchema(reader, denyResolving); flag = true; } else { reader.Skip(); } continue; } if (reader.LocalName == "diffgram" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-diffgram-v1") { if (mode == XmlReadMode.DiffGram || mode == XmlReadMode.IgnoreSchema) { if (Columns.Count == 0) { if (reader.IsEmptyElement) { reader.Read(); return XmlReadMode.DiffGram; } throw ExceptionBuilder.DataTableInferenceNotSupported(); } ReadXmlDiffgram(reader); result = XmlReadMode.DiffGram; } else { reader.Skip(); } continue; } if (reader.LocalName == "schema" && reader.NamespaceURI.StartsWith("http://www.w3.org/", StringComparison.Ordinal)) { if (DataSet != null) { DataSet.RestoreEnforceConstraints(flag3); } else { _enforceConstraints = flag3; } throw ExceptionBuilder.DataSetUnsupportedSchema("http://www.w3.org/2001/XMLSchema"); } if (mode == XmlReadMode.DiffGram) { reader.Skip(); continue; } flag2 = true; if (mode == XmlReadMode.InferSchema) { XmlNode newChild = xmlDocument.ReadNode(reader); xmlElement.AppendChild(newChild); continue; } if (Columns.Count == 0) { throw ExceptionBuilder.DataTableInferenceNotSupported(); } if (xmlDataLoader == null) { xmlDataLoader = new XmlDataLoader(this, isXdr, xmlElement, mode == XmlReadMode.IgnoreSchema); } xmlDataLoader.LoadData(reader); } ReadEndElement(reader); xmlDocument.AppendChild(xmlElement); if (xmlDataLoader == null) { xmlDataLoader = new XmlDataLoader(this, isXdr, mode == XmlReadMode.IgnoreSchema); } switch (mode) { case XmlReadMode.DiffGram: RestoreConstraint(flag3); return result; case XmlReadMode.InferSchema: if (Columns.Count == 0) { throw ExceptionBuilder.DataTableInferenceNotSupported(); } break; } } RestoreConstraint(flag3); return result; } finally { } } internal void ReadEndElement(XmlReader reader) { while (reader.NodeType == XmlNodeType.Whitespace) { reader.Skip(); } if (reader.NodeType == XmlNodeType.None) { reader.Skip(); } else if (reader.NodeType == XmlNodeType.EndElement) { reader.ReadEndElement(); } } internal void ReadXDRSchema(XmlReader reader) { new XmlDocument().ReadNode(reader); } internal bool MoveToElement(XmlReader reader, int depth) { while (!reader.EOF && reader.NodeType != XmlNodeType.EndElement && reader.NodeType != XmlNodeType.Element && reader.Depth > depth) { reader.Read(); } return reader.NodeType == XmlNodeType.Element; } private void ReadXmlDiffgram(XmlReader reader) { int depth = reader.Depth; bool enforceConstraints = EnforceConstraints; EnforceConstraints = false; bool flag; DataTable dataTable; if (Rows.Count == 0) { flag = true; dataTable = this; } else { flag = false; dataTable = Clone(); dataTable.EnforceConstraints = false; } dataTable.Rows._nullInList = 0; reader.MoveToContent(); if (reader.LocalName != "diffgram" && reader.NamespaceURI != "urn:schemas-microsoft-com:xml-diffgram-v1") { return; } reader.Read(); if (reader.NodeType == XmlNodeType.Whitespace) { MoveToElement(reader, reader.Depth - 1); } dataTable._fInLoadDiffgram = true; if (reader.Depth > depth) { if (reader.NamespaceURI != "urn:schemas-microsoft-com:xml-diffgram-v1" && reader.NamespaceURI != "urn:schemas-microsoft-com:xml-msdata") { XmlElement topNode = new XmlDocument().CreateElement(reader.Prefix, reader.LocalName, reader.NamespaceURI); reader.Read(); if (reader.Depth - 1 > depth) { XmlDataLoader xmlDataLoader = new XmlDataLoader(dataTable, IsXdr: false, topNode, ignoreSchema: false); xmlDataLoader._isDiffgram = true; xmlDataLoader.LoadData(reader); } ReadEndElement(reader); } if ((reader.LocalName == "before" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-diffgram-v1") || (reader.LocalName == "errors" && reader.NamespaceURI == "urn:schemas-microsoft-com:xml-diffgram-v1")) { new XMLDiffLoader().LoadDiffGram(dataTable, reader); } while (reader.Depth > depth) { reader.Read(); } ReadEndElement(reader); } if (dataTable.Rows._nullInList > 0) { throw ExceptionBuilder.RowInsertMissing(dataTable.TableName); } dataTable._fInLoadDiffgram = false; List list = new List(); list.Add(this); CreateTableList(this, list); for (int i = 0; i < list.Count; i++) { DataRelation[] nestedParentRelations = list[i].NestedParentRelations; DataRelation[] array = nestedParentRelations; foreach (DataRelation dataRelation in array) { if (dataRelation == null || dataRelation.ParentTable != list[i]) { continue; } foreach (DataRow row in list[i].Rows) { DataRelation[] array2 = nestedParentRelations; foreach (DataRelation rel in array2) { row.CheckForLoops(rel); } } } } if (!flag) { Merge(dataTable); } EnforceConstraints = enforceConstraints; } internal void ReadXSDSchema(XmlReader reader, bool denyResolving) { XmlSchemaSet xmlSchemaSet = new XmlSchemaSet(); while (reader.LocalName == "schema" && reader.NamespaceURI == "http://www.w3.org/2001/XMLSchema") { XmlSchema schema = XmlSchema.Read(reader, null); xmlSchemaSet.Add(schema); ReadEndElement(reader); } xmlSchemaSet.Compile(); new XSDSchema().LoadSchema(xmlSchemaSet, this); } public void ReadXmlSchema(Stream stream) { if (stream != null) { ReadXmlSchema(new XmlTextReader(stream), denyResolving: false); } } public void ReadXmlSchema(TextReader reader) { if (reader != null) { ReadXmlSchema(new XmlTextReader(reader), denyResolving: false); } } public void ReadXmlSchema(string fileName) { XmlTextReader xmlTextReader = new XmlTextReader(fileName); try { ReadXmlSchema(xmlTextReader, denyResolving: false); } finally { xmlTextReader.Close(); } } public void ReadXmlSchema(XmlReader reader) { ReadXmlSchema(reader, denyResolving: false); } internal void ReadXmlSchema(XmlReader reader, bool denyResolving) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, denyResolving={1}", ObjectID, denyResolving); try { DataSet dataSet = new DataSet(); SerializationFormat remotingFormat = RemotingFormat; dataSet.ReadXmlSchema(reader, denyResolving); string mainTableName = dataSet.MainTableName; if (string.IsNullOrEmpty(_tableName) && string.IsNullOrEmpty(mainTableName)) { return; } DataTable dataTable = null; if (!string.IsNullOrEmpty(_tableName)) { if (!string.IsNullOrEmpty(Namespace)) { dataTable = dataSet.Tables[_tableName, Namespace]; } else { int num = dataSet.Tables.InternalIndexOf(_tableName); if (num > -1) { dataTable = dataSet.Tables[num]; } } } else { string tableNamespace = string.Empty; int num2 = mainTableName.IndexOf(':'); if (num2 > -1) { tableNamespace = mainTableName.Substring(0, num2); } string name = mainTableName.Substring(num2 + 1, mainTableName.Length - num2 - 1); dataTable = dataSet.Tables[name, tableNamespace]; } if (dataTable == null) { string empty = string.Empty; empty = (string.IsNullOrEmpty(_tableName) ? mainTableName : ((Namespace.Length > 0) ? (Namespace + ":" + _tableName) : _tableName)); throw ExceptionBuilder.TableNotFound(empty); } dataTable._remotingFormat = remotingFormat; List list = new List(); list.Add(dataTable); CreateTableList(dataTable, list); List list2 = new List(); CreateRelationList(list, list2); if (list2.Count == 0) { if (Columns.Count == 0) { DataTable dataTable2 = dataTable; dataTable2?.CloneTo(this, null, skipExpressionColumns: false); if (DataSet == null && _tableNamespace == null) { _tableNamespace = dataTable2.Namespace; } } return; } if (string.IsNullOrEmpty(TableName)) { TableName = dataTable.TableName; if (!string.IsNullOrEmpty(dataTable.Namespace)) { Namespace = dataTable.Namespace; } } if (DataSet == null) { DataSet dataSet2 = new DataSet(dataSet.DataSetName); dataSet2.SetLocaleValue(dataSet.Locale, dataSet.ShouldSerializeLocale()); dataSet2.CaseSensitive = dataSet.CaseSensitive; dataSet2.Namespace = dataSet.Namespace; dataSet2._mainTableName = dataSet._mainTableName; dataSet2.RemotingFormat = dataSet.RemotingFormat; dataSet2.Tables.Add(this); } CloneHierarchy(dataTable, DataSet, null); foreach (DataTable item in list) { DataTable dataTable3 = DataSet.Tables[item._tableName, item.Namespace]; foreach (Constraint constraint in dataSet.Tables[item._tableName, item.Namespace].Constraints) { if (constraint is ForeignKeyConstraint foreignKeyConstraint && foreignKeyConstraint.Table != foreignKeyConstraint.RelatedTable && list.Contains(foreignKeyConstraint.Table) && list.Contains(foreignKeyConstraint.RelatedTable)) { ForeignKeyConstraint foreignKeyConstraint2 = (ForeignKeyConstraint)foreignKeyConstraint.Clone(dataTable3.DataSet); if (!dataTable3.Constraints.Contains(foreignKeyConstraint2.ConstraintName)) { dataTable3.Constraints.Add(foreignKeyConstraint2); } } } } foreach (DataRelation item2 in list2) { if (!DataSet.Relations.Contains(item2.RelationName)) { DataSet.Relations.Add(item2.Clone(DataSet)); } } bool flag = false; foreach (DataTable item3 in list) { foreach (DataColumn column in item3.Columns) { flag = false; if (column.Expression.Length != 0) { DataColumn[] dependency = column.DataExpression.GetDependency(); for (int i = 0; i < dependency.Length; i++) { if (!list.Contains(dependency[i].Table)) { flag = true; break; } } } if (!flag) { DataSet.Tables[item3.TableName, item3.Namespace].Columns[column.ColumnName].Expression = column.Expression; } } flag = false; } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } private void CreateTableList(DataTable currentTable, List tableList) { foreach (DataRelation childRelation in currentTable.ChildRelations) { if (!tableList.Contains(childRelation.ChildTable)) { tableList.Add(childRelation.ChildTable); CreateTableList(childRelation.ChildTable, tableList); } } } private void CreateRelationList(List tableList, List relationList) { foreach (DataTable table in tableList) { foreach (DataRelation childRelation in table.ChildRelations) { if (tableList.Contains(childRelation.ChildTable) && tableList.Contains(childRelation.ParentTable)) { relationList.Add(childRelation); } } } } public static XmlSchemaComplexType GetDataTableSchema(XmlSchemaSet schemaSet) { XmlSchemaComplexType xmlSchemaComplexType = new XmlSchemaComplexType(); XmlSchemaSequence xmlSchemaSequence = new XmlSchemaSequence(); XmlSchemaAny item = new XmlSchemaAny { Namespace = "http://www.w3.org/2001/XMLSchema", MinOccurs = 0m, MaxOccurs = decimal.MaxValue, ProcessContents = XmlSchemaContentProcessing.Lax }; xmlSchemaSequence.Items.Add(item); item = new XmlSchemaAny { Namespace = "urn:schemas-microsoft-com:xml-diffgram-v1", MinOccurs = 1m, ProcessContents = XmlSchemaContentProcessing.Lax }; xmlSchemaSequence.Items.Add(item); xmlSchemaComplexType.Particle = xmlSchemaSequence; return xmlSchemaComplexType; } XmlSchema IXmlSerializable.GetSchema() { return GetSchema(); } protected virtual XmlSchema GetSchema() { if (GetType() == typeof(DataTable)) { return null; } MemoryStream memoryStream = new MemoryStream(); XmlWriter xmlWriter = new XmlTextWriter(memoryStream, null); if (xmlWriter != null) { new XmlTreeGen(SchemaFormat.WebService).Save(this, xmlWriter); } memoryStream.Position = 0L; return XmlSchema.Read(new XmlTextReader(memoryStream), null); } void IXmlSerializable.ReadXml(XmlReader reader) { IXmlTextParser xmlTextParser = reader as IXmlTextParser; bool normalized = true; if (xmlTextParser != null) { normalized = xmlTextParser.Normalized; xmlTextParser.Normalized = false; } ReadXmlSerializable(reader); if (xmlTextParser != null) { xmlTextParser.Normalized = normalized; } } void IXmlSerializable.WriteXml(XmlWriter writer) { WriteXmlSchema(writer, writeHierarchy: false); WriteXml(writer, XmlWriteMode.DiffGram, writeHierarchy: false); } protected virtual void ReadXmlSerializable(XmlReader reader) { ReadXml(reader, XmlReadMode.DiffGram, denyResolving: true); } internal void AddDependentColumn(DataColumn expressionColumn) { if (_dependentColumns == null) { _dependentColumns = new List(); } if (!_dependentColumns.Contains(expressionColumn)) { _dependentColumns.Add(expressionColumn); } } internal void RemoveDependentColumn(DataColumn expressionColumn) { if (_dependentColumns != null && _dependentColumns.Contains(expressionColumn)) { _dependentColumns.Remove(expressionColumn); } } internal void EvaluateExpressions() { if (_dependentColumns == null || 0 >= _dependentColumns.Count) { return; } foreach (DataRow row in Rows) { if (row._oldRecord != -1 && row._oldRecord != row._newRecord) { EvaluateDependentExpressions(_dependentColumns, row, DataRowVersion.Original, null); } if (row._newRecord != -1) { EvaluateDependentExpressions(_dependentColumns, row, DataRowVersion.Current, null); } if (row._tempRecord != -1) { EvaluateDependentExpressions(_dependentColumns, row, DataRowVersion.Proposed, null); } } } internal void EvaluateExpressions(DataRow row, DataRowAction action, List cachedRows) { if (action == DataRowAction.Add || action == DataRowAction.Change || (action == DataRowAction.Rollback && (row._oldRecord != -1 || row._newRecord != -1))) { if (row._oldRecord != -1 && row._oldRecord != row._newRecord) { EvaluateDependentExpressions(_dependentColumns, row, DataRowVersion.Original, cachedRows); } if (row._newRecord != -1) { EvaluateDependentExpressions(_dependentColumns, row, DataRowVersion.Current, cachedRows); } if (row._tempRecord != -1) { EvaluateDependentExpressions(_dependentColumns, row, DataRowVersion.Proposed, cachedRows); } return; } switch (action) { case DataRowAction.Rollback: if (row._oldRecord != -1 || row._newRecord != -1) { break; } goto case DataRowAction.Delete; case DataRowAction.Delete: if (_dependentColumns == null) { break; } foreach (DataColumn dependentColumn in _dependentColumns) { if (dependentColumn.DataExpression == null || !dependentColumn.DataExpression.HasLocalAggregate() || dependentColumn.Table != this) { continue; } for (int i = 0; i < Rows.Count; i++) { DataRow dataRow = Rows[i]; if (dataRow._oldRecord != -1 && dataRow._oldRecord != dataRow._newRecord) { EvaluateDependentExpressions(_dependentColumns, dataRow, DataRowVersion.Original, null); } } for (int j = 0; j < Rows.Count; j++) { DataRow dataRow2 = Rows[j]; if (dataRow2._tempRecord != -1) { EvaluateDependentExpressions(_dependentColumns, dataRow2, DataRowVersion.Proposed, null); } } for (int k = 0; k < Rows.Count; k++) { DataRow dataRow3 = Rows[k]; if (dataRow3._newRecord != -1) { EvaluateDependentExpressions(_dependentColumns, dataRow3, DataRowVersion.Current, null); } } break; } if (cachedRows == null) { break; } { foreach (DataRow cachedRow in cachedRows) { if (cachedRow._oldRecord != -1 && cachedRow._oldRecord != cachedRow._newRecord) { cachedRow.Table.EvaluateDependentExpressions(cachedRow.Table._dependentColumns, cachedRow, DataRowVersion.Original, null); } if (cachedRow._newRecord != -1) { cachedRow.Table.EvaluateDependentExpressions(cachedRow.Table._dependentColumns, cachedRow, DataRowVersion.Current, null); } if (cachedRow._tempRecord != -1) { cachedRow.Table.EvaluateDependentExpressions(cachedRow.Table._dependentColumns, cachedRow, DataRowVersion.Proposed, null); } } break; } } } internal void EvaluateExpressions(DataColumn column) { int count = column._table.Rows.Count; if (column.DataExpression.IsTableAggregate() && count > 0) { object value = column.DataExpression.Evaluate(); for (int i = 0; i < count; i++) { DataRow dataRow = column._table.Rows[i]; if (dataRow._oldRecord != -1 && dataRow._oldRecord != dataRow._newRecord) { column[dataRow._oldRecord] = value; } if (dataRow._newRecord != -1) { column[dataRow._newRecord] = value; } if (dataRow._tempRecord != -1) { column[dataRow._tempRecord] = value; } } } else { for (int j = 0; j < count; j++) { DataRow dataRow2 = column._table.Rows[j]; if (dataRow2._oldRecord != -1 && dataRow2._oldRecord != dataRow2._newRecord) { column[dataRow2._oldRecord] = column.DataExpression.Evaluate(dataRow2, DataRowVersion.Original); } if (dataRow2._newRecord != -1) { column[dataRow2._newRecord] = column.DataExpression.Evaluate(dataRow2, DataRowVersion.Current); } if (dataRow2._tempRecord != -1) { column[dataRow2._tempRecord] = column.DataExpression.Evaluate(dataRow2, DataRowVersion.Proposed); } } } column.Table.ResetInternalIndexes(column); EvaluateDependentExpressions(column); } internal void EvaluateDependentExpressions(DataColumn column) { if (column._dependentColumns == null) { return; } foreach (DataColumn dependentColumn in column._dependentColumns) { if (dependentColumn._table != null && column != dependentColumn) { EvaluateExpressions(dependentColumn); } } } internal void EvaluateDependentExpressions(List columns, DataRow row, DataRowVersion version, List cachedRows) { if (columns == null) { return; } int count = columns.Count; for (int i = 0; i < count; i++) { if (columns[i].Table != this) { continue; } DataColumn dataColumn = columns[i]; if (dataColumn.DataExpression != null && dataColumn.DataExpression.HasLocalAggregate()) { DataRowVersion dataRowVersion = ((version == DataRowVersion.Proposed) ? DataRowVersion.Default : version); bool flag = dataColumn.DataExpression.IsTableAggregate(); object newValue = null; if (flag) { newValue = dataColumn.DataExpression.Evaluate(row, dataRowVersion); } for (int j = 0; j < Rows.Count; j++) { DataRow dataRow = Rows[j]; if (dataRow.RowState != DataRowState.Deleted && (dataRowVersion != DataRowVersion.Original || (dataRow._oldRecord != -1 && dataRow._oldRecord != dataRow._newRecord))) { if (!flag) { newValue = dataColumn.DataExpression.Evaluate(dataRow, dataRowVersion); } SilentlySetValue(dataRow, dataColumn, dataRowVersion, newValue); } } } else if (row.RowState != DataRowState.Deleted && (version != DataRowVersion.Original || (row._oldRecord != -1 && row._oldRecord != row._newRecord))) { SilentlySetValue(row, dataColumn, version, (dataColumn.DataExpression == null) ? dataColumn.DefaultValue : dataColumn.DataExpression.Evaluate(row, version)); } } count = columns.Count; for (int k = 0; k < count; k++) { DataColumn dataColumn2 = columns[k]; if (dataColumn2.Table == this && (dataColumn2.DataExpression == null || dataColumn2.DataExpression.HasLocalAggregate())) { continue; } DataRowVersion dataRowVersion2 = ((version == DataRowVersion.Proposed) ? DataRowVersion.Default : version); if (cachedRows != null) { foreach (DataRow cachedRow in cachedRows) { if (cachedRow.Table == dataColumn2.Table && (dataRowVersion2 != DataRowVersion.Original || cachedRow._newRecord != cachedRow._oldRecord) && cachedRow != null && cachedRow.RowState != DataRowState.Deleted && (version != DataRowVersion.Original || cachedRow._oldRecord != -1)) { object newValue2 = dataColumn2.DataExpression.Evaluate(cachedRow, dataRowVersion2); SilentlySetValue(cachedRow, dataColumn2, dataRowVersion2, newValue2); } } } for (int l = 0; l < ParentRelations.Count; l++) { DataRelation dataRelation = ParentRelations[l]; if (dataRelation.ParentTable != dataColumn2.Table) { continue; } DataRow[] parentRows = row.GetParentRows(dataRelation, version); foreach (DataRow dataRow2 in parentRows) { if ((cachedRows == null || !cachedRows.Contains(dataRow2)) && (dataRowVersion2 != DataRowVersion.Original || dataRow2._newRecord != dataRow2._oldRecord) && dataRow2 != null && dataRow2.RowState != DataRowState.Deleted && (version != DataRowVersion.Original || dataRow2._oldRecord != -1)) { object newValue3 = dataColumn2.DataExpression.Evaluate(dataRow2, dataRowVersion2); SilentlySetValue(dataRow2, dataColumn2, dataRowVersion2, newValue3); } } } for (int n = 0; n < ChildRelations.Count; n++) { DataRelation dataRelation2 = ChildRelations[n]; if (dataRelation2.ChildTable != dataColumn2.Table) { continue; } DataRow[] parentRows = row.GetChildRows(dataRelation2, version); foreach (DataRow dataRow3 in parentRows) { if ((cachedRows == null || !cachedRows.Contains(dataRow3)) && (dataRowVersion2 != DataRowVersion.Original || dataRow3._newRecord != dataRow3._oldRecord) && dataRow3 != null && dataRow3.RowState != DataRowState.Deleted && (version != DataRowVersion.Original || dataRow3._oldRecord != -1)) { object newValue4 = dataColumn2.DataExpression.Evaluate(dataRow3, dataRowVersion2); SilentlySetValue(dataRow3, dataColumn2, dataRowVersion2, newValue4); } } } } } } public sealed class DataTableClearEventArgs : EventArgs { public DataTable Table { get; } public string TableName => Table.TableName; public string TableNamespace => Table.Namespace; public DataTableClearEventArgs(DataTable dataTable) { Table = dataTable; } } public delegate void DataTableClearEventHandler(object sender, DataTableClearEventArgs e); [DefaultEvent("CollectionChanged")] [ListBindable(false)] public sealed class DataTableCollection : InternalDataCollectionBase { private readonly DataSet _dataSet; private readonly ArrayList _list; private int _defaultNameIndex; private DataTable[] _delayedAddRangeTables; private CollectionChangeEventHandler _onCollectionChangedDelegate; private CollectionChangeEventHandler _onCollectionChangingDelegate; private static int s_objectTypeCount; private readonly int _objectID; protected override ArrayList List => _list; internal int ObjectID => _objectID; public DataTable this[int index] { get { try { return (DataTable)_list[index]; } catch (ArgumentOutOfRangeException) { throw ExceptionBuilder.TableOutOfRange(index); } } } public DataTable this[string name] { get { int num = InternalIndexOf(name); if (num == -2) { throw ExceptionBuilder.CaseInsensitiveNameConflict(name); } if (num == -3) { throw ExceptionBuilder.NamespaceNameConflict(name); } if (num >= 0) { return (DataTable)_list[num]; } return null; } } public DataTable this[string name, string tableNamespace] { get { if (tableNamespace == null) { throw ExceptionBuilder.ArgumentNull("tableNamespace"); } int num = InternalIndexOf(name, tableNamespace); if (num == -2) { throw ExceptionBuilder.CaseInsensitiveNameConflict(name); } if (num >= 0) { return (DataTable)_list[num]; } return null; } } public event CollectionChangeEventHandler CollectionChanged { add { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onCollectionChangedDelegate = (CollectionChangeEventHandler)Delegate.Combine(_onCollectionChangedDelegate, value); } remove { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onCollectionChangedDelegate = (CollectionChangeEventHandler)Delegate.Remove(_onCollectionChangedDelegate, value); } } public event CollectionChangeEventHandler CollectionChanging { add { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onCollectionChangingDelegate = (CollectionChangeEventHandler)Delegate.Combine(_onCollectionChangingDelegate, value); } remove { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onCollectionChangingDelegate = (CollectionChangeEventHandler)Delegate.Remove(_onCollectionChangingDelegate, value); } } internal DataTableCollection(DataSet dataSet) { _list = new ArrayList(); _defaultNameIndex = 1; _objectID = Interlocked.Increment(ref s_objectTypeCount); base..ctor(); DataCommonEventSource.Log.Trace(" {0}, dataSet={1}", ObjectID, dataSet?.ObjectID ?? 0); _dataSet = dataSet; } internal DataTable GetTable(string name, string ns) { for (int i = 0; i < _list.Count; i++) { DataTable dataTable = (DataTable)_list[i]; if (dataTable.TableName == name && dataTable.Namespace == ns) { return dataTable; } } return null; } internal DataTable GetTableSmart(string name, string ns) { int num = 0; DataTable result = null; for (int i = 0; i < _list.Count; i++) { DataTable dataTable = (DataTable)_list[i]; if (dataTable.TableName == name) { if (dataTable.Namespace == ns) { return dataTable; } num++; result = dataTable; } } if (num != 1) { return null; } return result; } public void Add(DataTable table) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, table={1}", ObjectID, table?.ObjectID ?? 0); try { OnCollectionChanging(new CollectionChangeEventArgs(CollectionChangeAction.Add, table)); BaseAdd(table); ArrayAdd(table); if (table.SetLocaleValue(_dataSet.Locale, userSet: false, resetIndexes: false) || table.SetCaseSensitiveValue(_dataSet.CaseSensitive, userSet: false, resetIndexes: false)) { table.ResetIndexes(); } OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Add, table)); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public void AddRange(DataTable[] tables) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { if (_dataSet._fInitInProgress) { _delayedAddRangeTables = tables; } else { if (tables == null) { return; } foreach (DataTable dataTable in tables) { if (dataTable != null) { Add(dataTable); } } } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public DataTable Add(string name) { DataTable dataTable = new DataTable(name); Add(dataTable); return dataTable; } public DataTable Add(string name, string tableNamespace) { DataTable dataTable = new DataTable(name, tableNamespace); Add(dataTable); return dataTable; } public DataTable Add() { DataTable dataTable = new DataTable(); Add(dataTable); return dataTable; } private void ArrayAdd(DataTable table) { _list.Add(table); } internal string AssignName() { string text = null; while (Contains(text = MakeName(_defaultNameIndex))) { _defaultNameIndex++; } return text; } private void BaseAdd(DataTable table) { if (table == null) { throw ExceptionBuilder.ArgumentNull("table"); } if (table.DataSet == _dataSet) { throw ExceptionBuilder.TableAlreadyInTheDataSet(); } if (table.DataSet != null) { throw ExceptionBuilder.TableAlreadyInOtherDataSet(); } if (table.TableName.Length == 0) { table.TableName = AssignName(); } else { if (NamesEqual(table.TableName, _dataSet.DataSetName, fCaseSensitive: false, _dataSet.Locale) != 0 && !table._fNestedInDataset) { throw ExceptionBuilder.DatasetConflictingName(_dataSet.DataSetName); } RegisterName(table.TableName, table.Namespace); } table.SetDataSet(_dataSet); } private void BaseGroupSwitch(DataTable[] oldArray, int oldLength, DataTable[] newArray, int newLength) { int num = 0; for (int i = 0; i < oldLength; i++) { bool flag = false; for (int j = num; j < newLength; j++) { if (oldArray[i] == newArray[j]) { if (num == j) { num++; } flag = true; break; } } if (!flag && oldArray[i].DataSet == _dataSet) { BaseRemove(oldArray[i]); } } for (int k = 0; k < newLength; k++) { if (newArray[k].DataSet != _dataSet) { BaseAdd(newArray[k]); _list.Add(newArray[k]); } } } private void BaseRemove(DataTable table) { if (CanRemove(table, fThrowException: true)) { UnregisterName(table.TableName); table.SetDataSet(null); } _list.Remove(table); _dataSet.OnRemovedTable(table); } public bool CanRemove(DataTable table) { return CanRemove(table, fThrowException: false); } internal bool CanRemove(DataTable table, bool fThrowException) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, table={1}, fThrowException={2}", ObjectID, table?.ObjectID ?? 0, fThrowException); try { if (table == null) { if (!fThrowException) { return false; } throw ExceptionBuilder.ArgumentNull("table"); } if (table.DataSet != _dataSet) { if (!fThrowException) { return false; } throw ExceptionBuilder.TableNotInTheDataSet(table.TableName); } _dataSet.OnRemoveTable(table); if (table.ChildRelations.Count != 0 || table.ParentRelations.Count != 0) { if (!fThrowException) { return false; } throw ExceptionBuilder.TableInRelation(); } ParentForeignKeyConstraintEnumerator parentForeignKeyConstraintEnumerator = new ParentForeignKeyConstraintEnumerator(_dataSet, table); while (parentForeignKeyConstraintEnumerator.GetNext()) { ForeignKeyConstraint foreignKeyConstraint = parentForeignKeyConstraintEnumerator.GetForeignKeyConstraint(); if (foreignKeyConstraint.Table != table || foreignKeyConstraint.RelatedTable != table) { if (!fThrowException) { return false; } throw ExceptionBuilder.TableInConstraint(table, foreignKeyConstraint); } } ChildForeignKeyConstraintEnumerator childForeignKeyConstraintEnumerator = new ChildForeignKeyConstraintEnumerator(_dataSet, table); while (childForeignKeyConstraintEnumerator.GetNext()) { ForeignKeyConstraint foreignKeyConstraint2 = childForeignKeyConstraintEnumerator.GetForeignKeyConstraint(); if (foreignKeyConstraint2.Table != table || foreignKeyConstraint2.RelatedTable != table) { if (!fThrowException) { return false; } throw ExceptionBuilder.TableInConstraint(table, foreignKeyConstraint2); } } return true; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public void Clear() { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { int count = _list.Count; DataTable[] array = new DataTable[_list.Count]; _list.CopyTo(array, 0); OnCollectionChanging(InternalDataCollectionBase.s_refreshEventArgs); if (_dataSet._fInitInProgress && _delayedAddRangeTables != null) { _delayedAddRangeTables = null; } BaseGroupSwitch(array, count, null, 0); _list.Clear(); OnCollectionChanged(InternalDataCollectionBase.s_refreshEventArgs); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public bool Contains(string name) { return InternalIndexOf(name) >= 0; } public bool Contains(string name, string tableNamespace) { if (name == null) { throw ExceptionBuilder.ArgumentNull("name"); } if (tableNamespace == null) { throw ExceptionBuilder.ArgumentNull("tableNamespace"); } return InternalIndexOf(name, tableNamespace) >= 0; } internal bool Contains(string name, string tableNamespace, bool checkProperty, bool caseSensitive) { if (!caseSensitive) { return InternalIndexOf(name) >= 0; } int count = _list.Count; for (int i = 0; i < count; i++) { DataTable dataTable = (DataTable)_list[i]; string text = (checkProperty ? dataTable.Namespace : dataTable._tableNamespace); if (NamesEqual(dataTable.TableName, name, fCaseSensitive: true, _dataSet.Locale) == 1 && text == tableNamespace) { return true; } } return false; } internal bool Contains(string name, bool caseSensitive) { if (!caseSensitive) { return InternalIndexOf(name) >= 0; } int count = _list.Count; for (int i = 0; i < count; i++) { DataTable dataTable = (DataTable)_list[i]; if (NamesEqual(dataTable.TableName, name, fCaseSensitive: true, _dataSet.Locale) == 1) { return true; } } return false; } public void CopyTo(DataTable[] array, int index) { if (array == null) { throw ExceptionBuilder.ArgumentNull("array"); } if (index < 0) { throw ExceptionBuilder.ArgumentOutOfRange("index"); } if (array.Length - index < _list.Count) { throw ExceptionBuilder.InvalidOffsetLength(); } for (int i = 0; i < _list.Count; i++) { array[index + i] = (DataTable)_list[i]; } } public int IndexOf(DataTable table) { int count = _list.Count; for (int i = 0; i < count; i++) { if (table == (DataTable)_list[i]) { return i; } } return -1; } public int IndexOf(string tableName) { int num = InternalIndexOf(tableName); if (num >= 0) { return num; } return -1; } public int IndexOf(string tableName, string tableNamespace) { return IndexOf(tableName, tableNamespace, chekforNull: true); } internal int IndexOf(string tableName, string tableNamespace, bool chekforNull) { if (chekforNull) { if (tableName == null) { throw ExceptionBuilder.ArgumentNull("tableName"); } if (tableNamespace == null) { throw ExceptionBuilder.ArgumentNull("tableNamespace"); } } int num = InternalIndexOf(tableName, tableNamespace); if (num >= 0) { return num; } return -1; } internal void ReplaceFromInference(List tableList) { _list.Clear(); _list.AddRange(tableList); } internal int InternalIndexOf(string tableName) { int num = -1; if (tableName != null && 0 < tableName.Length) { int count = _list.Count; int num2 = 0; for (int i = 0; i < count; i++) { DataTable dataTable = (DataTable)_list[i]; switch (NamesEqual(dataTable.TableName, tableName, fCaseSensitive: false, _dataSet.Locale)) { case 1: { for (int j = i + 1; j < count; j++) { DataTable dataTable2 = (DataTable)_list[j]; if (NamesEqual(dataTable2.TableName, tableName, fCaseSensitive: false, _dataSet.Locale) == 1) { return -3; } } return i; } case -1: num = ((num == -1) ? i : (-2)); break; } } } return num; } internal int InternalIndexOf(string tableName, string tableNamespace) { int num = -1; if (tableName != null && 0 < tableName.Length) { int count = _list.Count; int num2 = 0; for (int i = 0; i < count; i++) { DataTable dataTable = (DataTable)_list[i]; num2 = NamesEqual(dataTable.TableName, tableName, fCaseSensitive: false, _dataSet.Locale); if (num2 == 1 && dataTable.Namespace == tableNamespace) { return i; } if (num2 == -1 && dataTable.Namespace == tableNamespace) { num = ((num == -1) ? i : (-2)); } } } return num; } internal void FinishInitCollection() { if (_delayedAddRangeTables == null) { return; } DataTable[] delayedAddRangeTables = _delayedAddRangeTables; foreach (DataTable dataTable in delayedAddRangeTables) { if (dataTable != null) { Add(dataTable); } } _delayedAddRangeTables = null; } private string MakeName(int index) { if (1 != index) { return "Table" + index.ToString(CultureInfo.InvariantCulture); } return "Table1"; } private void OnCollectionChanged(CollectionChangeEventArgs ccevent) { if (_onCollectionChangedDelegate != null) { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onCollectionChangedDelegate(this, ccevent); } } private void OnCollectionChanging(CollectionChangeEventArgs ccevent) { if (_onCollectionChangingDelegate != null) { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onCollectionChangingDelegate(this, ccevent); } } internal void RegisterName(string name, string tbNamespace) { DataCommonEventSource.Log.Trace(" {0}, name='{1}', tbNamespace='{2}'", ObjectID, name, tbNamespace); CultureInfo locale = _dataSet.Locale; int count = _list.Count; for (int i = 0; i < count; i++) { DataTable dataTable = (DataTable)_list[i]; if (NamesEqual(name, dataTable.TableName, fCaseSensitive: true, locale) != 0 && tbNamespace == dataTable.Namespace) { throw ExceptionBuilder.DuplicateTableName(((DataTable)_list[i]).TableName); } } if (NamesEqual(name, MakeName(_defaultNameIndex), fCaseSensitive: true, locale) != 0) { _defaultNameIndex++; } } public void Remove(DataTable table) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, table={1}", ObjectID, table?.ObjectID ?? 0); try { OnCollectionChanging(new CollectionChangeEventArgs(CollectionChangeAction.Remove, table)); BaseRemove(table); OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Remove, table)); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public void RemoveAt(int index) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, index={1}", ObjectID, index); try { DataTable dataTable = this[index]; if (dataTable == null) { throw ExceptionBuilder.TableOutOfRange(index); } Remove(dataTable); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public void Remove(string name) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, name='{1}'", ObjectID, name); try { DataTable dataTable = this[name]; if (dataTable == null) { throw ExceptionBuilder.TableNotInTheDataSet(name); } Remove(dataTable); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public void Remove(string name, string tableNamespace) { if (name == null) { throw ExceptionBuilder.ArgumentNull("name"); } if (tableNamespace == null) { throw ExceptionBuilder.ArgumentNull("tableNamespace"); } DataTable dataTable = this[name, tableNamespace]; if (dataTable == null) { throw ExceptionBuilder.TableNotInTheDataSet(name); } Remove(dataTable); } internal void UnregisterName(string name) { DataCommonEventSource.Log.Trace(" {0}, name='{1}'", ObjectID, name); if (NamesEqual(name, MakeName(_defaultNameIndex - 1), fCaseSensitive: true, _dataSet.Locale) != 0) { do { _defaultNameIndex--; } while (_defaultNameIndex > 1 && !Contains(MakeName(_defaultNameIndex - 1))); } } internal DataTableCollection() { ThrowStub.ThrowNotSupportedException(); } } public sealed class DataTableNewRowEventArgs : EventArgs { public DataRow Row { get; } public DataTableNewRowEventArgs(DataRow dataRow) { Row = dataRow; } } public delegate void DataTableNewRowEventHandler(object sender, DataTableNewRowEventArgs e); internal sealed class DataTablePropertyDescriptor : PropertyDescriptor { public DataTable Table { get; } public override Type ComponentType => typeof(DataRowView); public override bool IsReadOnly => false; public override Type PropertyType => typeof(IBindingList); internal DataTablePropertyDescriptor(DataTable dataTable) : base(dataTable.TableName, null) { Table = dataTable; } public override bool Equals(object other) { if (other is DataTablePropertyDescriptor) { return ((DataTablePropertyDescriptor)other).Table == Table; } return false; } public override int GetHashCode() { return Table.GetHashCode(); } public override bool CanResetValue(object component) { return false; } public override object GetValue(object component) { return ((DataViewManagerListItemTypeDescriptor)component).GetDataView(Table); } public override void ResetValue(object component) { } public override void SetValue(object component, object value) { } public override bool ShouldSerializeValue(object component) { return false; } } public sealed class DataTableReader : DbDataReader { private readonly DataTable[] _tables; private bool _isOpen = true; private DataTable _schemaTable; private int _tableCounter = -1; private int _rowCounter = -1; private DataTable _currentDataTable; private DataRow _currentDataRow; private bool _hasRows = true; private bool _reachEORows; private bool _currentRowRemoved; private bool _schemaIsChanged; private bool _started; private bool _readerIsInvalid; private DataTableReaderListener _listener; private bool _tableCleared; private bool ReaderIsInvalid { get { return _readerIsInvalid; } set { if (_readerIsInvalid != value) { _readerIsInvalid = value; if (_readerIsInvalid && _listener != null) { _listener.CleanUp(); } } } } private bool IsSchemaChanged { get { return _schemaIsChanged; } set { if (value && _schemaIsChanged != value) { _schemaIsChanged = value; if (_listener != null) { _listener.CleanUp(); } } } } internal DataTable CurrentDataTable => _currentDataTable; public override int Depth { get { ValidateOpen("Depth"); ValidateReader(); return 0; } } public override bool IsClosed => !_isOpen; public override int RecordsAffected { get { ValidateReader(); return 0; } } public override bool HasRows { get { ValidateOpen("HasRows"); ValidateReader(); return _hasRows; } } public override object this[int ordinal] { get { ValidateOpen("Item"); ValidateReader(); if (_currentDataRow == null || _currentDataRow.RowState == DataRowState.Deleted) { ReaderIsInvalid = true; throw ExceptionBuilder.InvalidDataTableReader(_currentDataTable.TableName); } try { return _currentDataRow[ordinal]; } catch (IndexOutOfRangeException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); throw ExceptionBuilder.ArgumentOutOfRange("ordinal"); } } } public override object this[string name] { get { ValidateOpen("Item"); ValidateReader(); if (_currentDataRow == null || _currentDataRow.RowState == DataRowState.Deleted) { ReaderIsInvalid = true; throw ExceptionBuilder.InvalidDataTableReader(_currentDataTable.TableName); } return _currentDataRow[name]; } } public override int FieldCount { get { ValidateOpen("FieldCount"); ValidateReader(); return _currentDataTable.Columns.Count; } } public DataTableReader(DataTable dataTable) { if (dataTable == null) { throw ExceptionBuilder.ArgumentNull("DataTable"); } _tables = new DataTable[1] { dataTable }; Init(); } public DataTableReader(DataTable[] dataTables) { if (dataTables == null) { throw ExceptionBuilder.ArgumentNull("DataTable"); } if (dataTables.Length == 0) { throw ExceptionBuilder.DataTableReaderArgumentIsEmpty(); } _tables = new DataTable[dataTables.Length]; for (int i = 0; i < dataTables.Length; i++) { if (dataTables[i] == null) { throw ExceptionBuilder.ArgumentNull("DataTable"); } _tables[i] = dataTables[i]; } Init(); } private void Init() { _tableCounter = 0; _reachEORows = false; _schemaIsChanged = false; _currentDataTable = _tables[_tableCounter]; _hasRows = _currentDataTable.Rows.Count > 0; ReaderIsInvalid = false; _listener = new DataTableReaderListener(this); } public override void Close() { if (_isOpen) { if (_listener != null) { _listener.CleanUp(); } _listener = null; _schemaTable = null; _isOpen = false; } } public override DataTable GetSchemaTable() { ValidateOpen("GetSchemaTable"); ValidateReader(); if (_schemaTable == null) { _schemaTable = GetSchemaTableFromDataTable(_currentDataTable); } return _schemaTable; } public override bool NextResult() { ValidateOpen("NextResult"); if (_tableCounter == _tables.Length - 1) { return false; } _currentDataTable = _tables[++_tableCounter]; if (_listener != null) { _listener.UpdataTable(_currentDataTable); } _schemaTable = null; _rowCounter = -1; _currentRowRemoved = false; _reachEORows = false; _schemaIsChanged = false; _started = false; ReaderIsInvalid = false; _tableCleared = false; _hasRows = _currentDataTable.Rows.Count > 0; return true; } public override bool Read() { if (!_started) { _started = true; } ValidateOpen("Read"); ValidateReader(); if (_reachEORows) { return false; } if (_rowCounter >= _currentDataTable.Rows.Count - 1) { _reachEORows = true; if (_listener != null) { _listener.CleanUp(); } return false; } _rowCounter++; ValidateRow(_rowCounter); _currentDataRow = _currentDataTable.Rows[_rowCounter]; while (_currentDataRow.RowState == DataRowState.Deleted) { _rowCounter++; if (_rowCounter == _currentDataTable.Rows.Count) { _reachEORows = true; if (_listener != null) { _listener.CleanUp(); } return false; } ValidateRow(_rowCounter); _currentDataRow = _currentDataTable.Rows[_rowCounter]; } if (_currentRowRemoved) { _currentRowRemoved = false; } return true; } public override Type GetProviderSpecificFieldType(int ordinal) { ValidateOpen("GetProviderSpecificFieldType"); ValidateReader(); return GetFieldType(ordinal); } public override object GetProviderSpecificValue(int ordinal) { ValidateOpen("GetProviderSpecificValue"); ValidateReader(); return GetValue(ordinal); } public override int GetProviderSpecificValues(object[] values) { ValidateOpen("GetProviderSpecificValues"); ValidateReader(); return GetValues(values); } public override bool GetBoolean(int ordinal) { ValidateState("GetBoolean"); ValidateReader(); try { return (bool)_currentDataRow[ordinal]; } catch (IndexOutOfRangeException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); throw ExceptionBuilder.ArgumentOutOfRange("ordinal"); } } public override byte GetByte(int ordinal) { ValidateState("GetByte"); ValidateReader(); try { return (byte)_currentDataRow[ordinal]; } catch (IndexOutOfRangeException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); throw ExceptionBuilder.ArgumentOutOfRange("ordinal"); } } public override long GetBytes(int ordinal, long dataIndex, byte[] buffer, int bufferIndex, int length) { ValidateState("GetBytes"); ValidateReader(); byte[] array; try { array = (byte[])_currentDataRow[ordinal]; } catch (IndexOutOfRangeException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); throw ExceptionBuilder.ArgumentOutOfRange("ordinal"); } if (buffer == null) { return array.Length; } int num = (int)dataIndex; int num2 = Math.Min(array.Length - num, length); if (num < 0) { throw ADP.InvalidSourceBufferIndex(array.Length, num, "dataIndex"); } if (bufferIndex < 0 || (bufferIndex > 0 && bufferIndex >= buffer.Length)) { throw ADP.InvalidDestinationBufferIndex(buffer.Length, bufferIndex, "bufferIndex"); } if (0 < num2) { Array.Copy(array, dataIndex, buffer, bufferIndex, num2); } else { if (length < 0) { throw ADP.InvalidDataLength(length); } num2 = 0; } return num2; } public override char GetChar(int ordinal) { ValidateState("GetChar"); ValidateReader(); try { return (char)_currentDataRow[ordinal]; } catch (IndexOutOfRangeException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); throw ExceptionBuilder.ArgumentOutOfRange("ordinal"); } } public override long GetChars(int ordinal, long dataIndex, char[] buffer, int bufferIndex, int length) { ValidateState("GetChars"); ValidateReader(); char[] array; try { array = (char[])_currentDataRow[ordinal]; } catch (IndexOutOfRangeException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); throw ExceptionBuilder.ArgumentOutOfRange("ordinal"); } if (buffer == null) { return array.Length; } int num = (int)dataIndex; int num2 = Math.Min(array.Length - num, length); if (num < 0) { throw ADP.InvalidSourceBufferIndex(array.Length, num, "dataIndex"); } if (bufferIndex < 0 || (bufferIndex > 0 && bufferIndex >= buffer.Length)) { throw ADP.InvalidDestinationBufferIndex(buffer.Length, bufferIndex, "bufferIndex"); } if (0 < num2) { Array.Copy(array, dataIndex, buffer, bufferIndex, num2); } else { if (length < 0) { throw ADP.InvalidDataLength(length); } num2 = 0; } return num2; } public override string GetDataTypeName(int ordinal) { ValidateOpen("GetDataTypeName"); ValidateReader(); return GetFieldType(ordinal).Name; } public override DateTime GetDateTime(int ordinal) { ValidateState("GetDateTime"); ValidateReader(); try { return (DateTime)_currentDataRow[ordinal]; } catch (IndexOutOfRangeException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); throw ExceptionBuilder.ArgumentOutOfRange("ordinal"); } } public override decimal GetDecimal(int ordinal) { ValidateState("GetDecimal"); ValidateReader(); try { return (decimal)_currentDataRow[ordinal]; } catch (IndexOutOfRangeException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); throw ExceptionBuilder.ArgumentOutOfRange("ordinal"); } } public override double GetDouble(int ordinal) { ValidateState("GetDouble"); ValidateReader(); try { return (double)_currentDataRow[ordinal]; } catch (IndexOutOfRangeException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); throw ExceptionBuilder.ArgumentOutOfRange("ordinal"); } } public override Type GetFieldType(int ordinal) { ValidateOpen("GetFieldType"); ValidateReader(); try { return _currentDataTable.Columns[ordinal].DataType; } catch (IndexOutOfRangeException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); throw ExceptionBuilder.ArgumentOutOfRange("ordinal"); } } public override float GetFloat(int ordinal) { ValidateState("GetFloat"); ValidateReader(); try { return (float)_currentDataRow[ordinal]; } catch (IndexOutOfRangeException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); throw ExceptionBuilder.ArgumentOutOfRange("ordinal"); } } public override Guid GetGuid(int ordinal) { ValidateState("GetGuid"); ValidateReader(); try { return (Guid)_currentDataRow[ordinal]; } catch (IndexOutOfRangeException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); throw ExceptionBuilder.ArgumentOutOfRange("ordinal"); } } public override short GetInt16(int ordinal) { ValidateState("GetInt16"); ValidateReader(); try { return (short)_currentDataRow[ordinal]; } catch (IndexOutOfRangeException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); throw ExceptionBuilder.ArgumentOutOfRange("ordinal"); } } public override int GetInt32(int ordinal) { ValidateState("GetInt32"); ValidateReader(); try { return (int)_currentDataRow[ordinal]; } catch (IndexOutOfRangeException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); throw ExceptionBuilder.ArgumentOutOfRange("ordinal"); } } public override long GetInt64(int ordinal) { ValidateState("GetInt64"); ValidateReader(); try { return (long)_currentDataRow[ordinal]; } catch (IndexOutOfRangeException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); throw ExceptionBuilder.ArgumentOutOfRange("ordinal"); } } public override string GetName(int ordinal) { ValidateOpen("GetName"); ValidateReader(); try { return _currentDataTable.Columns[ordinal].ColumnName; } catch (IndexOutOfRangeException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); throw ExceptionBuilder.ArgumentOutOfRange("ordinal"); } } public override int GetOrdinal(string name) { ValidateOpen("GetOrdinal"); ValidateReader(); DataColumn dataColumn = _currentDataTable.Columns[name]; if (dataColumn != null) { return dataColumn.Ordinal; } throw ExceptionBuilder.ColumnNotInTheTable(name, _currentDataTable.TableName); } public override string GetString(int ordinal) { ValidateState("GetString"); ValidateReader(); try { return (string)_currentDataRow[ordinal]; } catch (IndexOutOfRangeException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); throw ExceptionBuilder.ArgumentOutOfRange("ordinal"); } } public override object GetValue(int ordinal) { ValidateState("GetValue"); ValidateReader(); try { return _currentDataRow[ordinal]; } catch (IndexOutOfRangeException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); throw ExceptionBuilder.ArgumentOutOfRange("ordinal"); } } public override int GetValues(object[] values) { ValidateState("GetValues"); ValidateReader(); if (values == null) { throw ExceptionBuilder.ArgumentNull("values"); } Array.Copy(_currentDataRow.ItemArray, values, (_currentDataRow.ItemArray.Length > values.Length) ? values.Length : _currentDataRow.ItemArray.Length); if (_currentDataRow.ItemArray.Length <= values.Length) { return _currentDataRow.ItemArray.Length; } return values.Length; } public override bool IsDBNull(int ordinal) { ValidateState("IsDBNull"); ValidateReader(); try { return _currentDataRow.IsNull(ordinal); } catch (IndexOutOfRangeException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); throw ExceptionBuilder.ArgumentOutOfRange("ordinal"); } } public override IEnumerator GetEnumerator() { ValidateOpen("GetEnumerator"); return new DbEnumerator((IDataReader)this); } internal static DataTable GetSchemaTableFromDataTable(DataTable table) { if (table == null) { throw ExceptionBuilder.ArgumentNull("DataTable"); } DataTable dataTable = new DataTable("SchemaTable"); dataTable.Locale = CultureInfo.InvariantCulture; DataColumn column = new DataColumn(SchemaTableColumn.ColumnName, typeof(string)); DataColumn column2 = new DataColumn(SchemaTableColumn.ColumnOrdinal, typeof(int)); DataColumn dataColumn = new DataColumn(SchemaTableColumn.ColumnSize, typeof(int)); DataColumn column3 = new DataColumn(SchemaTableColumn.NumericPrecision, typeof(short)); DataColumn column4 = new DataColumn(SchemaTableColumn.NumericScale, typeof(short)); DataColumn column5 = new DataColumn(SchemaTableColumn.DataType, typeof(Type)); DataColumn column6 = new DataColumn(SchemaTableColumn.ProviderType, typeof(int)); DataColumn dataColumn2 = new DataColumn(SchemaTableColumn.IsLong, typeof(bool)); DataColumn column7 = new DataColumn(SchemaTableColumn.AllowDBNull, typeof(bool)); DataColumn dataColumn3 = new DataColumn(SchemaTableOptionalColumn.IsReadOnly, typeof(bool)); DataColumn dataColumn4 = new DataColumn(SchemaTableOptionalColumn.IsRowVersion, typeof(bool)); DataColumn column8 = new DataColumn(SchemaTableColumn.IsUnique, typeof(bool)); DataColumn dataColumn5 = new DataColumn(SchemaTableColumn.IsKey, typeof(bool)); DataColumn dataColumn6 = new DataColumn(SchemaTableOptionalColumn.IsAutoIncrement, typeof(bool)); DataColumn column9 = new DataColumn(SchemaTableColumn.BaseSchemaName, typeof(string)); DataColumn dataColumn7 = new DataColumn(SchemaTableOptionalColumn.BaseCatalogName, typeof(string)); DataColumn dataColumn8 = new DataColumn(SchemaTableColumn.BaseTableName, typeof(string)); DataColumn column10 = new DataColumn(SchemaTableColumn.BaseColumnName, typeof(string)); DataColumn dataColumn9 = new DataColumn(SchemaTableOptionalColumn.AutoIncrementSeed, typeof(long)); DataColumn dataColumn10 = new DataColumn(SchemaTableOptionalColumn.AutoIncrementStep, typeof(long)); DataColumn column11 = new DataColumn(SchemaTableOptionalColumn.DefaultValue, typeof(object)); DataColumn column12 = new DataColumn(SchemaTableOptionalColumn.Expression, typeof(string)); DataColumn column13 = new DataColumn(SchemaTableOptionalColumn.ColumnMapping, typeof(MappingType)); DataColumn dataColumn11 = new DataColumn(SchemaTableOptionalColumn.BaseTableNamespace, typeof(string)); DataColumn column14 = new DataColumn(SchemaTableOptionalColumn.BaseColumnNamespace, typeof(string)); dataColumn.DefaultValue = -1; if (table.DataSet != null) { dataColumn7.DefaultValue = table.DataSet.DataSetName; } dataColumn8.DefaultValue = table.TableName; dataColumn11.DefaultValue = table.Namespace; dataColumn4.DefaultValue = false; dataColumn2.DefaultValue = false; dataColumn3.DefaultValue = false; dataColumn5.DefaultValue = false; dataColumn6.DefaultValue = false; dataColumn9.DefaultValue = 0; dataColumn10.DefaultValue = 1; dataTable.Columns.Add(column); dataTable.Columns.Add(column2); dataTable.Columns.Add(dataColumn); dataTable.Columns.Add(column3); dataTable.Columns.Add(column4); dataTable.Columns.Add(column5); dataTable.Columns.Add(column6); dataTable.Columns.Add(dataColumn2); dataTable.Columns.Add(column7); dataTable.Columns.Add(dataColumn3); dataTable.Columns.Add(dataColumn4); dataTable.Columns.Add(column8); dataTable.Columns.Add(dataColumn5); dataTable.Columns.Add(dataColumn6); dataTable.Columns.Add(dataColumn7); dataTable.Columns.Add(column9); dataTable.Columns.Add(dataColumn8); dataTable.Columns.Add(column10); dataTable.Columns.Add(dataColumn9); dataTable.Columns.Add(dataColumn10); dataTable.Columns.Add(column11); dataTable.Columns.Add(column12); dataTable.Columns.Add(column13); dataTable.Columns.Add(dataColumn11); dataTable.Columns.Add(column14); foreach (DataColumn column15 in table.Columns) { DataRow dataRow = dataTable.NewRow(); dataRow[column] = column15.ColumnName; dataRow[column2] = column15.Ordinal; dataRow[column5] = column15.DataType; if (column15.DataType == typeof(string)) { dataRow[dataColumn] = column15.MaxLength; } dataRow[column7] = column15.AllowDBNull; dataRow[dataColumn3] = column15.ReadOnly; dataRow[column8] = column15.Unique; if (column15.AutoIncrement) { dataRow[dataColumn6] = true; dataRow[dataColumn9] = column15.AutoIncrementSeed; dataRow[dataColumn10] = column15.AutoIncrementStep; } if (column15.DefaultValue != DBNull.Value) { dataRow[column11] = column15.DefaultValue; } if (column15.Expression.Length != 0) { bool flag = false; DataColumn[] dependency = column15.DataExpression.GetDependency(); for (int i = 0; i < dependency.Length; i++) { if (dependency[i].Table != table) { flag = true; break; } } if (!flag) { dataRow[column12] = column15.Expression; } } dataRow[column13] = column15.ColumnMapping; dataRow[column10] = column15.ColumnName; dataRow[column14] = column15.Namespace; dataTable.Rows.Add(dataRow); } DataColumn[] primaryKey = table.PrimaryKey; foreach (DataColumn dataColumn13 in primaryKey) { dataTable.Rows[dataColumn13.Ordinal][dataColumn5] = true; } dataTable.AcceptChanges(); return dataTable; } private void ValidateOpen(string caller) { if (!_isOpen) { throw ADP.DataReaderClosed(caller); } } private void ValidateReader() { if (ReaderIsInvalid) { throw ExceptionBuilder.InvalidDataTableReader(_currentDataTable.TableName); } if (IsSchemaChanged) { throw ExceptionBuilder.DataTableReaderSchemaIsInvalid(_currentDataTable.TableName); } } private void ValidateState(string caller) { ValidateOpen(caller); if (_tableCleared) { throw ExceptionBuilder.EmptyDataTableReader(_currentDataTable.TableName); } if (_currentDataRow == null || _currentDataTable == null) { ReaderIsInvalid = true; throw ExceptionBuilder.InvalidDataTableReader(_currentDataTable.TableName); } if (_currentDataRow.RowState == DataRowState.Deleted || _currentDataRow.RowState == DataRowState.Detached || _currentRowRemoved) { throw ExceptionBuilder.InvalidCurrentRowInDataTableReader(); } if (0 > _rowCounter || _currentDataTable.Rows.Count <= _rowCounter) { ReaderIsInvalid = true; throw ExceptionBuilder.InvalidDataTableReader(_currentDataTable.TableName); } } private void ValidateRow(int rowPosition) { if (ReaderIsInvalid) { throw ExceptionBuilder.InvalidDataTableReader(_currentDataTable.TableName); } if (0 > rowPosition || _currentDataTable.Rows.Count <= rowPosition) { ReaderIsInvalid = true; throw ExceptionBuilder.InvalidDataTableReader(_currentDataTable.TableName); } } internal void SchemaChanged() { IsSchemaChanged = true; } internal void DataTableCleared() { if (_started) { _rowCounter = -1; if (!_reachEORows) { _currentRowRemoved = true; } } } internal void DataChanged(DataRowChangeEventArgs args) { if (!_started || (_rowCounter == -1 && !_tableCleared)) { return; } switch (args.Action) { case DataRowAction.Add: ValidateRow(_rowCounter + 1); if (_currentDataRow == _currentDataTable.Rows[_rowCounter + 1]) { _rowCounter++; } break; case DataRowAction.Delete: case DataRowAction.Rollback: case DataRowAction.Commit: if (args.Row.RowState != DataRowState.Detached) { break; } if (args.Row != _currentDataRow) { if (_rowCounter != 0) { ValidateRow(_rowCounter - 1); if (_currentDataRow == _currentDataTable.Rows[_rowCounter - 1]) { _rowCounter--; } } } else { _currentRowRemoved = true; if (_rowCounter > 0) { _rowCounter--; _currentDataRow = _currentDataTable.Rows[_rowCounter]; } else { _rowCounter = -1; _currentDataRow = null; } } break; } } } internal sealed class DataTableReaderListener { private DataTable _currentDataTable; private bool _isSubscribed; private WeakReference _readerWeak; internal DataTableReaderListener(DataTableReader reader) { if (reader == null) { throw ExceptionBuilder.ArgumentNull("DataTableReader"); } if (_currentDataTable != null) { UnSubscribeEvents(); } _readerWeak = new WeakReference(reader); _currentDataTable = reader.CurrentDataTable; if (_currentDataTable != null) { SubscribeEvents(); } } internal void CleanUp() { UnSubscribeEvents(); } internal void UpdataTable(DataTable datatable) { if (datatable == null) { throw ExceptionBuilder.ArgumentNull("DataTable"); } UnSubscribeEvents(); _currentDataTable = datatable; SubscribeEvents(); } private void SubscribeEvents() { if (_currentDataTable != null && !_isSubscribed) { _currentDataTable.Columns.ColumnPropertyChanged += SchemaChanged; _currentDataTable.Columns.CollectionChanged += SchemaChanged; _currentDataTable.RowChanged += DataChanged; _currentDataTable.RowDeleted += DataChanged; _currentDataTable.TableCleared += DataTableCleared; _isSubscribed = true; } } private void UnSubscribeEvents() { if (_currentDataTable != null && _isSubscribed) { _currentDataTable.Columns.ColumnPropertyChanged -= SchemaChanged; _currentDataTable.Columns.CollectionChanged -= SchemaChanged; _currentDataTable.RowChanged -= DataChanged; _currentDataTable.RowDeleted -= DataChanged; _currentDataTable.TableCleared -= DataTableCleared; _isSubscribed = false; } } private void DataTableCleared(object sender, DataTableClearEventArgs e) { DataTableReader dataTableReader = (DataTableReader)_readerWeak.Target; if (dataTableReader != null) { dataTableReader.DataTableCleared(); } else { UnSubscribeEvents(); } } private void SchemaChanged(object sender, CollectionChangeEventArgs e) { DataTableReader dataTableReader = (DataTableReader)_readerWeak.Target; if (dataTableReader != null) { dataTableReader.SchemaChanged(); } else { UnSubscribeEvents(); } } private void DataChanged(object sender, DataRowChangeEventArgs args) { DataTableReader dataTableReader = (DataTableReader)_readerWeak.Target; if (dataTableReader != null) { dataTableReader.DataChanged(args); } else { UnSubscribeEvents(); } } } internal sealed class DataTableTypeConverter : ReferenceConverter { public DataTableTypeConverter() : base(typeof(DataTable)) { } public override bool GetPropertiesSupported(ITypeDescriptorContext context) { return false; } } [DefaultProperty("Table")] [DefaultEvent("PositionChanged")] public class DataView : MarshalByValueComponent, IBindingListView, IBindingList, IList, ICollection, IEnumerable, ITypedList, ISupportInitializeNotification, ISupportInitialize { private sealed class DataRowReferenceComparer : IEqualityComparer { internal static readonly DataRowReferenceComparer s_default = new DataRowReferenceComparer(); private DataRowReferenceComparer() { } public bool Equals(DataRow x, DataRow y) { return x == y; } public int GetHashCode(DataRow obj) { return obj._objectID; } } private sealed class RowPredicateFilter : IFilter { internal readonly Predicate _predicateFilter; internal RowPredicateFilter(Predicate predicate) { _predicateFilter = predicate; } bool IFilter.Invoke(DataRow row, DataRowVersion version) { return _predicateFilter(row); } } private DataViewManager _dataViewManager; private DataTable _table; private bool _locked; private Index _index; private Dictionary _findIndexes; private string _sort = string.Empty; private Comparison _comparison; private IFilter _rowFilter; private DataViewRowState _recordStates = DataViewRowState.CurrentRows; private bool _shouldOpen = true; private bool _open; private bool _allowNew = true; private bool _allowEdit = true; private bool _allowDelete = true; private bool _applyDefaultSort; internal DataRow _addNewRow; private ListChangedEventArgs _addNewMoved; private ListChangedEventHandler _onListChanged; internal static ListChangedEventArgs s_resetEventArgs = new ListChangedEventArgs(ListChangedType.Reset, -1); private DataTable _delayedTable; private string _delayedRowFilter; private string _delayedSort; private DataViewRowState _delayedRecordStates = (DataViewRowState)(-1); private bool _fInitInProgress; private bool _fEndInitInProgress; private Dictionary _rowViewCache = new Dictionary(DataRowReferenceComparer.s_default); private readonly Dictionary _rowViewBuffer = new Dictionary(DataRowReferenceComparer.s_default); private DataViewListener _dvListener; private static int s_objectTypeCount; private readonly int _objectID = Interlocked.Increment(ref s_objectTypeCount); [DefaultValue(true)] public bool AllowDelete { get { return _allowDelete; } set { if (_allowDelete != value) { _allowDelete = value; OnListChanged(s_resetEventArgs); } } } [RefreshProperties(RefreshProperties.All)] [DefaultValue(false)] public bool ApplyDefaultSort { get { return _applyDefaultSort; } set { DataCommonEventSource.Log.Trace(" {0}, {1}", ObjectID, value); if (_applyDefaultSort != value) { _comparison = null; _applyDefaultSort = value; UpdateIndex(force: true); OnListChanged(s_resetEventArgs); } } } [DefaultValue(true)] public bool AllowEdit { get { return _allowEdit; } set { if (_allowEdit != value) { _allowEdit = value; OnListChanged(s_resetEventArgs); } } } [DefaultValue(true)] public bool AllowNew { get { return _allowNew; } set { if (_allowNew != value) { _allowNew = value; OnListChanged(s_resetEventArgs); } } } [Browsable(false)] public int Count => _rowViewCache.Count; private int CountFromIndex => ((_index != null) ? _index.RecordCount : 0) + ((_addNewRow != null) ? 1 : 0); [Browsable(false)] public DataViewManager DataViewManager => _dataViewManager; [Browsable(false)] public bool IsInitialized => !_fInitInProgress; [Browsable(false)] protected bool IsOpen => _open; bool ICollection.IsSynchronized => false; [DefaultValue("")] public virtual string RowFilter { get { if (_rowFilter is DataExpression dataExpression) { return dataExpression.Expression; } return ""; } set { if (value == null) { value = string.Empty; } DataCommonEventSource.Log.Trace(" {0}, '{1}'", ObjectID, value); if (_fInitInProgress) { _delayedRowFilter = value; return; } CultureInfo culture = ((_table != null) ? _table.Locale : CultureInfo.CurrentCulture); if (_rowFilter == null || string.Compare(RowFilter, value, ignoreCase: false, culture) != 0) { DataExpression newRowFilter = new DataExpression(_table, value); SetIndex(_sort, _recordStates, newRowFilter); } } } internal Predicate RowPredicate { get { if (!(GetFilter() is RowPredicateFilter rowPredicateFilter)) { return null; } return rowPredicateFilter._predicateFilter; } set { if ((object)RowPredicate != value) { SetIndex(Sort, RowStateFilter, (value != null) ? new RowPredicateFilter(value) : null); } } } [DefaultValue(DataViewRowState.CurrentRows)] public DataViewRowState RowStateFilter { get { return _recordStates; } set { DataCommonEventSource.Log.Trace(" {0}, {1}", ObjectID, value); if (_fInitInProgress) { _delayedRecordStates = value; return; } if (((uint)value & 0xFFFFFFC1u) != 0) { throw ExceptionBuilder.RecordStateRange(); } if ((value & DataViewRowState.ModifiedOriginal) != 0 && (value & DataViewRowState.ModifiedCurrent) != 0) { throw ExceptionBuilder.SetRowStateFilter(); } if (_recordStates != value) { SetIndex(_sort, value, _rowFilter); } } } [DefaultValue("")] public string Sort { get { if (_sort.Length == 0 && _applyDefaultSort && _table != null && _table._primaryIndex.Length != 0) { return _table.FormatSortString(_table._primaryIndex); } return _sort; } set { if (value == null) { value = string.Empty; } DataCommonEventSource.Log.Trace(" {0}, '{1}'", ObjectID, value); if (_fInitInProgress) { _delayedSort = value; return; } CultureInfo culture = ((_table != null) ? _table.Locale : CultureInfo.CurrentCulture); if (string.Compare(_sort, value, ignoreCase: false, culture) != 0 || _comparison != null) { CheckSort(value); _comparison = null; SetIndex(value, _recordStates, _rowFilter); } } } internal Comparison SortComparison { get { return _comparison; } set { DataCommonEventSource.Log.Trace(" {0}", ObjectID); if ((object)_comparison != value) { _comparison = value; SetIndex("", _recordStates, _rowFilter); } } } object ICollection.SyncRoot => this; [DefaultValue(null)] [RefreshProperties(RefreshProperties.All)] [TypeConverter(typeof(DataTableTypeConverter))] public DataTable Table { get { return _table; } set { DataCommonEventSource.Log.Trace(" {0}, {1}", ObjectID, value?.ObjectID ?? 0); if (_fInitInProgress && value != null) { _delayedTable = value; return; } if (_locked) { throw ExceptionBuilder.SetTable(); } if (_dataViewManager != null) { throw ExceptionBuilder.CanNotSetTable(); } if (value != null && value.TableName.Length == 0) { throw ExceptionBuilder.CanNotBindTable(); } if (_table != value) { _dvListener.UnregisterMetaDataEvents(); _table = value; if (_table != null) { _dvListener.RegisterMetaDataEvents(_table); } SetIndex2("", DataViewRowState.CurrentRows, null, fireEvent: false); if (_table != null) { OnListChanged(new ListChangedEventArgs(ListChangedType.PropertyDescriptorChanged, new DataTablePropertyDescriptor(_table))); } OnListChanged(s_resetEventArgs); } } } object IList.this[int recordIndex] { get { return this[recordIndex]; } set { throw ExceptionBuilder.SetIListObject(); } } public DataRowView this[int recordIndex] => GetRowView(GetRow(recordIndex)); bool IList.IsReadOnly => false; bool IList.IsFixedSize => false; bool IBindingList.AllowNew => AllowNew; bool IBindingList.AllowEdit => AllowEdit; bool IBindingList.AllowRemove => AllowDelete; bool IBindingList.SupportsChangeNotification => true; bool IBindingList.SupportsSearching => true; bool IBindingList.SupportsSorting => true; bool IBindingList.IsSorted => Sort.Length != 0; PropertyDescriptor IBindingList.SortProperty => GetSortProperty(); ListSortDirection IBindingList.SortDirection { get { if (_index._indexFields.Length != 1 || !_index._indexFields[0].IsDescending) { return ListSortDirection.Ascending; } return ListSortDirection.Descending; } } string IBindingListView.Filter { get { return RowFilter; } set { RowFilter = value; } } ListSortDescriptionCollection IBindingListView.SortDescriptions => GetSortDescriptions(); bool IBindingListView.SupportsAdvancedSorting => true; bool IBindingListView.SupportsFiltering => true; internal int ObjectID => _objectID; public event ListChangedEventHandler ListChanged { add { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onListChanged = (ListChangedEventHandler)Delegate.Combine(_onListChanged, value); } remove { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _onListChanged = (ListChangedEventHandler)Delegate.Remove(_onListChanged, value); } } public event EventHandler Initialized; internal DataView(DataTable table, bool locked) { GC.SuppressFinalize(this); DataCommonEventSource.Log.Trace(" {0}, table={1}, locked={2}", ObjectID, table?.ObjectID ?? 0, locked); _dvListener = new DataViewListener(this); _locked = locked; _table = table; _dvListener.RegisterMetaDataEvents(_table); } public DataView() : this(null) { SetIndex2("", DataViewRowState.CurrentRows, null, fireEvent: true); } public DataView(DataTable table) : this(table, locked: false) { SetIndex2("", DataViewRowState.CurrentRows, null, fireEvent: true); } public DataView(DataTable table, string RowFilter, string Sort, DataViewRowState RowState) { GC.SuppressFinalize(this); DataCommonEventSource.Log.Trace(" {0}, table={1}, RowFilter='{2}', Sort='{3}', RowState={4}", ObjectID, table?.ObjectID ?? 0, RowFilter, Sort, RowState); if (table == null) { throw ExceptionBuilder.CanNotUse(); } _dvListener = new DataViewListener(this); _locked = false; _table = table; _dvListener.RegisterMetaDataEvents(_table); if (((uint)RowState & 0xFFFFFFC1u) != 0) { throw ExceptionBuilder.RecordStateRange(); } if ((RowState & DataViewRowState.ModifiedOriginal) != 0 && (RowState & DataViewRowState.ModifiedCurrent) != 0) { throw ExceptionBuilder.SetRowStateFilter(); } if (Sort == null) { Sort = string.Empty; } if (RowFilter == null) { RowFilter = string.Empty; } DataExpression newRowFilter = new DataExpression(table, RowFilter); SetIndex(Sort, RowState, newRowFilter); } public virtual DataRowView AddNew() { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { CheckOpen(); if (!AllowNew) { throw ExceptionBuilder.AddNewNotAllowNull(); } if (_addNewRow != null) { _rowViewCache[_addNewRow].EndEdit(); } _addNewRow = _table.NewRow(); DataRowView dataRowView = new DataRowView(this, _addNewRow); _rowViewCache.Add(_addNewRow, dataRowView); OnListChanged(new ListChangedEventArgs(ListChangedType.ItemAdded, IndexOf(dataRowView))); return dataRowView; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public void BeginInit() { _fInitInProgress = true; } public void EndInit() { if (_delayedTable != null && _delayedTable.fInitInProgress) { _delayedTable._delayedViews.Add(this); return; } _fInitInProgress = false; _fEndInitInProgress = true; if (_delayedTable != null) { Table = _delayedTable; _delayedTable = null; } if (_delayedSort != null) { Sort = _delayedSort; _delayedSort = null; } if (_delayedRowFilter != null) { RowFilter = _delayedRowFilter; _delayedRowFilter = null; } if (_delayedRecordStates != (DataViewRowState)(-1)) { RowStateFilter = _delayedRecordStates; _delayedRecordStates = (DataViewRowState)(-1); } _fEndInitInProgress = false; SetIndex(Sort, RowStateFilter, _rowFilter); OnInitialized(); } private void CheckOpen() { if (!IsOpen) { throw ExceptionBuilder.NotOpen(); } } private void CheckSort(string sort) { if (_table == null) { throw ExceptionBuilder.CanNotUse(); } if (sort.Length != 0) { _table.ParseSortString(sort); } } protected void Close() { _shouldOpen = false; UpdateIndex(); _dvListener.UnregisterMetaDataEvents(); } public void CopyTo(Array array, int index) { if (_index != null) { RBTree.RBTreeEnumerator enumerator = _index.GetEnumerator(0); while (enumerator.MoveNext()) { array.SetValue(GetRowView(enumerator.Current), index); index = checked(index + 1); } } if (_addNewRow != null) { array.SetValue(_rowViewCache[_addNewRow], index); } } private void CopyTo(DataRowView[] array, int index) { if (_index != null) { RBTree.RBTreeEnumerator enumerator = _index.GetEnumerator(0); while (enumerator.MoveNext()) { array[index] = GetRowView(enumerator.Current); index = checked(index + 1); } } if (_addNewRow != null) { array[index] = _rowViewCache[_addNewRow]; } } public void Delete(int index) { Delete(GetRow(index)); } internal void Delete(DataRow row) { if (row == null) { return; } long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, row={1}", ObjectID, row._objectID); try { CheckOpen(); if (row == _addNewRow) { FinishAddNew(success: false); return; } if (!AllowDelete) { throw ExceptionBuilder.CanNotDelete(); } row.Delete(); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } protected override void Dispose(bool disposing) { if (disposing) { Close(); } base.Dispose(disposing); } public int Find(object key) { return FindByKey(key); } internal virtual int FindByKey(object key) { return _index.FindRecordByKey(key); } public int Find(object[] key) { return FindByKey(key); } internal virtual int FindByKey(object[] key) { return _index.FindRecordByKey(key); } public DataRowView[] FindRows(object key) { return FindRowsByKey(new object[1] { key }); } public DataRowView[] FindRows(object[] key) { return FindRowsByKey(key); } internal virtual DataRowView[] FindRowsByKey(object[] key) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { Range range = _index.FindRecords(key); return GetDataRowViewFromRange(range); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } internal DataRowView[] GetDataRowViewFromRange(Range range) { if (range.IsNull) { return Array.Empty(); } DataRowView[] array = new DataRowView[range.Count]; for (int i = 0; i < array.Length; i++) { array[i] = this[i + range.Min]; } return array; } internal void FinishAddNew(bool success) { DataCommonEventSource.Log.Trace(" {0}, success={1}", ObjectID, success); DataRow addNewRow = _addNewRow; if (success) { if (DataRowState.Detached == addNewRow.RowState) { _table.Rows.Add(addNewRow); } else { addNewRow.EndEdit(); } } if (addNewRow == _addNewRow) { _rowViewCache.Remove(_addNewRow); _addNewRow = null; if (!success) { addNewRow.CancelEdit(); } OnListChanged(new ListChangedEventArgs(ListChangedType.ItemDeleted, Count)); } } public IEnumerator GetEnumerator() { DataRowView[] array = new DataRowView[Count]; CopyTo(array, 0); return array.GetEnumerator(); } int IList.Add(object value) { if (value == null) { AddNew(); return Count - 1; } throw ExceptionBuilder.AddExternalObject(); } void IList.Clear() { throw ExceptionBuilder.CanNotClear(); } bool IList.Contains(object value) { return 0 <= IndexOf(value as DataRowView); } int IList.IndexOf(object value) { return IndexOf(value as DataRowView); } internal int IndexOf(DataRowView rowview) { if (rowview != null) { if (_addNewRow == rowview.Row) { return Count - 1; } if (_index != null && DataRowState.Detached != rowview.Row.RowState && _rowViewCache.TryGetValue(rowview.Row, out var value) && value == rowview) { return IndexOfDataRowView(rowview); } } return -1; } private int IndexOfDataRowView(DataRowView rowview) { return _index.GetIndex(rowview.Row.GetRecordFromVersion(rowview.Row.GetDefaultRowVersion(RowStateFilter) & (DataRowVersion)(-1025))); } void IList.Insert(int index, object value) { throw ExceptionBuilder.InsertExternalObject(); } void IList.Remove(object value) { int num = IndexOf(value as DataRowView); if (0 <= num) { ((IList)this).RemoveAt(num); return; } throw ExceptionBuilder.RemoveExternalObject(); } void IList.RemoveAt(int index) { Delete(index); } internal Index GetFindIndex(string column, bool keepIndex) { if (_findIndexes == null) { _findIndexes = new Dictionary(); } if (_findIndexes.TryGetValue(column, out var value)) { if (!keepIndex) { _findIndexes.Remove(column); value.RemoveRef(); if (value.RefCount == 1) { value.RemoveRef(); } } } else if (keepIndex) { value = _table.GetIndex(column, _recordStates, GetFilter()); _findIndexes[column] = value; value.AddRef(); } return value; } object IBindingList.AddNew() { return AddNew(); } internal PropertyDescriptor GetSortProperty() { if (_table != null && _index != null && _index._indexFields.Length == 1) { return new DataColumnPropertyDescriptor(_index._indexFields[0].Column); } return null; } void IBindingList.AddIndex(PropertyDescriptor property) { GetFindIndex(property.Name, keepIndex: true); } void IBindingList.ApplySort(PropertyDescriptor property, ListSortDirection direction) { Sort = CreateSortString(property, direction); } int IBindingList.Find(PropertyDescriptor property, object key) { if (property != null) { bool flag = false; Index value = null; try { if (_findIndexes == null || !_findIndexes.TryGetValue(property.Name, out value)) { flag = true; value = _table.GetIndex(property.Name, _recordStates, GetFilter()); value.AddRef(); } Range range = value.FindRecords(key); if (!range.IsNull) { return _index.GetIndex(value.GetRecord(range.Min)); } } finally { if (flag && value != null) { value.RemoveRef(); if (value.RefCount == 1) { value.RemoveRef(); } } } } return -1; } void IBindingList.RemoveIndex(PropertyDescriptor property) { GetFindIndex(property.Name, keepIndex: false); } void IBindingList.RemoveSort() { DataCommonEventSource.Log.Trace(" {0}", ObjectID); Sort = string.Empty; } void IBindingListView.ApplySort(ListSortDescriptionCollection sorts) { if (sorts == null) { throw ExceptionBuilder.ArgumentNull("sorts"); } StringBuilder stringBuilder = new StringBuilder(); bool flag = false; foreach (ListSortDescription item in (IEnumerable)sorts) { ListSortDescription obj = item ?? throw ExceptionBuilder.ArgumentContainsNull("sorts"); PropertyDescriptor propertyDescriptor = obj.PropertyDescriptor; if (propertyDescriptor == null) { throw ExceptionBuilder.ArgumentNull("PropertyDescriptor"); } if (!_table.Columns.Contains(propertyDescriptor.Name)) { throw ExceptionBuilder.ColumnToSortIsOutOfRange(propertyDescriptor.Name); } ListSortDirection sortDirection = obj.SortDirection; if (flag) { stringBuilder.Append(','); } stringBuilder.Append(CreateSortString(propertyDescriptor, sortDirection)); if (!flag) { flag = true; } } Sort = stringBuilder.ToString(); } private string CreateSortString(PropertyDescriptor property, ListSortDirection direction) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append('['); stringBuilder.Append(property.Name); stringBuilder.Append(']'); if (ListSortDirection.Descending == direction) { stringBuilder.Append(" DESC"); } return stringBuilder.ToString(); } void IBindingListView.RemoveFilter() { DataCommonEventSource.Log.Trace(" {0}", ObjectID); RowFilter = string.Empty; } internal ListSortDescriptionCollection GetSortDescriptions() { ListSortDescription[] array = Array.Empty(); if (_table != null && _index != null && _index._indexFields.Length != 0) { array = new ListSortDescription[_index._indexFields.Length]; for (int i = 0; i < _index._indexFields.Length; i++) { DataColumnPropertyDescriptor property = new DataColumnPropertyDescriptor(_index._indexFields[i].Column); if (_index._indexFields[i].IsDescending) { array[i] = new ListSortDescription(property, ListSortDirection.Descending); } else { array[i] = new ListSortDescription(property, ListSortDirection.Ascending); } } } return new ListSortDescriptionCollection(array); } string ITypedList.GetListName(PropertyDescriptor[] listAccessors) { if (_table != null) { if (listAccessors == null || listAccessors.Length == 0) { return _table.TableName; } DataSet dataSet = _table.DataSet; if (dataSet != null) { DataTable dataTable = dataSet.FindTable(_table, listAccessors, 0); if (dataTable != null) { return dataTable.TableName; } } } return string.Empty; } PropertyDescriptorCollection ITypedList.GetItemProperties(PropertyDescriptor[] listAccessors) { if (_table != null) { if (listAccessors == null || listAccessors.Length == 0) { return _table.GetPropertyDescriptorCollection(null); } DataSet dataSet = _table.DataSet; if (dataSet == null) { return new PropertyDescriptorCollection(null); } DataTable dataTable = dataSet.FindTable(_table, listAccessors, 0); if (dataTable != null) { return dataTable.GetPropertyDescriptorCollection(null); } } return new PropertyDescriptorCollection(null); } internal virtual IFilter GetFilter() { return _rowFilter; } private int GetRecord(int recordIndex) { if ((uint)Count <= (uint)recordIndex) { throw ExceptionBuilder.RowOutOfRange(recordIndex); } if (recordIndex != _index.RecordCount) { return _index.GetRecord(recordIndex); } return _addNewRow.GetDefaultRecord(); } internal DataRow GetRow(int index) { int count = Count; if ((uint)count <= (uint)index) { throw ExceptionBuilder.GetElementIndex(index); } if (index == count - 1 && _addNewRow != null) { return _addNewRow; } return _table._recordManager[GetRecord(index)]; } private DataRowView GetRowView(int record) { return GetRowView(_table._recordManager[record]); } private DataRowView GetRowView(DataRow dr) { return _rowViewCache[dr]; } protected virtual void IndexListChanged(object sender, ListChangedEventArgs e) { if (e.ListChangedType != 0) { OnListChanged(e); } if (_addNewRow != null && _index.RecordCount == 0) { FinishAddNew(success: false); } if (e.ListChangedType == ListChangedType.Reset) { OnListChanged(e); } } internal void IndexListChangedInternal(ListChangedEventArgs e) { _rowViewBuffer.Clear(); if (ListChangedType.ItemAdded == e.ListChangedType && _addNewMoved != null && _addNewMoved.NewIndex != _addNewMoved.OldIndex) { ListChangedEventArgs addNewMoved = _addNewMoved; _addNewMoved = null; IndexListChanged(this, addNewMoved); } IndexListChanged(this, e); } internal void MaintainDataView(ListChangedType changedType, DataRow row, bool trackAddRemove) { DataRowView value = null; switch (changedType) { case ListChangedType.ItemAdded: if (trackAddRemove && _rowViewBuffer.TryGetValue(row, out value)) { _rowViewBuffer.Remove(row); } if (row == _addNewRow) { int newIndex = IndexOfDataRowView(_rowViewCache[_addNewRow]); _addNewRow = null; _addNewMoved = new ListChangedEventArgs(ListChangedType.ItemMoved, newIndex, Count - 1); } else if (!_rowViewCache.ContainsKey(row)) { _rowViewCache.Add(row, value ?? new DataRowView(this, row)); } break; case ListChangedType.ItemDeleted: if (trackAddRemove) { _rowViewCache.TryGetValue(row, out value); if (value != null) { _rowViewBuffer.Add(row, value); } } _rowViewCache.Remove(row); break; case ListChangedType.Reset: ResetRowViewCache(); break; case ListChangedType.ItemMoved: case ListChangedType.ItemChanged: case ListChangedType.PropertyDescriptorAdded: case ListChangedType.PropertyDescriptorDeleted: case ListChangedType.PropertyDescriptorChanged: break; } } protected virtual void OnListChanged(ListChangedEventArgs e) { DataCommonEventSource.Log.Trace(" {0}, ListChangedType={1}", ObjectID, e.ListChangedType); try { DataColumn dataColumn = null; string text = null; switch (e.ListChangedType) { case ListChangedType.ItemMoved: case ListChangedType.ItemChanged: if (0 <= e.NewIndex) { DataRow row = GetRow(e.NewIndex); if (row.HasPropertyChanged) { dataColumn = row.LastChangedColumn; text = ((dataColumn != null) ? dataColumn.ColumnName : string.Empty); } } break; } if (_onListChanged != null) { if (dataColumn != null && e.NewIndex == e.OldIndex) { ListChangedEventArgs e2 = new ListChangedEventArgs(e.ListChangedType, e.NewIndex, new DataColumnPropertyDescriptor(dataColumn)); _onListChanged(this, e2); } else { _onListChanged(this, e); } } if (text != null) { this[e.NewIndex].RaisePropertyChangedEvent(text); } } catch (Exception e3) when (ADP.IsCatchableExceptionType(e3)) { ExceptionBuilder.TraceExceptionWithoutRethrow(e3); } } private void OnInitialized() { this.Initialized?.Invoke(this, EventArgs.Empty); } protected void Open() { _shouldOpen = true; UpdateIndex(); _dvListener.RegisterMetaDataEvents(_table); } protected void Reset() { if (IsOpen) { _index.Reset(); } } internal void ResetRowViewCache() { Dictionary dictionary = new Dictionary(CountFromIndex, DataRowReferenceComparer.s_default); DataRowView value; if (_index != null) { RBTree.RBTreeEnumerator enumerator = _index.GetEnumerator(0); while (enumerator.MoveNext()) { DataRow dataRow = _table._recordManager[enumerator.Current]; if (!_rowViewCache.TryGetValue(dataRow, out value)) { value = new DataRowView(this, dataRow); } dictionary.Add(dataRow, value); } } if (_addNewRow != null) { _rowViewCache.TryGetValue(_addNewRow, out value); dictionary.Add(_addNewRow, value); } _rowViewCache = dictionary; } internal void SetDataViewManager(DataViewManager dataViewManager) { if (_table == null) { throw ExceptionBuilder.CanNotUse(); } if (_dataViewManager == dataViewManager) { return; } if (dataViewManager != null) { dataViewManager._nViews--; } _dataViewManager = dataViewManager; if (dataViewManager != null) { dataViewManager._nViews++; DataViewSetting dataViewSetting = dataViewManager.DataViewSettings[_table]; try { _applyDefaultSort = dataViewSetting.ApplyDefaultSort; DataExpression newRowFilter = new DataExpression(_table, dataViewSetting.RowFilter); SetIndex(dataViewSetting.Sort, dataViewSetting.RowStateFilter, newRowFilter); } catch (Exception e) when (ADP.IsCatchableExceptionType(e)) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); } _locked = true; } else { SetIndex("", DataViewRowState.CurrentRows, null); } } internal virtual void SetIndex(string newSort, DataViewRowState newRowStates, IFilter newRowFilter) { SetIndex2(newSort, newRowStates, newRowFilter, fireEvent: true); } internal void SetIndex2(string newSort, DataViewRowState newRowStates, IFilter newRowFilter, bool fireEvent) { DataCommonEventSource.Log.Trace(" {0}, newSort='{1}', newRowStates={2}", ObjectID, newSort, newRowStates); _sort = newSort; _recordStates = newRowStates; _rowFilter = newRowFilter; if (_fEndInitInProgress) { return; } if (fireEvent) { UpdateIndex(force: true); } else { UpdateIndex(force: true, fireEvent: false); } if (_findIndexes == null) { return; } Dictionary findIndexes = _findIndexes; _findIndexes = null; foreach (KeyValuePair item in findIndexes) { item.Value.RemoveRef(); } } protected void UpdateIndex() { UpdateIndex(force: false); } protected virtual void UpdateIndex(bool force) { UpdateIndex(force, fireEvent: true); } internal void UpdateIndex(bool force, bool fireEvent) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, force={1}", ObjectID, force); try { if (!(_open != _shouldOpen || force)) { return; } _open = _shouldOpen; Index index = null; if (_open && _table != null) { if (SortComparison != null) { index = new Index(_table, SortComparison, _recordStates, GetFilter()); index.AddRef(); } else { index = _table.GetIndex(Sort, _recordStates, GetFilter()); } } if (_index != index) { if (_index == null) { _ = index.Table; } else { _ = _index.Table; } if (_index != null) { _dvListener.UnregisterListChangedEvent(); } _index = index; if (_index != null) { _dvListener.RegisterListChangedEvent(_index); } ResetRowViewCache(); if (fireEvent) { OnListChanged(s_resetEventArgs); } } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } internal void ChildRelationCollectionChanged(object sender, CollectionChangeEventArgs e) { DataRelationPropertyDescriptor propDesc = null; OnListChanged((e.Action == CollectionChangeAction.Add) ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorAdded, new DataRelationPropertyDescriptor((DataRelation)e.Element)) : ((e.Action == CollectionChangeAction.Refresh) ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorChanged, propDesc) : ((e.Action == CollectionChangeAction.Remove) ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorDeleted, new DataRelationPropertyDescriptor((DataRelation)e.Element)) : null))); } internal void ParentRelationCollectionChanged(object sender, CollectionChangeEventArgs e) { DataRelationPropertyDescriptor propDesc = null; OnListChanged((e.Action == CollectionChangeAction.Add) ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorAdded, new DataRelationPropertyDescriptor((DataRelation)e.Element)) : ((e.Action == CollectionChangeAction.Refresh) ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorChanged, propDesc) : ((e.Action == CollectionChangeAction.Remove) ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorDeleted, new DataRelationPropertyDescriptor((DataRelation)e.Element)) : null))); } protected virtual void ColumnCollectionChanged(object sender, CollectionChangeEventArgs e) { DataColumnPropertyDescriptor propDesc = null; OnListChanged((e.Action == CollectionChangeAction.Add) ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorAdded, new DataColumnPropertyDescriptor((DataColumn)e.Element)) : ((e.Action == CollectionChangeAction.Refresh) ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorChanged, propDesc) : ((e.Action == CollectionChangeAction.Remove) ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorDeleted, new DataColumnPropertyDescriptor((DataColumn)e.Element)) : null))); } internal void ColumnCollectionChangedInternal(object sender, CollectionChangeEventArgs e) { ColumnCollectionChanged(sender, e); } public DataTable ToTable() { return ToTable(null, false); } public DataTable ToTable(string tableName) { return ToTable(tableName, false); } public DataTable ToTable(bool distinct, params string[] columnNames) { return ToTable(null, distinct, columnNames); } public DataTable ToTable(string tableName, bool distinct, params string[] columnNames) { DataCommonEventSource.Log.Trace(" {0}, TableName='{1}', distinct={2}", ObjectID, tableName, distinct); if (columnNames == null) { throw ExceptionBuilder.ArgumentNull("columnNames"); } DataTable dataTable = new DataTable(); dataTable.Locale = _table.Locale; dataTable.CaseSensitive = _table.CaseSensitive; dataTable.TableName = ((tableName != null) ? tableName : _table.TableName); dataTable.Namespace = _table.Namespace; dataTable.Prefix = _table.Prefix; if (columnNames.Length == 0) { columnNames = new string[Table.Columns.Count]; for (int i = 0; i < columnNames.Length; i++) { columnNames[i] = Table.Columns[i].ColumnName; } } int[] array = new int[columnNames.Length]; List list = new List(); for (int j = 0; j < columnNames.Length; j++) { DataColumn dataColumn = Table.Columns[columnNames[j]]; if (dataColumn == null) { throw ExceptionBuilder.ColumnNotInTheUnderlyingTable(columnNames[j], Table.TableName); } dataTable.Columns.Add(dataColumn.Clone()); array[j] = Table.Columns.IndexOf(dataColumn); } IEnumerator enumerator = GetEnumerator(); try { while (enumerator.MoveNext()) { DataRowView dataRowView = (DataRowView)enumerator.Current; object[] array2 = new object[columnNames.Length]; for (int k = 0; k < array.Length; k++) { array2[k] = dataRowView[array[k]]; } if (!distinct || !RowExist(list, array2)) { dataTable.Rows.Add(array2); list.Add(array2); } } return dataTable; } finally { IDisposable disposable = enumerator as IDisposable; if (disposable != null) { disposable.Dispose(); } } } private bool RowExist(List arraylist, object[] objectArray) { for (int i = 0; i < arraylist.Count; i++) { object[] array = arraylist[i]; bool flag = true; for (int j = 0; j < objectArray.Length; j++) { flag &= array[j].Equals(objectArray[j]); } if (flag) { return true; } } return false; } public virtual bool Equals(DataView view) { if (view == null || Table != view.Table || Count != view.Count || !string.Equals(RowFilter, view.RowFilter, StringComparison.OrdinalIgnoreCase) || !string.Equals(Sort, view.Sort, StringComparison.OrdinalIgnoreCase) || (object)SortComparison != view.SortComparison || (object)RowPredicate != view.RowPredicate || RowStateFilter != view.RowStateFilter || DataViewManager != view.DataViewManager || AllowDelete != view.AllowDelete || AllowNew != view.AllowNew || AllowEdit != view.AllowEdit) { return false; } return true; } } internal sealed class DataViewListener { private readonly WeakReference _dvWeak; private DataTable _table; private Index _index; internal readonly int _objectID; internal DataViewListener(DataView dv) { _objectID = dv.ObjectID; _dvWeak = new WeakReference(dv); } private void ChildRelationCollectionChanged(object sender, CollectionChangeEventArgs e) { DataView dataView = (DataView)_dvWeak.Target; if (dataView != null) { dataView.ChildRelationCollectionChanged(sender, e); } else { CleanUp(updateListeners: true); } } private void ParentRelationCollectionChanged(object sender, CollectionChangeEventArgs e) { DataView dataView = (DataView)_dvWeak.Target; if (dataView != null) { dataView.ParentRelationCollectionChanged(sender, e); } else { CleanUp(updateListeners: true); } } private void ColumnCollectionChanged(object sender, CollectionChangeEventArgs e) { DataView dataView = (DataView)_dvWeak.Target; if (dataView != null) { dataView.ColumnCollectionChangedInternal(sender, e); } else { CleanUp(updateListeners: true); } } internal void MaintainDataView(ListChangedType changedType, DataRow row, bool trackAddRemove) { DataView dataView = (DataView)_dvWeak.Target; if (dataView != null) { dataView.MaintainDataView(changedType, row, trackAddRemove); } else { CleanUp(updateListeners: true); } } internal void IndexListChanged(ListChangedEventArgs e) { DataView dataView = (DataView)_dvWeak.Target; if (dataView != null) { dataView.IndexListChangedInternal(e); } else { CleanUp(updateListeners: true); } } internal void RegisterMetaDataEvents(DataTable table) { _table = table; if (table != null) { RegisterListener(table); CollectionChangeEventHandler value = ColumnCollectionChanged; table.Columns.ColumnPropertyChanged += value; table.Columns.CollectionChanged += value; CollectionChangeEventHandler value2 = ChildRelationCollectionChanged; ((DataRelationCollection.DataTableRelationCollection)table.ChildRelations).RelationPropertyChanged += value2; table.ChildRelations.CollectionChanged += value2; CollectionChangeEventHandler value3 = ParentRelationCollectionChanged; ((DataRelationCollection.DataTableRelationCollection)table.ParentRelations).RelationPropertyChanged += value3; table.ParentRelations.CollectionChanged += value3; } } internal void UnregisterMetaDataEvents() { UnregisterMetaDataEvents(updateListeners: true); } private void UnregisterMetaDataEvents(bool updateListeners) { DataTable table = _table; _table = null; if (table == null) { return; } CollectionChangeEventHandler value = ColumnCollectionChanged; table.Columns.ColumnPropertyChanged -= value; table.Columns.CollectionChanged -= value; CollectionChangeEventHandler value2 = ChildRelationCollectionChanged; ((DataRelationCollection.DataTableRelationCollection)table.ChildRelations).RelationPropertyChanged -= value2; table.ChildRelations.CollectionChanged -= value2; CollectionChangeEventHandler value3 = ParentRelationCollectionChanged; ((DataRelationCollection.DataTableRelationCollection)table.ParentRelations).RelationPropertyChanged -= value3; table.ParentRelations.CollectionChanged -= value3; if (updateListeners) { List listeners = table.GetListeners(); lock (listeners) { listeners.Remove(this); } } } internal void RegisterListChangedEvent(Index index) { _index = index; if (index != null) { lock (index) { index.AddRef(); index.ListChangedAdd(this); } } } internal void UnregisterListChangedEvent() { Index index = _index; _index = null; if (index == null) { return; } lock (index) { index.ListChangedRemove(this); if (index.RemoveRef() <= 1) { index.RemoveRef(); } } } private void CleanUp(bool updateListeners) { UnregisterMetaDataEvents(updateListeners); UnregisterListChangedEvent(); } private void RegisterListener(DataTable table) { List listeners = table.GetListeners(); lock (listeners) { int num = listeners.Count - 1; while (0 <= num) { DataViewListener dataViewListener = listeners[num]; if (!dataViewListener._dvWeak.IsAlive) { listeners.RemoveAt(num); dataViewListener.CleanUp(updateListeners: false); } num--; } listeners.Add(this); } } } public class DataViewManager : MarshalByValueComponent, IBindingList, IList, ICollection, IEnumerable, ITypedList { private DataViewSettingCollection _dataViewSettingsCollection; private DataSet _dataSet; private DataViewManagerListItemTypeDescriptor _item; private bool _locked; internal int _nViews; private static NotSupportedException s_notSupported = new NotSupportedException(); [DefaultValue(null)] public DataSet DataSet { get { return _dataSet; } set { if (value == null) { throw ExceptionBuilder.SetFailed("DataSet to null"); } if (_locked) { throw ExceptionBuilder.SetDataSetFailed(); } if (_dataSet != null) { if (_nViews > 0) { throw ExceptionBuilder.CanNotSetDataSet(); } _dataSet.Tables.CollectionChanged -= TableCollectionChanged; _dataSet.Relations.CollectionChanged -= RelationCollectionChanged; } _dataSet = value; _dataSet.Tables.CollectionChanged += TableCollectionChanged; _dataSet.Relations.CollectionChanged += RelationCollectionChanged; _dataViewSettingsCollection = new DataViewSettingCollection(this); _item.Reset(); } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public DataViewSettingCollection DataViewSettings => _dataViewSettingsCollection; public string DataViewSettingCollectionString { get { if (_dataSet == null) { return string.Empty; } StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(""); foreach (DataTable table in _dataSet.Tables) { DataViewSetting dataViewSetting = _dataViewSettingsCollection[table]; stringBuilder.AppendFormat(CultureInfo.InvariantCulture, "<{0} Sort=\"{1}\" RowFilter=\"{2}\" RowStateFilter=\"{3}\"/>", table.EncodedTableName, dataViewSetting.Sort, dataViewSetting.RowFilter, dataViewSetting.RowStateFilter); } stringBuilder.Append(""); return stringBuilder.ToString(); } set { if (string.IsNullOrEmpty(value)) { return; } XmlTextReader xmlTextReader = new XmlTextReader(new StringReader(value)); xmlTextReader.WhitespaceHandling = WhitespaceHandling.None; xmlTextReader.Read(); if (xmlTextReader.Name != "DataViewSettingCollectionString") { throw ExceptionBuilder.SetFailed("DataViewSettingCollectionString"); } while (xmlTextReader.Read()) { if (xmlTextReader.NodeType == XmlNodeType.Element) { string tableName = XmlConvert.DecodeName(xmlTextReader.LocalName); if (xmlTextReader.MoveToAttribute("Sort")) { _dataViewSettingsCollection[tableName].Sort = xmlTextReader.Value; } if (xmlTextReader.MoveToAttribute("RowFilter")) { _dataViewSettingsCollection[tableName].RowFilter = xmlTextReader.Value; } if (xmlTextReader.MoveToAttribute("RowStateFilter")) { _dataViewSettingsCollection[tableName].RowStateFilter = (DataViewRowState)Enum.Parse(typeof(DataViewRowState), xmlTextReader.Value); } } } } } int ICollection.Count => 1; object ICollection.SyncRoot => this; bool ICollection.IsSynchronized => false; bool IList.IsReadOnly => true; bool IList.IsFixedSize => true; object IList.this[int index] { get { return _item; } set { throw ExceptionBuilder.CannotModifyCollection(); } } bool IBindingList.AllowNew => false; bool IBindingList.AllowEdit => false; bool IBindingList.AllowRemove => false; bool IBindingList.SupportsChangeNotification => true; bool IBindingList.SupportsSearching => false; bool IBindingList.SupportsSorting => false; bool IBindingList.IsSorted { get { throw s_notSupported; } } PropertyDescriptor IBindingList.SortProperty { get { throw s_notSupported; } } ListSortDirection IBindingList.SortDirection { get { throw s_notSupported; } } public event ListChangedEventHandler ListChanged; public DataViewManager() : this(null, locked: false) { } public DataViewManager(DataSet dataSet) : this(dataSet, locked: false) { } internal DataViewManager(DataSet dataSet, bool locked) { GC.SuppressFinalize(this); _dataSet = dataSet; if (_dataSet != null) { _dataSet.Tables.CollectionChanged += TableCollectionChanged; _dataSet.Relations.CollectionChanged += RelationCollectionChanged; } _locked = locked; _item = new DataViewManagerListItemTypeDescriptor(this); _dataViewSettingsCollection = new DataViewSettingCollection(this); } IEnumerator IEnumerable.GetEnumerator() { DataViewManagerListItemTypeDescriptor[] array = new DataViewManagerListItemTypeDescriptor[1]; ((ICollection)this).CopyTo((Array)array, 0); return array.GetEnumerator(); } void ICollection.CopyTo(Array array, int index) { array.SetValue(new DataViewManagerListItemTypeDescriptor(this), index); } int IList.Add(object value) { throw ExceptionBuilder.CannotModifyCollection(); } void IList.Clear() { throw ExceptionBuilder.CannotModifyCollection(); } bool IList.Contains(object value) { return value == _item; } int IList.IndexOf(object value) { if (value != _item) { return -1; } return 1; } void IList.Insert(int index, object value) { throw ExceptionBuilder.CannotModifyCollection(); } void IList.Remove(object value) { throw ExceptionBuilder.CannotModifyCollection(); } void IList.RemoveAt(int index) { throw ExceptionBuilder.CannotModifyCollection(); } object IBindingList.AddNew() { throw s_notSupported; } void IBindingList.AddIndex(PropertyDescriptor property) { } void IBindingList.ApplySort(PropertyDescriptor property, ListSortDirection direction) { throw s_notSupported; } int IBindingList.Find(PropertyDescriptor property, object key) { throw s_notSupported; } void IBindingList.RemoveIndex(PropertyDescriptor property) { } void IBindingList.RemoveSort() { throw s_notSupported; } string ITypedList.GetListName(PropertyDescriptor[] listAccessors) { DataSet dataSet = DataSet; if (dataSet == null) { throw ExceptionBuilder.CanNotUseDataViewManager(); } if (listAccessors == null || listAccessors.Length == 0) { return dataSet.DataSetName; } DataTable dataTable = dataSet.FindTable(null, listAccessors, 0); if (dataTable != null) { return dataTable.TableName; } return string.Empty; } PropertyDescriptorCollection ITypedList.GetItemProperties(PropertyDescriptor[] listAccessors) { DataSet dataSet = DataSet; if (dataSet == null) { throw ExceptionBuilder.CanNotUseDataViewManager(); } if (listAccessors == null || listAccessors.Length == 0) { return ((ICustomTypeDescriptor)new DataViewManagerListItemTypeDescriptor(this)).GetProperties(); } DataTable dataTable = dataSet.FindTable(null, listAccessors, 0); if (dataTable != null) { return dataTable.GetPropertyDescriptorCollection(null); } return new PropertyDescriptorCollection(null); } public DataView CreateDataView(DataTable table) { if (_dataSet == null) { throw ExceptionBuilder.CanNotUseDataViewManager(); } DataView dataView = new DataView(table); dataView.SetDataViewManager(this); return dataView; } protected virtual void OnListChanged(ListChangedEventArgs e) { try { this.ListChanged?.Invoke(this, e); } catch (Exception e2) when (ADP.IsCatchableExceptionType(e2)) { ExceptionBuilder.TraceExceptionWithoutRethrow(e2); } } protected virtual void TableCollectionChanged(object sender, CollectionChangeEventArgs e) { PropertyDescriptor propDesc = null; OnListChanged((e.Action == CollectionChangeAction.Add) ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorAdded, new DataTablePropertyDescriptor((DataTable)e.Element)) : ((e.Action == CollectionChangeAction.Refresh) ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorChanged, propDesc) : ((e.Action == CollectionChangeAction.Remove) ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorDeleted, new DataTablePropertyDescriptor((DataTable)e.Element)) : null))); } protected virtual void RelationCollectionChanged(object sender, CollectionChangeEventArgs e) { DataRelationPropertyDescriptor propDesc = null; OnListChanged((e.Action == CollectionChangeAction.Add) ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorAdded, new DataRelationPropertyDescriptor((DataRelation)e.Element)) : ((e.Action == CollectionChangeAction.Refresh) ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorChanged, propDesc) : ((e.Action == CollectionChangeAction.Remove) ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorDeleted, new DataRelationPropertyDescriptor((DataRelation)e.Element)) : null))); } } internal sealed class DataViewManagerListItemTypeDescriptor : ICustomTypeDescriptor { private DataViewManager _dataViewManager; private PropertyDescriptorCollection _propsCollection; internal DataViewManagerListItemTypeDescriptor(DataViewManager dataViewManager) { _dataViewManager = dataViewManager; } internal void Reset() { _propsCollection = null; } internal DataView GetDataView(DataTable table) { DataView dataView = new DataView(table); dataView.SetDataViewManager(_dataViewManager); return dataView; } AttributeCollection ICustomTypeDescriptor.GetAttributes() { return new AttributeCollection((Attribute[]?)null); } string ICustomTypeDescriptor.GetClassName() { return null; } string ICustomTypeDescriptor.GetComponentName() { return null; } TypeConverter ICustomTypeDescriptor.GetConverter() { return null; } EventDescriptor ICustomTypeDescriptor.GetDefaultEvent() { return null; } PropertyDescriptor ICustomTypeDescriptor.GetDefaultProperty() { return null; } object ICustomTypeDescriptor.GetEditor(Type editorBaseType) { return null; } EventDescriptorCollection ICustomTypeDescriptor.GetEvents() { return new EventDescriptorCollection(null); } EventDescriptorCollection ICustomTypeDescriptor.GetEvents(Attribute[] attributes) { return new EventDescriptorCollection(null); } PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties() { return ((ICustomTypeDescriptor)this).GetProperties((Attribute[]?)null); } PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes) { if (_propsCollection == null) { PropertyDescriptor[] array = null; DataSet dataSet = _dataViewManager.DataSet; if (dataSet != null) { int count = dataSet.Tables.Count; array = new PropertyDescriptor[count]; for (int i = 0; i < count; i++) { array[i] = new DataTablePropertyDescriptor(dataSet.Tables[i]); } } _propsCollection = new PropertyDescriptorCollection(array); } return _propsCollection; } object ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor pd) { return this; } } [Flags] public enum DataViewRowState { None = 0, Unchanged = 2, Added = 4, Deleted = 8, ModifiedCurrent = 0x10, ModifiedOriginal = 0x20, OriginalRows = 0x2A, CurrentRows = 0x16 } [TypeConverter(typeof(ExpandableObjectConverter))] public class DataViewSetting { private DataViewManager _dataViewManager; private DataTable _table; private string _sort = string.Empty; private string _rowFilter = string.Empty; private DataViewRowState _rowStateFilter = DataViewRowState.CurrentRows; private bool _applyDefaultSort; public bool ApplyDefaultSort { get { return _applyDefaultSort; } set { if (_applyDefaultSort != value) { _applyDefaultSort = value; } } } [Browsable(false)] public DataViewManager DataViewManager => _dataViewManager; [Browsable(false)] public DataTable Table => _table; public string RowFilter { get { return _rowFilter; } set { if (value == null) { value = string.Empty; } if (_rowFilter != value) { _rowFilter = value; } } } public DataViewRowState RowStateFilter { get { return _rowStateFilter; } set { if (_rowStateFilter != value) { _rowStateFilter = value; } } } public string Sort { get { return _sort; } set { if (value == null) { value = string.Empty; } if (_sort != value) { _sort = value; } } } internal DataViewSetting() { } internal void SetDataViewManager(DataViewManager dataViewManager) { if (_dataViewManager != dataViewManager) { _dataViewManager = dataViewManager; } } internal void SetDataTable(DataTable table) { if (_table != table) { _table = table; } } } public class DataViewSettingCollection : ICollection, IEnumerable { private sealed class DataViewSettingsEnumerator : IEnumerator { private DataViewSettingCollection _dataViewSettings; private IEnumerator _tableEnumerator; public object Current => _dataViewSettings[(DataTable)_tableEnumerator.Current]; public DataViewSettingsEnumerator(DataViewManager dvm) { if (dvm.DataSet != null) { _dataViewSettings = dvm.DataViewSettings; _tableEnumerator = dvm.DataSet.Tables.GetEnumerator(); } else { _dataViewSettings = null; _tableEnumerator = Array.Empty().GetEnumerator(); } } public bool MoveNext() { return _tableEnumerator.MoveNext(); } public void Reset() { _tableEnumerator.Reset(); } } private readonly DataViewManager _dataViewManager; private readonly Hashtable _list; public virtual DataViewSetting this[DataTable table] { get { if (table == null) { throw ExceptionBuilder.ArgumentNull("table"); } DataViewSetting dataViewSetting = (DataViewSetting)_list[table]; if (dataViewSetting == null) { dataViewSetting = (this[table] = new DataViewSetting()); } return dataViewSetting; } set { if (table == null) { throw ExceptionBuilder.ArgumentNull("table"); } value.SetDataViewManager(_dataViewManager); value.SetDataTable(table); _list[table] = value; } } public virtual DataViewSetting this[string tableName] { get { DataTable table = GetTable(tableName); if (table != null) { return this[table]; } return null; } } public virtual DataViewSetting this[int index] { get { DataTable table = GetTable(index); if (table != null) { return this[table]; } return null; } set { DataTable table = GetTable(index); if (table != null) { this[table] = value; } } } [Browsable(false)] public virtual int Count => _dataViewManager.DataSet?.Tables.Count ?? 0; [Browsable(false)] public bool IsReadOnly => true; [Browsable(false)] public bool IsSynchronized => false; [Browsable(false)] public object SyncRoot => this; internal DataViewSettingCollection(DataViewManager dataViewManager) { _list = new Hashtable(); base..ctor(); if (dataViewManager == null) { throw ExceptionBuilder.ArgumentNull("dataViewManager"); } _dataViewManager = dataViewManager; } private DataTable GetTable(string tableName) { DataTable result = null; DataSet dataSet = _dataViewManager.DataSet; if (dataSet != null) { result = dataSet.Tables[tableName]; } return result; } private DataTable GetTable(int index) { DataTable result = null; DataSet dataSet = _dataViewManager.DataSet; if (dataSet != null) { result = dataSet.Tables[index]; } return result; } public void CopyTo(Array ar, int index) { IEnumerator enumerator = GetEnumerator(); while (enumerator.MoveNext()) { ar.SetValue(enumerator.Current, index++); } } public void CopyTo(DataViewSetting[] ar, int index) { IEnumerator enumerator = GetEnumerator(); while (enumerator.MoveNext()) { ar.SetValue(enumerator.Current, index++); } } public IEnumerator GetEnumerator() { return new DataViewSettingsEnumerator(_dataViewManager); } internal void Remove(DataTable table) { _list.Remove(table); } internal DataViewSettingCollection() { ThrowStub.ThrowNotSupportedException(); } } public enum DbType { AnsiString = 0, Binary = 1, Byte = 2, Boolean = 3, Currency = 4, Date = 5, DateTime = 6, Decimal = 7, Double = 8, Guid = 9, Int16 = 10, Int32 = 11, Int64 = 12, Object = 13, SByte = 14, Single = 15, String = 16, Time = 17, UInt16 = 18, UInt32 = 19, UInt64 = 20, VarNumeric = 21, AnsiStringFixedLength = 22, StringFixedLength = 23, Xml = 25, DateTime2 = 26, DateTimeOffset = 27 } internal sealed class DefaultValueTypeConverter : StringConverter { private const string NullString = ""; private const string DbNullString = ""; public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (destinationType == null) { throw new ArgumentNullException("destinationType"); } if (destinationType == typeof(string)) { if (value == null) { return ""; } if (value == DBNull.Value) { return ""; } } return base.ConvertTo(context, culture, value, destinationType); } public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value != null && value.GetType() == typeof(string)) { string a = (string)value; if (string.Equals(a, "", StringComparison.OrdinalIgnoreCase)) { return null; } if (string.Equals(a, "", StringComparison.OrdinalIgnoreCase)) { return DBNull.Value; } } return base.ConvertFrom(context, culture, value); } } public class FillErrorEventArgs : EventArgs { private bool _continueFlag; private DataTable _dataTable; private Exception _errors; private object[] _values; public bool Continue { get { return _continueFlag; } set { _continueFlag = value; } } public DataTable DataTable => _dataTable; public Exception Errors { get { return _errors; } set { _errors = value; } } public object[] Values { get { object[] array = new object[_values.Length]; for (int i = 0; i < _values.Length; i++) { array[i] = _values[i]; } return array; } } public FillErrorEventArgs(DataTable dataTable, object[] values) { _dataTable = dataTable; _values = values; if (_values == null) { _values = Array.Empty(); } } } public delegate void FillErrorEventHandler(object sender, FillErrorEventArgs e); internal enum Aggregate { None = -1, Sum = 30, Avg = 31, Min = 32, Max = 33, Count = 34, StDev = 35, Var = 37 } internal sealed class AggregateNode : ExpressionNode { private readonly AggregateType _type; private readonly Aggregate _aggregate; private readonly bool _local; private readonly string _relationName; private readonly string _columnName; private DataTable _childTable; private DataColumn _column; private DataRelation _relation; internal AggregateNode(DataTable table, FunctionId aggregateType, string columnName) : this(table, aggregateType, columnName, local: true, null) { } internal AggregateNode(DataTable table, FunctionId aggregateType, string columnName, bool local, string relationName) : base(table) { _aggregate = (Aggregate)aggregateType; switch (aggregateType) { case FunctionId.Sum: _type = AggregateType.Sum; break; case FunctionId.Avg: _type = AggregateType.Mean; break; case FunctionId.Min: _type = AggregateType.Min; break; case FunctionId.Max: _type = AggregateType.Max; break; case FunctionId.Count: _type = AggregateType.Count; break; case FunctionId.Var: _type = AggregateType.Var; break; case FunctionId.StDev: _type = AggregateType.StDev; break; default: throw ExprException.UndefinedFunction(Function.s_functionName[(int)aggregateType]); } _local = local; _relationName = relationName; _columnName = columnName; } internal override void Bind(DataTable table, List list) { BindTable(table); if (table == null) { throw ExprException.AggregateUnbound(ToString()); } if (_local) { _relation = null; } else { DataRelationCollection childRelations = table.ChildRelations; if (_relationName == null) { if (childRelations.Count > 1) { throw ExprException.UnresolvedRelation(table.TableName, ToString()); } if (childRelations.Count != 1) { throw ExprException.AggregateUnbound(ToString()); } _relation = childRelations[0]; } else { _relation = childRelations[_relationName]; } } _childTable = ((_relation == null) ? table : _relation.ChildTable); _column = _childTable.Columns[_columnName]; if (_column == null) { throw ExprException.UnboundName(_columnName); } int i; for (i = 0; i < list.Count; i++) { DataColumn dataColumn = list[i]; if (_column == dataColumn) { break; } } if (i >= list.Count) { list.Add(_column); } Bind(_relation, list); } internal static void Bind(DataRelation relation, List list) { if (relation == null) { return; } DataColumn[] childColumnsReference = relation.ChildColumnsReference; foreach (DataColumn item in childColumnsReference) { if (!list.Contains(item)) { list.Add(item); } } childColumnsReference = relation.ParentColumnsReference; foreach (DataColumn item2 in childColumnsReference) { if (!list.Contains(item2)) { list.Add(item2); } } } internal override object Eval() { return Eval(null, DataRowVersion.Default); } internal override object Eval(DataRow row, DataRowVersion version) { if (_childTable == null) { throw ExprException.AggregateUnbound(ToString()); } DataRow[] array; if (_local) { array = new DataRow[_childTable.Rows.Count]; _childTable.Rows.CopyTo(array, 0); } else { if (row == null) { throw ExprException.EvalNoContext(); } if (_relation == null) { throw ExprException.AggregateUnbound(ToString()); } array = row.GetChildRows(_relation, version); } if (version == DataRowVersion.Proposed) { version = DataRowVersion.Default; } List list = new List(); for (int i = 0; i < array.Length; i++) { if (array[i].RowState == DataRowState.Deleted) { if (DataRowAction.Rollback != array[i]._action) { continue; } version = DataRowVersion.Original; } else if (DataRowAction.Rollback == array[i]._action && array[i].RowState == DataRowState.Added) { continue; } if (version != DataRowVersion.Original || array[i]._oldRecord != -1) { list.Add(array[i].GetRecordFromVersion(version)); } } int[] records = list.ToArray(); return _column.GetAggregateValue(records, _type); } internal override object Eval(int[] records) { if (_childTable == null) { throw ExprException.AggregateUnbound(ToString()); } if (!_local) { throw ExprException.ComputeNotAggregate(ToString()); } return _column.GetAggregateValue(records, _type); } internal override bool IsConstant() { return false; } internal override bool IsTableConstant() { return _local; } internal override bool HasLocalAggregate() { return _local; } internal override bool HasRemoteAggregate() { return !_local; } internal override bool DependsOn(DataColumn column) { if (_column == column) { return true; } if (_column.Computed) { return _column.DataExpression.DependsOn(column); } return false; } internal override ExpressionNode Optimize() { return this; } } internal class BinaryNode : ExpressionNode { private enum DataTypePrecedence { SqlDateTime = 25, DateTimeOffset = 24, DateTime = 23, TimeSpan = 20, SqlDouble = 19, Double = 18, SqlSingle = 17, Single = 16, SqlDecimal = 15, Decimal = 14, SqlMoney = 13, UInt64 = 12, SqlInt64 = 11, Int64 = 10, UInt32 = 9, SqlInt32 = 8, Int32 = 7, UInt16 = 6, SqlInt16 = 5, Int16 = 4, Byte = 3, SqlByte = 2, SByte = 1, Error = 0, SqlBoolean = -1, Boolean = -2, SqlGuid = -3, SqlString = -4, String = -5, SqlXml = -6, SqlChars = -7, Char = -8, SqlBytes = -9, SqlBinary = -10 } internal int _op; internal ExpressionNode _left; internal ExpressionNode _right; internal BinaryNode(DataTable table, int op, ExpressionNode left, ExpressionNode right) : base(table) { _op = op; _left = left; _right = right; } internal override void Bind(DataTable table, List list) { BindTable(table); _left.Bind(table, list); _right.Bind(table, list); } internal override object Eval() { return Eval(null, DataRowVersion.Default); } internal override object Eval(DataRow row, DataRowVersion version) { return EvalBinaryOp(_op, _left, _right, row, version, null); } internal override object Eval(int[] recordNos) { return EvalBinaryOp(_op, _left, _right, null, DataRowVersion.Default, recordNos); } internal override bool IsConstant() { if (_left.IsConstant()) { return _right.IsConstant(); } return false; } internal override bool IsTableConstant() { if (_left.IsTableConstant()) { return _right.IsTableConstant(); } return false; } internal override bool HasLocalAggregate() { if (!_left.HasLocalAggregate()) { return _right.HasLocalAggregate(); } return true; } internal override bool HasRemoteAggregate() { if (!_left.HasRemoteAggregate()) { return _right.HasRemoteAggregate(); } return true; } internal override bool DependsOn(DataColumn column) { if (_left.DependsOn(column)) { return true; } return _right.DependsOn(column); } internal override ExpressionNode Optimize() { _left = _left.Optimize(); if (_op == 13) { if (_right is UnaryNode) { UnaryNode unaryNode = (UnaryNode)_right; if (unaryNode._op != 3) { throw ExprException.InvalidIsSyntax(); } _op = 39; _right = unaryNode._right; } if (!(_right is ZeroOpNode)) { throw ExprException.InvalidIsSyntax(); } if (((ZeroOpNode)_right)._op != 32) { throw ExprException.InvalidIsSyntax(); } } else { _right = _right.Optimize(); } if (IsConstant()) { object obj = Eval(); if (obj == DBNull.Value) { return new ZeroOpNode(32); } if (obj is bool) { if ((bool)obj) { return new ZeroOpNode(33); } return new ZeroOpNode(34); } return new ConstNode(base.table, ValueType.Object, obj, fParseQuotes: false); } return this; } internal void SetTypeMismatchError(int op, Type left, Type right) { throw ExprException.TypeMismatchInBinop(op, left, right); } private static object Eval(ExpressionNode expr, DataRow row, DataRowVersion version, int[] recordNos) { if (recordNos == null) { return expr.Eval(row, version); } return expr.Eval(recordNos); } internal int BinaryCompare(object vLeft, object vRight, StorageType resultType, int op) { return BinaryCompare(vLeft, vRight, resultType, op, null); } internal int BinaryCompare(object vLeft, object vRight, StorageType resultType, int op, CompareInfo comparer) { int result = 0; try { if (!DataStorage.IsSqlType(resultType)) { switch (resultType) { case StorageType.SByte: case StorageType.Byte: case StorageType.Int16: case StorageType.UInt16: case StorageType.Int32: return Convert.ToInt32(vLeft, base.FormatProvider).CompareTo(Convert.ToInt32(vRight, base.FormatProvider)); case StorageType.UInt32: case StorageType.Int64: case StorageType.UInt64: case StorageType.Decimal: return decimal.Compare(Convert.ToDecimal(vLeft, base.FormatProvider), Convert.ToDecimal(vRight, base.FormatProvider)); case StorageType.Char: return Convert.ToInt32(vLeft, base.FormatProvider).CompareTo(Convert.ToInt32(vRight, base.FormatProvider)); case StorageType.Double: return Convert.ToDouble(vLeft, base.FormatProvider).CompareTo(Convert.ToDouble(vRight, base.FormatProvider)); case StorageType.Single: return Convert.ToSingle(vLeft, base.FormatProvider).CompareTo(Convert.ToSingle(vRight, base.FormatProvider)); case StorageType.DateTime: return DateTime.Compare(Convert.ToDateTime(vLeft, base.FormatProvider), Convert.ToDateTime(vRight, base.FormatProvider)); case StorageType.DateTimeOffset: return DateTimeOffset.Compare((DateTimeOffset)vLeft, (DateTimeOffset)vRight); case StorageType.String: return base.table.Compare(Convert.ToString(vLeft, base.FormatProvider), Convert.ToString(vRight, base.FormatProvider), comparer); case StorageType.Guid: return ((Guid)vLeft).CompareTo((Guid)vRight); case StorageType.Boolean: if (op == 7 || op == 12) { return Convert.ToInt32(DataExpression.ToBoolean(vLeft), base.FormatProvider) - Convert.ToInt32(DataExpression.ToBoolean(vRight), base.FormatProvider); } break; case StorageType.TimeSpan: case StorageType.ByteArray: case StorageType.CharArray: case StorageType.Type: break; } } else { switch (resultType) { case StorageType.SByte: case StorageType.Byte: case StorageType.Int16: case StorageType.UInt16: case StorageType.Int32: case StorageType.SqlByte: case StorageType.SqlInt16: case StorageType.SqlInt32: return SqlConvert.ConvertToSqlInt32(vLeft).CompareTo(SqlConvert.ConvertToSqlInt32(vRight)); case StorageType.UInt32: case StorageType.Int64: case StorageType.SqlInt64: return SqlConvert.ConvertToSqlInt64(vLeft).CompareTo(SqlConvert.ConvertToSqlInt64(vRight)); case StorageType.UInt64: case StorageType.SqlDecimal: return SqlConvert.ConvertToSqlDecimal(vLeft).CompareTo(SqlConvert.ConvertToSqlDecimal(vRight)); case StorageType.SqlDouble: return SqlConvert.ConvertToSqlDouble(vLeft).CompareTo(SqlConvert.ConvertToSqlDouble(vRight)); case StorageType.SqlSingle: return SqlConvert.ConvertToSqlSingle(vLeft).CompareTo(SqlConvert.ConvertToSqlSingle(vRight)); case StorageType.SqlString: return base.table.Compare(vLeft.ToString(), vRight.ToString()); case StorageType.SqlGuid: return ((SqlGuid)vLeft).CompareTo(vRight); case StorageType.SqlBoolean: if (op == 7 || op == 12) { result = 1; if ((vLeft.GetType() == typeof(SqlBoolean) && (vRight.GetType() == typeof(SqlBoolean) || vRight.GetType() == typeof(bool))) || (vRight.GetType() == typeof(SqlBoolean) && (vLeft.GetType() == typeof(SqlBoolean) || vLeft.GetType() == typeof(bool)))) { return SqlConvert.ConvertToSqlBoolean(vLeft).CompareTo(SqlConvert.ConvertToSqlBoolean(vRight)); } } break; case StorageType.SqlBinary: return SqlConvert.ConvertToSqlBinary(vLeft).CompareTo(SqlConvert.ConvertToSqlBinary(vRight)); case StorageType.SqlDateTime: return SqlConvert.ConvertToSqlDateTime(vLeft).CompareTo(SqlConvert.ConvertToSqlDateTime(vRight)); case StorageType.SqlMoney: return SqlConvert.ConvertToSqlMoney(vLeft).CompareTo(SqlConvert.ConvertToSqlMoney(vRight)); case StorageType.Single: case StorageType.Double: case StorageType.Decimal: case StorageType.DateTime: case StorageType.TimeSpan: case StorageType.String: case StorageType.Guid: case StorageType.ByteArray: case StorageType.CharArray: case StorageType.Type: case StorageType.DateTimeOffset: case StorageType.BigInteger: case StorageType.Uri: case StorageType.SqlBytes: case StorageType.SqlChars: break; } } } catch (ArgumentException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); } catch (FormatException e2) { ExceptionBuilder.TraceExceptionWithoutRethrow(e2); } catch (InvalidCastException e3) { ExceptionBuilder.TraceExceptionWithoutRethrow(e3); } catch (OverflowException e4) { ExceptionBuilder.TraceExceptionWithoutRethrow(e4); } catch (EvaluateException e5) { ExceptionBuilder.TraceExceptionWithoutRethrow(e5); } SetTypeMismatchError(op, vLeft.GetType(), vRight.GetType()); return result; } private object EvalBinaryOp(int op, ExpressionNode left, ExpressionNode right, DataRow row, DataRowVersion version, int[] recordNos) { object obj2; StorageType storageType3; object obj; if (op != 27 && op != 26 && op != 5 && op != 13 && op != 39) { obj = Eval(left, row, version, recordNos); obj2 = Eval(right, row, version, recordNos); Type type = obj.GetType(); Type type2 = obj2.GetType(); StorageType storageType = DataStorage.GetStorageType(type); StorageType storageType2 = DataStorage.GetStorageType(type2); bool flag = DataStorage.IsSqlType(storageType); bool flag2 = DataStorage.IsSqlType(storageType2); if (flag && DataStorage.IsObjectSqlNull(obj)) { return obj; } if (flag2 && DataStorage.IsObjectSqlNull(obj2)) { return obj2; } if (obj == DBNull.Value || obj2 == DBNull.Value) { return DBNull.Value; } storageType3 = ((!(flag || flag2)) ? ResultType(storageType, storageType2, left is ConstNode, right is ConstNode, op) : ResultSqlType(storageType, storageType2, left is ConstNode, right is ConstNode, op)); if (storageType3 == StorageType.Empty) { SetTypeMismatchError(op, type, type2); } } else { obj = (obj2 = DBNull.Value); storageType3 = StorageType.Empty; } object result = DBNull.Value; bool flag3 = false; try { switch (op) { case 15: switch (storageType3) { case StorageType.Byte: result = Convert.ToByte(Convert.ToByte(obj, base.FormatProvider) + Convert.ToByte(obj2, base.FormatProvider), base.FormatProvider); break; case StorageType.SByte: result = Convert.ToSByte(Convert.ToSByte(obj, base.FormatProvider) + Convert.ToSByte(obj2, base.FormatProvider), base.FormatProvider); break; case StorageType.Int16: result = Convert.ToInt16(Convert.ToInt16(obj, base.FormatProvider) + Convert.ToInt16(obj2, base.FormatProvider), base.FormatProvider); break; case StorageType.UInt16: result = Convert.ToUInt16(Convert.ToUInt16(obj, base.FormatProvider) + Convert.ToUInt16(obj2, base.FormatProvider), base.FormatProvider); break; case StorageType.Int32: result = checked(Convert.ToInt32(obj, base.FormatProvider) + Convert.ToInt32(obj2, base.FormatProvider)); break; case StorageType.UInt32: result = checked(Convert.ToUInt32(obj, base.FormatProvider) + Convert.ToUInt32(obj2, base.FormatProvider)); break; case StorageType.UInt64: result = checked(Convert.ToUInt64(obj, base.FormatProvider) + Convert.ToUInt64(obj2, base.FormatProvider)); break; case StorageType.Int64: result = checked(Convert.ToInt64(obj, base.FormatProvider) + Convert.ToInt64(obj2, base.FormatProvider)); break; case StorageType.Decimal: result = Convert.ToDecimal(obj, base.FormatProvider) + Convert.ToDecimal(obj2, base.FormatProvider); break; case StorageType.Single: result = Convert.ToSingle(obj, base.FormatProvider) + Convert.ToSingle(obj2, base.FormatProvider); break; case StorageType.Double: result = Convert.ToDouble(obj, base.FormatProvider) + Convert.ToDouble(obj2, base.FormatProvider); break; case StorageType.Char: case StorageType.String: result = Convert.ToString(obj, base.FormatProvider) + Convert.ToString(obj2, base.FormatProvider); break; case StorageType.DateTime: if (obj is TimeSpan && obj2 is DateTime) { result = (DateTime)obj2 + (TimeSpan)obj; } else if (obj is DateTime && obj2 is TimeSpan) { result = (DateTime)obj + (TimeSpan)obj2; } else { flag3 = true; } break; case StorageType.TimeSpan: result = (TimeSpan)obj + (TimeSpan)obj2; break; case StorageType.SqlInt16: result = SqlConvert.ConvertToSqlInt16(obj) + SqlConvert.ConvertToSqlInt16(obj2); break; case StorageType.SqlInt32: result = SqlConvert.ConvertToSqlInt32(obj) + SqlConvert.ConvertToSqlInt32(obj2); break; case StorageType.SqlInt64: result = SqlConvert.ConvertToSqlInt64(obj) + SqlConvert.ConvertToSqlInt64(obj2); break; case StorageType.SqlDouble: result = SqlConvert.ConvertToSqlDouble(obj) + SqlConvert.ConvertToSqlDouble(obj2); break; case StorageType.SqlSingle: result = SqlConvert.ConvertToSqlSingle(obj) + SqlConvert.ConvertToSqlSingle(obj2); break; case StorageType.SqlDecimal: result = SqlConvert.ConvertToSqlDecimal(obj) + SqlConvert.ConvertToSqlDecimal(obj2); break; case StorageType.SqlMoney: result = SqlConvert.ConvertToSqlMoney(obj) + SqlConvert.ConvertToSqlMoney(obj2); break; case StorageType.SqlByte: result = SqlConvert.ConvertToSqlByte(obj) + SqlConvert.ConvertToSqlByte(obj2); break; case StorageType.SqlString: result = SqlConvert.ConvertToSqlString(obj) + SqlConvert.ConvertToSqlString(obj2); break; case StorageType.SqlDateTime: if (obj is TimeSpan && obj2 is SqlDateTime) { result = SqlConvert.ConvertToSqlDateTime(SqlConvert.ConvertToSqlDateTime(obj2).Value + (TimeSpan)obj); } else if (obj is SqlDateTime && obj2 is TimeSpan) { result = SqlConvert.ConvertToSqlDateTime(SqlConvert.ConvertToSqlDateTime(obj).Value + (TimeSpan)obj2); } else { flag3 = true; } break; default: flag3 = true; break; } break; case 16: switch (storageType3) { case StorageType.Byte: result = Convert.ToByte(Convert.ToByte(obj, base.FormatProvider) - Convert.ToByte(obj2, base.FormatProvider), base.FormatProvider); break; case StorageType.SqlByte: result = SqlConvert.ConvertToSqlByte(obj) - SqlConvert.ConvertToSqlByte(obj2); break; case StorageType.SByte: result = Convert.ToSByte(Convert.ToSByte(obj, base.FormatProvider) - Convert.ToSByte(obj2, base.FormatProvider), base.FormatProvider); break; case StorageType.Int16: result = Convert.ToInt16(Convert.ToInt16(obj, base.FormatProvider) - Convert.ToInt16(obj2, base.FormatProvider), base.FormatProvider); break; case StorageType.SqlInt16: result = SqlConvert.ConvertToSqlInt16(obj) - SqlConvert.ConvertToSqlInt16(obj2); break; case StorageType.UInt16: result = Convert.ToUInt16(Convert.ToUInt16(obj, base.FormatProvider) - Convert.ToUInt16(obj2, base.FormatProvider), base.FormatProvider); break; case StorageType.Int32: result = checked(Convert.ToInt32(obj, base.FormatProvider) - Convert.ToInt32(obj2, base.FormatProvider)); break; case StorageType.SqlInt32: result = SqlConvert.ConvertToSqlInt32(obj) - SqlConvert.ConvertToSqlInt32(obj2); break; case StorageType.UInt32: result = checked(Convert.ToUInt32(obj, base.FormatProvider) - Convert.ToUInt32(obj2, base.FormatProvider)); break; case StorageType.Int64: result = checked(Convert.ToInt64(obj, base.FormatProvider) - Convert.ToInt64(obj2, base.FormatProvider)); break; case StorageType.SqlInt64: result = SqlConvert.ConvertToSqlInt64(obj) - SqlConvert.ConvertToSqlInt64(obj2); break; case StorageType.UInt64: result = checked(Convert.ToUInt64(obj, base.FormatProvider) - Convert.ToUInt64(obj2, base.FormatProvider)); break; case StorageType.Decimal: result = Convert.ToDecimal(obj, base.FormatProvider) - Convert.ToDecimal(obj2, base.FormatProvider); break; case StorageType.SqlDecimal: result = SqlConvert.ConvertToSqlDecimal(obj) - SqlConvert.ConvertToSqlDecimal(obj2); break; case StorageType.Single: result = Convert.ToSingle(obj, base.FormatProvider) - Convert.ToSingle(obj2, base.FormatProvider); break; case StorageType.SqlSingle: result = SqlConvert.ConvertToSqlSingle(obj) - SqlConvert.ConvertToSqlSingle(obj2); break; case StorageType.Double: result = Convert.ToDouble(obj, base.FormatProvider) - Convert.ToDouble(obj2, base.FormatProvider); break; case StorageType.SqlDouble: result = SqlConvert.ConvertToSqlDouble(obj) - SqlConvert.ConvertToSqlDouble(obj2); break; case StorageType.SqlMoney: result = SqlConvert.ConvertToSqlMoney(obj) - SqlConvert.ConvertToSqlMoney(obj2); break; case StorageType.DateTime: result = (DateTime)obj - (TimeSpan)obj2; break; case StorageType.TimeSpan: result = ((!(obj is DateTime)) ? ((object)((TimeSpan)obj - (TimeSpan)obj2)) : ((object)((DateTime)obj - (DateTime)obj2))); break; case StorageType.SqlDateTime: if (obj is TimeSpan && obj2 is SqlDateTime) { result = SqlConvert.ConvertToSqlDateTime(SqlConvert.ConvertToSqlDateTime(obj2).Value - (TimeSpan)obj); } else if (obj is SqlDateTime && obj2 is TimeSpan) { result = SqlConvert.ConvertToSqlDateTime(SqlConvert.ConvertToSqlDateTime(obj).Value - (TimeSpan)obj2); } else { flag3 = true; } break; default: flag3 = true; break; } break; case 17: switch (storageType3) { case StorageType.Byte: result = Convert.ToByte(Convert.ToByte(obj, base.FormatProvider) * Convert.ToByte(obj2, base.FormatProvider), base.FormatProvider); break; case StorageType.SqlByte: result = SqlConvert.ConvertToSqlByte(obj) * SqlConvert.ConvertToSqlByte(obj2); break; case StorageType.SByte: result = Convert.ToSByte(Convert.ToSByte(obj, base.FormatProvider) * Convert.ToSByte(obj2, base.FormatProvider), base.FormatProvider); break; case StorageType.Int16: result = Convert.ToInt16(Convert.ToInt16(obj, base.FormatProvider) * Convert.ToInt16(obj2, base.FormatProvider), base.FormatProvider); break; case StorageType.SqlInt16: result = SqlConvert.ConvertToSqlInt16(obj) * SqlConvert.ConvertToSqlInt16(obj2); break; case StorageType.UInt16: result = Convert.ToUInt16(Convert.ToUInt16(obj, base.FormatProvider) * Convert.ToUInt16(obj2, base.FormatProvider), base.FormatProvider); break; case StorageType.Int32: result = checked(Convert.ToInt32(obj, base.FormatProvider) * Convert.ToInt32(obj2, base.FormatProvider)); break; case StorageType.SqlInt32: result = SqlConvert.ConvertToSqlInt32(obj) * SqlConvert.ConvertToSqlInt32(obj2); break; case StorageType.UInt32: result = checked(Convert.ToUInt32(obj, base.FormatProvider) * Convert.ToUInt32(obj2, base.FormatProvider)); break; case StorageType.Int64: result = checked(Convert.ToInt64(obj, base.FormatProvider) * Convert.ToInt64(obj2, base.FormatProvider)); break; case StorageType.SqlInt64: result = SqlConvert.ConvertToSqlInt64(obj) * SqlConvert.ConvertToSqlInt64(obj2); break; case StorageType.UInt64: result = checked(Convert.ToUInt64(obj, base.FormatProvider) * Convert.ToUInt64(obj2, base.FormatProvider)); break; case StorageType.Decimal: result = Convert.ToDecimal(obj, base.FormatProvider) * Convert.ToDecimal(obj2, base.FormatProvider); break; case StorageType.SqlDecimal: result = SqlConvert.ConvertToSqlDecimal(obj) * SqlConvert.ConvertToSqlDecimal(obj2); break; case StorageType.Single: result = Convert.ToSingle(obj, base.FormatProvider) * Convert.ToSingle(obj2, base.FormatProvider); break; case StorageType.SqlSingle: result = SqlConvert.ConvertToSqlSingle(obj) * SqlConvert.ConvertToSqlSingle(obj2); break; case StorageType.SqlMoney: result = SqlConvert.ConvertToSqlMoney(obj) * SqlConvert.ConvertToSqlMoney(obj2); break; case StorageType.Double: result = Convert.ToDouble(obj, base.FormatProvider) * Convert.ToDouble(obj2, base.FormatProvider); break; case StorageType.SqlDouble: result = SqlConvert.ConvertToSqlDouble(obj) * SqlConvert.ConvertToSqlDouble(obj2); break; default: flag3 = true; break; } break; case 18: switch (storageType3) { case StorageType.Byte: result = Convert.ToByte(Convert.ToByte(obj, base.FormatProvider) / Convert.ToByte(obj2, base.FormatProvider), base.FormatProvider); break; case StorageType.SqlByte: result = SqlConvert.ConvertToSqlByte(obj) / SqlConvert.ConvertToSqlByte(obj2); break; case StorageType.SByte: result = Convert.ToSByte(Convert.ToSByte(obj, base.FormatProvider) / Convert.ToSByte(obj2, base.FormatProvider), base.FormatProvider); break; case StorageType.Int16: result = Convert.ToInt16(Convert.ToInt16(obj, base.FormatProvider) / Convert.ToInt16(obj2, base.FormatProvider), base.FormatProvider); break; case StorageType.SqlInt16: result = SqlConvert.ConvertToSqlInt16(obj) / SqlConvert.ConvertToSqlInt16(obj2); break; case StorageType.UInt16: result = Convert.ToUInt16(Convert.ToUInt16(obj, base.FormatProvider) / Convert.ToUInt16(obj2, base.FormatProvider), base.FormatProvider); break; case StorageType.Int32: result = Convert.ToInt32(obj, base.FormatProvider) / Convert.ToInt32(obj2, base.FormatProvider); break; case StorageType.SqlInt32: result = SqlConvert.ConvertToSqlInt32(obj) / SqlConvert.ConvertToSqlInt32(obj2); break; case StorageType.UInt32: result = Convert.ToUInt32(obj, base.FormatProvider) / Convert.ToUInt32(obj2, base.FormatProvider); break; case StorageType.UInt64: result = Convert.ToUInt64(obj, base.FormatProvider) / Convert.ToUInt64(obj2, base.FormatProvider); break; case StorageType.Int64: result = Convert.ToInt64(obj, base.FormatProvider) / Convert.ToInt64(obj2, base.FormatProvider); break; case StorageType.SqlInt64: result = SqlConvert.ConvertToSqlInt64(obj) / SqlConvert.ConvertToSqlInt64(obj2); break; case StorageType.Decimal: result = Convert.ToDecimal(obj, base.FormatProvider) / Convert.ToDecimal(obj2, base.FormatProvider); break; case StorageType.SqlDecimal: result = SqlConvert.ConvertToSqlDecimal(obj) / SqlConvert.ConvertToSqlDecimal(obj2); break; case StorageType.Single: result = Convert.ToSingle(obj, base.FormatProvider) / Convert.ToSingle(obj2, base.FormatProvider); break; case StorageType.SqlSingle: result = SqlConvert.ConvertToSqlSingle(obj) / SqlConvert.ConvertToSqlSingle(obj2); break; case StorageType.SqlMoney: result = SqlConvert.ConvertToSqlMoney(obj) / SqlConvert.ConvertToSqlMoney(obj2); break; case StorageType.Double: { double num = Convert.ToDouble(obj2, base.FormatProvider); result = Convert.ToDouble(obj, base.FormatProvider) / num; break; } case StorageType.SqlDouble: result = SqlConvert.ConvertToSqlDouble(obj) / SqlConvert.ConvertToSqlDouble(obj2); break; default: flag3 = true; break; } break; case 7: if (obj == DBNull.Value || (left.IsSqlColumn && DataStorage.IsObjectSqlNull(obj)) || obj2 == DBNull.Value || (right.IsSqlColumn && DataStorage.IsObjectSqlNull(obj2))) { return DBNull.Value; } return BinaryCompare(obj, obj2, storageType3, 7) == 0; case 8: if (obj == DBNull.Value || (left.IsSqlColumn && DataStorage.IsObjectSqlNull(obj)) || obj2 == DBNull.Value || (right.IsSqlColumn && DataStorage.IsObjectSqlNull(obj2))) { return DBNull.Value; } return 0 < BinaryCompare(obj, obj2, storageType3, op); case 9: if (obj == DBNull.Value || (left.IsSqlColumn && DataStorage.IsObjectSqlNull(obj)) || obj2 == DBNull.Value || (right.IsSqlColumn && DataStorage.IsObjectSqlNull(obj2))) { return DBNull.Value; } return 0 > BinaryCompare(obj, obj2, storageType3, op); case 10: if (obj == DBNull.Value || (left.IsSqlColumn && DataStorage.IsObjectSqlNull(obj)) || obj2 == DBNull.Value || (right.IsSqlColumn && DataStorage.IsObjectSqlNull(obj2))) { return DBNull.Value; } return 0 <= BinaryCompare(obj, obj2, storageType3, op); case 11: if (obj == DBNull.Value || (left.IsSqlColumn && DataStorage.IsObjectSqlNull(obj)) || obj2 == DBNull.Value || (right.IsSqlColumn && DataStorage.IsObjectSqlNull(obj2))) { return DBNull.Value; } return 0 >= BinaryCompare(obj, obj2, storageType3, op); case 12: if (obj == DBNull.Value || (left.IsSqlColumn && DataStorage.IsObjectSqlNull(obj)) || obj2 == DBNull.Value || (right.IsSqlColumn && DataStorage.IsObjectSqlNull(obj2))) { return DBNull.Value; } return BinaryCompare(obj, obj2, storageType3, op) != 0; case 13: obj = Eval(left, row, version, recordNos); if (obj == DBNull.Value || (left.IsSqlColumn && DataStorage.IsObjectSqlNull(obj))) { return true; } return false; case 39: obj = Eval(left, row, version, recordNos); if (obj == DBNull.Value || (left.IsSqlColumn && DataStorage.IsObjectSqlNull(obj))) { return false; } return true; case 26: obj = Eval(left, row, version, recordNos); if (obj == DBNull.Value || (left.IsSqlColumn && DataStorage.IsObjectSqlNull(obj))) { return DBNull.Value; } if (!(obj is bool) && !(obj is SqlBoolean)) { obj2 = Eval(right, row, version, recordNos); flag3 = true; break; } if (obj is bool) { if (!(bool)obj) { result = false; break; } } else if (((SqlBoolean)obj).IsFalse) { result = false; break; } obj2 = Eval(right, row, version, recordNos); if (obj2 == DBNull.Value || (right.IsSqlColumn && DataStorage.IsObjectSqlNull(obj2))) { return DBNull.Value; } if (obj2 is bool || obj2 is SqlBoolean) { result = ((!(obj2 is bool)) ? ((object)((SqlBoolean)obj2).IsTrue) : ((object)(bool)obj2)); } else { flag3 = true; } break; case 27: obj = Eval(left, row, version, recordNos); if (obj != DBNull.Value && !DataStorage.IsObjectSqlNull(obj)) { if (!(obj is bool) && !(obj is SqlBoolean)) { obj2 = Eval(right, row, version, recordNos); flag3 = true; break; } if ((bool)obj) { result = true; break; } } obj2 = Eval(right, row, version, recordNos); if (obj2 == DBNull.Value || DataStorage.IsObjectSqlNull(obj2)) { return obj; } if (obj == DBNull.Value || DataStorage.IsObjectSqlNull(obj)) { return obj2; } if (!(obj2 is bool) && !(obj2 is SqlBoolean)) { flag3 = true; } else { result = ((obj2 is bool) ? ((bool)obj2) : ((SqlBoolean)obj2).IsTrue); } break; case 20: if (ExpressionNode.IsIntegerSql(storageType3)) { if (storageType3 == StorageType.UInt64) { result = Convert.ToUInt64(obj, base.FormatProvider) % Convert.ToUInt64(obj2, base.FormatProvider); } else if (DataStorage.IsSqlType(storageType3)) { SqlInt64 sqlInt = SqlConvert.ConvertToSqlInt64(obj) % SqlConvert.ConvertToSqlInt64(obj2); result = storageType3 switch { StorageType.SqlInt32 => sqlInt.ToSqlInt32(), StorageType.SqlInt16 => sqlInt.ToSqlInt16(), StorageType.SqlByte => sqlInt.ToSqlByte(), _ => sqlInt, }; } else { result = Convert.ToInt64(obj, base.FormatProvider) % Convert.ToInt64(obj2, base.FormatProvider); result = Convert.ChangeType(result, DataStorage.GetTypeStorage(storageType3), base.FormatProvider); } } else { flag3 = true; } break; case 5: { if (!(right is FunctionNode)) { throw ExprException.InWithoutParentheses(); } obj = Eval(left, row, version, recordNos); if (obj == DBNull.Value || (left.IsSqlColumn && DataStorage.IsObjectSqlNull(obj))) { return DBNull.Value; } result = false; FunctionNode functionNode = (FunctionNode)right; for (int i = 0; i < functionNode._argumentCount; i++) { obj2 = functionNode._arguments[i].Eval(); if (obj2 != DBNull.Value && (!right.IsSqlColumn || !DataStorage.IsObjectSqlNull(obj2))) { storageType3 = DataStorage.GetStorageType(obj.GetType()); if (BinaryCompare(obj, obj2, storageType3, 7) == 0) { result = true; break; } } } break; } default: throw ExprException.UnsupportedOperator(op); } } catch (OverflowException) { throw ExprException.Overflow(DataStorage.GetTypeStorage(storageType3)); } if (flag3) { SetTypeMismatchError(op, obj.GetType(), obj2.GetType()); } return result; } private DataTypePrecedence GetPrecedence(StorageType storageType) { return storageType switch { StorageType.Boolean => DataTypePrecedence.Boolean, StorageType.Char => DataTypePrecedence.Char, StorageType.SByte => DataTypePrecedence.SByte, StorageType.Byte => DataTypePrecedence.Byte, StorageType.Int16 => DataTypePrecedence.Int16, StorageType.UInt16 => DataTypePrecedence.UInt16, StorageType.Int32 => DataTypePrecedence.Int32, StorageType.UInt32 => DataTypePrecedence.UInt32, StorageType.Int64 => DataTypePrecedence.Int64, StorageType.UInt64 => DataTypePrecedence.UInt64, StorageType.Single => DataTypePrecedence.Single, StorageType.Double => DataTypePrecedence.Double, StorageType.Decimal => DataTypePrecedence.Decimal, StorageType.DateTime => DataTypePrecedence.DateTime, StorageType.DateTimeOffset => DataTypePrecedence.DateTimeOffset, StorageType.TimeSpan => DataTypePrecedence.TimeSpan, StorageType.String => DataTypePrecedence.String, StorageType.SqlBinary => DataTypePrecedence.SqlBinary, StorageType.SqlBoolean => DataTypePrecedence.SqlBoolean, StorageType.SqlByte => DataTypePrecedence.SqlByte, StorageType.SqlBytes => DataTypePrecedence.SqlBytes, StorageType.SqlChars => DataTypePrecedence.SqlChars, StorageType.SqlDateTime => DataTypePrecedence.SqlDateTime, StorageType.SqlDecimal => DataTypePrecedence.SqlDecimal, StorageType.SqlDouble => DataTypePrecedence.SqlDouble, StorageType.SqlGuid => DataTypePrecedence.SqlGuid, StorageType.SqlInt16 => DataTypePrecedence.SqlInt16, StorageType.SqlInt32 => DataTypePrecedence.SqlInt32, StorageType.SqlInt64 => DataTypePrecedence.SqlInt64, StorageType.SqlMoney => DataTypePrecedence.SqlMoney, StorageType.SqlSingle => DataTypePrecedence.SqlSingle, StorageType.SqlString => DataTypePrecedence.SqlString, _ => DataTypePrecedence.Error, }; } private static StorageType GetPrecedenceType(DataTypePrecedence code) { return code switch { DataTypePrecedence.SByte => StorageType.SByte, DataTypePrecedence.Byte => StorageType.Byte, DataTypePrecedence.Int16 => StorageType.Int16, DataTypePrecedence.UInt16 => StorageType.UInt16, DataTypePrecedence.Int32 => StorageType.Int32, DataTypePrecedence.UInt32 => StorageType.UInt32, DataTypePrecedence.Int64 => StorageType.Int64, DataTypePrecedence.UInt64 => StorageType.UInt64, DataTypePrecedence.Decimal => StorageType.Decimal, DataTypePrecedence.Single => StorageType.Single, DataTypePrecedence.Double => StorageType.Double, DataTypePrecedence.Boolean => StorageType.Boolean, DataTypePrecedence.String => StorageType.String, DataTypePrecedence.Char => StorageType.Char, DataTypePrecedence.DateTimeOffset => StorageType.DateTimeOffset, DataTypePrecedence.DateTime => StorageType.DateTime, DataTypePrecedence.TimeSpan => StorageType.TimeSpan, DataTypePrecedence.SqlDateTime => StorageType.SqlDateTime, DataTypePrecedence.SqlDouble => StorageType.SqlDouble, DataTypePrecedence.SqlSingle => StorageType.SqlSingle, DataTypePrecedence.SqlDecimal => StorageType.SqlDecimal, DataTypePrecedence.SqlInt64 => StorageType.SqlInt64, DataTypePrecedence.SqlInt32 => StorageType.SqlInt32, DataTypePrecedence.SqlInt16 => StorageType.SqlInt16, DataTypePrecedence.SqlByte => StorageType.SqlByte, DataTypePrecedence.SqlBoolean => StorageType.SqlBoolean, DataTypePrecedence.SqlString => StorageType.SqlString, DataTypePrecedence.SqlGuid => StorageType.SqlGuid, DataTypePrecedence.SqlBinary => StorageType.SqlBinary, DataTypePrecedence.SqlMoney => StorageType.SqlMoney, _ => StorageType.Empty, }; } private bool IsMixed(StorageType left, StorageType right) { if (!ExpressionNode.IsSigned(left) || !ExpressionNode.IsUnsigned(right)) { if (ExpressionNode.IsUnsigned(left)) { return ExpressionNode.IsSigned(right); } return false; } return true; } private bool IsMixedSql(StorageType left, StorageType right) { if (!ExpressionNode.IsSignedSql(left) || !ExpressionNode.IsUnsignedSql(right)) { if (ExpressionNode.IsUnsignedSql(left)) { return ExpressionNode.IsSignedSql(right); } return false; } return true; } internal StorageType ResultType(StorageType left, StorageType right, bool lc, bool rc, int op) { if (left == StorageType.Guid && right == StorageType.Guid && Operators.IsRelational(op)) { return left; } if (left == StorageType.String && right == StorageType.Guid && Operators.IsRelational(op)) { return left; } if (left == StorageType.Guid && right == StorageType.String && Operators.IsRelational(op)) { return right; } int precedence = (int)GetPrecedence(left); if (precedence == 0) { return StorageType.Empty; } int precedence2 = (int)GetPrecedence(right); if (precedence2 == 0) { return StorageType.Empty; } if (Operators.IsLogical(op)) { if (left == StorageType.Boolean && right == StorageType.Boolean) { return StorageType.Boolean; } return StorageType.Empty; } if (left == StorageType.DateTimeOffset || right == StorageType.DateTimeOffset) { if (Operators.IsRelational(op) && left == StorageType.DateTimeOffset && right == StorageType.DateTimeOffset) { return StorageType.DateTimeOffset; } return StorageType.Empty; } if (op == 15 && (left == StorageType.String || right == StorageType.String)) { return StorageType.String; } DataTypePrecedence dataTypePrecedence = (DataTypePrecedence)Math.Max(precedence, precedence2); StorageType precedenceType = GetPrecedenceType(dataTypePrecedence); if (Operators.IsArithmetical(op) && precedenceType != StorageType.String && precedenceType != StorageType.Char) { if (!ExpressionNode.IsNumeric(left)) { return StorageType.Empty; } if (!ExpressionNode.IsNumeric(right)) { return StorageType.Empty; } } if (op == 18 && ExpressionNode.IsInteger(precedenceType)) { return StorageType.Double; } if (IsMixed(left, right)) { if (lc && !rc) { return right; } if (!lc && rc) { return left; } if (ExpressionNode.IsUnsigned(precedenceType)) { if (dataTypePrecedence >= DataTypePrecedence.UInt64) { throw ExprException.AmbiguousBinop(op, DataStorage.GetTypeStorage(left), DataStorage.GetTypeStorage(right)); } precedenceType = GetPrecedenceType(dataTypePrecedence + 1); } } return precedenceType; } internal StorageType ResultSqlType(StorageType left, StorageType right, bool lc, bool rc, int op) { int precedence = (int)GetPrecedence(left); if (precedence == 0) { return StorageType.Empty; } int precedence2 = (int)GetPrecedence(right); if (precedence2 == 0) { return StorageType.Empty; } if (Operators.IsLogical(op)) { if ((left != StorageType.Boolean && left != StorageType.SqlBoolean) || (right != StorageType.Boolean && right != StorageType.SqlBoolean)) { return StorageType.Empty; } if (left == StorageType.Boolean && right == StorageType.Boolean) { return StorageType.Boolean; } return StorageType.SqlBoolean; } if (op == 15) { if (left == StorageType.SqlString || right == StorageType.SqlString) { return StorageType.SqlString; } if (left == StorageType.String || right == StorageType.String) { return StorageType.String; } } if ((left == StorageType.SqlBinary && right != StorageType.SqlBinary) || (left != StorageType.SqlBinary && right == StorageType.SqlBinary)) { return StorageType.Empty; } if ((left == StorageType.SqlGuid && right != StorageType.SqlGuid) || (left != StorageType.SqlGuid && right == StorageType.SqlGuid)) { return StorageType.Empty; } if (precedence > 19 && precedence2 < 20) { return StorageType.Empty; } if (precedence < 20 && precedence2 > 19) { return StorageType.Empty; } if (precedence > 19) { if (op == 15 || op == 16) { if (left == StorageType.TimeSpan) { return right; } if (right == StorageType.TimeSpan) { return left; } return StorageType.Empty; } if (!Operators.IsRelational(op)) { return StorageType.Empty; } return left; } DataTypePrecedence dataTypePrecedence = (DataTypePrecedence)Math.Max(precedence, precedence2); StorageType precedenceType = GetPrecedenceType(dataTypePrecedence); precedenceType = GetPrecedenceType((DataTypePrecedence)SqlResultType((int)dataTypePrecedence)); if (Operators.IsArithmetical(op) && precedenceType != StorageType.String && precedenceType != StorageType.Char && precedenceType != StorageType.SqlString) { if (!ExpressionNode.IsNumericSql(left)) { return StorageType.Empty; } if (!ExpressionNode.IsNumericSql(right)) { return StorageType.Empty; } } if (op == 18 && ExpressionNode.IsIntegerSql(precedenceType)) { return StorageType.SqlDouble; } if (precedenceType == StorageType.SqlMoney && left != StorageType.SqlMoney && right != StorageType.SqlMoney) { precedenceType = StorageType.SqlDecimal; } if (IsMixedSql(left, right) && ExpressionNode.IsUnsignedSql(precedenceType)) { if (dataTypePrecedence >= DataTypePrecedence.UInt64) { throw ExprException.AmbiguousBinop(op, DataStorage.GetTypeStorage(left), DataStorage.GetTypeStorage(right)); } precedenceType = GetPrecedenceType(dataTypePrecedence + 1); } return precedenceType; } private int SqlResultType(int typeCode) { switch (typeCode) { case 23: return 24; case 20: return 21; case 18: return 19; case 16: return 17; case 14: return 15; case 12: return 13; case 9: case 10: return 11; case 6: case 7: return 8; case 3: case 4: return 5; case 1: return 2; case -2: return -1; case -5: return -4; case -8: return -7; default: return typeCode; } } } internal sealed class LikeNode : BinaryNode { internal const int match_left = 1; internal const int match_right = 2; internal const int match_middle = 3; internal const int match_exact = 4; internal const int match_all = 5; private int _kind; private string _pattern; internal LikeNode(DataTable table, int op, ExpressionNode left, ExpressionNode right) : base(table, op, left, right) { } internal override object Eval(DataRow row, DataRowVersion version) { object obj = _left.Eval(row, version); if (obj == DBNull.Value || (_left.IsSqlColumn && DataStorage.IsObjectSqlNull(obj))) { return DBNull.Value; } string text; if (_pattern == null) { object obj2 = _right.Eval(row, version); if (!(obj2 is string) && !(obj2 is SqlString)) { SetTypeMismatchError(_op, obj.GetType(), obj2.GetType()); } if (obj2 == DBNull.Value || DataStorage.IsObjectSqlNull(obj2)) { return DBNull.Value; } string pat = (string)SqlConvert.ChangeType2(obj2, StorageType.String, typeof(string), base.FormatProvider); text = AnalyzePattern(pat); if (_right.IsConstant()) { _pattern = text; } } else { text = _pattern; } if (!(obj is string) && !(obj is SqlString)) { SetTypeMismatchError(_op, obj.GetType(), typeof(string)); } char[] trimChars = new char[2] { ' ', '\u3000' }; string text2 = ((!(obj is SqlString sqlString)) ? ((string)obj) : sqlString.Value); string s = text2.TrimEnd(trimChars); switch (_kind) { case 5: return true; case 4: return base.table.Compare(s, text) == 0; case 3: return 0 <= base.table.IndexOf(s, text); case 1: return base.table.IndexOf(s, text) == 0; case 2: { string s2 = text.TrimEnd(trimChars); return base.table.IsSuffix(s, s2); } default: return DBNull.Value; } } internal string AnalyzePattern(string pat) { int length = pat.Length; char[] array = new char[length + 1]; pat.CopyTo(0, array, 0, length); array[length] = '\0'; char[] array2 = new char[length + 1]; int num = 0; int num2 = 0; int i = 0; while (i < length) { if (array[i] == '*' || array[i] == '%') { for (; (array[i] == '*' || array[i] == '%') && i < length; i++) { } if ((i < length && num > 0) || num2 >= 2) { throw ExprException.InvalidPattern(pat); } num2++; } else if (array[i] == '[') { i++; if (i >= length) { throw ExprException.InvalidPattern(pat); } array2[num++] = array[i++]; if (i >= length) { throw ExprException.InvalidPattern(pat); } if (array[i] != ']') { throw ExprException.InvalidPattern(pat); } i++; } else { array2[num++] = array[i]; i++; } } string result = new string(array2, 0, num); if (num2 == 0) { _kind = 4; return result; } if (num > 0) { if (array[0] == '*' || array[0] == '%') { if (array[length - 1] == '*' || array[length - 1] == '%') { _kind = 3; return result; } _kind = 2; return result; } _kind = 1; return result; } _kind = 5; return result; } } internal sealed class ConstNode : ExpressionNode { internal readonly object _val; internal ConstNode(DataTable table, ValueType type, object constant) : this(table, type, constant, fParseQuotes: true) { } internal ConstNode(DataTable table, ValueType type, object constant, bool fParseQuotes) : base(table) { switch (type) { case ValueType.Null: _val = DBNull.Value; break; case ValueType.Numeric: _val = SmallestNumeric(constant); break; case ValueType.Decimal: _val = SmallestDecimal(constant); break; case ValueType.Float: _val = Convert.ToDouble(constant, NumberFormatInfo.InvariantInfo); break; case ValueType.Bool: _val = Convert.ToBoolean(constant, CultureInfo.InvariantCulture); break; case ValueType.Str: if (fParseQuotes) { _val = ((string)constant).Replace("''", "'"); } else { _val = (string)constant; } break; case ValueType.Date: _val = DateTime.Parse((string)constant, CultureInfo.InvariantCulture); break; default: _val = constant; break; } } internal override void Bind(DataTable table, List list) { BindTable(table); } internal override object Eval() { return _val; } internal override object Eval(DataRow row, DataRowVersion version) { return Eval(); } internal override object Eval(int[] recordNos) { return Eval(); } internal override bool IsConstant() { return true; } internal override bool IsTableConstant() { return true; } internal override bool HasLocalAggregate() { return false; } internal override bool HasRemoteAggregate() { return false; } internal override ExpressionNode Optimize() { return this; } private object SmallestDecimal(object constant) { if (constant == null) { return 0.0; } if (constant is string s) { if (decimal.TryParse(s, NumberStyles.Number, NumberFormatInfo.InvariantInfo, out var result)) { return result; } if (double.TryParse(s, NumberStyles.Float | NumberStyles.AllowThousands, NumberFormatInfo.InvariantInfo, out var result2)) { return result2; } } else if (constant is IConvertible convertible) { try { return convertible.ToDecimal(NumberFormatInfo.InvariantInfo); } catch (ArgumentException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); } catch (FormatException e2) { ExceptionBuilder.TraceExceptionWithoutRethrow(e2); } catch (InvalidCastException e3) { ExceptionBuilder.TraceExceptionWithoutRethrow(e3); } catch (OverflowException e4) { ExceptionBuilder.TraceExceptionWithoutRethrow(e4); } try { return convertible.ToDouble(NumberFormatInfo.InvariantInfo); } catch (ArgumentException e5) { ExceptionBuilder.TraceExceptionWithoutRethrow(e5); } catch (FormatException e6) { ExceptionBuilder.TraceExceptionWithoutRethrow(e6); } catch (InvalidCastException e7) { ExceptionBuilder.TraceExceptionWithoutRethrow(e7); } catch (OverflowException e8) { ExceptionBuilder.TraceExceptionWithoutRethrow(e8); } } return constant; } private object SmallestNumeric(object constant) { if (constant == null) { return 0; } if (constant is string s) { if (int.TryParse(s, NumberStyles.Integer, NumberFormatInfo.InvariantInfo, out var result)) { return result; } if (long.TryParse(s, NumberStyles.Integer, NumberFormatInfo.InvariantInfo, out var result2)) { return result2; } if (double.TryParse(s, NumberStyles.Float | NumberStyles.AllowThousands, NumberFormatInfo.InvariantInfo, out var result3)) { return result3; } } else if (constant is IConvertible convertible) { try { return convertible.ToInt32(NumberFormatInfo.InvariantInfo); } catch (ArgumentException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); } catch (FormatException e2) { ExceptionBuilder.TraceExceptionWithoutRethrow(e2); } catch (InvalidCastException e3) { ExceptionBuilder.TraceExceptionWithoutRethrow(e3); } catch (OverflowException e4) { ExceptionBuilder.TraceExceptionWithoutRethrow(e4); } try { return convertible.ToInt64(NumberFormatInfo.InvariantInfo); } catch (ArgumentException e5) { ExceptionBuilder.TraceExceptionWithoutRethrow(e5); } catch (FormatException e6) { ExceptionBuilder.TraceExceptionWithoutRethrow(e6); } catch (InvalidCastException e7) { ExceptionBuilder.TraceExceptionWithoutRethrow(e7); } catch (OverflowException e8) { ExceptionBuilder.TraceExceptionWithoutRethrow(e8); } try { return convertible.ToDouble(NumberFormatInfo.InvariantInfo); } catch (ArgumentException e9) { ExceptionBuilder.TraceExceptionWithoutRethrow(e9); } catch (FormatException e10) { ExceptionBuilder.TraceExceptionWithoutRethrow(e10); } catch (InvalidCastException e11) { ExceptionBuilder.TraceExceptionWithoutRethrow(e11); } catch (OverflowException e12) { ExceptionBuilder.TraceExceptionWithoutRethrow(e12); } } return constant; } } internal sealed class DataExpression : IFilter { internal string _originalExpression; private bool _parsed; private bool _bound; private ExpressionNode _expr; private DataTable _table; private readonly StorageType _storageType; private readonly Type _dataType; private DataColumn[] _dependency = Array.Empty(); internal string Expression { get { if (_originalExpression == null) { return ""; } return _originalExpression; } } internal ExpressionNode ExpressionNode => _expr; internal bool HasValue => _expr != null; internal DataExpression(DataTable table, string expression) : this(table, expression, null) { } internal DataExpression(DataTable table, string expression, Type type) { ExpressionParser expressionParser = new ExpressionParser(table); expressionParser.LoadExpression(expression); _originalExpression = expression; _expr = null; if (expression != null) { _storageType = DataStorage.GetStorageType(type); if (_storageType == StorageType.BigInteger) { throw ExprException.UnsupportedDataType(type); } _dataType = type; _expr = expressionParser.Parse(); _parsed = true; if (_expr != null && table != null) { Bind(table); } else { _bound = false; } } } internal void Bind(DataTable table) { _table = table; if (table != null && _expr != null) { List list = new List(); _expr.Bind(table, list); _expr = _expr.Optimize(); _table = table; _bound = true; _dependency = list.ToArray(); } } internal bool DependsOn(DataColumn column) { if (_expr != null) { return _expr.DependsOn(column); } return false; } internal object Evaluate() { return Evaluate((DataRow)null, DataRowVersion.Default); } internal object Evaluate(DataRow row, DataRowVersion version) { if (!_bound) { Bind(_table); } object obj; if (_expr != null) { obj = _expr.Eval(row, version); if (obj != DBNull.Value || StorageType.Uri < _storageType) { try { if (StorageType.Object != _storageType) { obj = SqlConvert.ChangeType2(obj, _storageType, _dataType, _table.FormatProvider); } } catch (Exception ex) when (ADP.IsCatchableExceptionType(ex)) { ExceptionBuilder.TraceExceptionForCapture(ex); throw ExprException.DatavalueConvertion(obj, _dataType, ex); } } } else { obj = null; } return obj; } internal object Evaluate(DataRow[] rows) { return Evaluate(rows, DataRowVersion.Default); } internal object Evaluate(DataRow[] rows, DataRowVersion version) { if (!_bound) { Bind(_table); } if (_expr != null) { List list = new List(); foreach (DataRow dataRow in rows) { if (dataRow.RowState != DataRowState.Deleted && (version != DataRowVersion.Original || dataRow._oldRecord != -1)) { list.Add(dataRow.GetRecordFromVersion(version)); } } int[] recordNos = list.ToArray(); return _expr.Eval(recordNos); } return DBNull.Value; } public bool Invoke(DataRow row, DataRowVersion version) { if (_expr == null) { return true; } if (row == null) { throw ExprException.InvokeArgument(); } object value = _expr.Eval(row, version); try { return ToBoolean(value); } catch (EvaluateException) { throw ExprException.FilterConvertion(Expression); } } internal DataColumn[] GetDependency() { return _dependency; } internal bool IsTableAggregate() { if (_expr != null) { return _expr.IsTableConstant(); } return false; } internal static bool IsUnknown(object value) { return DataStorage.IsObjectNull(value); } internal bool HasLocalAggregate() { if (_expr != null) { return _expr.HasLocalAggregate(); } return false; } internal bool HasRemoteAggregate() { if (_expr != null) { return _expr.HasRemoteAggregate(); } return false; } internal static bool ToBoolean(object value) { if (IsUnknown(value)) { return false; } if (value is bool) { return (bool)value; } if (value is SqlBoolean sqlBoolean) { return sqlBoolean.IsTrue; } if (value is string) { try { return bool.Parse((string)value); } catch (Exception ex) when (ADP.IsCatchableExceptionType(ex)) { ExceptionBuilder.TraceExceptionForCapture(ex); throw ExprException.DatavalueConvertion(value, typeof(bool), ex); } } throw ExprException.DatavalueConvertion(value, typeof(bool), null); } } internal abstract class ExpressionNode { private DataTable _table; internal IFormatProvider FormatProvider { get { if (_table == null) { return CultureInfo.CurrentCulture; } return _table.FormatProvider; } } internal virtual bool IsSqlColumn => false; protected DataTable table => _table; protected ExpressionNode(DataTable table) { _table = table; } protected void BindTable(DataTable table) { _table = table; } internal abstract void Bind(DataTable table, List list); internal abstract object Eval(); internal abstract object Eval(DataRow row, DataRowVersion version); internal abstract object Eval(int[] recordNos); internal abstract bool IsConstant(); internal abstract bool IsTableConstant(); internal abstract bool HasLocalAggregate(); internal abstract bool HasRemoteAggregate(); internal abstract ExpressionNode Optimize(); internal virtual bool DependsOn(DataColumn column) { return false; } internal static bool IsInteger(StorageType type) { if (type != StorageType.Int16 && type != StorageType.Int32 && type != StorageType.Int64 && type != StorageType.UInt16 && type != StorageType.UInt32 && type != StorageType.UInt64 && type != StorageType.SByte) { return type == StorageType.Byte; } return true; } internal static bool IsIntegerSql(StorageType type) { if (type != StorageType.Int16 && type != StorageType.Int32 && type != StorageType.Int64 && type != StorageType.UInt16 && type != StorageType.UInt32 && type != StorageType.UInt64 && type != StorageType.SByte && type != StorageType.Byte && type != StorageType.SqlInt64 && type != StorageType.SqlInt32 && type != StorageType.SqlInt16) { return type == StorageType.SqlByte; } return true; } internal static bool IsSigned(StorageType type) { if (type != StorageType.Int16 && type != StorageType.Int32 && type != StorageType.Int64 && type != StorageType.SByte) { return IsFloat(type); } return true; } internal static bool IsSignedSql(StorageType type) { if (type != StorageType.Int16 && type != StorageType.Int32 && type != StorageType.Int64 && type != StorageType.SByte && type != StorageType.SqlInt64 && type != StorageType.SqlInt32 && type != StorageType.SqlInt16) { return IsFloatSql(type); } return true; } internal static bool IsUnsigned(StorageType type) { if (type != StorageType.UInt16 && type != StorageType.UInt32 && type != StorageType.UInt64) { return type == StorageType.Byte; } return true; } internal static bool IsUnsignedSql(StorageType type) { if (type != StorageType.UInt16 && type != StorageType.UInt32 && type != StorageType.UInt64 && type != StorageType.SqlByte) { return type == StorageType.Byte; } return true; } internal static bool IsNumeric(StorageType type) { if (!IsFloat(type)) { return IsInteger(type); } return true; } internal static bool IsNumericSql(StorageType type) { if (!IsFloatSql(type)) { return IsIntegerSql(type); } return true; } internal static bool IsFloat(StorageType type) { if (type != StorageType.Single && type != StorageType.Double) { return type == StorageType.Decimal; } return true; } internal static bool IsFloatSql(StorageType type) { if (type != StorageType.Single && type != StorageType.Double && type != StorageType.Decimal && type != StorageType.SqlDouble && type != StorageType.SqlDecimal && type != StorageType.SqlMoney) { return type == StorageType.SqlSingle; } return true; } } internal enum ValueType { Unknown = -1, Null, Bool, Numeric, Str, Float, Decimal, Object, Date } internal enum Nodes { Noop, Unop, UnopSpec, Binop, BinopSpec, Zop, Call, Const, Name, Paren, Conv } internal sealed class ExpressionParser { private struct ReservedWords { internal readonly string _word; internal readonly Tokens _token; internal readonly int _op; internal ReservedWords(string word, Tokens token, int op) { _word = word; _token = token; _op = op; } } private const int Empty = 0; private const int Scalar = 1; private const int Expr = 2; private static readonly ReservedWords[] s_reservedwords = new ReservedWords[12] { new ReservedWords("And", Tokens.BinaryOp, 26), new ReservedWords("Between", Tokens.BinaryOp, 6), new ReservedWords("Child", Tokens.Child, 0), new ReservedWords("False", Tokens.ZeroOp, 34), new ReservedWords("In", Tokens.BinaryOp, 5), new ReservedWords("Is", Tokens.BinaryOp, 13), new ReservedWords("Like", Tokens.BinaryOp, 14), new ReservedWords("Not", Tokens.UnaryOp, 3), new ReservedWords("Null", Tokens.ZeroOp, 32), new ReservedWords("Or", Tokens.BinaryOp, 27), new ReservedWords("Parent", Tokens.Parent, 0), new ReservedWords("True", Tokens.ZeroOp, 33) }; private char _escape = '\\'; private char _decimalSeparator = '.'; private char _listSeparator = ','; private char _exponentL = 'e'; private char _exponentU = 'E'; internal char[] _text; internal int _pos; internal int _start; internal Tokens _token; internal int _op; internal OperatorInfo[] _ops = new OperatorInfo[100]; internal int _topOperator; internal int _topNode; private readonly DataTable _table; private const int MaxPredicates = 100; internal ExpressionNode[] _nodeStack = new ExpressionNode[100]; internal int _prevOperand; internal ExpressionNode _expression; internal ExpressionParser(DataTable table) { _table = table; } internal void LoadExpression(string data) { int num; if (data == null) { num = 0; _text = new char[num + 1]; } else { num = data.Length; _text = new char[num + 1]; data.CopyTo(0, _text, 0, num); } _text[num] = '\0'; if (_expression != null) { _expression = null; } } internal void StartScan() { _op = 0; _pos = 0; _start = 0; _topOperator = 0; _ops[_topOperator++] = new OperatorInfo(Nodes.Noop, 0, 0); } internal ExpressionNode Parse() { _expression = null; StartScan(); int num = 0; while (_token != Tokens.EOS) { while (true) { Scan(); switch (_token) { case Tokens.EOS: break; case Tokens.Name: case Tokens.Numeric: case Tokens.Decimal: case Tokens.Float: case Tokens.StringConst: case Tokens.Date: case Tokens.Parent: { ExpressionNode node = null; string text = null; if (_prevOperand != 0) { throw ExprException.MissingOperator(new string(_text, _start, _pos - _start)); } if (_topOperator > 0) { OperatorInfo operatorInfo = _ops[_topOperator - 1]; if (operatorInfo._type == Nodes.Binop && operatorInfo._op == 5 && _token != Tokens.Parent) { throw ExprException.InWithoutParentheses(); } } _prevOperand = 1; switch (_token) { case Tokens.Parent: { string relationName; try { Scan(); if (_token == Tokens.LeftParen) { ScanToken(Tokens.Name); relationName = NameNode.ParseName(_text, _start, _pos); ScanToken(Tokens.RightParen); ScanToken(Tokens.Dot); } else { relationName = null; CheckToken(Tokens.Dot); } } catch (Exception e) when (ADP.IsCatchableExceptionType(e)) { throw ExprException.LookupArgument(); } ScanToken(Tokens.Name); string columnName = NameNode.ParseName(_text, _start, _pos); OperatorInfo operatorInfo = _ops[_topOperator - 1]; node = new LookupNode(_table, columnName, relationName); break; } case Tokens.Name: { OperatorInfo operatorInfo = _ops[_topOperator - 1]; node = new NameNode(_table, _text, _start, _pos); break; } case Tokens.Numeric: text = new string(_text, _start, _pos - _start); node = new ConstNode(_table, ValueType.Numeric, text); break; case Tokens.Decimal: text = new string(_text, _start, _pos - _start); node = new ConstNode(_table, ValueType.Decimal, text); break; case Tokens.Float: text = new string(_text, _start, _pos - _start); node = new ConstNode(_table, ValueType.Float, text); break; case Tokens.StringConst: text = new string(_text, _start + 1, _pos - _start - 2); node = new ConstNode(_table, ValueType.Str, text); break; case Tokens.Date: text = new string(_text, _start + 1, _pos - _start - 2); node = new ConstNode(_table, ValueType.Date, text); break; } NodePush(node); continue; } case Tokens.LeftParen: { num++; ExpressionNode node; if (_prevOperand == 0) { OperatorInfo operatorInfo = _ops[_topOperator - 1]; if (operatorInfo._type == Nodes.Binop && operatorInfo._op == 5) { node = new FunctionNode(_table, "In"); NodePush(node); _ops[_topOperator++] = new OperatorInfo(Nodes.Call, 0, 2); } else { _ops[_topOperator++] = new OperatorInfo(Nodes.Paren, 0, 2); } continue; } BuildExpression(22); _prevOperand = 0; ExpressionNode expressionNode2 = NodePeek(); if (expressionNode2 == null || expressionNode2.GetType() != typeof(NameNode)) { throw ExprException.SyntaxError(); } NameNode nameNode = (NameNode)NodePop(); node = new FunctionNode(_table, nameNode._name); Aggregate aggregate = (Aggregate)((FunctionNode)node).Aggregate; if (aggregate != Aggregate.None) { node = ParseAggregateArgument((FunctionId)aggregate); NodePush(node); _prevOperand = 2; } else { NodePush(node); _ops[_topOperator++] = new OperatorInfo(Nodes.Call, 0, 2); } continue; } case Tokens.RightParen: { if (_prevOperand != 0) { BuildExpression(3); } if (_topOperator <= 1) { throw ExprException.TooManyRightParentheses(); } _topOperator--; OperatorInfo operatorInfo = _ops[_topOperator]; if (_prevOperand == 0 && operatorInfo._type != Nodes.Call) { throw ExprException.MissingOperand(operatorInfo); } if (operatorInfo._type == Nodes.Call) { if (_prevOperand != 0) { ExpressionNode argument2 = NodePop(); FunctionNode functionNode2 = (FunctionNode)NodePop(); functionNode2.AddArgument(argument2); functionNode2.Check(); NodePush(functionNode2); } } else { ExpressionNode node = NodePop(); node = new UnaryNode(_table, 0, node); NodePush(node); } _prevOperand = 2; num--; continue; } case Tokens.ListSeparator: { if (_prevOperand == 0) { throw ExprException.MissingOperandBefore(","); } BuildExpression(3); OperatorInfo operatorInfo = _ops[_topOperator - 1]; if (operatorInfo._type != Nodes.Call) { throw ExprException.SyntaxError(); } ExpressionNode argument = NodePop(); FunctionNode functionNode = (FunctionNode)NodePop(); functionNode.AddArgument(argument); NodePush(functionNode); _prevOperand = 0; continue; } case Tokens.BinaryOp: if (_prevOperand == 0) { if (_op == 15) { _op = 2; } else { if (_op != 16) { throw ExprException.MissingOperandBefore(Operators.ToString(_op)); } _op = 1; } goto case Tokens.UnaryOp; } _prevOperand = 0; BuildExpression(Operators.Priority(_op)); _ops[_topOperator++] = new OperatorInfo(Nodes.Binop, _op, Operators.Priority(_op)); continue; case Tokens.UnaryOp: _ops[_topOperator++] = new OperatorInfo(Nodes.Unop, _op, Operators.Priority(_op)); continue; case Tokens.ZeroOp: if (_prevOperand != 0) { throw ExprException.MissingOperator(new string(_text, _start, _pos - _start)); } _ops[_topOperator++] = new OperatorInfo(Nodes.Zop, _op, 24); _prevOperand = 2; continue; case Tokens.Dot: { ExpressionNode expressionNode = NodePeek(); if (expressionNode != null && expressionNode.GetType() == typeof(NameNode)) { Scan(); if (_token == Tokens.Name) { string name = ((NameNode)NodePop())._name + "." + NameNode.ParseName(_text, _start, _pos); NodePush(new NameNode(_table, name)); continue; } } goto default; } default: throw ExprException.UnknownToken(new string(_text, _start, _pos - _start), _start + 1); } break; } if (_prevOperand == 0) { if (_topNode != 0) { OperatorInfo operatorInfo = _ops[_topOperator - 1]; throw ExprException.MissingOperand(operatorInfo); } } else { BuildExpression(3); if (_topOperator != 1) { throw ExprException.MissingRightParen(); } } } _expression = _nodeStack[0]; return _expression; } private ExpressionNode ParseAggregateArgument(FunctionId aggregate) { Scan(); bool flag; string relationName; string columnName; try { if (_token != Tokens.Child) { if (_token != Tokens.Name) { throw ExprException.AggregateArgument(); } columnName = NameNode.ParseName(_text, _start, _pos); ScanToken(Tokens.RightParen); return new AggregateNode(_table, aggregate, columnName); } flag = _token == Tokens.Child; _prevOperand = 1; Scan(); if (_token == Tokens.LeftParen) { ScanToken(Tokens.Name); relationName = NameNode.ParseName(_text, _start, _pos); ScanToken(Tokens.RightParen); ScanToken(Tokens.Dot); } else { relationName = null; CheckToken(Tokens.Dot); } ScanToken(Tokens.Name); columnName = NameNode.ParseName(_text, _start, _pos); ScanToken(Tokens.RightParen); } catch (Exception e) when (ADP.IsCatchableExceptionType(e)) { throw ExprException.AggregateArgument(); } return new AggregateNode(_table, aggregate, columnName, !flag, relationName); } private ExpressionNode NodePop() { return _nodeStack[--_topNode]; } private ExpressionNode NodePeek() { if (_topNode <= 0) { return null; } return _nodeStack[_topNode - 1]; } private void NodePush(ExpressionNode node) { if (_topNode >= 98) { throw ExprException.ExpressionTooComplex(); } _nodeStack[_topNode++] = node; } private void BuildExpression(int pri) { ExpressionNode expressionNode = null; while (true) { OperatorInfo operatorInfo = _ops[_topOperator - 1]; if (operatorInfo._priority < pri) { break; } _topOperator--; switch (operatorInfo._type) { default: return; case Nodes.Binop: { ExpressionNode right = NodePop(); ExpressionNode expressionNode2 = NodePop(); switch (operatorInfo._op) { case 4: case 6: case 22: case 23: case 24: case 25: throw ExprException.UnsupportedOperator(operatorInfo._op); default: expressionNode = ((operatorInfo._op != 14) ? new BinaryNode(_table, operatorInfo._op, expressionNode2, right) : new LikeNode(_table, operatorInfo._op, expressionNode2, right)); break; } break; } case Nodes.Unop: { ExpressionNode expressionNode2 = null; ExpressionNode right = NodePop(); int op = operatorInfo._op; if (op != 1 && op != 3 && op == 25) { throw ExprException.UnsupportedOperator(operatorInfo._op); } expressionNode = new UnaryNode(_table, operatorInfo._op, right); break; } case Nodes.Zop: expressionNode = new ZeroOpNode(operatorInfo._op); break; case Nodes.UnopSpec: case Nodes.BinopSpec: return; } NodePush(expressionNode); } } internal void CheckToken(Tokens token) { if (_token != token) { throw ExprException.UnknownToken(token, _token, _pos); } } internal Tokens Scan() { char[] text = _text; _token = Tokens.None; while (true) { _start = _pos; _op = 0; char c = text[_pos++]; switch (c) { case '\0': _token = Tokens.EOS; break; case '\t': case '\n': case '\r': case ' ': goto IL_0111; case '(': _token = Tokens.LeftParen; break; case ')': _token = Tokens.RightParen; break; case '#': ScanDate(); CheckToken(Tokens.Date); break; case '\'': ScanString('\''); CheckToken(Tokens.StringConst); break; case '=': _token = Tokens.BinaryOp; _op = 7; break; case '>': _token = Tokens.BinaryOp; ScanWhite(); if (text[_pos] == '=') { _pos++; _op = 10; } else { _op = 8; } break; case '<': _token = Tokens.BinaryOp; ScanWhite(); if (text[_pos] == '=') { _pos++; _op = 11; } else if (text[_pos] == '>') { _pos++; _op = 12; } else { _op = 9; } break; case '+': _token = Tokens.BinaryOp; _op = 15; break; case '-': _token = Tokens.BinaryOp; _op = 16; break; case '*': _token = Tokens.BinaryOp; _op = 17; break; case '/': _token = Tokens.BinaryOp; _op = 18; break; case '%': _token = Tokens.BinaryOp; _op = 20; break; case '&': _token = Tokens.BinaryOp; _op = 22; break; case '|': _token = Tokens.BinaryOp; _op = 23; break; case '^': _token = Tokens.BinaryOp; _op = 24; break; case '~': _token = Tokens.BinaryOp; _op = 25; break; case '[': ScanName(']', _escape, "]\\"); CheckToken(Tokens.Name); break; case '`': ScanName('`', '`', "`"); CheckToken(Tokens.Name); break; default: if (c == _listSeparator) { _token = Tokens.ListSeparator; break; } if (c == '.') { if (_prevOperand == 0) { ScanNumeric(); } else { _token = Tokens.Dot; } break; } if (c == '0' && (text[_pos] == 'x' || text[_pos] == 'X')) { ScanBinaryConstant(); _token = Tokens.BinaryConst; break; } if (IsDigit(c)) { ScanNumeric(); break; } ScanReserved(); if (_token != 0) { break; } if (IsAlphaNumeric(c)) { ScanName(); if (_token != 0) { CheckToken(Tokens.Name); break; } } _token = Tokens.Unknown; throw ExprException.UnknownToken(new string(text, _start, _pos - _start), _start + 1); } break; IL_0111: ScanWhite(); } return _token; } private void ScanNumeric() { char[] text = _text; bool flag = false; bool flag2 = false; while (IsDigit(text[_pos])) { _pos++; } if (text[_pos] == _decimalSeparator) { flag = true; _pos++; } while (IsDigit(text[_pos])) { _pos++; } if (text[_pos] == _exponentL || text[_pos] == _exponentU) { flag2 = true; _pos++; if (text[_pos] == '-' || text[_pos] == '+') { _pos++; } while (IsDigit(text[_pos])) { _pos++; } } if (flag2) { _token = Tokens.Float; } else if (flag) { _token = Tokens.Decimal; } else { _token = Tokens.Numeric; } } private void ScanName() { char[] text = _text; while (IsAlphaNumeric(text[_pos])) { _pos++; } _token = Tokens.Name; } private void ScanName(char chEnd, char esc, string charsToEscape) { char[] text = _text; do { if (text[_pos] == esc && _pos + 1 < text.Length && charsToEscape.IndexOf(text[_pos + 1]) >= 0) { _pos++; } _pos++; } while (_pos < text.Length && text[_pos] != chEnd); if (_pos >= text.Length) { throw ExprException.InvalidNameBracketing(new string(text, _start, _pos - 1 - _start)); } _pos++; _token = Tokens.Name; } private void ScanDate() { char[] text = _text; do { _pos++; } while (_pos < text.Length && text[_pos] != '#'); if (_pos >= text.Length || text[_pos] != '#') { if (_pos >= text.Length) { throw ExprException.InvalidDate(new string(text, _start, _pos - 1 - _start)); } throw ExprException.InvalidDate(new string(text, _start, _pos - _start)); } _token = Tokens.Date; _pos++; } private void ScanBinaryConstant() { _ = _text; } private void ScanReserved() { char[] text = _text; if (!IsAlpha(text[_pos])) { return; } ScanName(); string @string = new string(text, _start, _pos - _start); CompareInfo compareInfo = CultureInfo.InvariantCulture.CompareInfo; int num = 0; int num2 = s_reservedwords.Length - 1; do { int num3 = (num + num2) / 2; int num4 = compareInfo.Compare(s_reservedwords[num3]._word, @string, CompareOptions.IgnoreCase); if (num4 == 0) { _token = s_reservedwords[num3]._token; _op = s_reservedwords[num3]._op; break; } if (num4 < 0) { num = num3 + 1; } else { num2 = num3 - 1; } } while (num <= num2); } private void ScanString(char escape) { char[] text = _text; while (_pos < text.Length) { char c = text[_pos++]; if (c == escape && _pos < text.Length && text[_pos] == escape) { _pos++; } else if (c == escape) { break; } } if (_pos >= text.Length) { throw ExprException.InvalidString(new string(text, _start, _pos - 1 - _start)); } _token = Tokens.StringConst; } internal void ScanToken(Tokens token) { Scan(); CheckToken(token); } private void ScanWhite() { char[] text = _text; while (_pos < text.Length && IsWhiteSpace(text[_pos])) { _pos++; } } private bool IsWhiteSpace(char ch) { if (ch <= ' ') { return ch != '\0'; } return false; } private bool IsAlphaNumeric(char ch) { switch (ch) { case '$': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': return true; default: if (ch > '\u007f') { return true; } return false; } } private bool IsDigit(char ch) { switch (ch) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return true; default: return false; } } private bool IsAlpha(char ch) { switch (ch) { case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': return true; default: return false; } } } internal enum Tokens { None, Name, Numeric, Decimal, Float, BinaryConst, StringConst, Date, ListSeparator, LeftParen, RightParen, ZeroOp, UnaryOp, BinaryOp, Child, Parent, Dot, Unknown, EOS } internal sealed class OperatorInfo { internal Nodes _type; internal int _op; internal int _priority; internal OperatorInfo(Nodes type, int op, int pri) { _type = type; _op = op; _priority = pri; } } [Serializable] public class InvalidExpressionException : DataException { protected InvalidExpressionException(SerializationInfo info, StreamingContext context) : base(info, context) { throw new PlatformNotSupportedException(); } public InvalidExpressionException() { } public InvalidExpressionException(string s) : base(s) { } public InvalidExpressionException(string message, Exception innerException) : base(message, innerException) { } } [Serializable] public class EvaluateException : InvalidExpressionException { protected EvaluateException(SerializationInfo info, StreamingContext context) : base(info, context) { throw new PlatformNotSupportedException(); } public EvaluateException() { } public EvaluateException(string s) : base(s) { } public EvaluateException(string message, Exception innerException) : base(message, innerException) { } } [Serializable] public class SyntaxErrorException : InvalidExpressionException { protected SyntaxErrorException(SerializationInfo info, StreamingContext context) : base(info, context) { throw new PlatformNotSupportedException(); } public SyntaxErrorException() { } public SyntaxErrorException(string s) : base(s) { } public SyntaxErrorException(string message, Exception innerException) : base(message, innerException) { } } internal sealed class ExprException { private ExprException() { } private static OverflowException _Overflow(string error) { OverflowException ex = new OverflowException(error); ExceptionBuilder.TraceExceptionAsReturnValue(ex); return ex; } private static InvalidExpressionException _Expr(string error) { InvalidExpressionException ex = new InvalidExpressionException(error); ExceptionBuilder.TraceExceptionAsReturnValue(ex); return ex; } private static SyntaxErrorException _Syntax(string error) { SyntaxErrorException ex = new SyntaxErrorException(error); ExceptionBuilder.TraceExceptionAsReturnValue(ex); return ex; } private static EvaluateException _Eval(string error) { EvaluateException ex = new EvaluateException(error); ExceptionBuilder.TraceExceptionAsReturnValue(ex); return ex; } private static EvaluateException _Eval(string error, Exception innerException) { EvaluateException ex = new EvaluateException(error); ExceptionBuilder.TraceExceptionAsReturnValue(ex); return ex; } public static Exception InvokeArgument() { return ExceptionBuilder._Argument("Need a row or a table to Invoke DataFilter."); } public static Exception NYI(string moreinfo) { return _Expr(SR.Format("The feature not implemented. {0}.", moreinfo)); } public static Exception MissingOperand(OperatorInfo before) { return _Syntax(SR.Format("Syntax error: Missing operand after '{0}' operator.", Operators.ToString(before._op))); } public static Exception MissingOperator(string token) { return _Syntax(SR.Format("Syntax error: Missing operand after '{0}' operator.", token)); } public static Exception TypeMismatch(string expr) { return _Eval(SR.Format("Type mismatch in expression '{0}'.", expr)); } public static Exception FunctionArgumentOutOfRange(string arg, string func) { return ExceptionBuilder._ArgumentOutOfRange(arg, SR.Format("{0}() argument is out of range.", func)); } public static Exception ExpressionTooComplex() { return _Eval("Expression is too complex."); } public static Exception UnboundName(string name) { return _Eval(SR.Format("Cannot find column [{0}].", name)); } public static Exception InvalidString(string str) { return _Syntax(SR.Format("The expression contains an invalid string constant: {0}.", str)); } public static Exception UndefinedFunction(string name) { return _Eval(SR.Format("The expression contains undefined function call {0}().", name)); } public static Exception SyntaxError() { return _Syntax("Syntax error in the expression."); } public static Exception FunctionArgumentCount(string name) { return _Eval(SR.Format("Invalid number of arguments: function {0}().", name)); } public static Exception MissingRightParen() { return _Syntax("The expression is missing the closing parenthesis."); } public static Exception UnknownToken(string token, int position) { return _Syntax(SR.Format("Cannot interpret token '{0}' at position {1}.", token, position.ToString(CultureInfo.InvariantCulture))); } public static Exception UnknownToken(Tokens tokExpected, Tokens tokCurr, int position) { return _Syntax(SR.Format("Expected {0}, but actual token at the position {2} is {1}.", tokExpected.ToString(), tokCurr.ToString(), position.ToString(CultureInfo.InvariantCulture))); } public static Exception DatatypeConvertion(Type type1, Type type2) { return _Eval(SR.Format("Cannot convert from {0} to {1}.", type1.ToString(), type2.ToString())); } public static Exception DatavalueConvertion(object value, Type type, Exception innerException) { return _Eval(SR.Format("Cannot convert value '{0}' to Type: {1}.", value.ToString(), type.ToString()), innerException); } public static Exception InvalidName(string name) { return _Syntax(SR.Format("Invalid column name [{0}].", name)); } public static Exception InvalidDate(string date) { return _Syntax(SR.Format("The expression contains invalid date constant '{0}'.", date)); } public static Exception NonConstantArgument() { return _Eval("Only constant expressions are allowed in the expression list for the IN operator."); } public static Exception InvalidPattern(string pat) { return _Eval(SR.Format("Error in Like operator: the string pattern '{0}' is invalid.", pat)); } public static Exception InWithoutParentheses() { return _Syntax("Syntax error: The items following the IN keyword must be separated by commas and be enclosed in parentheses."); } public static Exception InWithoutList() { return _Syntax("Syntax error: The IN keyword must be followed by a non-empty list of expressions separated by commas, and also must be enclosed in parentheses."); } public static Exception InvalidIsSyntax() { return _Syntax("Syntax error: Invalid usage of 'Is' operator. Correct syntax: Is [Not] Null."); } public static Exception Overflow(Type type) { return _Overflow(SR.Format("Value is either too large or too small for Type '{0}'.", type.Name)); } public static Exception ArgumentType(string function, int arg, Type type) { return _Eval(SR.Format("Type mismatch in function argument: {0}(), argument {1}, expected {2}.", function, arg.ToString(CultureInfo.InvariantCulture), type.ToString())); } public static Exception ArgumentTypeInteger(string function, int arg) { return _Eval(SR.Format("Type mismatch in function argument: {0}(), argument {1}, expected one of the Integer types.", function, arg.ToString(CultureInfo.InvariantCulture))); } public static Exception TypeMismatchInBinop(int op, Type type1, Type type2) { return _Eval(SR.Format("Cannot perform '{0}' operation on {1} and {2}.", Operators.ToString(op), type1.ToString(), type2.ToString())); } public static Exception AmbiguousBinop(int op, Type type1, Type type2) { return _Eval(SR.Format("Operator '{0}' is ambiguous on operands of type '{1}' and '{2}'. Cannot mix signed and unsigned types. Please use explicit Convert() function.", Operators.ToString(op), type1.ToString(), type2.ToString())); } public static Exception UnsupportedOperator(int op) { return _Eval(SR.Format("The expression contains unsupported operator '{0}'.", Operators.ToString(op))); } public static Exception InvalidNameBracketing(string name) { return _Syntax(SR.Format("The expression contains invalid name: '{0}'.", name)); } public static Exception MissingOperandBefore(string op) { return _Syntax(SR.Format("Syntax error: Missing operand before '{0}' operator.", op)); } public static Exception TooManyRightParentheses() { return _Syntax("The expression has too many closing parentheses."); } public static Exception UnresolvedRelation(string name, string expr) { return _Eval(SR.Format("The table [{0}] involved in more than one relation. You must explicitly mention a relation name in the expression '{1}'.", name, expr)); } internal static EvaluateException BindFailure(string relationName) { return _Eval(SR.Format("Cannot find the parent relation '{0}'.", relationName)); } public static Exception AggregateArgument() { return _Syntax("Syntax error in aggregate argument: Expecting a single column argument with possible 'Child' qualifier."); } public static Exception AggregateUnbound(string expr) { return _Eval(SR.Format("Unbound reference in the aggregate expression '{0}'.", expr)); } public static Exception EvalNoContext() { return _Eval("Cannot evaluate non-constant expression without current row."); } public static Exception ExpressionUnbound(string expr) { return _Eval(SR.Format("Unbound reference in the expression '{0}'.", expr)); } public static Exception ComputeNotAggregate(string expr) { return _Eval(SR.Format("Cannot evaluate. Expression '{0}' is not an aggregate.", expr)); } public static Exception FilterConvertion(string expr) { return _Eval(SR.Format("Filter expression '{0}' does not evaluate to a Boolean term.", expr)); } public static Exception LookupArgument() { return _Syntax("Syntax error in Lookup expression: Expecting keyword 'Parent' followed by a single column argument with possible relation qualifier: Parent[()].."); } public static Exception InvalidType(string typeName) { return _Eval(SR.Format("Invalid type name '{0}'.", typeName)); } public static Exception InvalidHoursArgument() { return _Eval("'hours' argument is out of range. Value must be between -14 and +14."); } public static Exception InvalidMinutesArgument() { return _Eval("'minutes' argument is out of range. Value must be between -59 and +59."); } public static Exception InvalidTimeZoneRange() { return _Eval("Provided range for time one exceeds total of 14 hours."); } public static Exception MismatchKindandTimeSpan() { return _Eval("Kind property of provided DateTime argument, does not match 'hours' and 'minutes' arguments."); } public static Exception UnsupportedDataType(Type type) { return ExceptionBuilder._Argument(SR.Format("A DataColumn of type '{0}' does not support expression.", type.FullName)); } } internal sealed class FunctionNode : ExpressionNode { internal readonly string _name; internal readonly int _info = -1; internal int _argumentCount; internal const int initialCapacity = 1; internal ExpressionNode[] _arguments; private static readonly Function[] s_funcs = new Function[16] { new Function("Abs", FunctionId.Abs, typeof(object), IsValidateArguments: true, IsVariantArgumentList: false, 1, typeof(object), null, null), new Function("IIf", FunctionId.Iif, typeof(object), IsValidateArguments: false, IsVariantArgumentList: false, 3, typeof(object), typeof(object), typeof(object)), new Function("In", FunctionId.In, typeof(bool), IsValidateArguments: false, IsVariantArgumentList: true, 1, null, null, null), new Function("IsNull", FunctionId.IsNull, typeof(object), IsValidateArguments: false, IsVariantArgumentList: false, 2, typeof(object), typeof(object), null), new Function("Len", FunctionId.Len, typeof(int), IsValidateArguments: true, IsVariantArgumentList: false, 1, typeof(string), null, null), new Function("Substring", FunctionId.Substring, typeof(string), IsValidateArguments: true, IsVariantArgumentList: false, 3, typeof(string), typeof(int), typeof(int)), new Function("Trim", FunctionId.Trim, typeof(string), IsValidateArguments: true, IsVariantArgumentList: false, 1, typeof(string), null, null), new Function("Convert", FunctionId.Convert, typeof(object), IsValidateArguments: false, IsVariantArgumentList: true, 1, typeof(object), null, null), new Function("DateTimeOffset", FunctionId.DateTimeOffset, typeof(DateTimeOffset), IsValidateArguments: false, IsVariantArgumentList: true, 3, typeof(DateTime), typeof(int), typeof(int)), new Function("Max", FunctionId.Max, typeof(object), IsValidateArguments: false, IsVariantArgumentList: false, 1, null, null, null), new Function("Min", FunctionId.Min, typeof(object), IsValidateArguments: false, IsVariantArgumentList: false, 1, null, null, null), new Function("Sum", FunctionId.Sum, typeof(object), IsValidateArguments: false, IsVariantArgumentList: false, 1, null, null, null), new Function("Count", FunctionId.Count, typeof(object), IsValidateArguments: false, IsVariantArgumentList: false, 1, null, null, null), new Function("Var", FunctionId.Var, typeof(object), IsValidateArguments: false, IsVariantArgumentList: false, 1, null, null, null), new Function("StDev", FunctionId.StDev, typeof(object), IsValidateArguments: false, IsVariantArgumentList: false, 1, null, null, null), new Function("Avg", FunctionId.Avg, typeof(object), IsValidateArguments: false, IsVariantArgumentList: false, 1, null, null, null) }; internal FunctionId Aggregate { get { if (IsAggregate) { return s_funcs[_info]._id; } return FunctionId.none; } } internal bool IsAggregate { get { if (s_funcs[_info]._id != FunctionId.Sum && s_funcs[_info]._id != FunctionId.Avg && s_funcs[_info]._id != FunctionId.Min && s_funcs[_info]._id != FunctionId.Max && s_funcs[_info]._id != FunctionId.Count && s_funcs[_info]._id != FunctionId.StDev) { return s_funcs[_info]._id == FunctionId.Var; } return true; } } internal FunctionNode(DataTable table, string name) : base(table) { _name = name; for (int i = 0; i < s_funcs.Length; i++) { if (string.Compare(s_funcs[i]._name, name, StringComparison.OrdinalIgnoreCase) == 0) { _info = i; break; } } if (_info < 0) { throw ExprException.UndefinedFunction(_name); } } internal void AddArgument(ExpressionNode argument) { if (!s_funcs[_info]._isVariantArgumentList && _argumentCount >= s_funcs[_info]._argumentCount) { throw ExprException.FunctionArgumentCount(_name); } if (_arguments == null) { _arguments = new ExpressionNode[1]; } else if (_argumentCount == _arguments.Length) { ExpressionNode[] array = new ExpressionNode[_argumentCount * 2]; Array.Copy(_arguments, 0, array, 0, _argumentCount); _arguments = array; } _arguments[_argumentCount++] = argument; } internal override void Bind(DataTable table, List list) { BindTable(table); Check(); if (s_funcs[_info]._id == FunctionId.Convert) { if (_argumentCount != 2) { throw ExprException.FunctionArgumentCount(_name); } _arguments[0].Bind(table, list); if (_arguments[1].GetType() == typeof(NameNode)) { NameNode nameNode = (NameNode)_arguments[1]; _arguments[1] = new ConstNode(table, ValueType.Str, nameNode._name); } _arguments[1].Bind(table, list); } else { for (int i = 0; i < _argumentCount; i++) { _arguments[i].Bind(table, list); } } } internal override object Eval() { return Eval(null, DataRowVersion.Default); } internal override object Eval(DataRow row, DataRowVersion version) { object[] array = new object[_argumentCount]; if (s_funcs[_info]._id == FunctionId.Convert) { if (_argumentCount != 2) { throw ExprException.FunctionArgumentCount(_name); } array[0] = _arguments[0].Eval(row, version); array[1] = GetDataType(_arguments[1]); } else if (s_funcs[_info]._id != FunctionId.Iif) { for (int i = 0; i < _argumentCount; i++) { array[i] = _arguments[i].Eval(row, version); if (!s_funcs[_info]._isValidateArguments) { continue; } if (array[i] == DBNull.Value || typeof(object) == s_funcs[_info]._parameters[i]) { return DBNull.Value; } if (!(array[i].GetType() != s_funcs[_info]._parameters[i])) { continue; } if (s_funcs[_info]._parameters[i] == typeof(int) && ExpressionNode.IsInteger(DataStorage.GetStorageType(array[i].GetType()))) { array[i] = Convert.ToInt32(array[i], base.FormatProvider); continue; } if (s_funcs[_info]._id == FunctionId.Trim || s_funcs[_info]._id == FunctionId.Substring || s_funcs[_info]._id == FunctionId.Len) { if (typeof(string) != array[i].GetType() && typeof(SqlString) != array[i].GetType()) { throw ExprException.ArgumentType(s_funcs[_info]._name, i + 1, s_funcs[_info]._parameters[i]); } continue; } throw ExprException.ArgumentType(s_funcs[_info]._name, i + 1, s_funcs[_info]._parameters[i]); } } return EvalFunction(s_funcs[_info]._id, array, row, version); } internal override object Eval(int[] recordNos) { throw ExprException.ComputeNotAggregate(ToString()); } internal override bool IsConstant() { bool flag = true; for (int i = 0; i < _argumentCount; i++) { flag = flag && _arguments[i].IsConstant(); } return flag; } internal override bool IsTableConstant() { for (int i = 0; i < _argumentCount; i++) { if (!_arguments[i].IsTableConstant()) { return false; } } return true; } internal override bool HasLocalAggregate() { for (int i = 0; i < _argumentCount; i++) { if (_arguments[i].HasLocalAggregate()) { return true; } } return false; } internal override bool HasRemoteAggregate() { for (int i = 0; i < _argumentCount; i++) { if (_arguments[i].HasRemoteAggregate()) { return true; } } return false; } internal override bool DependsOn(DataColumn column) { for (int i = 0; i < _argumentCount; i++) { if (_arguments[i].DependsOn(column)) { return true; } } return false; } internal override ExpressionNode Optimize() { for (int i = 0; i < _argumentCount; i++) { _arguments[i] = _arguments[i].Optimize(); } if (s_funcs[_info]._id == FunctionId.In) { if (!IsConstant()) { throw ExprException.NonConstantArgument(); } } else if (IsConstant()) { return new ConstNode(base.table, ValueType.Object, Eval(), fParseQuotes: false); } return this; } private Type GetDataType(ExpressionNode node) { Type type = node.GetType(); string text = null; if (type == typeof(NameNode)) { text = ((NameNode)node)._name; } if (type == typeof(ConstNode)) { text = ((ConstNode)node)._val.ToString(); } if (text == null) { throw ExprException.ArgumentType(s_funcs[_info]._name, 2, typeof(Type)); } Type? type2 = Type.GetType(text); if (type2 == null) { throw ExprException.InvalidType(text); } return type2; } private object EvalFunction(FunctionId id, object[] argumentValues, DataRow row, DataRowVersion version) { switch (id) { case FunctionId.Abs: { StorageType storageType2 = DataStorage.GetStorageType(argumentValues[0].GetType()); if (ExpressionNode.IsInteger(storageType2)) { return Math.Abs((long)argumentValues[0]); } if (ExpressionNode.IsNumeric(storageType2)) { return Math.Abs((double)argumentValues[0]); } throw ExprException.ArgumentTypeInteger(s_funcs[_info]._name, 1); } case FunctionId.cBool: return DataStorage.GetStorageType(argumentValues[0].GetType()) switch { StorageType.Boolean => (bool)argumentValues[0], StorageType.Int32 => (int)argumentValues[0] != 0, StorageType.Double => (double)argumentValues[0] != 0.0, StorageType.String => bool.Parse((string)argumentValues[0]), _ => throw ExprException.DatatypeConvertion(argumentValues[0].GetType(), typeof(bool)), }; case FunctionId.cInt: return Convert.ToInt32(argumentValues[0], base.FormatProvider); case FunctionId.cDate: return Convert.ToDateTime(argumentValues[0], base.FormatProvider); case FunctionId.cDbl: return Convert.ToDouble(argumentValues[0], base.FormatProvider); case FunctionId.cStr: return Convert.ToString(argumentValues[0], base.FormatProvider); case FunctionId.Charindex: if (DataStorage.IsObjectNull(argumentValues[0]) || DataStorage.IsObjectNull(argumentValues[1])) { return DBNull.Value; } if (argumentValues[0] is SqlString) { argumentValues[0] = ((SqlString)argumentValues[0]).Value; } if (argumentValues[1] is SqlString) { argumentValues[1] = ((SqlString)argumentValues[1]).Value; } return ((string)argumentValues[1]).IndexOf((string)argumentValues[0], StringComparison.Ordinal); case FunctionId.Iif: if (DataExpression.ToBoolean(_arguments[0].Eval(row, version))) { return _arguments[1].Eval(row, version); } return _arguments[2].Eval(row, version); case FunctionId.In: throw ExprException.NYI(s_funcs[_info]._name); case FunctionId.IsNull: if (DataStorage.IsObjectNull(argumentValues[0])) { return argumentValues[1]; } return argumentValues[0]; case FunctionId.Len: if (argumentValues[0] is SqlString) { if (((SqlString)argumentValues[0]).IsNull) { return DBNull.Value; } argumentValues[0] = ((SqlString)argumentValues[0]).Value; } return ((string)argumentValues[0]).Length; case FunctionId.Substring: { int num = (int)argumentValues[1] - 1; int num2 = (int)argumentValues[2]; if (num < 0) { throw ExprException.FunctionArgumentOutOfRange("index", "Substring"); } if (num2 < 0) { throw ExprException.FunctionArgumentOutOfRange("length", "Substring"); } if (num2 == 0) { return string.Empty; } if (argumentValues[0] is SqlString) { argumentValues[0] = ((SqlString)argumentValues[0]).Value; } int length = ((string)argumentValues[0]).Length; if (num > length) { return DBNull.Value; } if (num + num2 > length) { num2 = length - num; } return ((string)argumentValues[0]).Substring(num, num2); } case FunctionId.Trim: if (DataStorage.IsObjectNull(argumentValues[0])) { return DBNull.Value; } if (argumentValues[0] is SqlString) { argumentValues[0] = ((SqlString)argumentValues[0]).Value; } return ((string)argumentValues[0]).Trim(); case FunctionId.Convert: { if (_argumentCount != 2) { throw ExprException.FunctionArgumentCount(_name); } if (argumentValues[0] == DBNull.Value) { return DBNull.Value; } Type type = (Type)argumentValues[1]; StorageType storageType = DataStorage.GetStorageType(type); StorageType storageType2 = DataStorage.GetStorageType(argumentValues[0].GetType()); if (storageType == StorageType.DateTimeOffset && storageType2 == StorageType.String) { return SqlConvert.ConvertStringToDateTimeOffset((string)argumentValues[0], base.FormatProvider); } if (StorageType.Object != storageType) { if (storageType == StorageType.Guid && storageType2 == StorageType.String) { return new Guid((string)argumentValues[0]); } if (ExpressionNode.IsFloatSql(storageType2) && ExpressionNode.IsIntegerSql(storageType)) { if (StorageType.Single == storageType2) { return SqlConvert.ChangeType2((float)SqlConvert.ChangeType2(argumentValues[0], StorageType.Single, typeof(float), base.FormatProvider), storageType, type, base.FormatProvider); } if (StorageType.Double == storageType2) { return SqlConvert.ChangeType2((double)SqlConvert.ChangeType2(argumentValues[0], StorageType.Double, typeof(double), base.FormatProvider), storageType, type, base.FormatProvider); } if (StorageType.Decimal == storageType2) { return SqlConvert.ChangeType2((decimal)SqlConvert.ChangeType2(argumentValues[0], StorageType.Decimal, typeof(decimal), base.FormatProvider), storageType, type, base.FormatProvider); } return SqlConvert.ChangeType2(argumentValues[0], storageType, type, base.FormatProvider); } return SqlConvert.ChangeType2(argumentValues[0], storageType, type, base.FormatProvider); } return argumentValues[0]; } case FunctionId.DateTimeOffset: if (argumentValues[0] == DBNull.Value || argumentValues[1] == DBNull.Value || argumentValues[2] == DBNull.Value) { return DBNull.Value; } switch (((DateTime)argumentValues[0]).Kind) { case DateTimeKind.Utc: if ((int)argumentValues[1] != 0 && (int)argumentValues[2] != 0) { throw ExprException.MismatchKindandTimeSpan(); } break; case DateTimeKind.Local: if (DateTimeOffset.Now.Offset.Hours != (int)argumentValues[1] && DateTimeOffset.Now.Offset.Minutes != (int)argumentValues[2]) { throw ExprException.MismatchKindandTimeSpan(); } break; } if ((int)argumentValues[1] < -14 || (int)argumentValues[1] > 14) { throw ExprException.InvalidHoursArgument(); } if ((int)argumentValues[2] < -59 || (int)argumentValues[2] > 59) { throw ExprException.InvalidMinutesArgument(); } if ((int)argumentValues[1] == 14 && (int)argumentValues[2] > 0) { throw ExprException.InvalidTimeZoneRange(); } if ((int)argumentValues[1] == -14 && (int)argumentValues[2] < 0) { throw ExprException.InvalidTimeZoneRange(); } return new DateTimeOffset((DateTime)argumentValues[0], new TimeSpan((int)argumentValues[1], (int)argumentValues[2], 0)); default: throw ExprException.UndefinedFunction(s_funcs[_info]._name); } } internal void Check() { _ = s_funcs[_info]; if (_info < 0) { throw ExprException.UndefinedFunction(_name); } if (s_funcs[_info]._isVariantArgumentList) { if (_argumentCount < s_funcs[_info]._argumentCount) { if (s_funcs[_info]._id == FunctionId.In) { throw ExprException.InWithoutList(); } throw ExprException.FunctionArgumentCount(_name); } } else if (_argumentCount != s_funcs[_info]._argumentCount) { throw ExprException.FunctionArgumentCount(_name); } } } internal enum FunctionId { none = -1, Ascii = 0, Char = 1, Charindex = 2, Difference = 3, Len = 4, Lower = 5, LTrim = 6, Patindex = 7, Replicate = 8, Reverse = 9, Right = 10, RTrim = 11, Soundex = 12, Space = 13, Str = 14, Stuff = 15, Substring = 16, Upper = 17, IsNull = 18, Iif = 19, Convert = 20, cInt = 21, cBool = 22, cDate = 23, cDbl = 24, cStr = 25, Abs = 26, Acos = 27, In = 28, Trim = 29, Sum = 30, Avg = 31, Min = 32, Max = 33, Count = 34, StDev = 35, Var = 37, DateTimeOffset = 38 } internal sealed class Function { internal readonly string _name; internal readonly FunctionId _id; internal readonly Type _result; internal readonly bool _isValidateArguments; internal readonly bool _isVariantArgumentList; internal readonly int _argumentCount; internal readonly Type[] _parameters = new Type[3]; internal static string[] s_functionName = new string[39] { "Unknown", "Ascii", "Char", "CharIndex", "Difference", "Len", "Lower", "LTrim", "Patindex", "Replicate", "Reverse", "Right", "RTrim", "Soundex", "Space", "Str", "Stuff", "Substring", "Upper", "IsNull", "Iif", "Convert", "cInt", "cBool", "cDate", "cDbl", "cStr", "Abs", "Acos", "In", "Trim", "Sum", "Avg", "Min", "Max", "Count", "StDev", "Var", "DateTimeOffset" }; internal Function() { _name = null; _id = FunctionId.none; _result = null; _isValidateArguments = false; _argumentCount = 0; } internal Function(string name, FunctionId id, Type result, bool IsValidateArguments, bool IsVariantArgumentList, int argumentCount, Type a1, Type a2, Type a3) { _name = name; _id = id; _result = result; _isValidateArguments = IsValidateArguments; _isVariantArgumentList = IsVariantArgumentList; _argumentCount = argumentCount; if (a1 != null) { _parameters[0] = a1; } if (a2 != null) { _parameters[1] = a2; } if (a3 != null) { _parameters[2] = a3; } } } internal interface IFilter { bool Invoke(DataRow row, DataRowVersion version); } internal sealed class LookupNode : ExpressionNode { private readonly string _relationName; private readonly string _columnName; private DataColumn _column; private DataRelation _relation; internal LookupNode(DataTable table, string columnName, string relationName) : base(table) { _relationName = relationName; _columnName = columnName; } internal override void Bind(DataTable table, List list) { BindTable(table); _column = null; _relation = null; if (table == null) { throw ExprException.ExpressionUnbound(ToString()); } DataRelationCollection parentRelations = table.ParentRelations; if (_relationName == null) { if (parentRelations.Count > 1) { throw ExprException.UnresolvedRelation(table.TableName, ToString()); } _relation = parentRelations[0]; } else { _relation = parentRelations[_relationName]; } if (_relation == null) { throw ExprException.BindFailure(_relationName); } DataTable parentTable = _relation.ParentTable; _column = parentTable.Columns[_columnName]; if (_column == null) { throw ExprException.UnboundName(_columnName); } int i; for (i = 0; i < list.Count; i++) { DataColumn dataColumn = list[i]; if (_column == dataColumn) { break; } } if (i >= list.Count) { list.Add(_column); } AggregateNode.Bind(_relation, list); } internal override object Eval() { throw ExprException.EvalNoContext(); } internal override object Eval(DataRow row, DataRowVersion version) { if (_column == null || _relation == null) { throw ExprException.ExpressionUnbound(ToString()); } DataRow parentRow = row.GetParentRow(_relation, version); if (parentRow == null) { return DBNull.Value; } return parentRow[_column, parentRow.HasVersion(version) ? version : DataRowVersion.Current]; } internal override object Eval(int[] recordNos) { throw ExprException.ComputeNotAggregate(ToString()); } internal override bool IsConstant() { return false; } internal override bool IsTableConstant() { return false; } internal override bool HasLocalAggregate() { return false; } internal override bool HasRemoteAggregate() { return false; } internal override bool DependsOn(DataColumn column) { if (_column == column) { return true; } return false; } internal override ExpressionNode Optimize() { return this; } } internal sealed class NameNode : ExpressionNode { internal char _open; internal char _close; internal string _name; internal bool _found; internal bool _type; internal DataColumn _column; internal override bool IsSqlColumn => _column.IsSqlType; internal NameNode(DataTable table, char[] text, int start, int pos) : base(table) { _name = ParseName(text, start, pos); } internal NameNode(DataTable table, string name) : base(table) { _name = name; } internal override void Bind(DataTable table, List list) { BindTable(table); if (table == null) { throw ExprException.UnboundName(_name); } try { _column = table.Columns[_name]; } catch (Exception e) { _found = false; if (!ADP.IsCatchableExceptionType(e)) { throw; } throw ExprException.UnboundName(_name); } if (_column == null) { throw ExprException.UnboundName(_name); } _name = _column.ColumnName; _found = true; int i; for (i = 0; i < list.Count; i++) { DataColumn dataColumn = list[i]; if (_column == dataColumn) { break; } } if (i >= list.Count) { list.Add(_column); } } internal override object Eval() { throw ExprException.EvalNoContext(); } internal override object Eval(DataRow row, DataRowVersion version) { if (!_found) { throw ExprException.UnboundName(_name); } if (row == null) { if (IsTableConstant()) { return _column.DataExpression.Evaluate(); } throw ExprException.UnboundName(_name); } return _column[row.GetRecordFromVersion(version)]; } internal override object Eval(int[] records) { throw ExprException.ComputeNotAggregate(ToString()); } internal override bool IsConstant() { return false; } internal override bool IsTableConstant() { if (_column != null && _column.Computed) { return _column.DataExpression.IsTableAggregate(); } return false; } internal override bool HasLocalAggregate() { if (_column != null && _column.Computed) { return _column.DataExpression.HasLocalAggregate(); } return false; } internal override bool HasRemoteAggregate() { if (_column != null && _column.Computed) { return _column.DataExpression.HasRemoteAggregate(); } return false; } internal override bool DependsOn(DataColumn column) { if (_column == column) { return true; } if (_column.Computed) { return _column.DataExpression.DependsOn(column); } return false; } internal override ExpressionNode Optimize() { return this; } internal static string ParseName(char[] text, int start, int pos) { char c = '\0'; string text2 = string.Empty; int num = start; int num2 = pos; checked { if (text[start] == '`') { start++; pos--; c = '\\'; text2 = "`"; } else if (text[start] == '[') { start++; pos--; c = '\\'; text2 = "]\\"; } } if (c != 0) { int num3 = start; for (int i = start; i < pos; i++) { if (text[i] == c && i + 1 < pos && text2.IndexOf(text[i + 1]) >= 0) { i++; } text[num3] = text[i]; num3++; } pos = num3; } if (pos == start) { throw ExprException.InvalidName(new string(text, num, num2 - num)); } return new string(text, start, pos - start); } } internal sealed class Operators { internal const int Noop = 0; internal const int Negative = 1; internal const int UnaryPlus = 2; internal const int Not = 3; internal const int BetweenAnd = 4; internal const int In = 5; internal const int Between = 6; internal const int EqualTo = 7; internal const int GreaterThen = 8; internal const int LessThen = 9; internal const int GreaterOrEqual = 10; internal const int LessOrEqual = 11; internal const int NotEqual = 12; internal const int Is = 13; internal const int Like = 14; internal const int Plus = 15; internal const int Minus = 16; internal const int Multiply = 17; internal const int Divide = 18; internal const int Modulo = 20; internal const int BitwiseAnd = 22; internal const int BitwiseOr = 23; internal const int BitwiseXor = 24; internal const int BitwiseNot = 25; internal const int And = 26; internal const int Or = 27; internal const int Proc = 28; internal const int Iff = 29; internal const int Qual = 30; internal const int Dot = 31; internal const int Null = 32; internal const int True = 33; internal const int False = 34; internal const int Date = 35; internal const int GenUniqueId = 36; internal const int GenGUID = 37; internal const int GUID = 38; internal const int IsNot = 39; internal const int priStart = 0; internal const int priSubstr = 1; internal const int priParen = 2; internal const int priLow = 3; internal const int priImp = 4; internal const int priEqv = 5; internal const int priXor = 6; internal const int priOr = 7; internal const int priAnd = 8; internal const int priNot = 9; internal const int priIs = 10; internal const int priBetweenInLike = 11; internal const int priBetweenAnd = 12; internal const int priRelOp = 13; internal const int priConcat = 14; internal const int priContains = 15; internal const int priPlusMinus = 16; internal const int priMod = 17; internal const int priIDiv = 18; internal const int priMulDiv = 19; internal const int priNeg = 20; internal const int priExp = 21; internal const int priProc = 22; internal const int priDot = 23; internal const int priMax = 24; private static readonly int[] s_priority = new int[44] { 0, 20, 20, 9, 12, 11, 11, 13, 13, 13, 13, 13, 13, 10, 11, 16, 16, 19, 19, 18, 17, 21, 8, 7, 6, 9, 8, 7, 2, 22, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24 }; private static readonly string[] s_looks = new string[40] { "", "-", "+", "Not", "BetweenAnd", "In", "Between", "=", ">", "<", ">=", "<=", "<>", "Is", "Like", "+", "-", "*", "/", "\\", "Mod", "**", "&", "|", "^", "~", "And", "Or", "Proc", "Iff", ".", ".", "Null", "True", "False", "Date", "GenUniqueId()", "GenGuid()", "Guid {..}", "Is Not" }; private Operators() { } internal static bool IsArithmetical(int op) { if (op != 15 && op != 16 && op != 17 && op != 18) { return op == 20; } return true; } internal static bool IsLogical(int op) { if (op != 26 && op != 27 && op != 3 && op != 13) { return op == 39; } return true; } internal static bool IsRelational(int op) { if (7 <= op) { return op <= 12; } return false; } internal static int Priority(int op) { if (op > s_priority.Length) { return 24; } return s_priority[op]; } internal static string ToString(int op) { if (op <= s_looks.Length) { return s_looks[op]; } return "Unknown op"; } } internal sealed class UnaryNode : ExpressionNode { internal readonly int _op; internal ExpressionNode _right; internal UnaryNode(DataTable table, int op, ExpressionNode right) : base(table) { _op = op; _right = right; } internal override void Bind(DataTable table, List list) { BindTable(table); _right.Bind(table, list); } internal override object Eval() { return Eval(null, DataRowVersion.Default); } internal override object Eval(DataRow row, DataRowVersion version) { return EvalUnaryOp(_op, _right.Eval(row, version)); } internal override object Eval(int[] recordNos) { return _right.Eval(recordNos); } private object EvalUnaryOp(int op, object vl) { object value = DBNull.Value; if (DataExpression.IsUnknown(vl)) { return DBNull.Value; } switch (op) { case 0: return vl; case 2: { StorageType storageType = DataStorage.GetStorageType(vl.GetType()); if (ExpressionNode.IsNumericSql(storageType)) { return vl; } throw ExprException.TypeMismatch(ToString()); } case 1: { StorageType storageType = DataStorage.GetStorageType(vl.GetType()); if (ExpressionNode.IsNumericSql(storageType)) { return storageType switch { StorageType.Byte => -(byte)vl, StorageType.Int16 => -(short)vl, StorageType.Int32 => -(int)vl, StorageType.Int64 => -(long)vl, StorageType.Single => 0f - (float)vl, StorageType.Double => 0.0 - (double)vl, StorageType.Decimal => -(decimal)vl, StorageType.SqlDecimal => -(SqlDecimal)vl, StorageType.SqlDouble => -(SqlDouble)vl, StorageType.SqlSingle => -(SqlSingle)vl, StorageType.SqlMoney => -(SqlMoney)vl, StorageType.SqlInt64 => -(SqlInt64)vl, StorageType.SqlInt32 => -(SqlInt32)vl, StorageType.SqlInt16 => -(SqlInt16)vl, _ => DBNull.Value, }; } throw ExprException.TypeMismatch(ToString()); } case 3: if (vl is SqlBoolean sqlBoolean) { if (sqlBoolean.IsFalse) { return SqlBoolean.True; } if (((SqlBoolean)vl).IsTrue) { return SqlBoolean.False; } throw ExprException.UnsupportedOperator(op); } if (DataExpression.ToBoolean(vl)) { return false; } return true; default: throw ExprException.UnsupportedOperator(op); } } internal override bool IsConstant() { return _right.IsConstant(); } internal override bool IsTableConstant() { return _right.IsTableConstant(); } internal override bool HasLocalAggregate() { return _right.HasLocalAggregate(); } internal override bool HasRemoteAggregate() { return _right.HasRemoteAggregate(); } internal override bool DependsOn(DataColumn column) { return _right.DependsOn(column); } internal override ExpressionNode Optimize() { _right = _right.Optimize(); if (IsConstant()) { object constant = Eval(); return new ConstNode(base.table, ValueType.Object, constant, fParseQuotes: false); } return this; } } internal sealed class ZeroOpNode : ExpressionNode { internal readonly int _op; internal const int zop_True = 1; internal const int zop_False = 0; internal const int zop_Null = -1; internal ZeroOpNode(int op) : base(null) { _op = op; } internal override void Bind(DataTable table, List list) { } internal override object Eval() { return _op switch { 33 => true, 34 => false, 32 => DBNull.Value, _ => DBNull.Value, }; } internal override object Eval(DataRow row, DataRowVersion version) { return Eval(); } internal override object Eval(int[] recordNos) { return Eval(); } internal override bool IsConstant() { return true; } internal override bool IsTableConstant() { return true; } internal override bool HasLocalAggregate() { return false; } internal override bool HasRemoteAggregate() { return false; } internal override ExpressionNode Optimize() { return this; } } [DefaultProperty("ConstraintName")] public class ForeignKeyConstraint : Constraint { internal const Rule Rule_Default = Rule.Cascade; internal const AcceptRejectRule AcceptRejectRule_Default = AcceptRejectRule.None; internal Rule _deleteRule = Rule.Cascade; internal Rule _updateRule = Rule.Cascade; internal AcceptRejectRule _acceptRejectRule; private DataKey _childKey; private DataKey _parentKey; internal string _constraintName; internal string[] _parentColumnNames; internal string[] _childColumnNames; internal string _parentTableName; internal string _parentTableNamespace; internal DataKey ChildKey { get { CheckStateForProperty(); return _childKey; } } [ReadOnly(true)] public virtual DataColumn[] Columns { get { CheckStateForProperty(); return _childKey.ToArray(); } } [ReadOnly(true)] public override DataTable Table { get { CheckStateForProperty(); return _childKey.Table; } } internal string[] ParentColumnNames => _parentKey.GetColumnNames(); internal string[] ChildColumnNames => _childKey.GetColumnNames(); [DefaultValue(AcceptRejectRule.None)] public virtual AcceptRejectRule AcceptRejectRule { get { CheckStateForProperty(); return _acceptRejectRule; } set { if ((uint)value <= 1u) { _acceptRejectRule = value; return; } throw ADP.InvalidAcceptRejectRule(value); } } [DefaultValue(Rule.Cascade)] public virtual Rule DeleteRule { get { CheckStateForProperty(); return _deleteRule; } set { if ((uint)value <= 3u) { _deleteRule = value; return; } throw ADP.InvalidRule(value); } } [ReadOnly(true)] public virtual DataColumn[] RelatedColumns { get { CheckStateForProperty(); return _parentKey.ToArray(); } } internal DataColumn[] RelatedColumnsReference { get { CheckStateForProperty(); return _parentKey.ColumnsReference; } } internal DataKey ParentKey { get { CheckStateForProperty(); return _parentKey; } } [ReadOnly(true)] public virtual DataTable RelatedTable { get { CheckStateForProperty(); return _parentKey.Table; } } [DefaultValue(Rule.Cascade)] public virtual Rule UpdateRule { get { CheckStateForProperty(); return _updateRule; } set { if ((uint)value <= 3u) { _updateRule = value; return; } throw ADP.InvalidRule(value); } } public ForeignKeyConstraint(DataColumn parentColumn, DataColumn childColumn) : this(null, parentColumn, childColumn) { } public ForeignKeyConstraint(string constraintName, DataColumn parentColumn, DataColumn childColumn) { DataColumn[] parentColumns = new DataColumn[1] { parentColumn }; DataColumn[] childColumns = new DataColumn[1] { childColumn }; Create(constraintName, parentColumns, childColumns); } public ForeignKeyConstraint(DataColumn[] parentColumns, DataColumn[] childColumns) : this(null, parentColumns, childColumns) { } public ForeignKeyConstraint(string constraintName, DataColumn[] parentColumns, DataColumn[] childColumns) { Create(constraintName, parentColumns, childColumns); } [Browsable(false)] public ForeignKeyConstraint(string constraintName, string parentTableName, string[] parentColumnNames, string[] childColumnNames, AcceptRejectRule acceptRejectRule, Rule deleteRule, Rule updateRule) { _constraintName = constraintName; _parentColumnNames = parentColumnNames; _childColumnNames = childColumnNames; _parentTableName = parentTableName; _acceptRejectRule = acceptRejectRule; _deleteRule = deleteRule; _updateRule = updateRule; } [Browsable(false)] public ForeignKeyConstraint(string constraintName, string parentTableName, string parentTableNamespace, string[] parentColumnNames, string[] childColumnNames, AcceptRejectRule acceptRejectRule, Rule deleteRule, Rule updateRule) { _constraintName = constraintName; _parentColumnNames = parentColumnNames; _childColumnNames = childColumnNames; _parentTableName = parentTableName; _parentTableNamespace = parentTableNamespace; _acceptRejectRule = acceptRejectRule; _deleteRule = deleteRule; _updateRule = updateRule; } internal override void CheckCanAddToCollection(ConstraintCollection constraints) { if (Table != constraints.Table) { throw ExceptionBuilder.ConstraintAddFailed(constraints.Table); } if (Table.Locale.LCID != RelatedTable.Locale.LCID || Table.CaseSensitive != RelatedTable.CaseSensitive) { throw ExceptionBuilder.CaseLocaleMismatch(); } } internal override bool CanBeRemovedFromCollection(ConstraintCollection constraints, bool fThrowException) { return true; } internal bool IsKeyNull(object[] values) { for (int i = 0; i < values.Length; i++) { if (!DataStorage.IsObjectNull(values[i])) { return false; } } return true; } internal override bool IsConstraintViolated() { Index sortIndex = _childKey.GetSortIndex(); object[] uniqueKeyValues = sortIndex.GetUniqueKeyValues(); bool result = false; Index sortIndex2 = _parentKey.GetSortIndex(); for (int i = 0; i < uniqueKeyValues.Length; i++) { object[] array = (object[])uniqueKeyValues[i]; if (!IsKeyNull(array) && !sortIndex2.IsKeyInIndex(array)) { DataRow[] rows = sortIndex.GetRows(sortIndex.FindRecords(array)); string rowError = SR.Format("ForeignKeyConstraint {0} requires the child key values ({1}) to exist in the parent table.", ConstraintName, ExceptionBuilder.KeysToString(array)); for (int j = 0; j < rows.Length; j++) { rows[j].RowError = rowError; } result = true; } } return result; } internal override bool CanEnableConstraint() { if (Table.DataSet == null || !Table.DataSet.EnforceConstraints) { return true; } object[] uniqueKeyValues = _childKey.GetSortIndex().GetUniqueKeyValues(); Index sortIndex = _parentKey.GetSortIndex(); for (int i = 0; i < uniqueKeyValues.Length; i++) { object[] array = (object[])uniqueKeyValues[i]; if (!IsKeyNull(array) && !sortIndex.IsKeyInIndex(array)) { return false; } } return true; } internal void CascadeCommit(DataRow row) { if (row.RowState == DataRowState.Detached || _acceptRejectRule != AcceptRejectRule.Cascade) { return; } Index sortIndex = _childKey.GetSortIndex((row.RowState == DataRowState.Deleted) ? DataViewRowState.Deleted : DataViewRowState.CurrentRows); object[] keyValues = row.GetKeyValues(_parentKey, (row.RowState == DataRowState.Deleted) ? DataRowVersion.Original : DataRowVersion.Default); if (IsKeyNull(keyValues)) { return; } Range range = sortIndex.FindRecords(keyValues); if (range.IsNull) { return; } DataRow[] rows = sortIndex.GetRows(range); foreach (DataRow dataRow in rows) { if (DataRowState.Detached != dataRow.RowState && !dataRow._inCascade) { dataRow.AcceptChanges(); } } } internal void CascadeDelete(DataRow row) { if (-1 == row._newRecord) { return; } object[] keyValues = row.GetKeyValues(_parentKey, DataRowVersion.Current); if (IsKeyNull(keyValues)) { return; } Index sortIndex = _childKey.GetSortIndex(); switch (DeleteRule) { case Rule.None: if (row.Table.DataSet.EnforceConstraints) { Range range2 = sortIndex.FindRecords(keyValues); if (!range2.IsNull && (range2.Count != 1 || sortIndex.GetRow(range2.Min) != row)) { throw ExceptionBuilder.FailedCascadeDelete(ConstraintName); } } break; case Rule.Cascade: { object[] keyValues2 = row.GetKeyValues(_parentKey, DataRowVersion.Default); Range range4 = sortIndex.FindRecords(keyValues2); if (range4.IsNull) { break; } DataRow[] rows3 = sortIndex.GetRows(range4); foreach (DataRow dataRow in rows3) { if (!dataRow._inCascade) { dataRow.Table.DeleteRow(dataRow); } } break; } case Rule.SetNull: { object[] array2 = new object[_childKey.ColumnsReference.Length]; for (int k = 0; k < _childKey.ColumnsReference.Length; k++) { array2[k] = DBNull.Value; } Range range3 = sortIndex.FindRecords(keyValues); if (range3.IsNull) { break; } DataRow[] rows2 = sortIndex.GetRows(range3); for (int l = 0; l < rows2.Length; l++) { if (row != rows2[l]) { rows2[l].SetKeyValues(_childKey, array2); } } break; } case Rule.SetDefault: { object[] array = new object[_childKey.ColumnsReference.Length]; for (int i = 0; i < _childKey.ColumnsReference.Length; i++) { array[i] = _childKey.ColumnsReference[i].DefaultValue; } Range range = sortIndex.FindRecords(keyValues); if (range.IsNull) { break; } DataRow[] rows = sortIndex.GetRows(range); for (int j = 0; j < rows.Length; j++) { if (row != rows[j]) { rows[j].SetKeyValues(_childKey, array); } } break; } } } internal void CascadeRollback(DataRow row) { Index sortIndex = _childKey.GetSortIndex((row.RowState == DataRowState.Deleted) ? DataViewRowState.OriginalRows : DataViewRowState.CurrentRows); object[] keyValues = row.GetKeyValues(_parentKey, (row.RowState == DataRowState.Modified) ? DataRowVersion.Current : DataRowVersion.Default); if (IsKeyNull(keyValues)) { return; } Range range = sortIndex.FindRecords(keyValues); if (_acceptRejectRule == AcceptRejectRule.Cascade) { if (range.IsNull) { return; } DataRow[] rows = sortIndex.GetRows(range); for (int i = 0; i < rows.Length; i++) { if (!rows[i]._inCascade) { rows[i].RejectChanges(); } } } else if (row.RowState != DataRowState.Deleted && row.Table.DataSet.EnforceConstraints && !range.IsNull && (range.Count != 1 || sortIndex.GetRow(range.Min) != row) && row.HasKeyChanged(_parentKey)) { throw ExceptionBuilder.FailedCascadeUpdate(ConstraintName); } } internal void CascadeUpdate(DataRow row) { if (-1 == row._newRecord) { return; } object[] keyValues = row.GetKeyValues(_parentKey, DataRowVersion.Current); if (!Table.DataSet._fInReadXml && IsKeyNull(keyValues)) { return; } Index sortIndex = _childKey.GetSortIndex(); switch (UpdateRule) { case Rule.None: if (row.Table.DataSet.EnforceConstraints && !sortIndex.FindRecords(keyValues).IsNull) { throw ExceptionBuilder.FailedCascadeUpdate(ConstraintName); } break; case Rule.Cascade: { Range range3 = sortIndex.FindRecords(keyValues); if (!range3.IsNull) { object[] keyValues2 = row.GetKeyValues(_parentKey, DataRowVersion.Proposed); DataRow[] rows3 = sortIndex.GetRows(range3); for (int m = 0; m < rows3.Length; m++) { rows3[m].SetKeyValues(_childKey, keyValues2); } } break; } case Rule.SetNull: { object[] array2 = new object[_childKey.ColumnsReference.Length]; for (int k = 0; k < _childKey.ColumnsReference.Length; k++) { array2[k] = DBNull.Value; } Range range2 = sortIndex.FindRecords(keyValues); if (!range2.IsNull) { DataRow[] rows2 = sortIndex.GetRows(range2); for (int l = 0; l < rows2.Length; l++) { rows2[l].SetKeyValues(_childKey, array2); } } break; } case Rule.SetDefault: { object[] array = new object[_childKey.ColumnsReference.Length]; for (int i = 0; i < _childKey.ColumnsReference.Length; i++) { array[i] = _childKey.ColumnsReference[i].DefaultValue; } Range range = sortIndex.FindRecords(keyValues); if (!range.IsNull) { DataRow[] rows = sortIndex.GetRows(range); for (int j = 0; j < rows.Length; j++) { rows[j].SetKeyValues(_childKey, array); } } break; } } } internal void CheckCanClearParentTable(DataTable table) { if (Table.DataSet.EnforceConstraints && Table.Rows.Count > 0) { throw ExceptionBuilder.FailedClearParentTable(table.TableName, ConstraintName, Table.TableName); } } internal void CheckCanRemoveParentRow(DataRow row) { if (!Table.DataSet.EnforceConstraints || DataRelation.GetChildRows(ParentKey, ChildKey, row, DataRowVersion.Default).Length == 0) { return; } throw ExceptionBuilder.RemoveParentRow(this); } internal void CheckCascade(DataRow row, DataRowAction action) { if (row._inCascade) { return; } row._inCascade = true; try { switch (action) { case DataRowAction.Change: if (row.HasKeyChanged(_parentKey)) { CascadeUpdate(row); } break; case DataRowAction.Delete: CascadeDelete(row); break; case DataRowAction.Commit: CascadeCommit(row); break; case DataRowAction.Rollback: CascadeRollback(row); break; default: _ = 16; break; } } finally { row._inCascade = false; } } internal override void CheckConstraint(DataRow childRow, DataRowAction action) { if ((action != DataRowAction.Change && action != DataRowAction.Add && action != DataRowAction.Rollback) || Table.DataSet == null || !Table.DataSet.EnforceConstraints || !childRow.HasKeyChanged(_childKey)) { return; } DataRowVersion dataRowVersion = ((action == DataRowAction.Rollback) ? DataRowVersion.Original : DataRowVersion.Current); object[] keyValues = childRow.GetKeyValues(_childKey); if (childRow.HasVersion(dataRowVersion)) { DataRow parentRow = DataRelation.GetParentRow(ParentKey, ChildKey, childRow, dataRowVersion); if (parentRow != null && parentRow._inCascade) { object[] keyValues2 = parentRow.GetKeyValues(_parentKey, (action == DataRowAction.Rollback) ? dataRowVersion : DataRowVersion.Default); int num = childRow.Table.NewRecord(); childRow.Table.SetKeyValues(_childKey, keyValues2, num); if (_childKey.RecordsEqual(childRow._tempRecord, num)) { return; } } } object[] keyValues3 = childRow.GetKeyValues(_childKey); if (IsKeyNull(keyValues3) || _parentKey.GetSortIndex().IsKeyInIndex(keyValues3)) { return; } if (_childKey.Table == _parentKey.Table && childRow._tempRecord != -1) { int num2 = 0; for (num2 = 0; num2 < keyValues3.Length; num2++) { DataColumn dataColumn = _parentKey.ColumnsReference[num2]; object value = dataColumn.ConvertValue(keyValues3[num2]); if (dataColumn.CompareValueTo(childRow._tempRecord, value) != 0) { break; } } if (num2 == keyValues3.Length) { return; } } throw ExceptionBuilder.ForeignKeyViolation(ConstraintName, keyValues); } private void NonVirtualCheckState() { if (_DataSet != null) { return; } _parentKey.CheckState(); _childKey.CheckState(); if (_parentKey.Table.DataSet != _childKey.Table.DataSet) { throw ExceptionBuilder.TablesInDifferentSets(); } for (int i = 0; i < _parentKey.ColumnsReference.Length; i++) { if (_parentKey.ColumnsReference[i].DataType != _childKey.ColumnsReference[i].DataType || (_parentKey.ColumnsReference[i].DataType == typeof(DateTime) && _parentKey.ColumnsReference[i].DateTimeMode != _childKey.ColumnsReference[i].DateTimeMode && (_parentKey.ColumnsReference[i].DateTimeMode & _childKey.ColumnsReference[i].DateTimeMode) != DataSetDateTime.Unspecified)) { throw ExceptionBuilder.ColumnsTypeMismatch(); } } if (_childKey.ColumnsEqual(_parentKey)) { throw ExceptionBuilder.KeyColumnsIdentical(); } } internal override void CheckState() { NonVirtualCheckState(); } internal override bool ContainsColumn(DataColumn column) { if (!_parentKey.ContainsColumn(column)) { return _childKey.ContainsColumn(column); } return true; } internal override Constraint Clone(DataSet destination) { return Clone(destination, ignorNSforTableLookup: false); } internal override Constraint Clone(DataSet destination, bool ignorNSforTableLookup) { int num = ((!ignorNSforTableLookup) ? destination.Tables.IndexOf(Table.TableName, Table.Namespace, chekforNull: false) : destination.Tables.IndexOf(Table.TableName)); if (num < 0) { return null; } DataTable dataTable = destination.Tables[num]; num = ((!ignorNSforTableLookup) ? destination.Tables.IndexOf(RelatedTable.TableName, RelatedTable.Namespace, chekforNull: false) : destination.Tables.IndexOf(RelatedTable.TableName)); if (num < 0) { return null; } DataTable dataTable2 = destination.Tables[num]; int num2 = Columns.Length; DataColumn[] array = new DataColumn[num2]; DataColumn[] array2 = new DataColumn[num2]; for (int i = 0; i < num2; i++) { DataColumn dataColumn = Columns[i]; num = dataTable.Columns.IndexOf(dataColumn.ColumnName); if (num < 0) { return null; } array[i] = dataTable.Columns[num]; dataColumn = RelatedColumnsReference[i]; num = dataTable2.Columns.IndexOf(dataColumn.ColumnName); if (num < 0) { return null; } array2[i] = dataTable2.Columns[num]; } ForeignKeyConstraint foreignKeyConstraint = new ForeignKeyConstraint(ConstraintName, array2, array); foreignKeyConstraint.UpdateRule = UpdateRule; foreignKeyConstraint.DeleteRule = DeleteRule; foreignKeyConstraint.AcceptRejectRule = AcceptRejectRule; foreach (object key in base.ExtendedProperties.Keys) { foreignKeyConstraint.ExtendedProperties[key] = base.ExtendedProperties[key]; } return foreignKeyConstraint; } internal ForeignKeyConstraint Clone(DataTable destination) { int num = Columns.Length; DataColumn[] array = new DataColumn[num]; DataColumn[] array2 = new DataColumn[num]; int num2 = 0; for (int i = 0; i < num; i++) { DataColumn dataColumn = Columns[i]; num2 = destination.Columns.IndexOf(dataColumn.ColumnName); if (num2 < 0) { return null; } array[i] = destination.Columns[num2]; dataColumn = RelatedColumnsReference[i]; num2 = destination.Columns.IndexOf(dataColumn.ColumnName); if (num2 < 0) { return null; } array2[i] = destination.Columns[num2]; } ForeignKeyConstraint foreignKeyConstraint = new ForeignKeyConstraint(ConstraintName, array2, array); foreignKeyConstraint.UpdateRule = UpdateRule; foreignKeyConstraint.DeleteRule = DeleteRule; foreignKeyConstraint.AcceptRejectRule = AcceptRejectRule; foreach (object key in base.ExtendedProperties.Keys) { foreignKeyConstraint.ExtendedProperties[key] = base.ExtendedProperties[key]; } return foreignKeyConstraint; } private void Create(string relationName, DataColumn[] parentColumns, DataColumn[] childColumns) { if (parentColumns.Length == 0 || childColumns.Length == 0) { throw ExceptionBuilder.KeyLengthZero(); } if (parentColumns.Length != childColumns.Length) { throw ExceptionBuilder.KeyLengthMismatch(); } for (int i = 0; i < parentColumns.Length; i++) { if (parentColumns[i].Computed) { throw ExceptionBuilder.ExpressionInConstraint(parentColumns[i]); } if (childColumns[i].Computed) { throw ExceptionBuilder.ExpressionInConstraint(childColumns[i]); } } _parentKey = new DataKey(parentColumns, copyColumns: true); _childKey = new DataKey(childColumns, copyColumns: true); ConstraintName = relationName; NonVirtualCheckState(); } public override bool Equals(object key) { if (!(key is ForeignKeyConstraint)) { return false; } ForeignKeyConstraint foreignKeyConstraint = (ForeignKeyConstraint)key; if (ParentKey.ColumnsEqual(foreignKeyConstraint.ParentKey)) { return ChildKey.ColumnsEqual(foreignKeyConstraint.ChildKey); } return false; } public override int GetHashCode() { return base.GetHashCode(); } internal DataRelation FindParentRelation() { DataRelationCollection parentRelations = Table.ParentRelations; for (int i = 0; i < parentRelations.Count; i++) { if (parentRelations[i].ChildKeyConstraint == this) { return parentRelations[i]; } } return null; } } public interface IColumnMapping { string DataSetColumn { get; set; } string SourceColumn { get; set; } } public interface IColumnMappingCollection : IList, ICollection, IEnumerable { object this[string index] { get; set; } IColumnMapping Add(string sourceColumnName, string dataSetColumnName); bool Contains(string sourceColumnName); IColumnMapping GetByDataSetColumn(string dataSetColumnName); int IndexOf(string sourceColumnName); void RemoveAt(string sourceColumnName); } public interface IDataAdapter { MissingMappingAction MissingMappingAction { get; set; } MissingSchemaAction MissingSchemaAction { get; set; } ITableMappingCollection TableMappings { get; } DataTable[] FillSchema(DataSet dataSet, SchemaType schemaType); int Fill(DataSet dataSet); IDataParameter[] GetFillParameters(); int Update(DataSet dataSet); } public interface IDataParameter { DbType DbType { get; set; } ParameterDirection Direction { get; set; } bool IsNullable { get; } string ParameterName { get; set; } string SourceColumn { get; set; } DataRowVersion SourceVersion { get; set; } object Value { get; set; } } public interface IDataParameterCollection : IList, ICollection, IEnumerable { object this[string parameterName] { get; set; } bool Contains(string parameterName); int IndexOf(string parameterName); void RemoveAt(string parameterName); } public interface IDataReader : IDisposable, IDataRecord { int Depth { get; } bool IsClosed { get; } int RecordsAffected { get; } void Close(); DataTable GetSchemaTable(); bool NextResult(); bool Read(); } public interface IDataRecord { int FieldCount { get; } object this[int i] { get; } object this[string name] { get; } string GetName(int i); string GetDataTypeName(int i); Type GetFieldType(int i); object GetValue(int i); int GetValues(object[] values); int GetOrdinal(string name); bool GetBoolean(int i); byte GetByte(int i); long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length); char GetChar(int i); long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length); Guid GetGuid(int i); short GetInt16(int i); int GetInt32(int i); long GetInt64(int i); float GetFloat(int i); double GetDouble(int i); string GetString(int i); decimal GetDecimal(int i); DateTime GetDateTime(int i); IDataReader GetData(int i); bool IsDBNull(int i); } public interface IDbCommand : IDisposable { IDbConnection Connection { get; set; } IDbTransaction Transaction { get; set; } string CommandText { get; set; } int CommandTimeout { get; set; } CommandType CommandType { get; set; } IDataParameterCollection Parameters { get; } UpdateRowSource UpdatedRowSource { get; set; } void Prepare(); void Cancel(); IDbDataParameter CreateParameter(); int ExecuteNonQuery(); IDataReader ExecuteReader(); IDataReader ExecuteReader(CommandBehavior behavior); object ExecuteScalar(); } public interface IDbConnection : IDisposable { string ConnectionString { get; set; } int ConnectionTimeout { get; } string Database { get; } ConnectionState State { get; } IDbTransaction BeginTransaction(); IDbTransaction BeginTransaction(IsolationLevel il); void Close(); void ChangeDatabase(string databaseName); IDbCommand CreateCommand(); void Open(); } public interface IDbDataAdapter : IDataAdapter { IDbCommand SelectCommand { get; set; } IDbCommand InsertCommand { get; set; } IDbCommand UpdateCommand { get; set; } IDbCommand DeleteCommand { get; set; } } public interface IDbDataParameter : IDataParameter { byte Precision { get; set; } byte Scale { get; set; } int Size { get; set; } } public interface IDbTransaction : IDisposable { IDbConnection Connection { get; } IsolationLevel IsolationLevel { get; } void Commit(); void Rollback(); } public interface ITableMapping { IColumnMappingCollection ColumnMappings { get; } string DataSetTable { get; set; } string SourceTable { get; set; } } public interface ITableMappingCollection : IList, ICollection, IEnumerable { object this[string index] { get; set; } ITableMapping Add(string sourceTableName, string dataSetTableName); bool Contains(string sourceTableName); ITableMapping GetByDataSetTable(string dataSetTableName); int IndexOf(string sourceTableName); void RemoveAt(string sourceTableName); } public enum IsolationLevel { Unspecified = -1, Chaos = 16, ReadUncommitted = 256, ReadCommitted = 4096, RepeatableRead = 65536, Serializable = 1048576, Snapshot = 16777216 } public enum KeyRestrictionBehavior { AllowOnly, PreventUsage } public enum LoadOption { OverwriteChanges = 1, PreserveChanges, Upsert } public enum MappingType { Element = 1, Attribute, SimpleContent, Hidden } public class MergeFailedEventArgs : EventArgs { public DataTable Table { get; } public string Conflict { get; } public MergeFailedEventArgs(DataTable table, string conflict) { Table = table; Conflict = conflict; } } public delegate void MergeFailedEventHandler(object sender, MergeFailedEventArgs e); internal sealed class Merger { private DataSet _dataSet; private DataTable _dataTable; private bool _preserveChanges; private MissingSchemaAction _missingSchemaAction; private bool _isStandAlonetable; private bool _IgnoreNSforTableLookup; internal Merger(DataSet dataSet, bool preserveChanges, MissingSchemaAction missingSchemaAction) { _dataSet = dataSet; _preserveChanges = preserveChanges; _missingSchemaAction = ((missingSchemaAction == MissingSchemaAction.AddWithKey) ? MissingSchemaAction.Add : missingSchemaAction); } internal Merger(DataTable dataTable, bool preserveChanges, MissingSchemaAction missingSchemaAction) { _isStandAlonetable = true; _dataTable = dataTable; _preserveChanges = preserveChanges; _missingSchemaAction = ((missingSchemaAction == MissingSchemaAction.AddWithKey) ? MissingSchemaAction.Add : missingSchemaAction); } internal void MergeDataSet(DataSet source) { if (source == _dataSet) { return; } bool enforceConstraints = _dataSet.EnforceConstraints; _dataSet.EnforceConstraints = false; _IgnoreNSforTableLookup = _dataSet._namespaceURI != source._namespaceURI; List list = null; if (MissingSchemaAction.Add == _missingSchemaAction) { list = new List(); foreach (DataTable table in _dataSet.Tables) { foreach (DataColumn column in table.Columns) { list.Add(column); } } } for (int i = 0; i < source.Tables.Count; i++) { MergeTableData(source.Tables[i]); } if (MissingSchemaAction.Ignore != _missingSchemaAction) { MergeConstraints(source); for (int j = 0; j < source.Relations.Count; j++) { MergeRelation(source.Relations[j]); } } if (MissingSchemaAction.Add == _missingSchemaAction) { foreach (DataTable table2 in source.Tables) { DataTable dataTable2 = ((!_IgnoreNSforTableLookup) ? _dataSet.Tables[table2.TableName, table2.Namespace] : _dataSet.Tables[table2.TableName]); foreach (DataColumn column2 in table2.Columns) { if (column2.Computed) { DataColumn dataColumn2 = dataTable2.Columns[column2.ColumnName]; if (!list.Contains(dataColumn2)) { dataColumn2.Expression = column2.Expression; } } } } } MergeExtendedProperties(source.ExtendedProperties, _dataSet.ExtendedProperties); foreach (DataTable table3 in _dataSet.Tables) { table3.EvaluateExpressions(); } _dataSet.EnforceConstraints = enforceConstraints; } internal void MergeTable(DataTable src) { bool enforceConstraints = false; if (!_isStandAlonetable) { if (src.DataSet == _dataSet) { return; } enforceConstraints = _dataSet.EnforceConstraints; _dataSet.EnforceConstraints = false; } else { if (src == _dataTable) { return; } _dataTable.SuspendEnforceConstraints = true; } if (_dataSet != null) { if (src.DataSet == null || src.DataSet._namespaceURI != _dataSet._namespaceURI) { _IgnoreNSforTableLookup = true; } } else if (_dataTable.DataSet == null || src.DataSet == null || src.DataSet._namespaceURI != _dataTable.DataSet._namespaceURI) { _IgnoreNSforTableLookup = true; } MergeTableData(src); DataTable dataTable = _dataTable; if (dataTable == null && _dataSet != null) { dataTable = (_IgnoreNSforTableLookup ? _dataSet.Tables[src.TableName] : _dataSet.Tables[src.TableName, src.Namespace]); } dataTable?.EvaluateExpressions(); if (!_isStandAlonetable) { _dataSet.EnforceConstraints = enforceConstraints; return; } _dataTable.SuspendEnforceConstraints = false; try { if (_dataTable.EnforceConstraints) { _dataTable.EnableConstraints(); } } catch (ConstraintException) { if (_dataTable.DataSet != null) { _dataTable.DataSet.EnforceConstraints = false; } throw; } } private void MergeTable(DataTable src, DataTable dst) { int count = src.Rows.Count; bool flag = dst.Rows.Count == 0; if (0 < count) { Index index = null; DataKey key = default(DataKey); dst.SuspendIndexEvents(); try { if (!flag && dst._primaryKey != null) { key = GetSrcKey(src, dst); if (key.HasValue) { index = dst._primaryKey.Key.GetSortIndex(DataViewRowState.OriginalRows | DataViewRowState.Added); } } foreach (DataRow row in src.Rows) { DataRow targetRow = null; if (index != null) { targetRow = dst.FindMergeTarget(row, key, index); } dst.MergeRow(row, targetRow, _preserveChanges, index); } } finally { dst.RestoreIndexEvents(forceReset: true); } } MergeExtendedProperties(src.ExtendedProperties, dst.ExtendedProperties); } internal void MergeRows(DataRow[] rows) { DataTable dataTable = null; DataTable dataTable2 = null; DataKey key = default(DataKey); Index index = null; bool enforceConstraints = _dataSet.EnforceConstraints; _dataSet.EnforceConstraints = false; for (int i = 0; i < rows.Length; i++) { DataRow dataRow = rows[i]; if (dataRow == null) { throw ExceptionBuilder.ArgumentNull(string.Format("{0}[{1}]", "rows", i)); } if (dataRow.Table == null) { throw ExceptionBuilder.ArgumentNull(string.Format("{0}[{1}].{2}", "rows", i, "Table")); } if (dataRow.Table.DataSet == _dataSet) { continue; } if (dataTable != dataRow.Table) { dataTable = dataRow.Table; dataTable2 = MergeSchema(dataRow.Table); if (dataTable2 == null) { _dataSet.EnforceConstraints = enforceConstraints; return; } if (dataTable2._primaryKey != null) { key = GetSrcKey(dataTable, dataTable2); } if (key.HasValue) { if (index != null) { index.RemoveRef(); index = null; } index = new Index(dataTable2, dataTable2._primaryKey.Key.GetIndexDesc(), DataViewRowState.OriginalRows | DataViewRowState.Added, null); index.AddRef(); index.AddRef(); } } if (dataRow._newRecord != -1 || dataRow._oldRecord != -1) { DataRow targetRow = null; if (0 < dataTable2.Rows.Count && index != null) { targetRow = dataTable2.FindMergeTarget(dataRow, key, index); } targetRow = dataTable2.MergeRow(dataRow, targetRow, _preserveChanges, index); if (targetRow.Table._dependentColumns != null && targetRow.Table._dependentColumns.Count > 0) { targetRow.Table.EvaluateExpressions(targetRow, DataRowAction.Change, null); } } } if (index != null) { index.RemoveRef(); index = null; } _dataSet.EnforceConstraints = enforceConstraints; } private DataTable MergeSchema(DataTable table) { DataTable dataTable = null; if (!_isStandAlonetable) { if (_dataSet.Tables.Contains(table.TableName, caseSensitive: true)) { dataTable = ((!_IgnoreNSforTableLookup) ? _dataSet.Tables[table.TableName, table.Namespace] : _dataSet.Tables[table.TableName]); } } else { dataTable = _dataTable; } if (dataTable == null) { if (MissingSchemaAction.Add == _missingSchemaAction) { dataTable = table.Clone(table.DataSet); _dataSet.Tables.Add(dataTable); } else if (MissingSchemaAction.Error == _missingSchemaAction) { throw ExceptionBuilder.MergeMissingDefinition(table.TableName); } } else { if (MissingSchemaAction.Ignore != _missingSchemaAction) { int count = dataTable.Columns.Count; for (int i = 0; i < table.Columns.Count; i++) { DataColumn dataColumn = table.Columns[i]; DataColumn dataColumn2 = (dataTable.Columns.Contains(dataColumn.ColumnName, caseSensitive: true) ? dataTable.Columns[dataColumn.ColumnName] : null); if (dataColumn2 == null) { if (MissingSchemaAction.Add == _missingSchemaAction) { dataColumn2 = dataColumn.Clone(); dataTable.Columns.Add(dataColumn2); continue; } if (!_isStandAlonetable) { _dataSet.RaiseMergeFailed(dataTable, SR.Format("Target table {0} missing definition for column {1}.", table.TableName, dataColumn.ColumnName), _missingSchemaAction); continue; } throw ExceptionBuilder.MergeFailed(SR.Format("Target table {0} missing definition for column {1}.", table.TableName, dataColumn.ColumnName)); } if (dataColumn2.DataType != dataColumn.DataType || (dataColumn2.DataType == typeof(DateTime) && dataColumn2.DateTimeMode != dataColumn.DateTimeMode && (dataColumn2.DateTimeMode & dataColumn.DateTimeMode) != DataSetDateTime.Unspecified)) { if (_isStandAlonetable) { throw ExceptionBuilder.MergeFailed(SR.Format(".{0} and .{0} have conflicting properties: DataType property mismatch.", dataColumn.ColumnName)); } _dataSet.RaiseMergeFailed(dataTable, SR.Format(".{0} and .{0} have conflicting properties: DataType property mismatch.", dataColumn.ColumnName), MissingSchemaAction.Error); } MergeExtendedProperties(dataColumn.ExtendedProperties, dataColumn2.ExtendedProperties); } if (_isStandAlonetable) { for (int j = count; j < dataTable.Columns.Count; j++) { dataTable.Columns[j].Expression = table.Columns[dataTable.Columns[j].ColumnName].Expression; } } DataColumn[] primaryKey = dataTable.PrimaryKey; DataColumn[] primaryKey2 = table.PrimaryKey; if (primaryKey.Length != primaryKey2.Length) { if (primaryKey.Length == 0) { DataColumn[] array = new DataColumn[primaryKey2.Length]; for (int k = 0; k < primaryKey2.Length; k++) { array[k] = dataTable.Columns[primaryKey2[k].ColumnName]; } dataTable.PrimaryKey = array; } else if (primaryKey2.Length != 0) { _dataSet.RaiseMergeFailed(dataTable, ".PrimaryKey and .PrimaryKey have different Length.", _missingSchemaAction); } } else { for (int l = 0; l < primaryKey.Length; l++) { if (string.Compare(primaryKey[l].ColumnName, primaryKey2[l].ColumnName, ignoreCase: false, dataTable.Locale) != 0) { _dataSet.RaiseMergeFailed(table, SR.Format("Mismatch columns in the PrimaryKey : .{0} versus .{1}.", primaryKey[l].ColumnName, primaryKey2[l].ColumnName), _missingSchemaAction); } } } } MergeExtendedProperties(table.ExtendedProperties, dataTable.ExtendedProperties); } return dataTable; } private void MergeTableData(DataTable src) { DataTable dataTable = MergeSchema(src); if (dataTable == null) { return; } dataTable.MergingData = true; try { MergeTable(src, dataTable); } finally { dataTable.MergingData = false; } } private void MergeConstraints(DataSet source) { for (int i = 0; i < source.Tables.Count; i++) { MergeConstraints(source.Tables[i]); } } private void MergeConstraints(DataTable table) { for (int i = 0; i < table.Constraints.Count; i++) { Constraint constraint = table.Constraints[i]; Constraint constraint2 = constraint.Clone(_dataSet, _IgnoreNSforTableLookup); if (constraint2 == null) { _dataSet.RaiseMergeFailed(table, SR.Format("Target DataSet missing {0} {1}.", constraint.GetType().FullName, constraint.ConstraintName), _missingSchemaAction); continue; } Constraint constraint3 = constraint2.Table.Constraints.FindConstraint(constraint2); if (constraint3 == null) { if (MissingSchemaAction.Add == _missingSchemaAction) { try { constraint2.Table.Constraints.Add(constraint2); } catch (DuplicateNameException) { constraint2.ConstraintName = string.Empty; constraint2.Table.Constraints.Add(constraint2); } } else if (MissingSchemaAction.Error == _missingSchemaAction) { _dataSet.RaiseMergeFailed(table, SR.Format("Target DataSet missing {0} {1}.", constraint.GetType().FullName, constraint.ConstraintName), _missingSchemaAction); } } else { MergeExtendedProperties(constraint.ExtendedProperties, constraint3.ExtendedProperties); } } } private void MergeRelation(DataRelation relation) { DataRelation dataRelation = null; int num = _dataSet.Relations.InternalIndexOf(relation.RelationName); if (num >= 0) { dataRelation = _dataSet.Relations[num]; if (relation.ParentKey.ColumnsReference.Length != dataRelation.ParentKey.ColumnsReference.Length) { _dataSet.RaiseMergeFailed(null, SR.Format("Target DataSet missing definition for {0}.", relation.RelationName), _missingSchemaAction); } for (int i = 0; i < relation.ParentKey.ColumnsReference.Length; i++) { DataColumn dataColumn = dataRelation.ParentKey.ColumnsReference[i]; DataColumn dataColumn2 = relation.ParentKey.ColumnsReference[i]; if (string.Compare(dataColumn.ColumnName, dataColumn2.ColumnName, ignoreCase: false, dataColumn.Table.Locale) != 0) { _dataSet.RaiseMergeFailed(null, SR.Format("Relation {0} cannot be merged, because keys have mismatch columns.", relation.RelationName), _missingSchemaAction); } dataColumn = dataRelation.ChildKey.ColumnsReference[i]; dataColumn2 = relation.ChildKey.ColumnsReference[i]; if (string.Compare(dataColumn.ColumnName, dataColumn2.ColumnName, ignoreCase: false, dataColumn.Table.Locale) != 0) { _dataSet.RaiseMergeFailed(null, SR.Format("Relation {0} cannot be merged, because keys have mismatch columns.", relation.RelationName), _missingSchemaAction); } } } else { if (MissingSchemaAction.Add != _missingSchemaAction) { throw ExceptionBuilder.MergeMissingDefinition(relation.RelationName); } DataTable dataTable = (_IgnoreNSforTableLookup ? _dataSet.Tables[relation.ParentTable.TableName] : _dataSet.Tables[relation.ParentTable.TableName, relation.ParentTable.Namespace]); DataTable dataTable2 = (_IgnoreNSforTableLookup ? _dataSet.Tables[relation.ChildTable.TableName] : _dataSet.Tables[relation.ChildTable.TableName, relation.ChildTable.Namespace]); DataColumn[] array = new DataColumn[relation.ParentKey.ColumnsReference.Length]; DataColumn[] array2 = new DataColumn[relation.ParentKey.ColumnsReference.Length]; for (int j = 0; j < relation.ParentKey.ColumnsReference.Length; j++) { array[j] = dataTable.Columns[relation.ParentKey.ColumnsReference[j].ColumnName]; array2[j] = dataTable2.Columns[relation.ChildKey.ColumnsReference[j].ColumnName]; } try { dataRelation = new DataRelation(relation.RelationName, array, array2, relation._createConstraints); dataRelation.Nested = relation.Nested; _dataSet.Relations.Add(dataRelation); } catch (Exception ex) when (ADP.IsCatchableExceptionType(ex)) { ExceptionBuilder.TraceExceptionForCapture(ex); _dataSet.RaiseMergeFailed(null, ex.Message, _missingSchemaAction); } } MergeExtendedProperties(relation.ExtendedProperties, dataRelation.ExtendedProperties); } private void MergeExtendedProperties(PropertyCollection src, PropertyCollection dst) { if (MissingSchemaAction.Ignore == _missingSchemaAction) { return; } IDictionaryEnumerator enumerator = src.GetEnumerator(); while (enumerator.MoveNext()) { if (!_preserveChanges || dst[enumerator.Key] == null) { dst[enumerator.Key] = enumerator.Value; } } } private DataKey GetSrcKey(DataTable src, DataTable dst) { if (src._primaryKey != null) { return src._primaryKey.Key; } DataKey result = default(DataKey); if (dst._primaryKey != null) { DataColumn[] columnsReference = dst._primaryKey.Key.ColumnsReference; DataColumn[] array = new DataColumn[columnsReference.Length]; for (int i = 0; i < columnsReference.Length; i++) { array[i] = src.Columns[columnsReference[i].ColumnName]; } result = new DataKey(array, copyColumns: false); } return result; } } public enum MissingMappingAction { Passthrough = 1, Ignore, Error } public enum MissingSchemaAction { Add = 1, Ignore, Error, AddWithKey } public enum ParameterDirection { Input = 1, Output = 2, InputOutput = 3, ReturnValue = 6 } internal sealed class PrimaryKeyTypeConverter : ReferenceConverter { public PrimaryKeyTypeConverter() : base(typeof(DataColumn[])) { } public override bool GetPropertiesSupported(ITypeDescriptorContext context) { return false; } public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { if (!(destinationType == typeof(string))) { return base.CanConvertTo(context, destinationType); } return true; } public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (destinationType == null) { throw new ArgumentNullException("destinationType"); } if (!(destinationType == typeof(string))) { return base.ConvertTo(context, culture, value, destinationType); } return Array.Empty().GetType().Name; } } [Serializable] public class PropertyCollection : Hashtable, ICloneable { public PropertyCollection() { } protected PropertyCollection(SerializationInfo info, StreamingContext context) : base(info, context) { } public override object Clone() { PropertyCollection propertyCollection = new PropertyCollection(); IDictionaryEnumerator dictionaryEnumerator = GetEnumerator(); try { while (dictionaryEnumerator.MoveNext()) { DictionaryEntry dictionaryEntry = (DictionaryEntry)dictionaryEnumerator.Current; propertyCollection.Add(dictionaryEntry.Key, dictionaryEntry.Value); } return propertyCollection; } finally { IDisposable disposable = dictionaryEnumerator as IDisposable; if (disposable != null) { disposable.Dispose(); } } } } internal struct Range { private int _min; private int _max; private bool _isNotNull; public int Count { get { if (!IsNull) { return _max - _min + 1; } return 0; } } public bool IsNull => !_isNotNull; public int Max { get { CheckNull(); return _max; } } public int Min { get { CheckNull(); return _min; } } public Range(int min, int max) { if (min > max) { throw ExceptionBuilder.RangeArgument(min, max); } _min = min; _max = max; _isNotNull = true; } internal void CheckNull() { if (IsNull) { throw ExceptionBuilder.NullRange(); } } } internal enum RBTreeError { InvalidPageSize = 1, PagePositionInSlotInUse = 3, NoFreeSlots = 4, InvalidStateinInsert = 5, InvalidNextSizeInDelete = 7, InvalidStateinDelete = 8, InvalidNodeSizeinDelete = 9, InvalidStateinEndDelete = 10, CannotRotateInvalidsuccessorNodeinDelete = 11, IndexOutOFRangeinGetNodeByIndex = 13, RBDeleteFixup = 14, UnsupportedAccessMethod1 = 15, UnsupportedAccessMethod2 = 16, UnsupportedAccessMethodInNonNillRootSubtree = 17, AttachedNodeWithZerorbTreeNodeId = 18, CompareNodeInDataRowTree = 19, CompareSateliteTreeNodeInDataRowTree = 20, NestedSatelliteTreeEnumerator = 21 } internal enum TreeAccessMethod { KEY_SEARCH_AND_INDEX = 1, INDEX_ONLY } internal abstract class RBTree : IEnumerable { private enum NodeColor { red, black } private struct Node { internal int _selfId; internal int _leftId; internal int _rightId; internal int _parentId; internal int _nextId; internal int _subTreeSize; internal K _keyOfNode; internal NodeColor _nodeColor; } private struct NodePath { internal readonly int _nodeID; internal readonly int _mainTreeNodeID; internal NodePath(int nodeID, int mainTreeNodeID) { _nodeID = nodeID; _mainTreeNodeID = mainTreeNodeID; } } private sealed class TreePage { public const int slotLineSize = 32; internal readonly Node[] _slots; internal readonly int[] _slotMap; private int _inUseCount; private int _pageId; private int _nextFreeSlotLine; internal int InUseCount { get { return _inUseCount; } set { _inUseCount = value; } } internal int PageId { get { return _pageId; } set { _pageId = value; } } internal TreePage(int size) { if (size > 65536) { throw ExceptionBuilder.InternalRBTreeError(RBTreeError.InvalidPageSize); } _slots = new Node[size]; _slotMap = new int[(size + 32 - 1) / 32]; } internal int AllocSlot(RBTree tree) { int num = 0; int num2 = 0; int num3 = -1; if (_inUseCount < _slots.Length) { for (num = _nextFreeSlotLine; num < _slotMap.Length; num++) { if ((uint)_slotMap[num] < uint.MaxValue) { num3 = 0; num2 = ~_slotMap[num] & (_slotMap[num] + 1); _slotMap[num] |= num2; _inUseCount++; if (_inUseCount == _slots.Length) { tree.MarkPageFull(this); } tree._inUseNodeCount++; num3 = RBTree.GetIntValueFromBitMap((uint)num2); _nextFreeSlotLine = num; num3 = num * 32 + num3; break; } } if (num3 == -1 && _nextFreeSlotLine != 0) { _nextFreeSlotLine = 0; num3 = AllocSlot(tree); } } return num3; } } internal struct RBTreeEnumerator : IEnumerator, IDisposable, IEnumerator { private readonly RBTree _tree; private readonly int _version; private int _index; private int _mainTreeNodeId; private K _current; public K Current => _current; object IEnumerator.Current => Current; internal RBTreeEnumerator(RBTree tree) { _tree = tree; _version = tree._version; _index = 0; _mainTreeNodeId = tree.root; _current = default(K); } internal RBTreeEnumerator(RBTree tree, int position) { _tree = tree; _version = tree._version; if (position == 0) { _index = 0; _mainTreeNodeId = tree.root; } else { _index = tree.ComputeNodeByIndex(position - 1, out _mainTreeNodeId); if (_index == 0) { throw ExceptionBuilder.InternalRBTreeError(RBTreeError.IndexOutOFRangeinGetNodeByIndex); } } _current = default(K); } public void Dispose() { } public bool MoveNext() { if (_version != _tree._version) { throw ExceptionBuilder.EnumeratorModified(); } bool result = _tree.Successor(ref _index, ref _mainTreeNodeId); _current = _tree.Key(_index); return result; } void IEnumerator.Reset() { if (_version != _tree._version) { throw ExceptionBuilder.EnumeratorModified(); } _index = 0; _mainTreeNodeId = _tree.root; _current = default(K); } } internal const int DefaultPageSize = 32; internal const int NIL = 0; private TreePage[] _pageTable; private int[] _pageTableMap; private int _inUsePageCount; private int _nextFreePageLine; public int root; private int _version; private int _inUseNodeCount; private int _inUseSatelliteTreeCount; private readonly TreeAccessMethod _accessMethod; public int Count => _inUseNodeCount - 1; public bool HasDuplicates => _inUseSatelliteTreeCount != 0; public K this[int index] => Key(GetNodeByIndex(index)._nodeID); protected abstract int CompareNode(K record1, K record2); protected abstract int CompareSateliteTreeNode(K record1, K record2); protected RBTree(TreeAccessMethod accessMethod) { _accessMethod = accessMethod; InitTree(); } private void InitTree() { root = 0; _pageTable = new TreePage[32]; _pageTableMap = new int[(_pageTable.Length + 32 - 1) / 32]; _inUsePageCount = 0; _nextFreePageLine = 0; AllocPage(32); _pageTable[0]._slots[0]._nodeColor = NodeColor.black; _pageTable[0]._slotMap[0] = 1; _pageTable[0].InUseCount = 1; _inUseNodeCount = 1; _inUseSatelliteTreeCount = 0; } private void FreePage(TreePage page) { MarkPageFree(page); _pageTable[page.PageId] = null; _inUsePageCount--; } private TreePage AllocPage(int size) { int num = GetIndexOfPageWithFreeSlot(allocatedPage: false); if (num != -1) { _pageTable[num] = new TreePage(size); _nextFreePageLine = num / 32; } else { TreePage[] array = new TreePage[_pageTable.Length * 2]; Array.Copy(_pageTable, 0, array, 0, _pageTable.Length); int[] array2 = new int[(array.Length + 32 - 1) / 32]; Array.Copy(_pageTableMap, 0, array2, 0, _pageTableMap.Length); _nextFreePageLine = _pageTableMap.Length; num = _pageTable.Length; _pageTable = array; _pageTableMap = array2; _pageTable[num] = new TreePage(size); } _pageTable[num].PageId = num; _inUsePageCount++; return _pageTable[num]; } private void MarkPageFull(TreePage page) { _pageTableMap[page.PageId / 32] |= 1 << page.PageId % 32; } private void MarkPageFree(TreePage page) { _pageTableMap[page.PageId / 32] &= ~(1 << page.PageId % 32); } private static int GetIntValueFromBitMap(uint bitMap) { int num = 0; if ((bitMap & 0xFFFF0000u) != 0) { num += 16; bitMap >>= 16; } if ((bitMap & 0xFF00u) != 0) { num += 8; bitMap >>= 8; } if ((bitMap & 0xF0u) != 0) { num += 4; bitMap >>= 4; } if ((bitMap & 0xCu) != 0) { num += 2; bitMap >>= 2; } if ((bitMap & 2u) != 0) { num++; } return num; } private void FreeNode(int nodeId) { TreePage treePage = _pageTable[nodeId >> 16]; int num = nodeId & 0xFFFF; treePage._slots[num] = default(Node); treePage._slotMap[num / 32] &= ~(1 << num % 32); treePage.InUseCount--; _inUseNodeCount--; if (treePage.InUseCount == 0) { FreePage(treePage); } else if (treePage.InUseCount == treePage._slots.Length - 1) { MarkPageFree(treePage); } } private int GetIndexOfPageWithFreeSlot(bool allocatedPage) { int i = _nextFreePageLine; int result = -1; for (; i < _pageTableMap.Length; i++) { if ((uint)_pageTableMap[i] >= uint.MaxValue) { continue; } uint num = (uint)_pageTableMap[i]; while ((num ^ 0xFFFFFFFFu) != 0) { uint num2 = ~num & (num + 1); if ((_pageTableMap[i] & num2) != 0L) { throw ExceptionBuilder.InternalRBTreeError(RBTreeError.PagePositionInSlotInUse); } result = i * 32 + GetIntValueFromBitMap(num2); if (allocatedPage) { if (_pageTable[result] != null) { return result; } } else if (_pageTable[result] == null) { return result; } result = -1; num |= num2; } } if (_nextFreePageLine != 0) { _nextFreePageLine = 0; result = GetIndexOfPageWithFreeSlot(allocatedPage); } return result; } private int GetNewNode(K key) { TreePage treePage = null; int indexOfPageWithFreeSlot = GetIndexOfPageWithFreeSlot(allocatedPage: true); treePage = ((indexOfPageWithFreeSlot != -1) ? _pageTable[indexOfPageWithFreeSlot] : ((_inUsePageCount < 4) ? AllocPage(32) : ((_inUsePageCount < 32) ? AllocPage(256) : ((_inUsePageCount < 128) ? AllocPage(1024) : ((_inUsePageCount < 4096) ? AllocPage(4096) : ((_inUsePageCount >= 32768) ? AllocPage(65536) : AllocPage(8192))))))); int num = treePage.AllocSlot(this); if (num == -1) { throw ExceptionBuilder.InternalRBTreeError(RBTreeError.NoFreeSlots); } treePage._slots[num]._selfId = (treePage.PageId << 16) | num; treePage._slots[num]._subTreeSize = 1; treePage._slots[num]._keyOfNode = key; return treePage._slots[num]._selfId; } private int Successor(int x_id) { if (Right(x_id) != 0) { return Minimum(Right(x_id)); } int num = Parent(x_id); while (num != 0 && x_id == Right(num)) { x_id = num; num = Parent(num); } return num; } private bool Successor(ref int nodeId, ref int mainTreeNodeId) { if (nodeId == 0) { nodeId = Minimum(mainTreeNodeId); mainTreeNodeId = 0; } else { nodeId = Successor(nodeId); if (nodeId == 0 && mainTreeNodeId != 0) { nodeId = Successor(mainTreeNodeId); mainTreeNodeId = 0; } } if (nodeId != 0) { if (Next(nodeId) != 0) { if (mainTreeNodeId != 0) { throw ExceptionBuilder.InternalRBTreeError(RBTreeError.NestedSatelliteTreeEnumerator); } mainTreeNodeId = nodeId; nodeId = Minimum(Next(nodeId)); } return true; } return false; } private int Minimum(int x_id) { while (Left(x_id) != 0) { x_id = Left(x_id); } return x_id; } private int LeftRotate(int root_id, int x_id, int mainTreeNode) { int num = Right(x_id); SetRight(x_id, Left(num)); if (Left(num) != 0) { SetParent(Left(num), x_id); } SetParent(num, Parent(x_id)); if (Parent(x_id) == 0) { if (root_id == 0) { root = num; } else { SetNext(mainTreeNode, num); SetKey(mainTreeNode, Key(num)); root_id = num; } } else if (x_id == Left(Parent(x_id))) { SetLeft(Parent(x_id), num); } else { SetRight(Parent(x_id), num); } SetLeft(num, x_id); SetParent(x_id, num); if (x_id != 0) { SetSubTreeSize(x_id, SubTreeSize(Left(x_id)) + SubTreeSize(Right(x_id)) + ((Next(x_id) == 0) ? 1 : SubTreeSize(Next(x_id)))); } if (num != 0) { SetSubTreeSize(num, SubTreeSize(Left(num)) + SubTreeSize(Right(num)) + ((Next(num) == 0) ? 1 : SubTreeSize(Next(num)))); } return root_id; } private int RightRotate(int root_id, int x_id, int mainTreeNode) { int num = Left(x_id); SetLeft(x_id, Right(num)); if (Right(num) != 0) { SetParent(Right(num), x_id); } SetParent(num, Parent(x_id)); if (Parent(x_id) == 0) { if (root_id == 0) { root = num; } else { SetNext(mainTreeNode, num); SetKey(mainTreeNode, Key(num)); root_id = num; } } else if (x_id == Left(Parent(x_id))) { SetLeft(Parent(x_id), num); } else { SetRight(Parent(x_id), num); } SetRight(num, x_id); SetParent(x_id, num); if (x_id != 0) { SetSubTreeSize(x_id, SubTreeSize(Left(x_id)) + SubTreeSize(Right(x_id)) + ((Next(x_id) == 0) ? 1 : SubTreeSize(Next(x_id)))); } if (num != 0) { SetSubTreeSize(num, SubTreeSize(Left(num)) + SubTreeSize(Right(num)) + ((Next(num) == 0) ? 1 : SubTreeSize(Next(num)))); } return root_id; } private int RBInsert(int root_id, int x_id, int mainTreeNodeID, int position, bool append) { _version++; int num = 0; int num2 = ((root_id == 0) ? root : root_id); if (_accessMethod == TreeAccessMethod.KEY_SEARCH_AND_INDEX && !append) { while (num2 != 0) { IncreaseSize(num2); num = num2; int num3 = ((root_id == 0) ? CompareNode(Key(x_id), Key(num2)) : CompareSateliteTreeNode(Key(x_id), Key(num2))); if (num3 < 0) { num2 = Left(num2); continue; } if (num3 > 0) { num2 = Right(num2); continue; } if (root_id != 0) { throw ExceptionBuilder.InternalRBTreeError(RBTreeError.InvalidStateinInsert); } if (Next(num2) != 0) { root_id = RBInsert(Next(num2), x_id, num2, -1, append: false); SetKey(num2, Key(Next(num2))); } else { int num4 = 0; num4 = GetNewNode(Key(num2)); _inUseSatelliteTreeCount++; SetNext(num4, num2); SetColor(num4, color(num2)); SetParent(num4, Parent(num2)); SetLeft(num4, Left(num2)); SetRight(num4, Right(num2)); if (Left(Parent(num2)) == num2) { SetLeft(Parent(num2), num4); } else if (Right(Parent(num2)) == num2) { SetRight(Parent(num2), num4); } if (Left(num2) != 0) { SetParent(Left(num2), num4); } if (Right(num2) != 0) { SetParent(Right(num2), num4); } if (root == num2) { root = num4; } SetColor(num2, NodeColor.black); SetParent(num2, 0); SetLeft(num2, 0); SetRight(num2, 0); int size = SubTreeSize(num2); SetSubTreeSize(num2, 1); root_id = RBInsert(num2, x_id, num4, -1, append: false); SetSubTreeSize(num4, size); } return root_id; } } else { if (!(_accessMethod == TreeAccessMethod.INDEX_ONLY || append)) { throw ExceptionBuilder.InternalRBTreeError(RBTreeError.UnsupportedAccessMethod1); } if (position == -1) { position = SubTreeSize(root); } while (num2 != 0) { IncreaseSize(num2); num = num2; int num5 = position - SubTreeSize(Left(num)); if (num5 <= 0) { num2 = Left(num2); continue; } num2 = Right(num2); if (num2 != 0) { position = num5 - 1; } } } SetParent(x_id, num); if (num == 0) { if (root_id == 0) { root = x_id; } else { SetNext(mainTreeNodeID, x_id); SetKey(mainTreeNodeID, Key(x_id)); root_id = x_id; } } else { int num6 = 0; if (_accessMethod == TreeAccessMethod.KEY_SEARCH_AND_INDEX) { num6 = ((root_id == 0) ? CompareNode(Key(x_id), Key(num)) : CompareSateliteTreeNode(Key(x_id), Key(num))); } else { if (_accessMethod != TreeAccessMethod.INDEX_ONLY) { throw ExceptionBuilder.InternalRBTreeError(RBTreeError.UnsupportedAccessMethod2); } num6 = ((position > 0) ? 1 : (-1)); } if (num6 < 0) { SetLeft(num, x_id); } else { SetRight(num, x_id); } } SetLeft(x_id, 0); SetRight(x_id, 0); SetColor(x_id, NodeColor.red); num2 = x_id; while (color(Parent(x_id)) == NodeColor.red) { if (Parent(x_id) == Left(Parent(Parent(x_id)))) { num = Right(Parent(Parent(x_id))); if (color(num) == NodeColor.red) { SetColor(Parent(x_id), NodeColor.black); SetColor(num, NodeColor.black); SetColor(Parent(Parent(x_id)), NodeColor.red); x_id = Parent(Parent(x_id)); continue; } if (x_id == Right(Parent(x_id))) { x_id = Parent(x_id); root_id = LeftRotate(root_id, x_id, mainTreeNodeID); } SetColor(Parent(x_id), NodeColor.black); SetColor(Parent(Parent(x_id)), NodeColor.red); root_id = RightRotate(root_id, Parent(Parent(x_id)), mainTreeNodeID); continue; } num = Left(Parent(Parent(x_id))); if (color(num) == NodeColor.red) { SetColor(Parent(x_id), NodeColor.black); SetColor(num, NodeColor.black); SetColor(Parent(Parent(x_id)), NodeColor.red); x_id = Parent(Parent(x_id)); continue; } if (x_id == Left(Parent(x_id))) { x_id = Parent(x_id); root_id = RightRotate(root_id, x_id, mainTreeNodeID); } SetColor(Parent(x_id), NodeColor.black); SetColor(Parent(Parent(x_id)), NodeColor.red); root_id = LeftRotate(root_id, Parent(Parent(x_id)), mainTreeNodeID); } if (root_id == 0) { SetColor(root, NodeColor.black); } else { SetColor(root_id, NodeColor.black); } return root_id; } public void UpdateNodeKey(K currentKey, K newKey) { NodePath nodeByKey = GetNodeByKey(currentKey); if (Parent(nodeByKey._nodeID) == 0 && nodeByKey._nodeID != root) { SetKey(nodeByKey._mainTreeNodeID, newKey); } SetKey(nodeByKey._nodeID, newKey); } public K DeleteByIndex(int i) { NodePath nodeByIndex = GetNodeByIndex(i); K result = Key(nodeByIndex._nodeID); RBDeleteX(0, nodeByIndex._nodeID, nodeByIndex._mainTreeNodeID); return result; } public int RBDelete(int z_id) { return RBDeleteX(0, z_id, 0); } private int RBDeleteX(int root_id, int z_id, int mainTreeNodeID) { int num = 0; if (Next(z_id) != 0) { return RBDeleteX(Next(z_id), Next(z_id), z_id); } bool flag = false; int num2 = ((_accessMethod == TreeAccessMethod.KEY_SEARCH_AND_INDEX) ? mainTreeNodeID : z_id); if (Next(num2) != 0) { root_id = Next(num2); } if (SubTreeSize(Next(num2)) == 2) { flag = true; } else if (SubTreeSize(Next(num2)) == 1) { throw ExceptionBuilder.InternalRBTreeError(RBTreeError.InvalidNextSizeInDelete); } int num3 = ((Left(z_id) != 0 && Right(z_id) != 0) ? Successor(z_id) : z_id); num = ((Left(num3) == 0) ? Right(num3) : Left(num3)); int num4 = Parent(num3); if (num != 0) { SetParent(num, num4); } if (num4 == 0) { if (root_id == 0) { root = num; } else { root_id = num; } } else if (num3 == Left(num4)) { SetLeft(num4, num); } else { SetRight(num4, num); } if (num3 != z_id) { SetKey(z_id, Key(num3)); SetNext(z_id, Next(num3)); } if (Next(num2) != 0) { if (root_id == 0 && z_id != num2) { throw ExceptionBuilder.InternalRBTreeError(RBTreeError.InvalidStateinDelete); } if (root_id != 0) { SetNext(num2, root_id); SetKey(num2, Key(root_id)); } } for (int num5 = num4; num5 != 0; num5 = Parent(num5)) { RecomputeSize(num5); } if (root_id != 0) { for (int num6 = num2; num6 != 0; num6 = Parent(num6)) { DecreaseSize(num6); } } if (color(num3) == NodeColor.black) { root_id = RBDeleteFixup(root_id, num, num4, mainTreeNodeID); } if (flag) { if (num2 == 0 || SubTreeSize(Next(num2)) != 1) { throw ExceptionBuilder.InternalRBTreeError(RBTreeError.InvalidNodeSizeinDelete); } _inUseSatelliteTreeCount--; int num7 = Next(num2); SetLeft(num7, Left(num2)); SetRight(num7, Right(num2)); SetSubTreeSize(num7, SubTreeSize(num2)); SetColor(num7, color(num2)); if (Parent(num2) != 0) { SetParent(num7, Parent(num2)); if (Left(Parent(num2)) == num2) { SetLeft(Parent(num2), num7); } else { SetRight(Parent(num2), num7); } } if (Left(num2) != 0) { SetParent(Left(num2), num7); } if (Right(num2) != 0) { SetParent(Right(num2), num7); } if (root == num2) { root = num7; } FreeNode(num2); num2 = 0; } else if (Next(num2) != 0) { if (root_id == 0 && z_id != num2) { throw ExceptionBuilder.InternalRBTreeError(RBTreeError.InvalidStateinEndDelete); } if (root_id != 0) { SetNext(num2, root_id); SetKey(num2, Key(root_id)); } } if (num3 != z_id) { SetLeft(num3, Left(z_id)); SetRight(num3, Right(z_id)); SetColor(num3, color(z_id)); SetSubTreeSize(num3, SubTreeSize(z_id)); if (Parent(z_id) != 0) { SetParent(num3, Parent(z_id)); if (Left(Parent(z_id)) == z_id) { SetLeft(Parent(z_id), num3); } else { SetRight(Parent(z_id), num3); } } else { SetParent(num3, 0); } if (Left(z_id) != 0) { SetParent(Left(z_id), num3); } if (Right(z_id) != 0) { SetParent(Right(z_id), num3); } if (root == z_id) { root = num3; } else if (root_id == z_id) { root_id = num3; } if (num2 != 0 && Next(num2) == z_id) { SetNext(num2, num3); } } FreeNode(z_id); _version++; return z_id; } private int RBDeleteFixup(int root_id, int x_id, int px_id, int mainTreeNodeID) { if (x_id == 0 && px_id == 0) { return 0; } while (((root_id == 0) ? root : root_id) != x_id && color(x_id) == NodeColor.black) { int num; if ((x_id != 0 && x_id == Left(Parent(x_id))) || (x_id == 0 && Left(px_id) == 0)) { num = ((x_id == 0) ? Right(px_id) : Right(Parent(x_id))); if (num == 0) { throw ExceptionBuilder.InternalRBTreeError(RBTreeError.RBDeleteFixup); } if (color(num) == NodeColor.red) { SetColor(num, NodeColor.black); SetColor(px_id, NodeColor.red); root_id = LeftRotate(root_id, px_id, mainTreeNodeID); num = ((x_id == 0) ? Right(px_id) : Right(Parent(x_id))); } if (color(Left(num)) == NodeColor.black && color(Right(num)) == NodeColor.black) { SetColor(num, NodeColor.red); x_id = px_id; px_id = Parent(px_id); continue; } if (color(Right(num)) == NodeColor.black) { SetColor(Left(num), NodeColor.black); SetColor(num, NodeColor.red); root_id = RightRotate(root_id, num, mainTreeNodeID); num = ((x_id == 0) ? Right(px_id) : Right(Parent(x_id))); } SetColor(num, color(px_id)); SetColor(px_id, NodeColor.black); SetColor(Right(num), NodeColor.black); root_id = LeftRotate(root_id, px_id, mainTreeNodeID); x_id = ((root_id == 0) ? root : root_id); px_id = Parent(x_id); continue; } num = Left(px_id); if (color(num) == NodeColor.red) { SetColor(num, NodeColor.black); if (x_id != 0) { SetColor(px_id, NodeColor.red); root_id = RightRotate(root_id, px_id, mainTreeNodeID); num = ((x_id == 0) ? Left(px_id) : Left(Parent(x_id))); } else { SetColor(px_id, NodeColor.red); root_id = RightRotate(root_id, px_id, mainTreeNodeID); num = ((x_id == 0) ? Left(px_id) : Left(Parent(x_id))); if (num == 0) { throw ExceptionBuilder.InternalRBTreeError(RBTreeError.CannotRotateInvalidsuccessorNodeinDelete); } } } if (color(Right(num)) == NodeColor.black && color(Left(num)) == NodeColor.black) { SetColor(num, NodeColor.red); x_id = px_id; px_id = Parent(px_id); continue; } if (color(Left(num)) == NodeColor.black) { SetColor(Right(num), NodeColor.black); SetColor(num, NodeColor.red); root_id = LeftRotate(root_id, num, mainTreeNodeID); num = ((x_id == 0) ? Left(px_id) : Left(Parent(x_id))); } if (x_id != 0) { SetColor(num, color(px_id)); SetColor(px_id, NodeColor.black); SetColor(Left(num), NodeColor.black); root_id = RightRotate(root_id, px_id, mainTreeNodeID); x_id = ((root_id == 0) ? root : root_id); px_id = Parent(x_id); } else { SetColor(num, color(px_id)); SetColor(px_id, NodeColor.black); SetColor(Left(num), NodeColor.black); root_id = RightRotate(root_id, px_id, mainTreeNodeID); x_id = ((root_id == 0) ? root : root_id); px_id = Parent(x_id); } } SetColor(x_id, NodeColor.black); return root_id; } private int SearchSubTree(int root_id, K key) { if (root_id != 0 && _accessMethod != TreeAccessMethod.KEY_SEARCH_AND_INDEX) { throw ExceptionBuilder.InternalRBTreeError(RBTreeError.UnsupportedAccessMethodInNonNillRootSubtree); } int num = ((root_id == 0) ? root : root_id); while (num != 0) { int num2 = ((root_id == 0) ? CompareNode(key, Key(num)) : CompareSateliteTreeNode(key, Key(num))); if (num2 == 0) { break; } num = ((num2 >= 0) ? Right(num) : Left(num)); } return num; } public int Search(K key) { int num = root; while (num != 0) { int num2 = CompareNode(key, Key(num)); if (num2 == 0) { break; } num = ((num2 >= 0) ? Right(num) : Left(num)); } return num; } private NodePath GetNodeByKey(K key) { int num = SearchSubTree(0, key); if (Next(num) != 0) { return new NodePath(SearchSubTree(Next(num), key), num); } if (!Key(num).Equals(key)) { num = 0; } return new NodePath(num, 0); } public int GetIndexByKey(K key) { int result = -1; NodePath nodeByKey = GetNodeByKey(key); if (nodeByKey._nodeID != 0) { result = GetIndexByNodePath(nodeByKey); } return result; } public int GetIndexByNode(int node) { if (_inUseSatelliteTreeCount == 0) { return ComputeIndexByNode(node); } if (Next(node) != 0) { return ComputeIndexWithSatelliteByNode(node); } int num = SearchSubTree(0, Key(node)); if (num == node) { return ComputeIndexWithSatelliteByNode(node); } return ComputeIndexWithSatelliteByNode(num) + ComputeIndexByNode(node); } private int GetIndexByNodePath(NodePath path) { if (_inUseSatelliteTreeCount == 0) { return ComputeIndexByNode(path._nodeID); } if (path._mainTreeNodeID == 0) { return ComputeIndexWithSatelliteByNode(path._nodeID); } return ComputeIndexWithSatelliteByNode(path._mainTreeNodeID) + ComputeIndexByNode(path._nodeID); } private int ComputeIndexByNode(int nodeId) { int num = SubTreeSize(Left(nodeId)); while (nodeId != 0) { int num2 = Parent(nodeId); if (nodeId == Right(num2)) { num += SubTreeSize(Left(num2)) + 1; } nodeId = num2; } return num; } private int ComputeIndexWithSatelliteByNode(int nodeId) { int num = SubTreeSize(Left(nodeId)); while (nodeId != 0) { int num2 = Parent(nodeId); if (nodeId == Right(num2)) { num += SubTreeSize(Left(num2)) + ((Next(num2) == 0) ? 1 : SubTreeSize(Next(num2))); } nodeId = num2; } return num; } private NodePath GetNodeByIndex(int userIndex) { int num; int satelliteRootId; if (_inUseSatelliteTreeCount == 0) { num = ComputeNodeByIndex(root, userIndex + 1); satelliteRootId = 0; } else { num = ComputeNodeByIndex(userIndex, out satelliteRootId); } if (num == 0) { if (TreeAccessMethod.INDEX_ONLY == _accessMethod) { throw ExceptionBuilder.RowOutOfRange(userIndex); } throw ExceptionBuilder.InternalRBTreeError(RBTreeError.IndexOutOFRangeinGetNodeByIndex); } return new NodePath(num, satelliteRootId); } private int ComputeNodeByIndex(int index, out int satelliteRootId) { index++; satelliteRootId = 0; int num = root; int num2 = -1; while (num != 0 && ((num2 = SubTreeSize(Left(num)) + 1) != index || Next(num) != 0)) { if (index < num2) { num = Left(num); continue; } if (Next(num) != 0 && index >= num2 && index <= num2 + SubTreeSize(Next(num)) - 1) { satelliteRootId = num; index = index - num2 + 1; return ComputeNodeByIndex(Next(num), index); } index = ((Next(num) != 0) ? (index - (num2 + SubTreeSize(Next(num)) - 1)) : (index - num2)); num = Right(num); } return num; } private int ComputeNodeByIndex(int x_id, int index) { while (x_id != 0) { int num = Left(x_id); int num2 = SubTreeSize(num) + 1; if (index < num2) { x_id = num; continue; } if (num2 >= index) { break; } x_id = Right(x_id); index -= num2; } return x_id; } public int Insert(K item) { int newNode = GetNewNode(item); RBInsert(0, newNode, 0, -1, append: false); return newNode; } public int Add(K item) { int newNode = GetNewNode(item); RBInsert(0, newNode, 0, -1, append: false); return newNode; } public IEnumerator GetEnumerator() { return new RBTreeEnumerator(this); } public int IndexOf(int nodeId, K item) { int result = -1; if (nodeId != 0) { if ((object)Key(nodeId) == (object)item) { return GetIndexByNode(nodeId); } if ((result = IndexOf(Left(nodeId), item)) != -1) { return result; } result = IndexOf(Right(nodeId), item); _ = -1; return result; } return result; } public int Insert(int position, K item) { return InsertAt(position, item, append: false); } public int InsertAt(int position, K item, bool append) { int newNode = GetNewNode(item); RBInsert(0, newNode, 0, position, append); return newNode; } public void RemoveAt(int position) { DeleteByIndex(position); } public void Clear() { InitTree(); _version++; } public void CopyTo(Array array, int index) { if (array == null) { throw ExceptionBuilder.ArgumentNull("array"); } if (index < 0) { throw ExceptionBuilder.ArgumentOutOfRange("index"); } int count = Count; if (array.Length - index < Count) { throw ExceptionBuilder.InvalidOffsetLength(); } int num = Minimum(root); for (int i = 0; i < count; i++) { array.SetValue(Key(num), index + i); num = Successor(num); } } public void CopyTo(K[] array, int index) { if (array == null) { throw ExceptionBuilder.ArgumentNull("array"); } if (index < 0) { throw ExceptionBuilder.ArgumentOutOfRange("index"); } int count = Count; if (array.Length - index < Count) { throw ExceptionBuilder.InvalidOffsetLength(); } int num = Minimum(root); for (int i = 0; i < count; i++) { array[index + i] = Key(num); num = Successor(num); } } private void SetRight(int nodeId, int rightNodeId) { _pageTable[nodeId >> 16]._slots[nodeId & 0xFFFF]._rightId = rightNodeId; } private void SetLeft(int nodeId, int leftNodeId) { _pageTable[nodeId >> 16]._slots[nodeId & 0xFFFF]._leftId = leftNodeId; } private void SetParent(int nodeId, int parentNodeId) { _pageTable[nodeId >> 16]._slots[nodeId & 0xFFFF]._parentId = parentNodeId; } private void SetColor(int nodeId, NodeColor color) { _pageTable[nodeId >> 16]._slots[nodeId & 0xFFFF]._nodeColor = color; } private void SetKey(int nodeId, K key) { _pageTable[nodeId >> 16]._slots[nodeId & 0xFFFF]._keyOfNode = key; } private void SetNext(int nodeId, int nextNodeId) { _pageTable[nodeId >> 16]._slots[nodeId & 0xFFFF]._nextId = nextNodeId; } private void SetSubTreeSize(int nodeId, int size) { _pageTable[nodeId >> 16]._slots[nodeId & 0xFFFF]._subTreeSize = size; } private void IncreaseSize(int nodeId) { _pageTable[nodeId >> 16]._slots[nodeId & 0xFFFF]._subTreeSize++; } private void RecomputeSize(int nodeId) { int subTreeSize = SubTreeSize(Left(nodeId)) + SubTreeSize(Right(nodeId)) + ((Next(nodeId) == 0) ? 1 : SubTreeSize(Next(nodeId))); _pageTable[nodeId >> 16]._slots[nodeId & 0xFFFF]._subTreeSize = subTreeSize; } private void DecreaseSize(int nodeId) { _pageTable[nodeId >> 16]._slots[nodeId & 0xFFFF]._subTreeSize--; } [Conditional("DEBUG")] private void VerifySize(int nodeId, int size) { SubTreeSize(Left(nodeId)); SubTreeSize(Right(nodeId)); if (Next(nodeId) != 0) { SubTreeSize(Next(nodeId)); } } public int Right(int nodeId) { return _pageTable[nodeId >> 16]._slots[nodeId & 0xFFFF]._rightId; } public int Left(int nodeId) { return _pageTable[nodeId >> 16]._slots[nodeId & 0xFFFF]._leftId; } public int Parent(int nodeId) { return _pageTable[nodeId >> 16]._slots[nodeId & 0xFFFF]._parentId; } private NodeColor color(int nodeId) { return _pageTable[nodeId >> 16]._slots[nodeId & 0xFFFF]._nodeColor; } public int Next(int nodeId) { return _pageTable[nodeId >> 16]._slots[nodeId & 0xFFFF]._nextId; } public int SubTreeSize(int nodeId) { return _pageTable[nodeId >> 16]._slots[nodeId & 0xFFFF]._subTreeSize; } public K Key(int nodeId) { return _pageTable[nodeId >> 16]._slots[nodeId & 0xFFFF]._keyOfNode; } } internal sealed class RecordManager { private readonly DataTable _table; private int _lastFreeRecord; private int _minimumCapacity = 50; private int _recordCapacity; private readonly List _freeRecordList = new List(); private DataRow[] _rows; internal int LastFreeRecord => _lastFreeRecord; internal int MinimumCapacity { get { return _minimumCapacity; } set { if (_minimumCapacity != value) { if (value < 0) { throw ExceptionBuilder.NegativeMinimumCapacity(); } _minimumCapacity = value; } } } internal int RecordCapacity { get { return _recordCapacity; } set { if (_recordCapacity != value) { for (int i = 0; i < _table.Columns.Count; i++) { _table.Columns[i].SetCapacity(value); } _recordCapacity = value; } } } internal DataRow this[int record] { get { return _rows[record]; } set { _rows[record] = value; } } internal RecordManager(DataTable table) { if (table == null) { throw ExceptionBuilder.ArgumentNull("table"); } _table = table; } private void GrowRecordCapacity() { RecordCapacity = ((NewCapacity(_recordCapacity) < NormalizedMinimumCapacity(_minimumCapacity)) ? NormalizedMinimumCapacity(_minimumCapacity) : NewCapacity(_recordCapacity)); DataRow[] array = _table.NewRowArray(_recordCapacity); if (_rows != null) { Array.Copy(_rows, 0, array, 0, Math.Min(_lastFreeRecord, _rows.Length)); } _rows = array; } internal static int NewCapacity(int capacity) { if (capacity >= 128) { return capacity + capacity; } return 128; } private int NormalizedMinimumCapacity(int capacity) { if (capacity < 1014) { if (capacity < 246) { if (capacity < 54) { return 64; } return 256; } return 1024; } return (capacity + 10 >> 10) + 1 << 10; } internal int NewRecordBase() { int result; if (_freeRecordList.Count != 0) { result = _freeRecordList[_freeRecordList.Count - 1]; _freeRecordList.RemoveAt(_freeRecordList.Count - 1); } else { if (_lastFreeRecord >= _recordCapacity) { GrowRecordCapacity(); } result = _lastFreeRecord; _lastFreeRecord++; } return result; } internal void FreeRecord(ref int record) { if (-1 != record) { this[record] = null; int count = _table._columnCollection.Count; for (int i = 0; i < count; i++) { _table._columnCollection[i].FreeRecord(record); } if (_lastFreeRecord == record + 1) { _lastFreeRecord--; } else if (record < _lastFreeRecord) { _freeRecordList.Add(record); } record = -1; } } internal void Clear(bool clearAll) { if (clearAll) { for (int i = 0; i < _recordCapacity; i++) { _rows[i] = null; } int count = _table._columnCollection.Count; for (int j = 0; j < count; j++) { DataColumn dataColumn = _table._columnCollection[j]; for (int k = 0; k < _recordCapacity; k++) { dataColumn.FreeRecord(k); } } _lastFreeRecord = 0; _freeRecordList.Clear(); return; } _freeRecordList.Capacity = _freeRecordList.Count + _table.Rows.Count; for (int l = 0; l < _recordCapacity; l++) { if (_rows[l] != null && _rows[l].rowID != -1) { int record = l; FreeRecord(ref record); } } } internal void SetKeyValues(int record, DataKey key, object[] keyValues) { for (int i = 0; i < keyValues.Length; i++) { key.ColumnsReference[i][record] = keyValues[i]; } } internal int ImportRecord(DataTable src, int record) { return CopyRecord(src, record, -1); } internal int CopyRecord(DataTable src, int record, int copy) { if (record == -1) { return copy; } int record2 = -1; try { record2 = ((copy == -1) ? _table.NewUninitializedRecord() : copy); int count = _table.Columns.Count; for (int i = 0; i < count; i++) { DataColumn dataColumn = _table.Columns[i]; DataColumn dataColumn2 = src.Columns[dataColumn.ColumnName]; if (dataColumn2 != null) { object obj = dataColumn2[record]; if (obj is ICloneable cloneable) { dataColumn[record2] = cloneable.Clone(); } else { dataColumn[record2] = obj; } } else if (-1 == copy) { dataColumn.Init(record2); } } return record2; } catch (Exception e) when (ADP.IsCatchableOrSecurityExceptionType(e)) { if (-1 == copy) { FreeRecord(ref record2); } throw; } } internal void SetRowCache(DataRow[] newRows) { _rows = newRows; _lastFreeRecord = _rows.Length; _recordCapacity = _lastFreeRecord; } [Conditional("DEBUG")] internal void VerifyRecord(int record) { } [Conditional("DEBUG")] internal void VerifyRecord(int record, DataRow row) { } } internal sealed class RelatedView : DataView, IFilter { private readonly DataKey? _parentKey; private readonly DataKey _childKey; private readonly DataRowView _parentRowView; private readonly object[] _filterValues; public RelatedView(DataColumn[] columns, object[] values) : base(columns[0].Table, locked: false) { if (values == null) { throw ExceptionBuilder.ArgumentNull("values"); } _parentRowView = null; _parentKey = null; _childKey = new DataKey(columns, copyColumns: true); _filterValues = values; ResetRowViewCache(); } public RelatedView(DataRowView parentRowView, DataKey parentKey, DataColumn[] childKeyColumns) : base(childKeyColumns[0].Table, locked: false) { _filterValues = null; _parentRowView = parentRowView; _parentKey = parentKey; _childKey = new DataKey(childKeyColumns, copyColumns: true); ResetRowViewCache(); } private object[] GetParentValues() { if (_filterValues != null) { return _filterValues; } if (!_parentRowView.HasRecord()) { return null; } DataKey? parentKey = _parentKey; return parentKey.Value.GetKeyValues(_parentRowView.GetRecord()); } public bool Invoke(DataRow row, DataRowVersion version) { object[] parentValues = GetParentValues(); if (parentValues == null) { return false; } object[] keyValues = row.GetKeyValues(_childKey, version); bool flag = true; if (keyValues.Length != parentValues.Length) { flag = false; } else { for (int i = 0; i < keyValues.Length; i++) { if (!keyValues[i].Equals(parentValues[i])) { flag = false; break; } } } IFilter filter = base.GetFilter(); if (filter != null) { flag &= filter.Invoke(row, version); } return flag; } internal override IFilter GetFilter() { return this; } public override DataRowView AddNew() { DataRowView dataRowView = base.AddNew(); dataRowView.Row.SetKeyValues(_childKey, GetParentValues()); return dataRowView; } internal override void SetIndex(string newSort, DataViewRowState newRowStates, IFilter newRowFilter) { SetIndex2(newSort, newRowStates, newRowFilter, fireEvent: false); Reset(); } public override bool Equals(DataView dv) { if (!(dv is RelatedView relatedView)) { return false; } if (!base.Equals(dv)) { return false; } if (_filterValues != null) { if (CompareArray(_childKey.ColumnsReference, relatedView._childKey.ColumnsReference)) { return CompareArray(_filterValues, relatedView._filterValues); } return false; } if (relatedView._filterValues != null) { return false; } if (CompareArray(_childKey.ColumnsReference, relatedView._childKey.ColumnsReference)) { DataKey? parentKey = _parentKey; DataColumn[] columnsReference = parentKey.Value.ColumnsReference; parentKey = _parentKey; if (CompareArray(columnsReference, parentKey.Value.ColumnsReference)) { return _parentRowView.Equals(relatedView._parentRowView); } } return false; } private bool CompareArray(object[] value1, object[] value2) { if (value1 == null || value2 == null) { return value1 == value2; } if (value1.Length != value2.Length) { return false; } for (int i = 0; i < value1.Length; i++) { if (value1[i] != value2[i]) { return false; } } return true; } } internal sealed class RelationshipConverter : ExpandableObjectConverter { public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { if (destinationType == typeof(InstanceDescriptor)) { return true; } return base.CanConvertTo(context, destinationType); } public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (destinationType == null) { throw new ArgumentNullException("destinationType"); } ConstructorInfo constructorInfo = null; object[] array = null; if (destinationType == typeof(InstanceDescriptor) && value is DataRelation) { DataRelation dataRelation = (DataRelation)value; DataTable table = dataRelation.ParentKey.Table; DataTable table2 = dataRelation.ChildKey.Table; if (string.IsNullOrEmpty(table.Namespace) && string.IsNullOrEmpty(table2.Namespace)) { constructorInfo = typeof(DataRelation).GetConstructor(new Type[6] { typeof(string), typeof(string), typeof(string), typeof(string[]), typeof(string[]), typeof(bool) }); array = new object[6] { dataRelation.RelationName, dataRelation.ParentKey.Table.TableName, dataRelation.ChildKey.Table.TableName, dataRelation.ParentColumnNames, dataRelation.ChildColumnNames, dataRelation.Nested }; } else { constructorInfo = typeof(DataRelation).GetConstructor(new Type[8] { typeof(string), typeof(string), typeof(string), typeof(string), typeof(string), typeof(string[]), typeof(string[]), typeof(bool) }); array = new object[8] { dataRelation.RelationName, dataRelation.ParentKey.Table.TableName, dataRelation.ParentKey.Table.Namespace, dataRelation.ChildKey.Table.TableName, dataRelation.ChildKey.Table.Namespace, dataRelation.ParentColumnNames, dataRelation.ChildColumnNames, dataRelation.Nested }; } return new InstanceDescriptor(constructorInfo, array); } return base.ConvertTo(context, culture, value, destinationType); } } public enum Rule { None, Cascade, SetNull, SetDefault } public enum SchemaSerializationMode { IncludeSchema = 1, ExcludeSchema } public enum SchemaType { Source = 1, Mapped } internal sealed class Select { private sealed class ColumnInfo { public bool flag; public bool equalsOperator; public BinaryNode expr; } private readonly DataTable _table; private readonly IndexField[] _indexFields; private DataViewRowState _recordStates; private DataExpression _rowFilter; private ExpressionNode _expression; private Index _index; private int[] _records; private int _recordCount; private ExpressionNode _linearExpression; private bool _candidatesForBinarySearch; private ColumnInfo[] _candidateColumns; private int _nCandidates; private int _matchedCandidates; public Select(DataTable table, string filterExpression, string sort, DataViewRowState recordStates) { _table = table; _indexFields = table.ParseSortString(sort); if (filterExpression != null && filterExpression.Length > 0) { _rowFilter = new DataExpression(_table, filterExpression); _expression = _rowFilter.ExpressionNode; } _recordStates = recordStates; } private bool IsSupportedOperator(int op) { if ((op < 7 || op > 11) && op != 13) { return op == 39; } return true; } private void AnalyzeExpression(BinaryNode expr) { if (_linearExpression == _expression) { return; } if (expr._op == 27) { _linearExpression = _expression; return; } if (expr._op == 26) { bool flag = false; bool flag2 = false; if (expr._left is BinaryNode) { AnalyzeExpression((BinaryNode)expr._left); if (_linearExpression == _expression) { return; } flag = true; } else { UnaryNode unaryNode = expr._left as UnaryNode; if (unaryNode != null) { while (unaryNode._op == 0 && unaryNode._right is UnaryNode && ((UnaryNode)unaryNode._right)._op == 0) { unaryNode = (UnaryNode)unaryNode._right; } if (unaryNode._op == 0 && unaryNode._right is BinaryNode) { AnalyzeExpression((BinaryNode)unaryNode._right); if (_linearExpression == _expression) { return; } flag = true; } } } if (expr._right is BinaryNode) { AnalyzeExpression((BinaryNode)expr._right); if (_linearExpression == _expression) { return; } flag2 = true; } else { UnaryNode unaryNode2 = expr._right as UnaryNode; if (unaryNode2 != null) { while (unaryNode2._op == 0 && unaryNode2._right is UnaryNode && ((UnaryNode)unaryNode2._right)._op == 0) { unaryNode2 = (UnaryNode)unaryNode2._right; } if (unaryNode2._op == 0 && unaryNode2._right is BinaryNode) { AnalyzeExpression((BinaryNode)unaryNode2._right); if (_linearExpression == _expression) { return; } flag2 = true; } } } if (!(flag && flag2)) { ExpressionNode expressionNode = (flag ? expr._right : expr._left); _linearExpression = ((_linearExpression == null) ? expressionNode : new BinaryNode(_table, 26, expressionNode, _linearExpression)); } return; } if (IsSupportedOperator(expr._op)) { if (expr._left is NameNode && expr._right is ConstNode) { ColumnInfo columnInfo = _candidateColumns[((NameNode)expr._left)._column.Ordinal]; columnInfo.expr = ((columnInfo.expr == null) ? expr : new BinaryNode(_table, 26, expr, columnInfo.expr)); if (expr._op == 7) { columnInfo.equalsOperator = true; } _candidatesForBinarySearch = true; return; } if (expr._right is NameNode && expr._left is ConstNode) { ExpressionNode left = expr._left; expr._left = expr._right; expr._right = left; switch (expr._op) { case 8: expr._op = 9; break; case 9: expr._op = 8; break; case 10: expr._op = 11; break; case 11: expr._op = 10; break; } ColumnInfo columnInfo2 = _candidateColumns[((NameNode)expr._left)._column.Ordinal]; columnInfo2.expr = ((columnInfo2.expr == null) ? expr : new BinaryNode(_table, 26, expr, columnInfo2.expr)); if (expr._op == 7) { columnInfo2.equalsOperator = true; } _candidatesForBinarySearch = true; return; } } _linearExpression = ((_linearExpression == null) ? expr : new BinaryNode(_table, 26, expr, _linearExpression)); } private bool CompareSortIndexDesc(IndexField[] fields) { if (fields.Length < _indexFields.Length) { return false; } int num = 0; for (int i = 0; i < fields.Length; i++) { if (num >= _indexFields.Length) { break; } if (fields[i] == _indexFields[num]) { num++; continue; } ColumnInfo columnInfo = _candidateColumns[fields[i].Column.Ordinal]; if (columnInfo == null || !columnInfo.equalsOperator) { return false; } } return num == _indexFields.Length; } private bool FindSortIndex() { _index = null; _table._indexesLock.EnterUpgradeableReadLock(); try { int count = _table._indexes.Count; _ = _table.Rows.Count; for (int i = 0; i < count; i++) { Index index = _table._indexes[i]; if (index.RecordStates == _recordStates && index.IsSharable && CompareSortIndexDesc(index._indexFields)) { _index = index; return true; } } } finally { _table._indexesLock.ExitUpgradeableReadLock(); } return false; } private int CompareClosestCandidateIndexDesc(IndexField[] fields) { int num = ((fields.Length < _nCandidates) ? fields.Length : _nCandidates); int i; for (i = 0; i < num; i++) { ColumnInfo columnInfo = _candidateColumns[fields[i].Column.Ordinal]; if (columnInfo == null || columnInfo.expr == null) { break; } if (!columnInfo.equalsOperator) { return i + 1; } } return i; } private bool FindClosestCandidateIndex() { _index = null; _matchedCandidates = 0; bool flag = true; _table._indexesLock.EnterUpgradeableReadLock(); try { int count = _table._indexes.Count; _ = _table.Rows.Count; for (int i = 0; i < count; i++) { Index index = _table._indexes[i]; if (index.RecordStates != _recordStates || !index.IsSharable) { continue; } int num = CompareClosestCandidateIndexDesc(index._indexFields); if (num > _matchedCandidates || (num == _matchedCandidates && !flag)) { _matchedCandidates = num; _index = index; flag = CompareSortIndexDesc(index._indexFields); if (_matchedCandidates == _nCandidates && flag) { return true; } } } } finally { _table._indexesLock.ExitUpgradeableReadLock(); } if (_index == null) { return false; } return flag; } private void InitCandidateColumns() { _nCandidates = 0; _candidateColumns = new ColumnInfo[_table.Columns.Count]; if (_rowFilter == null) { return; } DataColumn[] dependency = _rowFilter.GetDependency(); for (int i = 0; i < dependency.Length; i++) { if (dependency[i].Table == _table) { _candidateColumns[dependency[i].Ordinal] = new ColumnInfo(); _nCandidates++; } } } private void CreateIndex() { if (_index != null) { return; } if (_nCandidates == 0) { _index = new Index(_table, _indexFields, _recordStates, null); _index.AddRef(); return; } int num = _candidateColumns.Length; int num2 = _indexFields.Length; bool flag = true; int i; for (i = 0; i < num; i++) { if (_candidateColumns[i] != null && !_candidateColumns[i].equalsOperator) { flag = false; break; } } int num3 = 0; for (i = 0; i < num2; i++) { ColumnInfo columnInfo = _candidateColumns[_indexFields[i].Column.Ordinal]; if (columnInfo != null) { columnInfo.flag = true; num3++; } } int num4 = num2 - num3; _ = _nCandidates; IndexField[] array = new IndexField[_nCandidates + num4]; if (flag) { num3 = 0; for (i = 0; i < num; i++) { if (_candidateColumns[i] != null) { array[num3++] = new IndexField(_table.Columns[i], isDescending: false); _candidateColumns[i].flag = false; } } for (i = 0; i < num2; i++) { ColumnInfo columnInfo2 = _candidateColumns[_indexFields[i].Column.Ordinal]; if (columnInfo2 == null || columnInfo2.flag) { array[num3++] = _indexFields[i]; if (columnInfo2 != null) { columnInfo2.flag = false; } } } for (i = 0; i < _candidateColumns.Length; i++) { if (_candidateColumns[i] != null) { _candidateColumns[i].flag = false; } } _index = new Index(_table, array, _recordStates, null); if (!IsOperatorIn(_expression)) { _index.AddRef(); } _matchedCandidates = _nCandidates; return; } for (i = 0; i < num2; i++) { array[i] = _indexFields[i]; ColumnInfo columnInfo3 = _candidateColumns[_indexFields[i].Column.Ordinal]; if (columnInfo3 != null) { columnInfo3.flag = true; } } num3 = i; for (i = 0; i < num; i++) { if (_candidateColumns[i] != null) { if (!_candidateColumns[i].flag) { array[num3++] = new IndexField(_table.Columns[i], isDescending: false); } else { _candidateColumns[i].flag = false; } } } _index = new Index(_table, array, _recordStates, null); _matchedCandidates = 0; if (_linearExpression != _expression) { IndexField[] indexFields = _index._indexFields; while (_matchedCandidates < num3) { ColumnInfo columnInfo4 = _candidateColumns[indexFields[_matchedCandidates].Column.Ordinal]; if (columnInfo4 == null || columnInfo4.expr == null) { break; } _matchedCandidates++; if (!columnInfo4.equalsOperator) { break; } } } for (i = 0; i < _candidateColumns.Length; i++) { if (_candidateColumns[i] != null) { _candidateColumns[i].flag = false; } } } private bool IsOperatorIn(ExpressionNode enode) { if (enode is BinaryNode binaryNode && (5 == binaryNode._op || IsOperatorIn(binaryNode._right) || IsOperatorIn(binaryNode._left))) { return true; } return false; } private void BuildLinearExpression() { IndexField[] indexFields = _index._indexFields; _ = indexFields.Length; for (int i = 0; i < _matchedCandidates; i++) { _candidateColumns[indexFields[i].Column.Ordinal].flag = true; } int num = _candidateColumns.Length; for (int i = 0; i < num; i++) { if (_candidateColumns[i] == null) { continue; } if (!_candidateColumns[i].flag) { if (_candidateColumns[i].expr != null) { _linearExpression = ((_linearExpression == null) ? _candidateColumns[i].expr : new BinaryNode(_table, 26, _candidateColumns[i].expr, _linearExpression)); } } else { _candidateColumns[i].flag = false; } } } public DataRow[] SelectRows() { bool flag = true; InitCandidateColumns(); if (_expression is BinaryNode) { AnalyzeExpression((BinaryNode)_expression); if (!_candidatesForBinarySearch) { _linearExpression = _expression; } if (_linearExpression == _expression) { for (int i = 0; i < _candidateColumns.Length; i++) { if (_candidateColumns[i] != null) { _candidateColumns[i].equalsOperator = false; _candidateColumns[i].expr = null; } } } else { flag = !FindClosestCandidateIndex(); } } else { _linearExpression = _expression; } if (_index == null && (_indexFields.Length != 0 || _linearExpression == _expression)) { flag = !FindSortIndex(); } if (_index == null) { CreateIndex(); flag = false; } if (_index.RecordCount == 0) { return _table.NewRowArray(0); } Range range; if (_matchedCandidates == 0) { range = new Range(0, _index.RecordCount - 1); _linearExpression = _expression; return GetLinearFilteredRows(range); } range = GetBinaryFilteredRecords(); if (range.Count == 0) { return _table.NewRowArray(0); } if (_matchedCandidates < _nCandidates) { BuildLinearExpression(); } if (!flag) { return GetLinearFilteredRows(range); } _records = GetLinearFilteredRecords(range); _recordCount = _records.Length; if (_recordCount == 0) { return _table.NewRowArray(0); } Sort(0, _recordCount - 1); return GetRows(); } public DataRow[] GetRows() { DataRow[] array = _table.NewRowArray(_recordCount); for (int i = 0; i < array.Length; i++) { array[i] = _table._recordManager[_records[i]]; } return array; } private bool AcceptRecord(int record) { DataRow dataRow = _table._recordManager[record]; if (dataRow == null) { return true; } DataRowVersion version = DataRowVersion.Default; if (dataRow._oldRecord == record) { version = DataRowVersion.Original; } else if (dataRow._newRecord == record) { version = DataRowVersion.Current; } else if (dataRow._tempRecord == record) { version = DataRowVersion.Proposed; } object value = _linearExpression.Eval(dataRow, version); try { return DataExpression.ToBoolean(value); } catch (Exception e) when (ADP.IsCatchableExceptionType(e)) { throw ExprException.FilterConvertion(_rowFilter.Expression); } } private int Eval(BinaryNode expr, DataRow row, DataRowVersion version) { if (expr._op == 26) { int num = Eval((BinaryNode)expr._left, row, version); if (num != 0) { return num; } int num2 = Eval((BinaryNode)expr._right, row, version); if (num2 != 0) { return num2; } return 0; } long num3 = 0L; object obj = expr._left.Eval(row, version); if (expr._op != 13 && expr._op != 39) { object obj2 = expr._right.Eval(row, version); bool flag = expr._left is ConstNode; bool flag2 = expr._right is ConstNode; if (obj == DBNull.Value || (expr._left.IsSqlColumn && DataStorage.IsObjectSqlNull(obj))) { return -1; } if (obj2 == DBNull.Value || (expr._right.IsSqlColumn && DataStorage.IsObjectSqlNull(obj2))) { return 1; } StorageType storageType = DataStorage.GetStorageType(obj.GetType()); if (StorageType.Char == storageType) { obj2 = ((!flag2 && expr._right.IsSqlColumn) ? SqlConvert.ChangeType2(obj2, StorageType.Char, typeof(char), _table.FormatProvider) : ((object)Convert.ToChar(obj2, _table.FormatProvider))); } StorageType storageType2 = DataStorage.GetStorageType(obj2.GetType()); StorageType storageType3 = ((!expr._left.IsSqlColumn && !expr._right.IsSqlColumn) ? expr.ResultType(storageType, storageType2, flag, flag2, expr._op) : expr.ResultSqlType(storageType, storageType2, flag, flag2, expr._op)); if (storageType3 == StorageType.Empty) { expr.SetTypeMismatchError(expr._op, obj.GetType(), obj2.GetType()); } NameNode nameNode = null; CompareInfo comparer = (((flag && !flag2 && storageType == StorageType.String && storageType2 == StorageType.Guid && expr._right is NameNode nameNode2 && nameNode2._column.DataType == typeof(Guid)) || (flag2 && !flag && storageType2 == StorageType.String && storageType == StorageType.Guid && expr._left is NameNode nameNode3 && nameNode3._column.DataType == typeof(Guid))) ? CultureInfo.InvariantCulture.CompareInfo : null); num3 = expr.BinaryCompare(obj, obj2, storageType3, expr._op, comparer); } switch (expr._op) { case 7: num3 = ((num3 != 0L) ? ((num3 >= 0) ? 1 : (-1)) : 0); break; case 8: num3 = ((num3 <= 0) ? (-1) : 0); break; case 9: num3 = ((num3 >= 0) ? 1 : 0); break; case 10: num3 = ((num3 < 0) ? (-1) : 0); break; case 11: num3 = ((num3 > 0) ? 1 : 0); break; case 13: num3 = ((obj != DBNull.Value) ? (-1) : 0); break; case 39: num3 = ((obj == DBNull.Value) ? 1 : 0); break; } return (int)num3; } private int Evaluate(int record) { DataRow dataRow = _table._recordManager[record]; if (dataRow == null) { return 0; } DataRowVersion version = DataRowVersion.Default; if (dataRow._oldRecord == record) { version = DataRowVersion.Original; } else if (dataRow._newRecord == record) { version = DataRowVersion.Current; } else if (dataRow._tempRecord == record) { version = DataRowVersion.Proposed; } IndexField[] indexFields = _index._indexFields; for (int i = 0; i < _matchedCandidates; i++) { int ordinal = indexFields[i].Column.Ordinal; int num = Eval(_candidateColumns[ordinal].expr, dataRow, version); if (num != 0) { if (!indexFields[i].IsDescending) { return num; } return -num; } } return 0; } private int FindFirstMatchingRecord() { int result = -1; int num = 0; int num2 = _index.RecordCount - 1; while (num <= num2) { int num3 = num + num2 >> 1; int record = _index.GetRecord(num3); int num4 = Evaluate(record); if (num4 == 0) { result = num3; } if (num4 < 0) { num = num3 + 1; } else { num2 = num3 - 1; } } return result; } private int FindLastMatchingRecord(int lo) { int result = -1; int num = _index.RecordCount - 1; while (lo <= num) { int num2 = lo + num >> 1; int record = _index.GetRecord(num2); int num3 = Evaluate(record); if (num3 == 0) { result = num2; } if (num3 <= 0) { lo = num2 + 1; } else { num = num2 - 1; } } return result; } private Range GetBinaryFilteredRecords() { if (_matchedCandidates == 0) { return new Range(0, _index.RecordCount - 1); } int num = FindFirstMatchingRecord(); if (num == -1) { return default(Range); } int max = FindLastMatchingRecord(num); return new Range(num, max); } private int[] GetLinearFilteredRecords(Range range) { if (_linearExpression == null) { int[] array = new int[range.Count]; RBTree.RBTreeEnumerator enumerator = _index.GetEnumerator(range.Min); for (int i = 0; i < range.Count; i++) { if (!enumerator.MoveNext()) { break; } array[i] = enumerator.Current; } return array; } List list = new List(); RBTree.RBTreeEnumerator enumerator2 = _index.GetEnumerator(range.Min); for (int j = 0; j < range.Count; j++) { if (!enumerator2.MoveNext()) { break; } if (AcceptRecord(enumerator2.Current)) { list.Add(enumerator2.Current); } } return list.ToArray(); } private DataRow[] GetLinearFilteredRows(Range range) { if (_linearExpression == null) { return _index.GetRows(range); } List list = new List(); RBTree.RBTreeEnumerator enumerator = _index.GetEnumerator(range.Min); for (int i = 0; i < range.Count; i++) { if (!enumerator.MoveNext()) { break; } if (AcceptRecord(enumerator.Current)) { list.Add(_table._recordManager[enumerator.Current]); } } DataRow[] array = _table.NewRowArray(list.Count); list.CopyTo(array); return array; } private int CompareRecords(int record1, int record2) { int num = _indexFields.Length; for (int i = 0; i < num; i++) { int num2 = _indexFields[i].Column.Compare(record1, record2); if (num2 != 0) { if (_indexFields[i].IsDescending) { num2 = -num2; } return num2; } } long num3 = ((_table._recordManager[record1] == null) ? 0 : _table._recordManager[record1].rowID); long num4 = ((_table._recordManager[record2] == null) ? 0 : _table._recordManager[record2].rowID); int num5 = ((num3 < num4) ? (-1) : ((num4 < num3) ? 1 : 0)); if (num5 == 0 && record1 != record2 && _table._recordManager[record1] != null && _table._recordManager[record2] != null) { num3 = (long)_table._recordManager[record1].GetRecordState(record1); num4 = (long)_table._recordManager[record2].GetRecordState(record2); num5 = ((num3 < num4) ? (-1) : ((num4 < num3) ? 1 : 0)); } return num5; } private void Sort(int left, int right) { int num; do { num = left; int num2 = right; int record = _records[num + num2 >> 1]; while (true) { if (CompareRecords(_records[num], record) < 0) { num++; continue; } while (CompareRecords(_records[num2], record) > 0) { num2--; } if (num <= num2) { int num3 = _records[num]; _records[num] = _records[num2]; _records[num2] = num3; num++; num2--; } if (num > num2) { break; } } if (left < num2) { Sort(left, num2); } left = num; } while (num < right); } } internal struct IndexField { public readonly DataColumn Column; public readonly bool IsDescending; internal IndexField(DataColumn column, bool isDescending) { Column = column; IsDescending = isDescending; } public static bool operator ==(IndexField if1, IndexField if2) { if (if1.Column == if2.Column) { return if1.IsDescending == if2.IsDescending; } return false; } public static bool operator !=(IndexField if1, IndexField if2) { return !(if1 == if2); } public override bool Equals(object obj) { if (!(obj is IndexField)) { return false; } return this == (IndexField)obj; } public override int GetHashCode() { int hashCode = Column.GetHashCode(); bool isDescending = IsDescending; return hashCode ^ isDescending.GetHashCode(); } } internal sealed class Index { private sealed class IndexTree : RBTree { private readonly Index _index; internal IndexTree(Index index) : base(TreeAccessMethod.KEY_SEARCH_AND_INDEX) { _index = index; } protected override int CompareNode(int record1, int record2) { return _index.CompareRecords(record1, record2); } protected override int CompareSateliteTreeNode(int record1, int record2) { return _index.CompareDuplicateRecords(record1, record2); } } private const int DoNotReplaceCompareRecord = 0; private const int ReplaceNewRecordForCompare = 1; private const int ReplaceOldRecordForCompare = 2; private readonly DataTable _table; internal readonly IndexField[] _indexFields; private readonly Comparison _comparison; private readonly DataViewRowState _recordStates; private WeakReference _rowFilter; private IndexTree _records; private int _recordCount; private int _refCount; private Listeners _listeners; private bool _suspendEvents; private readonly bool _isSharable; private readonly bool _hasRemoteAggregate; internal const int MaskBits = int.MaxValue; private static int s_objectTypeCount; private readonly int _objectID = Interlocked.Increment(ref s_objectTypeCount); internal bool HasRemoteAggregate => _hasRemoteAggregate; internal int ObjectID => _objectID; public DataViewRowState RecordStates => _recordStates; public IFilter RowFilter => (IFilter)((_rowFilter != null) ? _rowFilter.Target : null); public bool HasDuplicates => _records.HasDuplicates; public int RecordCount => _recordCount; public bool IsSharable => _isSharable; public int RefCount => _refCount; private bool DoListChanged { get { if (!_suspendEvents && _listeners.HasListeners) { return !_table.AreIndexEventsSuspended; } return false; } } internal DataTable Table => _table; public Index(DataTable table, IndexField[] indexFields, DataViewRowState recordStates, IFilter rowFilter) : this(table, indexFields, null, recordStates, rowFilter) { } public Index(DataTable table, Comparison comparison, DataViewRowState recordStates, IFilter rowFilter) : this(table, GetAllFields(table.Columns), comparison, recordStates, rowFilter) { } private static IndexField[] GetAllFields(DataColumnCollection columns) { IndexField[] array = new IndexField[columns.Count]; for (int i = 0; i < array.Length; i++) { array[i] = new IndexField(columns[i], isDescending: false); } return array; } private Index(DataTable table, IndexField[] indexFields, Comparison comparison, DataViewRowState recordStates, IFilter rowFilter) { DataCommonEventSource.Log.Trace(" {0}, table={1}, recordStates={2}", ObjectID, table?.ObjectID ?? 0, recordStates); if (((uint)recordStates & 0xFFFFFFC1u) != 0) { throw ExceptionBuilder.RecordStateRange(); } _table = table; _listeners = new Listeners(ObjectID, (DataViewListener listener) => listener != null); _indexFields = indexFields; _recordStates = recordStates; _comparison = comparison; _ = table.Columns; _isSharable = rowFilter == null && comparison == null; if (rowFilter != null) { _rowFilter = new WeakReference(rowFilter); if (rowFilter is DataExpression dataExpression) { _hasRemoteAggregate = dataExpression.HasRemoteAggregate(); } } InitRecords(rowFilter); } public bool Equal(IndexField[] indexDesc, DataViewRowState recordStates, IFilter rowFilter) { if (!_isSharable || _indexFields.Length != indexDesc.Length || _recordStates != recordStates || rowFilter != null) { return false; } for (int i = 0; i < _indexFields.Length; i++) { if (_indexFields[i].Column != indexDesc[i].Column || _indexFields[i].IsDescending != indexDesc[i].IsDescending) { return false; } } return true; } public int GetRecord(int recordIndex) { return _records[recordIndex]; } private bool AcceptRecord(int record) { return AcceptRecord(record, RowFilter); } private bool AcceptRecord(int record, IFilter filter) { DataCommonEventSource.Log.Trace(" {0}, record={1}", ObjectID, record); if (filter == null) { return true; } DataRow dataRow = _table._recordManager[record]; if (dataRow == null) { return true; } DataRowVersion version = DataRowVersion.Default; if (dataRow._oldRecord == record) { version = DataRowVersion.Original; } else if (dataRow._newRecord == record) { version = DataRowVersion.Current; } else if (dataRow._tempRecord == record) { version = DataRowVersion.Proposed; } return filter.Invoke(dataRow, version); } internal void ListChangedAdd(DataViewListener listener) { _listeners.Add(listener); } internal void ListChangedRemove(DataViewListener listener) { _listeners.Remove(listener); } public void AddRef() { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _table._indexesLock.EnterWriteLock(); try { if (_refCount == 0) { _table.ShadowIndexCopy(); _table._indexes.Add(this); } _refCount++; } finally { _table._indexesLock.ExitWriteLock(); } } public int RemoveRef() { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _table._indexesLock.EnterWriteLock(); int result; try { result = --_refCount; if (_refCount <= 0) { _table.ShadowIndexCopy(); _table._indexes.Remove(this); } } finally { _table._indexesLock.ExitWriteLock(); } return result; } private void ApplyChangeAction(int record, int action, int changeRecord) { if (action == 0) { return; } if (action > 0) { if (AcceptRecord(record)) { InsertRecord(record, fireEvent: true); } } else if (_comparison != null && -1 != record) { DeleteRecord(GetIndex(record, changeRecord)); } else { DeleteRecord(GetIndex(record)); } } public bool CheckUnique() { return !HasDuplicates; } private int CompareRecords(int record1, int record2) { if (_comparison != null) { return CompareDataRows(record1, record2); } if (_indexFields.Length != 0) { for (int i = 0; i < _indexFields.Length; i++) { int num = _indexFields[i].Column.Compare(record1, record2); if (num != 0) { if (!_indexFields[i].IsDescending) { return num; } return -num; } } return 0; } return _table.Rows.IndexOf(_table._recordManager[record1]).CompareTo(_table.Rows.IndexOf(_table._recordManager[record2])); } private int CompareDataRows(int record1, int record2) { return _comparison(_table._recordManager[record1], _table._recordManager[record2]); } private int CompareDuplicateRecords(int record1, int record2) { if (_table._recordManager[record1] == null) { if (_table._recordManager[record2] != null) { return -1; } return 0; } if (_table._recordManager[record2] == null) { return 1; } int num = _table._recordManager[record1].rowID.CompareTo(_table._recordManager[record2].rowID); if (num == 0 && record1 != record2) { num = ((int)_table._recordManager[record1].GetRecordState(record1)).CompareTo((int)_table._recordManager[record2].GetRecordState(record2)); } return num; } private int CompareRecordToKey(int record1, object[] vals) { for (int i = 0; i < _indexFields.Length; i++) { int num = _indexFields[i].Column.CompareValueTo(record1, vals[i]); if (num != 0) { if (!_indexFields[i].IsDescending) { return num; } return -num; } } return 0; } public void DeleteRecordFromIndex(int recordIndex) { DeleteRecord(recordIndex, fireEvent: false); } private void DeleteRecord(int recordIndex) { DeleteRecord(recordIndex, fireEvent: true); } private void DeleteRecord(int recordIndex, bool fireEvent) { DataCommonEventSource.Log.Trace(" {0}, recordIndex={1}, fireEvent={2}", ObjectID, recordIndex, fireEvent); if (recordIndex >= 0) { _recordCount--; int record = _records.DeleteByIndex(recordIndex); MaintainDataView(ListChangedType.ItemDeleted, record, !fireEvent); if (fireEvent) { OnListChanged(ListChangedType.ItemDeleted, recordIndex); } } } public RBTree.RBTreeEnumerator GetEnumerator(int startIndex) { return new RBTree.RBTreeEnumerator(_records, startIndex); } public int GetIndex(int record) { return _records.GetIndexByKey(record); } private int GetIndex(int record, int changeRecord) { DataRow dataRow = _table._recordManager[record]; int newRecord = dataRow._newRecord; int oldRecord = dataRow._oldRecord; try { switch (changeRecord) { case 1: dataRow._newRecord = record; break; case 2: dataRow._oldRecord = record; break; } return _records.GetIndexByKey(record); } finally { switch (changeRecord) { case 1: dataRow._newRecord = newRecord; break; case 2: dataRow._oldRecord = oldRecord; break; } } } public object[] GetUniqueKeyValues() { if (_indexFields == null || _indexFields.Length == 0) { return Array.Empty(); } List list = new List(); GetUniqueKeyValues(list, _records.root); return list.ToArray(); } public int FindRecord(int record) { int num = _records.Search(record); if (num != 0) { return _records.GetIndexByNode(num); } return -1; } public int FindRecordByKey(object key) { int num = FindNodeByKey(key); if (num != 0) { return _records.GetIndexByNode(num); } return -1; } public int FindRecordByKey(object[] key) { int num = FindNodeByKeys(key); if (num != 0) { return _records.GetIndexByNode(num); } return -1; } private int FindNodeByKey(object originalKey) { if (_indexFields.Length != 1) { throw ExceptionBuilder.IndexKeyLength(_indexFields.Length, 1); } int num = _records.root; if (num != 0) { DataColumn column = _indexFields[0].Column; object value = column.ConvertValue(originalKey); num = _records.root; if (_indexFields[0].IsDescending) { while (num != 0) { int num2 = column.CompareValueTo(_records.Key(num), value); if (num2 == 0) { break; } num = ((num2 >= 0) ? _records.Right(num) : _records.Left(num)); } } else { while (num != 0) { int num2 = column.CompareValueTo(_records.Key(num), value); if (num2 == 0) { break; } num = ((num2 <= 0) ? _records.Right(num) : _records.Left(num)); } } } return num; } private int FindNodeByKeys(object[] originalKey) { int num = ((originalKey != null) ? originalKey.Length : 0); if (num == 0 || _indexFields.Length != num) { throw ExceptionBuilder.IndexKeyLength(_indexFields.Length, num); } int num2 = _records.root; if (num2 != 0) { object[] array = new object[originalKey.Length]; for (int i = 0; i < originalKey.Length; i++) { array[i] = _indexFields[i].Column.ConvertValue(originalKey[i]); } for (num2 = _records.root; num2 != 0; num2 = ((num <= 0) ? _records.Right(num2) : _records.Left(num2))) { num = CompareRecordToKey(_records.Key(num2), array); if (num == 0) { break; } } } return num2; } private int FindNodeByKeyRecord(int record) { int num = _records.root; if (num != 0) { num = _records.root; while (num != 0) { int num2 = CompareRecords(_records.Key(num), record); if (num2 == 0) { break; } num = ((num2 <= 0) ? _records.Right(num) : _records.Left(num)); } } return num; } private Range GetRangeFromNode(int nodeId) { if (nodeId == 0) { return default(Range); } int indexByNode = _records.GetIndexByNode(nodeId); if (_records.Next(nodeId) == 0) { return new Range(indexByNode, indexByNode); } int num = _records.SubTreeSize(_records.Next(nodeId)); return new Range(indexByNode, indexByNode + num - 1); } public Range FindRecords(object key) { int nodeId = FindNodeByKey(key); return GetRangeFromNode(nodeId); } public Range FindRecords(object[] key) { int nodeId = FindNodeByKeys(key); return GetRangeFromNode(nodeId); } internal void FireResetEvent() { DataCommonEventSource.Log.Trace(" {0}", ObjectID); if (DoListChanged) { OnListChanged(DataView.s_resetEventArgs); } } private int GetChangeAction(DataViewRowState oldState, DataViewRowState newState) { int num = (((_recordStates & oldState) != 0) ? 1 : 0); return (((_recordStates & newState) != 0) ? 1 : 0) - num; } private static int GetReplaceAction(DataViewRowState oldState) { if ((DataViewRowState.CurrentRows & oldState) == 0) { if ((DataViewRowState.OriginalRows & oldState) == 0) { return 0; } return 2; } return 1; } public DataRow GetRow(int i) { return _table._recordManager[GetRecord(i)]; } public DataRow[] GetRows(object[] values) { return GetRows(FindRecords(values)); } public DataRow[] GetRows(Range range) { DataRow[] array = _table.NewRowArray(range.Count); if (array.Length != 0) { RBTree.RBTreeEnumerator enumerator = GetEnumerator(range.Min); for (int i = 0; i < array.Length; i++) { if (!enumerator.MoveNext()) { break; } array[i] = _table._recordManager[enumerator.Current]; } } return array; } private void InitRecords(IFilter filter) { DataViewRowState recordStates = _recordStates; bool append = _indexFields.Length == 0; _records = new IndexTree(this); _recordCount = 0; foreach (DataRow row in _table.Rows) { int num = -1; if (row._oldRecord == row._newRecord) { if ((recordStates & DataViewRowState.Unchanged) != 0) { num = row._oldRecord; } } else if (row._oldRecord == -1) { if ((recordStates & DataViewRowState.Added) != 0) { num = row._newRecord; } } else if (row._newRecord == -1) { if ((recordStates & DataViewRowState.Deleted) != 0) { num = row._oldRecord; } } else if ((recordStates & DataViewRowState.ModifiedCurrent) != 0) { num = row._newRecord; } else if ((recordStates & DataViewRowState.ModifiedOriginal) != 0) { num = row._oldRecord; } if (num != -1 && AcceptRecord(num, filter)) { _records.InsertAt(-1, num, append); _recordCount++; } } } public int InsertRecordToIndex(int record) { int result = -1; if (AcceptRecord(record)) { result = InsertRecord(record, fireEvent: false); } return result; } private int InsertRecord(int record, bool fireEvent) { DataCommonEventSource.Log.Trace(" {0}, record={1}, fireEvent={2}", ObjectID, record, fireEvent); bool append = false; if (_indexFields.Length == 0 && _table != null) { DataRow row = _table._recordManager[record]; append = _table.Rows.IndexOf(row) + 1 == _table.Rows.Count; } int node = _records.InsertAt(-1, record, append); _recordCount++; MaintainDataView(ListChangedType.ItemAdded, record, !fireEvent); if (fireEvent) { if (DoListChanged) { OnListChanged(ListChangedType.ItemAdded, _records.GetIndexByNode(node)); } return 0; } return _records.GetIndexByNode(node); } public bool IsKeyInIndex(object key) { int num = FindNodeByKey(key); return num != 0; } public bool IsKeyInIndex(object[] key) { int num = FindNodeByKeys(key); return num != 0; } public bool IsKeyRecordInIndex(int record) { int num = FindNodeByKeyRecord(record); return num != 0; } private void OnListChanged(ListChangedType changedType, int newIndex, int oldIndex) { if (DoListChanged) { OnListChanged(new ListChangedEventArgs(changedType, newIndex, oldIndex)); } } private void OnListChanged(ListChangedType changedType, int index) { if (DoListChanged) { OnListChanged(new ListChangedEventArgs(changedType, index)); } } private void OnListChanged(ListChangedEventArgs e) { DataCommonEventSource.Log.Trace(" {0}", ObjectID); _listeners.Notify(e, arg2: false, arg3: false, delegate(DataViewListener listener, ListChangedEventArgs args, bool arg2, bool arg3) { listener.IndexListChanged(args); }); } private void MaintainDataView(ListChangedType changedType, int record, bool trackAddRemove) { _listeners.Notify(changedType, (0 <= record) ? _table._recordManager[record] : null, trackAddRemove, delegate(DataViewListener listener, ListChangedType type, DataRow row, bool track) { listener.MaintainDataView(changedType, row, track); }); } public void Reset() { DataCommonEventSource.Log.Trace(" {0}", ObjectID); InitRecords(RowFilter); MaintainDataView(ListChangedType.Reset, -1, trackAddRemove: false); FireResetEvent(); } public void RecordChanged(int record) { DataCommonEventSource.Log.Trace(" {0}, record={1}", ObjectID, record); if (DoListChanged) { int index = GetIndex(record); if (index >= 0) { OnListChanged(ListChangedType.ItemChanged, index); } } } public void RecordChanged(int oldIndex, int newIndex) { DataCommonEventSource.Log.Trace(" {0}, oldIndex={1}, newIndex={2}", ObjectID, oldIndex, newIndex); if (oldIndex > -1 || newIndex > -1) { if (oldIndex == newIndex) { OnListChanged(ListChangedType.ItemChanged, newIndex, oldIndex); } else if (oldIndex == -1) { OnListChanged(ListChangedType.ItemAdded, newIndex, oldIndex); } else if (newIndex == -1) { OnListChanged(ListChangedType.ItemDeleted, oldIndex); } else { OnListChanged(ListChangedType.ItemMoved, newIndex, oldIndex); } } } public void RecordStateChanged(int record, DataViewRowState oldState, DataViewRowState newState) { DataCommonEventSource.Log.Trace(" {0}, record={1}, oldState={2}, newState={3}", ObjectID, record, oldState, newState); int changeAction = GetChangeAction(oldState, newState); ApplyChangeAction(record, changeAction, GetReplaceAction(oldState)); } public void RecordStateChanged(int oldRecord, DataViewRowState oldOldState, DataViewRowState oldNewState, int newRecord, DataViewRowState newOldState, DataViewRowState newNewState) { DataCommonEventSource.Log.Trace(" {0}, oldRecord={1}, oldOldState={2}, oldNewState={3}, newRecord={4}, newOldState={5}, newNewState={6}", ObjectID, oldRecord, oldOldState, oldNewState, newRecord, newOldState, newNewState); int changeAction = GetChangeAction(oldOldState, oldNewState); int changeAction2 = GetChangeAction(newOldState, newNewState); if (changeAction == -1 && changeAction2 == 1 && AcceptRecord(newRecord)) { int num = ((_comparison == null || changeAction >= 0) ? GetIndex(oldRecord) : GetIndex(oldRecord, GetReplaceAction(oldOldState))); if (_comparison == null && num != -1 && CompareRecords(oldRecord, newRecord) == 0) { _records.UpdateNodeKey(oldRecord, newRecord); int index = GetIndex(newRecord); OnListChanged(ListChangedType.ItemChanged, index, index); return; } _suspendEvents = true; if (num != -1) { _records.DeleteByIndex(num); _recordCount--; } _records.Insert(newRecord); _recordCount++; _suspendEvents = false; int index2 = GetIndex(newRecord); if (num == index2) { OnListChanged(ListChangedType.ItemChanged, index2, num); } else if (num == -1) { MaintainDataView(ListChangedType.ItemAdded, newRecord, trackAddRemove: false); OnListChanged(ListChangedType.ItemAdded, GetIndex(newRecord)); } else { OnListChanged(ListChangedType.ItemMoved, index2, num); } } else { ApplyChangeAction(oldRecord, changeAction, GetReplaceAction(oldOldState)); ApplyChangeAction(newRecord, changeAction2, GetReplaceAction(newOldState)); } } private void GetUniqueKeyValues(List list, int curNodeId) { if (curNodeId != 0) { GetUniqueKeyValues(list, _records.Left(curNodeId)); int record = _records.Key(curNodeId); object[] array = new object[_indexFields.Length]; for (int i = 0; i < array.Length; i++) { array[i] = _indexFields[i].Column[record]; } list.Add(array); GetUniqueKeyValues(list, _records.Right(curNodeId)); } } internal static int IndexOfReference(List list, T item) where T : class { if (list != null) { for (int i = 0; i < list.Count; i++) { if (list[i] == item) { return i; } } } return -1; } internal static bool ContainsReference(List list, T item) where T : class { return 0 <= IndexOfReference(list, item); } } internal sealed class Listeners where TElem : class { internal delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4); internal delegate TResult Func(T1 arg1); private readonly List _listeners; private readonly Func _filter; private readonly int _objectID; private int _listenerReaderCount; internal bool HasListeners => 0 < _listeners.Count; internal Listeners(int ObjectID, Func notifyFilter) { _listeners = new List(); _filter = notifyFilter; _objectID = ObjectID; _listenerReaderCount = 0; } internal void Add(TElem listener) { _listeners.Add(listener); } internal int IndexOfReference(TElem listener) { return Index.IndexOfReference(_listeners, listener); } internal void Remove(TElem listener) { int index = IndexOfReference(listener); _listeners[index] = null; if (_listenerReaderCount == 0) { _listeners.RemoveAt(index); _listeners.TrimExcess(); } } internal void Notify(T1 arg1, T2 arg2, T3 arg3, Action action) { int count = _listeners.Count; if (0 >= count) { return; } int nullIndex = -1; _listenerReaderCount++; try { for (int i = 0; i < count; i++) { TElem arg4 = _listeners[i]; if (_filter(arg4)) { action(arg4, arg1, arg2, arg3); continue; } _listeners[i] = null; nullIndex = i; } } finally { _listenerReaderCount--; } if (_listenerReaderCount == 0) { RemoveNullListeners(nullIndex); } } private void RemoveNullListeners(int nullIndex) { int num = nullIndex; while (0 <= num) { if (_listeners[num] == null) { _listeners.RemoveAt(num); } num--; } } } [Serializable] internal sealed class SimpleType : ISerializable { private string _baseType; private SimpleType _baseSimpleType; private XmlQualifiedName _xmlBaseType; private string _name = string.Empty; private int _length = -1; private int _minLength = -1; private int _maxLength = -1; private string _pattern = string.Empty; private string _ns = string.Empty; private string _maxExclusive = string.Empty; private string _maxInclusive = string.Empty; private string _minExclusive = string.Empty; private string _minInclusive = string.Empty; internal string _enumeration = string.Empty; internal string BaseType => _baseType; internal XmlQualifiedName XmlBaseType => _xmlBaseType; internal string Name => _name; internal string Namespace => _ns; internal int Length => _length; internal int MaxLength { get { return _maxLength; } set { _maxLength = value; } } internal SimpleType BaseSimpleType => _baseSimpleType; public string SimpleTypeQualifiedName { get { if (_ns.Length == 0) { return _name; } return _ns + ":" + _name; } } internal SimpleType(string baseType) { _baseType = baseType; } internal SimpleType(XmlSchemaSimpleType node) { _name = node.Name; _ns = ((node.QualifiedName != null) ? node.QualifiedName.Namespace : ""); LoadTypeValues(node); } void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { throw new PlatformNotSupportedException(); } internal void LoadTypeValues(XmlSchemaSimpleType node) { if (node.Content is XmlSchemaSimpleTypeList || node.Content is XmlSchemaSimpleTypeUnion) { throw ExceptionBuilder.SimpleTypeNotSupported(); } if (node.Content is XmlSchemaSimpleTypeRestriction) { XmlSchemaSimpleTypeRestriction xmlSchemaSimpleTypeRestriction = (XmlSchemaSimpleTypeRestriction)node.Content; if (node.BaseXmlSchemaType is XmlSchemaSimpleType xmlSchemaSimpleType && xmlSchemaSimpleType.QualifiedName.Namespace != "http://www.w3.org/2001/XMLSchema") { _baseSimpleType = new SimpleType(node.BaseXmlSchemaType as XmlSchemaSimpleType); } if (xmlSchemaSimpleTypeRestriction.BaseTypeName.Namespace == "http://www.w3.org/2001/XMLSchema") { _baseType = xmlSchemaSimpleTypeRestriction.BaseTypeName.Name; } else { _baseType = xmlSchemaSimpleTypeRestriction.BaseTypeName.ToString(); } if (_baseSimpleType != null && _baseSimpleType.Name != null && _baseSimpleType.Name.Length > 0) { _xmlBaseType = _baseSimpleType.XmlBaseType; } else { _xmlBaseType = xmlSchemaSimpleTypeRestriction.BaseTypeName; } if (_baseType == null || _baseType.Length == 0) { _baseType = xmlSchemaSimpleTypeRestriction.BaseType.Name; _xmlBaseType = null; } if (_baseType == "NOTATION") { _baseType = "string"; } foreach (XmlSchemaFacet facet in xmlSchemaSimpleTypeRestriction.Facets) { if (facet is XmlSchemaLengthFacet) { _length = Convert.ToInt32(facet.Value, null); } if (facet is XmlSchemaMinLengthFacet) { _minLength = Convert.ToInt32(facet.Value, null); } if (facet is XmlSchemaMaxLengthFacet) { _maxLength = Convert.ToInt32(facet.Value, null); } if (facet is XmlSchemaPatternFacet) { _pattern = facet.Value; } if (facet is XmlSchemaEnumerationFacet) { _enumeration = ((!string.IsNullOrEmpty(_enumeration)) ? (_enumeration + " " + facet.Value) : facet.Value); } if (facet is XmlSchemaMinExclusiveFacet) { _minExclusive = facet.Value; } if (facet is XmlSchemaMinInclusiveFacet) { _minInclusive = facet.Value; } if (facet is XmlSchemaMaxExclusiveFacet) { _maxExclusive = facet.Value; } if (facet is XmlSchemaMaxInclusiveFacet) { _maxInclusive = facet.Value; } } } string msdataAttribute = XSDSchema.GetMsdataAttribute(node, "targetNamespace"); if (msdataAttribute != null) { _ns = msdataAttribute; } } internal bool IsPlainString() { if (XSDSchema.QualifiedName(_baseType) == XSDSchema.QualifiedName("string") && string.IsNullOrEmpty(_name) && _length == -1 && _minLength == -1 && _maxLength == -1 && string.IsNullOrEmpty(_pattern) && string.IsNullOrEmpty(_maxExclusive) && string.IsNullOrEmpty(_maxInclusive) && string.IsNullOrEmpty(_minExclusive) && string.IsNullOrEmpty(_minInclusive)) { return string.IsNullOrEmpty(_enumeration); } return false; } internal string QualifiedName(string name) { if (name.IndexOf(':') == -1) { return "xs:" + name; } return name; } internal XmlNode ToNode(XmlDocument dc, Hashtable prefixes, bool inRemoting) { XmlElement xmlElement = dc.CreateElement("xs", "simpleType", "http://www.w3.org/2001/XMLSchema"); if (_name != null && _name.Length != 0) { xmlElement.SetAttribute("name", _name); if (inRemoting) { xmlElement.SetAttribute("targetNamespace", "urn:schemas-microsoft-com:xml-msdata", Namespace); } } XmlElement xmlElement2 = dc.CreateElement("xs", "restriction", "http://www.w3.org/2001/XMLSchema"); if (!inRemoting) { if (_baseSimpleType != null) { if (_baseSimpleType.Namespace != null && _baseSimpleType.Namespace.Length > 0) { string text = ((prefixes != null) ? ((string)prefixes[_baseSimpleType.Namespace]) : null); if (text != null) { xmlElement2.SetAttribute("base", text + ":" + _baseSimpleType.Name); } else { xmlElement2.SetAttribute("base", _baseSimpleType.Name); } } else { xmlElement2.SetAttribute("base", _baseSimpleType.Name); } } else { xmlElement2.SetAttribute("base", QualifiedName(_baseType)); } } else { xmlElement2.SetAttribute("base", (_baseSimpleType != null) ? _baseSimpleType.Name : QualifiedName(_baseType)); } if (_length >= 0) { XmlElement xmlElement3 = dc.CreateElement("xs", "length", "http://www.w3.org/2001/XMLSchema"); xmlElement3.SetAttribute("value", _length.ToString(CultureInfo.InvariantCulture)); xmlElement2.AppendChild(xmlElement3); } if (_maxLength >= 0) { XmlElement xmlElement3 = dc.CreateElement("xs", "maxLength", "http://www.w3.org/2001/XMLSchema"); xmlElement3.SetAttribute("value", _maxLength.ToString(CultureInfo.InvariantCulture)); xmlElement2.AppendChild(xmlElement3); } xmlElement.AppendChild(xmlElement2); return xmlElement; } internal static SimpleType CreateEnumeratedType(string values) { return new SimpleType("string") { _enumeration = values }; } internal static SimpleType CreateByteArrayType(string encoding) { return new SimpleType("base64Binary"); } internal static SimpleType CreateLimitedStringType(int length) { return new SimpleType("string") { _maxLength = length }; } internal static SimpleType CreateSimpleType(StorageType typeCode, Type type) { if (typeCode == StorageType.Char && type == typeof(char)) { return new SimpleType("string") { _length = 1 }; } return null; } internal string HasConflictingDefinition(SimpleType otherSimpleType) { if (otherSimpleType == null) { return "otherSimpleType"; } if (MaxLength != otherSimpleType.MaxLength) { return "MaxLength"; } if (!string.Equals(BaseType, otherSimpleType.BaseType, StringComparison.Ordinal)) { return "BaseType"; } if (BaseSimpleType != null && otherSimpleType.BaseSimpleType != null && BaseSimpleType.HasConflictingDefinition(otherSimpleType.BaseSimpleType).Length != 0) { return "BaseSimpleType"; } return string.Empty; } internal bool CanHaveMaxLength() { SimpleType simpleType = this; while (simpleType.BaseSimpleType != null) { simpleType = simpleType.BaseSimpleType; } return string.Equals(simpleType.BaseType, "string", StringComparison.OrdinalIgnoreCase); } internal void ConvertToAnnonymousSimpleType() { _name = null; _ns = string.Empty; SimpleType simpleType = this; while (simpleType._baseSimpleType != null) { simpleType = simpleType._baseSimpleType; } _baseType = simpleType._baseType; _baseSimpleType = simpleType._baseSimpleType; _xmlBaseType = simpleType._xmlBaseType; } } public enum SqlDbType { BigInt = 0, Binary = 1, Bit = 2, Char = 3, DateTime = 4, Decimal = 5, Float = 6, Image = 7, Int = 8, Money = 9, NChar = 10, NText = 11, NVarChar = 12, Real = 13, UniqueIdentifier = 14, SmallDateTime = 15, SmallInt = 16, SmallMoney = 17, Text = 18, Timestamp = 19, TinyInt = 20, VarBinary = 21, VarChar = 22, Variant = 23, Xml = 25, Udt = 29, Structured = 30, Date = 31, Time = 32, DateTime2 = 33, DateTimeOffset = 34 } public sealed class StateChangeEventArgs : EventArgs { private ConnectionState _originalState; private ConnectionState _currentState; public ConnectionState CurrentState => _currentState; public ConnectionState OriginalState => _originalState; public StateChangeEventArgs(ConnectionState originalState, ConnectionState currentState) { _originalState = originalState; _currentState = currentState; } } public delegate void StateChangeEventHandler(object sender, StateChangeEventArgs e); public sealed class StatementCompletedEventArgs : EventArgs { public int RecordCount { get; } public StatementCompletedEventArgs(int recordCount) { RecordCount = recordCount; } } public delegate void StatementCompletedEventHandler(object sender, StatementCompletedEventArgs e); public enum StatementType { Select, Insert, Update, Delete, Batch } [Serializable] public class StrongTypingException : DataException { protected StrongTypingException(SerializationInfo info, StreamingContext context) : base(info, context) { throw new PlatformNotSupportedException(); } public StrongTypingException() { base.HResult = -2146232021; } public StrongTypingException(string message) : base(message) { base.HResult = -2146232021; } public StrongTypingException(string s, Exception innerException) : base(s, innerException) { base.HResult = -2146232021; } } [DefaultProperty("ConstraintName")] public class UniqueConstraint : Constraint { private DataKey _key; private Index _constraintIndex; internal bool _bPrimaryKey; internal string _constraintName; internal string[] _columnNames; internal string[] ColumnNames => _key.GetColumnNames(); internal Index ConstraintIndex => _constraintIndex; [ReadOnly(true)] public virtual DataColumn[] Columns => _key.ToArray(); internal DataColumn[] ColumnsReference => _key.ColumnsReference; public bool IsPrimaryKey { get { if (Table == null) { return false; } return this == Table._primaryKey; } } internal override bool InCollection { set { base.InCollection = value; if (_key.ColumnsReference.Length == 1) { _key.ColumnsReference[0].InternalUnique(value); } } } internal DataKey Key => _key; [ReadOnly(true)] public override DataTable Table { get { if (_key.HasValue) { return _key.Table; } return null; } } public UniqueConstraint(string name, DataColumn column) { Create(name, new DataColumn[1] { column }); } public UniqueConstraint(DataColumn column) { Create(null, new DataColumn[1] { column }); } public UniqueConstraint(string name, DataColumn[] columns) { Create(name, columns); } public UniqueConstraint(DataColumn[] columns) { Create(null, columns); } [Browsable(false)] public UniqueConstraint(string name, string[] columnNames, bool isPrimaryKey) { _constraintName = name; _columnNames = columnNames; _bPrimaryKey = isPrimaryKey; } public UniqueConstraint(string name, DataColumn column, bool isPrimaryKey) { DataColumn[] columns = new DataColumn[1] { column }; _bPrimaryKey = isPrimaryKey; Create(name, columns); } public UniqueConstraint(DataColumn column, bool isPrimaryKey) { DataColumn[] columns = new DataColumn[1] { column }; _bPrimaryKey = isPrimaryKey; Create(null, columns); } public UniqueConstraint(string name, DataColumn[] columns, bool isPrimaryKey) { _bPrimaryKey = isPrimaryKey; Create(name, columns); } public UniqueConstraint(DataColumn[] columns, bool isPrimaryKey) { _bPrimaryKey = isPrimaryKey; Create(null, columns); } [Conditional("DEBUG")] private void AssertConstraintAndKeyIndexes() { DataColumn[] array = new DataColumn[_constraintIndex._indexFields.Length]; for (int i = 0; i < array.Length; i++) { array[i] = _constraintIndex._indexFields[i].Column; } } internal void ConstraintIndexClear() { if (_constraintIndex != null) { _constraintIndex.RemoveRef(); _constraintIndex = null; } } internal void ConstraintIndexInitialize() { if (_constraintIndex == null) { _constraintIndex = _key.GetSortIndex(); _constraintIndex.AddRef(); } } internal override void CheckState() { NonVirtualCheckState(); } private void NonVirtualCheckState() { _key.CheckState(); } internal override void CheckCanAddToCollection(ConstraintCollection constraints) { } internal override bool CanBeRemovedFromCollection(ConstraintCollection constraints, bool fThrowException) { if (Equals(constraints.Table._primaryKey)) { if (!fThrowException) { return false; } throw ExceptionBuilder.RemovePrimaryKey(constraints.Table); } ParentForeignKeyConstraintEnumerator parentForeignKeyConstraintEnumerator = new ParentForeignKeyConstraintEnumerator(Table.DataSet, Table); while (parentForeignKeyConstraintEnumerator.GetNext()) { ForeignKeyConstraint foreignKeyConstraint = parentForeignKeyConstraintEnumerator.GetForeignKeyConstraint(); if (_key.ColumnsEqual(foreignKeyConstraint.ParentKey)) { if (!fThrowException) { return false; } throw ExceptionBuilder.NeededForForeignKeyConstraint(this, foreignKeyConstraint); } } return true; } internal override bool CanEnableConstraint() { if (Table.EnforceConstraints) { return ConstraintIndex.CheckUnique(); } return true; } internal override bool IsConstraintViolated() { bool result = false; Index constraintIndex = ConstraintIndex; if (constraintIndex.HasDuplicates) { object[] uniqueKeyValues = constraintIndex.GetUniqueKeyValues(); for (int i = 0; i < uniqueKeyValues.Length; i++) { Range range = constraintIndex.FindRecords((object[])uniqueKeyValues[i]); if (1 >= range.Count) { continue; } DataRow[] rows = constraintIndex.GetRows(range); string text = ExceptionBuilder.UniqueConstraintViolationText(_key.ColumnsReference, (object[])uniqueKeyValues[i]); for (int j = 0; j < rows.Length; j++) { rows[j].RowError = text; DataColumn[] columnsReference = _key.ColumnsReference; foreach (DataColumn column in columnsReference) { rows[j].SetColumnError(column, text); } } result = true; } } return result; } internal override void CheckConstraint(DataRow row, DataRowAction action) { if (!Table.EnforceConstraints) { return; } switch (action) { case DataRowAction.Rollback: if (row._tempRecord == -1) { break; } goto case DataRowAction.Change; case DataRowAction.Change: case DataRowAction.Add: if (row.HaveValuesChanged(ColumnsReference) && ConstraintIndex.IsKeyRecordInIndex(row.GetDefaultRecord())) { object[] columnValues = row.GetColumnValues(ColumnsReference); throw ExceptionBuilder.ConstraintViolation(ColumnsReference, columnValues); } break; } } internal override bool ContainsColumn(DataColumn column) { return _key.ContainsColumn(column); } internal override Constraint Clone(DataSet destination) { return Clone(destination, ignorNSforTableLookup: false); } internal override Constraint Clone(DataSet destination, bool ignorNSforTableLookup) { int num = ((!ignorNSforTableLookup) ? destination.Tables.IndexOf(Table.TableName, Table.Namespace, chekforNull: false) : destination.Tables.IndexOf(Table.TableName)); if (num < 0) { return null; } DataTable dataTable = destination.Tables[num]; int num2 = ColumnsReference.Length; DataColumn[] array = new DataColumn[num2]; for (int i = 0; i < num2; i++) { DataColumn dataColumn = ColumnsReference[i]; num = dataTable.Columns.IndexOf(dataColumn.ColumnName); if (num < 0) { return null; } array[i] = dataTable.Columns[num]; } UniqueConstraint uniqueConstraint = new UniqueConstraint(ConstraintName, array); foreach (object key in base.ExtendedProperties.Keys) { uniqueConstraint.ExtendedProperties[key] = base.ExtendedProperties[key]; } return uniqueConstraint; } internal UniqueConstraint Clone(DataTable table) { int num = ColumnsReference.Length; DataColumn[] array = new DataColumn[num]; for (int i = 0; i < num; i++) { DataColumn dataColumn = ColumnsReference[i]; int num2 = table.Columns.IndexOf(dataColumn.ColumnName); if (num2 < 0) { return null; } array[i] = table.Columns[num2]; } UniqueConstraint uniqueConstraint = new UniqueConstraint(ConstraintName, array); foreach (object key in base.ExtendedProperties.Keys) { uniqueConstraint.ExtendedProperties[key] = base.ExtendedProperties[key]; } return uniqueConstraint; } private void Create(string constraintName, DataColumn[] columns) { for (int i = 0; i < columns.Length; i++) { if (columns[i].Computed) { throw ExceptionBuilder.ExpressionInConstraint(columns[i]); } } _key = new DataKey(columns, copyColumns: true); ConstraintName = constraintName; NonVirtualCheckState(); } public override bool Equals(object key2) { if (!(key2 is UniqueConstraint)) { return false; } return Key.ColumnsEqual(((UniqueConstraint)key2).Key); } public override int GetHashCode() { return base.GetHashCode(); } } public enum UpdateRowSource { None, OutputParameters, FirstReturnedRecord, Both } internal sealed class XDRSchema : XMLSchema { private sealed class NameType : IComparable { public string name; public Type type; public NameType(string n, Type t) { name = n; type = t; } public int CompareTo(object obj) { return string.Compare(name, (string)obj, StringComparison.Ordinal); } } internal string _schemaName; internal string _schemaUri; internal XmlElement _schemaRoot; internal DataSet _ds; private static readonly char[] s_colonArray = new char[1] { ':' }; private static NameType[] s_mapNameTypeXdr = new NameType[36] { new NameType("bin.base64", typeof(byte[])), new NameType("bin.hex", typeof(byte[])), new NameType("boolean", typeof(bool)), new NameType("byte", typeof(sbyte)), new NameType("char", typeof(char)), new NameType("date", typeof(DateTime)), new NameType("dateTime", typeof(DateTime)), new NameType("dateTime.tz", typeof(DateTime)), new NameType("entities", typeof(string)), new NameType("entity", typeof(string)), new NameType("enumeration", typeof(string)), new NameType("fixed.14.4", typeof(decimal)), new NameType("float", typeof(double)), new NameType("i1", typeof(sbyte)), new NameType("i2", typeof(short)), new NameType("i4", typeof(int)), new NameType("i8", typeof(long)), new NameType("id", typeof(string)), new NameType("idref", typeof(string)), new NameType("idrefs", typeof(string)), new NameType("int", typeof(int)), new NameType("nmtoken", typeof(string)), new NameType("nmtokens", typeof(string)), new NameType("notation", typeof(string)), new NameType("number", typeof(decimal)), new NameType("r4", typeof(float)), new NameType("r8", typeof(double)), new NameType("string", typeof(string)), new NameType("time", typeof(DateTime)), new NameType("time.tz", typeof(DateTime)), new NameType("ui1", typeof(byte)), new NameType("ui2", typeof(ushort)), new NameType("ui4", typeof(uint)), new NameType("ui8", typeof(ulong)), new NameType("uri", typeof(string)), new NameType("uuid", typeof(Guid)) }; private static NameType s_enumerationNameType = FindNameType("enumeration"); internal XDRSchema(DataSet ds, bool fInline) { _schemaUri = string.Empty; _schemaName = string.Empty; _schemaRoot = null; _ds = ds; } internal void LoadSchema(XmlElement schemaRoot, DataSet ds) { if (schemaRoot == null) { return; } _schemaRoot = schemaRoot; _ds = ds; _schemaName = schemaRoot.GetAttribute("name"); _schemaUri = string.Empty; if (_schemaName == null || _schemaName.Length == 0) { _schemaName = "NewDataSet"; } ds.Namespace = _schemaUri; for (XmlNode xmlNode = schemaRoot.FirstChild; xmlNode != null; xmlNode = xmlNode.NextSibling) { if (xmlNode is XmlElement) { XmlElement node = (XmlElement)xmlNode; if (XMLSchema.FEqualIdentity(node, "ElementType", "urn:schemas-microsoft-com:xml-data")) { HandleTable(node); } } } _schemaName = XmlConvert.DecodeName(_schemaName); if (ds.Tables[_schemaName] == null) { ds.DataSetName = _schemaName; } } internal XmlElement FindTypeNode(XmlElement node) { if (XMLSchema.FEqualIdentity(node, "ElementType", "urn:schemas-microsoft-com:xml-data")) { return node; } string attribute = node.GetAttribute("type"); if (XMLSchema.FEqualIdentity(node, "element", "urn:schemas-microsoft-com:xml-data") || XMLSchema.FEqualIdentity(node, "attribute", "urn:schemas-microsoft-com:xml-data")) { if (attribute == null || attribute.Length == 0) { return null; } XmlNode xmlNode = node.OwnerDocument.FirstChild; XmlNode ownerDocument = node.OwnerDocument; while (xmlNode != ownerDocument) { if (((XMLSchema.FEqualIdentity(xmlNode, "ElementType", "urn:schemas-microsoft-com:xml-data") && XMLSchema.FEqualIdentity(node, "element", "urn:schemas-microsoft-com:xml-data")) || (XMLSchema.FEqualIdentity(xmlNode, "AttributeType", "urn:schemas-microsoft-com:xml-data") && XMLSchema.FEqualIdentity(node, "attribute", "urn:schemas-microsoft-com:xml-data"))) && xmlNode is XmlElement && ((XmlElement)xmlNode).GetAttribute("name") == attribute) { return (XmlElement)xmlNode; } if (xmlNode.FirstChild != null) { xmlNode = xmlNode.FirstChild; continue; } if (xmlNode.NextSibling != null) { xmlNode = xmlNode.NextSibling; continue; } while (xmlNode != ownerDocument) { xmlNode = xmlNode.ParentNode; if (xmlNode.NextSibling != null) { xmlNode = xmlNode.NextSibling; break; } } } return null; } return null; } internal bool IsTextOnlyContent(XmlElement node) { string attribute = node.GetAttribute("content"); if (attribute == null || attribute.Length == 0) { return !string.IsNullOrEmpty(node.GetAttribute("type", "urn:schemas-microsoft-com:datatypes")); } switch (attribute) { case "empty": case "eltOnly": case "elementOnly": case "mixed": return false; case "textOnly": return true; default: throw ExceptionBuilder.InvalidAttributeValue("content", attribute); } } internal bool IsXDRField(XmlElement node, XmlElement typeNode) { int minOccurs = 1; int maxOccurs = 1; if (!IsTextOnlyContent(typeNode)) { return false; } for (XmlNode xmlNode = typeNode.FirstChild; xmlNode != null; xmlNode = xmlNode.NextSibling) { if (XMLSchema.FEqualIdentity(xmlNode, "element", "urn:schemas-microsoft-com:xml-data") || XMLSchema.FEqualIdentity(xmlNode, "attribute", "urn:schemas-microsoft-com:xml-data")) { return false; } } if (XMLSchema.FEqualIdentity(node, "element", "urn:schemas-microsoft-com:xml-data")) { GetMinMax(node, ref minOccurs, ref maxOccurs); if (maxOccurs == -1 || maxOccurs > 1) { return false; } } return true; } internal DataTable HandleTable(XmlElement node) { XmlElement xmlElement = FindTypeNode(node); string attribute = node.GetAttribute("minOccurs"); if (attribute != null && attribute.Length > 0 && Convert.ToInt32(attribute, CultureInfo.InvariantCulture) > 1 && xmlElement == null) { return InstantiateSimpleTable(_ds, node); } attribute = node.GetAttribute("maxOccurs"); if (attribute != null && attribute.Length > 0 && !string.Equals(attribute, "1", StringComparison.Ordinal) && xmlElement == null) { return InstantiateSimpleTable(_ds, node); } if (xmlElement == null) { return null; } if (IsXDRField(node, xmlElement)) { return null; } return InstantiateTable(_ds, node, xmlElement); } private static NameType FindNameType(string name) { int num = Array.BinarySearch(s_mapNameTypeXdr, name); if (num < 0) { throw ExceptionBuilder.UndefinedDatatype(name); } return s_mapNameTypeXdr[num]; } private Type ParseDataType(string dt, string dtValues) { string name = dt; string[] array = dt.Split(s_colonArray); if (array.Length > 2) { throw ExceptionBuilder.InvalidAttributeValue("type", dt); } if (array.Length == 2) { name = array[1]; } NameType nameType = FindNameType(name); if (nameType == s_enumerationNameType && (dtValues == null || dtValues.Length == 0)) { throw ExceptionBuilder.MissingAttribute("type", "values"); } return nameType.type; } internal string GetInstanceName(XmlElement node) { string attribute; if (XMLSchema.FEqualIdentity(node, "ElementType", "urn:schemas-microsoft-com:xml-data") || XMLSchema.FEqualIdentity(node, "AttributeType", "urn:schemas-microsoft-com:xml-data")) { attribute = node.GetAttribute("name"); if (attribute == null || attribute.Length == 0) { throw ExceptionBuilder.MissingAttribute("Element", "name"); } } else { attribute = node.GetAttribute("type"); if (attribute == null || attribute.Length == 0) { throw ExceptionBuilder.MissingAttribute("Element", "type"); } } return attribute; } internal void HandleColumn(XmlElement node, DataTable table) { int minOccurs = 0; int maxOccurs = 1; node.GetAttribute("use"); string name; DataColumn dataColumn; if (node.Attributes.Count > 0) { string attribute = node.GetAttribute("ref"); if (attribute != null && attribute.Length > 0) { return; } string text = (name = GetInstanceName(node)); dataColumn = table.Columns[name, _schemaUri]; if (dataColumn != null) { if (dataColumn.ColumnMapping == MappingType.Attribute) { if (XMLSchema.FEqualIdentity(node, "attribute", "urn:schemas-microsoft-com:xml-data")) { throw ExceptionBuilder.DuplicateDeclaration(text); } } else if (XMLSchema.FEqualIdentity(node, "element", "urn:schemas-microsoft-com:xml-data")) { throw ExceptionBuilder.DuplicateDeclaration(text); } name = XMLSchema.GenUniqueColumnName(text, table); } } else { name = string.Empty; } XmlElement xmlElement = FindTypeNode(node); SimpleType simpleType = null; string attribute2; if (xmlElement == null) { attribute2 = node.GetAttribute("type"); throw ExceptionBuilder.UndefinedDatatype(attribute2); } attribute2 = xmlElement.GetAttribute("type", "urn:schemas-microsoft-com:datatypes"); string attribute3 = xmlElement.GetAttribute("values", "urn:schemas-microsoft-com:datatypes"); Type type; if (attribute2 == null || attribute2.Length == 0) { attribute2 = string.Empty; type = typeof(string); } else { type = ParseDataType(attribute2, attribute3); if (attribute2 == "float") { attribute2 = string.Empty; } if (attribute2 == "char") { attribute2 = string.Empty; simpleType = SimpleType.CreateSimpleType(StorageType.Char, type); } if (attribute2 == "enumeration") { attribute2 = string.Empty; simpleType = SimpleType.CreateEnumeratedType(attribute3); } if (attribute2 == "bin.base64") { attribute2 = string.Empty; simpleType = SimpleType.CreateByteArrayType("base64"); } if (attribute2 == "bin.hex") { attribute2 = string.Empty; simpleType = SimpleType.CreateByteArrayType("hex"); } } bool flag = XMLSchema.FEqualIdentity(node, "attribute", "urn:schemas-microsoft-com:xml-data"); GetMinMax(node, flag, ref minOccurs, ref maxOccurs); string text2 = null; text2 = node.GetAttribute("default"); bool flag2 = false; dataColumn = new DataColumn(XmlConvert.DecodeName(name), type, null, (!flag) ? MappingType.Element : MappingType.Attribute); XMLSchema.SetProperties(dataColumn, node.Attributes); dataColumn.XmlDataType = attribute2; dataColumn.SimpleType = simpleType; dataColumn.AllowDBNull = minOccurs == 0 || flag2; dataColumn.Namespace = (flag ? string.Empty : _schemaUri); if (node.Attributes != null) { for (int i = 0; i < node.Attributes.Count; i++) { if (node.Attributes[i].NamespaceURI == "urn:schemas-microsoft-com:xml-msdata" && node.Attributes[i].LocalName == "Expression") { dataColumn.Expression = node.Attributes[i].Value; break; } } } string attribute4 = node.GetAttribute("targetNamespace"); if (attribute4 != null && attribute4.Length > 0) { dataColumn.Namespace = attribute4; } table.Columns.Add(dataColumn); if (text2 != null && text2.Length != 0) { try { dataColumn.DefaultValue = SqlConvert.ChangeTypeForXML(text2, type); } catch (FormatException) { throw ExceptionBuilder.CannotConvert(text2, type.FullName); } } } internal void GetMinMax(XmlElement elNode, ref int minOccurs, ref int maxOccurs) { GetMinMax(elNode, isAttribute: false, ref minOccurs, ref maxOccurs); } internal void GetMinMax(XmlElement elNode, bool isAttribute, ref int minOccurs, ref int maxOccurs) { string attribute = elNode.GetAttribute("minOccurs"); if (attribute != null && attribute.Length > 0) { try { minOccurs = int.Parse(attribute, CultureInfo.InvariantCulture); } catch (Exception e) when (ADP.IsCatchableExceptionType(e)) { throw ExceptionBuilder.AttributeValues("minOccurs", "0", "1"); } } attribute = elNode.GetAttribute("maxOccurs"); if (attribute == null || attribute.Length <= 0) { return; } if (string.Compare(attribute, "*", StringComparison.Ordinal) == 0) { maxOccurs = -1; return; } try { maxOccurs = int.Parse(attribute, CultureInfo.InvariantCulture); } catch (Exception e2) when (ADP.IsCatchableExceptionType(e2)) { throw ExceptionBuilder.AttributeValues("maxOccurs", "1", "*"); } if (maxOccurs == 1) { return; } throw ExceptionBuilder.AttributeValues("maxOccurs", "1", "*"); } internal void HandleTypeNode(XmlElement typeNode, DataTable table, ArrayList tableChildren) { for (XmlNode xmlNode = typeNode.FirstChild; xmlNode != null; xmlNode = xmlNode.NextSibling) { if (!(xmlNode is XmlElement)) { continue; } if (XMLSchema.FEqualIdentity(xmlNode, "element", "urn:schemas-microsoft-com:xml-data")) { DataTable dataTable = HandleTable((XmlElement)xmlNode); if (dataTable != null) { tableChildren.Add(dataTable); continue; } } if (XMLSchema.FEqualIdentity(xmlNode, "attribute", "urn:schemas-microsoft-com:xml-data") || XMLSchema.FEqualIdentity(xmlNode, "element", "urn:schemas-microsoft-com:xml-data")) { HandleColumn((XmlElement)xmlNode, table); } } } internal DataTable InstantiateTable(DataSet dataSet, XmlElement node, XmlElement typeNode) { string name = string.Empty; XmlAttributeCollection attributes = node.Attributes; int minOccurs = 1; int maxOccurs = 1; string text = null; ArrayList arrayList = new ArrayList(); DataTable table; if (attributes.Count > 0) { name = GetInstanceName(node); table = dataSet.Tables.GetTable(name, _schemaUri); if (table != null) { return table; } } table = new DataTable(XmlConvert.DecodeName(name)); table.Namespace = _schemaUri; GetMinMax(node, ref minOccurs, ref maxOccurs); table.MinOccurs = minOccurs; table.MaxOccurs = maxOccurs; _ds.Tables.Add(table); HandleTypeNode(typeNode, table, arrayList); XMLSchema.SetProperties(table, attributes); if (text != null) { string[] array = text.TrimEnd(null).Split((char[]?)null); int num = array.Length; DataColumn[] array2 = new DataColumn[num]; for (int i = 0; i < num; i++) { DataColumn dataColumn = table.Columns[array[i], _schemaUri]; if (dataColumn == null) { throw ExceptionBuilder.ElementTypeNotFound(array[i]); } array2[i] = dataColumn; } table.PrimaryKey = array2; } foreach (DataTable item in arrayList) { DataRelation dataRelation = null; DataRelationCollection childRelations = table.ChildRelations; for (int j = 0; j < childRelations.Count; j++) { if (childRelations[j].Nested && item == childRelations[j].ChildTable) { dataRelation = childRelations[j]; } } if (dataRelation == null) { DataColumn dataColumn2 = table.AddUniqueKey(); DataColumn childColumn = item.AddForeignKey(dataColumn2); dataRelation = new DataRelation(table.TableName + "_" + item.TableName, dataColumn2, childColumn, createConstraints: true); dataRelation.CheckMultipleNested = false; dataRelation.Nested = true; item.DataSet.Relations.Add(dataRelation); dataRelation.CheckMultipleNested = true; } } return table; } internal DataTable InstantiateSimpleTable(DataSet dataSet, XmlElement node) { XmlAttributeCollection attributes = node.Attributes; int minOccurs = 1; int maxOccurs = 1; string instanceName = GetInstanceName(node); DataTable table = dataSet.Tables.GetTable(instanceName, _schemaUri); if (table != null) { throw ExceptionBuilder.DuplicateDeclaration(instanceName); } string text = XmlConvert.DecodeName(instanceName); table = new DataTable(text); table.Namespace = _schemaUri; GetMinMax(node, ref minOccurs, ref maxOccurs); table.MinOccurs = minOccurs; table.MaxOccurs = maxOccurs; XMLSchema.SetProperties(table, attributes); table._repeatableElement = true; HandleColumn(node, table); table.Columns[0].ColumnName = text + "_Column"; _ds.Tables.Add(table); return table; } } internal sealed class XMLDiffLoader { private ArrayList _tables; private DataSet _dataSet; private DataTable _dataTable; internal void LoadDiffGram(DataSet ds, XmlReader dataTextReader) { XmlReader xmlReader = DataTextReader.CreateReader(dataTextReader); _dataSet = ds; while (xmlReader.LocalName == "before" && xmlReader.NamespaceURI == "urn:schemas-microsoft-com:xml-diffgram-v1") { ProcessDiffs(ds, xmlReader); xmlReader.Read(); } while (xmlReader.LocalName == "errors" && xmlReader.NamespaceURI == "urn:schemas-microsoft-com:xml-diffgram-v1") { ProcessErrors(ds, xmlReader); xmlReader.Read(); } } private void CreateTablesHierarchy(DataTable dt) { foreach (DataRelation childRelation in dt.ChildRelations) { if (!_tables.Contains(childRelation.ChildTable)) { _tables.Add(childRelation.ChildTable); CreateTablesHierarchy(childRelation.ChildTable); } } } internal void LoadDiffGram(DataTable dt, XmlReader dataTextReader) { XmlReader xmlReader = DataTextReader.CreateReader(dataTextReader); _dataTable = dt; _tables = new ArrayList(); _tables.Add(dt); CreateTablesHierarchy(dt); while (xmlReader.LocalName == "before" && xmlReader.NamespaceURI == "urn:schemas-microsoft-com:xml-diffgram-v1") { ProcessDiffs(_tables, xmlReader); xmlReader.Read(); } while (xmlReader.LocalName == "errors" && xmlReader.NamespaceURI == "urn:schemas-microsoft-com:xml-diffgram-v1") { ProcessErrors(_tables, xmlReader); xmlReader.Read(); } } internal void ProcessDiffs(DataSet ds, XmlReader ssync) { int pos = -1; int depth = ssync.Depth; ssync.Read(); SkipWhitespaces(ssync); while (depth < ssync.Depth) { DataTable table = null; string text = null; int num = -1; _ = ssync.Depth; text = ssync.GetAttribute("id", "urn:schemas-microsoft-com:xml-diffgram-v1"); bool flag = ssync.GetAttribute("hasErrors", "urn:schemas-microsoft-com:xml-diffgram-v1") == "true"; num = ReadOldRowData(ds, ref table, ref pos, ssync); if (num == -1) { continue; } if (table == null) { throw ExceptionBuilder.DiffgramMissingSQL(); } DataRow dataRow = (DataRow)table.RowDiffId[text]; if (dataRow != null) { dataRow._oldRecord = num; table._recordManager[num] = dataRow; continue; } dataRow = table.NewEmptyRow(); table._recordManager[num] = dataRow; dataRow._oldRecord = num; dataRow._newRecord = num; table.Rows.DiffInsertAt(dataRow, pos); dataRow.Delete(); if (flag) { table.RowDiffId[text] = dataRow; } } } internal void ProcessDiffs(ArrayList tableList, XmlReader ssync) { int pos = -1; int depth = ssync.Depth; ssync.Read(); while (depth < ssync.Depth) { DataTable table = null; string text = null; int num = -1; _ = ssync.Depth; text = ssync.GetAttribute("id", "urn:schemas-microsoft-com:xml-diffgram-v1"); bool flag = ssync.GetAttribute("hasErrors", "urn:schemas-microsoft-com:xml-diffgram-v1") == "true"; num = ReadOldRowData(_dataSet, ref table, ref pos, ssync); if (num == -1) { continue; } if (table == null) { throw ExceptionBuilder.DiffgramMissingSQL(); } DataRow dataRow = (DataRow)table.RowDiffId[text]; if (dataRow != null) { dataRow._oldRecord = num; table._recordManager[num] = dataRow; continue; } dataRow = table.NewEmptyRow(); table._recordManager[num] = dataRow; dataRow._oldRecord = num; dataRow._newRecord = num; table.Rows.DiffInsertAt(dataRow, pos); dataRow.Delete(); if (flag) { table.RowDiffId[text] = dataRow; } } } internal void ProcessErrors(DataSet ds, XmlReader ssync) { int depth = ssync.Depth; ssync.Read(); while (depth < ssync.Depth) { DataTable table = ds.Tables.GetTable(XmlConvert.DecodeName(ssync.LocalName), ssync.NamespaceURI); if (table == null) { throw ExceptionBuilder.DiffgramMissingSQL(); } string attribute = ssync.GetAttribute("id", "urn:schemas-microsoft-com:xml-diffgram-v1"); DataRow dataRow = (DataRow)table.RowDiffId[attribute]; string attribute2 = ssync.GetAttribute("Error", "urn:schemas-microsoft-com:xml-diffgram-v1"); if (attribute2 != null) { dataRow.RowError = attribute2; } int depth2 = ssync.Depth; ssync.Read(); while (depth2 < ssync.Depth) { if (XmlNodeType.Element == ssync.NodeType) { DataColumn column = table.Columns[XmlConvert.DecodeName(ssync.LocalName), ssync.NamespaceURI]; string attribute3 = ssync.GetAttribute("Error", "urn:schemas-microsoft-com:xml-diffgram-v1"); dataRow.SetColumnError(column, attribute3); } ssync.Read(); } while (ssync.NodeType == XmlNodeType.EndElement && depth < ssync.Depth) { ssync.Read(); } } } internal void ProcessErrors(ArrayList dt, XmlReader ssync) { int depth = ssync.Depth; ssync.Read(); while (depth < ssync.Depth) { DataTable table = GetTable(XmlConvert.DecodeName(ssync.LocalName), ssync.NamespaceURI); if (table == null) { throw ExceptionBuilder.DiffgramMissingSQL(); } string attribute = ssync.GetAttribute("id", "urn:schemas-microsoft-com:xml-diffgram-v1"); DataRow dataRow = (DataRow)table.RowDiffId[attribute]; if (dataRow == null) { for (int i = 0; i < dt.Count; i++) { dataRow = (DataRow)((DataTable)dt[i]).RowDiffId[attribute]; if (dataRow != null) { table = dataRow.Table; break; } } } string attribute2 = ssync.GetAttribute("Error", "urn:schemas-microsoft-com:xml-diffgram-v1"); if (attribute2 != null) { dataRow.RowError = attribute2; } int depth2 = ssync.Depth; ssync.Read(); while (depth2 < ssync.Depth) { if (XmlNodeType.Element == ssync.NodeType) { DataColumn column = table.Columns[XmlConvert.DecodeName(ssync.LocalName), ssync.NamespaceURI]; string attribute3 = ssync.GetAttribute("Error", "urn:schemas-microsoft-com:xml-diffgram-v1"); dataRow.SetColumnError(column, attribute3); } ssync.Read(); } while (ssync.NodeType == XmlNodeType.EndElement && depth < ssync.Depth) { ssync.Read(); } } } private DataTable GetTable(string tableName, string ns) { if (_tables == null) { return _dataSet.Tables.GetTable(tableName, ns); } if (_tables.Count == 0) { return (DataTable)_tables[0]; } for (int i = 0; i < _tables.Count; i++) { DataTable dataTable = (DataTable)_tables[i]; if (string.Equals(dataTable.TableName, tableName, StringComparison.Ordinal) && string.Equals(dataTable.Namespace, ns, StringComparison.Ordinal)) { return dataTable; } } return null; } private int ReadOldRowData(DataSet ds, ref DataTable table, ref int pos, XmlReader row) { if (ds != null) { table = ds.Tables.GetTable(XmlConvert.DecodeName(row.LocalName), row.NamespaceURI); } else { table = GetTable(XmlConvert.DecodeName(row.LocalName), row.NamespaceURI); } if (table == null) { row.Skip(); return -1; } int depth = row.Depth; string text = null; if (table == null) { throw ExceptionBuilder.DiffgramMissingTable(XmlConvert.DecodeName(row.LocalName)); } text = row.GetAttribute("rowOrder", "urn:schemas-microsoft-com:xml-msdata"); if (!string.IsNullOrEmpty(text)) { pos = (int)Convert.ChangeType(text, typeof(int), null); } int num = table.NewRecord(); foreach (DataColumn column in table.Columns) { column[num] = DBNull.Value; } foreach (DataColumn column2 in table.Columns) { if (column2.ColumnMapping != MappingType.Element && column2.ColumnMapping != MappingType.SimpleContent) { text = ((column2.ColumnMapping != MappingType.Hidden) ? row.GetAttribute(column2.EncodedColumnName, column2.Namespace) : row.GetAttribute("hidden" + column2.EncodedColumnName, "urn:schemas-microsoft-com:xml-msdata")); if (text != null) { column2[num] = column2.ConvertXmlToObject(text); } } } row.Read(); SkipWhitespaces(row); int depth2 = row.Depth; if (depth2 <= depth) { if (depth2 == depth && row.NodeType == XmlNodeType.EndElement) { row.Read(); SkipWhitespaces(row); } return num; } if (table.XmlText != null) { DataColumn xmlText = table.XmlText; xmlText[num] = xmlText.ConvertXmlToObject(row.ReadString()); } else { while (row.Depth > depth) { string text2 = XmlConvert.DecodeName(row.LocalName); string namespaceURI = row.NamespaceURI; DataColumn dataColumn2 = table.Columns[text2, namespaceURI]; if (dataColumn2 == null) { while (row.NodeType != XmlNodeType.EndElement && row.LocalName != text2 && row.NamespaceURI != namespaceURI) { row.Read(); } row.Read(); continue; } if (dataColumn2.IsCustomType) { bool num2 = dataColumn2.DataType == typeof(object) || row.GetAttribute("InstanceType", "urn:schemas-microsoft-com:xml-msdata") != null || row.GetAttribute("type", "http://www.w3.org/2001/XMLSchema-instance") != null; bool flag = false; if (dataColumn2.Table.DataSet != null && dataColumn2.Table.DataSet._udtIsWrapped) { row.Read(); flag = true; } XmlRootAttribute xmlRootAttribute = null; if (!num2 && !dataColumn2.ImplementsIXMLSerializable) { if (flag) { xmlRootAttribute = new XmlRootAttribute(row.LocalName); xmlRootAttribute.Namespace = row.NamespaceURI; } else { xmlRootAttribute = new XmlRootAttribute(dataColumn2.EncodedColumnName); xmlRootAttribute.Namespace = dataColumn2.Namespace; } } dataColumn2[num] = dataColumn2.ConvertXmlToObject(row, xmlRootAttribute); if (flag) { row.Read(); } continue; } int depth3 = row.Depth; row.Read(); if (row.Depth > depth3) { if (row.NodeType == XmlNodeType.Text || row.NodeType == XmlNodeType.Whitespace || row.NodeType == XmlNodeType.SignificantWhitespace) { string s = row.ReadString(); dataColumn2[num] = dataColumn2.ConvertXmlToObject(s); row.Read(); } } else if (dataColumn2.DataType == typeof(string)) { dataColumn2[num] = string.Empty; } } } row.Read(); SkipWhitespaces(row); return num; } internal void SkipWhitespaces(XmlReader reader) { while (reader.NodeType == XmlNodeType.Whitespace || reader.NodeType == XmlNodeType.SignificantWhitespace) { reader.Read(); } } } internal class XMLSchema { internal static TypeConverter GetConverter(Type type) { return TypeDescriptor.GetConverter(type); } internal static void SetProperties(object instance, XmlAttributeCollection attrs) { for (int i = 0; i < attrs.Count; i++) { if (!(attrs[i].NamespaceURI == "urn:schemas-microsoft-com:xml-msdata")) { continue; } string localName = attrs[i].LocalName; string value = attrs[i].Value; switch (localName) { case "Expression": if (instance is DataColumn) { continue; } break; case "DefaultValue": case "RemotingFormat": continue; } PropertyDescriptor propertyDescriptor = TypeDescriptor.GetProperties(instance)[localName]; if (propertyDescriptor == null) { continue; } Type propertyType = propertyDescriptor.PropertyType; TypeConverter converter = GetConverter(propertyType); object value2; if (converter.CanConvertFrom(typeof(string))) { value2 = converter.ConvertFromString(value); } else if (propertyType == typeof(Type)) { value2 = DataStorage.GetType(value); } else { if (!(propertyType == typeof(CultureInfo))) { throw ExceptionBuilder.CannotConvert(value, propertyType.FullName); } value2 = new CultureInfo(value); } propertyDescriptor.SetValue(instance, value2); } } internal static bool FEqualIdentity(XmlNode node, string name, string ns) { if (node != null && node.LocalName == name && node.NamespaceURI == ns) { return true; } return false; } internal static bool GetBooleanAttribute(XmlElement element, string attrName, string attrNS, bool defVal) { string attribute = element.GetAttribute(attrName, attrNS); if (attribute == null || attribute.Length == 0) { return defVal; } switch (attribute) { case "true": case "1": return true; case "false": case "0": return false; default: throw ExceptionBuilder.InvalidAttributeValue(attrName, attribute); } } internal static string GenUniqueColumnName(string proposedName, DataTable table) { if (table.Columns.IndexOf(proposedName) >= 0) { for (int i = 0; i <= table.Columns.Count; i++) { string text = proposedName + "_" + i.ToString(CultureInfo.InvariantCulture); if (table.Columns.IndexOf(text) < 0) { return text; } } } return proposedName; } } internal sealed class ConstraintTable { public DataTable table; public XmlSchemaIdentityConstraint constraint; public ConstraintTable(DataTable t, XmlSchemaIdentityConstraint c) { table = t; constraint = c; } } internal sealed class XSDSchema : XMLSchema { private sealed class NameType : IComparable { public readonly string name; public readonly Type type; public NameType(string n, Type t) { name = n; type = t; } public int CompareTo(object obj) { return string.Compare(name, (string)obj, StringComparison.Ordinal); } } private XmlSchemaSet _schemaSet; private XmlSchemaElement _dsElement; private DataSet _ds; private string _schemaName; private ArrayList _columnExpressions; private Hashtable _constraintNodes; private ArrayList _refTables; private ArrayList _complexTypes; private XmlSchemaObjectCollection _annotations; private XmlSchemaObjectCollection _elements; private Hashtable _attributes; private Hashtable _elementsTable; private Hashtable _attributeGroups; private Hashtable _schemaTypes; private Hashtable _expressions; private Dictionary> _tableDictionary; private Hashtable _udSimpleTypes; private Hashtable _existingSimpleTypeMap; private bool _fromInference; private static readonly NameType[] s_mapNameTypeXsd = new NameType[44] { new NameType("ENTITIES", typeof(string)), new NameType("ENTITY", typeof(string)), new NameType("ID", typeof(string)), new NameType("IDREF", typeof(string)), new NameType("IDREFS", typeof(string)), new NameType("NCName", typeof(string)), new NameType("NMTOKEN", typeof(string)), new NameType("NMTOKENS", typeof(string)), new NameType("NOTATION", typeof(string)), new NameType("Name", typeof(string)), new NameType("QName", typeof(string)), new NameType("anyType", typeof(object)), new NameType("anyURI", typeof(Uri)), new NameType("base64Binary", typeof(byte[])), new NameType("boolean", typeof(bool)), new NameType("byte", typeof(sbyte)), new NameType("date", typeof(DateTime)), new NameType("dateTime", typeof(DateTime)), new NameType("decimal", typeof(decimal)), new NameType("double", typeof(double)), new NameType("duration", typeof(TimeSpan)), new NameType("float", typeof(float)), new NameType("gDay", typeof(DateTime)), new NameType("gMonth", typeof(DateTime)), new NameType("gMonthDay", typeof(DateTime)), new NameType("gYear", typeof(DateTime)), new NameType("gYearMonth", typeof(DateTime)), new NameType("hexBinary", typeof(byte[])), new NameType("int", typeof(int)), new NameType("integer", typeof(long)), new NameType("language", typeof(string)), new NameType("long", typeof(long)), new NameType("negativeInteger", typeof(long)), new NameType("nonNegativeInteger", typeof(ulong)), new NameType("nonPositiveInteger", typeof(long)), new NameType("normalizedString", typeof(string)), new NameType("positiveInteger", typeof(ulong)), new NameType("short", typeof(short)), new NameType("string", typeof(string)), new NameType("time", typeof(DateTime)), new NameType("unsignedByte", typeof(byte)), new NameType("unsignedInt", typeof(uint)), new NameType("unsignedLong", typeof(ulong)), new NameType("unsignedShort", typeof(ushort)) }; internal bool FromInference { get { return _fromInference; } set { _fromInference = value; } } private void CollectElementsAnnotations(XmlSchema schema) { ArrayList arrayList = new ArrayList(); CollectElementsAnnotations(schema, arrayList); arrayList.Clear(); } private void CollectElementsAnnotations(XmlSchema schema, ArrayList schemaList) { if (schemaList.Contains(schema)) { return; } schemaList.Add(schema); foreach (XmlSchemaObject item in schema.Items) { if (item is XmlSchemaAnnotation) { _annotations.Add((XmlSchemaAnnotation)item); } if (item is XmlSchemaElement) { XmlSchemaElement xmlSchemaElement = (XmlSchemaElement)item; _elements.Add(xmlSchemaElement); _elementsTable[xmlSchemaElement.QualifiedName] = xmlSchemaElement; } if (item is XmlSchemaAttribute) { XmlSchemaAttribute xmlSchemaAttribute = (XmlSchemaAttribute)item; _attributes[xmlSchemaAttribute.QualifiedName] = xmlSchemaAttribute; } if (item is XmlSchemaAttributeGroup) { XmlSchemaAttributeGroup xmlSchemaAttributeGroup = (XmlSchemaAttributeGroup)item; _attributeGroups[xmlSchemaAttributeGroup.QualifiedName] = xmlSchemaAttributeGroup; } if (!(item is XmlSchemaType)) { continue; } if (item is XmlSchemaSimpleType) { GetMsdataAttribute((XmlSchemaType)item, "targetNamespace"); } XmlSchemaType xmlSchemaType = (XmlSchemaType)item; _schemaTypes[xmlSchemaType.QualifiedName] = xmlSchemaType; if (!(item is XmlSchemaSimpleType xmlSchemaSimpleType)) { continue; } if (_udSimpleTypes == null) { _udSimpleTypes = new Hashtable(); } _udSimpleTypes[xmlSchemaType.QualifiedName.ToString()] = xmlSchemaSimpleType; SimpleType simpleType = ((DataColumn)_existingSimpleTypeMap[xmlSchemaType.QualifiedName.ToString()])?.SimpleType; if (simpleType != null) { SimpleType simpleType2 = new SimpleType(xmlSchemaSimpleType); string text = simpleType.HasConflictingDefinition(simpleType2); if (text.Length != 0) { throw ExceptionBuilder.InvalidDuplicateNamedSimpleTypeDelaration(simpleType2.SimpleTypeQualifiedName, text); } } } foreach (XmlSchemaExternal include in schema.Includes) { if (!(include is XmlSchemaImport) && include.Schema != null) { CollectElementsAnnotations(include.Schema, schemaList); } } } internal static string QualifiedName(string name) { if (name.IndexOf(':') == -1) { return "xs:" + name; } return name; } internal static void SetProperties(object instance, XmlAttribute[] attrs) { if (attrs == null) { return; } for (int i = 0; i < attrs.Length; i++) { if (!(attrs[i].NamespaceURI == "urn:schemas-microsoft-com:xml-msdata")) { continue; } string localName = attrs[i].LocalName; string value = attrs[i].Value; switch (localName) { case "Expression": if (instance is DataColumn) { continue; } break; case "DefaultValue": case "Ordinal": case "Locale": case "RemotingFormat": continue; } if (localName == "DataType") { if (instance is DataColumn dataColumn) { dataColumn.DataType = DataStorage.GetType(value); } continue; } PropertyDescriptor propertyDescriptor = TypeDescriptor.GetProperties(instance)[localName]; if (propertyDescriptor == null) { continue; } Type propertyType = propertyDescriptor.PropertyType; TypeConverter converter = XMLSchema.GetConverter(propertyType); object value2; if (converter.CanConvertFrom(typeof(string))) { value2 = converter.ConvertFromString(value); } else if (propertyType == typeof(Type)) { value2 = Type.GetType(value); } else { if (!(propertyType == typeof(CultureInfo))) { throw ExceptionBuilder.CannotConvert(value, propertyType.FullName); } value2 = new CultureInfo(value); } propertyDescriptor.SetValue(instance, value2); } } private static void SetExtProperties(object instance, XmlAttribute[] attrs) { PropertyCollection propertyCollection = null; if (attrs == null) { return; } for (int i = 0; i < attrs.Length; i++) { if (!(attrs[i].NamespaceURI == "urn:schemas-microsoft-com:xml-msprop")) { continue; } if (propertyCollection == null) { propertyCollection = (PropertyCollection)TypeDescriptor.GetProperties(instance)["ExtendedProperties"].GetValue(instance); } string text = XmlConvert.DecodeName(attrs[i].LocalName); if (instance is ForeignKeyConstraint) { if (!text.StartsWith("fk_", StringComparison.Ordinal)) { continue; } text = text.Substring(3); } if (instance is DataRelation && text.StartsWith("rel_", StringComparison.Ordinal)) { text = text.Substring(4); } else if (instance is DataRelation && text.StartsWith("fk_", StringComparison.Ordinal)) { continue; } propertyCollection.Add(text, attrs[i].Value); } } private void HandleColumnExpression(object instance, XmlAttribute[] attrs) { if (attrs == null || !(instance is DataColumn dataColumn)) { return; } for (int i = 0; i < attrs.Length; i++) { if (attrs[i].NamespaceURI == "urn:schemas-microsoft-com:xml-msdata" && attrs[i].LocalName == "Expression") { if (_expressions == null) { _expressions = new Hashtable(); } _expressions[dataColumn] = attrs[i].Value; _columnExpressions.Add(dataColumn); break; } } } internal static string GetMsdataAttribute(XmlSchemaAnnotated node, string ln) { XmlAttribute[] unhandledAttributes = node.UnhandledAttributes; if (unhandledAttributes != null) { for (int i = 0; i < unhandledAttributes.Length; i++) { if (unhandledAttributes[i].LocalName == ln && unhandledAttributes[i].NamespaceURI == "urn:schemas-microsoft-com:xml-msdata") { return unhandledAttributes[i].Value; } } } return null; } private static void SetExtProperties(object instance, XmlAttributeCollection attrs) { PropertyCollection propertyCollection = null; for (int i = 0; i < attrs.Count; i++) { if (attrs[i].NamespaceURI == "urn:schemas-microsoft-com:xml-msprop") { if (propertyCollection == null) { propertyCollection = (PropertyCollection)TypeDescriptor.GetProperties(instance)["ExtendedProperties"].GetValue(instance); } string key = XmlConvert.DecodeName(attrs[i].LocalName); propertyCollection.Add(key, attrs[i].Value); } } } internal void HandleRefTableProperties(ArrayList RefTables, XmlSchemaElement element) { string instanceName = GetInstanceName(element); DataTable table = _ds.Tables.GetTable(XmlConvert.DecodeName(instanceName), element.QualifiedName.Namespace); SetProperties(table, element.UnhandledAttributes); SetExtProperties(table, element.UnhandledAttributes); } internal void HandleRelation(XmlElement node, bool fNested) { bool createConstraints = false; DataRelationCollection relations = _ds.Relations; string text = XmlConvert.DecodeName(node.GetAttribute("name")); for (int i = 0; i < relations.Count; i++) { if (string.Equals(relations[i].RelationName, text, StringComparison.Ordinal)) { return; } } string attribute = node.GetAttribute("parent", "urn:schemas-microsoft-com:xml-msdata"); if (attribute == null || attribute.Length == 0) { throw ExceptionBuilder.RelationParentNameMissing(text); } attribute = XmlConvert.DecodeName(attribute); string attribute2 = node.GetAttribute("child", "urn:schemas-microsoft-com:xml-msdata"); if (attribute2 == null || attribute2.Length == 0) { throw ExceptionBuilder.RelationChildNameMissing(text); } attribute2 = XmlConvert.DecodeName(attribute2); string attribute3 = node.GetAttribute("parentkey", "urn:schemas-microsoft-com:xml-msdata"); if (attribute3 == null || attribute3.Length == 0) { throw ExceptionBuilder.RelationTableKeyMissing(text); } string[] array = attribute3.TrimEnd(null).Split(' ', '+'); attribute3 = node.GetAttribute("childkey", "urn:schemas-microsoft-com:xml-msdata"); if (attribute3 == null || attribute3.Length == 0) { throw ExceptionBuilder.RelationChildKeyMissing(text); } string[] array2 = attribute3.TrimEnd(null).Split(' ', '+'); int num = array.Length; if (num != array2.Length) { throw ExceptionBuilder.MismatchKeyLength(); } DataColumn[] array3 = new DataColumn[num]; DataColumn[] array4 = new DataColumn[num]; string attribute4 = node.GetAttribute("ParentTableNamespace", "urn:schemas-microsoft-com:xml-msdata"); string attribute5 = node.GetAttribute("ChildTableNamespace", "urn:schemas-microsoft-com:xml-msdata"); DataTable tableSmart = _ds.Tables.GetTableSmart(attribute, attribute4); if (tableSmart == null) { throw ExceptionBuilder.ElementTypeNotFound(attribute); } DataTable tableSmart2 = _ds.Tables.GetTableSmart(attribute2, attribute5); if (tableSmart2 == null) { throw ExceptionBuilder.ElementTypeNotFound(attribute2); } for (int j = 0; j < num; j++) { array3[j] = tableSmart.Columns[XmlConvert.DecodeName(array[j])]; if (array3[j] == null) { throw ExceptionBuilder.ElementTypeNotFound(array[j]); } array4[j] = tableSmart2.Columns[XmlConvert.DecodeName(array2[j])]; if (array4[j] == null) { throw ExceptionBuilder.ElementTypeNotFound(array2[j]); } } DataRelation dataRelation = new DataRelation(text, array3, array4, createConstraints); dataRelation.Nested = fNested; SetExtProperties(dataRelation, node.Attributes); _ds.Relations.Add(dataRelation); if (FromInference && dataRelation.Nested) { _tableDictionary[dataRelation.ParentTable].Add(dataRelation.ChildTable); } } private bool HasAttributes(XmlSchemaObjectCollection attributes) { foreach (XmlSchemaObject attribute in attributes) { if (attribute is XmlSchemaAttribute) { return true; } if (attribute is XmlSchemaAttributeGroup) { return true; } if (attribute is XmlSchemaAttributeGroupRef) { return true; } } return false; } private bool IsDatasetParticle(XmlSchemaParticle pt) { XmlSchemaObjectCollection particleItems = GetParticleItems(pt); if (particleItems == null) { return false; } bool flag = FromInference && pt is XmlSchemaChoice; foreach (XmlSchemaAnnotated item in particleItems) { if (item is XmlSchemaElement) { if (flag && pt.MaxOccurs > 1m && ((XmlSchemaElement)item).SchemaType is XmlSchemaComplexType) { ((XmlSchemaElement)item).MaxOccurs = pt.MaxOccurs; } if ((((XmlSchemaElement)item).RefName.Name.Length == 0 || (FromInference && (!(((XmlSchemaElement)item).MaxOccurs != 1m) || ((XmlSchemaElement)item).SchemaType is XmlSchemaComplexType))) && !IsTable((XmlSchemaElement)item)) { return false; } } else if (item is XmlSchemaParticle && !IsDatasetParticle((XmlSchemaParticle)item)) { return false; } } return true; } private int DatasetElementCount(XmlSchemaObjectCollection elements) { int num = 0; foreach (XmlSchemaElement element in elements) { if (GetBooleanAttribute(element, "IsDataSet", defVal: false)) { num++; } } return num; } private XmlSchemaElement FindDatasetElement(XmlSchemaObjectCollection elements) { foreach (XmlSchemaElement element in elements) { if (GetBooleanAttribute(element, "IsDataSet", defVal: false)) { return element; } } if (elements.Count == 1 || (FromInference && elements.Count > 0)) { XmlSchemaElement xmlSchemaElement2 = (XmlSchemaElement)elements[0]; if (!GetBooleanAttribute(xmlSchemaElement2, "IsDataSet", defVal: true)) { return null; } XmlSchemaComplexType xmlSchemaComplexType = xmlSchemaElement2.SchemaType as XmlSchemaComplexType; if (xmlSchemaComplexType == null) { return null; } while (xmlSchemaComplexType != null) { if (HasAttributes(xmlSchemaComplexType.Attributes)) { return null; } if (xmlSchemaComplexType.ContentModel is XmlSchemaSimpleContent) { XmlSchemaAnnotated content = ((XmlSchemaSimpleContent)xmlSchemaComplexType.ContentModel).Content; if (content is XmlSchemaSimpleContentExtension) { XmlSchemaSimpleContentExtension xmlSchemaSimpleContentExtension = (XmlSchemaSimpleContentExtension)content; if (HasAttributes(xmlSchemaSimpleContentExtension.Attributes)) { return null; } } else { XmlSchemaSimpleContentRestriction xmlSchemaSimpleContentRestriction = (XmlSchemaSimpleContentRestriction)content; if (HasAttributes(xmlSchemaSimpleContentRestriction.Attributes)) { return null; } } } XmlSchemaParticle particle = GetParticle(xmlSchemaComplexType); if (particle != null && !IsDatasetParticle(particle)) { return null; } if (!(xmlSchemaComplexType.BaseXmlSchemaType is XmlSchemaComplexType)) { break; } xmlSchemaComplexType = (XmlSchemaComplexType)xmlSchemaComplexType.BaseXmlSchemaType; } return xmlSchemaElement2; } return null; } public void LoadSchema(XmlSchemaSet schemaSet, DataTable dt) { if (dt.DataSet != null) { LoadSchema(schemaSet, dt.DataSet); } } public void LoadSchema(XmlSchemaSet schemaSet, DataSet ds) { _constraintNodes = new Hashtable(); _refTables = new ArrayList(); _columnExpressions = new ArrayList(); _complexTypes = new ArrayList(); bool flag = false; bool isNewDataSet = ds.Tables.Count == 0; if (schemaSet == null) { return; } _schemaSet = schemaSet; _ds = ds; ds._fIsSchemaLoading = true; IEnumerator enumerator = schemaSet.Schemas().GetEnumerator(); try { if (enumerator.MoveNext()) { XmlSchema xmlSchema = (XmlSchema)enumerator.Current; _schemaName = xmlSchema.Id; if (_schemaName == null || _schemaName.Length == 0) { _schemaName = "NewDataSet"; } ds.DataSetName = XmlConvert.DecodeName(_schemaName); string targetNamespace = xmlSchema.TargetNamespace; if (ds._namespaceURI == null || ds._namespaceURI.Length == 0) { ds._namespaceURI = ((targetNamespace == null) ? string.Empty : targetNamespace); } } } finally { IDisposable disposable = enumerator as IDisposable; if (disposable != null) { disposable.Dispose(); } } _annotations = new XmlSchemaObjectCollection(); _elements = new XmlSchemaObjectCollection(); _elementsTable = new Hashtable(); _attributes = new Hashtable(); _attributeGroups = new Hashtable(); _schemaTypes = new Hashtable(); _tableDictionary = new Dictionary>(); _existingSimpleTypeMap = new Hashtable(); foreach (DataTable table in ds.Tables) { foreach (DataColumn column in table.Columns) { if (column.SimpleType != null && column.SimpleType.Name != null && column.SimpleType.Name.Length != 0) { _existingSimpleTypeMap[column.SimpleType.SimpleTypeQualifiedName] = column; } } } foreach (XmlSchema item in schemaSet.Schemas()) { CollectElementsAnnotations(item); } _dsElement = FindDatasetElement(_elements); if (_dsElement != null) { string stringAttribute = GetStringAttribute(_dsElement, "MainDataTable", ""); if (stringAttribute != null) { ds.MainTableName = XmlConvert.DecodeName(stringAttribute); } } else { if (FromInference) { ds._fTopLevelTable = true; } flag = true; } List list = new List(); if (ds != null && ds._useDataSetSchemaOnly) { int num = DatasetElementCount(_elements); if (num == 0) { throw ExceptionBuilder.IsDataSetAttributeMissingInSchema(); } if (num > 1) { throw ExceptionBuilder.TooManyIsDataSetAtributeInSchema(); } XmlSchemaComplexType xmlSchemaComplexType = (XmlSchemaComplexType)FindTypeNode(_dsElement); if (xmlSchemaComplexType.Particle != null) { XmlSchemaObjectCollection particleItems = GetParticleItems(xmlSchemaComplexType.Particle); if (particleItems != null) { foreach (XmlSchemaAnnotated item2 in particleItems) { if (item2 is XmlSchemaElement xmlSchemaElement && xmlSchemaElement.RefName.Name.Length != 0) { list.Add(xmlSchemaElement.QualifiedName); } } } } } foreach (XmlSchemaElement element in _elements) { if (element != _dsElement && (ds == null || !ds._useDataSetSchemaOnly || _dsElement == null || _dsElement.Parent == element.Parent || list.Contains(element.QualifiedName))) { string instanceName = GetInstanceName(element); if (_refTables.Contains(element.QualifiedName.Namespace + ":" + instanceName)) { HandleRefTableProperties(_refTables, element); } else { HandleTable(element); } } } if (_dsElement != null) { HandleDataSet(_dsElement, isNewDataSet); } foreach (XmlSchemaAnnotation annotation in _annotations) { HandleRelations(annotation, fNested: false); } for (int i = 0; i < _columnExpressions.Count; i++) { DataColumn dataColumn2 = (DataColumn)_columnExpressions[i]; dataColumn2.Expression = (string)_expressions[dataColumn2]; } foreach (DataTable table2 in ds.Tables) { if (table2.NestedParentRelations.Length != 0 || !(table2.Namespace == ds.Namespace)) { continue; } DataRelationCollection childRelations = table2.ChildRelations; for (int j = 0; j < childRelations.Count; j++) { if (childRelations[j].Nested && table2.Namespace == childRelations[j].ChildTable.Namespace) { childRelations[j].ChildTable._tableNamespace = null; } } table2._tableNamespace = null; } DataTable dataTable2 = ds.Tables[ds.DataSetName, ds.Namespace]; if (dataTable2 != null) { dataTable2._fNestedInDataset = true; } if (FromInference && ds.Tables.Count == 0 && string.Equals(ds.DataSetName, "NewDataSet", StringComparison.Ordinal)) { ds.DataSetName = XmlConvert.DecodeName(((XmlSchemaElement)_elements[0]).Name); } ds._fIsSchemaLoading = false; if (!flag) { return; } if (ds.Tables.Count > 0) { ds.Namespace = ds.Tables[0].Namespace; ds.Prefix = ds.Tables[0].Prefix; return; } foreach (XmlSchema item3 in schemaSet.Schemas()) { ds.Namespace = item3.TargetNamespace; } } private void HandleRelations(XmlSchemaAnnotation ann, bool fNested) { foreach (XmlSchemaObject item in ann.Items) { if (!(item is XmlSchemaAppInfo)) { continue; } XmlNode[] markup = ((XmlSchemaAppInfo)item).Markup; for (int i = 0; i < markup.Length; i++) { if (XMLSchema.FEqualIdentity(markup[i], "Relationship", "urn:schemas-microsoft-com:xml-msdata")) { HandleRelation((XmlElement)markup[i], fNested); } } } } internal XmlSchemaObjectCollection GetParticleItems(XmlSchemaParticle pt) { if (pt is XmlSchemaSequence) { return ((XmlSchemaSequence)pt).Items; } if (pt is XmlSchemaAll) { return ((XmlSchemaAll)pt).Items; } if (pt is XmlSchemaChoice) { return ((XmlSchemaChoice)pt).Items; } if (pt is XmlSchemaAny) { return null; } if (pt is XmlSchemaElement) { return new XmlSchemaObjectCollection { pt }; } if (pt is XmlSchemaGroupRef) { return GetParticleItems(((XmlSchemaGroupRef)pt).Particle); } return null; } internal void HandleParticle(XmlSchemaParticle pt, DataTable table, ArrayList tableChildren, bool isBase) { XmlSchemaObjectCollection particleItems = GetParticleItems(pt); if (particleItems == null) { return; } foreach (XmlSchemaAnnotated item in particleItems) { if (item is XmlSchemaElement xmlSchemaElement) { if (FromInference && pt is XmlSchemaChoice && pt.MaxOccurs > 1m && xmlSchemaElement.SchemaType is XmlSchemaComplexType) { xmlSchemaElement.MaxOccurs = pt.MaxOccurs; } DataTable dataTable = null; if ((xmlSchemaElement.Name == null && xmlSchemaElement.RefName.Name == table.EncodedTableName && xmlSchemaElement.RefName.Namespace == table.Namespace) || (IsTable(xmlSchemaElement) && xmlSchemaElement.Name == table.TableName)) { dataTable = ((!FromInference) ? table : HandleTable(xmlSchemaElement)); } else { dataTable = HandleTable(xmlSchemaElement); if (dataTable == null && FromInference && xmlSchemaElement.Name == table.TableName) { dataTable = table; } } if (dataTable == null) { if (!FromInference || xmlSchemaElement.Name != table.TableName) { HandleElementColumn(xmlSchemaElement, table, isBase); } continue; } DataRelation dataRelation = null; if (xmlSchemaElement.Annotation != null) { HandleRelations(xmlSchemaElement.Annotation, fNested: true); } DataRelationCollection childRelations = table.ChildRelations; for (int i = 0; i < childRelations.Count; i++) { if (childRelations[i].Nested && dataTable == childRelations[i].ChildTable) { dataRelation = childRelations[i]; } } if (dataRelation != null) { continue; } tableChildren.Add(dataTable); if (!FromInference || table.UKColumnPositionForInference != -1) { continue; } int num = -1; foreach (DataColumn column in table.Columns) { if (column.ColumnMapping == MappingType.Element) { num++; } } table.UKColumnPositionForInference = num + 1; } else { HandleParticle((XmlSchemaParticle)item, table, tableChildren, isBase); } } } internal void HandleAttributes(XmlSchemaObjectCollection attributes, DataTable table, bool isBase) { foreach (XmlSchemaObject attribute in attributes) { if (attribute is XmlSchemaAttribute) { HandleAttributeColumn((XmlSchemaAttribute)attribute, table, isBase); continue; } XmlSchemaAttributeGroupRef xmlSchemaAttributeGroupRef = attribute as XmlSchemaAttributeGroupRef; if (_attributeGroups[xmlSchemaAttributeGroupRef.RefName] is XmlSchemaAttributeGroup attributeGroup) { HandleAttributeGroup(attributeGroup, table, isBase); } } } private void HandleAttributeGroup(XmlSchemaAttributeGroup attributeGroup, DataTable table, bool isBase) { foreach (XmlSchemaObject attribute in attributeGroup.Attributes) { if (attribute is XmlSchemaAttribute) { HandleAttributeColumn((XmlSchemaAttribute)attribute, table, isBase); continue; } XmlSchemaAttributeGroupRef xmlSchemaAttributeGroupRef = (XmlSchemaAttributeGroupRef)attribute; XmlSchemaAttributeGroup xmlSchemaAttributeGroup = ((attributeGroup.RedefinedAttributeGroup == null || !(xmlSchemaAttributeGroupRef.RefName == new XmlQualifiedName(attributeGroup.Name, xmlSchemaAttributeGroupRef.RefName.Namespace))) ? ((XmlSchemaAttributeGroup)_attributeGroups[xmlSchemaAttributeGroupRef.RefName]) : attributeGroup.RedefinedAttributeGroup); if (xmlSchemaAttributeGroup != null) { HandleAttributeGroup(xmlSchemaAttributeGroup, table, isBase); } } } internal void HandleComplexType(XmlSchemaComplexType ct, DataTable table, ArrayList tableChildren, bool isNillable) { if (_complexTypes.Contains(ct)) { throw ExceptionBuilder.CircularComplexType(ct.Name); } bool isBase = false; _complexTypes.Add(ct); if (ct.ContentModel != null) { if (ct.ContentModel is XmlSchemaComplexContent) { XmlSchemaAnnotated content = ((XmlSchemaComplexContent)ct.ContentModel).Content; if (content is XmlSchemaComplexContentExtension) { XmlSchemaComplexContentExtension xmlSchemaComplexContentExtension = (XmlSchemaComplexContentExtension)content; if (!(ct.BaseXmlSchemaType is XmlSchemaComplexType) || !FromInference) { HandleAttributes(xmlSchemaComplexContentExtension.Attributes, table, isBase); } if (ct.BaseXmlSchemaType is XmlSchemaComplexType) { HandleComplexType((XmlSchemaComplexType)ct.BaseXmlSchemaType, table, tableChildren, isNillable); } else if (xmlSchemaComplexContentExtension.BaseTypeName.Namespace != "http://www.w3.org/2001/XMLSchema") { HandleSimpleContentColumn(xmlSchemaComplexContentExtension.BaseTypeName.ToString(), table, isBase, ct.ContentModel.UnhandledAttributes, isNillable); } else { HandleSimpleContentColumn(xmlSchemaComplexContentExtension.BaseTypeName.Name, table, isBase, ct.ContentModel.UnhandledAttributes, isNillable); } if (xmlSchemaComplexContentExtension.Particle != null) { HandleParticle(xmlSchemaComplexContentExtension.Particle, table, tableChildren, isBase); } if (ct.BaseXmlSchemaType is XmlSchemaComplexType && FromInference) { HandleAttributes(xmlSchemaComplexContentExtension.Attributes, table, isBase); } } else { XmlSchemaComplexContentRestriction xmlSchemaComplexContentRestriction = (XmlSchemaComplexContentRestriction)content; if (!FromInference) { HandleAttributes(xmlSchemaComplexContentRestriction.Attributes, table, isBase); } if (xmlSchemaComplexContentRestriction.Particle != null) { HandleParticle(xmlSchemaComplexContentRestriction.Particle, table, tableChildren, isBase); } if (FromInference) { HandleAttributes(xmlSchemaComplexContentRestriction.Attributes, table, isBase); } } } else { XmlSchemaAnnotated content2 = ((XmlSchemaSimpleContent)ct.ContentModel).Content; if (content2 is XmlSchemaSimpleContentExtension) { XmlSchemaSimpleContentExtension xmlSchemaSimpleContentExtension = (XmlSchemaSimpleContentExtension)content2; HandleAttributes(xmlSchemaSimpleContentExtension.Attributes, table, isBase); if (ct.BaseXmlSchemaType is XmlSchemaComplexType) { HandleComplexType((XmlSchemaComplexType)ct.BaseXmlSchemaType, table, tableChildren, isNillable); } else { HandleSimpleTypeSimpleContentColumn((XmlSchemaSimpleType)ct.BaseXmlSchemaType, xmlSchemaSimpleContentExtension.BaseTypeName.Name, table, isBase, ct.ContentModel.UnhandledAttributes, isNillable); } } else { XmlSchemaSimpleContentRestriction xmlSchemaSimpleContentRestriction = (XmlSchemaSimpleContentRestriction)content2; HandleAttributes(xmlSchemaSimpleContentRestriction.Attributes, table, isBase); } } } else { isBase = true; if (!FromInference) { HandleAttributes(ct.Attributes, table, isBase); } if (ct.Particle != null) { HandleParticle(ct.Particle, table, tableChildren, isBase); } if (FromInference) { HandleAttributes(ct.Attributes, table, isBase); if (isNillable) { HandleSimpleContentColumn("string", table, isBase, null, isNillable); } } } _complexTypes.Remove(ct); } internal XmlSchemaParticle GetParticle(XmlSchemaComplexType ct) { if (ct.ContentModel != null) { if (ct.ContentModel is XmlSchemaComplexContent) { XmlSchemaAnnotated content = ((XmlSchemaComplexContent)ct.ContentModel).Content; if (content is XmlSchemaComplexContentExtension) { return ((XmlSchemaComplexContentExtension)content).Particle; } return ((XmlSchemaComplexContentRestriction)content).Particle; } return null; } return ct.Particle; } internal DataColumn FindField(DataTable table, string field) { bool flag = false; string text = field; if (field.StartsWith("@", StringComparison.Ordinal)) { flag = true; text = field.Substring(1); } text = text.Split(new char[1] { ':' })[^1]; text = XmlConvert.DecodeName(text); DataColumn dataColumn = table.Columns[text]; if (dataColumn == null) { throw ExceptionBuilder.InvalidField(field); } if ((dataColumn.ColumnMapping == MappingType.Attribute || dataColumn.ColumnMapping == MappingType.Hidden) != flag) { throw ExceptionBuilder.InvalidField(field); } return dataColumn; } internal DataColumn[] BuildKey(XmlSchemaIdentityConstraint keyNode, DataTable table) { ArrayList arrayList = new ArrayList(); foreach (XmlSchemaXPath field in keyNode.Fields) { arrayList.Add(FindField(table, field.XPath)); } DataColumn[] array = new DataColumn[arrayList.Count]; arrayList.CopyTo(array, 0); return array; } internal bool GetBooleanAttribute(XmlSchemaAnnotated element, string attrName, bool defVal) { string msdataAttribute = GetMsdataAttribute(element, attrName); if (msdataAttribute == null || msdataAttribute.Length == 0) { return defVal; } switch (msdataAttribute) { case "true": case "1": return true; case "false": case "0": return false; default: throw ExceptionBuilder.InvalidAttributeValue(attrName, msdataAttribute); } } internal string GetStringAttribute(XmlSchemaAnnotated element, string attrName, string defVal) { string msdataAttribute = GetMsdataAttribute(element, attrName); if (msdataAttribute == null || msdataAttribute.Length == 0) { return defVal; } return msdataAttribute; } internal static AcceptRejectRule TranslateAcceptRejectRule(string strRule) { if (strRule == "Cascade") { return AcceptRejectRule.Cascade; } _ = strRule == "None"; return AcceptRejectRule.None; } internal static Rule TranslateRule(string strRule) { return strRule switch { "Cascade" => Rule.Cascade, "None" => Rule.None, "SetDefault" => Rule.SetDefault, "SetNull" => Rule.SetNull, _ => Rule.Cascade, }; } internal void HandleKeyref(XmlSchemaKeyref keyref) { string text = XmlConvert.DecodeName(keyref.Refer.Name); string defVal = XmlConvert.DecodeName(keyref.Name); defVal = GetStringAttribute(keyref, "ConstraintName", defVal); string tableName = GetTableName(keyref); string msdataAttribute = GetMsdataAttribute(keyref, "TableNamespace"); DataTable tableSmart = _ds.Tables.GetTableSmart(tableName, msdataAttribute); if (tableSmart == null) { return; } if (text == null || text.Length == 0) { throw ExceptionBuilder.MissingRefer(defVal); } ConstraintTable constraintTable = (ConstraintTable)_constraintNodes[text]; if (constraintTable == null) { throw ExceptionBuilder.InvalidKey(defVal); } DataColumn[] array = BuildKey(constraintTable.constraint, constraintTable.table); DataColumn[] array2 = BuildKey(keyref, tableSmart); ForeignKeyConstraint foreignKeyConstraint = null; if (GetBooleanAttribute(keyref, "ConstraintOnly", defVal: false)) { int num = array2[0].Table.Constraints.InternalIndexOf(defVal); if (num > -1 && array2[0].Table.Constraints[num].ConstraintName != defVal) { num = -1; } if (num < 0) { foreignKeyConstraint = new ForeignKeyConstraint(defVal, array, array2); array2[0].Table.Constraints.Add(foreignKeyConstraint); } } else { string text2 = XmlConvert.DecodeName(GetStringAttribute(keyref, "RelationName", keyref.Name)); if (text2 == null || text2.Length == 0) { text2 = defVal; } int num2 = array2[0].Table.DataSet.Relations.InternalIndexOf(text2); if (num2 > -1 && array2[0].Table.DataSet.Relations[num2].RelationName != text2) { num2 = -1; } DataRelation dataRelation = null; if (num2 < 0) { dataRelation = new DataRelation(text2, array, array2); SetExtProperties(dataRelation, keyref.UnhandledAttributes); array[0].Table.DataSet.Relations.Add(dataRelation); if (FromInference && dataRelation.Nested && _tableDictionary.ContainsKey(dataRelation.ParentTable)) { _tableDictionary[dataRelation.ParentTable].Add(dataRelation.ChildTable); } foreignKeyConstraint = dataRelation.ChildKeyConstraint; foreignKeyConstraint.ConstraintName = defVal; } else { dataRelation = array2[0].Table.DataSet.Relations[num2]; } if (GetBooleanAttribute(keyref, "IsNested", defVal: false)) { dataRelation.Nested = true; } } string msdataAttribute2 = GetMsdataAttribute(keyref, "AcceptRejectRule"); string msdataAttribute3 = GetMsdataAttribute(keyref, "UpdateRule"); string msdataAttribute4 = GetMsdataAttribute(keyref, "DeleteRule"); if (foreignKeyConstraint != null) { if (msdataAttribute2 != null) { foreignKeyConstraint.AcceptRejectRule = TranslateAcceptRejectRule(msdataAttribute2); } if (msdataAttribute3 != null) { foreignKeyConstraint.UpdateRule = TranslateRule(msdataAttribute3); } if (msdataAttribute4 != null) { foreignKeyConstraint.DeleteRule = TranslateRule(msdataAttribute4); } SetExtProperties(foreignKeyConstraint, keyref.UnhandledAttributes); } } internal void HandleConstraint(XmlSchemaIdentityConstraint keyNode) { string text = null; text = XmlConvert.DecodeName(keyNode.Name); if (text == null || text.Length == 0) { throw ExceptionBuilder.MissingAttribute("name"); } if (_constraintNodes.ContainsKey(text)) { throw ExceptionBuilder.DuplicateConstraintRead(text); } string tableName = GetTableName(keyNode); string msdataAttribute = GetMsdataAttribute(keyNode, "TableNamespace"); DataTable tableSmart = _ds.Tables.GetTableSmart(tableName, msdataAttribute); if (tableSmart == null) { return; } _constraintNodes.Add(text, new ConstraintTable(tableSmart, keyNode)); bool booleanAttribute = GetBooleanAttribute(keyNode, "PrimaryKey", defVal: false); text = GetStringAttribute(keyNode, "ConstraintName", text); DataColumn[] array = BuildKey(keyNode, tableSmart); if (array.Length == 0) { return; } UniqueConstraint uniqueConstraint = (UniqueConstraint)array[0].Table.Constraints.FindConstraint(new UniqueConstraint(text, array)); if (uniqueConstraint == null) { array[0].Table.Constraints.Add(text, array, booleanAttribute); SetExtProperties(array[0].Table.Constraints[text], keyNode.UnhandledAttributes); } else { array = uniqueConstraint.ColumnsReference; SetExtProperties(uniqueConstraint, keyNode.UnhandledAttributes); if (booleanAttribute) { array[0].Table.PrimaryKey = array; } } if (keyNode is XmlSchemaKey) { for (int i = 0; i < array.Length; i++) { array[i].AllowDBNull = false; } } } internal DataTable InstantiateSimpleTable(XmlSchemaElement node) { string text = XmlConvert.DecodeName(GetInstanceName(node)); string @namespace = node.QualifiedName.Namespace; DataTable dataTable = _ds.Tables.GetTable(text, @namespace); if (!FromInference && dataTable != null) { throw ExceptionBuilder.DuplicateDeclaration(text); } if (dataTable == null) { dataTable = new DataTable(text); dataTable.Namespace = @namespace; dataTable.Namespace = GetStringAttribute(node, "targetNamespace", @namespace); if (!FromInference) { dataTable.MinOccurs = node.MinOccurs; dataTable.MaxOccurs = node.MaxOccurs; } else { string prefix = GetPrefix(@namespace); if (prefix != null) { dataTable.Prefix = prefix; } } SetProperties(dataTable, node.UnhandledAttributes); SetExtProperties(dataTable, node.UnhandledAttributes); } XmlSchemaComplexType xmlSchemaComplexType = node.SchemaType as XmlSchemaComplexType; bool flag = node.ElementSchemaType.BaseXmlSchemaType != null || (xmlSchemaComplexType != null && xmlSchemaComplexType.ContentModel is XmlSchemaSimpleContent); if (!FromInference || (flag && dataTable.Columns.Count == 0)) { HandleElementColumn(node, dataTable, isBase: false); string text2; if (FromInference) { int num = 0; text2 = text + "_Text"; while (dataTable.Columns[text2] != null) { text2 += num++; } } else { text2 = text + "_Column"; } dataTable.Columns[0].ColumnName = text2; dataTable.Columns[0].ColumnMapping = MappingType.SimpleContent; } if (!FromInference || _ds.Tables.GetTable(text, @namespace) == null) { _ds.Tables.Add(dataTable); if (FromInference) { _tableDictionary.Add(dataTable, new List()); } } if (_dsElement != null && _dsElement.Constraints != null) { foreach (XmlSchemaIdentityConstraint constraint in _dsElement.Constraints) { if (!(constraint is XmlSchemaKeyref) && GetTableName(constraint) == dataTable.TableName) { HandleConstraint(constraint); } } } dataTable._fNestedInDataset = false; return dataTable; } internal string GetInstanceName(XmlSchemaAnnotated node) { string result = null; if (node is XmlSchemaElement) { XmlSchemaElement xmlSchemaElement = (XmlSchemaElement)node; result = ((xmlSchemaElement.Name != null) ? xmlSchemaElement.Name : xmlSchemaElement.RefName.Name); } else if (node is XmlSchemaAttribute) { XmlSchemaAttribute xmlSchemaAttribute = (XmlSchemaAttribute)node; result = ((xmlSchemaAttribute.Name != null) ? xmlSchemaAttribute.Name : xmlSchemaAttribute.RefName.Name); } return result; } internal DataTable InstantiateTable(XmlSchemaElement node, XmlSchemaComplexType typeNode, bool isRef) { string instanceName = GetInstanceName(node); ArrayList arrayList = new ArrayList(); string @namespace = node.QualifiedName.Namespace; DataTable dataTable = _ds.Tables.GetTable(XmlConvert.DecodeName(instanceName), @namespace); if (!FromInference || (FromInference && dataTable == null)) { if (dataTable != null) { if (isRef) { return dataTable; } throw ExceptionBuilder.DuplicateDeclaration(instanceName); } if (isRef) { _refTables.Add(@namespace + ":" + instanceName); } dataTable = new DataTable(XmlConvert.DecodeName(instanceName)); dataTable.TypeName = node.SchemaTypeName; dataTable.Namespace = @namespace; dataTable.Namespace = GetStringAttribute(node, "targetNamespace", @namespace); string stringAttribute = GetStringAttribute(typeNode, "CaseSensitive", ""); if (stringAttribute.Length == 0) { stringAttribute = GetStringAttribute(node, "CaseSensitive", ""); } if (0 < stringAttribute.Length) { if (stringAttribute == "true" || stringAttribute == "True") { dataTable.CaseSensitive = true; } if (stringAttribute == "false" || stringAttribute == "False") { dataTable.CaseSensitive = false; } } stringAttribute = GetMsdataAttribute(node, "Locale"); if (stringAttribute != null) { if (0 < stringAttribute.Length) { dataTable.Locale = new CultureInfo(stringAttribute); } else { dataTable.Locale = CultureInfo.InvariantCulture; } } if (!FromInference) { dataTable.MinOccurs = node.MinOccurs; dataTable.MaxOccurs = node.MaxOccurs; } else { string prefix = GetPrefix(@namespace); if (prefix != null) { dataTable.Prefix = prefix; } } _ds.Tables.Add(dataTable); if (FromInference) { _tableDictionary.Add(dataTable, new List()); } } HandleComplexType(typeNode, dataTable, arrayList, node.IsNillable); for (int i = 0; i < dataTable.Columns.Count; i++) { dataTable.Columns[i].SetOrdinalInternal(i); } SetProperties(dataTable, node.UnhandledAttributes); SetExtProperties(dataTable, node.UnhandledAttributes); if (_dsElement != null && _dsElement.Constraints != null) { foreach (XmlSchemaIdentityConstraint constraint in _dsElement.Constraints) { if (!(constraint is XmlSchemaKeyref) && GetTableName(constraint) == dataTable.TableName && (GetTableNamespace(constraint) == dataTable.Namespace || GetTableNamespace(constraint) == null)) { HandleConstraint(constraint); } } } foreach (DataTable item in arrayList) { if (item != dataTable && dataTable.Namespace == item.Namespace) { item._tableNamespace = null; } if (_dsElement != null && _dsElement.Constraints != null) { foreach (XmlSchemaIdentityConstraint constraint2 in _dsElement.Constraints) { if (!(constraint2 is XmlSchemaKeyref xmlSchemaKeyref) || !GetBooleanAttribute(xmlSchemaKeyref, "IsNested", defVal: false) || !(GetTableName(xmlSchemaKeyref) == item.TableName)) { continue; } if (item.DataSet.Tables.InternalIndexOf(item.TableName) < -1) { if (GetTableNamespace(xmlSchemaKeyref) == item.Namespace) { HandleKeyref(xmlSchemaKeyref); } } else { HandleKeyref(xmlSchemaKeyref); } } } DataRelation dataRelation = null; DataRelationCollection childRelations = dataTable.ChildRelations; for (int j = 0; j < childRelations.Count; j++) { if (childRelations[j].Nested && item == childRelations[j].ChildTable) { dataRelation = childRelations[j]; } } if (dataRelation != null) { continue; } DataColumn dataColumn2; if (FromInference) { int num = dataTable.UKColumnPositionForInference; if (num == -1) { foreach (DataColumn column in dataTable.Columns) { if (column.ColumnMapping == MappingType.Attribute) { num = column.Ordinal; break; } } } dataColumn2 = dataTable.AddUniqueKey(num); } else { dataColumn2 = dataTable.AddUniqueKey(); } DataColumn dataColumn3 = item.AddForeignKey(dataColumn2); if (FromInference) { dataColumn3.Prefix = item.Prefix; } dataRelation = new DataRelation(dataTable.TableName + "_" + item.TableName, dataColumn2, dataColumn3, createConstraints: true); dataRelation.Nested = true; item.DataSet.Relations.Add(dataRelation); if (FromInference && dataRelation.Nested && _tableDictionary.ContainsKey(dataRelation.ParentTable)) { _tableDictionary[dataRelation.ParentTable].Add(dataRelation.ChildTable); } } return dataTable; } public static Type XsdtoClr(string xsdTypeName) { int num = Array.BinarySearch(s_mapNameTypeXsd, xsdTypeName); if (num < 0) { throw ExceptionBuilder.UndefinedDatatype(xsdTypeName); } return s_mapNameTypeXsd[num].type; } private static NameType FindNameType(string name) { int num = Array.BinarySearch(s_mapNameTypeXsd, name); if (num < 0) { throw ExceptionBuilder.UndefinedDatatype(name); } return s_mapNameTypeXsd[num]; } private Type ParseDataType(string dt) { if (!IsXsdType(dt) && _udSimpleTypes != null) { SimpleType simpleType = new SimpleType(((XmlSchemaSimpleType)_udSimpleTypes[dt]) ?? throw ExceptionBuilder.UndefinedDatatype(dt)); while (simpleType.BaseSimpleType != null) { simpleType = simpleType.BaseSimpleType; } return ParseDataType(simpleType.BaseType); } return FindNameType(dt).type; } internal static bool IsXsdType(string name) { if (Array.BinarySearch(s_mapNameTypeXsd, name) < 0) { return false; } return true; } internal XmlSchemaAnnotated FindTypeNode(XmlSchemaAnnotated node) { XmlSchemaAttribute xmlSchemaAttribute = node as XmlSchemaAttribute; XmlSchemaElement xmlSchemaElement = node as XmlSchemaElement; bool flag = false; if (xmlSchemaAttribute != null) { flag = true; } string text = (flag ? xmlSchemaAttribute.SchemaTypeName.Name : xmlSchemaElement.SchemaTypeName.Name); if ((flag ? xmlSchemaAttribute.SchemaTypeName.Namespace : xmlSchemaElement.SchemaTypeName.Namespace) == "http://www.w3.org/2001/XMLSchema") { return null; } if (text == null || text.Length == 0) { text = (flag ? xmlSchemaAttribute.RefName.Name : xmlSchemaElement.RefName.Name); if (text == null || text.Length == 0) { return flag ? xmlSchemaAttribute.SchemaType : xmlSchemaElement.SchemaType; } return flag ? FindTypeNode((XmlSchemaAnnotated)_attributes[xmlSchemaAttribute.RefName]) : FindTypeNode((XmlSchemaAnnotated)_elementsTable[xmlSchemaElement.RefName]); } return (XmlSchemaAnnotated)_schemaTypes[flag ? ((XmlSchemaAttribute)node).SchemaTypeName : ((XmlSchemaElement)node).SchemaTypeName]; } internal void HandleSimpleTypeSimpleContentColumn(XmlSchemaSimpleType typeNode, string strType, DataTable table, bool isBase, XmlAttribute[] attrs, bool isNillable) { if (FromInference && table.XmlText != null) { return; } Type type = null; SimpleType simpleType = null; if (typeNode.QualifiedName.Name != null && typeNode.QualifiedName.Name.Length != 0 && typeNode.QualifiedName.Namespace != "http://www.w3.org/2001/XMLSchema") { simpleType = new SimpleType(typeNode); strType = typeNode.QualifiedName.ToString(); type = ParseDataType(typeNode.QualifiedName.ToString()); } else if (typeNode.BaseXmlSchemaType is XmlSchemaSimpleType xmlSchemaSimpleType && xmlSchemaSimpleType.QualifiedName.Namespace != "http://www.w3.org/2001/XMLSchema") { simpleType = new SimpleType(typeNode); SimpleType simpleType2 = simpleType; while (simpleType2.BaseSimpleType != null) { simpleType2 = simpleType2.BaseSimpleType; } type = ParseDataType(simpleType2.BaseType); strType = simpleType.Name; } else { type = ParseDataType(strType); } string text; if (FromInference) { int num = 0; text = table.TableName + "_Text"; while (table.Columns[text] != null) { text += num++; } } else { text = table.TableName + "_text"; } string text2 = text; bool flag = true; DataColumn dataColumn; if (!isBase && table.Columns.Contains(text2, caseSensitive: true)) { dataColumn = table.Columns[text2]; flag = false; } else { dataColumn = new DataColumn(text2, type, null, MappingType.SimpleContent); } SetProperties(dataColumn, attrs); HandleColumnExpression(dataColumn, attrs); SetExtProperties(dataColumn, attrs); string value = (-1).ToString(CultureInfo.CurrentCulture); string text3 = null; dataColumn.AllowDBNull = isNillable; if (attrs != null) { for (int i = 0; i < attrs.Length; i++) { if (attrs[i].LocalName == "AllowDBNull" && attrs[i].NamespaceURI == "urn:schemas-microsoft-com:xml-msdata" && attrs[i].Value == "false") { dataColumn.AllowDBNull = false; } if (attrs[i].LocalName == "Ordinal" && attrs[i].NamespaceURI == "urn:schemas-microsoft-com:xml-msdata") { value = attrs[i].Value; } if (attrs[i].LocalName == "DefaultValue" && attrs[i].NamespaceURI == "urn:schemas-microsoft-com:xml-msdata") { text3 = attrs[i].Value; } } } int num2 = (int)Convert.ChangeType(value, typeof(int), null); if (dataColumn.Expression != null && dataColumn.Expression.Length != 0) { _columnExpressions.Add(dataColumn); } if (simpleType != null && simpleType.Name != null && simpleType.Name.Length > 0) { if (GetMsdataAttribute(typeNode, "targetNamespace") != null) { dataColumn.XmlDataType = simpleType.SimpleTypeQualifiedName; } } else { dataColumn.XmlDataType = strType; } dataColumn.SimpleType = simpleType; if (flag) { if (FromInference) { dataColumn.Prefix = GetPrefix(table.Namespace); dataColumn.AllowDBNull = true; } if (num2 > -1 && num2 < table.Columns.Count) { table.Columns.AddAt(num2, dataColumn); } else { table.Columns.Add(dataColumn); } } if (text3 != null) { try { dataColumn.DefaultValue = dataColumn.ConvertXmlToObject(text3); } catch (FormatException) { throw ExceptionBuilder.CannotConvert(text3, type.FullName); } } } internal void HandleSimpleContentColumn(string strType, DataTable table, bool isBase, XmlAttribute[] attrs, bool isNillable) { if (FromInference && table.XmlText != null) { return; } Type type = null; if (strType == null) { return; } type = ParseDataType(strType); string text; if (FromInference) { int num = 0; text = table.TableName + "_Text"; while (table.Columns[text] != null) { text += num++; } } else { text = table.TableName + "_text"; } string text2 = text; bool flag = true; DataColumn dataColumn; if (!isBase && table.Columns.Contains(text2, caseSensitive: true)) { dataColumn = table.Columns[text2]; flag = false; } else { dataColumn = new DataColumn(text2, type, null, MappingType.SimpleContent); } SetProperties(dataColumn, attrs); HandleColumnExpression(dataColumn, attrs); SetExtProperties(dataColumn, attrs); string value = (-1).ToString(CultureInfo.CurrentCulture); string text3 = null; dataColumn.AllowDBNull = isNillable; if (attrs != null) { for (int i = 0; i < attrs.Length; i++) { if (attrs[i].LocalName == "AllowDBNull" && attrs[i].NamespaceURI == "urn:schemas-microsoft-com:xml-msdata" && attrs[i].Value == "false") { dataColumn.AllowDBNull = false; } if (attrs[i].LocalName == "Ordinal" && attrs[i].NamespaceURI == "urn:schemas-microsoft-com:xml-msdata") { value = attrs[i].Value; } if (attrs[i].LocalName == "DefaultValue" && attrs[i].NamespaceURI == "urn:schemas-microsoft-com:xml-msdata") { text3 = attrs[i].Value; } } } int num2 = (int)Convert.ChangeType(value, typeof(int), null); if (dataColumn.Expression != null && dataColumn.Expression.Length != 0) { _columnExpressions.Add(dataColumn); } dataColumn.XmlDataType = strType; dataColumn.SimpleType = null; if (FromInference) { dataColumn.Prefix = GetPrefix(dataColumn.Namespace); } if (flag) { if (FromInference) { dataColumn.AllowDBNull = true; } if (num2 > -1 && num2 < table.Columns.Count) { table.Columns.AddAt(num2, dataColumn); } else { table.Columns.Add(dataColumn); } } if (text3 == null) { return; } try { dataColumn.DefaultValue = dataColumn.ConvertXmlToObject(text3); } catch (FormatException) { throw ExceptionBuilder.CannotConvert(text3, type.FullName); } } internal void HandleAttributeColumn(XmlSchemaAttribute attrib, DataTable table, bool isBase) { Type type = null; XmlSchemaAttribute xmlSchemaAttribute = ((attrib.Name != null) ? attrib : ((XmlSchemaAttribute)_attributes[attrib.RefName])); XmlSchemaAnnotated xmlSchemaAnnotated = FindTypeNode(xmlSchemaAttribute); string text = null; SimpleType simpleType = null; if (xmlSchemaAnnotated == null) { text = xmlSchemaAttribute.SchemaTypeName.Name; if (!string.IsNullOrEmpty(text)) { type = ((!(xmlSchemaAttribute.SchemaTypeName.Namespace != "http://www.w3.org/2001/XMLSchema")) ? ParseDataType(xmlSchemaAttribute.SchemaTypeName.Name) : ParseDataType(xmlSchemaAttribute.SchemaTypeName.ToString())); } else { text = string.Empty; type = typeof(string); } } else if (xmlSchemaAnnotated is XmlSchemaSimpleType) { XmlSchemaSimpleType xmlSchemaSimpleType = xmlSchemaAnnotated as XmlSchemaSimpleType; simpleType = new SimpleType(xmlSchemaSimpleType); if (xmlSchemaSimpleType.QualifiedName.Name != null && xmlSchemaSimpleType.QualifiedName.Name.Length != 0 && xmlSchemaSimpleType.QualifiedName.Namespace != "http://www.w3.org/2001/XMLSchema") { text = xmlSchemaSimpleType.QualifiedName.ToString(); type = ParseDataType(xmlSchemaSimpleType.QualifiedName.ToString()); } else { type = ParseDataType(simpleType.BaseType); text = simpleType.Name; if (simpleType.Length == 1 && type == typeof(string)) { type = typeof(char); } } } else { if (!(xmlSchemaAnnotated is XmlSchemaElement)) { if (xmlSchemaAnnotated.Id == null) { throw ExceptionBuilder.DatatypeNotDefined(); } throw ExceptionBuilder.UndefinedDatatype(xmlSchemaAnnotated.Id); } text = ((XmlSchemaElement)xmlSchemaAnnotated).SchemaTypeName.Name; type = ParseDataType(text); } string text2 = XmlConvert.DecodeName(GetInstanceName(xmlSchemaAttribute)); bool flag = true; DataColumn dataColumn; if ((!isBase || FromInference) && table.Columns.Contains(text2, caseSensitive: true)) { dataColumn = table.Columns[text2]; flag = false; if (FromInference) { if (dataColumn.ColumnMapping != MappingType.Attribute) { throw ExceptionBuilder.ColumnTypeConflict(dataColumn.ColumnName); } if ((string.IsNullOrEmpty(attrib.QualifiedName.Namespace) && string.IsNullOrEmpty(dataColumn._columnUri)) || string.Equals(attrib.QualifiedName.Namespace, dataColumn.Namespace, StringComparison.Ordinal)) { return; } dataColumn = new DataColumn(text2, type, null, MappingType.Attribute); flag = true; } } else { dataColumn = new DataColumn(text2, type, null, MappingType.Attribute); } SetProperties(dataColumn, xmlSchemaAttribute.UnhandledAttributes); HandleColumnExpression(dataColumn, xmlSchemaAttribute.UnhandledAttributes); SetExtProperties(dataColumn, xmlSchemaAttribute.UnhandledAttributes); if (dataColumn.Expression != null && dataColumn.Expression.Length != 0) { _columnExpressions.Add(dataColumn); } if (simpleType != null && simpleType.Name != null && simpleType.Name.Length > 0) { if (GetMsdataAttribute(xmlSchemaAnnotated, "targetNamespace") != null) { dataColumn.XmlDataType = simpleType.SimpleTypeQualifiedName; } } else { dataColumn.XmlDataType = text; } dataColumn.SimpleType = simpleType; dataColumn.AllowDBNull = attrib.Use != XmlSchemaUse.Required; dataColumn.Namespace = attrib.QualifiedName.Namespace; dataColumn.Namespace = GetStringAttribute(attrib, "targetNamespace", dataColumn.Namespace); if (flag) { if (FromInference) { dataColumn.AllowDBNull = true; dataColumn.Prefix = GetPrefix(dataColumn.Namespace); } table.Columns.Add(dataColumn); } if (attrib.Use == XmlSchemaUse.Prohibited) { dataColumn.ColumnMapping = MappingType.Hidden; dataColumn.AllowDBNull = GetBooleanAttribute(xmlSchemaAttribute, "AllowDBNull", defVal: true); string msdataAttribute = GetMsdataAttribute(xmlSchemaAttribute, "DefaultValue"); if (msdataAttribute != null) { try { dataColumn.DefaultValue = dataColumn.ConvertXmlToObject(msdataAttribute); } catch (FormatException) { throw ExceptionBuilder.CannotConvert(msdataAttribute, type.FullName); } } } string text3 = ((attrib.Use == XmlSchemaUse.Required) ? GetMsdataAttribute(xmlSchemaAttribute, "DefaultValue") : xmlSchemaAttribute.DefaultValue); if (xmlSchemaAttribute.Use == XmlSchemaUse.Optional && text3 == null) { text3 = xmlSchemaAttribute.FixedValue; } if (text3 != null) { try { dataColumn.DefaultValue = dataColumn.ConvertXmlToObject(text3); } catch (FormatException) { throw ExceptionBuilder.CannotConvert(text3, type.FullName); } } } internal void HandleElementColumn(XmlSchemaElement elem, DataTable table, bool isBase) { Type type = null; XmlSchemaElement xmlSchemaElement = ((elem.Name != null) ? elem : ((XmlSchemaElement)_elementsTable[elem.RefName])); if (xmlSchemaElement == null) { return; } XmlSchemaAnnotated xmlSchemaAnnotated = FindTypeNode(xmlSchemaElement); string text = null; SimpleType simpleType = null; if (xmlSchemaAnnotated == null) { text = xmlSchemaElement.SchemaTypeName.Name; if (string.IsNullOrEmpty(text)) { text = string.Empty; type = typeof(string); } else { type = ParseDataType(xmlSchemaElement.SchemaTypeName.Name); } } else if (xmlSchemaAnnotated is XmlSchemaSimpleType) { XmlSchemaSimpleType node = xmlSchemaAnnotated as XmlSchemaSimpleType; simpleType = new SimpleType(node); if (((XmlSchemaSimpleType)xmlSchemaAnnotated).Name != null && ((XmlSchemaSimpleType)xmlSchemaAnnotated).Name.Length != 0 && ((XmlSchemaSimpleType)xmlSchemaAnnotated).QualifiedName.Namespace != "http://www.w3.org/2001/XMLSchema") { GetMsdataAttribute(xmlSchemaAnnotated, "targetNamespace"); text = ((XmlSchemaSimpleType)xmlSchemaAnnotated).QualifiedName.ToString(); type = ParseDataType(text); } else { for (node = ((simpleType.XmlBaseType != null && simpleType.XmlBaseType.Namespace != "http://www.w3.org/2001/XMLSchema") ? (_schemaTypes[simpleType.XmlBaseType] as XmlSchemaSimpleType) : null); node != null; node = ((simpleType.XmlBaseType != null && simpleType.XmlBaseType.Namespace != "http://www.w3.org/2001/XMLSchema") ? (_schemaTypes[simpleType.XmlBaseType] as XmlSchemaSimpleType) : null)) { simpleType.LoadTypeValues(node); } type = ParseDataType(simpleType.BaseType); text = simpleType.Name; if (simpleType.Length == 1 && type == typeof(string)) { type = typeof(char); } } } else if (xmlSchemaAnnotated is XmlSchemaElement) { text = ((XmlSchemaElement)xmlSchemaAnnotated).SchemaTypeName.Name; type = ParseDataType(text); } else { if (!(xmlSchemaAnnotated is XmlSchemaComplexType)) { if (xmlSchemaAnnotated.Id == null) { throw ExceptionBuilder.DatatypeNotDefined(); } throw ExceptionBuilder.UndefinedDatatype(xmlSchemaAnnotated.Id); } if (string.IsNullOrEmpty(GetMsdataAttribute(elem, "DataType"))) { throw ExceptionBuilder.DatatypeNotDefined(); } type = typeof(object); } string text2 = XmlConvert.DecodeName(GetInstanceName(xmlSchemaElement)); bool flag = true; DataColumn dataColumn; if ((!isBase || FromInference) && table.Columns.Contains(text2, caseSensitive: true)) { dataColumn = table.Columns[text2]; flag = false; if (FromInference) { if (dataColumn.ColumnMapping != MappingType.Element) { throw ExceptionBuilder.ColumnTypeConflict(dataColumn.ColumnName); } if ((string.IsNullOrEmpty(elem.QualifiedName.Namespace) && string.IsNullOrEmpty(dataColumn._columnUri)) || string.Equals(elem.QualifiedName.Namespace, dataColumn.Namespace, StringComparison.Ordinal)) { return; } dataColumn = new DataColumn(text2, type, null, MappingType.Element); flag = true; } } else { dataColumn = new DataColumn(text2, type, null, MappingType.Element); } SetProperties(dataColumn, xmlSchemaElement.UnhandledAttributes); HandleColumnExpression(dataColumn, xmlSchemaElement.UnhandledAttributes); SetExtProperties(dataColumn, xmlSchemaElement.UnhandledAttributes); if (!string.IsNullOrEmpty(dataColumn.Expression)) { _columnExpressions.Add(dataColumn); } if (simpleType != null && simpleType.Name != null && simpleType.Name.Length > 0) { if (GetMsdataAttribute(xmlSchemaAnnotated, "targetNamespace") != null) { dataColumn.XmlDataType = simpleType.SimpleTypeQualifiedName; } } else { dataColumn.XmlDataType = text; } dataColumn.SimpleType = simpleType; dataColumn.AllowDBNull = FromInference || elem.MinOccurs == 0m || elem.IsNillable; if (!elem.RefName.IsEmpty || elem.QualifiedName.Namespace != table.Namespace) { dataColumn.Namespace = elem.QualifiedName.Namespace; dataColumn.Namespace = GetStringAttribute(xmlSchemaElement, "targetNamespace", dataColumn.Namespace); } else if (elem.Form == XmlSchemaForm.Unqualified) { dataColumn.Namespace = string.Empty; } else if (elem.Form == XmlSchemaForm.None) { XmlSchemaObject parent = elem.Parent; while (parent.Parent != null) { parent = parent.Parent; } if (((XmlSchema)parent).ElementFormDefault == XmlSchemaForm.Unqualified) { dataColumn.Namespace = string.Empty; } } else { dataColumn.Namespace = elem.QualifiedName.Namespace; dataColumn.Namespace = GetStringAttribute(xmlSchemaElement, "targetNamespace", dataColumn.Namespace); } int num = (int)Convert.ChangeType(GetStringAttribute(elem, "Ordinal", (-1).ToString(CultureInfo.CurrentCulture)), typeof(int), null); if (flag) { if (num > -1 && num < table.Columns.Count) { table.Columns.AddAt(num, dataColumn); } else { table.Columns.Add(dataColumn); } } if (dataColumn.Namespace == table.Namespace) { dataColumn._columnUri = null; } if (FromInference) { dataColumn.Prefix = GetPrefix(dataColumn.Namespace); } string defaultValue = xmlSchemaElement.DefaultValue; if (defaultValue == null) { return; } try { dataColumn.DefaultValue = dataColumn.ConvertXmlToObject(defaultValue); } catch (FormatException) { throw ExceptionBuilder.CannotConvert(defaultValue, type.FullName); } } internal void HandleDataSet(XmlSchemaElement node, bool isNewDataSet) { string text = node.Name; string @namespace = node.QualifiedName.Namespace; _ = _ds.Tables.Count; List list = new List(); string msdataAttribute = GetMsdataAttribute(node, "Locale"); if (msdataAttribute != null) { if (msdataAttribute.Length != 0) { _ds.Locale = new CultureInfo(msdataAttribute); } else { _ds.Locale = CultureInfo.InvariantCulture; } } else if (GetBooleanAttribute(node, "UseCurrentLocale", defVal: false)) { _ds.SetLocaleValue(CultureInfo.CurrentCulture, userSet: false); } else { _ds.SetLocaleValue(new CultureInfo(1033), userSet: false); } msdataAttribute = GetMsdataAttribute(node, "DataSetName"); if (msdataAttribute != null && msdataAttribute.Length != 0) { text = msdataAttribute; } msdataAttribute = GetMsdataAttribute(node, "DataSetNamespace"); if (msdataAttribute != null && msdataAttribute.Length != 0) { @namespace = msdataAttribute; } SetProperties(_ds, node.UnhandledAttributes); SetExtProperties(_ds, node.UnhandledAttributes); if (text != null && text.Length != 0) { _ds.DataSetName = XmlConvert.DecodeName(text); } _ds.Namespace = @namespace; if (FromInference) { _ds.Prefix = GetPrefix(_ds.Namespace); } XmlSchemaComplexType xmlSchemaComplexType = (XmlSchemaComplexType)FindTypeNode(node); if (xmlSchemaComplexType.Particle != null) { XmlSchemaObjectCollection particleItems = GetParticleItems(xmlSchemaComplexType.Particle); if (particleItems == null) { return; } foreach (XmlSchemaAnnotated item in particleItems) { if (item is XmlSchemaElement) { if (((XmlSchemaElement)item).RefName.Name.Length != 0) { if (!FromInference) { continue; } DataTable table = _ds.Tables.GetTable(XmlConvert.DecodeName(GetInstanceName((XmlSchemaElement)item)), node.QualifiedName.Namespace); if (table != null) { list.Add(table); } bool flag = false; if (node.ElementSchemaType != null || !(((XmlSchemaElement)item).SchemaType is XmlSchemaComplexType)) { flag = true; } if (((XmlSchemaElement)item).MaxOccurs != 1m && !flag) { continue; } } DataTable dataTable = HandleTable((XmlSchemaElement)item); if (dataTable != null) { dataTable._fNestedInDataset = true; } if (FromInference) { list.Add(dataTable); } } else { if (!(item is XmlSchemaChoice)) { continue; } XmlSchemaObjectCollection items = ((XmlSchemaChoice)item).Items; if (items == null) { continue; } foreach (XmlSchemaAnnotated item2 in items) { if (!(item2 is XmlSchemaElement)) { continue; } if (((XmlSchemaParticle)item).MaxOccurs > 1m && ((XmlSchemaElement)item2).SchemaType is XmlSchemaComplexType) { ((XmlSchemaElement)item2).MaxOccurs = ((XmlSchemaParticle)item).MaxOccurs; } if (((XmlSchemaElement)item2).RefName.Name.Length == 0 || FromInference || !(((XmlSchemaElement)item2).MaxOccurs != 1m) || ((XmlSchemaElement)item2).SchemaType is XmlSchemaComplexType) { DataTable dataTable2 = HandleTable((XmlSchemaElement)item2); if (FromInference) { list.Add(dataTable2); } if (dataTable2 != null) { dataTable2._fNestedInDataset = true; } } } } } } if (node.Constraints != null) { foreach (XmlSchemaIdentityConstraint constraint in node.Constraints) { if (constraint is XmlSchemaKeyref xmlSchemaKeyref && !GetBooleanAttribute(xmlSchemaKeyref, "IsNested", defVal: false)) { HandleKeyref(xmlSchemaKeyref); } } } if (!(FromInference && isNewDataSet)) { return; } List tableList = new List(_ds.Tables.Count); foreach (DataTable item3 in list) { AddTablesToList(tableList, item3); } _ds.Tables.ReplaceFromInference(tableList); } private void AddTablesToList(List tableList, DataTable dt) { if (tableList.Contains(dt)) { return; } tableList.Add(dt); foreach (DataTable item in _tableDictionary[dt]) { AddTablesToList(tableList, item); } } private string GetPrefix(string ns) { if (ns == null) { return null; } foreach (XmlSchema item in _schemaSet.Schemas()) { XmlQualifiedName[] array = item.Namespaces.ToArray(); for (int i = 0; i < array.Length; i++) { if (array[i].Namespace == ns) { return array[i].Name; } } } return null; } private string GetNamespaceFromPrefix(string prefix) { if (prefix == null || prefix.Length == 0) { return null; } foreach (XmlSchema item in _schemaSet.Schemas()) { XmlQualifiedName[] array = item.Namespaces.ToArray(); for (int i = 0; i < array.Length; i++) { if (array[i].Name == prefix) { return array[i].Namespace; } } } return null; } private string GetTableNamespace(XmlSchemaIdentityConstraint key) { string xPath = key.Selector.XPath; string[] array = xPath.Split(new char[1] { '/' }); string empty = string.Empty; string text = array[^1]; if (text == null || text.Length == 0) { throw ExceptionBuilder.InvalidSelector(xPath); } if (text.IndexOf(':') != -1) { empty = text.Substring(0, text.IndexOf(':')); empty = XmlConvert.DecodeName(empty); return GetNamespaceFromPrefix(empty); } return GetMsdataAttribute(key, "TableNamespace"); } private string GetTableName(XmlSchemaIdentityConstraint key) { string xPath = key.Selector.XPath; string text = xPath.Split('/', ':')[^1]; if (text == null || text.Length == 0) { throw ExceptionBuilder.InvalidSelector(xPath); } return XmlConvert.DecodeName(text); } internal bool IsTable(XmlSchemaElement node) { if (node.MaxOccurs == 0m) { return false; } XmlAttribute[] unhandledAttributes = node.UnhandledAttributes; if (unhandledAttributes != null) { foreach (XmlAttribute xmlAttribute in unhandledAttributes) { if (xmlAttribute.LocalName == "DataType" && xmlAttribute.Prefix == "msdata" && xmlAttribute.NamespaceURI == "urn:schemas-microsoft-com:xml-msdata") { return false; } } } object obj = FindTypeNode(node); if (node.MaxOccurs > 1m && obj == null) { return true; } if (obj == null || !(obj is XmlSchemaComplexType)) { return false; } if (((XmlSchemaComplexType)obj).IsAbstract) { throw ExceptionBuilder.CannotInstantiateAbstract(node.Name); } return true; } internal DataTable HandleTable(XmlSchemaElement node) { if (!IsTable(node)) { return null; } object obj = FindTypeNode(node); if (node.MaxOccurs > 1m && obj == null) { return InstantiateSimpleTable(node); } DataTable dataTable = InstantiateTable(node, (XmlSchemaComplexType)obj, node.RefName != null); dataTable._fNestedInDataset = false; return dataTable; } } internal sealed class XmlIgnoreNamespaceReader : XmlNodeReader { private List _namespacesToIgnore; internal XmlIgnoreNamespaceReader(XmlDocument xdoc, string[] namespacesToIgnore) : base(xdoc) { _namespacesToIgnore = new List(namespacesToIgnore); } public override bool MoveToFirstAttribute() { if (base.MoveToFirstAttribute()) { if (_namespacesToIgnore.Contains(NamespaceURI) || (NamespaceURI == "http://www.w3.org/XML/1998/namespace" && LocalName != "lang")) { return MoveToNextAttribute(); } return true; } return false; } public override bool MoveToNextAttribute() { bool result; bool flag; do { result = false; flag = false; if (base.MoveToNextAttribute()) { result = true; if (_namespacesToIgnore.Contains(NamespaceURI) || (NamespaceURI == "http://www.w3.org/XML/1998/namespace" && LocalName != "lang")) { flag = true; } } } while (flag); return result; } } internal sealed class XmlDataLoader { private DataSet _dataSet; private XmlToDatasetMap _nodeToSchemaMap; private Hashtable _nodeToRowMap; private Stack _childRowsStack; private Hashtable _htableExcludedNS; private bool _fIsXdr; internal bool _isDiffgram; private XmlElement _topMostNode; private bool _ignoreSchema; private DataTable _dataTable; private bool _isTableLevel; private bool _fromInference; private XmlReader _dataReader; private object _XSD_XMLNS_NS; private object _XDR_SCHEMA; private object _XDRNS; private object _SQL_SYNC; private object _UPDGNS; private object _XSD_SCHEMA; private object _XSDNS; private object _DFFNS; private object _MSDNS; private object _DIFFID; private object _HASCHANGES; private object _ROWORDER; internal bool FromInference { get { return _fromInference; } set { _fromInference = value; } } internal XmlDataLoader(DataSet dataset, bool IsXdr, bool ignoreSchema) { _dataSet = dataset; _nodeToRowMap = new Hashtable(); _fIsXdr = IsXdr; _ignoreSchema = ignoreSchema; } internal XmlDataLoader(DataSet dataset, bool IsXdr, XmlElement topNode, bool ignoreSchema) { _dataSet = dataset; _nodeToRowMap = new Hashtable(); _fIsXdr = IsXdr; _childRowsStack = new Stack(50); _topMostNode = topNode; _ignoreSchema = ignoreSchema; } internal XmlDataLoader(DataTable datatable, bool IsXdr, bool ignoreSchema) { _dataSet = null; _dataTable = datatable; _isTableLevel = true; _nodeToRowMap = new Hashtable(); _fIsXdr = IsXdr; _ignoreSchema = ignoreSchema; } internal XmlDataLoader(DataTable datatable, bool IsXdr, XmlElement topNode, bool ignoreSchema) { _dataSet = null; _dataTable = datatable; _isTableLevel = true; _nodeToRowMap = new Hashtable(); _fIsXdr = IsXdr; _childRowsStack = new Stack(50); _topMostNode = topNode; _ignoreSchema = ignoreSchema; } private void AttachRows(DataRow parentRow, XmlNode parentElement) { if (parentElement == null) { return; } for (XmlNode xmlNode = parentElement.FirstChild; xmlNode != null; xmlNode = xmlNode.NextSibling) { if (xmlNode.NodeType == XmlNodeType.Element) { XmlElement e = (XmlElement)xmlNode; DataRow rowFromElement = GetRowFromElement(e); if (rowFromElement != null && rowFromElement.RowState == DataRowState.Detached) { if (parentRow != null) { rowFromElement.SetNestedParentRow(parentRow, setNonNested: false); } rowFromElement.Table.Rows.Add(rowFromElement); } else if (rowFromElement == null) { AttachRows(parentRow, xmlNode); } AttachRows(rowFromElement, xmlNode); } } } private int CountNonNSAttributes(XmlNode node) { int num = 0; for (int i = 0; i < node.Attributes.Count; i++) { _ = node.Attributes[i]; if (!FExcludedNamespace(node.Attributes[i].NamespaceURI)) { num++; } } return num; } private string GetValueForTextOnlyColums(XmlNode n) { string text = null; while (n != null && (n.NodeType == XmlNodeType.Whitespace || !IsTextLikeNode(n.NodeType))) { n = n.NextSibling; } if (n != null) { if (IsTextLikeNode(n.NodeType) && (n.NextSibling == null || !IsTextLikeNode(n.NodeType))) { text = n.Value; n = n.NextSibling; } else { StringBuilder stringBuilder = new StringBuilder(); while (n != null && IsTextLikeNode(n.NodeType)) { stringBuilder.Append(n.Value); n = n.NextSibling; } text = stringBuilder.ToString(); } } if (text == null) { text = string.Empty; } return text; } private string GetInitialTextFromNodes(ref XmlNode n) { string text = null; if (n != null) { while (n.NodeType == XmlNodeType.Whitespace) { n = n.NextSibling; } if (IsTextLikeNode(n.NodeType) && (n.NextSibling == null || !IsTextLikeNode(n.NodeType))) { text = n.Value; n = n.NextSibling; } else { StringBuilder stringBuilder = new StringBuilder(); while (n != null && IsTextLikeNode(n.NodeType)) { stringBuilder.Append(n.Value); n = n.NextSibling; } text = stringBuilder.ToString(); } } if (text == null) { text = string.Empty; } return text; } private DataColumn GetTextOnlyColumn(DataRow row) { DataColumnCollection columns = row.Table.Columns; int count = columns.Count; for (int i = 0; i < count; i++) { DataColumn dataColumn = columns[i]; if (IsTextOnly(dataColumn)) { return dataColumn; } } return null; } internal DataRow GetRowFromElement(XmlElement e) { return (DataRow)_nodeToRowMap[e]; } internal bool FColumnElement(XmlElement e) { if (_nodeToSchemaMap.GetColumnSchema(e, FIgnoreNamespace(e)) == null) { return false; } if (CountNonNSAttributes(e) > 0) { return false; } for (XmlNode xmlNode = e.FirstChild; xmlNode != null; xmlNode = xmlNode.NextSibling) { if (xmlNode is XmlElement) { return false; } } return true; } private bool FExcludedNamespace(string ns) { if (ns.Equals("http://www.w3.org/2000/xmlns/")) { return true; } if (_htableExcludedNS == null) { return false; } return _htableExcludedNS.Contains(ns); } private bool FIgnoreNamespace(XmlNode node) { if (!_fIsXdr) { return false; } XmlNode xmlNode = ((!(node is XmlAttribute)) ? node : ((XmlAttribute)node).OwnerElement); if (xmlNode.NamespaceURI.StartsWith("x-schema:#", StringComparison.Ordinal)) { return true; } return false; } private bool FIgnoreNamespace(XmlReader node) { if (_fIsXdr && node.NamespaceURI.StartsWith("x-schema:#", StringComparison.Ordinal)) { return true; } return false; } internal bool IsTextLikeNode(XmlNodeType n) { switch (n) { case XmlNodeType.EntityReference: throw ExceptionBuilder.FoundEntity(); case XmlNodeType.Text: case XmlNodeType.CDATA: case XmlNodeType.Whitespace: case XmlNodeType.SignificantWhitespace: return true; default: return false; } } internal bool IsTextOnly(DataColumn c) { if (c.ColumnMapping != MappingType.SimpleContent) { return false; } return true; } internal void LoadData(XmlDocument xdoc) { if (xdoc.DocumentElement == null) { return; } bool enforceConstraints; if (_isTableLevel) { enforceConstraints = _dataTable.EnforceConstraints; _dataTable.EnforceConstraints = false; } else { enforceConstraints = _dataSet.EnforceConstraints; _dataSet.EnforceConstraints = false; _dataSet._fInReadXml = true; } if (_isTableLevel) { _nodeToSchemaMap = new XmlToDatasetMap(_dataTable, xdoc.NameTable); } else { _nodeToSchemaMap = new XmlToDatasetMap(_dataSet, xdoc.NameTable); } DataRow dataRow = null; if (_isTableLevel || (_dataSet != null && _dataSet._fTopLevelTable)) { XmlElement documentElement = xdoc.DocumentElement; DataTable dataTable = (DataTable)_nodeToSchemaMap.GetSchemaForNode(documentElement, FIgnoreNamespace(documentElement)); if (dataTable != null) { dataRow = dataTable.CreateEmptyRow(); _nodeToRowMap[documentElement] = dataRow; LoadRowData(dataRow, documentElement); dataTable.Rows.Add(dataRow); } } LoadRows(dataRow, xdoc.DocumentElement); AttachRows(dataRow, xdoc.DocumentElement); if (_isTableLevel) { _dataTable.EnforceConstraints = enforceConstraints; return; } _dataSet._fInReadXml = false; _dataSet.EnforceConstraints = enforceConstraints; } private void LoadRowData(DataRow row, XmlElement rowElement) { DataTable table = row.Table; if (FromInference) { table.Prefix = rowElement.Prefix; } Hashtable hashtable = new Hashtable(); row.BeginEdit(); XmlNode xmlNode = rowElement.FirstChild; DataColumn textOnlyColumn = GetTextOnlyColumn(row); if (textOnlyColumn != null) { hashtable[textOnlyColumn] = textOnlyColumn; string valueForTextOnlyColums = GetValueForTextOnlyColums(xmlNode); if (XMLSchema.GetBooleanAttribute(rowElement, "nil", "http://www.w3.org/2001/XMLSchema-instance", defVal: false) && string.IsNullOrEmpty(valueForTextOnlyColums)) { row[textOnlyColumn] = DBNull.Value; } else { SetRowValueFromXmlText(row, textOnlyColumn, valueForTextOnlyColums); } } while (xmlNode != null && xmlNode != rowElement) { if (xmlNode.NodeType == XmlNodeType.Element) { XmlElement xmlElement = (XmlElement)xmlNode; object obj = _nodeToSchemaMap.GetSchemaForNode(xmlElement, FIgnoreNamespace(xmlElement)); if (obj is DataTable && FColumnElement(xmlElement)) { obj = _nodeToSchemaMap.GetColumnSchema(xmlElement, FIgnoreNamespace(xmlElement)); } if (obj == null || obj is DataColumn) { xmlNode = xmlElement.FirstChild; if (obj != null && obj is DataColumn) { DataColumn dataColumn = (DataColumn)obj; if (dataColumn.Table == row.Table && dataColumn.ColumnMapping != MappingType.Attribute && hashtable[dataColumn] == null) { hashtable[dataColumn] = dataColumn; string valueForTextOnlyColums2 = GetValueForTextOnlyColums(xmlNode); if (XMLSchema.GetBooleanAttribute(xmlElement, "nil", "http://www.w3.org/2001/XMLSchema-instance", defVal: false) && string.IsNullOrEmpty(valueForTextOnlyColums2)) { row[dataColumn] = DBNull.Value; } else { SetRowValueFromXmlText(row, dataColumn, valueForTextOnlyColums2); } } } else if (obj == null && xmlNode != null) { continue; } if (xmlNode == null) { xmlNode = xmlElement; } } } while (xmlNode != rowElement && xmlNode.NextSibling == null) { xmlNode = xmlNode.ParentNode; } if (xmlNode != rowElement) { xmlNode = xmlNode.NextSibling; } } foreach (XmlAttribute attribute in rowElement.Attributes) { object columnSchema = _nodeToSchemaMap.GetColumnSchema(attribute, FIgnoreNamespace(attribute)); if (columnSchema != null && columnSchema is DataColumn) { DataColumn dataColumn2 = (DataColumn)columnSchema; if (dataColumn2.ColumnMapping == MappingType.Attribute && hashtable[dataColumn2] == null) { hashtable[dataColumn2] = dataColumn2; xmlNode = attribute.FirstChild; SetRowValueFromXmlText(row, dataColumn2, GetInitialTextFromNodes(ref xmlNode)); } } } foreach (DataColumn column in row.Table.Columns) { if (hashtable[column] != null || !XmlToDatasetMap.IsMappedColumn(column)) { continue; } if (!column.AutoIncrement) { if (column.AllowDBNull) { row[column] = DBNull.Value; } else { row[column] = column.DefaultValue; } } else { column.Init(row._tempRecord); } } row.EndEdit(); } private void LoadRows(DataRow parentRow, XmlNode parentElement) { if (parentElement == null || (parentElement.LocalName == "schema" && parentElement.NamespaceURI == "http://www.w3.org/2001/XMLSchema") || (parentElement.LocalName == "sync" && parentElement.NamespaceURI == "urn:schemas-microsoft-com:xml-updategram") || (parentElement.LocalName == "Schema" && parentElement.NamespaceURI == "urn:schemas-microsoft-com:xml-data")) { return; } for (XmlNode xmlNode = parentElement.FirstChild; xmlNode != null; xmlNode = xmlNode.NextSibling) { if (!(xmlNode is XmlElement)) { continue; } XmlElement xmlElement = (XmlElement)xmlNode; object schemaForNode = _nodeToSchemaMap.GetSchemaForNode(xmlElement, FIgnoreNamespace(xmlElement)); if (schemaForNode != null && schemaForNode is DataTable) { DataRow dataRow = GetRowFromElement(xmlElement); if (dataRow == null) { if (parentRow != null && FColumnElement(xmlElement)) { continue; } dataRow = ((DataTable)schemaForNode).CreateEmptyRow(); _nodeToRowMap[xmlElement] = dataRow; LoadRowData(dataRow, xmlElement); } LoadRows(dataRow, xmlNode); } else { LoadRows(null, xmlNode); } } } private void SetRowValueFromXmlText(DataRow row, DataColumn col, string xmlText) { row[col] = col.ConvertXmlToObject(xmlText); } private void InitNameTable() { XmlNameTable nameTable = _dataReader.NameTable; _XSD_XMLNS_NS = nameTable.Add("http://www.w3.org/2000/xmlns/"); _XDR_SCHEMA = nameTable.Add("Schema"); _XDRNS = nameTable.Add("urn:schemas-microsoft-com:xml-data"); _SQL_SYNC = nameTable.Add("sync"); _UPDGNS = nameTable.Add("urn:schemas-microsoft-com:xml-updategram"); _XSD_SCHEMA = nameTable.Add("schema"); _XSDNS = nameTable.Add("http://www.w3.org/2001/XMLSchema"); _DFFNS = nameTable.Add("urn:schemas-microsoft-com:xml-diffgram-v1"); _MSDNS = nameTable.Add("urn:schemas-microsoft-com:xml-msdata"); _DIFFID = nameTable.Add("id"); _HASCHANGES = nameTable.Add("hasChanges"); _ROWORDER = nameTable.Add("rowOrder"); } internal void LoadData(XmlReader reader) { _dataReader = DataTextReader.CreateReader(reader); int depth = _dataReader.Depth; bool enforceConstraints = (_isTableLevel ? _dataTable.EnforceConstraints : _dataSet.EnforceConstraints); InitNameTable(); if (_nodeToSchemaMap == null) { _nodeToSchemaMap = (_isTableLevel ? new XmlToDatasetMap(_dataReader.NameTable, _dataTable) : new XmlToDatasetMap(_dataReader.NameTable, _dataSet)); } if (_isTableLevel) { _dataTable.EnforceConstraints = false; } else { _dataSet.EnforceConstraints = false; _dataSet._fInReadXml = true; } if (_topMostNode != null) { if (!_isDiffgram && !_isTableLevel && _nodeToSchemaMap.GetSchemaForNode(_topMostNode, FIgnoreNamespace(_topMostNode)) is DataTable table) { LoadTopMostTable(table); } _topMostNode = null; } while (!_dataReader.EOF && _dataReader.Depth >= depth) { if (reader.NodeType != XmlNodeType.Element) { _dataReader.Read(); continue; } DataTable tableForNode = _nodeToSchemaMap.GetTableForNode(_dataReader, FIgnoreNamespace(_dataReader)); if (tableForNode == null) { if (!ProcessXsdSchema()) { _dataReader.Read(); } } else { LoadTable(tableForNode, isNested: false); } } if (_isTableLevel) { _dataTable.EnforceConstraints = enforceConstraints; return; } _dataSet._fInReadXml = false; _dataSet.EnforceConstraints = enforceConstraints; } private void LoadTopMostTable(DataTable table) { bool flag = _isTableLevel || _dataSet.DataSetName != table.TableName; DataRow dataRow = null; bool flag2 = false; int num = _dataReader.Depth - 1; int count = _childRowsStack.Count; DataColumnCollection columns = table.Columns; object[] array = new object[columns.Count]; foreach (XmlAttribute attribute in _topMostNode.Attributes) { if (_nodeToSchemaMap.GetColumnSchema(attribute, FIgnoreNamespace(attribute)) is DataColumn dataColumn && dataColumn.ColumnMapping == MappingType.Attribute) { XmlNode n = attribute.FirstChild; array[dataColumn.Ordinal] = dataColumn.ConvertXmlToObject(GetInitialTextFromNodes(ref n)); flag2 = true; } } while (num < _dataReader.Depth) { switch (_dataReader.NodeType) { case XmlNodeType.Element: { object columnSchema = _nodeToSchemaMap.GetColumnSchema(table, _dataReader, FIgnoreNamespace(_dataReader)); if (columnSchema is DataColumn dataColumn2) { if (array[dataColumn2.Ordinal] == null) { LoadColumn(dataColumn2, array); flag2 = true; } else { _dataReader.Read(); } } else if (columnSchema is DataTable table2) { LoadTable(table2, isNested: true); flag2 = true; } else if (!ProcessXsdSchema()) { if (!(flag2 || flag)) { return; } _dataReader.Read(); } break; } case XmlNodeType.EntityReference: throw ExceptionBuilder.FoundEntity(); case XmlNodeType.Text: case XmlNodeType.CDATA: case XmlNodeType.Whitespace: case XmlNodeType.SignificantWhitespace: { string s = _dataReader.ReadString(); DataColumn xmlText = table._xmlText; if (xmlText != null && array[xmlText.Ordinal] == null) { array[xmlText.Ordinal] = xmlText.ConvertXmlToObject(s); } break; } default: _dataReader.Read(); break; } } _dataReader.Read(); for (int num2 = array.Length - 1; num2 >= 0; num2--) { if (array[num2] == null) { DataColumn xmlText = columns[num2]; if (xmlText.AllowDBNull && xmlText.ColumnMapping != MappingType.Hidden && !xmlText.AutoIncrement) { array[num2] = DBNull.Value; } } } dataRow = table.Rows.AddWithColumnEvents(array); while (count < _childRowsStack.Count) { DataRow dataRow2 = (DataRow)_childRowsStack.Pop(); bool flag3 = dataRow2.RowState == DataRowState.Unchanged; dataRow2.SetNestedParentRow(dataRow, setNonNested: false); if (flag3) { dataRow2._oldRecord = dataRow2._newRecord; } } } private void LoadTable(DataTable table, bool isNested) { DataRow dataRow = null; int depth = _dataReader.Depth; int count = _childRowsStack.Count; DataColumnCollection columns = table.Columns; object[] array = new object[columns.Count]; int pos = -1; string key = string.Empty; string text = null; bool flag = false; for (int num = _dataReader.AttributeCount - 1; num >= 0; num--) { _dataReader.MoveToAttribute(num); if (_nodeToSchemaMap.GetColumnSchema(table, _dataReader, FIgnoreNamespace(_dataReader)) is DataColumn dataColumn && dataColumn.ColumnMapping == MappingType.Attribute) { array[dataColumn.Ordinal] = dataColumn.ConvertXmlToObject(_dataReader.Value); } if (_isDiffgram) { if (_dataReader.NamespaceURI == "urn:schemas-microsoft-com:xml-diffgram-v1") { switch (_dataReader.LocalName) { case "id": key = _dataReader.Value; break; case "hasChanges": text = _dataReader.Value; break; case "hasErrors": flag = (bool)Convert.ChangeType(_dataReader.Value, typeof(bool), CultureInfo.InvariantCulture); break; } } else if (_dataReader.NamespaceURI == "urn:schemas-microsoft-com:xml-msdata") { if (_dataReader.LocalName == "rowOrder") { pos = (int)Convert.ChangeType(_dataReader.Value, typeof(int), CultureInfo.InvariantCulture); } else if (_dataReader.LocalName.StartsWith("hidden", StringComparison.Ordinal)) { DataColumn dataColumn2 = columns[XmlConvert.DecodeName(_dataReader.LocalName.Substring(6))]; if (dataColumn2 != null && dataColumn2.ColumnMapping == MappingType.Hidden) { array[dataColumn2.Ordinal] = dataColumn2.ConvertXmlToObject(_dataReader.Value); } } } } } if (_dataReader.Read() && depth < _dataReader.Depth) { while (depth < _dataReader.Depth) { switch (_dataReader.NodeType) { case XmlNodeType.Element: { object columnSchema = _nodeToSchemaMap.GetColumnSchema(table, _dataReader, FIgnoreNamespace(_dataReader)); if (columnSchema is DataColumn dataColumn3) { if (array[dataColumn3.Ordinal] == null) { LoadColumn(dataColumn3, array); } else { _dataReader.Read(); } } else if (columnSchema is DataTable table2) { LoadTable(table2, isNested: true); } else if (!ProcessXsdSchema()) { DataTable tableForNode = _nodeToSchemaMap.GetTableForNode(_dataReader, FIgnoreNamespace(_dataReader)); if (tableForNode != null) { LoadTable(tableForNode, isNested: false); } else { _dataReader.Read(); } } break; } case XmlNodeType.EntityReference: throw ExceptionBuilder.FoundEntity(); case XmlNodeType.Text: case XmlNodeType.CDATA: case XmlNodeType.Whitespace: case XmlNodeType.SignificantWhitespace: { string s = _dataReader.ReadString(); DataColumn dataColumn2 = table._xmlText; if (dataColumn2 != null && array[dataColumn2.Ordinal] == null) { array[dataColumn2.Ordinal] = dataColumn2.ConvertXmlToObject(s); } break; } default: _dataReader.Read(); break; } } _dataReader.Read(); } if (_isDiffgram) { dataRow = table.NewRow(table.NewUninitializedRecord()); dataRow.BeginEdit(); for (int num2 = array.Length - 1; num2 >= 0; num2--) { DataColumn dataColumn2 = columns[num2]; dataColumn2[dataRow._tempRecord] = ((array[num2] != null) ? array[num2] : DBNull.Value); } dataRow.EndEdit(); table.Rows.DiffInsertAt(dataRow, pos); if (text == null) { dataRow._oldRecord = dataRow._newRecord; } if (text == "modified" || flag) { table.RowDiffId[key] = dataRow; } } else { for (int num3 = array.Length - 1; num3 >= 0; num3--) { if (array[num3] == null) { DataColumn dataColumn2 = columns[num3]; if (dataColumn2.AllowDBNull && dataColumn2.ColumnMapping != MappingType.Hidden && !dataColumn2.AutoIncrement) { array[num3] = DBNull.Value; } } } dataRow = table.Rows.AddWithColumnEvents(array); } while (count < _childRowsStack.Count) { DataRow dataRow2 = (DataRow)_childRowsStack.Pop(); bool flag2 = dataRow2.RowState == DataRowState.Unchanged; dataRow2.SetNestedParentRow(dataRow, setNonNested: false); if (flag2) { dataRow2._oldRecord = dataRow2._newRecord; } } if (isNested) { _childRowsStack.Push(dataRow); } } private void LoadColumn(DataColumn column, object[] foundColumns) { string text = string.Empty; string text2 = null; int depth = _dataReader.Depth; if (_dataReader.AttributeCount > 0) { text2 = _dataReader.GetAttribute("nil", "http://www.w3.org/2001/XMLSchema-instance"); } if (column.IsCustomType) { object obj = null; string text3 = null; string text4 = null; XmlRootAttribute xmlRootAttribute = null; if (_dataReader.AttributeCount > 0) { text3 = _dataReader.GetAttribute("type", "http://www.w3.org/2001/XMLSchema-instance"); text4 = _dataReader.GetAttribute("InstanceType", "urn:schemas-microsoft-com:xml-msdata"); } bool flag = !column.ImplementsIXMLSerializable && !(column.DataType == typeof(object)) && text4 == null && text3 == null; if (text2 != null && XmlConvert.ToBoolean(text2)) { if (!flag && text4 != null && text4.Length > 0) { obj = SqlUdtStorage.GetStaticNullForUdtType(DataStorage.GetType(text4)); } if (obj == null) { obj = DBNull.Value; } if (!_dataReader.IsEmptyElement) { while (_dataReader.Read() && depth < _dataReader.Depth) { } } _dataReader.Read(); } else { bool flag2 = false; if (column.Table.DataSet != null && column.Table.DataSet._udtIsWrapped) { _dataReader.Read(); flag2 = true; } if (flag) { if (flag2) { xmlRootAttribute = new XmlRootAttribute(_dataReader.LocalName); xmlRootAttribute.Namespace = _dataReader.NamespaceURI; } else { xmlRootAttribute = new XmlRootAttribute(column.EncodedColumnName); xmlRootAttribute.Namespace = column.Namespace; } } obj = column.ConvertXmlToObject(_dataReader, xmlRootAttribute); if (flag2) { _dataReader.Read(); } } foundColumns[column.Ordinal] = obj; return; } if (_dataReader.Read() && depth < _dataReader.Depth) { while (depth < _dataReader.Depth) { switch (_dataReader.NodeType) { case XmlNodeType.Text: case XmlNodeType.CDATA: case XmlNodeType.Whitespace: case XmlNodeType.SignificantWhitespace: if (text.Length == 0) { text = _dataReader.Value; StringBuilder stringBuilder = null; while (_dataReader.Read() && depth < _dataReader.Depth && IsTextLikeNode(_dataReader.NodeType)) { if (stringBuilder == null) { stringBuilder = new StringBuilder(text); } stringBuilder.Append(_dataReader.Value); } if (stringBuilder != null) { text = stringBuilder.ToString(); } } else { _dataReader.ReadString(); } break; case XmlNodeType.Element: { if (ProcessXsdSchema()) { break; } object columnSchema = _nodeToSchemaMap.GetColumnSchema(column.Table, _dataReader, FIgnoreNamespace(_dataReader)); if (columnSchema is DataColumn dataColumn) { if (foundColumns[dataColumn.Ordinal] == null) { LoadColumn(dataColumn, foundColumns); } else { _dataReader.Read(); } break; } if (columnSchema is DataTable table) { LoadTable(table, isNested: true); break; } DataTable tableForNode = _nodeToSchemaMap.GetTableForNode(_dataReader, FIgnoreNamespace(_dataReader)); if (tableForNode != null) { LoadTable(tableForNode, isNested: false); } else { _dataReader.Read(); } break; } case XmlNodeType.EntityReference: throw ExceptionBuilder.FoundEntity(); default: _dataReader.Read(); break; } } _dataReader.Read(); } if (text.Length == 0 && text2 != null && XmlConvert.ToBoolean(text2)) { foundColumns[column.Ordinal] = DBNull.Value; } else { foundColumns[column.Ordinal] = column.ConvertXmlToObject(text); } } private bool ProcessXsdSchema() { if (_dataReader.LocalName == _XSD_SCHEMA && _dataReader.NamespaceURI == _XSDNS) { if (_ignoreSchema) { _dataReader.Skip(); } else if (_isTableLevel) { _dataTable.ReadXSDSchema(_dataReader, denyResolving: false); _nodeToSchemaMap = new XmlToDatasetMap(_dataReader.NameTable, _dataTable); } else { _dataSet.ReadXSDSchema(_dataReader, denyResolving: false); _nodeToSchemaMap = new XmlToDatasetMap(_dataReader.NameTable, _dataSet); } } else { if ((_dataReader.LocalName != _XDR_SCHEMA || _dataReader.NamespaceURI != _XDRNS) && (_dataReader.LocalName != _SQL_SYNC || _dataReader.NamespaceURI != _UPDGNS)) { return false; } _dataReader.Skip(); } return true; } } internal sealed class Keywords { internal const string DFF = "diffgr"; internal const string DFFNS = "urn:schemas-microsoft-com:xml-diffgram-v1"; internal const string DIFFGRAM = "diffgram"; internal const string DIFFID = "id"; internal const string DIFFPID = "parentId"; internal const string HASCHANGES = "hasChanges"; internal const string HASERRORS = "hasErrors"; internal const string ROWORDER = "rowOrder"; internal const string MSD_ERRORS = "errors"; internal const string CHANGES = "changes"; internal const string MODIFIED = "modified"; internal const string INSERTED = "inserted"; internal const string MSD = "msdata"; internal const string MSDNS = "urn:schemas-microsoft-com:xml-msdata"; internal const string MSD_ACCEPTREJECTRULE = "AcceptRejectRule"; internal const string MSD_ALLOWDBNULL = "AllowDBNull"; internal const string MSD_CHILD = "child"; internal const string MSD_CHILDKEY = "childkey"; internal const string MSD_CHILDTABLENS = "ChildTableNamespace"; internal const string MSD_COLUMNNAME = "ColumnName"; internal const string MSD_CONSTRAINTNAME = "ConstraintName"; internal const string MSD_CONSTRAINTONLY = "ConstraintOnly"; internal const string MSD_CASESENSITIVE = "CaseSensitive"; internal const string MSD_DATASETNAME = "DataSetName"; internal const string MSD_DATASETNAMESPACE = "DataSetNamespace"; internal const string MSD_DATATYPE = "DataType"; internal const string MSD_DEFAULTVALUE = "DefaultValue"; internal const string MSD_DELETERULE = "DeleteRule"; internal const string MSD_ERROR = "Error"; internal const string MSD_ISDATASET = "IsDataSet"; internal const string MSD_ISNESTED = "IsNested"; internal const string MSD_LOCALE = "Locale"; internal const string MSD_USECURRENTLOCALE = "UseCurrentLocale"; internal const string MSD_ORDINAL = "Ordinal"; internal const string MSD_PARENT = "parent"; internal const string MSD_PARENTKEY = "parentkey"; internal const string MSD_PRIMARYKEY = "PrimaryKey"; internal const string MSD_RELATION = "Relationship"; internal const string MSD_RELATIONNAME = "RelationName"; internal const string MSD_UPDATERULE = "UpdateRule"; internal const char MSD_KEYFIELDSEP = ' '; internal const char MSD_KEYFIELDOLDSEP = '+'; internal const string MSD_REL_PREFIX = "rel_"; internal const string MSD_FK_PREFIX = "fk_"; internal const string MSD_MAINDATATABLE = "MainDataTable"; internal const string MSD_TABLENS = "TableNamespace"; internal const string MSD_PARENTTABLENS = "ParentTableNamespace"; internal const string MSD_INSTANCETYPE = "InstanceType"; internal const string MSD_EXCLUDESCHEMA = "ExcludeSchema"; internal const string MSD_INCLUDESCHEMA = "IncludeSchema"; internal const string MSD_FRAGMENTCOUNT = "schemafragmentcount"; internal const string MSD_SCHEMASERIALIZATIONMODE = "SchemaSerializationMode"; internal const string DTNS = "urn:schemas-microsoft-com:datatypes"; internal const string DT_TYPE = "type"; internal const string DT_VALUES = "values"; internal const string XDRNS = "urn:schemas-microsoft-com:xml-data"; internal const string XDR_ATTRIBUTE = "attribute"; internal const string XDR_ATTRIBUTETYPE = "AttributeType"; internal const string XDR_DATATYPE = "datatype"; internal const string XDR_DESCRIPTION = "description"; internal const string XDR_ELEMENT = "element"; internal const string XDR_ELEMENTTYPE = "ElementType"; internal const string XDR_GROUP = "group"; internal const string XDR_SCHEMA = "Schema"; internal const string XSDNS = "http://www.w3.org/2001/XMLSchema"; internal const string XSD_NS_START = "http://www.w3.org/"; internal const string XSD_XMLNS_NS = "http://www.w3.org/2000/xmlns/"; internal const string XSD_PREFIX = "xs"; internal const string XSD_PREFIXCOLON = "xs:"; internal const string XSD_ANNOTATION = "annotation"; internal const string XSD_APPINFO = "appinfo"; internal const string XSD_ATTRIBUTE = "attribute"; internal const string XSD_SIMPLETYPE = "simpleType"; internal const string XSD_ELEMENT = "element"; internal const string XSD_COMPLEXTYPE = "complexType"; internal const string XSD_SCHEMA = "schema"; internal const string XSD_PATTERN = "pattern"; internal const string XSD_LENGTH = "length"; internal const string XSD_MAXLENGTH = "maxLength"; internal const string XSD_MINLENGTH = "minLength"; internal const string XSD_ENUMERATION = "enumeration"; internal const string XSD_MININCLUSIVE = "minInclusive"; internal const string XSD_MINEXCLUSIVE = "minExclusive"; internal const string XSD_MAXINCLUSIVE = "maxInclusive"; internal const string XSD_MAXEXCLUSIVE = "maxExclusive"; internal const string XSD_NAMESPACE = "namespace"; internal const string XSD_NILLABLE = "nillable"; internal const string XSD_IMPORT = "import"; internal const string XSD_SELECTOR = "selector"; internal const string XSD_FIELD = "field"; internal const string XSD_UNIQUE = "unique"; internal const string XSD_KEY = "key"; internal const string XSD_KEYREF = "keyref"; internal const string XSD_DATATYPE = "datatype"; internal const string XSD_ALL = "all"; internal const string XSD_SEQUENCE = "sequence"; internal const string XSD_ENCODING = "encoding"; internal const string XSD_EXTENSION = "extension"; internal const string XSD_SIMPLECONTENT = "simpleContent"; internal const string XSD_XPATH = "xpath"; internal const string XSD_ATTRIBUTEFORMDEFAULT = "attributeFormDefault"; internal const string XSD_ELEMENTFORMDEFAULT = "elementFormDefault"; internal const string XSD_SCHEMALOCATION = "schemaLocation"; internal const string XSD_CHOICE = "choice"; internal const string XSD_RESTRICTION = "restriction"; internal const string XSD_ANYTYPE = "anyType"; internal const string XSINS = "http://www.w3.org/2001/XMLSchema-instance"; internal const string XSI_NIL = "nil"; internal const string XSI = "xsi"; internal const string XML_XMLNS = "http://www.w3.org/XML/1998/namespace"; internal const string UPDGNS = "urn:schemas-microsoft-com:xml-updategram"; internal const string UPDG = "updg"; internal const string SQL_SYNC = "sync"; internal const string SQL_BEFORE = "before"; internal const string SQL_AFTER = "after"; internal const string SQL_ID = "id"; internal const string SQL_UNCHANGED = "unchanged"; internal const string ATTRIBUTE = "attribute"; internal const string CONTENT = "content"; internal const string DEFAULT = "default"; internal const string XSDID = "id"; internal const string MINOCCURS = "minOccurs"; internal const string MAXOCCURS = "maxOccurs"; internal const string MODEL = "model"; internal const string NAME = "name"; internal const string NULLABLE = "nullable"; internal const string ORDER = "order"; internal const string REQUIRED = "required"; internal const string REF = "ref"; internal const string BASE = "base"; internal const string TARGETNAMESPACE = "targetNamespace"; internal const string TYPE = "type"; internal const string XMLNS = "xmlns"; internal const string XMLNS_XSD = "xmlns:xs"; internal const string XMLNS_XSI = "xmlns:xsi"; internal const string XMLNS_MSDATA = "xmlns:msdata"; internal const string XMLNS_MSPROP = "xmlns:msprop"; internal const string XMLNS_MSTNS = "xmlns:mstns"; internal const string MSTNS_PREFIX = "mstns:"; internal const string SPACE = "space"; internal const string PRESERVE = "preserve"; internal const string VALUE = "value"; internal const string REFER = "refer"; internal const string USE = "use"; internal const string PROHIBITED = "prohibited"; internal const string POSITIVEINFINITY = "INF"; internal const string NEGATIVEINFINITY = "-INF"; internal const string QUALIFIED = "qualified"; internal const string UNQUALIFIED = "unqualified"; internal const string APP = "app"; internal const string CLOSED = "closed"; internal const string CURRENT = "Current"; internal const string DOCUMENTELEMENT = "DocumentElement"; internal const string FALSE = "false"; internal const string FIXED = "fixed"; internal const string FORM = "form"; internal const string ENCODING = "encoding"; internal const string ELEMENTONLY = "elementOnly"; internal const string ELTONLY = "eltOnly"; internal const string EMPTY = "empty"; internal const string MANY = "many"; internal const string MIXED = "mixed"; internal const string NO = "no"; internal const string NOTATION = "notation"; internal const string OCCURS = "occurs"; internal const string ONE_OR_MORE = "oneormore"; internal const string ONE = "one"; internal const string ONE_DIGIT = "1"; internal const string ONCE = "once"; internal const string OPTIONAL = "optional"; internal const string OPEN = "open"; internal const string ORIGINAL = "Original"; internal const string RANGE = "range"; internal const string SEQ = "seq"; internal const string STAR = "*"; internal const string TRUE = "true"; internal const string TEXTONLY = "textOnly"; internal const string VERSION = "version"; internal const string XML = "xml"; internal const string X_SCHEMA = "x-schema"; internal const string YES = "yes"; internal const string ZERO_DIGIT = "0"; internal const string ZERO_OR_MORE = "unbounded"; internal const string USEDATASETSCHEMAONLY = "UseDataSetSchemaOnly"; internal const string UDTCOLUMNVALUEWRAPPED = "UDTColumnValueWrapped"; internal const string TYPEINSTANCE = "Type"; internal const string MSPROPNS = "urn:schemas-microsoft-com:xml-msprop"; internal const string WS_DATASETFULLQNAME = "system.data.dataset"; internal const string WS_VERSION = "WSDL_VERSION"; private Keywords() { } } public enum XmlReadMode { Auto, ReadSchema, IgnoreSchema, InferSchema, DiffGram, Fragment, InferTypedSchema } internal sealed class XmlToDatasetMap { private sealed class XmlNodeIdentety { public string LocalName; public string NamespaceURI; public XmlNodeIdentety(string localName, string namespaceURI) { LocalName = localName; NamespaceURI = namespaceURI; } public override int GetHashCode() { return LocalName.GetHashCode(); } public override bool Equals(object obj) { XmlNodeIdentety xmlNodeIdentety = (XmlNodeIdentety)obj; if (string.Equals(LocalName, xmlNodeIdentety.LocalName, StringComparison.OrdinalIgnoreCase)) { return string.Equals(NamespaceURI, xmlNodeIdentety.NamespaceURI, StringComparison.OrdinalIgnoreCase); } return false; } } internal sealed class XmlNodeIdHashtable : Hashtable { private XmlNodeIdentety _id = new XmlNodeIdentety(string.Empty, string.Empty); public object this[XmlNode node] { get { _id.LocalName = node.LocalName; _id.NamespaceURI = node.NamespaceURI; return this[_id]; } } public object this[XmlReader dataReader] { get { _id.LocalName = dataReader.LocalName; _id.NamespaceURI = dataReader.NamespaceURI; return this[_id]; } } public object this[DataTable table] { get { _id.LocalName = table.EncodedTableName; _id.NamespaceURI = table.Namespace; return this[_id]; } } public object this[string name] { get { _id.LocalName = name; _id.NamespaceURI = string.Empty; return this[_id]; } } public XmlNodeIdHashtable(int capacity) : base(capacity) { } } private sealed class TableSchemaInfo { public DataTable TableSchema; public XmlNodeIdHashtable ColumnsSchemaMap; public TableSchemaInfo(DataTable tableSchema) { TableSchema = tableSchema; ColumnsSchemaMap = new XmlNodeIdHashtable(tableSchema.Columns.Count); } } private XmlNodeIdHashtable _tableSchemaMap; private TableSchemaInfo _lastTableSchemaInfo; public XmlToDatasetMap(DataSet dataSet, XmlNameTable nameTable) { BuildIdentityMap(dataSet, nameTable); } public XmlToDatasetMap(XmlNameTable nameTable, DataSet dataSet) { BuildIdentityMap(nameTable, dataSet); } public XmlToDatasetMap(DataTable dataTable, XmlNameTable nameTable) { BuildIdentityMap(dataTable, nameTable); } public XmlToDatasetMap(XmlNameTable nameTable, DataTable dataTable) { BuildIdentityMap(nameTable, dataTable); } internal static bool IsMappedColumn(DataColumn c) { return c.ColumnMapping != MappingType.Hidden; } private TableSchemaInfo AddTableSchema(DataTable table, XmlNameTable nameTable) { string text = nameTable.Get(table.EncodedTableName); string namespaceURI = nameTable.Get(table.Namespace); if (text == null) { return null; } TableSchemaInfo tableSchemaInfo = new TableSchemaInfo(table); _tableSchemaMap[new XmlNodeIdentety(text, namespaceURI)] = tableSchemaInfo; return tableSchemaInfo; } private TableSchemaInfo AddTableSchema(XmlNameTable nameTable, DataTable table) { string encodedTableName = table.EncodedTableName; string text = nameTable.Get(encodedTableName); if (text == null) { text = nameTable.Add(encodedTableName); } table._encodedTableName = text; string text2 = nameTable.Get(table.Namespace); if (text2 == null) { text2 = nameTable.Add(table.Namespace); } else if (table._tableNamespace != null) { table._tableNamespace = text2; } TableSchemaInfo tableSchemaInfo = new TableSchemaInfo(table); _tableSchemaMap[new XmlNodeIdentety(text, text2)] = tableSchemaInfo; return tableSchemaInfo; } private bool AddColumnSchema(DataColumn col, XmlNameTable nameTable, XmlNodeIdHashtable columns) { string text = nameTable.Get(col.EncodedColumnName); string namespaceURI = nameTable.Get(col.Namespace); if (text == null) { return false; } XmlNodeIdentety key = new XmlNodeIdentety(text, namespaceURI); columns[key] = col; if (col.ColumnName.StartsWith("xml", StringComparison.OrdinalIgnoreCase)) { HandleSpecialColumn(col, nameTable, columns); } return true; } private bool AddColumnSchema(XmlNameTable nameTable, DataColumn col, XmlNodeIdHashtable columns) { string array = XmlConvert.EncodeLocalName(col.ColumnName); string text = nameTable.Get(array); if (text == null) { text = nameTable.Add(array); } col._encodedColumnName = text; string text2 = nameTable.Get(col.Namespace); if (text2 == null) { text2 = nameTable.Add(col.Namespace); } else if (col._columnUri != null) { col._columnUri = text2; } XmlNodeIdentety key = new XmlNodeIdentety(text, text2); columns[key] = col; if (col.ColumnName.StartsWith("xml", StringComparison.OrdinalIgnoreCase)) { HandleSpecialColumn(col, nameTable, columns); } return true; } private void BuildIdentityMap(DataSet dataSet, XmlNameTable nameTable) { _tableSchemaMap = new XmlNodeIdHashtable(dataSet.Tables.Count); foreach (DataTable table in dataSet.Tables) { TableSchemaInfo tableSchemaInfo = AddTableSchema(table, nameTable); if (tableSchemaInfo == null) { continue; } foreach (DataColumn column in table.Columns) { if (IsMappedColumn(column)) { AddColumnSchema(column, nameTable, tableSchemaInfo.ColumnsSchemaMap); } } } } private void BuildIdentityMap(XmlNameTable nameTable, DataSet dataSet) { _tableSchemaMap = new XmlNodeIdHashtable(dataSet.Tables.Count); string text = nameTable.Get(dataSet.Namespace); if (text == null) { text = nameTable.Add(dataSet.Namespace); } dataSet._namespaceURI = text; foreach (DataTable table in dataSet.Tables) { TableSchemaInfo tableSchemaInfo = AddTableSchema(nameTable, table); if (tableSchemaInfo == null) { continue; } foreach (DataColumn column in table.Columns) { if (IsMappedColumn(column)) { AddColumnSchema(nameTable, column, tableSchemaInfo.ColumnsSchemaMap); } } foreach (DataRelation childRelation in table.ChildRelations) { if (childRelation.Nested) { string array = XmlConvert.EncodeLocalName(childRelation.ChildTable.TableName); string text2 = nameTable.Get(array); if (text2 == null) { text2 = nameTable.Add(array); } string text3 = nameTable.Get(childRelation.ChildTable.Namespace); if (text3 == null) { text3 = nameTable.Add(childRelation.ChildTable.Namespace); } XmlNodeIdentety key = new XmlNodeIdentety(text2, text3); tableSchemaInfo.ColumnsSchemaMap[key] = childRelation.ChildTable; } } } } private void BuildIdentityMap(DataTable dataTable, XmlNameTable nameTable) { _tableSchemaMap = new XmlNodeIdHashtable(1); TableSchemaInfo tableSchemaInfo = AddTableSchema(dataTable, nameTable); if (tableSchemaInfo == null) { return; } foreach (DataColumn column in dataTable.Columns) { if (IsMappedColumn(column)) { AddColumnSchema(column, nameTable, tableSchemaInfo.ColumnsSchemaMap); } } } private void BuildIdentityMap(XmlNameTable nameTable, DataTable dataTable) { ArrayList selfAndDescendants = GetSelfAndDescendants(dataTable); _tableSchemaMap = new XmlNodeIdHashtable(selfAndDescendants.Count); foreach (DataTable item in selfAndDescendants) { TableSchemaInfo tableSchemaInfo = AddTableSchema(nameTable, item); if (tableSchemaInfo == null) { continue; } foreach (DataColumn column in item.Columns) { if (IsMappedColumn(column)) { AddColumnSchema(nameTable, column, tableSchemaInfo.ColumnsSchemaMap); } } foreach (DataRelation childRelation in item.ChildRelations) { if (childRelation.Nested) { string array = XmlConvert.EncodeLocalName(childRelation.ChildTable.TableName); string text = nameTable.Get(array); if (text == null) { text = nameTable.Add(array); } string text2 = nameTable.Get(childRelation.ChildTable.Namespace); if (text2 == null) { text2 = nameTable.Add(childRelation.ChildTable.Namespace); } XmlNodeIdentety key = new XmlNodeIdentety(text, text2); tableSchemaInfo.ColumnsSchemaMap[key] = childRelation.ChildTable; } } } } private ArrayList GetSelfAndDescendants(DataTable dt) { ArrayList arrayList = new ArrayList(); arrayList.Add(dt); for (int i = 0; i < arrayList.Count; i++) { foreach (DataRelation childRelation in ((DataTable)arrayList[i]).ChildRelations) { if (!arrayList.Contains(childRelation.ChildTable)) { arrayList.Add(childRelation.ChildTable); } } } return arrayList; } public object GetColumnSchema(XmlNode node, bool fIgnoreNamespace) { TableSchemaInfo tableSchemaInfo = null; XmlNode xmlNode = ((node.NodeType == XmlNodeType.Attribute) ? ((XmlAttribute)node).OwnerElement : node.ParentNode); do { if (xmlNode == null || xmlNode.NodeType != XmlNodeType.Element) { return null; } tableSchemaInfo = (TableSchemaInfo)(fIgnoreNamespace ? _tableSchemaMap[xmlNode.LocalName] : _tableSchemaMap[xmlNode]); xmlNode = xmlNode.ParentNode; } while (tableSchemaInfo == null); if (fIgnoreNamespace) { return tableSchemaInfo.ColumnsSchemaMap[node.LocalName]; } return tableSchemaInfo.ColumnsSchemaMap[node]; } public object GetColumnSchema(DataTable table, XmlReader dataReader, bool fIgnoreNamespace) { if (_lastTableSchemaInfo == null || _lastTableSchemaInfo.TableSchema != table) { _lastTableSchemaInfo = (TableSchemaInfo)(fIgnoreNamespace ? _tableSchemaMap[table.EncodedTableName] : _tableSchemaMap[table]); } if (fIgnoreNamespace) { return _lastTableSchemaInfo.ColumnsSchemaMap[dataReader.LocalName]; } return _lastTableSchemaInfo.ColumnsSchemaMap[dataReader]; } public object GetSchemaForNode(XmlNode node, bool fIgnoreNamespace) { TableSchemaInfo tableSchemaInfo = null; if (node.NodeType == XmlNodeType.Element) { tableSchemaInfo = (TableSchemaInfo)(fIgnoreNamespace ? _tableSchemaMap[node.LocalName] : _tableSchemaMap[node]); } if (tableSchemaInfo != null) { return tableSchemaInfo.TableSchema; } return GetColumnSchema(node, fIgnoreNamespace); } public DataTable GetTableForNode(XmlReader node, bool fIgnoreNamespace) { TableSchemaInfo tableSchemaInfo = (TableSchemaInfo)(fIgnoreNamespace ? _tableSchemaMap[node.LocalName] : _tableSchemaMap[node]); if (tableSchemaInfo != null) { _lastTableSchemaInfo = tableSchemaInfo; return _lastTableSchemaInfo.TableSchema; } return null; } private void HandleSpecialColumn(DataColumn col, XmlNameTable nameTable, XmlNodeIdHashtable columns) { string text = (('x' != col.ColumnName[0]) ? "_x0058_" : "_x0078_"); text += col.ColumnName.Substring(1); if (nameTable.Get(text) == null) { nameTable.Add(text); } string namespaceURI = nameTable.Get(col.Namespace); XmlNodeIdentety key = new XmlNodeIdentety(text, namespaceURI); columns[key] = col; } } public enum XmlWriteMode { WriteSchema, IgnoreSchema, DiffGram } public enum UpdateStatus { Continue, ErrorsOccurred, SkipCurrentRow, SkipAllRemainingRows } internal enum SchemaFormat { Public = 1, Remoting, WebService, RemotingSkipSchema, WebServiceSkipSchema } internal sealed class XmlTreeGen { private ArrayList _constraintNames; private Hashtable _namespaces; private Hashtable _autogenerated; private Hashtable _prefixes; private DataSet _ds; private ArrayList _tables = new ArrayList(); private ArrayList _relations = new ArrayList(); private XmlDocument _dc; private XmlElement _sRoot; private int _prefixCount; private SchemaFormat _schFormat = SchemaFormat.Public; private string _filePath; private string _fileName; private string _fileExt; private XmlElement _dsElement; private XmlElement _constraintSeparator; private Converter _targetConverter; internal XmlTreeGen(SchemaFormat format) { _schFormat = format; } internal static void AddExtendedProperties(PropertyCollection props, XmlElement node) { AddExtendedProperties(props, node, null); } internal static void AddExtendedProperties(PropertyCollection props, XmlElement node, Type type) { if (props == null) { return; } foreach (DictionaryEntry prop in props) { string text = ((!(prop.Key is INullable)) ? Convert.ToString(prop.Key, CultureInfo.InvariantCulture) : ((string)SqlConvert.ChangeTypeForXML(prop.Key, typeof(string)))); string value = ((prop.Value is INullable) ? ((string)SqlConvert.ChangeTypeForXML(prop.Value, typeof(string))) : ((!(prop.Value is BigInteger)) ? Convert.ToString(prop.Value, CultureInfo.InvariantCulture) : ((string)BigIntegerStorage.ConvertFromBigInteger((BigInteger)prop.Value, typeof(string), CultureInfo.InvariantCulture)))); if (type == typeof(DataRelation)) { text = "rel_" + text; } else if (type == typeof(ForeignKeyConstraint)) { text = "fk_" + text; } node.SetAttribute(XmlConvert.EncodeLocalName(text), "urn:schemas-microsoft-com:xml-msprop", value); } } internal void AddXdoProperties(object instance, XmlElement root, XmlDocument xd) { if (instance == null) { return; } PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(instance); if (instance is DataSet || instance is DataTable || instance is DataColumn || instance is DataRelation) { for (int i = 0; i < properties.Count; i++) { AddXdoProperty(properties[i], instance, root, xd); } } } internal void AddXdoProperty(PropertyDescriptor pd, object instance, XmlElement root, XmlDocument xd) { Type propertyType = pd.PropertyType; bool flag = false; DataColumn dataColumn = null; bool flag2 = false; bool flag3 = false; if (instance is DataColumn) { dataColumn = (DataColumn)instance; flag = true; flag2 = dataColumn.IsSqlType; flag3 = dataColumn.ImplementsINullable; } if ((!flag3 && propertyType != typeof(string) && propertyType != typeof(bool) && propertyType != typeof(Type) && propertyType != typeof(object) && propertyType != typeof(CultureInfo) && propertyType != typeof(long) && propertyType != typeof(int)) || ((!pd.ShouldSerializeValue(instance) || !pd.Attributes.Contains(DesignerSerializationVisibilityAttribute.Visible)) && !flag2)) { return; } object value = pd.GetValue(instance); if (value is InternalDataCollectionBase || value is PropertyCollection || string.Equals(pd.Name, "Namespace", StringComparison.Ordinal) || string.Equals(pd.Name, "PrimaryKey", StringComparison.Ordinal) || string.Equals(pd.Name, "ColumnName", StringComparison.Ordinal) || string.Equals(pd.Name, "DefaultValue", StringComparison.Ordinal) || string.Equals(pd.Name, "TableName", StringComparison.Ordinal) || string.Equals(pd.Name, "DataSetName", StringComparison.Ordinal) || string.Equals(pd.Name, "AllowDBNull", StringComparison.Ordinal) || string.Equals(pd.Name, "Unique", StringComparison.Ordinal) || string.Equals(pd.Name, "NestedInDataSet", StringComparison.Ordinal) || string.Equals(pd.Name, "Locale", StringComparison.Ordinal) || string.Equals(pd.Name, "CaseSensitive", StringComparison.Ordinal) || string.Equals(pd.Name, "RemotingFormat", StringComparison.Ordinal)) { return; } if (flag) { if (string.Equals(pd.Name, "DataType", StringComparison.Ordinal)) { string text = XmlDataTypeName(dataColumn.DataType); if (flag2 || dataColumn.DataType == typeof(BigInteger)) { root.SetAttribute("DataType", "urn:schemas-microsoft-com:xml-msdata", dataColumn.DataType.FullName); } else if (text.Length == 0 || flag3 || (text == "anyType" && dataColumn.XmlDataType != "anyType") || dataColumn.DataType == typeof(DateTimeOffset)) { SetMSDataAttribute(root, dataColumn.DataType); } return; } if (string.Equals(pd.Name, "Attribute", StringComparison.Ordinal)) { return; } } string value2 = pd.Converter.ConvertToString(value); root.SetAttribute(pd.Name, "urn:schemas-microsoft-com:xml-msdata", value2); } internal static string XmlDataTypeName(Type type) { if (type == typeof(char)) { return "_"; } if (type == typeof(byte[]) || type == typeof(SqlBytes)) { return "base64Binary"; } if (type == typeof(DateTime) || type == typeof(SqlDateTime)) { return "dateTime"; } if (type == typeof(TimeSpan)) { return "duration"; } if (type == typeof(decimal) || type == typeof(SqlDecimal) || type == typeof(SqlMoney)) { return "decimal"; } if (type == typeof(int)) { return "int"; } if (type == typeof(bool) || type == typeof(SqlBoolean)) { return "boolean"; } if (type == typeof(float) || type == typeof(SqlSingle)) { return "float"; } if (type == typeof(double) || type == typeof(SqlDouble)) { return "double"; } if (type == typeof(sbyte) || type == typeof(SqlByte)) { return "byte"; } if (type == typeof(byte)) { return "unsignedByte"; } if (type == typeof(short) || type == typeof(SqlInt16)) { return "short"; } if (type == typeof(int) || type == typeof(SqlInt32)) { return "int"; } if (type == typeof(long) || type == typeof(SqlInt64)) { return "long"; } if (type == typeof(ushort)) { return "unsignedShort"; } if (type == typeof(uint)) { return "unsignedInt"; } if (type == typeof(ulong)) { return "unsignedLong"; } if (type == typeof(BigInteger)) { return "anyType"; } if (type == typeof(Uri)) { return "anyURI"; } if (type == typeof(SqlBinary)) { return "hexBinary"; } if (type == typeof(string) || type == typeof(SqlGuid) || type == typeof(SqlString) || type == typeof(SqlChars)) { return "string"; } if (type == typeof(object) || type == typeof(SqlXml) || type == typeof(DateTimeOffset)) { return "anyType"; } return string.Empty; } private void GenerateConstraintNames(DataTable table, bool fromTable) { StringBuilder stringBuilder = null; foreach (Constraint constraint in table.Constraints) { if (fromTable && constraint is ForeignKeyConstraint && !_tables.Contains(((ForeignKeyConstraint)constraint).RelatedTable)) { continue; } int num = 0; string text = constraint.ConstraintName; while (_constraintNames.Contains(text)) { if (stringBuilder == null) { stringBuilder = new StringBuilder(); } stringBuilder.Append(table.TableName).Append('_').Append(constraint.ConstraintName); if (0 < num) { stringBuilder.Append('_').Append(num); } num++; text = stringBuilder.ToString(); stringBuilder.Length = 0; } _constraintNames.Add(text); constraint.SchemaName = text; } } private void GenerateConstraintNames(ArrayList tables) { for (int i = 0; i < tables.Count; i++) { GenerateConstraintNames((DataTable)tables[i], fromTable: true); } } private void GenerateConstraintNames(DataSet ds) { foreach (DataTable table in ds.Tables) { GenerateConstraintNames(table, fromTable: false); } } private static bool _PropsNotEmpty(PropertyCollection props) { if (props != null) { return props.Count != 0; } return false; } private bool HaveExtendedProperties(DataSet ds) { if (_PropsNotEmpty(ds._extendedProperties)) { return true; } for (int i = 0; i < ds.Tables.Count; i++) { DataTable dataTable = ds.Tables[i]; if (_PropsNotEmpty(dataTable._extendedProperties)) { return true; } for (int j = 0; j < dataTable.Columns.Count; j++) { if (_PropsNotEmpty(dataTable.Columns[j]._extendedProperties)) { return true; } } } for (int k = 0; k < ds.Relations.Count; k++) { if (_PropsNotEmpty(ds.Relations[k]._extendedProperties)) { return true; } } return false; } internal void WriteSchemaRoot(XmlDocument xd, XmlElement rootSchema, string targetNamespace) { if (!string.IsNullOrEmpty(targetNamespace)) { rootSchema.SetAttribute("targetNamespace", targetNamespace); rootSchema.SetAttribute("xmlns:mstns", targetNamespace); } rootSchema.SetAttribute("xmlns", targetNamespace); rootSchema.SetAttribute("xmlns:xs", "http://www.w3.org/2001/XMLSchema"); rootSchema.SetAttribute("xmlns:msdata", "urn:schemas-microsoft-com:xml-msdata"); if (_ds != null && HaveExtendedProperties(_ds)) { rootSchema.SetAttribute("xmlns:msprop", "urn:schemas-microsoft-com:xml-msprop"); } if (!string.IsNullOrEmpty(targetNamespace)) { rootSchema.SetAttribute("attributeFormDefault", "qualified"); rootSchema.SetAttribute("elementFormDefault", "qualified"); } } internal static void ValidateColumnMapping(Type columnType) { if (DataStorage.IsTypeCustomType(columnType)) { throw ExceptionBuilder.InvalidDataColumnMapping(columnType); } } internal void SetupAutoGenerated(DataSet ds) { foreach (DataTable table in ds.Tables) { SetupAutoGenerated(table); } } internal void SetupAutoGenerated(ArrayList dt) { for (int i = 0; i < dt.Count; i++) { SetupAutoGenerated((DataTable)dt[i]); } } internal void SetupAutoGenerated(DataTable dt) { foreach (DataColumn column in dt.Columns) { if (AutoGenerated(column)) { _autogenerated[column] = column; } } foreach (Constraint constraint in dt.Constraints) { if (constraint is ForeignKeyConstraint foreignKeyConstraint) { if (AutoGenerated(foreignKeyConstraint)) { _autogenerated[foreignKeyConstraint] = foreignKeyConstraint; continue; } if (_autogenerated[foreignKeyConstraint.Columns[0]] != null) { _autogenerated[foreignKeyConstraint.Columns[0]] = null; } if (_autogenerated[foreignKeyConstraint.RelatedColumnsReference[0]] != null) { _autogenerated[foreignKeyConstraint.RelatedColumnsReference[0]] = null; } UniqueConstraint uniqueConstraint = (UniqueConstraint)foreignKeyConstraint.RelatedTable.Constraints.FindConstraint(new UniqueConstraint("TEMP", foreignKeyConstraint.RelatedColumnsReference)); if (uniqueConstraint != null) { if (_autogenerated[uniqueConstraint] != null) { _autogenerated[uniqueConstraint] = null; } if (_autogenerated[uniqueConstraint.Key.ColumnsReference[0]] != null) { _autogenerated[uniqueConstraint.Key.ColumnsReference[0]] = null; } } } else { UniqueConstraint uniqueConstraint2 = (UniqueConstraint)constraint; if (AutoGenerated(uniqueConstraint2)) { _autogenerated[uniqueConstraint2] = uniqueConstraint2; } else if (_autogenerated[uniqueConstraint2.Key.ColumnsReference[0]] != null) { _autogenerated[uniqueConstraint2.Key.ColumnsReference[0]] = null; } } } } private void CreateTablesHierarchy(DataTable dt) { foreach (DataRelation childRelation in dt.ChildRelations) { if (!_tables.Contains(childRelation.ChildTable)) { _tables.Add(childRelation.ChildTable); CreateTablesHierarchy(childRelation.ChildTable); } } } private void CreateRelations(DataTable dt) { foreach (DataRelation childRelation in dt.ChildRelations) { if (!_relations.Contains(childRelation)) { _relations.Add(childRelation); CreateRelations(childRelation.ChildTable); } } } private DataTable[] CreateToplevelTables() { ArrayList arrayList = new ArrayList(); for (int i = 0; i < _tables.Count; i++) { DataTable dataTable = (DataTable)_tables[i]; if (dataTable.ParentRelations.Count == 0) { arrayList.Add(dataTable); continue; } bool flag = false; for (int j = 0; j < dataTable.ParentRelations.Count; j++) { if (dataTable.ParentRelations[j].Nested) { if (dataTable.ParentRelations[j].ParentTable == dataTable) { flag = false; break; } flag = true; } } if (!flag) { arrayList.Add(dataTable); } } if (arrayList.Count == 0) { return Array.Empty(); } DataTable[] array = new DataTable[arrayList.Count]; arrayList.CopyTo(array, 0); return array; } internal void SchemaTree(XmlDocument xd, XmlWriter xmlWriter, DataSet ds, DataTable dt, bool writeHierarchy) { _constraintNames = new ArrayList(); _autogenerated = new Hashtable(); bool flag = _filePath != null; _dsElement = xd.CreateElement("xs", "element", "http://www.w3.org/2001/XMLSchema"); bool flag2 = false; if (ds != null) { _ds = ds; foreach (DataTable table in ds.Tables) { _tables.Add(table); } } else { if (dt.DataSet != null) { _ds = dt.DataSet; } _tables.Add(dt); if (writeHierarchy) { CreateTablesHierarchy(dt); } } _dc = xd; _namespaces = new Hashtable(); _prefixes = new Hashtable(); XmlElement xmlElement = (_sRoot = xd.CreateElement("xs", "schema", "http://www.w3.org/2001/XMLSchema")); if (_ds != null) { xmlElement.SetAttribute("id", XmlConvert.EncodeLocalName(_ds.DataSetName)); } else { xmlElement.SetAttribute("id", XmlConvert.EncodeLocalName("NewDataSet")); } if (_ds != null) { WriteSchemaRoot(xd, xmlElement, _ds.Namespace); } else { WriteSchemaRoot(xd, xmlElement, dt.Namespace); } if (_schFormat == SchemaFormat.Remoting) { if (_ds != null) { _namespaces[_ds.Namespace] = xmlElement; } else { _namespaces[dt.Namespace] = xmlElement; } } if (_schFormat != SchemaFormat.Remoting && _ds != null) { _namespaces[_ds.Namespace] = xmlElement; if (_ds.Namespace.Length == 0) { _prefixes[_ds.Namespace] = null; } else { xmlElement.SetAttribute("xmlns:mstns", _ds.Namespace); _prefixes[_ds.Namespace] = "mstns"; } } if (ds != null) { GenerateConstraintNames(ds); } else { GenerateConstraintNames(_tables); } if (_schFormat != SchemaFormat.Remoting) { if (ds != null) { SetupAutoGenerated(ds); } else { SetupAutoGenerated(_tables); } } DataTable[] array = ((ds != null) ? ds.TopLevelTables(forSchema: true) : CreateToplevelTables()); if (array.Length == 0 || _schFormat == SchemaFormat.WebServiceSkipSchema || _schFormat == SchemaFormat.RemotingSkipSchema) { FillDataSetElement(xd, ds, dt); xmlElement.AppendChild(_dsElement); AddXdoProperties(_ds, _dsElement, xd); AddExtendedProperties(ds._extendedProperties, _dsElement); xd.AppendChild(xmlElement); xd.Save(xmlWriter); xmlWriter.Flush(); return; } XmlElement xmlElement2 = FillDataSetElement(xd, ds, dt); _constraintSeparator = xd.CreateElement("xs", "SHOULDNOTBEHERE", "http://www.w3.org/2001/XMLSchema"); _dsElement.AppendChild(_constraintSeparator); if (_ds != null) { AddXdoProperties(_ds, _dsElement, xd); AddExtendedProperties(_ds._extendedProperties, _dsElement); } for (int i = 0; i < array.Length; i++) { XmlElement xmlElement3 = HandleTable(array[i], xd, xmlElement); if ((_ds != null && _ds.Namespace == array[i].Namespace) || string.IsNullOrEmpty(array[i].Namespace) || _schFormat == SchemaFormat.Remoting) { bool flag3 = array[i]._fNestedInDataset; if (_ds != null && _ds.Namespace.Length != 0 && string.IsNullOrEmpty(array[i].Namespace)) { flag3 = true; } if (array[i].SelfNested) { flag3 = false; } if (array[i].NestedParentsCount > 1) { flag3 = false; } if (flag3) { if (array[i].MinOccurs != 1m) { xmlElement3.SetAttribute("minOccurs", array[i].MinOccurs.ToString(CultureInfo.InvariantCulture)); } if (array[i].MaxOccurs == -1m) { xmlElement3.SetAttribute("maxOccurs", "unbounded"); } else if (array[i].MaxOccurs != 1m) { xmlElement3.SetAttribute("maxOccurs", array[i].MaxOccurs.ToString(CultureInfo.InvariantCulture)); } } if (!flag3) { xmlElement.AppendChild(xmlElement3); XmlElement xmlElement4 = xd.CreateElement("xs", "element", "http://www.w3.org/2001/XMLSchema"); if ((_ds != null && _ds.Namespace == array[i].Namespace) || string.IsNullOrEmpty(array[i].Namespace) || _schFormat == SchemaFormat.Remoting) { xmlElement4.SetAttribute("ref", array[i].EncodedTableName); } else { xmlElement4.SetAttribute("ref", (string)_prefixes[array[i].Namespace] + ":" + array[i].EncodedTableName); } xmlElement2.AppendChild(xmlElement4); } else { xmlElement2.AppendChild(xmlElement3); } } else { AppendChildWithoutRef(xmlElement, array[i].Namespace, xmlElement3, "element"); XmlElement xmlElement5 = xd.CreateElement("xs", "element", "http://www.w3.org/2001/XMLSchema"); xmlElement5.SetAttribute("ref", (string)_prefixes[array[i].Namespace] + ":" + array[i].EncodedTableName); xmlElement2.AppendChild(xmlElement5); } } _dsElement.RemoveChild(_constraintSeparator); xmlElement.AppendChild(_dsElement); DataRelation[] array2 = Array.Empty(); if (ds != null && _tables.Count > 0) { array2 = new DataRelation[ds.Relations.Count]; for (int j = 0; j < ds.Relations.Count; j++) { array2[j] = ds.Relations[j]; } } else if (writeHierarchy && _tables.Count > 0) { CreateRelations((DataTable)_tables[0]); array2 = new DataRelation[_relations.Count]; _relations.CopyTo(array2, 0); } XmlElement xmlElement6 = null; XmlElement xmlElement7 = null; foreach (DataRelation dataRelation in array2) { if ((!dataRelation.Nested || flag2) && dataRelation.ChildKeyConstraint == null) { if (xmlElement6 == null) { xmlElement6 = xd.CreateElement("xs", "annotation", "http://www.w3.org/2001/XMLSchema"); xmlElement.AppendChild(xmlElement6); xmlElement7 = xd.CreateElement("xs", "appinfo", "http://www.w3.org/2001/XMLSchema"); xmlElement6.AppendChild(xmlElement7); } xmlElement7.AppendChild(HandleRelation(dataRelation, xd)); } } XmlComment xmlComment = null; bool flag4 = _namespaces.Count > 1 && !flag; if (_schFormat != SchemaFormat.Remoting && _schFormat != SchemaFormat.RemotingSkipSchema) { foreach (string key in _namespaces.Keys) { if (!(key == ((_ds != null) ? _ds.Namespace : dt.Namespace)) && !string.IsNullOrEmpty(key)) { XmlElement xmlElement8 = xd.CreateElement("xs", "import", "http://www.w3.org/2001/XMLSchema"); xmlElement8.SetAttribute("namespace", key); if (_schFormat != SchemaFormat.WebService && !flag4) { xmlElement8.SetAttribute("schemaLocation", string.Concat(_fileName, "_", _prefixes[key], ".xsd")); } xmlElement.PrependChild(xmlElement8); } } if (_schFormat != SchemaFormat.WebService && flag4) { xmlElement.SetAttribute("schemafragmentcount", "urn:schemas-microsoft-com:xml-msdata", _namespaces.Count.ToString(CultureInfo.InvariantCulture)); } xd.AppendChild(xmlElement); if (_schFormat != SchemaFormat.WebService && flag4) { xd.WriteTo(xmlWriter); } else { xd.Save(xmlWriter); } xd.RemoveChild(xmlElement); foreach (string key2 in _namespaces.Keys) { if (key2 == ((_ds != null) ? _ds.Namespace : dt.Namespace) || string.IsNullOrEmpty(key2)) { continue; } XmlWriter xmlWriter2 = null; xmlWriter2 = (flag ? new XmlTextWriter(string.Concat(_filePath, _fileName, "_", _prefixes[key2], ".xsd"), null) : xmlWriter); try { if (flag) { if (xmlWriter2 is XmlTextWriter) { ((XmlTextWriter)xmlWriter2).Formatting = Formatting.Indented; } xmlWriter2.WriteStartDocument(standalone: true); } XmlElement xmlElement9 = (XmlElement)_namespaces[key2]; _dc.AppendChild(xmlElement9); foreach (string key3 in _namespaces.Keys) { if (key2 == key3) { continue; } string text4 = (string)_prefixes[key3]; if (text4 == null) { continue; } xmlElement9.SetAttribute("xmlns:" + text4, key3); XmlElement xmlElement10 = _dc.CreateElement("xs", "import", "http://www.w3.org/2001/XMLSchema"); xmlElement10.SetAttribute("namespace", key3); if (_schFormat != SchemaFormat.WebService && !flag4) { if (key3 == ((_ds != null) ? _ds.Namespace : dt.Namespace)) { xmlElement10.SetAttribute("schemaLocation", _fileName + _fileExt); } else { xmlElement10.SetAttribute("schemaLocation", _fileName + "_" + text4 + ".xsd"); } } xmlElement9.PrependChild(xmlElement10); } if (_schFormat != SchemaFormat.WebService && flag4) { _dc.WriteTo(xmlWriter2); } else { _dc.Save(xmlWriter2); } _dc.RemoveChild(xmlElement9); if (flag) { xmlWriter2.WriteEndDocument(); } } finally { if (flag) { xmlWriter2.Close(); } } } } else { xd.AppendChild(xmlElement); xd.Save(xmlWriter); } if (xmlComment != null) { xmlElement.PrependChild(xmlComment); } if (!flag) { xmlWriter.Flush(); } } internal XmlElement SchemaTree(XmlDocument xd, DataTable dt) { _dsElement = xd.CreateElement("xs", "element", "http://www.w3.org/2001/XMLSchema"); _constraintNames = new ArrayList(); _ds = dt.DataSet; _dc = xd; _namespaces = new Hashtable(); _prefixes = new Hashtable(); if (_schFormat != SchemaFormat.Remoting) { _autogenerated = new Hashtable(); } XmlElement xmlElement = (_sRoot = xd.CreateElement("xs", "schema", "http://www.w3.org/2001/XMLSchema")); WriteSchemaRoot(xd, xmlElement, dt.Namespace); FillDataSetElement(xd, null, dt); _constraintSeparator = xd.CreateElement("xs", "SHOULDNOTBEHERE", "http://www.w3.org/2001/XMLSchema"); _dsElement.AppendChild(_constraintSeparator); if (_schFormat != SchemaFormat.Remoting) { if (_ds != null) { _namespaces[_ds.Namespace] = xmlElement; if (_ds.Namespace.Length == 0) { _prefixes[_ds.Namespace] = null; } else { xmlElement.SetAttribute("xmlns:mstns", _ds.Namespace); _prefixes[_ds.Namespace] = "mstns"; } } else { _namespaces[dt.Namespace] = xmlElement; if (dt.Namespace.Length == 0) { _prefixes[dt.Namespace] = null; } else { xmlElement.SetAttribute("xmlns:mstns", dt.Namespace); _prefixes[dt.Namespace] = "mstns"; } } } GenerateConstraintNames(dt, fromTable: true); XmlElement newChild = HandleTable(dt, xd, xmlElement, genNested: false); xmlElement.AppendChild(newChild); _dsElement.RemoveChild(_constraintSeparator); xmlElement.AppendChild(_dsElement); return xmlElement; } internal XmlElement FillDataSetElement(XmlDocument xd, DataSet ds, DataTable dt) { DataSet dataSet = ((ds != null) ? ds : dt.DataSet); if (dataSet != null) { _dsElement.SetAttribute("name", XmlConvert.EncodeLocalName(dataSet.DataSetName)); _dsElement.SetAttribute("IsDataSet", "urn:schemas-microsoft-com:xml-msdata", "true"); if (ds == null) { _dsElement.SetAttribute("MainDataTable", "urn:schemas-microsoft-com:xml-msdata", XmlConvert.EncodeLocalName((dt.Namespace.Length == 0) ? dt.TableName : (dt.Namespace + ":" + dt.TableName))); } if (dataSet.CaseSensitive) { _dsElement.SetAttribute("CaseSensitive", "urn:schemas-microsoft-com:xml-msdata", "true"); } if (dataSet.ShouldSerializeLocale() || !dataSet.Locale.Equals(CultureInfo.CurrentCulture)) { _dsElement.SetAttribute("Locale", "urn:schemas-microsoft-com:xml-msdata", dataSet.Locale.ToString()); } else { _dsElement.SetAttribute("UseCurrentLocale", "urn:schemas-microsoft-com:xml-msdata", "true"); } } else if (dt != null) { _dsElement.SetAttribute("name", XmlConvert.EncodeLocalName("NewDataSet")); _dsElement.SetAttribute("IsDataSet", "urn:schemas-microsoft-com:xml-msdata", "true"); _dsElement.SetAttribute("MainDataTable", "urn:schemas-microsoft-com:xml-msdata", XmlConvert.EncodeLocalName((dt.Namespace.Length == 0) ? dt.TableName : (dt.Namespace + ":" + dt.TableName))); if (dt.CaseSensitive) { _dsElement.SetAttribute("CaseSensitive", "urn:schemas-microsoft-com:xml-msdata", "true"); } if (dt.ShouldSerializeLocale() || !dt.Locale.Equals(CultureInfo.CurrentCulture)) { _dsElement.SetAttribute("Locale", "urn:schemas-microsoft-com:xml-msdata", dt.Locale.ToString()); } else { _dsElement.SetAttribute("UseCurrentLocale", "urn:schemas-microsoft-com:xml-msdata", "true"); } } XmlElement xmlElement = xd.CreateElement("xs", "complexType", "http://www.w3.org/2001/XMLSchema"); _dsElement.AppendChild(xmlElement); XmlElement xmlElement2 = xd.CreateElement("xs", "choice", "http://www.w3.org/2001/XMLSchema"); xmlElement2.SetAttribute("minOccurs", "0"); xmlElement2.SetAttribute("maxOccurs", "unbounded"); xmlElement.AppendChild(xmlElement2); return xmlElement2; } internal void SetPath(XmlWriter xw) { FileStream fileStream = null; fileStream = ((xw is DataTextWriter dataTextWriter) ? (dataTextWriter.BaseStream as FileStream) : null); if (fileStream == null) { if (!(xw is XmlTextWriter xmlTextWriter)) { return; } fileStream = xmlTextWriter.BaseStream as FileStream; if (fileStream == null) { return; } } _filePath = Path.GetDirectoryName(fileStream.Name); _fileName = Path.GetFileNameWithoutExtension(fileStream.Name); _fileExt = Path.GetExtension(fileStream.Name); if (!string.IsNullOrEmpty(_filePath)) { _filePath += "\\"; } } internal void Save(DataSet ds, XmlWriter xw) { Save(ds, null, xw); } internal void Save(DataTable dt, XmlWriter xw) { XmlDocument xmlDocument = new XmlDocument(); if (_schFormat == SchemaFormat.Public) { SetPath(xw); } XmlElement newChild = SchemaTree(xmlDocument, dt); xmlDocument.AppendChild(newChild); xmlDocument.Save(xw); } internal void Save(DataSet ds, DataTable dt, XmlWriter xw) { Save(ds, dt, xw, writeHierarchy: false); } internal void Save(DataSet ds, DataTable dt, XmlWriter xw, bool writeHierarchy) { Save(ds, dt, xw, writeHierarchy, null); } internal void Save(DataSet ds, DataTable dt, XmlWriter xw, bool writeHierarchy, Converter multipleTargetConverter) { _targetConverter = multipleTargetConverter; XmlDocument xd = new XmlDocument(); if (_schFormat == SchemaFormat.Public) { SetPath(xw); } if (_schFormat == SchemaFormat.WebServiceSkipSchema && xw.WriteState == WriteState.Element) { xw.WriteAttributeString("msdata", "SchemaSerializationMode", "urn:schemas-microsoft-com:xml-msdata", "ExcludeSchema"); } SchemaTree(xd, xw, ds, dt, writeHierarchy); } internal XmlElement HandleRelation(DataRelation rel, XmlDocument dc) { XmlElement xmlElement = dc.CreateElement("msdata", "Relationship", "urn:schemas-microsoft-com:xml-msdata"); xmlElement.SetAttribute("name", XmlConvert.EncodeLocalName(rel.RelationName)); xmlElement.SetAttribute("parent", "urn:schemas-microsoft-com:xml-msdata", rel.ParentKey.Table.EncodedTableName); xmlElement.SetAttribute("child", "urn:schemas-microsoft-com:xml-msdata", rel.ChildKey.Table.EncodedTableName); if (_ds == null || _ds.Tables.InternalIndexOf(rel.ParentKey.Table.TableName) == -3) { xmlElement.SetAttribute("ParentTableNamespace", "urn:schemas-microsoft-com:xml-msdata", rel.ParentKey.Table.Namespace); } if (_ds == null || _ds.Tables.InternalIndexOf(rel.ChildKey.Table.TableName) == -3) { xmlElement.SetAttribute("ChildTableNamespace", "urn:schemas-microsoft-com:xml-msdata", rel.ChildKey.Table.Namespace); } DataColumn[] columnsReference = rel.ParentKey.ColumnsReference; string value = columnsReference[0].EncodedColumnName; StringBuilder stringBuilder = null; if (1 < columnsReference.Length) { stringBuilder = new StringBuilder(); stringBuilder.Append(value); for (int i = 1; i < columnsReference.Length; i++) { stringBuilder.Append(' ').Append(columnsReference[i].EncodedColumnName); } value = stringBuilder.ToString(); } xmlElement.SetAttribute("parentkey", "urn:schemas-microsoft-com:xml-msdata", value); columnsReference = rel.ChildKey.ColumnsReference; value = columnsReference[0].EncodedColumnName; if (1 < columnsReference.Length) { if (stringBuilder != null) { stringBuilder.Length = 0; } else { stringBuilder = new StringBuilder(); } stringBuilder.Append(value); for (int j = 1; j < columnsReference.Length; j++) { stringBuilder.Append(' ').Append(columnsReference[j].EncodedColumnName); } value = stringBuilder.ToString(); } xmlElement.SetAttribute("childkey", "urn:schemas-microsoft-com:xml-msdata", value); AddExtendedProperties(rel._extendedProperties, xmlElement); return xmlElement; } private static XmlElement FindSimpleType(XmlElement schema, string name) { for (XmlNode xmlNode = schema.FirstChild; xmlNode != null; xmlNode = xmlNode.NextSibling) { if (xmlNode is XmlElement) { XmlElement xmlElement = (XmlElement)xmlNode; if (xmlElement.GetAttribute("name") == name) { return xmlElement; } } } return null; } internal XmlElement GetSchema(string NamespaceURI) { XmlElement xmlElement = (XmlElement)_namespaces[NamespaceURI]; if (xmlElement == null) { xmlElement = _dc.CreateElement("xs", "schema", "http://www.w3.org/2001/XMLSchema"); WriteSchemaRoot(_dc, xmlElement, NamespaceURI); if (!string.IsNullOrEmpty(NamespaceURI)) { string text = "app" + Convert.ToString(++_prefixCount, CultureInfo.InvariantCulture); _sRoot.SetAttribute("xmlns:" + text, NamespaceURI); xmlElement.SetAttribute("xmlns:" + text, NamespaceURI); _prefixes[NamespaceURI] = text; } _namespaces[NamespaceURI] = xmlElement; } return xmlElement; } internal void HandleColumnType(DataColumn col, XmlDocument dc, XmlElement root, XmlElement schema) { string name = "type"; if (col.ColumnMapping == MappingType.SimpleContent) { name = "base"; } if (col.SimpleType != null) { for (SimpleType simpleType = col.SimpleType; simpleType != null; simpleType = simpleType.BaseSimpleType) { string name2 = simpleType.Name; if (name2 != null && name2.Length != 0) { string text = ((_schFormat != SchemaFormat.Remoting) ? simpleType.Namespace : ((col.Table.DataSet != null) ? col.Table.DataSet.Namespace : col.Table.Namespace)); XmlElement schema2 = GetSchema(text); if (simpleType.BaseSimpleType != null && simpleType.BaseSimpleType.Namespace != null && simpleType.BaseSimpleType.Namespace.Length > 0) { GetSchema(simpleType.BaseSimpleType.Namespace); } XmlNode newChild = simpleType.ToNode(dc, _prefixes, _schFormat == SchemaFormat.Remoting); if (simpleType == col.SimpleType) { string text2 = (string)_prefixes[text]; if (text2 != null && text2.Length > 0) { if (_schFormat != SchemaFormat.Remoting) { root.SetAttribute(name, text2 + ":" + name2); } else { root.SetAttribute(name, name2); } } else { root.SetAttribute(name, name2); } } if (FindSimpleType(schema2, name2) == null) { schema2.AppendChild(newChild); } } else { if (simpleType.BaseSimpleType != null && simpleType.BaseSimpleType.Namespace != null && simpleType.BaseSimpleType.Namespace.Length > 0) { GetSchema(simpleType.BaseSimpleType.Namespace); } XmlNode newChild = simpleType.ToNode(dc, _prefixes, _schFormat == SchemaFormat.Remoting); root.AppendChild(newChild); } } return; } if (col.XmlDataType != null && col.XmlDataType.Length != 0 && XSDSchema.IsXsdType(col.XmlDataType)) { root.SetAttribute(name, XSDSchema.QualifiedName(col.XmlDataType)); return; } string text3 = XmlDataTypeName(col.DataType); if (text3 == null || text3.Length == 0) { if (col.DataType == typeof(Guid) || col.DataType == typeof(Type)) { text3 = "string"; } else { if (col.ColumnMapping == MappingType.Attribute) { ValidateColumnMapping(col.DataType); } text3 = "anyType"; } } root.SetAttribute(name, XSDSchema.QualifiedName(text3)); } internal void AddColumnProperties(DataColumn col, XmlElement root) { if (col.DataType != typeof(string)) { string text = XmlDataTypeName(col.DataType); if ((col.IsSqlType && (text.Length == 0 || col.ImplementsINullable)) || typeof(SqlXml) == col.DataType || col.DataType == typeof(DateTimeOffset) || col.DataType == typeof(BigInteger)) { root.SetAttribute("DataType", "urn:schemas-microsoft-com:xml-msdata", col.DataType.FullName); } else if (text.Length == 0 || col.ImplementsINullable || (text == "anyType" && col.XmlDataType != "anyType")) { SetMSDataAttribute(root, col.DataType); } } if (col.ReadOnly) { root.SetAttribute("ReadOnly", "urn:schemas-microsoft-com:xml-msdata", "true"); } if (col.Expression.Length != 0) { root.SetAttribute("Expression", "urn:schemas-microsoft-com:xml-msdata", col.Expression); } if (col.AutoIncrement) { root.SetAttribute("AutoIncrement", "urn:schemas-microsoft-com:xml-msdata", "true"); } if (col.AutoIncrementSeed != 0L) { root.SetAttribute("AutoIncrementSeed", "urn:schemas-microsoft-com:xml-msdata", col.AutoIncrementSeed.ToString(CultureInfo.InvariantCulture)); } if (col.AutoIncrementStep != 1) { root.SetAttribute("AutoIncrementStep", "urn:schemas-microsoft-com:xml-msdata", col.AutoIncrementStep.ToString(CultureInfo.InvariantCulture)); } if (col.Caption != col.ColumnName) { root.SetAttribute("Caption", "urn:schemas-microsoft-com:xml-msdata", col.Caption); } if (col.Prefix.Length != 0) { root.SetAttribute("Prefix", "urn:schemas-microsoft-com:xml-msdata", col.Prefix); } if (col.DataType == typeof(DateTime) && col.DateTimeMode != DataSetDateTime.UnspecifiedLocal) { root.SetAttribute("DateTimeMode", "urn:schemas-microsoft-com:xml-msdata", col.DateTimeMode.ToString()); } } private string FindTargetNamespace(DataTable table) { string text = (table.TypeName.IsEmpty ? table.Namespace : table.TypeName.Namespace); if (string.IsNullOrEmpty(text)) { DataRelation[] nestedParentRelations = table.NestedParentRelations; if (nestedParentRelations.Length != 0) { for (int i = 0; i < nestedParentRelations.Length; i++) { DataTable parentTable = nestedParentRelations[i].ParentTable; if (table != parentTable) { text = FindTargetNamespace(parentTable); if (!string.IsNullOrEmpty(text)) { break; } } } } else { text = _ds.Namespace; } } return text; } internal XmlElement HandleColumn(DataColumn col, XmlDocument dc, XmlElement schema, bool fWriteOrdinal) { string localName = ((col.ColumnMapping != MappingType.Element) ? "attribute" : "element"); XmlElement xmlElement = dc.CreateElement("xs", localName, "http://www.w3.org/2001/XMLSchema"); xmlElement.SetAttribute("name", col.EncodedColumnName); if (col.Namespace.Length == 0) { DataTable table = col.Table; string text = FindTargetNamespace(table); if (col.Namespace != text) { xmlElement.SetAttribute("form", "unqualified"); } } if (col.GetType() != typeof(DataColumn)) { AddXdoProperties(col, xmlElement, dc); } else { AddColumnProperties(col, xmlElement); } AddExtendedProperties(col._extendedProperties, xmlElement); HandleColumnType(col, dc, xmlElement, schema); if (col.ColumnMapping == MappingType.Hidden) { if (!col.AllowDBNull) { xmlElement.SetAttribute("AllowDBNull", "urn:schemas-microsoft-com:xml-msdata", "false"); } if (!col.DefaultValueIsNull) { if (col.DataType == typeof(bool)) { xmlElement.SetAttribute("DefaultValue", "urn:schemas-microsoft-com:xml-msdata", ((bool)col.DefaultValue) ? "true" : "false"); } else { ValidateColumnMapping(col.DataType); xmlElement.SetAttribute("DefaultValue", "urn:schemas-microsoft-com:xml-msdata", col.ConvertObjectToXml(col.DefaultValue)); } } } if (!col.DefaultValueIsNull && col.ColumnMapping != MappingType.Hidden) { ValidateColumnMapping(col.DataType); if (col.ColumnMapping == MappingType.Attribute && !col.AllowDBNull) { if (col.DataType == typeof(bool)) { xmlElement.SetAttribute("DefaultValue", "urn:schemas-microsoft-com:xml-msdata", ((bool)col.DefaultValue) ? "true" : "false"); } else { xmlElement.SetAttribute("DefaultValue", "urn:schemas-microsoft-com:xml-msdata", col.ConvertObjectToXml(col.DefaultValue)); } } else if (col.DataType == typeof(bool)) { xmlElement.SetAttribute("default", ((bool)col.DefaultValue) ? "true" : "false"); } else if (!col.IsCustomType) { xmlElement.SetAttribute("default", col.ConvertObjectToXml(col.DefaultValue)); } } if (_schFormat == SchemaFormat.Remoting) { xmlElement.SetAttribute("targetNamespace", "urn:schemas-microsoft-com:xml-msdata", col.Namespace); } else if (col.Namespace != (col.Table.TypeName.IsEmpty ? col.Table.Namespace : col.Table.TypeName.Namespace) && col.Namespace.Length != 0) { XmlElement schema2 = GetSchema(col.Namespace); if (FindTypeNode(schema2, col.EncodedColumnName) == null) { schema2.AppendChild(xmlElement); } xmlElement = _dc.CreateElement("xs", localName, "http://www.w3.org/2001/XMLSchema"); xmlElement.SetAttribute("ref", string.Concat(_prefixes[col.Namespace], ":", col.EncodedColumnName)); if (col.Table.Namespace != _ds.Namespace) { _ = (string)_prefixes[col.Namespace]; GetSchema(col.Table.Namespace); } } int num = ((!col.AllowDBNull) ? 1 : 0); if (col.ColumnMapping == MappingType.Attribute && num != 0) { xmlElement.SetAttribute("use", "required"); } if (col.ColumnMapping == MappingType.Hidden) { xmlElement.SetAttribute("use", "prohibited"); } else if (col.ColumnMapping != MappingType.Attribute && num != 1) { xmlElement.SetAttribute("minOccurs", num.ToString(CultureInfo.InvariantCulture)); } if (col.ColumnMapping == MappingType.Element && fWriteOrdinal) { xmlElement.SetAttribute("Ordinal", "urn:schemas-microsoft-com:xml-msdata", col.Ordinal.ToString(CultureInfo.InvariantCulture)); } return xmlElement; } internal static string TranslateAcceptRejectRule(AcceptRejectRule rule) { return rule switch { AcceptRejectRule.Cascade => "Cascade", AcceptRejectRule.None => "None", _ => null, }; } internal static string TranslateRule(Rule rule) { return rule switch { Rule.Cascade => "Cascade", Rule.None => "None", Rule.SetNull => "SetNull", Rule.SetDefault => "SetDefault", _ => null, }; } internal void AppendChildWithoutRef(XmlElement node, string Namespace, XmlElement el, string refString) { XmlElement schema = GetSchema(Namespace); if (FindTypeNode(schema, el.GetAttribute("name")) == null) { schema.AppendChild(el); } } internal XmlElement FindTypeNode(XmlElement node, string strType) { if (node == null) { return null; } for (XmlNode xmlNode = node.FirstChild; xmlNode != null; xmlNode = xmlNode.NextSibling) { if (xmlNode is XmlElement) { XmlElement xmlElement = (XmlElement)xmlNode; if ((XMLSchema.FEqualIdentity(xmlElement, "element", "http://www.w3.org/2001/XMLSchema") || XMLSchema.FEqualIdentity(xmlElement, "attribute", "http://www.w3.org/2001/XMLSchema") || XMLSchema.FEqualIdentity(xmlElement, "complexType", "http://www.w3.org/2001/XMLSchema") || XMLSchema.FEqualIdentity(xmlElement, "simpleType", "http://www.w3.org/2001/XMLSchema")) && xmlElement.GetAttribute("name") == strType) { return xmlElement; } } } return null; } internal XmlElement HandleTable(DataTable table, XmlDocument dc, XmlElement schema) { return HandleTable(table, dc, schema, genNested: true); } private bool HasMixedColumns(DataTable table) { bool flag = false; bool flag2 = false; foreach (DataColumn column in table.Columns) { if (!flag2 && column.ColumnMapping == MappingType.Element) { flag2 = true; } if (!flag && (column.ColumnMapping == MappingType.Attribute || column.ColumnMapping == MappingType.Hidden)) { flag = !AutoGenerated(column); } if (flag && flag2) { return true; } } return false; } internal static bool AutoGenerated(DataColumn col) { if (col.ColumnMapping != MappingType.Hidden) { return false; } if (col.DataType != typeof(int)) { return false; } string text = col.Table.TableName + "_Id"; if (col.ColumnName == text || col.ColumnName == text + "_0") { return true; } text = string.Empty; foreach (DataRelation parentRelation in col.Table.ParentRelations) { if (parentRelation.Nested && parentRelation.ChildColumnsReference.Length == 1 && parentRelation.ChildColumnsReference[0] == col && parentRelation.ParentColumnsReference.Length == 1) { text = parentRelation.ParentColumnsReference[0].Table.TableName + "_Id"; } } if (col.ColumnName == text || col.ColumnName == text + "_0") { return true; } return false; } internal static bool AutoGenerated(DataRelation rel) { string value = rel.ParentTable.TableName + "_" + rel.ChildTable.TableName; if (!rel.RelationName.StartsWith(value, StringComparison.Ordinal)) { return false; } if (rel.ExtendedProperties.Count > 0) { return false; } return true; } internal static bool AutoGenerated(UniqueConstraint unique) { if (!unique.ConstraintName.StartsWith("Constraint", StringComparison.Ordinal)) { return false; } if (unique.Key.ColumnsReference.Length != 1) { return false; } if (unique.ExtendedProperties.Count > 0) { return false; } return AutoGenerated(unique.Key.ColumnsReference[0]); } private bool AutoGenerated(ForeignKeyConstraint fk) { return AutoGenerated(fk, checkRelation: true); } internal static bool AutoGenerated(ForeignKeyConstraint fk, bool checkRelation) { DataRelation dataRelation = fk.FindParentRelation(); if (checkRelation) { if (dataRelation == null) { return false; } if (!AutoGenerated(dataRelation)) { return false; } if (dataRelation.RelationName != fk.ConstraintName) { return false; } } if (fk.ExtendedProperties.Count > 0) { return false; } if (fk.AcceptRejectRule != 0) { return false; } if (fk.DeleteRule != Rule.Cascade) { return false; } if (fk.DeleteRule != Rule.Cascade) { return false; } if (fk.RelatedColumnsReference.Length != 1) { return false; } return AutoGenerated(fk.RelatedColumnsReference[0]); } private bool IsAutoGenerated(object o) { if (_schFormat != SchemaFormat.Remoting) { return _autogenerated[o] != null; } return false; } internal XmlElement HandleTable(DataTable table, XmlDocument dc, XmlElement schema, bool genNested) { XmlElement xmlElement = dc.CreateElement("xs", "element", "http://www.w3.org/2001/XMLSchema"); bool flag = false; bool flag2 = false; if ((table.DataSet == null || (_ds != null && table.Namespace != _ds.Namespace)) && _schFormat == SchemaFormat.Remoting) { xmlElement.SetAttribute("targetNamespace", "urn:schemas-microsoft-com:xml-msdata", table.Namespace); } xmlElement.SetAttribute("name", table.EncodedTableName); if (table.Namespace.Length == 0) { DataTable dataTable = table; string text = dataTable.Namespace; while (string.IsNullOrEmpty(text)) { DataRelation[] nestedParentRelations = dataTable.NestedParentRelations; if (nestedParentRelations.Length == 0) { text = ((_ds != null) ? _ds.Namespace : ""); break; } int num = -1; for (int i = 0; i < nestedParentRelations.Length; i++) { if (nestedParentRelations[i].ParentTable != dataTable) { num = i; break; } } if (num == -1) { break; } dataTable = nestedParentRelations[num].ParentTable; text = dataTable.Namespace; } if (table.Namespace != text) { xmlElement.SetAttribute("form", "unqualified"); flag2 = true; } } if (table.ShouldSerializeCaseSensitive()) { xmlElement.SetAttribute("CaseSensitive", "urn:schemas-microsoft-com:xml-msdata", table.CaseSensitive.ToString()); } if (table.ShouldSerializeLocale()) { xmlElement.SetAttribute("Locale", "urn:schemas-microsoft-com:xml-msdata", table.Locale.ToString()); } AddXdoProperties(table, xmlElement, dc); DataColumnCollection columns = table.Columns; int count = columns.Count; int num2 = 0; if (count == 1 || count == 2) { for (int j = 0; j < count; j++) { DataColumn dataColumn = columns[j]; if (dataColumn.ColumnMapping == MappingType.Hidden) { DataRelationCollection childRelations = table.ChildRelations; for (int k = 0; k < childRelations.Count; k++) { if (childRelations[k].Nested && childRelations[k].ParentKey.ColumnsReference.Length == 1 && childRelations[k].ParentKey.ColumnsReference[0] == dataColumn) { num2++; } } } if (dataColumn.ColumnMapping == MappingType.Element) { num2++; } } } if (table._repeatableElement && num2 == 1) { string text2 = XmlDataTypeName(table.Columns[0].DataType); if (text2 == null || text2.Length == 0) { text2 = "anyType"; } xmlElement.SetAttribute("type", XSDSchema.QualifiedName(text2)); return xmlElement; } XmlElement xmlElement2 = dc.CreateElement("xs", "complexType", "http://www.w3.org/2001/XMLSchema"); if (!table.TypeName.IsEmpty && _schFormat != SchemaFormat.Remoting) { XmlElement xmlElement3 = GetSchema(table.TypeName.Namespace); if (string.IsNullOrEmpty(table.TypeName.Namespace)) { xmlElement3 = ((_ds != null) ? (flag2 ? GetSchema(_ds.Namespace) : GetSchema(table.Namespace)) : GetSchema(table.Namespace)); } if (FindTypeNode(xmlElement3, table.TypeName.Name) == null) { xmlElement3.AppendChild(xmlElement2); } xmlElement2.SetAttribute("name", table.TypeName.Name); } else { xmlElement.AppendChild(xmlElement2); } if (!table.TypeName.IsEmpty && _schFormat != SchemaFormat.Remoting) { xmlElement.SetAttribute("type", NewDiffgramGen.QualifiedName((string)_prefixes[table.TypeName.Namespace], table.TypeName.Name)); } XmlElement xmlElement4 = null; DataColumn xmlText = table.XmlText; if (xmlText != null) { XmlElement xmlElement5 = dc.CreateElement("xs", "simpleContent", "http://www.w3.org/2001/XMLSchema"); if (xmlText.GetType() != typeof(DataColumn)) { AddXdoProperties(xmlText, xmlElement5, dc); } else { AddColumnProperties(xmlText, xmlElement5); } AddExtendedProperties(xmlText._extendedProperties, xmlElement5); if (xmlText.AllowDBNull) { xmlElement.SetAttribute("nillable", string.Empty, "true"); } if (!xmlText.DefaultValueIsNull) { ValidateColumnMapping(xmlText.DataType); xmlElement5.SetAttribute("DefaultValue", "urn:schemas-microsoft-com:xml-msdata", xmlText.ConvertObjectToXml(xmlText.DefaultValue)); } xmlElement5.SetAttribute("ColumnName", "urn:schemas-microsoft-com:xml-msdata", xmlText.ColumnName); xmlElement5.SetAttribute("Ordinal", "urn:schemas-microsoft-com:xml-msdata", xmlText.Ordinal.ToString(CultureInfo.InvariantCulture)); xmlElement2.AppendChild(xmlElement5); XmlElement xmlElement6 = dc.CreateElement("xs", "extension", "http://www.w3.org/2001/XMLSchema"); xmlElement5.AppendChild(xmlElement6); HandleColumnType(xmlText, dc, xmlElement6, schema); xmlElement2 = xmlElement6; } xmlElement4 = dc.CreateElement("xs", "sequence", "http://www.w3.org/2001/XMLSchema"); xmlElement2.AppendChild(xmlElement4); flag = HasMixedColumns(table); for (int l = 0; l < count; l++) { DataColumn dataColumn2 = columns[l]; if (dataColumn2.ColumnMapping != MappingType.SimpleContent && (dataColumn2.ColumnMapping == MappingType.Attribute || dataColumn2.ColumnMapping == MappingType.Element || dataColumn2.ColumnMapping == MappingType.Hidden) && !IsAutoGenerated(dataColumn2)) { bool num3 = dataColumn2.ColumnMapping != MappingType.Element; XmlElement newChild = HandleColumn(dataColumn2, dc, schema, flag); (num3 ? xmlElement2 : xmlElement4).AppendChild(newChild); } } if (table.XmlText == null && genNested) { DataRelationCollection childRelations2 = table.ChildRelations; for (int m = 0; m < childRelations2.Count; m++) { if (!childRelations2[m].Nested) { continue; } DataTable childTable = childRelations2[m].ChildTable; XmlElement xmlElement7; if (childTable == table) { xmlElement7 = dc.CreateElement("xs", "element", "http://www.w3.org/2001/XMLSchema"); xmlElement7.SetAttribute("ref", table.EncodedTableName); } else if (childTable.NestedParentsCount > 1) { xmlElement7 = dc.CreateElement("xs", "element", "http://www.w3.org/2001/XMLSchema"); xmlElement7.SetAttribute("ref", childTable.EncodedTableName); } else { xmlElement7 = HandleTable(childTable, dc, schema); } if (childTable.Namespace == table.Namespace) { xmlElement7.SetAttribute("minOccurs", "0"); xmlElement7.SetAttribute("maxOccurs", "unbounded"); } if (childTable.Namespace == table.Namespace || childTable.Namespace.Length == 0 || _schFormat == SchemaFormat.Remoting) { xmlElement4.AppendChild(xmlElement7); } else { if (childTable.NestedParentsCount <= 1) { GetSchema(childTable.Namespace).AppendChild(xmlElement7); } xmlElement7 = dc.CreateElement("xs", "element", "http://www.w3.org/2001/XMLSchema"); xmlElement7.SetAttribute("ref", (string)_prefixes[childTable.Namespace] + ":" + childTable.EncodedTableName); xmlElement4.AppendChild(xmlElement7); } if (childRelations2[m].ChildKeyConstraint == null) { XmlElement xmlElement8 = _dc.CreateElement("xs", "annotation", "http://www.w3.org/2001/XMLSchema"); xmlElement7.PrependChild(xmlElement8); XmlElement xmlElement9 = _dc.CreateElement("xs", "appinfo", "http://www.w3.org/2001/XMLSchema"); xmlElement8.AppendChild(xmlElement9); xmlElement9.AppendChild(HandleRelation(childRelations2[m], dc)); } } } if (xmlElement4 != null && !xmlElement4.HasChildNodes) { xmlElement2.RemoveChild(xmlElement4); } ConstraintCollection constraints = table.Constraints; string text3 = ((_ds == null) ? string.Empty : ((_ds.Namespace.Length != 0) ? "mstns:" : string.Empty)); if (_schFormat != SchemaFormat.Remoting) { GetSchema(table.Namespace); text3 = ((table.Namespace.Length != 0) ? ((string)_prefixes[table.Namespace] + ":") : string.Empty); } for (int n = 0; n < constraints.Count; n++) { XmlElement xmlElement10 = null; if (constraints[n] is UniqueConstraint) { UniqueConstraint uniqueConstraint = (UniqueConstraint)constraints[n]; if (IsAutoGenerated(uniqueConstraint)) { continue; } DataColumn[] columnsReference = uniqueConstraint.Key.ColumnsReference; xmlElement10 = dc.CreateElement("xs", "unique", "http://www.w3.org/2001/XMLSchema"); if (_ds == null || _ds.Tables.InternalIndexOf(table.TableName) == -3) { xmlElement10.SetAttribute("TableNamespace", "urn:schemas-microsoft-com:xml-msdata", table.Namespace); } xmlElement10.SetAttribute("name", XmlConvert.EncodeLocalName(uniqueConstraint.SchemaName)); if (uniqueConstraint.ConstraintName != uniqueConstraint.SchemaName) { xmlElement10.SetAttribute("ConstraintName", "urn:schemas-microsoft-com:xml-msdata", uniqueConstraint.ConstraintName); } AddExtendedProperties(uniqueConstraint._extendedProperties, xmlElement10); XmlElement xmlElement11 = dc.CreateElement("xs", "selector", "http://www.w3.org/2001/XMLSchema"); xmlElement11.SetAttribute("xpath", ".//" + text3 + table.EncodedTableName); xmlElement10.AppendChild(xmlElement11); if (uniqueConstraint.IsPrimaryKey) { xmlElement10.SetAttribute("PrimaryKey", "urn:schemas-microsoft-com:xml-msdata", "true"); } if (columnsReference.Length != 0) { StringBuilder stringBuilder = new StringBuilder(); for (int num4 = 0; num4 < columnsReference.Length; num4++) { stringBuilder.Length = 0; if (_schFormat != SchemaFormat.Remoting) { GetSchema(columnsReference[num4].Namespace); if (!string.IsNullOrEmpty(columnsReference[num4].Namespace)) { stringBuilder.Append(_prefixes[columnsReference[num4].Namespace]).Append(':'); } stringBuilder.Append(columnsReference[num4].EncodedColumnName); } else { stringBuilder.Append(text3).Append(columnsReference[num4].EncodedColumnName); } if (columnsReference[num4].ColumnMapping == MappingType.Attribute || columnsReference[num4].ColumnMapping == MappingType.Hidden) { stringBuilder.Insert(0, '@'); } XmlElement xmlElement12 = dc.CreateElement("xs", "field", "http://www.w3.org/2001/XMLSchema"); xmlElement12.SetAttribute("xpath", stringBuilder.ToString()); xmlElement10.AppendChild(xmlElement12); } } _dsElement.InsertBefore(xmlElement10, _constraintSeparator); } else { if (!(constraints[n] is ForeignKeyConstraint && genNested)) { continue; } ForeignKeyConstraint foreignKeyConstraint = (ForeignKeyConstraint)constraints[n]; if ((_tables.Count > 0 && (!_tables.Contains(foreignKeyConstraint.RelatedTable) || !_tables.Contains(foreignKeyConstraint.Table))) || IsAutoGenerated(foreignKeyConstraint)) { continue; } DataRelation dataRelation = foreignKeyConstraint.FindParentRelation(); DataColumn[] columnsReference = foreignKeyConstraint.RelatedColumnsReference; UniqueConstraint uniqueConstraint2 = (UniqueConstraint)foreignKeyConstraint.RelatedTable.Constraints.FindConstraint(new UniqueConstraint("TEMP", columnsReference)); XmlElement xmlElement11; if (uniqueConstraint2 == null) { xmlElement10 = dc.CreateElement("xs", "key", "http://www.w3.org/2001/XMLSchema"); xmlElement10.SetAttribute("name", XmlConvert.EncodeLocalName(foreignKeyConstraint.SchemaName)); if (_ds == null || _ds.Tables.InternalIndexOf(table.TableName) == -3) { xmlElement10.SetAttribute("TableNamespace", "urn:schemas-microsoft-com:xml-msdata", table.Namespace); } xmlElement11 = dc.CreateElement("xs", "selector", "http://www.w3.org/2001/XMLSchema"); xmlElement11.SetAttribute("xpath", ".//" + text3 + foreignKeyConstraint.RelatedTable.EncodedTableName); xmlElement10.AppendChild(xmlElement11); if (columnsReference.Length != 0) { StringBuilder stringBuilder2 = new StringBuilder(); for (int num5 = 0; num5 < columnsReference.Length; num5++) { stringBuilder2.Length = 0; if (_schFormat != SchemaFormat.Remoting) { GetSchema(columnsReference[num5].Namespace); if (!string.IsNullOrEmpty(columnsReference[num5].Namespace)) { stringBuilder2.Append(_prefixes[columnsReference[num5].Namespace]).Append(':'); } stringBuilder2.Append(columnsReference[num5].EncodedColumnName); } else { stringBuilder2.Append(text3).Append(columnsReference[num5].EncodedColumnName); } if (columnsReference[num5].ColumnMapping == MappingType.Attribute || columnsReference[num5].ColumnMapping == MappingType.Hidden) { stringBuilder2.Insert(0, '@'); } XmlElement xmlElement12 = dc.CreateElement("xs", "field", "http://www.w3.org/2001/XMLSchema"); xmlElement12.SetAttribute("xpath", stringBuilder2.ToString()); xmlElement10.AppendChild(xmlElement12); } } _dsElement.InsertBefore(xmlElement10, _constraintSeparator); } xmlElement10 = dc.CreateElement("xs", "keyref", "http://www.w3.org/2001/XMLSchema"); xmlElement10.SetAttribute("name", XmlConvert.EncodeLocalName(foreignKeyConstraint.SchemaName)); if (_ds == null || _ds.Tables.InternalIndexOf(foreignKeyConstraint.RelatedTable.TableName) == -3) { xmlElement10.SetAttribute("TableNamespace", "urn:schemas-microsoft-com:xml-msdata", foreignKeyConstraint.Table.Namespace); } if (uniqueConstraint2 == null) { xmlElement10.SetAttribute("refer", XmlConvert.EncodeLocalName(foreignKeyConstraint.SchemaName)); } else { xmlElement10.SetAttribute("refer", XmlConvert.EncodeLocalName(uniqueConstraint2.SchemaName)); } AddExtendedProperties(foreignKeyConstraint._extendedProperties, xmlElement10, typeof(ForeignKeyConstraint)); if (foreignKeyConstraint.ConstraintName != foreignKeyConstraint.SchemaName) { xmlElement10.SetAttribute("ConstraintName", "urn:schemas-microsoft-com:xml-msdata", foreignKeyConstraint.ConstraintName); } if (dataRelation == null) { xmlElement10.SetAttribute("ConstraintOnly", "urn:schemas-microsoft-com:xml-msdata", "true"); } else { if (dataRelation.Nested) { xmlElement10.SetAttribute("IsNested", "urn:schemas-microsoft-com:xml-msdata", "true"); } AddExtendedProperties(dataRelation._extendedProperties, xmlElement10, typeof(DataRelation)); if (foreignKeyConstraint.ConstraintName != dataRelation.RelationName) { xmlElement10.SetAttribute("RelationName", "urn:schemas-microsoft-com:xml-msdata", XmlConvert.EncodeLocalName(dataRelation.RelationName)); } } xmlElement11 = dc.CreateElement("xs", "selector", "http://www.w3.org/2001/XMLSchema"); xmlElement11.SetAttribute("xpath", ".//" + text3 + table.EncodedTableName); xmlElement10.AppendChild(xmlElement11); if (foreignKeyConstraint.AcceptRejectRule != 0) { xmlElement10.SetAttribute("AcceptRejectRule", "urn:schemas-microsoft-com:xml-msdata", TranslateAcceptRejectRule(foreignKeyConstraint.AcceptRejectRule)); } if (foreignKeyConstraint.UpdateRule != Rule.Cascade) { xmlElement10.SetAttribute("UpdateRule", "urn:schemas-microsoft-com:xml-msdata", TranslateRule(foreignKeyConstraint.UpdateRule)); } if (foreignKeyConstraint.DeleteRule != Rule.Cascade) { xmlElement10.SetAttribute("DeleteRule", "urn:schemas-microsoft-com:xml-msdata", TranslateRule(foreignKeyConstraint.DeleteRule)); } columnsReference = foreignKeyConstraint.Columns; if (columnsReference.Length != 0) { StringBuilder stringBuilder3 = new StringBuilder(); for (int num6 = 0; num6 < columnsReference.Length; num6++) { stringBuilder3.Length = 0; if (_schFormat != SchemaFormat.Remoting) { GetSchema(columnsReference[num6].Namespace); if (!string.IsNullOrEmpty(columnsReference[num6].Namespace)) { stringBuilder3.Append(_prefixes[columnsReference[num6].Namespace]).Append(':'); } stringBuilder3.Append(columnsReference[num6].EncodedColumnName); } else { stringBuilder3.Append(text3).Append(columnsReference[num6].EncodedColumnName); } if (columnsReference[num6].ColumnMapping == MappingType.Attribute || columnsReference[num6].ColumnMapping == MappingType.Hidden) { stringBuilder3.Insert(0, '@'); } XmlElement xmlElement12 = dc.CreateElement("xs", "field", "http://www.w3.org/2001/XMLSchema"); xmlElement12.SetAttribute("xpath", stringBuilder3.ToString()); xmlElement10.AppendChild(xmlElement12); } } _dsElement.InsertAfter(xmlElement10, _constraintSeparator); } } AddExtendedProperties(table._extendedProperties, xmlElement); return xmlElement; } private void SetMSDataAttribute(XmlElement root, Type type) { string value = DataStorage.GetQualifiedName(type); try { if (_targetConverter != null) { value = _targetConverter(type); } if (!string.IsNullOrEmpty(value)) { root.SetAttribute("DataType", "urn:schemas-microsoft-com:xml-msdata", value); } } catch (Exception ex) when (ADP.IsCatchableExceptionType(ex)) { ExceptionBuilder.ThrowMultipleTargetConverter(ex); } if (string.IsNullOrEmpty(value)) { ExceptionBuilder.ThrowMultipleTargetConverter(null); } } } internal sealed class NewDiffgramGen { internal XmlDocument _doc; internal DataSet _ds; internal DataTable _dt; internal XmlWriter _xmlw; private bool _fBefore; private bool _fErrors; internal Hashtable _rowsOrder; private ArrayList _tables = new ArrayList(); private bool _writeHierarchy; internal NewDiffgramGen(DataSet ds) { _ds = ds; _dt = null; _doc = new XmlDocument(); for (int i = 0; i < ds.Tables.Count; i++) { _tables.Add(ds.Tables[i]); } DoAssignments(_tables); } internal NewDiffgramGen(DataTable dt, bool writeHierarchy) { _ds = null; _dt = dt; _doc = new XmlDocument(); _tables.Add(dt); if (writeHierarchy) { _writeHierarchy = true; CreateTableHierarchy(dt); } DoAssignments(_tables); } private void CreateTableHierarchy(DataTable dt) { foreach (DataRelation childRelation in dt.ChildRelations) { if (!_tables.Contains(childRelation.ChildTable)) { _tables.Add(childRelation.ChildTable); CreateTableHierarchy(childRelation.ChildTable); } } } private void DoAssignments(ArrayList tables) { int num = 0; for (int i = 0; i < tables.Count; i++) { num += ((DataTable)tables[i]).Rows.Count; } _rowsOrder = new Hashtable(num); for (int j = 0; j < tables.Count; j++) { DataRowCollection rows = ((DataTable)tables[j]).Rows; num = rows.Count; for (int k = 0; k < num; k++) { _rowsOrder[rows[k]] = k; } } } private bool EmptyData() { for (int i = 0; i < _tables.Count; i++) { if (((DataTable)_tables[i]).Rows.Count > 0) { return false; } } return true; } internal void Save(XmlWriter xmlw) { Save(xmlw, null); } internal void Save(XmlWriter xmlw, DataTable table) { _xmlw = DataTextWriter.CreateWriter(xmlw); _xmlw.WriteStartElement("diffgr", "diffgram", "urn:schemas-microsoft-com:xml-diffgram-v1"); _xmlw.WriteAttributeString("xmlns", "msdata", null, "urn:schemas-microsoft-com:xml-msdata"); if (!EmptyData()) { if (table != null) { new XmlDataTreeWriter(table, _writeHierarchy).SaveDiffgramData(_xmlw, _rowsOrder); } else { new XmlDataTreeWriter(_ds).SaveDiffgramData(_xmlw, _rowsOrder); } if (table == null) { for (int i = 0; i < _ds.Tables.Count; i++) { GenerateTable(_ds.Tables[i]); } } else { for (int j = 0; j < _tables.Count; j++) { GenerateTable((DataTable)_tables[j]); } } if (_fBefore) { _xmlw.WriteEndElement(); } if (table == null) { for (int k = 0; k < _ds.Tables.Count; k++) { GenerateTableErrors(_ds.Tables[k]); } } else { for (int l = 0; l < _tables.Count; l++) { GenerateTableErrors((DataTable)_tables[l]); } } if (_fErrors) { _xmlw.WriteEndElement(); } } _xmlw.WriteEndElement(); _xmlw.Flush(); } private void GenerateTable(DataTable table) { int count = table.Rows.Count; if (count > 0) { for (int i = 0; i < count; i++) { GenerateRow(table.Rows[i]); } } } private void GenerateTableErrors(DataTable table) { int count = table.Rows.Count; int count2 = table.Columns.Count; if (count <= 0) { return; } for (int i = 0; i < count; i++) { bool flag = false; DataRow dataRow = table.Rows[i]; string prefix = ((table.Namespace.Length != 0) ? table.Prefix : string.Empty); if (dataRow.HasErrors && dataRow.RowError.Length > 0) { if (!_fErrors) { _xmlw.WriteStartElement("diffgr", "errors", "urn:schemas-microsoft-com:xml-diffgram-v1"); _fErrors = true; } _xmlw.WriteStartElement(prefix, dataRow.Table.EncodedTableName, dataRow.Table.Namespace); _xmlw.WriteAttributeString("diffgr", "id", "urn:schemas-microsoft-com:xml-diffgram-v1", dataRow.Table.TableName + dataRow.rowID.ToString(CultureInfo.InvariantCulture)); _xmlw.WriteAttributeString("diffgr", "Error", "urn:schemas-microsoft-com:xml-diffgram-v1", dataRow.RowError); flag = true; } if (count2 <= 0) { continue; } for (int j = 0; j < count2; j++) { DataColumn dataColumn = table.Columns[j]; string columnError = dataRow.GetColumnError(dataColumn); string prefix2 = ((dataColumn.Namespace.Length != 0) ? dataColumn.Prefix : string.Empty); if (columnError == null || columnError.Length == 0) { continue; } if (!flag) { if (!_fErrors) { _xmlw.WriteStartElement("diffgr", "errors", "urn:schemas-microsoft-com:xml-diffgram-v1"); _fErrors = true; } _xmlw.WriteStartElement(prefix, dataRow.Table.EncodedTableName, dataRow.Table.Namespace); _xmlw.WriteAttributeString("diffgr", "id", "urn:schemas-microsoft-com:xml-diffgram-v1", dataRow.Table.TableName + dataRow.rowID.ToString(CultureInfo.InvariantCulture)); flag = true; } _xmlw.WriteStartElement(prefix2, dataColumn.EncodedColumnName, dataColumn.Namespace); _xmlw.WriteAttributeString("diffgr", "Error", "urn:schemas-microsoft-com:xml-diffgram-v1", columnError); _xmlw.WriteEndElement(); } if (flag) { _xmlw.WriteEndElement(); } } } private void GenerateRow(DataRow row) { DataRowState rowState = row.RowState; if (rowState == DataRowState.Unchanged || rowState == DataRowState.Added) { return; } if (!_fBefore) { _xmlw.WriteStartElement("diffgr", "before", "urn:schemas-microsoft-com:xml-diffgram-v1"); _fBefore = true; } DataTable table = row.Table; int count = table.Columns.Count; string value = table.TableName + row.rowID.ToString(CultureInfo.InvariantCulture); string text = null; if (rowState == DataRowState.Deleted && row.Table.NestedParentRelations.Length != 0) { DataRow nestedParentRow = row.GetNestedParentRow(DataRowVersion.Original); if (nestedParentRow != null) { text = nestedParentRow.Table.TableName + nestedParentRow.rowID.ToString(CultureInfo.InvariantCulture); } } string prefix = ((table.Namespace.Length != 0) ? table.Prefix : string.Empty); if (table.XmlText != null) { _ = row[table.XmlText, DataRowVersion.Original]; } else { _ = DBNull.Value; } _xmlw.WriteStartElement(prefix, row.Table.EncodedTableName, row.Table.Namespace); _xmlw.WriteAttributeString("diffgr", "id", "urn:schemas-microsoft-com:xml-diffgram-v1", value); if (rowState == DataRowState.Deleted && XmlDataTreeWriter.RowHasErrors(row)) { _xmlw.WriteAttributeString("diffgr", "hasErrors", "urn:schemas-microsoft-com:xml-diffgram-v1", "true"); } if (text != null) { _xmlw.WriteAttributeString("diffgr", "parentId", "urn:schemas-microsoft-com:xml-diffgram-v1", text); } _xmlw.WriteAttributeString("msdata", "rowOrder", "urn:schemas-microsoft-com:xml-msdata", _rowsOrder[row].ToString()); for (int i = 0; i < count; i++) { if (row.Table.Columns[i].ColumnMapping == MappingType.Attribute || row.Table.Columns[i].ColumnMapping == MappingType.Hidden) { GenerateColumn(row, row.Table.Columns[i], DataRowVersion.Original); } } for (int j = 0; j < count; j++) { if (row.Table.Columns[j].ColumnMapping == MappingType.Element || row.Table.Columns[j].ColumnMapping == MappingType.SimpleContent) { GenerateColumn(row, row.Table.Columns[j], DataRowVersion.Original); } } _xmlw.WriteEndElement(); } private void GenerateColumn(DataRow row, DataColumn col, DataRowVersion version) { string text = null; text = col.GetColumnValueAsString(row, version); if (text == null) { if (col.ColumnMapping == MappingType.SimpleContent) { _xmlw.WriteAttributeString("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance", "true"); } return; } string prefix = ((col.Namespace.Length != 0) ? col.Prefix : string.Empty); switch (col.ColumnMapping) { case MappingType.Attribute: _xmlw.WriteAttributeString(prefix, col.EncodedColumnName, col.Namespace, text); break; case MappingType.Hidden: _xmlw.WriteAttributeString("msdata", "hidden" + col.EncodedColumnName, "urn:schemas-microsoft-com:xml-msdata", text); break; case MappingType.SimpleContent: _xmlw.WriteString(text); break; case MappingType.Element: { bool flag = true; object obj = row[col, version]; if (!col.IsCustomType || !col.IsValueCustomTypeInstance(obj) || typeof(IXmlSerializable).IsAssignableFrom(obj.GetType())) { _xmlw.WriteStartElement(prefix, col.EncodedColumnName, col.Namespace); flag = false; } Type type = obj.GetType(); if (!col.IsCustomType) { if ((type == typeof(char) || type == typeof(string)) && XmlDataTreeWriter.PreserveSpace(text)) { _xmlw.WriteAttributeString("xml", "space", "http://www.w3.org/XML/1998/namespace", "preserve"); } _xmlw.WriteString(text); } else if (obj != DBNull.Value && (!col.ImplementsINullable || !DataStorage.IsObjectSqlNull(obj))) { if (col.IsValueCustomTypeInstance(obj)) { if (!flag && obj.GetType() != col.DataType) { _xmlw.WriteAttributeString("msdata", "InstanceType", "urn:schemas-microsoft-com:xml-msdata", DataStorage.GetQualifiedName(type)); } if (!flag) { col.ConvertObjectToXml(obj, _xmlw, null); } else { if (obj.GetType() != col.DataType) { throw ExceptionBuilder.PolymorphismNotSupported(type.AssemblyQualifiedName); } XmlRootAttribute xmlRootAttribute = new XmlRootAttribute(col.EncodedColumnName); xmlRootAttribute.Namespace = col.Namespace; col.ConvertObjectToXml(obj, _xmlw, xmlRootAttribute); } } else { if (type == typeof(Type) || type == typeof(Guid) || type == typeof(char) || DataStorage.IsSqlType(type)) { _xmlw.WriteAttributeString("msdata", "InstanceType", "urn:schemas-microsoft-com:xml-msdata", type.FullName); } else if (obj is Type) { _xmlw.WriteAttributeString("msdata", "InstanceType", "urn:schemas-microsoft-com:xml-msdata", "Type"); } else { string value = "xs:" + XmlTreeGen.XmlDataTypeName(type); _xmlw.WriteAttributeString("xsi", "type", "http://www.w3.org/2001/XMLSchema-instance", value); _xmlw.WriteAttributeString("xmlns:xs", "http://www.w3.org/2001/XMLSchema"); } if (!DataStorage.IsSqlType(type)) { _xmlw.WriteString(col.ConvertObjectToXml(obj)); } else { col.ConvertObjectToXml(obj, _xmlw, null); } } } if (!flag) { _xmlw.WriteEndElement(); } break; } } } internal static string QualifiedName(string prefix, string name) { if (prefix != null) { return prefix + ":" + name; } return name; } } internal sealed class XmlDataTreeWriter { private XmlWriter _xmlw; private DataSet _ds; private DataTable _dt; private ArrayList _dTables = new ArrayList(); private DataTable[] _topLevelTables; private bool _fFromTable; private bool _isDiffgram; private Hashtable _rowsOrder; private bool _writeHierarchy; internal XmlDataTreeWriter(DataSet ds) { _ds = ds; _topLevelTables = ds.TopLevelTables(); foreach (DataTable table in ds.Tables) { _dTables.Add(table); } } internal XmlDataTreeWriter(DataTable dt, bool writeHierarchy) { _dt = dt; _fFromTable = true; if (dt.DataSet == null) { _dTables.Add(dt); _topLevelTables = new DataTable[1] { dt }; return; } _ds = dt.DataSet; _dTables.Add(dt); if (writeHierarchy) { _writeHierarchy = true; CreateTablesHierarchy(dt); _topLevelTables = CreateToplevelTables(); } else { _topLevelTables = new DataTable[1] { dt }; } } private DataTable[] CreateToplevelTables() { ArrayList arrayList = new ArrayList(); for (int i = 0; i < _dTables.Count; i++) { DataTable dataTable = (DataTable)_dTables[i]; if (dataTable.ParentRelations.Count == 0) { arrayList.Add(dataTable); continue; } bool flag = false; for (int j = 0; j < dataTable.ParentRelations.Count; j++) { if (dataTable.ParentRelations[j].Nested) { if (dataTable.ParentRelations[j].ParentTable == dataTable) { flag = false; break; } flag = true; } } if (!flag) { arrayList.Add(dataTable); } } if (arrayList.Count == 0) { return Array.Empty(); } DataTable[] array = new DataTable[arrayList.Count]; arrayList.CopyTo(array, 0); return array; } private void CreateTablesHierarchy(DataTable dt) { foreach (DataRelation childRelation in dt.ChildRelations) { if (!_dTables.Contains(childRelation.ChildTable)) { _dTables.Add(childRelation.ChildTable); CreateTablesHierarchy(childRelation.ChildTable); } } } internal static bool RowHasErrors(DataRow row) { int count = row.Table.Columns.Count; if (row.HasErrors && row.RowError.Length > 0) { return true; } for (int i = 0; i < count; i++) { DataColumn column = row.Table.Columns[i]; string columnError = row.GetColumnError(column); if (columnError != null && columnError.Length != 0) { return true; } } return false; } internal void SaveDiffgramData(XmlWriter xw, Hashtable rowsOrder) { _xmlw = DataTextWriter.CreateWriter(xw); _isDiffgram = true; _rowsOrder = rowsOrder; _ = _topLevelTables.Length; string prefix = ((_ds == null) ? ((_dt.Namespace.Length == 0) ? "" : _dt.Prefix) : ((_ds.Namespace.Length == 0) ? "" : _ds.Prefix)); if (_ds == null || _ds.DataSetName == null || _ds.DataSetName.Length == 0) { _xmlw.WriteStartElement(prefix, "DocumentElement", (_dt.Namespace == null) ? "" : _dt.Namespace); } else { _xmlw.WriteStartElement(prefix, XmlConvert.EncodeLocalName(_ds.DataSetName), _ds.Namespace); } for (int i = 0; i < _dTables.Count; i++) { DataTable dataTable = (DataTable)_dTables[i]; foreach (DataRow row in dataTable.Rows) { if (row.RowState != DataRowState.Deleted) { int nestedParentCount = row.GetNestedParentCount(); if (nestedParentCount == 0) { DataTable dataTable2 = (DataTable)_dTables[i]; XmlDataRowWriter(row, dataTable2.EncodedTableName); } else if (nestedParentCount > 1) { throw ExceptionBuilder.MultipleParentRows((dataTable.Namespace.Length == 0) ? dataTable.TableName : (dataTable.Namespace + dataTable.TableName)); } } } } _xmlw.WriteEndElement(); _xmlw.Flush(); } internal void Save(XmlWriter xw, bool writeSchema) { _xmlw = DataTextWriter.CreateWriter(xw); int num = _topLevelTables.Length; bool flag = true; string prefix = ((_ds == null) ? ((_dt.Namespace.Length == 0) ? "" : _dt.Prefix) : ((_ds.Namespace.Length == 0) ? "" : _ds.Prefix)); if (!writeSchema && _ds != null && _ds._fTopLevelTable && num == 1 && _ds.TopLevelTables()[0].Rows.Count == 1) { flag = false; } if (flag) { if (_ds == null) { _xmlw.WriteStartElement(prefix, "DocumentElement", _dt.Namespace); } else if (_ds.DataSetName == null || _ds.DataSetName.Length == 0) { _xmlw.WriteStartElement(prefix, "DocumentElement", _ds.Namespace); } else { _xmlw.WriteStartElement(prefix, XmlConvert.EncodeLocalName(_ds.DataSetName), _ds.Namespace); } for (int i = 0; i < _dTables.Count; i++) { if (((DataTable)_dTables[i])._xmlText != null) { _xmlw.WriteAttributeString("xmlns", "xsi", "http://www.w3.org/2000/xmlns/", "http://www.w3.org/2001/XMLSchema-instance"); break; } } if (writeSchema) { if (!_fFromTable) { new XmlTreeGen(SchemaFormat.Public).Save(_ds, _xmlw); } else { new XmlTreeGen(SchemaFormat.Public).Save(null, _dt, _xmlw, _writeHierarchy); } } } for (int j = 0; j < _dTables.Count; j++) { foreach (DataRow row in ((DataTable)_dTables[j]).Rows) { if (row.RowState != DataRowState.Deleted) { int nestedParentCount = row.GetNestedParentCount(); if (nestedParentCount == 0) { XmlDataRowWriter(row, ((DataTable)_dTables[j]).EncodedTableName); } else if (nestedParentCount > 1) { DataTable dataTable = (DataTable)_dTables[j]; throw ExceptionBuilder.MultipleParentRows((dataTable.Namespace.Length == 0) ? dataTable.TableName : (dataTable.Namespace + dataTable.TableName)); } } } } if (flag) { _xmlw.WriteEndElement(); } _xmlw.Flush(); } private ArrayList GetNestedChildRelations(DataRow row) { ArrayList arrayList = new ArrayList(); foreach (DataRelation childRelation in row.Table.ChildRelations) { if (childRelation.Nested) { arrayList.Add(childRelation); } } return arrayList; } internal void XmlDataRowWriter(DataRow row, string encodedTableName) { string prefix = ((row.Table.Namespace.Length == 0) ? "" : row.Table.Prefix); _xmlw.WriteStartElement(prefix, encodedTableName, row.Table.Namespace); if (_isDiffgram) { _xmlw.WriteAttributeString("diffgr", "id", "urn:schemas-microsoft-com:xml-diffgram-v1", row.Table.TableName + row.rowID.ToString(CultureInfo.InvariantCulture)); _xmlw.WriteAttributeString("msdata", "rowOrder", "urn:schemas-microsoft-com:xml-msdata", _rowsOrder[row].ToString()); if (row.RowState == DataRowState.Added) { _xmlw.WriteAttributeString("diffgr", "hasChanges", "urn:schemas-microsoft-com:xml-diffgram-v1", "inserted"); } if (row.RowState == DataRowState.Modified) { _xmlw.WriteAttributeString("diffgr", "hasChanges", "urn:schemas-microsoft-com:xml-diffgram-v1", "modified"); } if (RowHasErrors(row)) { _xmlw.WriteAttributeString("diffgr", "hasErrors", "urn:schemas-microsoft-com:xml-diffgram-v1", "true"); } } foreach (DataColumn column in row.Table.Columns) { if (column._columnMapping == MappingType.Attribute) { object obj = row[column]; string prefix2 = ((column.Namespace.Length == 0) ? "" : column.Prefix); if (obj != DBNull.Value && (!column.ImplementsINullable || !DataStorage.IsObjectSqlNull(obj))) { XmlTreeGen.ValidateColumnMapping(column.DataType); _xmlw.WriteAttributeString(prefix2, column.EncodedColumnName, column.Namespace, column.ConvertObjectToXml(obj)); } } if (_isDiffgram && column._columnMapping == MappingType.Hidden) { object obj = row[column]; if (obj != DBNull.Value && (!column.ImplementsINullable || !DataStorage.IsObjectSqlNull(obj))) { XmlTreeGen.ValidateColumnMapping(column.DataType); _xmlw.WriteAttributeString("msdata", "hidden" + column.EncodedColumnName, "urn:schemas-microsoft-com:xml-msdata", column.ConvertObjectToXml(obj)); } } } foreach (DataColumn column2 in row.Table.Columns) { if (column2._columnMapping == MappingType.Hidden) { continue; } object obj = row[column2]; string prefix3 = ((column2.Namespace.Length == 0) ? "" : column2.Prefix); bool flag = true; if ((obj == DBNull.Value || (column2.ImplementsINullable && DataStorage.IsObjectSqlNull(obj))) && column2.ColumnMapping == MappingType.SimpleContent) { _xmlw.WriteAttributeString("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance", "true"); } if (obj == DBNull.Value || (column2.ImplementsINullable && DataStorage.IsObjectSqlNull(obj)) || column2._columnMapping == MappingType.Attribute) { continue; } if (column2._columnMapping != MappingType.SimpleContent && (!column2.IsCustomType || !column2.IsValueCustomTypeInstance(obj) || typeof(IXmlSerializable).IsAssignableFrom(obj.GetType()))) { _xmlw.WriteStartElement(prefix3, column2.EncodedColumnName, column2.Namespace); flag = false; } Type type = obj.GetType(); if (!column2.IsCustomType) { if ((type == typeof(char) || type == typeof(string)) && PreserveSpace(obj)) { _xmlw.WriteAttributeString("xml", "space", "http://www.w3.org/XML/1998/namespace", "preserve"); } _xmlw.WriteString(column2.ConvertObjectToXml(obj)); } else if (column2.IsValueCustomTypeInstance(obj)) { if (!flag && type != column2.DataType) { _xmlw.WriteAttributeString("msdata", "InstanceType", "urn:schemas-microsoft-com:xml-msdata", DataStorage.GetQualifiedName(type)); } if (!flag) { column2.ConvertObjectToXml(obj, _xmlw, null); } else { if (obj.GetType() != column2.DataType) { throw ExceptionBuilder.PolymorphismNotSupported(type.AssemblyQualifiedName); } XmlRootAttribute xmlRootAttribute = new XmlRootAttribute(column2.EncodedColumnName); xmlRootAttribute.Namespace = column2.Namespace; column2.ConvertObjectToXml(obj, _xmlw, xmlRootAttribute); } } else { if (type == typeof(Type) || type == typeof(Guid) || type == typeof(char) || DataStorage.IsSqlType(type)) { _xmlw.WriteAttributeString("msdata", "InstanceType", "urn:schemas-microsoft-com:xml-msdata", type.FullName); } else if (obj is Type) { _xmlw.WriteAttributeString("msdata", "InstanceType", "urn:schemas-microsoft-com:xml-msdata", "Type"); } else { string value = "xs:" + XmlTreeGen.XmlDataTypeName(type); _xmlw.WriteAttributeString("xsi", "type", "http://www.w3.org/2001/XMLSchema-instance", value); _xmlw.WriteAttributeString("xmlns:xs", "http://www.w3.org/2001/XMLSchema"); } if (!DataStorage.IsSqlType(type)) { _xmlw.WriteString(column2.ConvertObjectToXml(obj)); } else { column2.ConvertObjectToXml(obj, _xmlw, null); } } if (column2._columnMapping != MappingType.SimpleContent && !flag) { _xmlw.WriteEndElement(); } } if (_ds != null) { foreach (DataRelation nestedChildRelation in GetNestedChildRelations(row)) { DataRow[] childRows = row.GetChildRows(nestedChildRelation); foreach (DataRow row2 in childRows) { XmlDataRowWriter(row2, nestedChildRelation.ChildTable.EncodedTableName); } } } _xmlw.WriteEndElement(); } internal static bool PreserveSpace(object value) { string text = value.ToString(); if (text.Length == 0) { return false; } for (int i = 0; i < text.Length; i++) { if (!char.IsWhiteSpace(text, i)) { return false; } } return true; } } internal sealed class DataTextWriter : XmlWriter { private XmlWriter _xmltextWriter; internal Stream BaseStream { get { if (_xmltextWriter is XmlTextWriter xmlTextWriter) { return xmlTextWriter.BaseStream; } return null; } } public override WriteState WriteState => _xmltextWriter.WriteState; public override XmlSpace XmlSpace => _xmltextWriter.XmlSpace; public override string XmlLang => _xmltextWriter.XmlLang; internal static XmlWriter CreateWriter(XmlWriter xw) { return new DataTextWriter(xw); } private DataTextWriter(XmlWriter w) { _xmltextWriter = w; } public override void WriteStartDocument() { _xmltextWriter.WriteStartDocument(); } public override void WriteStartDocument(bool standalone) { _xmltextWriter.WriteStartDocument(standalone); } public override void WriteEndDocument() { _xmltextWriter.WriteEndDocument(); } public override void WriteDocType(string name, string pubid, string sysid, string subset) { _xmltextWriter.WriteDocType(name, pubid, sysid, subset); } public override void WriteStartElement(string prefix, string localName, string ns) { _xmltextWriter.WriteStartElement(prefix, localName, ns); } public override void WriteEndElement() { _xmltextWriter.WriteEndElement(); } public override void WriteFullEndElement() { _xmltextWriter.WriteFullEndElement(); } public override void WriteStartAttribute(string prefix, string localName, string ns) { _xmltextWriter.WriteStartAttribute(prefix, localName, ns); } public override void WriteEndAttribute() { _xmltextWriter.WriteEndAttribute(); } public override void WriteCData(string text) { _xmltextWriter.WriteCData(text); } public override void WriteComment(string text) { _xmltextWriter.WriteComment(text); } public override void WriteProcessingInstruction(string name, string text) { _xmltextWriter.WriteProcessingInstruction(name, text); } public override void WriteEntityRef(string name) { _xmltextWriter.WriteEntityRef(name); } public override void WriteCharEntity(char ch) { _xmltextWriter.WriteCharEntity(ch); } public override void WriteWhitespace(string ws) { _xmltextWriter.WriteWhitespace(ws); } public override void WriteString(string text) { _xmltextWriter.WriteString(text); } public override void WriteSurrogateCharEntity(char lowChar, char highChar) { _xmltextWriter.WriteSurrogateCharEntity(lowChar, highChar); } public override void WriteChars(char[] buffer, int index, int count) { _xmltextWriter.WriteChars(buffer, index, count); } public override void WriteRaw(char[] buffer, int index, int count) { _xmltextWriter.WriteRaw(buffer, index, count); } public override void WriteRaw(string data) { _xmltextWriter.WriteRaw(data); } public override void WriteBase64(byte[] buffer, int index, int count) { _xmltextWriter.WriteBase64(buffer, index, count); } public override void WriteBinHex(byte[] buffer, int index, int count) { _xmltextWriter.WriteBinHex(buffer, index, count); } public override void Close() { _xmltextWriter.Close(); } public override void Flush() { _xmltextWriter.Flush(); } public override void WriteName(string name) { _xmltextWriter.WriteName(name); } public override void WriteQualifiedName(string localName, string ns) { _xmltextWriter.WriteQualifiedName(localName, ns); } public override string LookupPrefix(string ns) { return _xmltextWriter.LookupPrefix(ns); } public override void WriteNmToken(string name) { _xmltextWriter.WriteNmToken(name); } } internal sealed class DataTextReader : XmlReader { private XmlReader _xmlreader; public override XmlReaderSettings Settings => _xmlreader.Settings; public override XmlNodeType NodeType => _xmlreader.NodeType; public override string Name => _xmlreader.Name; public override string LocalName => _xmlreader.LocalName; public override string NamespaceURI => _xmlreader.NamespaceURI; public override string Prefix => _xmlreader.Prefix; public override bool HasValue => _xmlreader.HasValue; public override string Value => _xmlreader.Value; public override int Depth => _xmlreader.Depth; public override string BaseURI => _xmlreader.BaseURI; public override bool IsEmptyElement => _xmlreader.IsEmptyElement; public override bool IsDefault => _xmlreader.IsDefault; public override char QuoteChar => _xmlreader.QuoteChar; public override XmlSpace XmlSpace => _xmlreader.XmlSpace; public override string XmlLang => _xmlreader.XmlLang; public override int AttributeCount => _xmlreader.AttributeCount; public override bool EOF => _xmlreader.EOF; public override ReadState ReadState => _xmlreader.ReadState; public override XmlNameTable NameTable => _xmlreader.NameTable; public override bool CanResolveEntity => _xmlreader.CanResolveEntity; public override bool CanReadBinaryContent => _xmlreader.CanReadBinaryContent; public override bool CanReadValueChunk => _xmlreader.CanReadValueChunk; internal static XmlReader CreateReader(XmlReader xr) { return new DataTextReader(xr); } private DataTextReader(XmlReader input) { _xmlreader = input; } public override string GetAttribute(string name) { return _xmlreader.GetAttribute(name); } public override string GetAttribute(string localName, string namespaceURI) { return _xmlreader.GetAttribute(localName, namespaceURI); } public override string GetAttribute(int i) { return _xmlreader.GetAttribute(i); } public override bool MoveToAttribute(string name) { return _xmlreader.MoveToAttribute(name); } public override bool MoveToAttribute(string localName, string namespaceURI) { return _xmlreader.MoveToAttribute(localName, namespaceURI); } public override void MoveToAttribute(int i) { _xmlreader.MoveToAttribute(i); } public override bool MoveToFirstAttribute() { return _xmlreader.MoveToFirstAttribute(); } public override bool MoveToNextAttribute() { return _xmlreader.MoveToNextAttribute(); } public override bool MoveToElement() { return _xmlreader.MoveToElement(); } public override bool ReadAttributeValue() { return _xmlreader.ReadAttributeValue(); } public override bool Read() { return _xmlreader.Read(); } public override void Close() { _xmlreader.Close(); } public override void Skip() { _xmlreader.Skip(); } public override string LookupNamespace(string prefix) { return _xmlreader.LookupNamespace(prefix); } public override void ResolveEntity() { _xmlreader.ResolveEntity(); } public override int ReadContentAsBase64(byte[] buffer, int index, int count) { return _xmlreader.ReadContentAsBase64(buffer, index, count); } public override int ReadElementContentAsBase64(byte[] buffer, int index, int count) { return _xmlreader.ReadElementContentAsBase64(buffer, index, count); } public override int ReadContentAsBinHex(byte[] buffer, int index, int count) { return _xmlreader.ReadContentAsBinHex(buffer, index, count); } public override int ReadElementContentAsBinHex(byte[] buffer, int index, int count) { return _xmlreader.ReadElementContentAsBinHex(buffer, index, count); } public override string ReadString() { return _xmlreader.ReadString(); } } internal static class SafeNativeMethods { internal static IntPtr LocalAlloc(IntPtr initialSize) { IntPtr intPtr = Marshal.AllocHGlobal(initialSize); ZeroMemory(intPtr, (int)initialSize); return intPtr; } internal static void LocalFree(IntPtr ptr) { Marshal.FreeHGlobal(ptr); } internal static void ZeroMemory(IntPtr ptr, int length) { Marshal.Copy(new byte[length], 0, ptr, length); } internal static IntPtr GetProcAddress(IntPtr HModule, string funcName) { throw new PlatformNotSupportedException("SafeNativeMethods.GetProcAddress is not supported on non-Windows platforms"); } } internal static class Win32NativeMethods { internal static bool IsTokenRestrictedWrapper(IntPtr token) { throw new PlatformNotSupportedException("Win32NativeMethods.IsTokenRestrictedWrapper is not supported on non-Windows platforms"); } } [Serializable] public sealed class OperationAbortedException : SystemException { private OperationAbortedException(string message, Exception innerException) : base(message, innerException) { base.HResult = -2146232010; } internal static OperationAbortedException Aborted(Exception inner) { if (inner == null) { return new OperationAbortedException(SR.GetString("Operation aborted."), null); } return new OperationAbortedException(SR.GetString("Operation aborted due to an exception (see InnerException for details)."), inner); } internal OperationAbortedException() { ThrowStub.ThrowNotSupportedException(); } } internal static class LocalDBAPI { [UnmanagedFunctionPointer(CallingConvention.Cdecl, CharSet = CharSet.Unicode)] private delegate int LocalDBFormatMessageDelegate(int hrLocalDB, uint dwFlags, uint dwLanguageId, StringBuilder buffer, ref uint buflen); private const string const_localDbPrefix = "(localdb)\\"; internal static string GetLocalDBMessage(int hrCode) { throw new PlatformNotSupportedException("LocalDB is not supported on this platform."); } internal static string GetLocalDbInstanceNameFromServerName(string serverName) { if (serverName == null) { return null; } serverName = serverName.TrimStart(Array.Empty()); if (!serverName.StartsWith("(localdb)\\", StringComparison.OrdinalIgnoreCase)) { return null; } string text = serverName.Substring("(localdb)\\".Length).Trim(); if (text.Length == 0) { return null; } return text; } } [Serializable] public class TypedDataSetGeneratorException : DataException { private ArrayList errorList; private string KEY_ARRAYCOUNT = "KEY_ARRAYCOUNT"; private string KEY_ARRAYVALUES = "KEY_ARRAYVALUES"; public ArrayList ErrorList => errorList; protected TypedDataSetGeneratorException(SerializationInfo info, StreamingContext context) : base(info, context) { int num = (int)info.GetValue(KEY_ARRAYCOUNT, typeof(int)); if (num > 0) { errorList = new ArrayList(); for (int i = 0; i < num; i++) { errorList.Add(info.GetValue(KEY_ARRAYVALUES + i, typeof(string))); } } else { errorList = null; } } public TypedDataSetGeneratorException() { errorList = null; base.HResult = -2146232021; } public TypedDataSetGeneratorException(string message) : base(message) { base.HResult = -2146232021; } public TypedDataSetGeneratorException(string message, Exception innerException) : base(message, innerException) { base.HResult = -2146232021; } public TypedDataSetGeneratorException(ArrayList list) : this() { errorList = list; base.HResult = -2146232021; } [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)] public override void GetObjectData(SerializationInfo info, StreamingContext context) { base.GetObjectData(info, context); if (errorList != null) { info.AddValue(KEY_ARRAYCOUNT, errorList.Count); for (int i = 0; i < errorList.Count; i++) { info.AddValue(KEY_ARRAYVALUES + i, errorList[i].ToString()); } } else { info.AddValue(KEY_ARRAYCOUNT, 0); } } } [EditorBrowsable(EditorBrowsableState.Never)] [Obsolete("PropertyAttributes has been deprecated. http://go.microsoft.com/fwlink/?linkid=14202")] [Flags] public enum PropertyAttributes { NotSupported = 0, Required = 1, Optional = 2, Read = 0x200, Write = 0x400 } } namespace System.Data.OleDb { public enum OleDbType { BigInt = 20, Binary = 128, Boolean = 11, BSTR = 8, Char = 129, Currency = 6, Date = 7, DBDate = 133, DBTime = 134, DBTimeStamp = 135, Decimal = 14, Double = 5, Empty = 0, Error = 10, Filetime = 64, Guid = 72, IDispatch = 9, Integer = 3, IUnknown = 13, LongVarBinary = 205, LongVarChar = 201, LongVarWChar = 203, Numeric = 131, PropVariant = 138, Single = 4, SmallInt = 2, TinyInt = 16, UnsignedBigInt = 21, UnsignedInt = 19, UnsignedSmallInt = 18, UnsignedTinyInt = 17, VarBinary = 204, VarChar = 200, Variant = 12, VarNumeric = 139, VarWChar = 202, WChar = 130 } } namespace System.Data.Sql { public sealed class SqlNotificationRequest { private string _userData; private string _options; private int _timeout; public string Options { get { return _options; } set { if (value != null && 65535 < value.Length) { throw ADP.ArgumentOutOfRange(string.Empty, "Options"); } _options = value; } } public int Timeout { get { return _timeout; } set { if (0 > value) { throw ADP.ArgumentOutOfRange(string.Empty, "Timeout"); } _timeout = value; } } public string UserData { get { return _userData; } set { if (value != null && 65535 < value.Length) { throw ADP.ArgumentOutOfRange(string.Empty, "UserData"); } _userData = value; } } public SqlNotificationRequest() : this(null, null, 0) { } public SqlNotificationRequest(string userData, string options, int timeout) { UserData = userData; Timeout = timeout; Options = options; } } public sealed class SqlDataSourceEnumerator : DbDataSourceEnumerator { private static readonly SqlDataSourceEnumerator SingletonInstance = new SqlDataSourceEnumerator(); internal const string ServerName = "ServerName"; internal const string InstanceName = "InstanceName"; internal const string IsClustered = "IsClustered"; internal const string Version = "Version"; private long timeoutTime; private static string _Version = "Version:"; private static string _Cluster = "Clustered:"; private static int _clusterLength = _Cluster.Length; private static int _versionLength = _Version.Length; public static SqlDataSourceEnumerator Instance => SingletonInstance; private SqlDataSourceEnumerator() { } public override DataTable GetDataSources() { timeoutTime = 0L; throw new NotImplementedException(); } private static DataTable ParseServerEnumString(string serverInstances) { DataTable dataTable = new DataTable("SqlDataSources"); dataTable.Locale = CultureInfo.InvariantCulture; dataTable.Columns.Add("ServerName", typeof(string)); dataTable.Columns.Add("InstanceName", typeof(string)); dataTable.Columns.Add("IsClustered", typeof(string)); dataTable.Columns.Add("Version", typeof(string)); DataRow dataRow = null; string text = null; string text2 = null; string text3 = null; string value = null; string[] array = serverInstances.Split(new char[1]); for (int i = 0; i < array.Length; i++) { string text4 = array[i].Trim(new char[1]); if (text4.Length == 0) { continue; } string[] array2 = text4.Split(new char[1] { ';' }); foreach (string text5 in array2) { if (text == null) { string[] array3 = text5.Split(new char[1] { '\\' }); foreach (string text6 in array3) { if (text == null) { text = text6; } else { text2 = text6; } } } else if (text3 == null) { text3 = text5.Substring(_clusterLength); } else { value = text5.Substring(_versionLength); } } string text7 = "ServerName='" + text + "'"; if (!ADP.IsEmpty(text2)) { text7 = text7 + " AND InstanceName='" + text2 + "'"; } if (dataTable.Select(text7).Length == 0) { dataRow = dataTable.NewRow(); dataRow[0] = text; dataRow[1] = text2; dataRow[2] = text3; dataRow[3] = value; dataTable.Rows.Add(dataRow); } text = null; text2 = null; text3 = null; value = null; } foreach (DataColumn column in dataTable.Columns) { column.ReadOnly = true; } return dataTable; } } internal sealed class SqlGenericUtil { private SqlGenericUtil() { } internal static Exception NullCommandText() { return ADP.Argument(Res.GetString("Command parameter must have a non null and non empty command text.")); } internal static Exception MismatchedMetaDataDirectionArrayLengths() { return ADP.Argument(Res.GetString("MetaData parameter array must have length equivalent to ParameterDirection array argument.")); } } } namespace System.Data.SqlClient { internal static class SNINativeMethodWrapper { internal enum SniSpecialErrors : uint { LocalDBErrorCode = 50u, MultiSubnetFailoverWithMoreThan64IPs = 47u, MultiSubnetFailoverWithInstanceSpecified = 48u, MultiSubnetFailoverWithNonTcpProtocol = 49u, MaxErrorValue = 50157u } } public enum ApplicationIntent { ReadWrite, ReadOnly } public delegate void OnChangeEventHandler(object sender, SqlNotificationEventArgs e); internal class ParameterPeekAheadValue { internal IEnumerator Enumerator; internal SqlDataRecord FirstRecord; } public class SqlRowsCopiedEventArgs : EventArgs { private bool _abort; private long _rowsCopied; public bool Abort { get { return _abort; } set { _abort = value; } } public long RowsCopied => _rowsCopied; public SqlRowsCopiedEventArgs(long rowsCopied) { _rowsCopied = rowsCopied; } } public delegate void SqlRowsCopiedEventHandler(object sender, SqlRowsCopiedEventArgs e); public enum SortOrder { Unspecified = -1, Ascending, Descending } internal sealed class SqlBuffer { internal enum StorageType { Empty, Boolean, Byte, DateTime, Decimal, Double, Int16, Int32, Int64, Money, Single, String, SqlBinary, SqlCachedBuffer, SqlGuid, SqlXml, Date, DateTime2, DateTimeOffset, Time } internal struct DateTimeInfo { internal int daypart; internal int timepart; } internal struct NumericInfo { internal int data1; internal int data2; internal int data3; internal int data4; internal byte precision; internal byte scale; internal bool positive; } internal struct TimeInfo { internal long ticks; internal byte scale; } internal struct DateTime2Info { internal int date; internal TimeInfo timeInfo; } internal struct DateTimeOffsetInfo { internal DateTime2Info dateTime2Info; internal short offset; } [StructLayout(LayoutKind.Explicit)] internal struct Storage { [FieldOffset(0)] internal bool _boolean; [FieldOffset(0)] internal byte _byte; [FieldOffset(0)] internal DateTimeInfo _dateTimeInfo; [FieldOffset(0)] internal double _double; [FieldOffset(0)] internal NumericInfo _numericInfo; [FieldOffset(0)] internal short _int16; [FieldOffset(0)] internal int _int32; [FieldOffset(0)] internal long _int64; [FieldOffset(0)] internal float _single; [FieldOffset(0)] internal TimeInfo _timeInfo; [FieldOffset(0)] internal DateTime2Info _dateTime2Info; [FieldOffset(0)] internal DateTimeOffsetInfo _dateTimeOffsetInfo; } private bool _isNull; private StorageType _type; private Storage _value; private object _object; private static string[] s_katmaiDateTimeOffsetFormatByScale = new string[8] { "yyyy-MM-dd HH:mm:ss zzz", "yyyy-MM-dd HH:mm:ss.f zzz", "yyyy-MM-dd HH:mm:ss.ff zzz", "yyyy-MM-dd HH:mm:ss.fff zzz", "yyyy-MM-dd HH:mm:ss.ffff zzz", "yyyy-MM-dd HH:mm:ss.fffff zzz", "yyyy-MM-dd HH:mm:ss.ffffff zzz", "yyyy-MM-dd HH:mm:ss.fffffff zzz" }; private static string[] s_katmaiDateTime2FormatByScale = new string[8] { "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm:ss.f", "yyyy-MM-dd HH:mm:ss.ff", "yyyy-MM-dd HH:mm:ss.fff", "yyyy-MM-dd HH:mm:ss.ffff", "yyyy-MM-dd HH:mm:ss.fffff", "yyyy-MM-dd HH:mm:ss.ffffff", "yyyy-MM-dd HH:mm:ss.fffffff" }; private static string[] s_katmaiTimeFormatByScale = new string[8] { "HH:mm:ss", "HH:mm:ss.f", "HH:mm:ss.ff", "HH:mm:ss.fff", "HH:mm:ss.ffff", "HH:mm:ss.fffff", "HH:mm:ss.ffffff", "HH:mm:ss.fffffff" }; internal bool IsEmpty => _type == StorageType.Empty; internal bool IsNull => _isNull; internal StorageType VariantInternalStorageType => _type; internal bool Boolean { get { ThrowIfNull(); if (StorageType.Boolean == _type) { return _value._boolean; } return (bool)Value; } set { _value._boolean = value; _type = StorageType.Boolean; _isNull = false; } } internal byte Byte { get { ThrowIfNull(); if (StorageType.Byte == _type) { return _value._byte; } return (byte)Value; } set { _value._byte = value; _type = StorageType.Byte; _isNull = false; } } internal byte[] ByteArray { get { ThrowIfNull(); return SqlBinary.Value; } } internal DateTime DateTime { get { ThrowIfNull(); if (StorageType.Date == _type) { DateTime minValue = DateTime.MinValue; return minValue.AddDays(_value._int32); } if (StorageType.DateTime2 == _type) { return new DateTime(GetTicksFromDateTime2Info(_value._dateTime2Info)); } if (StorageType.DateTime == _type) { return SqlTypeWorkarounds.SqlDateTimeToDateTime(_value._dateTimeInfo.daypart, _value._dateTimeInfo.timepart); } return (DateTime)Value; } } internal decimal Decimal { get { ThrowIfNull(); if (StorageType.Decimal == _type) { if (_value._numericInfo.data4 != 0 || _value._numericInfo.scale > 28) { throw new OverflowException(SQLResource.ConversionOverflowMessage); } return new decimal(_value._numericInfo.data1, _value._numericInfo.data2, _value._numericInfo.data3, !_value._numericInfo.positive, _value._numericInfo.scale); } if (StorageType.Money == _type) { long num = _value._int64; bool isNegative = false; if (num < 0) { isNegative = true; num = -num; } return new decimal((int)(num & 0xFFFFFFFFu), (int)(num >> 32), 0, isNegative, 4); } return (decimal)Value; } } internal double Double { get { ThrowIfNull(); if (StorageType.Double == _type) { return _value._double; } return (double)Value; } set { _value._double = value; _type = StorageType.Double; _isNull = false; } } internal Guid Guid { get { ThrowIfNull(); return SqlGuid.Value; } } internal short Int16 { get { ThrowIfNull(); if (StorageType.Int16 == _type) { return _value._int16; } return (short)Value; } set { _value._int16 = value; _type = StorageType.Int16; _isNull = false; } } internal int Int32 { get { ThrowIfNull(); if (StorageType.Int32 == _type) { return _value._int32; } return (int)Value; } set { _value._int32 = value; _type = StorageType.Int32; _isNull = false; } } internal long Int64 { get { ThrowIfNull(); if (StorageType.Int64 == _type) { return _value._int64; } return (long)Value; } set { _value._int64 = value; _type = StorageType.Int64; _isNull = false; } } internal float Single { get { ThrowIfNull(); if (StorageType.Single == _type) { return _value._single; } return (float)Value; } set { _value._single = value; _type = StorageType.Single; _isNull = false; } } internal string String { get { ThrowIfNull(); if (StorageType.String == _type) { return (string)_object; } if (StorageType.SqlCachedBuffer == _type) { return ((SqlCachedBuffer)_object).ToString(); } return (string)Value; } } internal string KatmaiDateTimeString { get { ThrowIfNull(); if (StorageType.Date == _type) { return DateTime.ToString("yyyy-MM-dd", DateTimeFormatInfo.InvariantInfo); } if (StorageType.Time == _type) { byte scale = _value._timeInfo.scale; return new DateTime(_value._timeInfo.ticks).ToString(s_katmaiTimeFormatByScale[scale], DateTimeFormatInfo.InvariantInfo); } if (StorageType.DateTime2 == _type) { byte scale2 = _value._dateTime2Info.timeInfo.scale; return DateTime.ToString(s_katmaiDateTime2FormatByScale[scale2], DateTimeFormatInfo.InvariantInfo); } if (StorageType.DateTimeOffset == _type) { DateTimeOffset dateTimeOffset = DateTimeOffset; byte scale3 = _value._dateTimeOffsetInfo.dateTime2Info.timeInfo.scale; return dateTimeOffset.ToString(s_katmaiDateTimeOffsetFormatByScale[scale3], DateTimeFormatInfo.InvariantInfo); } return (string)Value; } } internal SqlString KatmaiDateTimeSqlString { get { if (StorageType.Date == _type || StorageType.Time == _type || StorageType.DateTime2 == _type || StorageType.DateTimeOffset == _type) { if (IsNull) { return SqlString.Null; } return new SqlString(KatmaiDateTimeString); } return (SqlString)SqlValue; } } internal TimeSpan Time { get { ThrowIfNull(); if (StorageType.Time == _type) { return new TimeSpan(_value._timeInfo.ticks); } return (TimeSpan)Value; } } internal DateTimeOffset DateTimeOffset { get { ThrowIfNull(); if (StorageType.DateTimeOffset == _type) { TimeSpan offset = new TimeSpan(0, _value._dateTimeOffsetInfo.offset, 0); return new DateTimeOffset(GetTicksFromDateTime2Info(_value._dateTimeOffsetInfo.dateTime2Info) + offset.Ticks, offset); } return (DateTimeOffset)Value; } } internal SqlBinary SqlBinary { get { if (StorageType.SqlBinary == _type) { return (SqlBinary)_object; } return (SqlBinary)SqlValue; } set { _object = value; _type = StorageType.SqlBinary; _isNull = value.IsNull; } } internal SqlBoolean SqlBoolean { get { if (StorageType.Boolean == _type) { if (IsNull) { return SqlBoolean.Null; } return new SqlBoolean(_value._boolean); } return (SqlBoolean)SqlValue; } } internal SqlByte SqlByte { get { if (StorageType.Byte == _type) { if (IsNull) { return SqlByte.Null; } return new SqlByte(_value._byte); } return (SqlByte)SqlValue; } } internal SqlCachedBuffer SqlCachedBuffer { get { if (StorageType.SqlCachedBuffer == _type) { if (IsNull) { return SqlCachedBuffer.Null; } return (SqlCachedBuffer)_object; } return (SqlCachedBuffer)SqlValue; } set { _object = value; _type = StorageType.SqlCachedBuffer; _isNull = value.IsNull; } } internal SqlXml SqlXml { get { if (StorageType.SqlXml == _type) { if (IsNull) { return SqlXml.Null; } return (SqlXml)_object; } return (SqlXml)SqlValue; } set { _object = value; _type = StorageType.SqlXml; _isNull = value.IsNull; } } internal SqlDateTime SqlDateTime { get { if (StorageType.DateTime == _type) { if (IsNull) { return SqlDateTime.Null; } return new SqlDateTime(_value._dateTimeInfo.daypart, _value._dateTimeInfo.timepart); } return (SqlDateTime)SqlValue; } } internal SqlDecimal SqlDecimal { get { if (StorageType.Decimal == _type) { if (IsNull) { return SqlDecimal.Null; } return new SqlDecimal(_value._numericInfo.precision, _value._numericInfo.scale, _value._numericInfo.positive, _value._numericInfo.data1, _value._numericInfo.data2, _value._numericInfo.data3, _value._numericInfo.data4); } return (SqlDecimal)SqlValue; } } internal SqlDouble SqlDouble { get { if (StorageType.Double == _type) { if (IsNull) { return SqlDouble.Null; } return new SqlDouble(_value._double); } return (SqlDouble)SqlValue; } } internal SqlGuid SqlGuid { get { if (StorageType.SqlGuid == _type) { return (SqlGuid)_object; } return (SqlGuid)SqlValue; } set { _object = value; _type = StorageType.SqlGuid; _isNull = value.IsNull; } } internal SqlInt16 SqlInt16 { get { if (StorageType.Int16 == _type) { if (IsNull) { return SqlInt16.Null; } return new SqlInt16(_value._int16); } return (SqlInt16)SqlValue; } } internal SqlInt32 SqlInt32 { get { if (StorageType.Int32 == _type) { if (IsNull) { return SqlInt32.Null; } return new SqlInt32(_value._int32); } return (SqlInt32)SqlValue; } } internal SqlInt64 SqlInt64 { get { if (StorageType.Int64 == _type) { if (IsNull) { return SqlInt64.Null; } return new SqlInt64(_value._int64); } return (SqlInt64)SqlValue; } } internal SqlMoney SqlMoney { get { if (StorageType.Money == _type) { if (IsNull) { return SqlMoney.Null; } return SqlTypeWorkarounds.SqlMoneyCtor(_value._int64, 1); } return (SqlMoney)SqlValue; } } internal SqlSingle SqlSingle { get { if (StorageType.Single == _type) { if (IsNull) { return SqlSingle.Null; } return new SqlSingle(_value._single); } return (SqlSingle)SqlValue; } } internal SqlString SqlString { get { if (StorageType.String == _type) { if (IsNull) { return SqlString.Null; } return new SqlString((string)_object); } if (StorageType.SqlCachedBuffer == _type) { SqlCachedBuffer sqlCachedBuffer = (SqlCachedBuffer)_object; if (sqlCachedBuffer.IsNull) { return SqlString.Null; } return sqlCachedBuffer.ToSqlString(); } return (SqlString)SqlValue; } } internal object SqlValue { get { switch (_type) { case StorageType.Empty: return DBNull.Value; case StorageType.Boolean: return SqlBoolean; case StorageType.Byte: return SqlByte; case StorageType.DateTime: return SqlDateTime; case StorageType.Decimal: return SqlDecimal; case StorageType.Double: return SqlDouble; case StorageType.Int16: return SqlInt16; case StorageType.Int32: return SqlInt32; case StorageType.Int64: return SqlInt64; case StorageType.Money: return SqlMoney; case StorageType.Single: return SqlSingle; case StorageType.String: return SqlString; case StorageType.SqlCachedBuffer: { SqlCachedBuffer sqlCachedBuffer = (SqlCachedBuffer)_object; if (sqlCachedBuffer.IsNull) { return SqlXml.Null; } return sqlCachedBuffer.ToSqlXml(); } case StorageType.SqlBinary: case StorageType.SqlGuid: return _object; case StorageType.SqlXml: if (_isNull) { return SqlXml.Null; } return (SqlXml)_object; case StorageType.Date: case StorageType.DateTime2: if (_isNull) { return DBNull.Value; } return DateTime; case StorageType.DateTimeOffset: if (_isNull) { return DBNull.Value; } return DateTimeOffset; case StorageType.Time: if (_isNull) { return DBNull.Value; } return Time; default: return null; } } } internal object Value { get { if (IsNull) { return DBNull.Value; } return _type switch { StorageType.Empty => DBNull.Value, StorageType.Boolean => Boolean, StorageType.Byte => Byte, StorageType.DateTime => DateTime, StorageType.Decimal => Decimal, StorageType.Double => Double, StorageType.Int16 => Int16, StorageType.Int32 => Int32, StorageType.Int64 => Int64, StorageType.Money => Decimal, StorageType.Single => Single, StorageType.String => String, StorageType.SqlBinary => ByteArray, StorageType.SqlCachedBuffer => ((SqlCachedBuffer)_object).ToString(), StorageType.SqlGuid => Guid, StorageType.SqlXml => ((SqlXml)_object).Value, StorageType.Date => DateTime, StorageType.DateTime2 => DateTime, StorageType.DateTimeOffset => DateTimeOffset, StorageType.Time => Time, _ => null, }; } } internal SqlBuffer() { } private SqlBuffer(SqlBuffer value) { _isNull = value._isNull; _type = value._type; _value = value._value; _object = value._object; } private static long GetTicksFromDateTime2Info(DateTime2Info dateTime2Info) { return dateTime2Info.date * 864000000000L + dateTime2Info.timeInfo.ticks; } internal Type GetTypeFromStorageType(bool isSqlType) { if (isSqlType) { switch (_type) { case StorageType.Empty: return null; case StorageType.Boolean: return typeof(SqlBoolean); case StorageType.Byte: return typeof(SqlByte); case StorageType.DateTime: return typeof(SqlDateTime); case StorageType.Decimal: return typeof(SqlDecimal); case StorageType.Double: return typeof(SqlDouble); case StorageType.Int16: return typeof(SqlInt16); case StorageType.Int32: return typeof(SqlInt32); case StorageType.Int64: return typeof(SqlInt64); case StorageType.Money: return typeof(SqlMoney); case StorageType.Single: return typeof(SqlSingle); case StorageType.String: return typeof(SqlString); case StorageType.SqlCachedBuffer: return typeof(SqlString); case StorageType.SqlBinary: return typeof(object); case StorageType.SqlGuid: return typeof(object); case StorageType.SqlXml: return typeof(SqlXml); } } else { switch (_type) { case StorageType.Empty: return null; case StorageType.Boolean: return typeof(bool); case StorageType.Byte: return typeof(byte); case StorageType.DateTime: return typeof(DateTime); case StorageType.Decimal: return typeof(decimal); case StorageType.Double: return typeof(double); case StorageType.Int16: return typeof(short); case StorageType.Int32: return typeof(int); case StorageType.Int64: return typeof(long); case StorageType.Money: return typeof(decimal); case StorageType.Single: return typeof(float); case StorageType.String: return typeof(string); case StorageType.SqlBinary: return typeof(byte[]); case StorageType.SqlCachedBuffer: return typeof(string); case StorageType.SqlGuid: return typeof(Guid); case StorageType.SqlXml: return typeof(string); } } return null; } internal static SqlBuffer[] CreateBufferArray(int length) { SqlBuffer[] array = new SqlBuffer[length]; for (int i = 0; i < array.Length; i++) { array[i] = new SqlBuffer(); } return array; } internal static SqlBuffer[] CloneBufferArray(SqlBuffer[] values) { SqlBuffer[] array = new SqlBuffer[values.Length]; for (int i = 0; i < values.Length; i++) { array[i] = new SqlBuffer(values[i]); } return array; } internal static void Clear(SqlBuffer[] values) { if (values != null) { for (int i = 0; i < values.Length; i++) { values[i].Clear(); } } } internal void Clear() { _isNull = false; _type = StorageType.Empty; _object = null; } internal void SetToDateTime(int daypart, int timepart) { _value._dateTimeInfo.daypart = daypart; _value._dateTimeInfo.timepart = timepart; _type = StorageType.DateTime; _isNull = false; } internal void SetToDecimal(byte precision, byte scale, bool positive, int[] bits) { _value._numericInfo.precision = precision; _value._numericInfo.scale = scale; _value._numericInfo.positive = positive; _value._numericInfo.data1 = bits[0]; _value._numericInfo.data2 = bits[1]; _value._numericInfo.data3 = bits[2]; _value._numericInfo.data4 = bits[3]; _type = StorageType.Decimal; _isNull = false; } internal void SetToMoney(long value) { _value._int64 = value; _type = StorageType.Money; _isNull = false; } internal void SetToNullOfType(StorageType storageType) { _type = storageType; _isNull = true; _object = null; } internal void SetToString(string value) { _object = value; _type = StorageType.String; _isNull = false; } internal void SetToDate(byte[] bytes) { _type = StorageType.Date; _value._int32 = GetDateFromByteArray(bytes, 0); _isNull = false; } internal void SetToDate(DateTime date) { _type = StorageType.Date; _value._int32 = date.Subtract(DateTime.MinValue).Days; _isNull = false; } internal void SetToTime(byte[] bytes, int length, byte scale) { _type = StorageType.Time; FillInTimeInfo(ref _value._timeInfo, bytes, length, scale); _isNull = false; } internal void SetToTime(TimeSpan timeSpan, byte scale) { _type = StorageType.Time; _value._timeInfo.ticks = timeSpan.Ticks; _value._timeInfo.scale = scale; _isNull = false; } internal void SetToDateTime2(byte[] bytes, int length, byte scale) { _type = StorageType.DateTime2; FillInTimeInfo(ref _value._dateTime2Info.timeInfo, bytes, length - 3, scale); _value._dateTime2Info.date = GetDateFromByteArray(bytes, length - 3); _isNull = false; } internal void SetToDateTime2(DateTime dateTime, byte scale) { _type = StorageType.DateTime2; _value._dateTime2Info.timeInfo.ticks = dateTime.TimeOfDay.Ticks; _value._dateTime2Info.timeInfo.scale = scale; _value._dateTime2Info.date = dateTime.Subtract(DateTime.MinValue).Days; _isNull = false; } internal void SetToDateTimeOffset(byte[] bytes, int length, byte scale) { _type = StorageType.DateTimeOffset; FillInTimeInfo(ref _value._dateTimeOffsetInfo.dateTime2Info.timeInfo, bytes, length - 5, scale); _value._dateTimeOffsetInfo.dateTime2Info.date = GetDateFromByteArray(bytes, length - 5); _value._dateTimeOffsetInfo.offset = (short)(bytes[length - 2] + (bytes[length - 1] << 8)); _isNull = false; } internal void SetToDateTimeOffset(DateTimeOffset dateTimeOffset, byte scale) { _type = StorageType.DateTimeOffset; DateTime utcDateTime = dateTimeOffset.UtcDateTime; _value._dateTimeOffsetInfo.dateTime2Info.timeInfo.ticks = utcDateTime.TimeOfDay.Ticks; _value._dateTimeOffsetInfo.dateTime2Info.timeInfo.scale = scale; _value._dateTimeOffsetInfo.dateTime2Info.date = utcDateTime.Subtract(DateTime.MinValue).Days; _value._dateTimeOffsetInfo.offset = (short)dateTimeOffset.Offset.TotalMinutes; _isNull = false; } private static void FillInTimeInfo(ref TimeInfo timeInfo, byte[] timeBytes, int length, byte scale) { long num = (long)(timeBytes[0] + ((ulong)timeBytes[1] << 8) + ((ulong)timeBytes[2] << 16)); if (length > 3) { num += (long)((ulong)timeBytes[3] << 24); } if (length > 4) { num += (long)((ulong)timeBytes[4] << 32); } timeInfo.ticks = num * TdsEnums.TICKS_FROM_SCALE[scale]; timeInfo.scale = scale; } private static int GetDateFromByteArray(byte[] buf, int offset) { return buf[offset] + (buf[offset + 1] << 8) + (buf[offset + 2] << 16); } private void ThrowIfNull() { if (IsNull) { throw new SqlNullValueException(); } } } internal sealed class _ColumnMapping { internal int _sourceColumnOrdinal; internal _SqlMetaData _metadata; internal _ColumnMapping(int columnId, _SqlMetaData metadata) { _sourceColumnOrdinal = columnId; _metadata = metadata; } } internal sealed class Row { private object[] _dataFields; internal object[] DataFields => _dataFields; internal object this[int index] => _dataFields[index]; internal Row(int rowCount) { _dataFields = new object[rowCount]; } } internal sealed class Result { private readonly _SqlMetaDataSet _metadata; private readonly List _rowset; internal int Count => _rowset.Count; internal _SqlMetaDataSet MetaData => _metadata; internal Row this[int index] => _rowset[index]; internal Result(_SqlMetaDataSet metadata) { _metadata = metadata; _rowset = new List(); } internal void AddRow(Row row) { _rowset.Add(row); } } internal sealed class BulkCopySimpleResultSet { private readonly List _results; private Result _resultSet; private int[] _indexmap; internal Result this[int idx] => _results[idx]; internal BulkCopySimpleResultSet() { _results = new List(); } internal void SetMetaData(_SqlMetaDataSet metadata) { _resultSet = new Result(metadata); _results.Add(_resultSet); _indexmap = new int[_resultSet.MetaData.Length]; for (int i = 0; i < _indexmap.Length; i++) { _indexmap[i] = i; } } internal int[] CreateIndexMap() { return _indexmap; } internal object[] CreateRowBuffer() { Row row = new Row(_resultSet.MetaData.Length); _resultSet.AddRow(row); return row.DataFields; } } public sealed class SqlBulkCopy : IDisposable { private enum ValueSourceType { Unspecified, IDataReader, DataTable, RowArray, DbDataReader } private enum ValueMethod : byte { GetValue, SqlTypeSqlDecimal, SqlTypeSqlDouble, SqlTypeSqlSingle, DataFeedStream, DataFeedText, DataFeedXml } private struct SourceColumnMetadata { public readonly ValueMethod Method; public readonly bool IsSqlType; public readonly bool IsDataFeed; public SourceColumnMetadata(ValueMethod method, bool isSqlType, bool isDataFeed) { Method = method; IsSqlType = isSqlType; IsDataFeed = isDataFeed; } } private const int MetaDataResultId = 1; private const int CollationResultId = 2; private const int CollationId = 3; private const int MAX_LENGTH = int.MaxValue; private const int DefaultCommandTimeout = 30; private bool _enableStreaming; private int _batchSize; private bool _ownConnection; private SqlBulkCopyOptions _copyOptions; private int _timeout = 30; private string _destinationTableName; private int _rowsCopied; private int _notifyAfter; private int _rowsUntilNotification; private bool _insideRowsCopiedEvent; private object _rowSource; private SqlDataReader _SqlDataReaderRowSource; private DbDataReader _DbDataReaderRowSource; private DataTable _dataTableSource; private SqlBulkCopyColumnMappingCollection _columnMappings; private SqlBulkCopyColumnMappingCollection _localColumnMappings; private SqlConnection _connection; private SqlTransaction _internalTransaction; private SqlTransaction _externalTransaction; private ValueSourceType _rowSourceType; private DataRow _currentRow; private int _currentRowLength; private DataRowState _rowStateToSkip; private IEnumerator _rowEnumerator; private TdsParser _parser; private TdsParserStateObject _stateObj; private List<_ColumnMapping> _sortedColumnMappings; private SqlRowsCopiedEventHandler _rowsCopiedEventHandler; private int _savedBatchSize; private bool _hasMoreRowToCopy; private bool _isAsyncBulkCopy; private bool _isBulkCopyingInProgress; private SqlInternalConnectionTds.SyncAsyncLock _parserLock; private SourceColumnMetadata[] _currentRowMetadata; public int BatchSize { get { return _batchSize; } set { if (value >= 0) { _batchSize = value; return; } throw ADP.ArgumentOutOfRange("BatchSize"); } } public int BulkCopyTimeout { get { return _timeout; } set { if (value < 0) { throw SQL.BulkLoadInvalidTimeout(value); } _timeout = value; } } public bool EnableStreaming { get { return _enableStreaming; } set { _enableStreaming = value; } } public SqlBulkCopyColumnMappingCollection ColumnMappings => _columnMappings; public string DestinationTableName { get { return _destinationTableName; } set { if (value == null) { throw ADP.ArgumentNull("DestinationTableName"); } if (value.Length == 0) { throw ADP.ArgumentOutOfRange("DestinationTableName"); } _destinationTableName = value; } } public int NotifyAfter { get { return _notifyAfter; } set { if (value >= 0) { _notifyAfter = value; return; } throw ADP.ArgumentOutOfRange("NotifyAfter"); } } internal SqlStatistics Statistics { get { if (_connection != null && _connection.StatisticsEnabled) { return _connection.Statistics; } return null; } } public event SqlRowsCopiedEventHandler SqlRowsCopied { add { _rowsCopiedEventHandler = (SqlRowsCopiedEventHandler)Delegate.Combine(_rowsCopiedEventHandler, value); } remove { _rowsCopiedEventHandler = (SqlRowsCopiedEventHandler)Delegate.Remove(_rowsCopiedEventHandler, value); } } public SqlBulkCopy(SqlConnection connection) { if (connection == null) { throw ADP.ArgumentNull("connection"); } _connection = connection; _columnMappings = new SqlBulkCopyColumnMappingCollection(); } public SqlBulkCopy(SqlConnection connection, SqlBulkCopyOptions copyOptions, SqlTransaction externalTransaction) : this(connection) { _copyOptions = copyOptions; if (externalTransaction != null && IsCopyOption(SqlBulkCopyOptions.UseInternalTransaction)) { throw SQL.BulkLoadConflictingTransactionOption(); } if (!IsCopyOption(SqlBulkCopyOptions.UseInternalTransaction)) { _externalTransaction = externalTransaction; } } public SqlBulkCopy(string connectionString) : this(new SqlConnection(connectionString)) { if (connectionString == null) { throw ADP.ArgumentNull("connectionString"); } _connection = new SqlConnection(connectionString); _columnMappings = new SqlBulkCopyColumnMappingCollection(); _ownConnection = true; } public SqlBulkCopy(string connectionString, SqlBulkCopyOptions copyOptions) : this(connectionString) { _copyOptions = copyOptions; } void IDisposable.Dispose() { Dispose(disposing: true); GC.SuppressFinalize(this); } private bool IsCopyOption(SqlBulkCopyOptions copyOption) { return (_copyOptions & copyOption) == copyOption; } private string CreateInitialQuery() { string[] array; try { array = MultipartIdentifier.ParseMultipartIdentifier(DestinationTableName, "[\"", "]\"", "SqlBulkCopy.WriteToServer failed because the SqlBulkCopy.DestinationTableName is an invalid multipart name", ThrowOnEmptyMultipartName: true); } catch (Exception inner) { throw SQL.BulkLoadInvalidDestinationTable(DestinationTableName, inner); } if (string.IsNullOrEmpty(array[3])) { throw SQL.BulkLoadInvalidDestinationTable(DestinationTableName, null); } string text = "select @@trancount; SET FMTONLY ON select * from " + DestinationTableName + " SET FMTONLY OFF "; string text2 = ((!_connection.IsKatmaiOrNewer) ? "sp_tablecollations_90" : "sp_tablecollations_100"); string text3 = array[3]; bool num = text3.Length > 0 && '#' == text3[0]; if (!string.IsNullOrEmpty(text3)) { text3 = SqlServerEscapeHelper.EscapeStringAsLiteral(text3); text3 = SqlServerEscapeHelper.EscapeIdentifier(text3); } string text4 = array[2]; if (!string.IsNullOrEmpty(text4)) { text4 = SqlServerEscapeHelper.EscapeStringAsLiteral(text4); text4 = SqlServerEscapeHelper.EscapeIdentifier(text4); } string text5 = array[1]; if (num && string.IsNullOrEmpty(text5)) { return text + string.Format(null, "exec tempdb..{0} N'{1}.{2}'", text2, text4, text3); } if (!string.IsNullOrEmpty(text5)) { text5 = SqlServerEscapeHelper.EscapeIdentifier(text5); } return text + string.Format(null, "exec {0}..{1} N'{2}.{3}'", text5, text2, text4, text3); } private Task CreateAndExecuteInitialQueryAsync(out BulkCopySimpleResultSet result) { string text = CreateInitialQuery(); Task task = _parser.TdsExecuteSQLBatch(text, BulkCopyTimeout, null, _stateObj, !_isAsyncBulkCopy, callerHasConnectionLock: true); if (task == null) { result = new BulkCopySimpleResultSet(); RunParser(result); return null; } result = null; return task.ContinueWith(delegate(Task t) { if (t.IsFaulted) { throw t.Exception.InnerException; } BulkCopySimpleResultSet bulkCopySimpleResultSet = new BulkCopySimpleResultSet(); RunParserReliably(bulkCopySimpleResultSet); return bulkCopySimpleResultSet; }, TaskScheduler.Default); } private string AnalyzeTargetAndCreateUpdateBulkCommand(BulkCopySimpleResultSet internalResults) { StringBuilder stringBuilder = new StringBuilder(); if (internalResults[2].Count == 0) { throw SQL.BulkLoadNoCollation(); } stringBuilder.AppendFormat("insert bulk {0} (", DestinationTableName); int num = 0; int num2 = 0; if (_connection.HasLocalTransaction && _externalTransaction == null && _internalTransaction == null && _connection.Parser != null && _connection.Parser.CurrentTransaction != null && _connection.Parser.CurrentTransaction.IsLocal) { throw SQL.BulkLoadExistingTransaction(); } _SqlMetaDataSet metaData = internalResults[1].MetaData; _sortedColumnMappings = new List<_ColumnMapping>(metaData.Length); for (int i = 0; i < metaData.Length; i++) { _SqlMetaData sqlMetaData = metaData[i]; bool flag = false; if (sqlMetaData.type == SqlDbType.Timestamp || (sqlMetaData.isIdentity && !IsCopyOption(SqlBulkCopyOptions.KeepIdentity))) { metaData[i] = null; flag = true; } int j; for (j = 0; j < _localColumnMappings.Count; j++) { if (_localColumnMappings[j]._destinationColumnOrdinal != sqlMetaData.ordinal && !(UnquotedName(_localColumnMappings[j]._destinationColumnName) == sqlMetaData.column)) { continue; } if (flag) { num2++; break; } _sortedColumnMappings.Add(new _ColumnMapping(_localColumnMappings[j]._internalSourceColumnOrdinal, sqlMetaData)); num++; if (num > 1) { stringBuilder.Append(", "); } if (sqlMetaData.type == SqlDbType.Variant) { AppendColumnNameAndTypeName(stringBuilder, sqlMetaData.column, "sql_variant"); } else { if (sqlMetaData.type == SqlDbType.Udt) { throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString()); } AppendColumnNameAndTypeName(stringBuilder, sqlMetaData.column, sqlMetaData.type.ToString()); } switch (sqlMetaData.metaType.NullableType) { case 106: case 108: stringBuilder.AppendFormat(null, "({0},{1})", sqlMetaData.precision, sqlMetaData.scale); break; case 240: { if (sqlMetaData.IsLargeUdt) { stringBuilder.Append("(max)"); break; } int length = sqlMetaData.length; stringBuilder.AppendFormat(null, "({0})", length); break; } case 41: case 42: case 43: stringBuilder.AppendFormat(null, "({0})", sqlMetaData.scale); break; default: if (!sqlMetaData.metaType.IsFixed && !sqlMetaData.metaType.IsLong) { int num3 = sqlMetaData.length; byte nullableType = sqlMetaData.metaType.NullableType; if (nullableType == 99 || nullableType == 231 || nullableType == 239) { num3 /= 2; } stringBuilder.AppendFormat(null, "({0})", num3); } else if (sqlMetaData.metaType.IsPlp && sqlMetaData.metaType.SqlDbType != SqlDbType.Xml) { stringBuilder.Append("(max)"); } break; } object obj = internalResults[2][i][3]; bool flag2; switch (sqlMetaData.type) { case SqlDbType.Char: case SqlDbType.NChar: case SqlDbType.NText: case SqlDbType.NVarChar: case SqlDbType.Text: case SqlDbType.VarChar: flag2 = true; break; default: flag2 = false; break; } if (!(obj != null && flag2)) { break; } SqlString sqlString = (SqlString)obj; if (sqlString.IsNull) { break; } stringBuilder.Append(" COLLATE " + sqlString.Value); if (_SqlDataReaderRowSource == null || sqlMetaData.collation == null) { break; } int internalSourceColumnOrdinal = _localColumnMappings[j]._internalSourceColumnOrdinal; int lCID = sqlMetaData.collation.LCID; int localeId = _SqlDataReaderRowSource.GetLocaleId(internalSourceColumnOrdinal); if (localeId == lCID) { break; } throw SQL.BulkLoadLcidMismatch(localeId, _SqlDataReaderRowSource.GetName(internalSourceColumnOrdinal), lCID, sqlMetaData.column); } if (j == _localColumnMappings.Count) { metaData[i] = null; } } if (num + num2 != _localColumnMappings.Count) { throw SQL.BulkLoadNonMatchingColumnMapping(); } stringBuilder.Append(")"); if ((_copyOptions & (SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.KeepNulls | SqlBulkCopyOptions.FireTriggers)) != 0) { bool flag3 = false; stringBuilder.Append(" with ("); if (IsCopyOption(SqlBulkCopyOptions.KeepNulls)) { stringBuilder.Append("KEEP_NULLS"); flag3 = true; } if (IsCopyOption(SqlBulkCopyOptions.TableLock)) { stringBuilder.Append((flag3 ? ", " : "") + "TABLOCK"); flag3 = true; } if (IsCopyOption(SqlBulkCopyOptions.CheckConstraints)) { stringBuilder.Append((flag3 ? ", " : "") + "CHECK_CONSTRAINTS"); flag3 = true; } if (IsCopyOption(SqlBulkCopyOptions.FireTriggers)) { stringBuilder.Append((flag3 ? ", " : "") + "FIRE_TRIGGERS"); flag3 = true; } stringBuilder.Append(")"); } return stringBuilder.ToString(); } private Task SubmitUpdateBulkCommand(string TDSCommand) { Task task = _parser.TdsExecuteSQLBatch(TDSCommand, BulkCopyTimeout, null, _stateObj, !_isAsyncBulkCopy, callerHasConnectionLock: true); if (task == null) { RunParser(); return null; } return task.ContinueWith(delegate(Task t) { if (t.IsFaulted) { throw t.Exception.InnerException; } RunParserReliably(); }, TaskScheduler.Default); } private void WriteMetaData(BulkCopySimpleResultSet internalResults) { _stateObj.SetTimeoutSeconds(BulkCopyTimeout); _SqlMetaDataSet metaData = internalResults[1].MetaData; _stateObj._outputMessageType = 7; _parser.WriteBulkCopyMetaData(metaData, _sortedColumnMappings.Count, _stateObj); } public void Close() { if (_insideRowsCopiedEvent) { throw SQL.InvalidOperationInsideEvent(); } Dispose(disposing: true); GC.SuppressFinalize(this); } private void Dispose(bool disposing) { if (!disposing) { return; } _columnMappings = null; _parser = null; try { if (_internalTransaction != null) { _internalTransaction.Rollback(); _internalTransaction.Dispose(); _internalTransaction = null; } } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } } finally { if (_connection != null) { if (_ownConnection) { _connection.Dispose(); } _connection = null; } } } private object GetValueFromSourceRow(int destRowIndex, out bool isSqlType, out bool isDataFeed, out bool isNull) { _SqlMetaData metadata = _sortedColumnMappings[destRowIndex]._metadata; int sourceColumnOrdinal = _sortedColumnMappings[destRowIndex]._sourceColumnOrdinal; switch (_rowSourceType) { case ValueSourceType.IDataReader: case ValueSourceType.DbDataReader: { if (_currentRowMetadata[destRowIndex].IsDataFeed) { if (_DbDataReaderRowSource.IsDBNull(sourceColumnOrdinal)) { isSqlType = false; isDataFeed = false; isNull = true; return DBNull.Value; } isSqlType = false; isDataFeed = true; isNull = false; switch (_currentRowMetadata[destRowIndex].Method) { case ValueMethod.DataFeedStream: return new StreamDataFeed(_DbDataReaderRowSource.GetStream(sourceColumnOrdinal)); case ValueMethod.DataFeedText: return new TextDataFeed(_DbDataReaderRowSource.GetTextReader(sourceColumnOrdinal)); case ValueMethod.DataFeedXml: return new XmlDataFeed(_SqlDataReaderRowSource.GetXmlReader(sourceColumnOrdinal)); default: { isDataFeed = false; object value = _DbDataReaderRowSource.GetValue(sourceColumnOrdinal); ADP.IsNullOrSqlType(value, out isNull, out isSqlType); return value; } } } if (_SqlDataReaderRowSource != null) { if (_currentRowMetadata[destRowIndex].IsSqlType) { isSqlType = true; isDataFeed = false; INullable nullable = _currentRowMetadata[destRowIndex].Method switch { ValueMethod.SqlTypeSqlDecimal => _SqlDataReaderRowSource.GetSqlDecimal(sourceColumnOrdinal), ValueMethod.SqlTypeSqlDouble => new SqlDecimal(_SqlDataReaderRowSource.GetSqlDouble(sourceColumnOrdinal).Value), ValueMethod.SqlTypeSqlSingle => new SqlDecimal(_SqlDataReaderRowSource.GetSqlSingle(sourceColumnOrdinal).Value), _ => (INullable)_SqlDataReaderRowSource.GetSqlValue(sourceColumnOrdinal), }; isNull = nullable.IsNull; return nullable; } isSqlType = false; isDataFeed = false; object value2 = _SqlDataReaderRowSource.GetValue(sourceColumnOrdinal); isNull = value2 == null || value2 == DBNull.Value; if (!isNull && metadata.type == SqlDbType.Udt) { isNull = (value2 as INullable)?.IsNull ?? false; } return value2; } isDataFeed = false; IDataReader dataReader = (IDataReader)_rowSource; if (_enableStreaming && _SqlDataReaderRowSource == null && dataReader.IsDBNull(sourceColumnOrdinal)) { isSqlType = false; isNull = true; return DBNull.Value; } object value3 = dataReader.GetValue(sourceColumnOrdinal); ADP.IsNullOrSqlType(value3, out isNull, out isSqlType); return value3; } case ValueSourceType.DataTable: case ValueSourceType.RowArray: { isDataFeed = false; object obj = _currentRow[sourceColumnOrdinal]; ADP.IsNullOrSqlType(obj, out isNull, out isSqlType); if (!isNull && _currentRowMetadata[destRowIndex].IsSqlType) { switch (_currentRowMetadata[destRowIndex].Method) { case ValueMethod.SqlTypeSqlSingle: { if (isSqlType) { return new SqlDecimal(((SqlSingle)obj).Value); } float num2 = (float)obj; if (!float.IsNaN(num2)) { isSqlType = true; return new SqlDecimal(num2); } break; } case ValueMethod.SqlTypeSqlDouble: { if (isSqlType) { return new SqlDecimal(((SqlDouble)obj).Value); } double num = (double)obj; if (!double.IsNaN(num)) { isSqlType = true; return new SqlDecimal(num); } break; } case ValueMethod.SqlTypeSqlDecimal: if (isSqlType) { return (SqlDecimal)obj; } isSqlType = true; return new SqlDecimal((decimal)obj); } } return obj; } default: throw ADP.NotSupported(); } } private Task ReadFromRowSourceAsync(CancellationToken cts) { if (_isAsyncBulkCopy && _DbDataReaderRowSource != null) { return _DbDataReaderRowSource.ReadAsync(cts).ContinueWith(delegate(Task t) { if (t.Status == TaskStatus.RanToCompletion) { _hasMoreRowToCopy = t.Result; } return t; }, TaskScheduler.Default).Unwrap(); } _hasMoreRowToCopy = false; try { _hasMoreRowToCopy = ReadFromRowSource(); } catch (Exception exception) { if (_isAsyncBulkCopy) { return Task.FromException(exception); } throw; } return null; } private bool ReadFromRowSource() { switch (_rowSourceType) { case ValueSourceType.IDataReader: case ValueSourceType.DbDataReader: return ((IDataReader)_rowSource).Read(); case ValueSourceType.DataTable: case ValueSourceType.RowArray: do { if (!_rowEnumerator.MoveNext()) { return false; } _currentRow = (DataRow)_rowEnumerator.Current; } while ((_currentRow.RowState & _rowStateToSkip) != 0); _currentRowLength = _currentRow.ItemArray.Length; return true; default: throw ADP.NotSupported(); } } private SourceColumnMetadata GetColumnMetadata(int ordinal) { int sourceColumnOrdinal = _sortedColumnMappings[ordinal]._sourceColumnOrdinal; _SqlMetaData metadata = _sortedColumnMappings[ordinal]._metadata; bool isDataFeed; bool isSqlType; ValueMethod method; if ((_SqlDataReaderRowSource != null || _dataTableSource != null) && (metadata.metaType.NullableType == 106 || metadata.metaType.NullableType == 108)) { isDataFeed = false; Type type; switch (_rowSourceType) { case ValueSourceType.IDataReader: case ValueSourceType.DbDataReader: type = _SqlDataReaderRowSource.GetFieldType(sourceColumnOrdinal); break; case ValueSourceType.DataTable: case ValueSourceType.RowArray: type = _dataTableSource.Columns[sourceColumnOrdinal].DataType; break; default: type = null; break; } if (typeof(SqlDecimal) == type || typeof(decimal) == type) { isSqlType = true; method = ValueMethod.SqlTypeSqlDecimal; } else if (typeof(SqlDouble) == type || typeof(double) == type) { isSqlType = true; method = ValueMethod.SqlTypeSqlDouble; } else if (typeof(SqlSingle) == type || typeof(float) == type) { isSqlType = true; method = ValueMethod.SqlTypeSqlSingle; } else { isSqlType = false; method = ValueMethod.GetValue; } } else if (_enableStreaming && metadata.length == int.MaxValue) { isSqlType = false; if (_SqlDataReaderRowSource != null) { MetaType metaType = _SqlDataReaderRowSource.MetaData[sourceColumnOrdinal].metaType; if (metadata.type == SqlDbType.VarBinary && metaType.IsBinType && metaType.SqlDbType != SqlDbType.Timestamp && _SqlDataReaderRowSource.IsCommandBehavior(CommandBehavior.SequentialAccess)) { isDataFeed = true; method = ValueMethod.DataFeedStream; } else if ((metadata.type == SqlDbType.VarChar || metadata.type == SqlDbType.NVarChar) && metaType.IsCharType && metaType.SqlDbType != SqlDbType.Xml) { isDataFeed = true; method = ValueMethod.DataFeedText; } else if (metadata.type == SqlDbType.Xml && metaType.SqlDbType == SqlDbType.Xml) { isDataFeed = true; method = ValueMethod.DataFeedXml; } else { isDataFeed = false; method = ValueMethod.GetValue; } } else if (_DbDataReaderRowSource != null) { if (metadata.type == SqlDbType.VarBinary) { isDataFeed = true; method = ValueMethod.DataFeedStream; } else if (metadata.type == SqlDbType.VarChar || metadata.type == SqlDbType.NVarChar) { isDataFeed = true; method = ValueMethod.DataFeedText; } else { isDataFeed = false; method = ValueMethod.GetValue; } } else { isDataFeed = false; method = ValueMethod.GetValue; } } else { isSqlType = false; isDataFeed = false; method = ValueMethod.GetValue; } return new SourceColumnMetadata(method, isSqlType, isDataFeed); } private void CreateOrValidateConnection(string method) { if (_connection == null) { throw ADP.ConnectionRequired(method); } if (_ownConnection && _connection.State != ConnectionState.Open) { _connection.Open(); } _connection.ValidateConnectionForExecute(method, null); if (_externalTransaction != null && _connection != _externalTransaction.Connection) { throw ADP.TransactionConnectionMismatch(); } } private void RunParser(BulkCopySimpleResultSet bulkCopyHandler = null) { SqlInternalConnectionTds openTdsConnection = _connection.GetOpenTdsConnection(); openTdsConnection.ThreadHasParserLockForClose = true; try { _parser.Run(RunBehavior.UntilDone, null, null, bulkCopyHandler, _stateObj); } finally { openTdsConnection.ThreadHasParserLockForClose = false; } } private void RunParserReliably(BulkCopySimpleResultSet bulkCopyHandler = null) { SqlInternalConnectionTds openTdsConnection = _connection.GetOpenTdsConnection(); openTdsConnection.ThreadHasParserLockForClose = true; try { _parser.Run(RunBehavior.UntilDone, null, null, bulkCopyHandler, _stateObj); } finally { openTdsConnection.ThreadHasParserLockForClose = false; } } private void CommitTransaction() { if (_internalTransaction != null) { SqlInternalConnectionTds openTdsConnection = _connection.GetOpenTdsConnection(); openTdsConnection.ThreadHasParserLockForClose = true; try { _internalTransaction.Commit(); _internalTransaction.Dispose(); _internalTransaction = null; } finally { openTdsConnection.ThreadHasParserLockForClose = false; } } } private void AbortTransaction() { if (_internalTransaction == null) { return; } if (!_internalTransaction.IsZombied) { SqlInternalConnectionTds openTdsConnection = _connection.GetOpenTdsConnection(); openTdsConnection.ThreadHasParserLockForClose = true; try { _internalTransaction.Rollback(); } finally { openTdsConnection.ThreadHasParserLockForClose = false; } } _internalTransaction.Dispose(); _internalTransaction = null; } private void AppendColumnNameAndTypeName(StringBuilder query, string columnName, string typeName) { SqlServerEscapeHelper.EscapeIdentifier(query, columnName); query.Append(" "); query.Append(typeName); } private string UnquotedName(string name) { if (string.IsNullOrEmpty(name)) { return null; } if (name[0] == '[') { int length = name.Length; name = name.Substring(1, length - 2); } return name; } private object ValidateBulkCopyVariant(object value) { switch (MetaType.GetMetaTypeFromValue(value).TDSType) { case 36: case 40: case 41: case 42: case 43: case 48: case 50: case 52: case 56: case 59: case 60: case 61: case 62: case 108: case 127: case 165: case 167: case 231: if (value is INullable) { return MetaType.GetComValueFromSqlVariant(value); } return value; default: throw SQL.BulkLoadInvalidVariantValue(); } } private object ConvertValue(object value, _SqlMetaData metadata, bool isNull, ref bool isSqlType, out bool coercedToDataFeed) { coercedToDataFeed = false; if (isNull) { if (!metadata.isNullable) { throw SQL.BulkLoadBulkLoadNotAllowDBNull(metadata.column); } return value; } MetaType metaType = metadata.metaType; bool typeChanged = false; try { switch (metaType.NullableType) { case 106: case 108: { MetaType metaTypeFromSqlDbType = MetaType.GetMetaTypeFromSqlDbType(metaType.SqlDbType, isMultiValued: false); value = SqlParameter.CoerceValue(value, metaTypeFromSqlDbType, out coercedToDataFeed, out typeChanged, allowStreaming: false); SqlDecimal sqlDecimal = ((!isSqlType || typeChanged) ? new SqlDecimal((decimal)value) : ((SqlDecimal)value)); if (sqlDecimal.Scale != metadata.scale) { sqlDecimal = TdsParser.AdjustSqlDecimalScale(sqlDecimal, metadata.scale); } if (sqlDecimal.Precision > metadata.precision) { try { sqlDecimal = SqlDecimal.ConvertToPrecScale(sqlDecimal, metadata.precision, sqlDecimal.Scale); } catch (SqlTruncateException) { throw SQL.BulkLoadCannotConvertValue(value.GetType(), metaTypeFromSqlDbType, ADP.ParameterValueOutOfRange(sqlDecimal)); } } value = sqlDecimal; isSqlType = true; typeChanged = false; break; } case 34: case 35: case 36: case 38: case 40: case 41: case 42: case 43: case 50: case 58: case 59: case 61: case 62: case 104: case 109: case 110: case 111: case 165: case 167: case 173: case 175: { MetaType metaTypeFromSqlDbType = MetaType.GetMetaTypeFromSqlDbType(metaType.SqlDbType, isMultiValued: false); value = SqlParameter.CoerceValue(value, metaTypeFromSqlDbType, out coercedToDataFeed, out typeChanged, allowStreaming: false); break; } case 99: case 231: case 239: { MetaType metaTypeFromSqlDbType = MetaType.GetMetaTypeFromSqlDbType(metaType.SqlDbType, isMultiValued: false); value = SqlParameter.CoerceValue(value, metaTypeFromSqlDbType, out coercedToDataFeed, out typeChanged, allowStreaming: false); if (!coercedToDataFeed && ((isSqlType && !typeChanged) ? ((SqlString)value).Value.Length : ((string)value).Length) > metadata.length / 2) { throw SQL.BulkLoadStringTooLong(); } break; } case 98: value = ValidateBulkCopyVariant(value); typeChanged = true; break; case 240: throw ADP.DbTypeNotSupported("UDT"); case 241: if (value is XmlReader) { value = new XmlDataFeed((XmlReader)value); typeChanged = true; coercedToDataFeed = true; } break; default: throw SQL.BulkLoadCannotConvertValue(value.GetType(), metadata.metaType, null); } if (typeChanged) { isSqlType = false; } return value; } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } throw SQL.BulkLoadCannotConvertValue(value.GetType(), metadata.metaType, e); } } public void WriteToServer(DbDataReader reader) { if (reader == null) { throw new ArgumentNullException("reader"); } if (_isBulkCopyingInProgress) { throw SQL.BulkLoadPendingOperation(); } SqlStatistics statistics = Statistics; try { statistics = SqlStatistics.StartTimer(Statistics); _rowSource = reader; _DbDataReaderRowSource = reader; _SqlDataReaderRowSource = reader as SqlDataReader; _dataTableSource = null; _rowSourceType = ValueSourceType.DbDataReader; _isAsyncBulkCopy = false; WriteRowSourceToServerAsync(reader.FieldCount, CancellationToken.None); } finally { SqlStatistics.StopTimer(statistics); } } public void WriteToServer(IDataReader reader) { if (reader == null) { throw new ArgumentNullException("reader"); } if (_isBulkCopyingInProgress) { throw SQL.BulkLoadPendingOperation(); } SqlStatistics statistics = Statistics; try { statistics = SqlStatistics.StartTimer(Statistics); _rowSource = reader; _SqlDataReaderRowSource = _rowSource as SqlDataReader; _DbDataReaderRowSource = _rowSource as DbDataReader; _dataTableSource = null; _rowSourceType = ValueSourceType.IDataReader; _isAsyncBulkCopy = false; WriteRowSourceToServerAsync(reader.FieldCount, CancellationToken.None); } finally { SqlStatistics.StopTimer(statistics); } } public void WriteToServer(DataTable table) { WriteToServer(table, (DataRowState)0); } public void WriteToServer(DataTable table, DataRowState rowState) { if (table == null) { throw new ArgumentNullException("table"); } if (_isBulkCopyingInProgress) { throw SQL.BulkLoadPendingOperation(); } SqlStatistics statistics = Statistics; try { statistics = SqlStatistics.StartTimer(Statistics); _rowStateToSkip = ((rowState == (DataRowState)0 || rowState == DataRowState.Deleted) ? DataRowState.Deleted : (~rowState | DataRowState.Deleted)); _rowSource = table; _dataTableSource = table; _SqlDataReaderRowSource = null; _rowSourceType = ValueSourceType.DataTable; _rowEnumerator = table.Rows.GetEnumerator(); _isAsyncBulkCopy = false; WriteRowSourceToServerAsync(table.Columns.Count, CancellationToken.None); } finally { SqlStatistics.StopTimer(statistics); } } public void WriteToServer(DataRow[] rows) { SqlStatistics statistics = Statistics; if (rows == null) { throw new ArgumentNullException("rows"); } if (_isBulkCopyingInProgress) { throw SQL.BulkLoadPendingOperation(); } if (rows.Length == 0) { return; } try { statistics = SqlStatistics.StartTimer(Statistics); DataTable table = rows[0].Table; _rowStateToSkip = DataRowState.Deleted; _rowSource = rows; _dataTableSource = table; _SqlDataReaderRowSource = null; _rowSourceType = ValueSourceType.RowArray; _rowEnumerator = rows.GetEnumerator(); _isAsyncBulkCopy = false; WriteRowSourceToServerAsync(table.Columns.Count, CancellationToken.None); } finally { SqlStatistics.StopTimer(statistics); } } public Task WriteToServerAsync(DataRow[] rows) { return WriteToServerAsync(rows, CancellationToken.None); } public Task WriteToServerAsync(DataRow[] rows, CancellationToken cancellationToken) { Task task = null; if (rows == null) { throw new ArgumentNullException("rows"); } if (_isBulkCopyingInProgress) { throw SQL.BulkLoadPendingOperation(); } SqlStatistics statistics = Statistics; try { statistics = SqlStatistics.StartTimer(Statistics); if (rows.Length == 0) { return cancellationToken.IsCancellationRequested ? Task.FromCanceled(cancellationToken) : Task.CompletedTask; } DataTable table = rows[0].Table; _rowStateToSkip = DataRowState.Deleted; _rowSource = rows; _dataTableSource = table; _SqlDataReaderRowSource = null; _rowSourceType = ValueSourceType.RowArray; _rowEnumerator = rows.GetEnumerator(); _isAsyncBulkCopy = true; return WriteRowSourceToServerAsync(table.Columns.Count, cancellationToken); } finally { SqlStatistics.StopTimer(statistics); } } public Task WriteToServerAsync(DbDataReader reader) { return WriteToServerAsync(reader, CancellationToken.None); } public Task WriteToServerAsync(DbDataReader reader, CancellationToken cancellationToken) { Task task = null; if (reader == null) { throw new ArgumentNullException("reader"); } if (_isBulkCopyingInProgress) { throw SQL.BulkLoadPendingOperation(); } SqlStatistics statistics = Statistics; try { statistics = SqlStatistics.StartTimer(Statistics); _rowSource = reader; _SqlDataReaderRowSource = reader as SqlDataReader; _DbDataReaderRowSource = reader; _dataTableSource = null; _rowSourceType = ValueSourceType.DbDataReader; _isAsyncBulkCopy = true; return WriteRowSourceToServerAsync(reader.FieldCount, cancellationToken); } finally { SqlStatistics.StopTimer(statistics); } } public Task WriteToServerAsync(IDataReader reader) { return WriteToServerAsync(reader, CancellationToken.None); } public Task WriteToServerAsync(IDataReader reader, CancellationToken cancellationToken) { Task task = null; if (reader == null) { throw new ArgumentNullException("reader"); } if (_isBulkCopyingInProgress) { throw SQL.BulkLoadPendingOperation(); } SqlStatistics statistics = Statistics; try { statistics = SqlStatistics.StartTimer(Statistics); _rowSource = reader; _SqlDataReaderRowSource = _rowSource as SqlDataReader; _DbDataReaderRowSource = _rowSource as DbDataReader; _dataTableSource = null; _rowSourceType = ValueSourceType.IDataReader; _isAsyncBulkCopy = true; return WriteRowSourceToServerAsync(reader.FieldCount, cancellationToken); } finally { SqlStatistics.StopTimer(statistics); } } public Task WriteToServerAsync(DataTable table) { return WriteToServerAsync(table, (DataRowState)0, CancellationToken.None); } public Task WriteToServerAsync(DataTable table, CancellationToken cancellationToken) { return WriteToServerAsync(table, (DataRowState)0, cancellationToken); } public Task WriteToServerAsync(DataTable table, DataRowState rowState) { return WriteToServerAsync(table, rowState, CancellationToken.None); } public Task WriteToServerAsync(DataTable table, DataRowState rowState, CancellationToken cancellationToken) { Task task = null; if (table == null) { throw new ArgumentNullException("table"); } if (_isBulkCopyingInProgress) { throw SQL.BulkLoadPendingOperation(); } SqlStatistics statistics = Statistics; try { statistics = SqlStatistics.StartTimer(Statistics); _rowStateToSkip = ((rowState == (DataRowState)0 || rowState == DataRowState.Deleted) ? DataRowState.Deleted : (~rowState | DataRowState.Deleted)); _rowSource = table; _SqlDataReaderRowSource = null; _dataTableSource = table; _rowSourceType = ValueSourceType.DataTable; _rowEnumerator = table.Rows.GetEnumerator(); _isAsyncBulkCopy = true; return WriteRowSourceToServerAsync(table.Columns.Count, cancellationToken); } finally { SqlStatistics.StopTimer(statistics); } } private Task WriteRowSourceToServerAsync(int columnCount, CancellationToken ctoken) { Task currentReconnectionTask = _connection._currentReconnectionTask; if (currentReconnectionTask != null && !currentReconnectionTask.IsCompleted) { if (_isAsyncBulkCopy) { TaskCompletionSource tcs = new TaskCompletionSource(); currentReconnectionTask.ContinueWith(delegate { Task task2 = WriteRowSourceToServerAsync(columnCount, ctoken); if (task2 == null) { tcs.SetResult(null); } else { AsyncHelper.ContinueTask(task2, tcs, delegate { tcs.SetResult(null); }); } }, ctoken); return tcs.Task; } AsyncHelper.WaitForCompletion(currentReconnectionTask, BulkCopyTimeout, delegate { throw SQL.CR_ReconnectTimeout(); }, rethrowExceptions: false); } bool flag = true; _isBulkCopyingInProgress = true; CreateOrValidateConnection("WriteToServer"); SqlInternalConnectionTds openTdsConnection = _connection.GetOpenTdsConnection(); _parserLock = openTdsConnection._parserLock; _parserLock.Wait(_isAsyncBulkCopy); try { WriteRowSourceToServerCommon(columnCount); Task task = WriteToServerInternalAsync(ctoken); if (task != null) { flag = false; return task.ContinueWith(delegate(Task t) { AbortTransaction(); _isBulkCopyingInProgress = false; if (_parser != null) { _parser._asyncWrite = false; } if (_parserLock != null) { _parserLock.Release(); _parserLock = null; } return t; }, TaskScheduler.Default).Unwrap(); } return null; } catch (OutOfMemoryException e) { _connection.Abort(e); throw; } catch (StackOverflowException e2) { _connection.Abort(e2); throw; } catch (ThreadAbortException e3) { _connection.Abort(e3); throw; } finally { _columnMappings.ReadOnly = false; if (flag) { AbortTransaction(); _isBulkCopyingInProgress = false; if (_parser != null) { _parser._asyncWrite = false; } if (_parserLock != null) { _parserLock.Release(); _parserLock = null; } } } } private void WriteRowSourceToServerCommon(int columnCount) { bool flag = false; _columnMappings.ReadOnly = true; _localColumnMappings = _columnMappings; if (_localColumnMappings.Count > 0) { _localColumnMappings.ValidateCollection(); foreach (SqlBulkCopyColumnMapping localColumnMapping in _localColumnMappings) { if (localColumnMapping._internalSourceColumnOrdinal == -1) { flag = true; break; } } } else { _localColumnMappings = new SqlBulkCopyColumnMappingCollection(); _localColumnMappings.CreateDefaultMapping(columnCount); } if (!flag) { return; } int num = -1; flag = false; if (_localColumnMappings.Count <= 0) { return; } foreach (SqlBulkCopyColumnMapping localColumnMapping2 in _localColumnMappings) { if (localColumnMapping2._internalSourceColumnOrdinal != -1) { continue; } string text = UnquotedName(localColumnMapping2.SourceColumn); switch (_rowSourceType) { case ValueSourceType.DataTable: num = ((DataTable)_rowSource).Columns.IndexOf(text); break; case ValueSourceType.RowArray: num = ((DataRow[])_rowSource)[0].Table.Columns.IndexOf(text); break; case ValueSourceType.IDataReader: case ValueSourceType.DbDataReader: try { num = _DbDataReaderRowSource.GetOrdinal(text); } catch (IndexOutOfRangeException e) { throw SQL.BulkLoadNonMatchingColumnName(text, e); } break; } if (num == -1) { throw SQL.BulkLoadNonMatchingColumnName(text); } localColumnMapping2._internalSourceColumnOrdinal = num; } } internal void OnConnectionClosed() { _stateObj?.OnConnectionClosed(); } private void OnRowsCopied(SqlRowsCopiedEventArgs value) { _rowsCopiedEventHandler?.Invoke(this, value); } private bool FireRowsCopiedEvent(long rowsCopied) { SqlInternalConnectionTds openTdsConnection = _connection.GetOpenTdsConnection(); bool canBeReleasedFromAnyThread = openTdsConnection._parserLock.CanBeReleasedFromAnyThread; openTdsConnection._parserLock.Release(); SqlRowsCopiedEventArgs sqlRowsCopiedEventArgs = new SqlRowsCopiedEventArgs(rowsCopied); try { _insideRowsCopiedEvent = true; OnRowsCopied(sqlRowsCopiedEventArgs); } finally { _insideRowsCopiedEvent = false; openTdsConnection._parserLock.Wait(canBeReleasedFromAnyThread); } return sqlRowsCopiedEventArgs.Abort; } private Task ReadWriteColumnValueAsync(int col) { bool isSqlType; bool isDataFeed; bool isNull; object obj = GetValueFromSourceRow(col, out isSqlType, out isDataFeed, out isNull); _SqlMetaData metadata = _sortedColumnMappings[col]._metadata; if (!isDataFeed) { obj = ConvertValue(obj, metadata, isNull, ref isSqlType, out isDataFeed); } Task result = null; if (metadata.type != SqlDbType.Variant) { result = _parser.WriteBulkCopyValue(obj, metadata, _stateObj, isSqlType, isDataFeed, isNull); } else { SqlBuffer.StorageType storageType = SqlBuffer.StorageType.Empty; if (_SqlDataReaderRowSource != null && _connection.IsKatmaiOrNewer) { storageType = _SqlDataReaderRowSource.GetVariantInternalStorageType(_sortedColumnMappings[col]._sourceColumnOrdinal); } switch (storageType) { case SqlBuffer.StorageType.DateTime2: _parser.WriteSqlVariantDateTime2((DateTime)obj, _stateObj); break; case SqlBuffer.StorageType.Date: _parser.WriteSqlVariantDate((DateTime)obj, _stateObj); break; default: result = _parser.WriteSqlVariantDataRowValue(obj, _stateObj); break; } } return result; } private void RegisterForConnectionCloseNotification(ref Task outerTask) { (_connection ?? throw ADP.ClosedConnectionError()).RegisterForConnectionCloseNotification(ref outerTask, this, 3); } private Task CopyColumnsAsync(int col, TaskCompletionSource source = null) { Task result = null; Task task = null; try { int i; for (i = col; i < _sortedColumnMappings.Count; i++) { task = ReadWriteColumnValueAsync(i); if (task != null) { break; } } if (task != null) { if (source == null) { source = new TaskCompletionSource(); result = source.Task; } CopyColumnsAsyncSetupContinuation(source, task, i); return result; } source?.SetResult(null); } catch (Exception exception) { if (source == null) { throw; } source.TrySetException(exception); } return result; } private void CopyColumnsAsyncSetupContinuation(TaskCompletionSource source, Task task, int i) { AsyncHelper.ContinueTask(task, source, delegate { if (i + 1 < _sortedColumnMappings.Count) { CopyColumnsAsync(i + 1, source); } else { source.SetResult(null); } }, _connection.GetOpenTdsConnection()); } private void CheckAndRaiseNotification() { bool flag = false; Exception ex = null; _rowsCopied++; if (_notifyAfter > 0 && _rowsUntilNotification > 0 && --_rowsUntilNotification == 0) { try { _stateObj.BcpLock = true; flag = FireRowsCopiedEvent(_rowsCopied); if (ConnectionState.Open != _connection.State) { ex = ADP.OpenConnectionRequired("CheckAndRaiseNotification", _connection.State); } } catch (Exception ex2) { ex = (ADP.IsCatchableExceptionType(ex2) ? OperationAbortedException.Aborted(ex2) : ex2); } finally { _stateObj.BcpLock = false; } if (!flag) { _rowsUntilNotification = _notifyAfter; } } if (!flag && _rowsUntilNotification > _notifyAfter) { _rowsUntilNotification = _notifyAfter; } if (ex == null && flag) { ex = OperationAbortedException.Aborted(null); } if (_connection.State != ConnectionState.Open) { throw ADP.OpenConnectionRequired("WriteToServer", _connection.State); } if (ex != null) { _parser._asyncWrite = false; _parser.WriteBulkCopyDone(_stateObj); RunParser(); AbortTransaction(); throw ex; } } private Task CheckForCancellation(CancellationToken cts, TaskCompletionSource tcs) { if (cts.IsCancellationRequested) { if (tcs == null) { tcs = new TaskCompletionSource(); } tcs.SetCanceled(); return tcs.Task; } return null; } private TaskCompletionSource ContinueTaskPend(Task task, TaskCompletionSource source, Func> action) { if (task == null) { return action(); } AsyncHelper.ContinueTask(task, source, delegate { action(); }); return null; } private Task CopyRowsAsync(int rowsSoFar, int totalRows, CancellationToken cts, TaskCompletionSource source = null) { Task task = null; Task task2 = null; try { int i; for (i = rowsSoFar; totalRows <= 0 || i < totalRows; i++) { if (!_hasMoreRowToCopy) { break; } if (_isAsyncBulkCopy) { task = CheckForCancellation(cts, source); if (task != null) { return task; } } _stateObj.WriteByte(209); task2 = CopyColumnsAsync(0); if (task2 == null) { CheckAndRaiseNotification(); Task task3 = ReadFromRowSourceAsync(cts); if (task3 != null) { if (source == null) { source = new TaskCompletionSource(); } task = source.Task; AsyncHelper.ContinueTask(task3, source, delegate { CopyRowsAsync(i + 1, totalRows, cts, source); }, _connection.GetOpenTdsConnection()); return task; } continue; } source = source ?? new TaskCompletionSource(); task = source.Task; AsyncHelper.ContinueTask(task2, source, delegate { CheckAndRaiseNotification(); Task task4 = ReadFromRowSourceAsync(cts); if (task4 == null) { CopyRowsAsync(i + 1, totalRows, cts, source); } else { AsyncHelper.ContinueTask(task4, source, delegate { CopyRowsAsync(i + 1, totalRows, cts, source); }, _connection.GetOpenTdsConnection()); } }, _connection.GetOpenTdsConnection()); return task; } if (source != null) { source.TrySetResult(null); } } catch (Exception exception) { if (source == null) { throw; } source.TrySetException(exception); } return task; } private Task CopyBatchesAsync(BulkCopySimpleResultSet internalResults, string updateBulkCommandText, CancellationToken cts, TaskCompletionSource source = null) { try { while (_hasMoreRowToCopy) { SqlInternalConnectionTds openTdsConnection = _connection.GetOpenTdsConnection(); if (IsCopyOption(SqlBulkCopyOptions.UseInternalTransaction)) { openTdsConnection.ThreadHasParserLockForClose = true; try { _internalTransaction = _connection.BeginTransaction(); } finally { openTdsConnection.ThreadHasParserLockForClose = false; } } Task task = SubmitUpdateBulkCommand(updateBulkCommandText); if (task == null) { Task task2 = CopyBatchesAsyncContinued(internalResults, updateBulkCommandText, cts, source); if (task2 != null) { return task2; } continue; } if (source == null) { source = new TaskCompletionSource(); } AsyncHelper.ContinueTask(task, source, delegate { if (CopyBatchesAsyncContinued(internalResults, updateBulkCommandText, cts, source) == null) { CopyBatchesAsync(internalResults, updateBulkCommandText, cts, source); } }, _connection.GetOpenTdsConnection()); return source.Task; } } catch (Exception exception) { if (source != null) { source.TrySetException(exception); return source.Task; } throw; } if (source != null) { source.SetResult(null); return source.Task; } return null; } private Task CopyBatchesAsyncContinued(BulkCopySimpleResultSet internalResults, string updateBulkCommandText, CancellationToken cts, TaskCompletionSource source) { try { WriteMetaData(internalResults); Task task = CopyRowsAsync(0, _savedBatchSize, cts); if (task != null) { if (source == null) { source = new TaskCompletionSource(); } AsyncHelper.ContinueTask(task, source, delegate { if (CopyBatchesAsyncContinuedOnSuccess(internalResults, updateBulkCommandText, cts, source) == null) { CopyBatchesAsync(internalResults, updateBulkCommandText, cts, source); } }, _connection.GetOpenTdsConnection(), delegate { CopyBatchesAsyncContinuedOnError(cleanupParser: false); }, delegate { CopyBatchesAsyncContinuedOnError(cleanupParser: true); }); return source.Task; } return CopyBatchesAsyncContinuedOnSuccess(internalResults, updateBulkCommandText, cts, source); } catch (Exception exception) { if (source != null) { source.TrySetException(exception); return source.Task; } throw; } } private Task CopyBatchesAsyncContinuedOnSuccess(BulkCopySimpleResultSet internalResults, string updateBulkCommandText, CancellationToken cts, TaskCompletionSource source) { try { Task task = _parser.WriteBulkCopyDone(_stateObj); if (task == null) { RunParser(); CommitTransaction(); return null; } if (source == null) { source = new TaskCompletionSource(); } AsyncHelper.ContinueTask(task, source, delegate { try { RunParser(); CommitTransaction(); } catch (Exception) { CopyBatchesAsyncContinuedOnError(cleanupParser: false); throw; } CopyBatchesAsync(internalResults, updateBulkCommandText, cts, source); }, _connection.GetOpenTdsConnection(), delegate { CopyBatchesAsyncContinuedOnError(cleanupParser: false); }); return source.Task; } catch (Exception exception) { if (source != null) { source.TrySetException(exception); return source.Task; } throw; } } private void CopyBatchesAsyncContinuedOnError(bool cleanupParser) { SqlInternalConnectionTds openTdsConnection = _connection.GetOpenTdsConnection(); try { if (cleanupParser && _parser != null && _stateObj != null) { _parser._asyncWrite = false; _parser.WriteBulkCopyDone(_stateObj); RunParser(); } if (_stateObj != null) { CleanUpStateObjectOnError(); } } catch (OutOfMemoryException) { openTdsConnection.DoomThisConnection(); throw; } catch (StackOverflowException) { openTdsConnection.DoomThisConnection(); throw; } catch (ThreadAbortException) { openTdsConnection.DoomThisConnection(); throw; } AbortTransaction(); } private void CleanUpStateObjectOnError() { if (_stateObj == null) { return; } _parser.Connection.ThreadHasParserLockForClose = true; try { _stateObj.ResetBuffer(); _stateObj._outputPacketNumber = 1; if (_parser.State == TdsParserState.OpenNotLoggedIn || _parser.State == TdsParserState.OpenLoggedIn) { _stateObj.CancelRequest(); } _stateObj._internalTimeout = false; _stateObj.CloseSession(); _stateObj._bulkCopyOpperationInProgress = false; _stateObj._bulkCopyWriteTimeout = false; _stateObj = null; } finally { _parser.Connection.ThreadHasParserLockForClose = false; } } private void WriteToServerInternalRestContinuedAsync(BulkCopySimpleResultSet internalResults, CancellationToken cts, TaskCompletionSource source) { Task task = null; string text = null; try { text = AnalyzeTargetAndCreateUpdateBulkCommand(internalResults); if (_sortedColumnMappings.Count != 0) { _stateObj.SniContext = SniContext.Snix_SendRows; _savedBatchSize = _batchSize; _rowsUntilNotification = _notifyAfter; _rowsCopied = 0; _currentRowMetadata = new SourceColumnMetadata[_sortedColumnMappings.Count]; for (int i = 0; i < _currentRowMetadata.Length; i++) { _currentRowMetadata[i] = GetColumnMetadata(i); } task = CopyBatchesAsync(internalResults, text, cts); } if (task != null) { if (source == null) { source = new TaskCompletionSource(); } AsyncHelper.ContinueTask(task, source, delegate { if (task.IsCanceled) { _localColumnMappings = null; try { CleanUpStateObjectOnError(); return; } finally { source.SetCanceled(); } } if (task.Exception != null) { source.SetException(task.Exception.InnerException); return; } _localColumnMappings = null; try { CleanUpStateObjectOnError(); } finally { if (source != null) { if (cts.IsCancellationRequested) { source.SetCanceled(); } else { source.SetResult(null); } } } }, _connection.GetOpenTdsConnection()); } else { _localColumnMappings = null; try { CleanUpStateObjectOnError(); } catch (Exception) { } if (source != null) { source.SetResult(null); } } } catch (Exception exception) { _localColumnMappings = null; try { CleanUpStateObjectOnError(); } catch (Exception) { } if (source != null) { source.TrySetException(exception); return; } throw; } } private void WriteToServerInternalRestAsync(CancellationToken cts, TaskCompletionSource source) { _hasMoreRowToCopy = true; Task internalResultsTask = null; BulkCopySimpleResultSet result = new BulkCopySimpleResultSet(); SqlInternalConnectionTds openTdsConnection = _connection.GetOpenTdsConnection(); try { _parser = _connection.Parser; _parser._asyncWrite = _isAsyncBulkCopy; Task task; try { task = _connection.ValidateAndReconnect(delegate { if (_parserLock != null) { _parserLock.Release(); _parserLock = null; } }, BulkCopyTimeout); } catch (SqlException inner) { throw SQL.BulkLoadInvalidDestinationTable(_destinationTableName, inner); } if (task != null) { if (_isAsyncBulkCopy) { CancellationTokenRegistration regReconnectCancel = default(CancellationTokenRegistration); TaskCompletionSource cancellableReconnectTS = new TaskCompletionSource(); if (cts.CanBeCanceled) { regReconnectCancel = cts.Register(delegate(object s) { ((TaskCompletionSource)s).TrySetCanceled(); }, cancellableReconnectTS); } AsyncHelper.ContinueTask(task, cancellableReconnectTS, delegate { cancellableReconnectTS.SetResult(null); }); AsyncHelper.SetTimeoutException(cancellableReconnectTS, BulkCopyTimeout, () => SQL.BulkLoadInvalidDestinationTable(_destinationTableName, SQL.CR_ReconnectTimeout()), CancellationToken.None); AsyncHelper.ContinueTask(cancellableReconnectTS.Task, source, delegate { regReconnectCancel.Dispose(); if (_parserLock != null) { _parserLock.Release(); _parserLock = null; } _parserLock = _connection.GetOpenTdsConnection()._parserLock; _parserLock.Wait(canReleaseFromAnyThread: true); WriteToServerInternalRestAsync(cts, source); }, null, delegate { regReconnectCancel.Dispose(); }, delegate { regReconnectCancel.Dispose(); }, (Exception ex) => SQL.BulkLoadInvalidDestinationTable(_destinationTableName, ex), _connection); return; } try { AsyncHelper.WaitForCompletion(task, BulkCopyTimeout, delegate { throw SQL.CR_ReconnectTimeout(); }); } catch (SqlException inner2) { throw SQL.BulkLoadInvalidDestinationTable(_destinationTableName, inner2); } _parserLock = _connection.GetOpenTdsConnection()._parserLock; _parserLock.Wait(canReleaseFromAnyThread: false); WriteToServerInternalRestAsync(cts, source); return; } if (_isAsyncBulkCopy) { _connection.AddWeakReference(this, 3); } openTdsConnection.ThreadHasParserLockForClose = true; try { _stateObj = _parser.GetSession(this); _stateObj._bulkCopyOpperationInProgress = true; _stateObj.StartSession(this); } finally { openTdsConnection.ThreadHasParserLockForClose = false; } try { internalResultsTask = CreateAndExecuteInitialQueryAsync(out result); } catch (SqlException inner3) { throw SQL.BulkLoadInvalidDestinationTable(_destinationTableName, inner3); } if (internalResultsTask != null) { AsyncHelper.ContinueTask(internalResultsTask, source, delegate { WriteToServerInternalRestContinuedAsync(internalResultsTask.Result, cts, source); }, _connection.GetOpenTdsConnection()); } else { WriteToServerInternalRestContinuedAsync(result, cts, source); } } catch (Exception exception) { if (source != null) { source.TrySetException(exception); return; } throw; } } private Task WriteToServerInternalAsync(CancellationToken ctoken) { TaskCompletionSource source = null; Task outerTask = null; if (_isAsyncBulkCopy) { source = new TaskCompletionSource(); outerTask = source.Task; RegisterForConnectionCloseNotification(ref outerTask); } if (_destinationTableName == null) { if (source != null) { source.SetException(SQL.BulkLoadMissingDestinationTable()); return outerTask; } throw SQL.BulkLoadMissingDestinationTable(); } try { Task task = ReadFromRowSourceAsync(ctoken); if (task == null) { if (!_hasMoreRowToCopy) { if (source != null) { source.SetResult(null); } return outerTask; } WriteToServerInternalRestAsync(ctoken, source); return outerTask; } AsyncHelper.ContinueTask(task, source, delegate { if (!_hasMoreRowToCopy) { source.SetResult(null); } else { WriteToServerInternalRestAsync(ctoken, source); } }, _connection.GetOpenTdsConnection()); return outerTask; } catch (Exception exception) { if (source != null) { source.TrySetException(exception); return outerTask; } throw; } } } public sealed class SqlBulkCopyColumnMapping { internal string _destinationColumnName; internal int _destinationColumnOrdinal; internal string _sourceColumnName; internal int _sourceColumnOrdinal; internal int _internalDestinationColumnOrdinal; internal int _internalSourceColumnOrdinal; public string DestinationColumn { get { if (_destinationColumnName != null) { return _destinationColumnName; } return string.Empty; } set { _destinationColumnOrdinal = (_internalDestinationColumnOrdinal = -1); _destinationColumnName = value; } } public int DestinationOrdinal { get { return _destinationColumnOrdinal; } set { if (value >= 0) { _destinationColumnName = null; _destinationColumnOrdinal = (_internalDestinationColumnOrdinal = value); return; } throw ADP.IndexOutOfRange(value); } } public string SourceColumn { get { if (_sourceColumnName != null) { return _sourceColumnName; } return string.Empty; } set { _sourceColumnOrdinal = (_internalSourceColumnOrdinal = -1); _sourceColumnName = value; } } public int SourceOrdinal { get { return _sourceColumnOrdinal; } set { if (value >= 0) { _sourceColumnName = null; _sourceColumnOrdinal = (_internalSourceColumnOrdinal = value); return; } throw ADP.IndexOutOfRange(value); } } public SqlBulkCopyColumnMapping() { _internalSourceColumnOrdinal = -1; } public SqlBulkCopyColumnMapping(string sourceColumn, string destinationColumn) { SourceColumn = sourceColumn; DestinationColumn = destinationColumn; } public SqlBulkCopyColumnMapping(int sourceColumnOrdinal, string destinationColumn) { SourceOrdinal = sourceColumnOrdinal; DestinationColumn = destinationColumn; } public SqlBulkCopyColumnMapping(string sourceColumn, int destinationOrdinal) { SourceColumn = sourceColumn; DestinationOrdinal = destinationOrdinal; } public SqlBulkCopyColumnMapping(int sourceColumnOrdinal, int destinationOrdinal) { SourceOrdinal = sourceColumnOrdinal; DestinationOrdinal = destinationOrdinal; } } public sealed class SqlBulkCopyColumnMappingCollection : CollectionBase { private enum MappingSchema { Undefined, NamesNames, NemesOrdinals, OrdinalsNames, OrdinalsOrdinals } private MappingSchema _mappingSchema; internal bool ReadOnly { get; set; } public SqlBulkCopyColumnMapping this[int index] => (SqlBulkCopyColumnMapping)base.List[index]; internal SqlBulkCopyColumnMappingCollection() { } public SqlBulkCopyColumnMapping Add(SqlBulkCopyColumnMapping bulkCopyColumnMapping) { AssertWriteAccess(); if ((string.IsNullOrEmpty(bulkCopyColumnMapping.SourceColumn) && bulkCopyColumnMapping.SourceOrdinal == -1) || (string.IsNullOrEmpty(bulkCopyColumnMapping.DestinationColumn) && bulkCopyColumnMapping.DestinationOrdinal == -1)) { throw SQL.BulkLoadNonMatchingColumnMapping(); } base.InnerList.Add(bulkCopyColumnMapping); return bulkCopyColumnMapping; } public SqlBulkCopyColumnMapping Add(string sourceColumn, string destinationColumn) { AssertWriteAccess(); return Add(new SqlBulkCopyColumnMapping(sourceColumn, destinationColumn)); } public SqlBulkCopyColumnMapping Add(int sourceColumnIndex, string destinationColumn) { AssertWriteAccess(); return Add(new SqlBulkCopyColumnMapping(sourceColumnIndex, destinationColumn)); } public SqlBulkCopyColumnMapping Add(string sourceColumn, int destinationColumnIndex) { AssertWriteAccess(); return Add(new SqlBulkCopyColumnMapping(sourceColumn, destinationColumnIndex)); } public SqlBulkCopyColumnMapping Add(int sourceColumnIndex, int destinationColumnIndex) { AssertWriteAccess(); return Add(new SqlBulkCopyColumnMapping(sourceColumnIndex, destinationColumnIndex)); } private void AssertWriteAccess() { if (ReadOnly) { throw SQL.BulkLoadMappingInaccessible(); } } public new void Clear() { AssertWriteAccess(); base.Clear(); } public bool Contains(SqlBulkCopyColumnMapping value) { return base.InnerList.Contains(value); } public void CopyTo(SqlBulkCopyColumnMapping[] array, int index) { base.InnerList.CopyTo(array, index); } internal void CreateDefaultMapping(int columnCount) { for (int i = 0; i < columnCount; i++) { base.InnerList.Add(new SqlBulkCopyColumnMapping(i, i)); } } public int IndexOf(SqlBulkCopyColumnMapping value) { return base.InnerList.IndexOf(value); } public void Insert(int index, SqlBulkCopyColumnMapping value) { AssertWriteAccess(); base.InnerList.Insert(index, value); } public void Remove(SqlBulkCopyColumnMapping value) { AssertWriteAccess(); base.InnerList.Remove(value); } public new void RemoveAt(int index) { AssertWriteAccess(); base.RemoveAt(index); } internal void ValidateCollection() { foreach (SqlBulkCopyColumnMapping inner in base.InnerList) { MappingSchema mappingSchema = ((inner.SourceOrdinal == -1) ? ((inner.DestinationOrdinal == -1) ? MappingSchema.NamesNames : MappingSchema.NemesOrdinals) : ((inner.DestinationOrdinal != -1) ? MappingSchema.OrdinalsOrdinals : MappingSchema.OrdinalsNames)); if (_mappingSchema == MappingSchema.Undefined) { _mappingSchema = mappingSchema; } else if (_mappingSchema != mappingSchema) { throw SQL.BulkLoadMappingsNamesOrOrdinalsOnly(); } } } } [Flags] public enum SqlBulkCopyOptions { Default = 0, KeepIdentity = 1, CheckConstraints = 2, TableLock = 4, KeepNulls = 8, FireTriggers = 0x10, UseInternalTransaction = 0x20, AllowEncryptedValueModifications = 0x40 } internal sealed class SqlCachedBuffer : INullable { public static readonly SqlCachedBuffer Null = new SqlCachedBuffer(); private const int _maxChunkSize = 2048; private List _cachedBytes; internal List CachedBytes => _cachedBytes; public bool IsNull { get { if (_cachedBytes != null) { return false; } return true; } } private SqlCachedBuffer() { } private SqlCachedBuffer(List cachedBytes) { _cachedBytes = cachedBytes; } internal static bool TryCreate(SqlMetaDataPriv metadata, TdsParser parser, TdsParserStateObject stateObj, out SqlCachedBuffer buffer) { int num = 0; List list = new List(); buffer = null; if (!parser.TryPlpBytesLeft(stateObj, out var left)) { return false; } while (left != 0L) { do { num = (int)((left > 2048) ? 2048 : left); byte[] buff = new byte[num]; if (!stateObj.TryReadPlpBytes(ref buff, 0, num, out num)) { return false; } if (list.Count == 0) { AddByteOrderMark(buff, list); } list.Add(buff); left -= (ulong)num; } while (left != 0); if (!parser.TryPlpBytesLeft(stateObj, out left)) { return false; } if (left == 0) { break; } } buffer = new SqlCachedBuffer(list); return true; } private static void AddByteOrderMark(byte[] byteArr, List cachedBytes) { if (byteArr.Length < 2 || byteArr[0] != 223 || byteArr[1] != byte.MaxValue) { cachedBytes.Add(TdsEnums.XMLUNICODEBOMBYTES); } } internal Stream ToStream() { return new SqlCachedStream(this); } public override string ToString() { if (IsNull) { throw new SqlNullValueException(); } if (_cachedBytes.Count == 0) { return string.Empty; } return new SqlXml(ToStream()).Value; } internal SqlString ToSqlString() { if (IsNull) { return SqlString.Null; } return new SqlString(ToString()); } internal SqlXml ToSqlXml() { return new SqlXml(ToStream()); } [MethodImpl(MethodImplOptions.NoInlining)] internal XmlReader ToXmlReader() { return SqlTypeWorkarounds.SqlXmlCreateSqlXmlReader(ToStream()); } } internal static class SqlClientDiagnosticListenerExtensions { public const string DiagnosticListenerName = "SqlClientDiagnosticListener"; private const string SqlClientPrefix = "System.Data.SqlClient."; public const string SqlBeforeExecuteCommand = "System.Data.SqlClient.WriteCommandBefore"; public const string SqlAfterExecuteCommand = "System.Data.SqlClient.WriteCommandAfter"; public const string SqlErrorExecuteCommand = "System.Data.SqlClient.WriteCommandError"; public const string SqlBeforeOpenConnection = "System.Data.SqlClient.WriteConnectionOpenBefore"; public const string SqlAfterOpenConnection = "System.Data.SqlClient.WriteConnectionOpenAfter"; public const string SqlErrorOpenConnection = "System.Data.SqlClient.WriteConnectionOpenError"; public const string SqlBeforeCloseConnection = "System.Data.SqlClient.WriteConnectionCloseBefore"; public const string SqlAfterCloseConnection = "System.Data.SqlClient.WriteConnectionCloseAfter"; public const string SqlErrorCloseConnection = "System.Data.SqlClient.WriteConnectionCloseError"; public const string SqlBeforeCommitTransaction = "System.Data.SqlClient.WriteTransactionCommitBefore"; public const string SqlAfterCommitTransaction = "System.Data.SqlClient.WriteTransactionCommitAfter"; public const string SqlErrorCommitTransaction = "System.Data.SqlClient.WriteTransactionCommitError"; public const string SqlBeforeRollbackTransaction = "System.Data.SqlClient.WriteTransactionRollbackBefore"; public const string SqlAfterRollbackTransaction = "System.Data.SqlClient.WriteTransactionRollbackAfter"; public const string SqlErrorRollbackTransaction = "System.Data.SqlClient.WriteTransactionRollbackError"; public static Guid WriteCommandBefore(this DiagnosticListener @this, SqlCommand sqlCommand, [CallerMemberName] string operation = "") { if (@this.IsEnabled("System.Data.SqlClient.WriteCommandBefore")) { Guid guid = Guid.NewGuid(); @this.Write("System.Data.SqlClient.WriteCommandBefore", new { OperationId = guid, Operation = operation, ConnectionId = sqlCommand.Connection?.ClientConnectionId, Command = sqlCommand }); return guid; } return Guid.Empty; } public static void WriteCommandAfter(this DiagnosticListener @this, Guid operationId, SqlCommand sqlCommand, [CallerMemberName] string operation = "") { if (@this.IsEnabled("System.Data.SqlClient.WriteCommandAfter")) { @this.Write("System.Data.SqlClient.WriteCommandAfter", new { OperationId = operationId, Operation = operation, ConnectionId = sqlCommand.Connection?.ClientConnectionId, Command = sqlCommand, Statistics = sqlCommand.Statistics?.GetDictionary(), Timestamp = Stopwatch.GetTimestamp() }); } } public static void WriteCommandError(this DiagnosticListener @this, Guid operationId, SqlCommand sqlCommand, Exception ex, [CallerMemberName] string operation = "") { if (@this.IsEnabled("System.Data.SqlClient.WriteCommandError")) { @this.Write("System.Data.SqlClient.WriteCommandError", new { OperationId = operationId, Operation = operation, ConnectionId = sqlCommand.Connection?.ClientConnectionId, Command = sqlCommand, Exception = ex, Timestamp = Stopwatch.GetTimestamp() }); } } public static Guid WriteConnectionOpenBefore(this DiagnosticListener @this, SqlConnection sqlConnection, [CallerMemberName] string operation = "") { if (@this.IsEnabled("System.Data.SqlClient.WriteConnectionOpenBefore")) { Guid guid = Guid.NewGuid(); @this.Write("System.Data.SqlClient.WriteConnectionOpenBefore", new { OperationId = guid, Operation = operation, Connection = sqlConnection, Timestamp = Stopwatch.GetTimestamp() }); return guid; } return Guid.Empty; } public static void WriteConnectionOpenAfter(this DiagnosticListener @this, Guid operationId, SqlConnection sqlConnection, [CallerMemberName] string operation = "") { if (@this.IsEnabled("System.Data.SqlClient.WriteConnectionOpenAfter")) { @this.Write("System.Data.SqlClient.WriteConnectionOpenAfter", new { OperationId = operationId, Operation = operation, ConnectionId = sqlConnection.ClientConnectionId, Connection = sqlConnection, Statistics = sqlConnection.Statistics?.GetDictionary(), Timestamp = Stopwatch.GetTimestamp() }); } } public static void WriteConnectionOpenError(this DiagnosticListener @this, Guid operationId, SqlConnection sqlConnection, Exception ex, [CallerMemberName] string operation = "") { if (@this.IsEnabled("System.Data.SqlClient.WriteConnectionOpenError")) { @this.Write("System.Data.SqlClient.WriteConnectionOpenError", new { OperationId = operationId, Operation = operation, ConnectionId = sqlConnection.ClientConnectionId, Connection = sqlConnection, Exception = ex, Timestamp = Stopwatch.GetTimestamp() }); } } public static Guid WriteConnectionCloseBefore(this DiagnosticListener @this, SqlConnection sqlConnection, [CallerMemberName] string operation = "") { if (@this.IsEnabled("System.Data.SqlClient.WriteConnectionCloseBefore")) { Guid guid = Guid.NewGuid(); @this.Write("System.Data.SqlClient.WriteConnectionCloseBefore", new { OperationId = guid, Operation = operation, ConnectionId = sqlConnection.ClientConnectionId, Connection = sqlConnection, Statistics = sqlConnection.Statistics?.GetDictionary(), Timestamp = Stopwatch.GetTimestamp() }); return guid; } return Guid.Empty; } public static void WriteConnectionCloseAfter(this DiagnosticListener @this, Guid operationId, Guid clientConnectionId, SqlConnection sqlConnection, [CallerMemberName] string operation = "") { if (@this.IsEnabled("System.Data.SqlClient.WriteConnectionCloseAfter")) { @this.Write("System.Data.SqlClient.WriteConnectionCloseAfter", new { OperationId = operationId, Operation = operation, ConnectionId = clientConnectionId, Connection = sqlConnection, Statistics = sqlConnection.Statistics?.GetDictionary(), Timestamp = Stopwatch.GetTimestamp() }); } } public static void WriteConnectionCloseError(this DiagnosticListener @this, Guid operationId, Guid clientConnectionId, SqlConnection sqlConnection, Exception ex, [CallerMemberName] string operation = "") { if (@this.IsEnabled("System.Data.SqlClient.WriteConnectionCloseError")) { @this.Write("System.Data.SqlClient.WriteConnectionCloseError", new { OperationId = operationId, Operation = operation, ConnectionId = clientConnectionId, Connection = sqlConnection, Statistics = sqlConnection.Statistics?.GetDictionary(), Exception = ex, Timestamp = Stopwatch.GetTimestamp() }); } } public static Guid WriteTransactionCommitBefore(this DiagnosticListener @this, IsolationLevel isolationLevel, SqlConnection connection, [CallerMemberName] string operation = "") { if (@this.IsEnabled("System.Data.SqlClient.WriteTransactionCommitBefore")) { Guid guid = Guid.NewGuid(); @this.Write("System.Data.SqlClient.WriteTransactionCommitBefore", new { OperationId = guid, Operation = operation, IsolationLevel = isolationLevel, Connection = connection, Timestamp = Stopwatch.GetTimestamp() }); return guid; } return Guid.Empty; } public static void WriteTransactionCommitAfter(this DiagnosticListener @this, Guid operationId, IsolationLevel isolationLevel, SqlConnection connection, [CallerMemberName] string operation = "") { if (@this.IsEnabled("System.Data.SqlClient.WriteTransactionCommitAfter")) { @this.Write("System.Data.SqlClient.WriteTransactionCommitAfter", new { OperationId = operationId, Operation = operation, IsolationLevel = isolationLevel, Connection = connection, Timestamp = Stopwatch.GetTimestamp() }); } } public static void WriteTransactionCommitError(this DiagnosticListener @this, Guid operationId, IsolationLevel isolationLevel, SqlConnection connection, Exception ex, [CallerMemberName] string operation = "") { if (@this.IsEnabled("System.Data.SqlClient.WriteTransactionCommitError")) { @this.Write("System.Data.SqlClient.WriteTransactionCommitError", new { OperationId = operationId, Operation = operation, IsolationLevel = isolationLevel, Connection = connection, Exception = ex, Timestamp = Stopwatch.GetTimestamp() }); } } public static Guid WriteTransactionRollbackBefore(this DiagnosticListener @this, IsolationLevel isolationLevel, SqlConnection connection, string transactionName, [CallerMemberName] string operation = "") { if (@this.IsEnabled("System.Data.SqlClient.WriteTransactionRollbackBefore")) { Guid guid = Guid.NewGuid(); @this.Write("System.Data.SqlClient.WriteTransactionRollbackBefore", new { OperationId = guid, Operation = operation, IsolationLevel = isolationLevel, Connection = connection, TransactionName = transactionName, Timestamp = Stopwatch.GetTimestamp() }); return guid; } return Guid.Empty; } public static void WriteTransactionRollbackAfter(this DiagnosticListener @this, Guid operationId, IsolationLevel isolationLevel, SqlConnection connection, string transactionName, [CallerMemberName] string operation = "") { if (@this.IsEnabled("System.Data.SqlClient.WriteTransactionRollbackAfter")) { @this.Write("System.Data.SqlClient.WriteTransactionRollbackAfter", new { OperationId = operationId, Operation = operation, IsolationLevel = isolationLevel, Connection = connection, TransactionName = transactionName, Timestamp = Stopwatch.GetTimestamp() }); } } public static void WriteTransactionRollbackError(this DiagnosticListener @this, Guid operationId, IsolationLevel isolationLevel, SqlConnection connection, string transactionName, Exception ex, [CallerMemberName] string operation = "") { if (@this.IsEnabled("System.Data.SqlClient.WriteTransactionRollbackError")) { @this.Write("System.Data.SqlClient.WriteTransactionRollbackError", new { OperationId = operationId, Operation = operation, IsolationLevel = isolationLevel, Connection = connection, TransactionName = transactionName, Exception = ex, Timestamp = Stopwatch.GetTimestamp() }); } } } public sealed class SqlClientFactory : DbProviderFactory, IServiceProvider { public static readonly SqlClientFactory Instance = new SqlClientFactory(); public override bool CanCreateDataSourceEnumerator => true; private SqlClientFactory() { } public override DbCommand CreateCommand() { return new SqlCommand(); } public override DbCommandBuilder CreateCommandBuilder() { return new SqlCommandBuilder(); } public override DbConnection CreateConnection() { return new SqlConnection(); } public override DbConnectionStringBuilder CreateConnectionStringBuilder() { return new SqlConnectionStringBuilder(); } public override DbDataAdapter CreateDataAdapter() { return new SqlDataAdapter(); } public override DbParameter CreateParameter() { return new SqlParameter(); } public override DbDataSourceEnumerator CreateDataSourceEnumerator() { return SqlDataSourceEnumerator.Instance; } public override CodeAccessPermission CreatePermission(PermissionState state) { return (CodeAccessPermission)(object)new SqlClientPermission(state); } object IServiceProvider.GetService(Type serviceType) { ThrowStub.ThrowNotSupportedException(); return null; } } public static class SqlClientMetaDataCollectionNames { public static readonly string Columns = "Columns"; public static readonly string Databases = "Databases"; public static readonly string ForeignKeys = "ForeignKeys"; public static readonly string IndexColumns = "IndexColumns"; public static readonly string Indexes = "Indexes"; public static readonly string Parameters = "Parameters"; public static readonly string ProcedureColumns = "ProcedureColumns"; public static readonly string Procedures = "Procedures"; public static readonly string Tables = "Tables"; public static readonly string UserDefinedTypes = "UserDefinedTypes"; public static readonly string Users = "Users"; public static readonly string ViewColumns = "ViewColumns"; public static readonly string Views = "Views"; } public sealed class SqlCommand : DbCommand, ICloneable, IDbCommand, IDisposable { private enum EXECTYPE { UNPREPARED, PREPAREPENDING, PREPARED } private class CachedAsyncState { private int _cachedAsyncCloseCount = -1; private TaskCompletionSource _cachedAsyncResult; private SqlConnection _cachedAsyncConnection; private SqlDataReader _cachedAsyncReader; private RunBehavior _cachedRunBehavior = RunBehavior.ReturnImmediately; private string _cachedSetOptions; private string _cachedEndMethod; internal SqlDataReader CachedAsyncReader => _cachedAsyncReader; internal RunBehavior CachedRunBehavior => _cachedRunBehavior; internal string CachedSetOptions => _cachedSetOptions; internal bool PendingAsyncOperation => _cachedAsyncResult != null; internal string EndMethodName => _cachedEndMethod; internal CachedAsyncState() { } internal bool IsActiveConnectionValid(SqlConnection activeConnection) { if (_cachedAsyncConnection == activeConnection) { return _cachedAsyncCloseCount == activeConnection.CloseCount; } return false; } internal void ResetAsyncState() { _cachedAsyncCloseCount = -1; _cachedAsyncResult = null; if (_cachedAsyncConnection != null) { _cachedAsyncConnection.AsyncCommandInProgress = false; _cachedAsyncConnection = null; } _cachedAsyncReader = null; _cachedRunBehavior = RunBehavior.ReturnImmediately; _cachedSetOptions = null; _cachedEndMethod = null; } internal void SetActiveConnectionAndResult(TaskCompletionSource completion, string endMethod, SqlConnection activeConnection) { TdsParser tdsParser = activeConnection?.Parser; if (tdsParser == null || tdsParser.State == TdsParserState.Closed || tdsParser.State == TdsParserState.Broken) { throw ADP.ClosedConnectionError(); } _cachedAsyncCloseCount = activeConnection.CloseCount; _cachedAsyncResult = completion; if (!tdsParser.MARSOn && activeConnection.AsyncCommandInProgress) { throw SQL.MARSUnspportedOnConnection(); } _cachedAsyncConnection = activeConnection; _cachedAsyncConnection.AsyncCommandInProgress = true; _cachedEndMethod = endMethod; } internal void SetAsyncReaderState(SqlDataReader ds, RunBehavior runBehavior, string optionSettings) { _cachedAsyncReader = ds; _cachedRunBehavior = runBehavior; _cachedSetOptions = optionSettings; } } private enum ProcParamsColIndex { ParameterName, ParameterType, DataType, ManagedDataType, CharacterMaximumLength, NumericPrecision, NumericScale, TypeCatalogName, TypeSchemaName, TypeName, XmlSchemaCollectionCatalogName, XmlSchemaCollectionSchemaName, XmlSchemaCollectionName, UdtTypeName, DateTimeScale } private string _commandText; private CommandType _commandType; private int _commandTimeout; private UpdateRowSource _updatedRowSource; private bool _designTimeInvisible; internal SqlDependency _sqlDep; private static readonly DiagnosticListener _diagnosticListener = new DiagnosticListener("SqlClientDiagnosticListener"); private bool _parentOperationStarted; private bool _inPrepare; private int _prepareHandle; private bool _hiddenPrepare; private int _preparedConnectionCloseCount; private int _preparedConnectionReconnectCount; private SqlParameterCollection _parameters; private SqlConnection _activeConnection; private bool _dirty; private EXECTYPE _execType; private _SqlRPC[] _rpcArrayOf1; private _SqlMetaDataSet _cachedMetaData; private TaskCompletionSource _reconnectionCompletionSource; private CachedAsyncState _cachedAsyncState; internal int _rowsAffected; private SqlNotificationRequest _notification; private SqlTransaction _transaction; private StatementCompletedEventHandler _statementCompletedEventHandler; private TdsParserStateObject _stateObj; private volatile bool _pendingCancel; private bool _batchRPCMode; private List<_SqlRPC> _RPCList; private _SqlRPC[] _SqlRPCBatchArray; private List _parameterCollectionList; private int _currentlyExecutingBatch; internal static readonly string[] PreKatmaiProcParamsNames = new string[15] { "PARAMETER_NAME", "PARAMETER_TYPE", "DATA_TYPE", null, "CHARACTER_MAXIMUM_LENGTH", "NUMERIC_PRECISION", "NUMERIC_SCALE", "UDT_CATALOG", "UDT_SCHEMA", "TYPE_NAME", "XML_CATALOGNAME", "XML_SCHEMANAME", "XML_SCHEMACOLLECTIONNAME", "UDT_NAME", null }; internal static readonly string[] KatmaiProcParamsNames = new string[15] { "PARAMETER_NAME", "PARAMETER_TYPE", null, "MANAGED_DATA_TYPE", "CHARACTER_MAXIMUM_LENGTH", "NUMERIC_PRECISION", "NUMERIC_SCALE", "TYPE_CATALOG_NAME", "TYPE_SCHEMA_NAME", "TYPE_NAME", "XML_CATALOGNAME", "XML_SCHEMANAME", "XML_SCHEMACOLLECTIONNAME", null, "SS_DATETIME_PRECISION" }; internal bool InPrepare => _inPrepare; private CachedAsyncState cachedAsyncState { get { if (_cachedAsyncState == null) { _cachedAsyncState = new CachedAsyncState(); } return _cachedAsyncState; } } public new SqlConnection Connection { get { return _activeConnection; } set { if (_activeConnection != value && _activeConnection != null && cachedAsyncState.PendingAsyncOperation) { throw SQL.CannotModifyPropertyAsyncOperationInProgress("Connection"); } if (_transaction != null && _transaction.Connection == null) { _transaction = null; } if (IsPrepared && _activeConnection != value && _activeConnection != null) { try { Unprepare(); } catch (Exception) { } finally { _prepareHandle = -1; _execType = EXECTYPE.UNPREPARED; } } _activeConnection = value; } } protected override DbConnection DbConnection { get { return Connection; } set { Connection = (SqlConnection)value; } } private SqlInternalConnectionTds InternalTdsConnection => (SqlInternalConnectionTds)_activeConnection.InnerConnection; public SqlNotificationRequest Notification { get { return _notification; } set { _sqlDep = null; _notification = value; } } internal SqlStatistics Statistics { get { if (_activeConnection != null && (_activeConnection.StatisticsEnabled || _diagnosticListener.IsEnabled("System.Data.SqlClient.WriteCommandAfter"))) { return _activeConnection.Statistics; } return null; } } public new SqlTransaction Transaction { get { if (_transaction != null && _transaction.Connection == null) { _transaction = null; } return _transaction; } set { if (_transaction != value && _activeConnection != null && cachedAsyncState.PendingAsyncOperation) { throw SQL.CannotModifyPropertyAsyncOperationInProgress("Transaction"); } _transaction = value; } } protected override DbTransaction DbTransaction { get { return Transaction; } set { Transaction = (SqlTransaction)value; } } public override string CommandText { get { string commandText = _commandText; if (commandText == null) { return ADP.StrEmpty; } return commandText; } set { if (_commandText != value) { PropertyChanging(); _commandText = value; } } } public override int CommandTimeout { get { return _commandTimeout; } set { if (value < 0) { throw ADP.InvalidCommandTimeout(value, "CommandTimeout"); } if (value != _commandTimeout) { PropertyChanging(); _commandTimeout = value; } } } public override CommandType CommandType { get { CommandType commandType = _commandType; if (commandType == (CommandType)0) { return CommandType.Text; } return commandType; } set { if (_commandType != value) { switch (value) { case CommandType.Text: case CommandType.StoredProcedure: PropertyChanging(); _commandType = value; break; case CommandType.TableDirect: throw SQL.NotSupportedCommandType(value); default: throw ADP.InvalidCommandType(value); } } } } public override bool DesignTimeVisible { get { return !_designTimeInvisible; } set { _designTimeInvisible = !value; } } public new SqlParameterCollection Parameters { get { if (_parameters == null) { _parameters = new SqlParameterCollection(); } return _parameters; } } protected override DbParameterCollection DbParameterCollection => Parameters; public override UpdateRowSource UpdatedRowSource { get { return _updatedRowSource; } set { if ((uint)value <= 3u) { _updatedRowSource = value; return; } throw ADP.InvalidUpdateRowSource(value); } } internal _SqlMetaDataSet MetaData => _cachedMetaData; internal TdsParserStateObject StateObject => _stateObj; private bool IsPrepared => _execType != EXECTYPE.UNPREPARED; private bool IsUserPrepared { get { if (IsPrepared && !_hiddenPrepare) { return !IsDirty; } return false; } } internal bool IsDirty { get { SqlConnection activeConnection = _activeConnection; if (IsPrepared) { if (!_dirty && (_parameters == null || !_parameters.IsDirty)) { if (activeConnection != null) { if (activeConnection.CloseCount == _preparedConnectionCloseCount) { return activeConnection.ReconnectCount != _preparedConnectionReconnectCount; } return true; } return false; } return true; } return false; } set { _dirty = value && IsPrepared; if (_parameters != null) { _parameters.IsDirty = _dirty; } _cachedMetaData = null; } } internal int InternalRecordsAffected { get { return _rowsAffected; } set { if (-1 == _rowsAffected) { _rowsAffected = value; } else if (0 < value) { _rowsAffected += value; } } } internal bool BatchRPCMode { get { return _batchRPCMode; } set { _batchRPCMode = value; if (!_batchRPCMode) { ClearBatchCommand(); return; } if (_RPCList == null) { _RPCList = new List<_SqlRPC>(); } if (_parameterCollectionList == null) { _parameterCollectionList = new List(); } } } [MonoTODO] public bool NotificationAutoEnlist { get { return Notification != null; } set { throw new NotImplementedException(); } } public SqlCommandColumnEncryptionSetting ColumnEncryptionSetting { get { ThrowStub.ThrowNotSupportedException(); return default(SqlCommandColumnEncryptionSetting); } } public event StatementCompletedEventHandler StatementCompleted { add { _statementCompletedEventHandler = (StatementCompletedEventHandler)Delegate.Combine(_statementCompletedEventHandler, value); } remove { _statementCompletedEventHandler = (StatementCompletedEventHandler)Delegate.Remove(_statementCompletedEventHandler, value); } } public SqlCommand() { _commandTimeout = 30; _updatedRowSource = UpdateRowSource.Both; _prepareHandle = -1; _preparedConnectionCloseCount = -1; _preparedConnectionReconnectCount = -1; _rowsAffected = -1; base..ctor(); GC.SuppressFinalize(this); } public SqlCommand(string cmdText) : this() { CommandText = cmdText; } public SqlCommand(string cmdText, SqlConnection connection) : this() { CommandText = cmdText; Connection = connection; } public SqlCommand(string cmdText, SqlConnection connection, SqlTransaction transaction) : this() { CommandText = cmdText; Connection = connection; Transaction = transaction; } private SqlCommand(SqlCommand from) : this() { CommandText = from.CommandText; CommandTimeout = from.CommandTimeout; CommandType = from.CommandType; Connection = from.Connection; DesignTimeVisible = from.DesignTimeVisible; Transaction = from.Transaction; UpdatedRowSource = from.UpdatedRowSource; SqlParameterCollection parameters = Parameters; foreach (object parameter in from.Parameters) { parameters.Add((parameter is ICloneable) ? (parameter as ICloneable).Clone() : parameter); } } public void ResetCommandTimeout() { if (30 != _commandTimeout) { PropertyChanging(); _commandTimeout = 30; } } internal void OnStatementCompleted(int recordCount) { if (0 > recordCount) { return; } StatementCompletedEventHandler statementCompletedEventHandler = _statementCompletedEventHandler; if (statementCompletedEventHandler == null) { return; } try { statementCompletedEventHandler(this, new StatementCompletedEventArgs(recordCount)); } catch (Exception e) { if (!ADP.IsCatchableOrSecurityExceptionType(e)) { throw; } } } private void PropertyChanging() { IsDirty = true; } public override void Prepare() { _pendingCancel = false; SqlStatistics sqlStatistics = null; sqlStatistics = SqlStatistics.StartTimer(Statistics); if ((IsPrepared && !IsDirty) || CommandType == CommandType.StoredProcedure || (CommandType.Text == CommandType && GetParameterCount(_parameters) == 0)) { if (Statistics != null) { Statistics.SafeIncrement(ref Statistics._prepares); } _hiddenPrepare = false; } else { ValidateCommand(async: false, "Prepare"); bool flag = true; try { GetStateObject(); if (_parameters != null) { int count = _parameters.Count; for (int i = 0; i < count; i++) { _parameters[i].Prepare(this); } } InternalPrepare(); } catch (Exception e) { flag = ADP.IsCatchableExceptionType(e); throw; } finally { if (flag) { _hiddenPrepare = false; ReliablePutStateObject(); } } } SqlStatistics.StopTimer(sqlStatistics); } private void InternalPrepare() { if (IsDirty) { Unprepare(); IsDirty = false; } _execType = EXECTYPE.PREPAREPENDING; _preparedConnectionCloseCount = _activeConnection.CloseCount; _preparedConnectionReconnectCount = _activeConnection.ReconnectCount; if (Statistics != null) { Statistics.SafeIncrement(ref Statistics._prepares); } } internal void Unprepare() { _execType = EXECTYPE.PREPAREPENDING; if (_activeConnection.CloseCount != _preparedConnectionCloseCount || _activeConnection.ReconnectCount != _preparedConnectionReconnectCount) { _prepareHandle = -1; } _cachedMetaData = null; } public override void Cancel() { SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); TaskCompletionSource reconnectionCompletionSource = _reconnectionCompletionSource; if ((reconnectionCompletionSource != null && reconnectionCompletionSource.TrySetCanceled()) || _activeConnection == null || !(_activeConnection.InnerConnection is SqlInternalConnectionTds sqlInternalConnectionTds)) { return; } lock (sqlInternalConnectionTds) { if (sqlInternalConnectionTds != _activeConnection.InnerConnection as SqlInternalConnectionTds) { return; } TdsParser parser = sqlInternalConnectionTds.Parser; if (parser != null && !_pendingCancel) { _pendingCancel = true; TdsParserStateObject stateObj = _stateObj; if (stateObj != null) { stateObj.Cancel(this); } else { sqlInternalConnectionTds.FindLiveReader(this)?.Cancel(this); } } } } finally { SqlStatistics.StopTimer(statistics); } } public new SqlParameter CreateParameter() { return new SqlParameter(); } protected override DbParameter CreateDbParameter() { return CreateParameter(); } protected override void Dispose(bool disposing) { if (disposing) { _cachedMetaData = null; } base.Dispose(disposing); } public override object ExecuteScalar() { _pendingCancel = false; Guid operationId = _diagnosticListener.WriteCommandBefore(this, "ExecuteScalar"); SqlStatistics statistics = null; Exception ex = null; try { statistics = SqlStatistics.StartTimer(Statistics); SqlDataReader ds = RunExecuteReader(CommandBehavior.Default, RunBehavior.ReturnImmediately, returnStream: true, "ExecuteScalar"); return CompleteExecuteScalar(ds, returnSqlValue: false); } catch (Exception ex2) { ex = ex2; throw; } finally { SqlStatistics.StopTimer(statistics); if (ex != null) { _diagnosticListener.WriteCommandError(operationId, this, ex, "ExecuteScalar"); } else { _diagnosticListener.WriteCommandAfter(operationId, this, "ExecuteScalar"); } } } private object CompleteExecuteScalar(SqlDataReader ds, bool returnSqlValue) { object result = null; try { if (ds.Read() && ds.FieldCount > 0) { result = ((!returnSqlValue) ? ds.GetValue(0) : ds.GetSqlValue(0)); } } finally { ds.Close(); } return result; } public override int ExecuteNonQuery() { _pendingCancel = false; Guid operationId = _diagnosticListener.WriteCommandBefore(this, "ExecuteNonQuery"); SqlStatistics statistics = null; Exception ex = null; try { statistics = SqlStatistics.StartTimer(Statistics); InternalExecuteNonQuery(null, sendToPipe: false, CommandTimeout, asyncWrite: false, "ExecuteNonQuery"); return _rowsAffected; } catch (Exception ex2) { ex = ex2; throw; } finally { SqlStatistics.StopTimer(statistics); if (ex != null) { _diagnosticListener.WriteCommandError(operationId, this, ex, "ExecuteNonQuery"); } else { _diagnosticListener.WriteCommandAfter(operationId, this, "ExecuteNonQuery"); } } } private IAsyncResult BeginExecuteNonQuery(AsyncCallback callback, object stateObject) { _pendingCancel = false; ValidateAsyncCommand(); SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); TaskCompletionSource completion = new TaskCompletionSource(stateObject); try { Task task = InternalExecuteNonQuery(completion, sendToPipe: false, CommandTimeout, asyncWrite: true, "BeginExecuteNonQuery"); cachedAsyncState.SetActiveConnectionAndResult(completion, "EndExecuteNonQuery", _activeConnection); if (task != null) { AsyncHelper.ContinueTask(task, completion, delegate { BeginExecuteNonQueryInternalReadStage(completion); }); } else { BeginExecuteNonQueryInternalReadStage(completion); } } catch (Exception e) { if (!ADP.IsCatchableOrSecurityExceptionType(e)) { throw; } ReliablePutStateObject(); throw; } if (callback != null) { completion.Task.ContinueWith(delegate(Task t) { callback(t); }, TaskScheduler.Default); } return completion.Task; } finally { SqlStatistics.StopTimer(statistics); } } private void BeginExecuteNonQueryInternalReadStage(TaskCompletionSource completion) { try { _stateObj.ReadSni(completion); } catch (Exception) { if (_cachedAsyncState != null) { _cachedAsyncState.ResetAsyncState(); } ReliablePutStateObject(); throw; } } private void VerifyEndExecuteState(Task completionTask, string endMethod) { if (completionTask.IsCanceled) { if (_stateObj == null) { throw SQL.CR_ReconnectionCancelled(); } _stateObj.Parser.State = TdsParserState.Broken; _stateObj.Parser.Connection.BreakConnection(); _stateObj.Parser.ThrowExceptionAndWarning(_stateObj); } else if (completionTask.IsFaulted) { throw completionTask.Exception.InnerException; } if (cachedAsyncState.EndMethodName == null) { throw ADP.MethodCalledTwice(endMethod); } if (endMethod != cachedAsyncState.EndMethodName) { throw ADP.MismatchedAsyncResult(cachedAsyncState.EndMethodName, endMethod); } if (_activeConnection.State != ConnectionState.Open || !cachedAsyncState.IsActiveConnectionValid(_activeConnection)) { throw ADP.ClosedConnectionError(); } } private void WaitForAsyncResults(IAsyncResult asyncResult) { _ = (Task)asyncResult; if (!asyncResult.IsCompleted) { asyncResult.AsyncWaitHandle.WaitOne(); } _stateObj._networkPacketTaskSource = null; _activeConnection.GetOpenTdsConnection().DecrementAsyncCount(); } private void ThrowIfReconnectionHasBeenCanceled() { if (_stateObj == null) { TaskCompletionSource reconnectionCompletionSource = _reconnectionCompletionSource; if (reconnectionCompletionSource != null && reconnectionCompletionSource.Task.IsCanceled) { throw SQL.CR_ReconnectionCancelled(); } } } private int EndExecuteNonQuery(IAsyncResult asyncResult) { Exception exception = ((Task)asyncResult).Exception; if (exception != null) { if (cachedAsyncState != null) { cachedAsyncState.ResetAsyncState(); } ReliablePutStateObject(); throw exception.InnerException; } ThrowIfReconnectionHasBeenCanceled(); lock (_stateObj) { return EndExecuteNonQueryInternal(asyncResult); } } private int EndExecuteNonQueryInternal(IAsyncResult asyncResult) { SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); VerifyEndExecuteState((Task)asyncResult, "EndExecuteNonQuery"); WaitForAsyncResults(asyncResult); bool flag = true; try { CheckThrowSNIException(); if (CommandType.Text == CommandType && GetParameterCount(_parameters) == 0) { try { if (!_stateObj.Parser.TryRun(RunBehavior.UntilDone, this, null, null, _stateObj, out var _)) { throw SQL.SynchronousCallMayNotPend(); } } finally { cachedAsyncState.ResetAsyncState(); } } else { CompleteAsyncExecuteReader()?.Close(); } } catch (Exception e) { flag = ADP.IsCatchableExceptionType(e); throw; } finally { if (flag) { PutStateObject(); } } return _rowsAffected; } catch (Exception e2) { if (cachedAsyncState != null) { cachedAsyncState.ResetAsyncState(); } if (ADP.IsCatchableExceptionType(e2)) { ReliablePutStateObject(); } throw; } finally { SqlStatistics.StopTimer(statistics); } } private Task InternalExecuteNonQuery(TaskCompletionSource completion, bool sendToPipe, int timeout, bool asyncWrite = false, [CallerMemberName] string methodName = "") { bool async = completion != null; SqlStatistics statistics = Statistics; _rowsAffected = -1; ValidateCommand(async, methodName); CheckNotificationStateAndAutoEnlist(); Task task = null; if (CommandType.Text == CommandType && GetParameterCount(_parameters) == 0) { if (statistics != null) { if (!IsDirty && IsPrepared) { statistics.SafeIncrement(ref statistics._preparedExecs); } else { statistics.SafeIncrement(ref statistics._unpreparedExecs); } } task = RunExecuteNonQueryTds(methodName, async, timeout, asyncWrite); } else { SqlDataReader reader = RunExecuteReader(CommandBehavior.Default, RunBehavior.UntilDone, returnStream: false, completion, timeout, out task, asyncWrite, methodName); if (reader != null) { if (task != null) { task = AsyncHelper.CreateContinuationTask(task, delegate { reader.Close(); }); } else { reader.Close(); } } } return task; } public XmlReader ExecuteXmlReader() { _pendingCancel = false; Guid operationId = _diagnosticListener.WriteCommandBefore(this, "ExecuteXmlReader"); SqlStatistics statistics = null; Exception ex = null; try { statistics = SqlStatistics.StartTimer(Statistics); SqlDataReader ds = RunExecuteReader(CommandBehavior.SequentialAccess, RunBehavior.ReturnImmediately, returnStream: true, "ExecuteXmlReader"); return CompleteXmlReader(ds); } catch (Exception ex2) { ex = ex2; throw; } finally { SqlStatistics.StopTimer(statistics); if (ex != null) { _diagnosticListener.WriteCommandError(operationId, this, ex, "ExecuteXmlReader"); } else { _diagnosticListener.WriteCommandAfter(operationId, this, "ExecuteXmlReader"); } } } private IAsyncResult BeginExecuteXmlReader(AsyncCallback callback, object stateObject) { _pendingCancel = false; ValidateAsyncCommand(); SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); TaskCompletionSource completion = new TaskCompletionSource(stateObject); Task task; try { RunExecuteReader(CommandBehavior.SequentialAccess, RunBehavior.ReturnImmediately, returnStream: true, completion, CommandTimeout, out task, asyncWrite: true, "BeginExecuteXmlReader"); } catch (Exception e) { if (!ADP.IsCatchableOrSecurityExceptionType(e)) { throw; } ReliablePutStateObject(); throw; } cachedAsyncState.SetActiveConnectionAndResult(completion, "EndExecuteXmlReader", _activeConnection); if (task != null) { AsyncHelper.ContinueTask(task, completion, delegate { BeginExecuteXmlReaderInternalReadStage(completion); }); } else { BeginExecuteXmlReaderInternalReadStage(completion); } if (callback != null) { completion.Task.ContinueWith(delegate(Task t) { callback(t); }, TaskScheduler.Default); } return completion.Task; } finally { SqlStatistics.StopTimer(statistics); } } private void BeginExecuteXmlReaderInternalReadStage(TaskCompletionSource completion) { try { _stateObj.ReadSni(completion); } catch (Exception exception) { if (_cachedAsyncState != null) { _cachedAsyncState.ResetAsyncState(); } ReliablePutStateObject(); completion.TrySetException(exception); } } private XmlReader EndExecuteXmlReader(IAsyncResult asyncResult) { Exception exception = ((Task)asyncResult).Exception; if (exception != null) { if (cachedAsyncState != null) { cachedAsyncState.ResetAsyncState(); } ReliablePutStateObject(); throw exception.InnerException; } ThrowIfReconnectionHasBeenCanceled(); lock (_stateObj) { return EndExecuteXmlReaderInternal(asyncResult); } } private XmlReader EndExecuteXmlReaderInternal(IAsyncResult asyncResult) { try { return CompleteXmlReader(InternalEndExecuteReader(asyncResult, "EndExecuteXmlReader"), async: true); } catch (Exception e) { if (cachedAsyncState != null) { cachedAsyncState.ResetAsyncState(); } if (ADP.IsCatchableExceptionType(e)) { ReliablePutStateObject(); } throw; } } private XmlReader CompleteXmlReader(SqlDataReader ds, bool async = false) { XmlReader xmlReader = null; SmiExtendedMetaData[] internalSmiMetaData = ds.GetInternalSmiMetaData(); if (internalSmiMetaData != null && internalSmiMetaData.Length == 1 && (internalSmiMetaData[0].SqlDbType == SqlDbType.NText || internalSmiMetaData[0].SqlDbType == SqlDbType.NVarChar || internalSmiMetaData[0].SqlDbType == SqlDbType.Xml)) { try { xmlReader = new SqlStream(ds, addByteOrderMark: true, internalSmiMetaData[0].SqlDbType != SqlDbType.Xml).ToXmlReader(async); } catch (Exception e) { if (ADP.IsCatchableExceptionType(e)) { ds.Close(); } throw; } } if (xmlReader == null) { ds.Close(); throw SQL.NonXmlResult(); } return xmlReader; } protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior) { return ExecuteReader(behavior); } public new SqlDataReader ExecuteReader() { SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); return ExecuteReader(CommandBehavior.Default); } finally { SqlStatistics.StopTimer(statistics); } } public new SqlDataReader ExecuteReader(CommandBehavior behavior) { _pendingCancel = false; Guid operationId = _diagnosticListener.WriteCommandBefore(this, "ExecuteReader"); SqlStatistics statistics = null; Exception ex = null; try { statistics = SqlStatistics.StartTimer(Statistics); return RunExecuteReader(behavior, RunBehavior.ReturnImmediately, returnStream: true, "ExecuteReader"); } catch (Exception ex2) { ex = ex2; throw; } finally { SqlStatistics.StopTimer(statistics); if (ex != null) { _diagnosticListener.WriteCommandError(operationId, this, ex, "ExecuteReader"); } else { _diagnosticListener.WriteCommandAfter(operationId, this, "ExecuteReader"); } } } internal SqlDataReader EndExecuteReader(IAsyncResult asyncResult) { Exception exception = ((Task)asyncResult).Exception; if (exception != null) { if (cachedAsyncState != null) { cachedAsyncState.ResetAsyncState(); } ReliablePutStateObject(); throw exception.InnerException; } ThrowIfReconnectionHasBeenCanceled(); lock (_stateObj) { return EndExecuteReaderInternal(asyncResult); } } private SqlDataReader EndExecuteReaderInternal(IAsyncResult asyncResult) { SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); return InternalEndExecuteReader(asyncResult, "EndExecuteReader"); } catch (Exception e) { if (cachedAsyncState != null) { cachedAsyncState.ResetAsyncState(); } if (ADP.IsCatchableExceptionType(e)) { ReliablePutStateObject(); } throw; } finally { SqlStatistics.StopTimer(statistics); } } internal IAsyncResult BeginExecuteReader(CommandBehavior behavior, AsyncCallback callback, object stateObject) { _pendingCancel = false; SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); TaskCompletionSource completion = new TaskCompletionSource(stateObject); ValidateAsyncCommand(); Task task = null; try { RunExecuteReader(behavior, RunBehavior.ReturnImmediately, returnStream: true, completion, CommandTimeout, out task, asyncWrite: true, "BeginExecuteReader"); } catch (Exception e) { if (!ADP.IsCatchableOrSecurityExceptionType(e)) { throw; } ReliablePutStateObject(); throw; } cachedAsyncState.SetActiveConnectionAndResult(completion, "EndExecuteReader", _activeConnection); if (task != null) { AsyncHelper.ContinueTask(task, completion, delegate { BeginExecuteReaderInternalReadStage(completion); }); } else { BeginExecuteReaderInternalReadStage(completion); } if (callback != null) { completion.Task.ContinueWith(delegate(Task t) { callback(t); }, TaskScheduler.Default); } return completion.Task; } finally { SqlStatistics.StopTimer(statistics); } } private void BeginExecuteReaderInternalReadStage(TaskCompletionSource completion) { try { _stateObj.ReadSni(completion); } catch (Exception exception) { if (_cachedAsyncState != null) { _cachedAsyncState.ResetAsyncState(); } ReliablePutStateObject(); completion.TrySetException(exception); } } private SqlDataReader InternalEndExecuteReader(IAsyncResult asyncResult, string endMethod) { VerifyEndExecuteState((Task)asyncResult, endMethod); WaitForAsyncResults(asyncResult); CheckThrowSNIException(); return CompleteAsyncExecuteReader(); } public override Task ExecuteNonQueryAsync(CancellationToken cancellationToken) { Guid operationId = _diagnosticListener.WriteCommandBefore(this, "ExecuteNonQueryAsync"); TaskCompletionSource source = new TaskCompletionSource(); CancellationTokenRegistration registration = default(CancellationTokenRegistration); if (cancellationToken.CanBeCanceled) { if (cancellationToken.IsCancellationRequested) { source.SetCanceled(); return source.Task; } registration = cancellationToken.Register(delegate(object s) { ((SqlCommand)s).CancelIgnoreFailure(); }, this); } Task outerTask = source.Task; try { RegisterForConnectionCloseNotification(ref outerTask); Task.Factory.FromAsync(BeginExecuteNonQuery, EndExecuteNonQuery, null).ContinueWith(delegate(Task t) { registration.Dispose(); if (t.IsFaulted) { Exception innerException = t.Exception.InnerException; _diagnosticListener.WriteCommandError(operationId, this, innerException, "ExecuteNonQueryAsync"); source.SetException(innerException); } else { if (t.IsCanceled) { source.SetCanceled(); } else { source.SetResult(t.Result); } _diagnosticListener.WriteCommandAfter(operationId, this, "ExecuteNonQueryAsync"); } }, TaskScheduler.Default); } catch (Exception ex) { _diagnosticListener.WriteCommandError(operationId, this, ex, "ExecuteNonQueryAsync"); source.SetException(ex); } return outerTask; } protected override Task ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken) { return ExecuteReaderAsync(behavior, cancellationToken).ContinueWith((Func, DbDataReader>)delegate(Task result) { if (result.IsFaulted) { throw result.Exception.InnerException; } return result.Result; }, CancellationToken.None, TaskContinuationOptions.NotOnCanceled | TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default); } public new Task ExecuteReaderAsync() { return ExecuteReaderAsync(CommandBehavior.Default, CancellationToken.None); } public new Task ExecuteReaderAsync(CommandBehavior behavior) { return ExecuteReaderAsync(behavior, CancellationToken.None); } public new Task ExecuteReaderAsync(CancellationToken cancellationToken) { return ExecuteReaderAsync(CommandBehavior.Default, cancellationToken); } public new Task ExecuteReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken) { Guid operationId = default(Guid); if (!_parentOperationStarted) { operationId = _diagnosticListener.WriteCommandBefore(this, "ExecuteReaderAsync"); } TaskCompletionSource source = new TaskCompletionSource(); CancellationTokenRegistration registration = default(CancellationTokenRegistration); if (cancellationToken.CanBeCanceled) { if (cancellationToken.IsCancellationRequested) { source.SetCanceled(); return source.Task; } registration = cancellationToken.Register(delegate(object s) { ((SqlCommand)s).CancelIgnoreFailure(); }, this); } Task outerTask = source.Task; try { RegisterForConnectionCloseNotification(ref outerTask); Task.Factory.FromAsync(BeginExecuteReader, EndExecuteReader, behavior, null).ContinueWith(delegate(Task t) { registration.Dispose(); if (t.IsFaulted) { Exception innerException = t.Exception.InnerException; if (!_parentOperationStarted) { _diagnosticListener.WriteCommandError(operationId, this, innerException, "ExecuteReaderAsync"); } source.SetException(innerException); } else { if (t.IsCanceled) { source.SetCanceled(); } else { source.SetResult(t.Result); } if (!_parentOperationStarted) { _diagnosticListener.WriteCommandAfter(operationId, this, "ExecuteReaderAsync"); } } }, TaskScheduler.Default); } catch (Exception ex) { if (!_parentOperationStarted) { _diagnosticListener.WriteCommandError(operationId, this, ex, "ExecuteReaderAsync"); } source.SetException(ex); } return outerTask; } public override Task ExecuteScalarAsync(CancellationToken cancellationToken) { _parentOperationStarted = true; Guid operationId = _diagnosticListener.WriteCommandBefore(this, "ExecuteScalarAsync"); return ExecuteReaderAsync(cancellationToken).ContinueWith(delegate(Task executeTask) { TaskCompletionSource source = new TaskCompletionSource(); if (executeTask.IsCanceled) { source.SetCanceled(); } else if (executeTask.IsFaulted) { _diagnosticListener.WriteCommandError(operationId, this, executeTask.Exception.InnerException, "ExecuteScalarAsync"); source.SetException(executeTask.Exception.InnerException); } else { SqlDataReader reader = executeTask.Result; reader.ReadAsync(cancellationToken).ContinueWith(delegate(Task readTask) { try { if (readTask.IsCanceled) { reader.Dispose(); source.SetCanceled(); } else if (readTask.IsFaulted) { reader.Dispose(); _diagnosticListener.WriteCommandError(operationId, this, readTask.Exception.InnerException, "ExecuteScalarAsync"); source.SetException(readTask.Exception.InnerException); } else { Exception ex = null; object result = null; try { if (readTask.Result && reader.FieldCount > 0) { try { result = reader.GetValue(0); } catch (Exception ex2) { ex = ex2; } } } finally { reader.Dispose(); } if (ex != null) { _diagnosticListener.WriteCommandError(operationId, this, ex, "ExecuteScalarAsync"); source.SetException(ex); } else { _diagnosticListener.WriteCommandAfter(operationId, this, "ExecuteScalarAsync"); source.SetResult(result); } } } catch (Exception exception) { source.SetException(exception); } }, TaskScheduler.Default); } _parentOperationStarted = false; return source.Task; }, TaskScheduler.Default).Unwrap(); } public Task ExecuteXmlReaderAsync() { return ExecuteXmlReaderAsync(CancellationToken.None); } public Task ExecuteXmlReaderAsync(CancellationToken cancellationToken) { Guid operationId = _diagnosticListener.WriteCommandBefore(this, "ExecuteXmlReaderAsync"); TaskCompletionSource source = new TaskCompletionSource(); CancellationTokenRegistration registration = default(CancellationTokenRegistration); if (cancellationToken.CanBeCanceled) { if (cancellationToken.IsCancellationRequested) { source.SetCanceled(); return source.Task; } registration = cancellationToken.Register(delegate(object s) { ((SqlCommand)s).CancelIgnoreFailure(); }, this); } Task outerTask = source.Task; try { RegisterForConnectionCloseNotification(ref outerTask); Task.Factory.FromAsync(BeginExecuteXmlReader, EndExecuteXmlReader, null).ContinueWith(delegate(Task t) { registration.Dispose(); if (t.IsFaulted) { Exception innerException = t.Exception.InnerException; _diagnosticListener.WriteCommandError(operationId, this, innerException, "ExecuteXmlReaderAsync"); source.SetException(innerException); } else { if (t.IsCanceled) { source.SetCanceled(); } else { source.SetResult(t.Result); } _diagnosticListener.WriteCommandAfter(operationId, this, "ExecuteXmlReaderAsync"); } }, TaskScheduler.Default); } catch (Exception ex) { _diagnosticListener.WriteCommandError(operationId, this, ex, "ExecuteXmlReaderAsync"); source.SetException(ex); } return outerTask; } private static string UnquoteProcedurePart(string part) { if (part != null && 2 <= part.Length && '[' == part[0] && ']' == part[part.Length - 1]) { part = part.Substring(1, part.Length - 2); part = part.Replace("]]", "]"); } return part; } private static string UnquoteProcedureName(string name, out object groupNumber) { groupNumber = null; string text = name; if (text != null) { if (char.IsDigit(text[text.Length - 1])) { int num = text.LastIndexOf(';'); if (num != -1) { string s = text.Substring(num + 1); int result = 0; if (int.TryParse(s, out result)) { groupNumber = result; text = text.Substring(0, num); } } } text = UnquoteProcedurePart(text); } return text; } internal void DeriveParameters() { switch (CommandType) { case CommandType.Text: throw ADP.DeriveParametersNotSupported(this); case CommandType.TableDirect: throw ADP.DeriveParametersNotSupported(this); default: throw ADP.InvalidCommandType(CommandType); case CommandType.StoredProcedure: { ValidateCommand(async: false, "DeriveParameters"); string[] array = MultipartIdentifier.ParseMultipartIdentifier(CommandText, "[\"", "]\"", "SqlCommand.DeriveParameters failed because the SqlCommand.CommandText property value is an invalid multipart name", ThrowOnEmptyMultipartName: false); if (array[3] == null || string.IsNullOrEmpty(array[3])) { throw ADP.NoStoredProcedureExists(CommandText); } SqlCommand sqlCommand = null; StringBuilder stringBuilder = new StringBuilder(); if (!string.IsNullOrEmpty(array[0])) { SqlCommandSet.BuildStoredProcedureName(stringBuilder, array[0]); stringBuilder.Append("."); } if (string.IsNullOrEmpty(array[1])) { array[1] = Connection.Database; } SqlCommandSet.BuildStoredProcedureName(stringBuilder, array[1]); stringBuilder.Append("."); string[] array2; bool flag; if (Connection.IsKatmaiOrNewer) { stringBuilder.Append("[sys].[").Append("sp_procedure_params_100_managed").Append("]"); array2 = KatmaiProcParamsNames; flag = true; } else { stringBuilder.Append("[sys].[").Append("sp_procedure_params_managed").Append("]"); array2 = PreKatmaiProcParamsNames; flag = false; } sqlCommand = new SqlCommand(stringBuilder.ToString(), Connection, Transaction) { CommandType = CommandType.StoredProcedure }; sqlCommand.Parameters.Add(new SqlParameter("@procedure_name", SqlDbType.NVarChar, 255)); sqlCommand.Parameters[0].Value = UnquoteProcedureName(array[3], out var groupNumber); if (groupNumber != null) { sqlCommand.Parameters.Add(new SqlParameter("@group_number", SqlDbType.Int)).Value = groupNumber; } if (!string.IsNullOrEmpty(array[2])) { sqlCommand.Parameters.Add(new SqlParameter("@procedure_schema", SqlDbType.NVarChar, 255)).Value = UnquoteProcedurePart(array[2]); } SqlDataReader sqlDataReader = null; List list = new List(); bool flag2 = true; try { sqlDataReader = sqlCommand.ExecuteReader(); SqlParameter sqlParameter = null; while (sqlDataReader.Read()) { sqlParameter = new SqlParameter { ParameterName = (string)sqlDataReader[array2[0]] }; if (flag) { sqlParameter.SqlDbType = (SqlDbType)(short)sqlDataReader[array2[3]]; switch (sqlParameter.SqlDbType) { case SqlDbType.Image: case SqlDbType.Timestamp: sqlParameter.SqlDbType = SqlDbType.VarBinary; break; case SqlDbType.NText: sqlParameter.SqlDbType = SqlDbType.NVarChar; break; case SqlDbType.Text: sqlParameter.SqlDbType = SqlDbType.VarChar; break; } } else { sqlParameter.SqlDbType = MetaType.GetSqlDbTypeFromOleDbType((short)sqlDataReader[array2[2]], ADP.IsNull(sqlDataReader[array2[9]]) ? ADP.StrEmpty : ((string)sqlDataReader[array2[9]])); } if (sqlDataReader[array2[4]] is int num) { if (num == 0 && (sqlParameter.SqlDbType == SqlDbType.NVarChar || sqlParameter.SqlDbType == SqlDbType.VarBinary || sqlParameter.SqlDbType == SqlDbType.VarChar)) { num = -1; } sqlParameter.Size = num; } sqlParameter.Direction = ParameterDirectionFromOleDbDirection((short)sqlDataReader[array2[1]]); if (sqlParameter.SqlDbType == SqlDbType.Decimal) { sqlParameter.ScaleInternal = (byte)((uint)(short)sqlDataReader[array2[6]] & 0xFFu); sqlParameter.PrecisionInternal = (byte)((uint)(short)sqlDataReader[array2[5]] & 0xFFu); } if (SqlDbType.Structured == sqlParameter.SqlDbType) { sqlParameter.TypeName = string.Concat(sqlDataReader[array2[7]], ".", sqlDataReader[array2[8]], ".", sqlDataReader[array2[9]]); } if (SqlDbType.Xml == sqlParameter.SqlDbType) { object obj = sqlDataReader[array2[10]]; sqlParameter.XmlSchemaCollectionDatabase = (ADP.IsNull(obj) ? string.Empty : ((string)obj)); obj = sqlDataReader[array2[11]]; sqlParameter.XmlSchemaCollectionOwningSchema = (ADP.IsNull(obj) ? string.Empty : ((string)obj)); obj = sqlDataReader[array2[12]]; sqlParameter.XmlSchemaCollectionName = (ADP.IsNull(obj) ? string.Empty : ((string)obj)); } if (MetaType._IsVarTime(sqlParameter.SqlDbType)) { object obj2 = sqlDataReader[array2[14]]; if (obj2 is int) { sqlParameter.ScaleInternal = (byte)((uint)(int)obj2 & 0xFFu); } } list.Add(sqlParameter); } } catch (Exception e) { flag2 = ADP.IsCatchableExceptionType(e); throw; } finally { if (flag2) { sqlDataReader?.Close(); sqlCommand.Connection = null; } } if (list.Count == 0) { throw ADP.NoStoredProcedureExists(CommandText); } Parameters.Clear(); { foreach (SqlParameter item in list) { _parameters.Add(item); } break; } } } } private ParameterDirection ParameterDirectionFromOleDbDirection(short oledbDirection) { return oledbDirection switch { 2 => ParameterDirection.InputOutput, 3 => ParameterDirection.Output, 4 => ParameterDirection.ReturnValue, _ => ParameterDirection.Input, }; } private void CheckNotificationStateAndAutoEnlist() { if (Notification != null && _sqlDep != null) { if (_sqlDep.Options == null) { SqlDependency.IdentityUserNamePair identityUserNamePair = null; SqlInternalConnectionTds sqlInternalConnectionTds = _activeConnection.InnerConnection as SqlInternalConnectionTds; identityUserNamePair = ((sqlInternalConnectionTds.Identity == null) ? new SqlDependency.IdentityUserNamePair(null, sqlInternalConnectionTds.ConnectionOptions.UserID) : new SqlDependency.IdentityUserNamePair(sqlInternalConnectionTds.Identity, null)); Notification.Options = SqlDependency.GetDefaultComposedOptions(_activeConnection.DataSource, InternalTdsConnection.ServerProvidedFailOverPartner, identityUserNamePair, _activeConnection.Database); } Notification.UserData = _sqlDep.ComputeHashAndAddToDispatcher(this); _sqlDep.AddToServerList(_activeConnection.DataSource); } } private Task RunExecuteNonQueryTds(string methodName, bool async, int timeout, bool asyncWrite) { bool flag = true; try { Task task = _activeConnection.ValidateAndReconnect(null, timeout); if (task != null) { long reconnectionStart = ADP.TimerCurrent(); if (async) { TaskCompletionSource completion = new TaskCompletionSource(); _activeConnection.RegisterWaitingForReconnect(completion.Task); _reconnectionCompletionSource = completion; CancellationTokenSource timeoutCTS = new CancellationTokenSource(); AsyncHelper.SetTimeoutException(completion, timeout, SQL.CR_ReconnectTimeout, timeoutCTS.Token); AsyncHelper.ContinueTask(task, completion, delegate { if (!completion.Task.IsCompleted) { Interlocked.CompareExchange(ref _reconnectionCompletionSource, null, completion); timeoutCTS.Cancel(); Task task2 = RunExecuteNonQueryTds(methodName, async, TdsParserStaticMethods.GetRemainingTimeout(timeout, reconnectionStart), asyncWrite); if (task2 == null) { completion.SetResult(null); } else { AsyncHelper.ContinueTask(task2, completion, delegate { completion.SetResult(null); }); } } }, null, null, null, null, _activeConnection); return completion.Task; } AsyncHelper.WaitForCompletion(task, timeout, delegate { throw SQL.CR_ReconnectTimeout(); }); timeout = TdsParserStaticMethods.GetRemainingTimeout(timeout, reconnectionStart); } if (asyncWrite) { _activeConnection.AddWeakReference(this, 2); } GetStateObject(); _stateObj.Parser.TdsExecuteSQLBatch(CommandText, timeout, Notification, _stateObj, sync: true); NotifyDependency(); bool dataReady; if (async) { _activeConnection.GetOpenTdsConnection(methodName).IncrementAsyncCount(); } else if (!_stateObj.Parser.TryRun(RunBehavior.UntilDone, this, null, null, _stateObj, out dataReady)) { throw SQL.SynchronousCallMayNotPend(); } } catch (Exception e) { flag = ADP.IsCatchableExceptionType(e); throw; } finally { if (flag && !async) { PutStateObject(); } } return null; } internal SqlDataReader RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, bool returnStream, [CallerMemberName] string method = "") { Task task; return RunExecuteReader(cmdBehavior, runBehavior, returnStream, null, CommandTimeout, out task, asyncWrite: false, method); } internal SqlDataReader RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, bool returnStream, TaskCompletionSource completion, int timeout, out Task task, bool asyncWrite = false, [CallerMemberName] string method = "") { bool flag = completion != null; task = null; _rowsAffected = -1; if ((CommandBehavior.SingleRow & cmdBehavior) != 0) { cmdBehavior |= CommandBehavior.SingleResult; } ValidateCommand(flag, method); CheckNotificationStateAndAutoEnlist(); SqlStatistics statistics = Statistics; if (statistics != null) { if ((!IsDirty && IsPrepared && !_hiddenPrepare) || (IsPrepared && _execType == EXECTYPE.PREPAREPENDING)) { statistics.SafeIncrement(ref statistics._preparedExecs); } else { statistics.SafeIncrement(ref statistics._unpreparedExecs); } } return RunExecuteReaderTds(cmdBehavior, runBehavior, returnStream, flag, timeout, out task, asyncWrite && flag); } private SqlDataReader RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, bool returnStream, bool async, int timeout, out Task task, bool asyncWrite, SqlDataReader ds = null) { if (ds == null && returnStream) { ds = new SqlDataReader(this, cmdBehavior); } Task task2 = _activeConnection.ValidateAndReconnect(null, timeout); if (task2 != null) { long reconnectionStart = ADP.TimerCurrent(); if (async) { TaskCompletionSource completion = new TaskCompletionSource(); _activeConnection.RegisterWaitingForReconnect(completion.Task); _reconnectionCompletionSource = completion; CancellationTokenSource timeoutCTS = new CancellationTokenSource(); AsyncHelper.SetTimeoutException(completion, timeout, SQL.CR_ReconnectTimeout, timeoutCTS.Token); AsyncHelper.ContinueTask(task2, completion, delegate { if (!completion.Task.IsCompleted) { Interlocked.CompareExchange(ref _reconnectionCompletionSource, null, completion); timeoutCTS.Cancel(); RunExecuteReaderTds(cmdBehavior, runBehavior, returnStream, async, TdsParserStaticMethods.GetRemainingTimeout(timeout, reconnectionStart), out var task4, asyncWrite, ds); if (task4 == null) { completion.SetResult(null); } else { AsyncHelper.ContinueTask(task4, completion, delegate { completion.SetResult(null); }); } } }, null, null, null, null, _activeConnection); task = completion.Task; return ds; } AsyncHelper.WaitForCompletion(task2, timeout, delegate { throw SQL.CR_ReconnectTimeout(); }); timeout = TdsParserStaticMethods.GetRemainingTimeout(timeout, reconnectionStart); } bool inSchema = (cmdBehavior & CommandBehavior.SchemaOnly) != 0; _SqlRPC rpc = null; task = null; string optionSettings = null; bool flag = true; bool flag2 = false; if (async) { _activeConnection.GetOpenTdsConnection().IncrementAsyncCount(); flag2 = true; } try { if (asyncWrite) { _activeConnection.AddWeakReference(this, 2); } GetStateObject(); Task task3 = null; if (CommandType.Text == CommandType && GetParameterCount(_parameters) == 0) { string text = GetCommandText(cmdBehavior) + GetResetOptionsString(cmdBehavior); task3 = _stateObj.Parser.TdsExecuteSQLBatch(text, timeout, Notification, _stateObj, !asyncWrite); } else if (CommandType.Text == CommandType) { if (IsDirty) { if (_execType == EXECTYPE.PREPARED) { _hiddenPrepare = true; } Unprepare(); IsDirty = false; } if (_execType == EXECTYPE.PREPARED) { rpc = BuildExecute(inSchema); } else if (_execType == EXECTYPE.PREPAREPENDING) { rpc = BuildPrepExec(cmdBehavior); _execType = EXECTYPE.PREPARED; _preparedConnectionCloseCount = _activeConnection.CloseCount; _preparedConnectionReconnectCount = _activeConnection.ReconnectCount; _inPrepare = true; } else { BuildExecuteSql(cmdBehavior, null, _parameters, ref rpc); } rpc.options = 2; task3 = _stateObj.Parser.TdsExecuteRPC(_rpcArrayOf1, timeout, inSchema, Notification, _stateObj, CommandType.StoredProcedure == CommandType, !asyncWrite); } else { BuildRPC(inSchema, _parameters, ref rpc); optionSettings = GetSetOptionsString(cmdBehavior); if (optionSettings != null) { _stateObj.Parser.TdsExecuteSQLBatch(optionSettings, timeout, Notification, _stateObj, sync: true); if (!_stateObj.Parser.TryRun(RunBehavior.UntilDone, this, null, null, _stateObj, out var _)) { throw SQL.SynchronousCallMayNotPend(); } optionSettings = GetResetOptionsString(cmdBehavior); } task3 = _stateObj.Parser.TdsExecuteRPC(_rpcArrayOf1, timeout, inSchema, Notification, _stateObj, CommandType.StoredProcedure == CommandType, !asyncWrite); } if (async) { flag2 = false; if (task3 != null) { task = AsyncHelper.CreateContinuationTask(task3, delegate { _activeConnection.GetOpenTdsConnection(); cachedAsyncState.SetAsyncReaderState(ds, runBehavior, optionSettings); }, null, delegate { _activeConnection.GetOpenTdsConnection().DecrementAsyncCount(); }); } else { cachedAsyncState.SetAsyncReaderState(ds, runBehavior, optionSettings); } } else { FinishExecuteReader(ds, runBehavior, optionSettings); } } catch (Exception e) { flag = ADP.IsCatchableExceptionType(e); if (flag2 && _activeConnection.InnerConnection is SqlInternalConnectionTds sqlInternalConnectionTds) { sqlInternalConnectionTds.DecrementAsyncCount(); } throw; } finally { if (flag && !async) { PutStateObject(); } } return ds; } private SqlDataReader CompleteAsyncExecuteReader() { SqlDataReader cachedAsyncReader = cachedAsyncState.CachedAsyncReader; bool flag = true; try { FinishExecuteReader(cachedAsyncReader, cachedAsyncState.CachedRunBehavior, cachedAsyncState.CachedSetOptions); return cachedAsyncReader; } catch (Exception e) { flag = ADP.IsCatchableExceptionType(e); throw; } finally { if (flag) { cachedAsyncState.ResetAsyncState(); PutStateObject(); } } } private void FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, string resetOptionsString) { NotifyDependency(); if (runBehavior == RunBehavior.UntilDone) { try { if (!_stateObj.Parser.TryRun(RunBehavior.UntilDone, this, ds, null, _stateObj, out var _)) { throw SQL.SynchronousCallMayNotPend(); } } catch (Exception e) { if (ADP.IsCatchableExceptionType(e)) { if (_inPrepare) { _inPrepare = false; IsDirty = true; _execType = EXECTYPE.PREPAREPENDING; } if (ds != null) { try { ds.Close(); } catch (Exception) { } } } throw; } } if (ds == null) { return; } ds.Bind(_stateObj); _stateObj = null; ds.ResetOptionsString = resetOptionsString; _activeConnection.AddWeakReference(ds, 1); try { _cachedMetaData = ds.MetaData; ds.IsInitialized = true; } catch (Exception e2) { if (ADP.IsCatchableExceptionType(e2)) { if (_inPrepare) { _inPrepare = false; IsDirty = true; _execType = EXECTYPE.PREPAREPENDING; } try { ds.Close(); } catch (Exception) { } } throw; } } private void RegisterForConnectionCloseNotification(ref Task outerTask) { (_activeConnection ?? throw ADP.ClosedConnectionError()).RegisterForConnectionCloseNotification(ref outerTask, this, 2); } private void ValidateCommand(bool async, [CallerMemberName] string method = "") { if (_activeConnection == null) { throw ADP.ConnectionRequired(method); } if (_activeConnection.InnerConnection is SqlInternalConnectionTds sqlInternalConnectionTds) { TdsParser parser = sqlInternalConnectionTds.Parser; if (parser == null || parser.State == TdsParserState.Closed) { throw ADP.OpenConnectionRequired(method, ConnectionState.Closed); } if (parser.State != TdsParserState.OpenLoggedIn) { throw ADP.OpenConnectionRequired(method, ConnectionState.Broken); } } else { if (_activeConnection.State == ConnectionState.Closed) { throw ADP.OpenConnectionRequired(method, ConnectionState.Closed); } if (_activeConnection.State == ConnectionState.Broken) { throw ADP.OpenConnectionRequired(method, ConnectionState.Broken); } } ValidateAsyncCommand(); _activeConnection.ValidateConnectionForExecute(method, this); if (_transaction != null && _transaction.Connection == null) { _transaction = null; } if (_activeConnection.HasLocalTransactionFromAPI && _transaction == null) { throw ADP.TransactionRequired(method); } if (_transaction != null && _activeConnection != _transaction.Connection) { throw ADP.TransactionConnectionMismatch(); } if (string.IsNullOrEmpty(CommandText)) { throw ADP.CommandTextRequired(method); } } private void ValidateAsyncCommand() { if (cachedAsyncState.PendingAsyncOperation) { if (cachedAsyncState.IsActiveConnectionValid(_activeConnection)) { throw SQL.PendingBeginXXXExists(); } _stateObj = null; cachedAsyncState.ResetAsyncState(); } } private void GetStateObject(TdsParser parser = null) { if (_pendingCancel) { _pendingCancel = false; throw SQL.OperationCancelled(); } if (parser == null) { parser = _activeConnection.Parser; if (parser == null || parser.State == TdsParserState.Broken || parser.State == TdsParserState.Closed) { throw ADP.ClosedConnectionError(); } } TdsParserStateObject session = parser.GetSession(this); session.StartSession(this); _stateObj = session; if (_pendingCancel) { _pendingCancel = false; throw SQL.OperationCancelled(); } } private void ReliablePutStateObject() { PutStateObject(); } private void PutStateObject() { TdsParserStateObject stateObj = _stateObj; _stateObj = null; stateObj?.CloseSession(); } internal void OnDoneProc() { if (BatchRPCMode) { _SqlRPCBatchArray[_currentlyExecutingBatch].cumulativeRecordsAffected = _rowsAffected; _SqlRPCBatchArray[_currentlyExecutingBatch].recordsAffected = ((0 < _currentlyExecutingBatch && 0 <= _rowsAffected) ? (_rowsAffected - Math.Max(_SqlRPCBatchArray[_currentlyExecutingBatch - 1].cumulativeRecordsAffected, 0)) : _rowsAffected); _SqlRPCBatchArray[_currentlyExecutingBatch].errorsIndexStart = ((0 < _currentlyExecutingBatch) ? _SqlRPCBatchArray[_currentlyExecutingBatch - 1].errorsIndexEnd : 0); _SqlRPCBatchArray[_currentlyExecutingBatch].errorsIndexEnd = _stateObj.ErrorCount; _SqlRPCBatchArray[_currentlyExecutingBatch].errors = _stateObj._errors; _SqlRPCBatchArray[_currentlyExecutingBatch].warningsIndexStart = ((0 < _currentlyExecutingBatch) ? _SqlRPCBatchArray[_currentlyExecutingBatch - 1].warningsIndexEnd : 0); _SqlRPCBatchArray[_currentlyExecutingBatch].warningsIndexEnd = _stateObj.WarningCount; _SqlRPCBatchArray[_currentlyExecutingBatch].warnings = _stateObj._warnings; _currentlyExecutingBatch++; } } internal void OnReturnStatus(int status) { if (_inPrepare) { return; } SqlParameterCollection sqlParameterCollection = _parameters; if (BatchRPCMode) { sqlParameterCollection = ((_parameterCollectionList.Count <= _currentlyExecutingBatch) ? null : _parameterCollectionList[_currentlyExecutingBatch]); } int parameterCount = GetParameterCount(sqlParameterCollection); for (int i = 0; i < parameterCount; i++) { SqlParameter sqlParameter = sqlParameterCollection[i]; if (sqlParameter.Direction == ParameterDirection.ReturnValue) { object value = sqlParameter.Value; if (value != null && value.GetType() == typeof(SqlInt32)) { sqlParameter.Value = new SqlInt32(status); } else { sqlParameter.Value = status; } break; } } } internal void OnReturnValue(SqlReturnValue rec) { if (_inPrepare) { if (!rec.value.IsNull) { _prepareHandle = rec.value.Int32; } _inPrepare = false; return; } SqlParameterCollection currentParameterCollection = GetCurrentParameterCollection(); int parameterCount = GetParameterCount(currentParameterCollection); SqlParameter parameterForOutputValueExtraction = GetParameterForOutputValueExtraction(currentParameterCollection, rec.parameter, parameterCount); if (parameterForOutputValueExtraction != null) { _ = parameterForOutputValueExtraction.Value; parameterForOutputValueExtraction.SetSqlBuffer(rec.value); MetaType metaTypeFromSqlDbType = MetaType.GetMetaTypeFromSqlDbType(rec.type, isMultiValued: false); if (rec.type == SqlDbType.Decimal) { parameterForOutputValueExtraction.ScaleInternal = rec.scale; parameterForOutputValueExtraction.PrecisionInternal = rec.precision; } else if (metaTypeFromSqlDbType.IsVarTime) { parameterForOutputValueExtraction.ScaleInternal = rec.scale; } else if (rec.type == SqlDbType.Xml && parameterForOutputValueExtraction.Value is SqlCachedBuffer sqlCachedBuffer) { parameterForOutputValueExtraction.Value = sqlCachedBuffer.ToString(); } if (rec.collation != null) { parameterForOutputValueExtraction.Collation = rec.collation; } } } private SqlParameterCollection GetCurrentParameterCollection() { if (BatchRPCMode) { if (_parameterCollectionList.Count > _currentlyExecutingBatch) { return _parameterCollectionList[_currentlyExecutingBatch]; } return null; } return _parameters; } private SqlParameter GetParameterForOutputValueExtraction(SqlParameterCollection parameters, string paramName, int paramCount) { SqlParameter sqlParameter = null; bool flag = false; if (paramName == null) { for (int i = 0; i < paramCount; i++) { sqlParameter = parameters[i]; if (sqlParameter.Direction == ParameterDirection.ReturnValue) { flag = true; break; } } } else { for (int j = 0; j < paramCount; j++) { sqlParameter = parameters[j]; if (sqlParameter.Direction != ParameterDirection.Input && sqlParameter.Direction != ParameterDirection.ReturnValue && paramName == sqlParameter.ParameterNameFixed) { flag = true; break; } } } if (flag) { return sqlParameter; } return null; } private void GetRPCObject(int paramCount, ref _SqlRPC rpc) { if (rpc == null) { if (_rpcArrayOf1 == null) { _rpcArrayOf1 = new _SqlRPC[1]; _rpcArrayOf1[0] = new _SqlRPC(); } rpc = _rpcArrayOf1[0]; } rpc.ProcID = 0; rpc.rpcName = null; rpc.options = 0; if (rpc.parameters == null || rpc.parameters.Length < paramCount) { rpc.parameters = new SqlParameter[paramCount]; } else if (rpc.parameters.Length > paramCount) { rpc.parameters[paramCount] = null; } if (rpc.paramoptions == null || rpc.paramoptions.Length < paramCount) { rpc.paramoptions = new byte[paramCount]; return; } for (int i = 0; i < paramCount; i++) { rpc.paramoptions[i] = 0; } } private void SetUpRPCParameters(_SqlRPC rpc, int startCount, bool inSchema, SqlParameterCollection parameters) { int parameterCount = GetParameterCount(parameters); int num = startCount; _ = _activeConnection.Parser; for (int i = 0; i < parameterCount; i++) { SqlParameter sqlParameter = parameters[i]; sqlParameter.Validate(i, CommandType.StoredProcedure == CommandType); if (!sqlParameter.ValidateTypeLengths().IsPlp && sqlParameter.Direction != ParameterDirection.Output) { sqlParameter.FixStreamDataForNonPLP(); } if (ShouldSendParameter(sqlParameter)) { rpc.parameters[num] = sqlParameter; if (sqlParameter.Direction == ParameterDirection.InputOutput || sqlParameter.Direction == ParameterDirection.Output) { rpc.paramoptions[num] = 1; } if (sqlParameter.Direction != ParameterDirection.Output && sqlParameter.Value == null && (!inSchema || SqlDbType.Structured == sqlParameter.SqlDbType)) { rpc.paramoptions[num] |= 2; } num++; } } } private _SqlRPC BuildPrepExec(CommandBehavior behavior) { int num = 3; int num2 = CountSendableParameters(_parameters); _SqlRPC rpc = null; GetRPCObject(num2 + num, ref rpc); rpc.ProcID = 13; rpc.rpcName = "sp_prepexec"; SqlParameter sqlParameter = new SqlParameter(null, SqlDbType.Int); sqlParameter.Direction = ParameterDirection.InputOutput; sqlParameter.Value = _prepareHandle; rpc.parameters[0] = sqlParameter; rpc.paramoptions[0] = 1; string text = BuildParamList(_stateObj.Parser, _parameters); sqlParameter = new SqlParameter(null, (text.Length << 1 <= 8000) ? SqlDbType.NVarChar : SqlDbType.NText, text.Length); sqlParameter.Value = text; rpc.parameters[1] = sqlParameter; string commandText = GetCommandText(behavior); sqlParameter = new SqlParameter(null, (commandText.Length << 1 <= 8000) ? SqlDbType.NVarChar : SqlDbType.NText, commandText.Length); sqlParameter.Value = commandText; rpc.parameters[2] = sqlParameter; SetUpRPCParameters(rpc, num, inSchema: false, _parameters); return rpc; } private static bool ShouldSendParameter(SqlParameter p) { ParameterDirection direction = p.Direction; if ((uint)(direction - 1) > 2u) { _ = 6; return false; } return true; } private int CountSendableParameters(SqlParameterCollection parameters) { int num = 0; if (parameters != null) { int count = parameters.Count; for (int i = 0; i < count; i++) { if (ShouldSendParameter(parameters[i])) { num++; } } } return num; } private int GetParameterCount(SqlParameterCollection parameters) { return parameters?.Count ?? 0; } private void BuildRPC(bool inSchema, SqlParameterCollection parameters, ref _SqlRPC rpc) { int paramCount = CountSendableParameters(parameters); GetRPCObject(paramCount, ref rpc); rpc.rpcName = CommandText; SetUpRPCParameters(rpc, 0, inSchema, parameters); } private _SqlRPC BuildExecute(bool inSchema) { int num = 1; int num2 = CountSendableParameters(_parameters); _SqlRPC rpc = null; GetRPCObject(num2 + num, ref rpc); rpc.ProcID = 12; rpc.rpcName = "sp_execute"; SqlParameter sqlParameter = new SqlParameter(null, SqlDbType.Int); sqlParameter.Value = _prepareHandle; rpc.parameters[0] = sqlParameter; SetUpRPCParameters(rpc, num, inSchema, _parameters); return rpc; } private void BuildExecuteSql(CommandBehavior behavior, string commandText, SqlParameterCollection parameters, ref _SqlRPC rpc) { int num = CountSendableParameters(parameters); int num2 = ((num <= 0) ? 1 : 2); GetRPCObject(num + num2, ref rpc); rpc.ProcID = 10; rpc.rpcName = "sp_executesql"; if (commandText == null) { commandText = GetCommandText(behavior); } SqlParameter sqlParameter = new SqlParameter(null, (commandText.Length << 1 <= 8000) ? SqlDbType.NVarChar : SqlDbType.NText, commandText.Length); sqlParameter.Value = commandText; rpc.parameters[0] = sqlParameter; if (num > 0) { string text = BuildParamList(_stateObj.Parser, BatchRPCMode ? parameters : _parameters); sqlParameter = new SqlParameter(null, (text.Length << 1 <= 8000) ? SqlDbType.NVarChar : SqlDbType.NText, text.Length); sqlParameter.Value = text; rpc.parameters[1] = sqlParameter; bool inSchema = (behavior & CommandBehavior.SchemaOnly) != 0; SetUpRPCParameters(rpc, num2, inSchema, parameters); } } internal string BuildParamList(TdsParser parser, SqlParameterCollection parameters) { StringBuilder stringBuilder = new StringBuilder(); bool flag = false; int num = 0; num = parameters.Count; for (int i = 0; i < num; i++) { SqlParameter sqlParameter = parameters[i]; sqlParameter.Validate(i, CommandType.StoredProcedure == CommandType); if (!ShouldSendParameter(sqlParameter)) { continue; } if (flag) { stringBuilder.Append(','); } stringBuilder.Append(sqlParameter.ParameterNameFixed); MetaType metaType = sqlParameter.InternalMetaType; stringBuilder.Append(" "); if (metaType.SqlDbType == SqlDbType.Udt) { throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString()); } if (metaType.SqlDbType == SqlDbType.Structured) { string typeName = sqlParameter.TypeName; if (string.IsNullOrEmpty(typeName)) { throw SQL.MustSetTypeNameForParam(metaType.TypeName, sqlParameter.ParameterNameFixed); } stringBuilder.Append(ParseAndQuoteIdentifier(typeName)); stringBuilder.Append(" READONLY"); } else { metaType = sqlParameter.ValidateTypeLengths(); if (!metaType.IsPlp && sqlParameter.Direction != ParameterDirection.Output) { sqlParameter.FixStreamDataForNonPLP(); } stringBuilder.Append(metaType.TypeName); } flag = true; if (metaType.SqlDbType == SqlDbType.Decimal) { byte b = sqlParameter.GetActualPrecision(); byte actualScale = sqlParameter.GetActualScale(); stringBuilder.Append('('); if (b == 0) { b = 29; } stringBuilder.Append(b); stringBuilder.Append(','); stringBuilder.Append(actualScale); stringBuilder.Append(')'); } else if (metaType.IsVarTime) { byte actualScale2 = sqlParameter.GetActualScale(); stringBuilder.Append('('); stringBuilder.Append(actualScale2); stringBuilder.Append(')'); } else if (!metaType.IsFixed && !metaType.IsLong && metaType.SqlDbType != SqlDbType.Timestamp && metaType.SqlDbType != SqlDbType.Udt && SqlDbType.Structured != metaType.SqlDbType) { int num2 = sqlParameter.Size; stringBuilder.Append('('); if (metaType.IsAnsiType) { object coercedValue = sqlParameter.GetCoercedValue(); string text = null; if (coercedValue != null && DBNull.Value != coercedValue) { text = coercedValue as string; if (text == null) { SqlString sqlString = ((coercedValue is SqlString) ? ((SqlString)coercedValue) : SqlString.Null); if (!sqlString.IsNull) { text = sqlString.Value; } } } if (text != null) { int encodingCharLength = parser.GetEncodingCharLength(text, sqlParameter.GetActualSize(), sqlParameter.Offset, null); if (encodingCharLength > num2) { num2 = encodingCharLength; } } } if (num2 == 0) { num2 = (metaType.IsSizeInCharacters ? 4000 : 8000); } stringBuilder.Append(num2); stringBuilder.Append(')'); } else if (metaType.IsPlp && metaType.SqlDbType != SqlDbType.Xml && metaType.SqlDbType != SqlDbType.Udt) { stringBuilder.Append("(max) "); } if (sqlParameter.Direction != ParameterDirection.Input) { stringBuilder.Append(" output"); } } return stringBuilder.ToString(); } private string ParseAndQuoteIdentifier(string identifier) { string[] array = SqlParameter.ParseTypeName(identifier); StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < array.Length; i++) { if (0 < stringBuilder.Length) { stringBuilder.Append('.'); } if (array[i] != null && array[i].Length != 0) { stringBuilder.Append(ADP.BuildQuotedString("[", "]", array[i])); } } return stringBuilder.ToString(); } private string GetSetOptionsString(CommandBehavior behavior) { string text = null; if (CommandBehavior.SchemaOnly == (behavior & CommandBehavior.SchemaOnly) || CommandBehavior.KeyInfo == (behavior & CommandBehavior.KeyInfo)) { text = " SET FMTONLY OFF;"; if (CommandBehavior.KeyInfo == (behavior & CommandBehavior.KeyInfo)) { text += " SET NO_BROWSETABLE ON;"; } if (CommandBehavior.SchemaOnly == (behavior & CommandBehavior.SchemaOnly)) { text += " SET FMTONLY ON;"; } } return text; } private string GetResetOptionsString(CommandBehavior behavior) { string text = null; if (CommandBehavior.SchemaOnly == (behavior & CommandBehavior.SchemaOnly)) { text += " SET FMTONLY OFF;"; } if (CommandBehavior.KeyInfo == (behavior & CommandBehavior.KeyInfo)) { text += " SET NO_BROWSETABLE OFF;"; } return text; } private string GetCommandText(CommandBehavior behavior) { return GetSetOptionsString(behavior) + CommandText; } internal void CheckThrowSNIException() { _stateObj?.CheckThrowSNIException(); } internal void OnConnectionClosed() { _stateObj?.OnConnectionClosed(); } internal void ClearBatchCommand() { _RPCList?.Clear(); if (_parameterCollectionList != null) { _parameterCollectionList.Clear(); } _SqlRPCBatchArray = null; _currentlyExecutingBatch = 0; } internal void AddBatchCommand(string commandText, SqlParameterCollection parameters, CommandType cmdType) { _SqlRPC rpc = new _SqlRPC(); CommandText = commandText; CommandType = cmdType; GetStateObject(); if (cmdType == CommandType.StoredProcedure) { BuildRPC(inSchema: false, parameters, ref rpc); } else { BuildExecuteSql(CommandBehavior.Default, commandText, parameters, ref rpc); } _RPCList.Add(rpc); _parameterCollectionList.Add(parameters); ReliablePutStateObject(); } internal int ExecuteBatchRPCCommand() { _SqlRPCBatchArray = _RPCList.ToArray(); _currentlyExecutingBatch = 0; return ExecuteNonQuery(); } internal int? GetRecordsAffected(int commandIndex) { return _SqlRPCBatchArray[commandIndex].recordsAffected; } internal SqlException GetErrors(int commandIndex) { SqlException result = null; int num = _SqlRPCBatchArray[commandIndex].errorsIndexEnd - _SqlRPCBatchArray[commandIndex].errorsIndexStart; if (0 < num) { SqlErrorCollection sqlErrorCollection = new SqlErrorCollection(); for (int i = _SqlRPCBatchArray[commandIndex].errorsIndexStart; i < _SqlRPCBatchArray[commandIndex].errorsIndexEnd; i++) { sqlErrorCollection.Add(_SqlRPCBatchArray[commandIndex].errors[i]); } for (int j = _SqlRPCBatchArray[commandIndex].warningsIndexStart; j < _SqlRPCBatchArray[commandIndex].warningsIndexEnd; j++) { sqlErrorCollection.Add(_SqlRPCBatchArray[commandIndex].warnings[j]); } result = SqlException.CreateException(sqlErrorCollection, Connection.ServerVersion, Connection.ClientConnectionId); } return result; } internal new void CancelIgnoreFailure() { try { Cancel(); } catch (Exception) { } } private void NotifyDependency() { if (_sqlDep != null) { _sqlDep.StartTimer(Notification); } } object ICloneable.Clone() { return Clone(); } public SqlCommand Clone() { return new SqlCommand(this); } [HostProtection(SecurityAction.LinkDemand, ExternalThreading = true)] public IAsyncResult BeginExecuteNonQuery() { return BeginExecuteNonQuery(null, null); } [HostProtection(SecurityAction.LinkDemand, ExternalThreading = true)] public IAsyncResult BeginExecuteXmlReader() { return BeginExecuteXmlReader(null, null); } [HostProtection(SecurityAction.LinkDemand, ExternalThreading = true)] public IAsyncResult BeginExecuteReader() { return BeginExecuteReader(CommandBehavior.Default, null, null); } [HostProtection(SecurityAction.LinkDemand, ExternalThreading = true)] public IAsyncResult BeginExecuteReader(AsyncCallback callback, object stateObject) { return BeginExecuteReader(CommandBehavior.Default, callback, stateObject); } [HostProtection(SecurityAction.LinkDemand, ExternalThreading = true)] public IAsyncResult BeginExecuteReader(AsyncCallback callback, object stateObject, CommandBehavior behavior) { return BeginExecuteReader(behavior, callback, stateObject); } [HostProtection(SecurityAction.LinkDemand, ExternalThreading = true)] public IAsyncResult BeginExecuteReader(CommandBehavior behavior) { return BeginExecuteReader(behavior, null, null); } public SqlCommand(string cmdText, SqlConnection connection, SqlTransaction transaction, SqlCommandColumnEncryptionSetting columnEncryptionSetting) { ThrowStub.ThrowNotSupportedException(); } } public sealed class SqlCommandBuilder : DbCommandBuilder { public override CatalogLocation CatalogLocation { get { return CatalogLocation.Start; } set { if (CatalogLocation.Start != value) { throw ADP.SingleValuedProperty("CatalogLocation", "Start"); } } } public override string CatalogSeparator { get { return "."; } set { if ("." != value) { throw ADP.SingleValuedProperty("CatalogSeparator", "."); } } } public new SqlDataAdapter DataAdapter { get { return (SqlDataAdapter)base.DataAdapter; } set { base.DataAdapter = value; } } public override string QuotePrefix { get { return base.QuotePrefix; } set { if ("[" != value && "\"" != value) { throw ADP.DoubleValuedProperty("QuotePrefix", "[", "\""); } base.QuotePrefix = value; } } public override string QuoteSuffix { get { return base.QuoteSuffix; } set { if ("]" != value && "\"" != value) { throw ADP.DoubleValuedProperty("QuoteSuffix", "]", "\""); } base.QuoteSuffix = value; } } public override string SchemaSeparator { get { return "."; } set { if ("." != value) { throw ADP.SingleValuedProperty("SchemaSeparator", "."); } } } public SqlCommandBuilder() { GC.SuppressFinalize(this); base.QuotePrefix = "["; base.QuoteSuffix = "]"; } public SqlCommandBuilder(SqlDataAdapter adapter) : this() { DataAdapter = adapter; } private void SqlRowUpdatingHandler(object sender, SqlRowUpdatingEventArgs ruevent) { RowUpdatingHandler(ruevent); } public new SqlCommand GetInsertCommand() { return (SqlCommand)base.GetInsertCommand(); } public new SqlCommand GetInsertCommand(bool useColumnsForParameterNames) { return (SqlCommand)base.GetInsertCommand(useColumnsForParameterNames); } public new SqlCommand GetUpdateCommand() { return (SqlCommand)base.GetUpdateCommand(); } public new SqlCommand GetUpdateCommand(bool useColumnsForParameterNames) { return (SqlCommand)base.GetUpdateCommand(useColumnsForParameterNames); } public new SqlCommand GetDeleteCommand() { return (SqlCommand)base.GetDeleteCommand(); } public new SqlCommand GetDeleteCommand(bool useColumnsForParameterNames) { return (SqlCommand)base.GetDeleteCommand(useColumnsForParameterNames); } protected override void ApplyParameterInfo(DbParameter parameter, DataRow datarow, StatementType statementType, bool whereClause) { SqlParameter sqlParameter = (SqlParameter)parameter; object obj = datarow[SchemaTableColumn.ProviderType]; sqlParameter.SqlDbType = (SqlDbType)obj; sqlParameter.Offset = 0; object obj2 = datarow[SchemaTableColumn.NumericPrecision]; if (DBNull.Value != obj2) { byte b = (byte)(short)obj2; sqlParameter.PrecisionInternal = (byte)((byte.MaxValue != b) ? b : 0); } obj2 = datarow[SchemaTableColumn.NumericScale]; if (DBNull.Value != obj2) { byte b2 = (byte)(short)obj2; sqlParameter.ScaleInternal = (byte)((byte.MaxValue != b2) ? b2 : 0); } } protected override string GetParameterName(int parameterOrdinal) { return "@p" + parameterOrdinal.ToString(CultureInfo.InvariantCulture); } protected override string GetParameterName(string parameterName) { return "@" + parameterName; } protected override string GetParameterPlaceholder(int parameterOrdinal) { return "@p" + parameterOrdinal.ToString(CultureInfo.InvariantCulture); } private void ConsistentQuoteDelimiters(string quotePrefix, string quoteSuffix) { if (("\"" == quotePrefix && "\"" != quoteSuffix) || ("[" == quotePrefix && "]" != quoteSuffix)) { throw ADP.InvalidPrefixSuffix(); } } public static void DeriveParameters(SqlCommand command) { if (command == null) { throw ADP.ArgumentNull("command"); } RuntimeHelpers.PrepareConstrainedRegions(); try { command.DeriveParameters(); } catch (OutOfMemoryException e) { command?.Connection?.Abort(e); throw; } catch (StackOverflowException e2) { command?.Connection?.Abort(e2); throw; } catch (ThreadAbortException e3) { command?.Connection?.Abort(e3); throw; } } protected override DataTable GetSchemaTable(DbCommand srcCommand) { SqlCommand sqlCommand = srcCommand as SqlCommand; SqlNotificationRequest notification = sqlCommand.Notification; sqlCommand.Notification = null; try { using SqlDataReader sqlDataReader = sqlCommand.ExecuteReader(CommandBehavior.SchemaOnly | CommandBehavior.KeyInfo); return sqlDataReader.GetSchemaTable(); } finally { sqlCommand.Notification = notification; } } protected override DbCommand InitializeCommand(DbCommand command) { return (SqlCommand)base.InitializeCommand(command); } public override string QuoteIdentifier(string unquotedIdentifier) { ADP.CheckArgumentNull(unquotedIdentifier, "unquotedIdentifier"); string quoteSuffix = QuoteSuffix; string quotePrefix = QuotePrefix; ConsistentQuoteDelimiters(quotePrefix, quoteSuffix); return ADP.BuildQuotedString(quotePrefix, quoteSuffix, unquotedIdentifier); } protected override void SetRowUpdatingHandler(DbDataAdapter adapter) { if (adapter == base.DataAdapter) { ((SqlDataAdapter)adapter).RowUpdating -= SqlRowUpdatingHandler; } else { ((SqlDataAdapter)adapter).RowUpdating += SqlRowUpdatingHandler; } } public override string UnquoteIdentifier(string quotedIdentifier) { ADP.CheckArgumentNull(quotedIdentifier, "quotedIdentifier"); string quoteSuffix = QuoteSuffix; string quotePrefix = QuotePrefix; ConsistentQuoteDelimiters(quotePrefix, quoteSuffix); ADP.RemoveStringQuotes(quotePrefix, quoteSuffix, quotedIdentifier, out var unquotedString); return unquotedString; } } internal sealed class SqlCommandSet { private sealed class LocalCommand { internal readonly string CommandText; internal readonly SqlParameterCollection Parameters; internal readonly int ReturnParameterIndex; internal readonly CommandType CmdType; internal LocalCommand(string commandText, SqlParameterCollection parameters, int returnParameterIndex, CommandType cmdType) { CommandText = commandText; Parameters = parameters; ReturnParameterIndex = returnParameterIndex; CmdType = cmdType; } } private const string SqlIdentifierPattern = "^@[\\p{Lo}\\p{Lu}\\p{Ll}\\p{Lm}_@#][\\p{Lo}\\p{Lu}\\p{Ll}\\p{Lm}\\p{Nd}\uff3f_@#\\$]*$"; private static readonly Regex s_sqlIdentifierParser = new Regex("^@[\\p{Lo}\\p{Lu}\\p{Ll}\\p{Lm}_@#][\\p{Lo}\\p{Lu}\\p{Ll}\\p{Lm}\\p{Nd}\uff3f_@#\\$]*$", RegexOptions.ExplicitCapture | RegexOptions.Singleline); private List _commandList = new List(); private SqlCommand _batchCommand; private SqlCommand BatchCommand { get { SqlCommand batchCommand = _batchCommand; if (batchCommand == null) { throw ADP.ObjectDisposed(this); } return batchCommand; } } internal int CommandCount => CommandList.Count; private List CommandList { get { List commandList = _commandList; if (commandList == null) { throw ADP.ObjectDisposed(this); } return commandList; } } internal int CommandTimeout { set { BatchCommand.CommandTimeout = value; } } internal SqlConnection Connection { get { return BatchCommand.Connection; } set { BatchCommand.Connection = value; } } internal SqlTransaction Transaction { set { BatchCommand.Transaction = value; } } internal SqlCommandSet() { _batchCommand = new SqlCommand(); } internal void Append(SqlCommand command) { ADP.CheckArgumentNull(command, "command"); string commandText = command.CommandText; if (string.IsNullOrEmpty(commandText)) { throw ADP.CommandTextRequired("Append"); } CommandType commandType = command.CommandType; switch (commandType) { case CommandType.TableDirect: throw SQL.NotSupportedCommandType(commandType); default: throw ADP.InvalidCommandType(commandType); case CommandType.Text: case CommandType.StoredProcedure: { SqlParameterCollection sqlParameterCollection = null; SqlParameterCollection parameters = command.Parameters; if (0 < parameters.Count) { sqlParameterCollection = new SqlParameterCollection(); for (int i = 0; i < parameters.Count; i++) { SqlParameter sqlParameter = new SqlParameter(); parameters[i].CopyTo(sqlParameter); sqlParameterCollection.Add(sqlParameter); if (!s_sqlIdentifierParser.IsMatch(sqlParameter.ParameterName)) { throw ADP.BadParameterName(sqlParameter.ParameterName); } } foreach (SqlParameter item2 in sqlParameterCollection) { object value = item2.Value; if (value is byte[] array) { int offset = item2.Offset; int size = item2.Size; int num = array.Length - offset; if (size != 0 && size < num) { num = size; } byte[] array2 = new byte[Math.Max(num, 0)]; Buffer.BlockCopy(array, offset, array2, 0, array2.Length); item2.Offset = 0; item2.Value = array2; } else if (value is char[] array3) { int offset2 = item2.Offset; int size2 = item2.Size; int num2 = array3.Length - offset2; if (size2 != 0 && size2 < num2) { num2 = size2; } char[] array4 = new char[Math.Max(num2, 0)]; Buffer.BlockCopy(array3, offset2, array4, 0, array4.Length * 2); item2.Offset = 0; item2.Value = array4; } else if (value is ICloneable cloneable) { item2.Value = cloneable.Clone(); } } } int returnParameterIndex = -1; if (sqlParameterCollection != null) { for (int j = 0; j < sqlParameterCollection.Count; j++) { if (ParameterDirection.ReturnValue == sqlParameterCollection[j].Direction) { returnParameterIndex = j; break; } } } LocalCommand item = new LocalCommand(commandText, sqlParameterCollection, returnParameterIndex, command.CommandType); CommandList.Add(item); break; } } } internal static void BuildStoredProcedureName(StringBuilder builder, string part) { if (part == null || 0 >= part.Length) { return; } if ('[' == part[0]) { int num = 0; foreach (char c in part) { if (']' == c) { num++; } } if (1 == num % 2) { builder.Append(part); return; } } SqlServerEscapeHelper.EscapeIdentifier(builder, part); } internal void Clear() { DbCommand batchCommand = BatchCommand; if (batchCommand != null) { batchCommand.Parameters.Clear(); batchCommand.CommandText = null; } _commandList?.Clear(); } internal void Dispose() { SqlCommand batchCommand = _batchCommand; _commandList = null; _batchCommand = null; batchCommand?.Dispose(); } internal int ExecuteNonQuery() { ValidateCommandBehavior("ExecuteNonQuery", CommandBehavior.Default); BatchCommand.BatchRPCMode = true; BatchCommand.ClearBatchCommand(); BatchCommand.Parameters.Clear(); for (int i = 0; i < _commandList.Count; i++) { LocalCommand localCommand = _commandList[i]; BatchCommand.AddBatchCommand(localCommand.CommandText, localCommand.Parameters, localCommand.CmdType); } return BatchCommand.ExecuteBatchRPCCommand(); } internal SqlParameter GetParameter(int commandIndex, int parameterIndex) { return CommandList[commandIndex].Parameters[parameterIndex]; } internal bool GetBatchedAffected(int commandIdentifier, out int recordsAffected, out Exception error) { error = BatchCommand.GetErrors(commandIdentifier); int? recordsAffected2 = BatchCommand.GetRecordsAffected(commandIdentifier); recordsAffected = recordsAffected2.GetValueOrDefault(); return recordsAffected2.HasValue; } internal int GetParameterCount(int commandIndex) { return CommandList[commandIndex].Parameters.Count; } private void ValidateCommandBehavior(string method, CommandBehavior behavior) { if (((uint)behavior & 0xFFFFFFCFu) != 0) { ADP.ValidateCommandBehavior(behavior); throw ADP.NotSupportedCommandBehavior(behavior & ~(CommandBehavior.SequentialAccess | CommandBehavior.CloseConnection), method); } } } public sealed class SqlConnection : DbConnection, ICloneable, IDbConnection, IDisposable { private class OpenAsyncRetry { private SqlConnection _parent; private TaskCompletionSource _retry; private TaskCompletionSource _result; private CancellationTokenRegistration _registration; public OpenAsyncRetry(SqlConnection parent, TaskCompletionSource retry, TaskCompletionSource result, CancellationTokenRegistration registration) { _parent = parent; _retry = retry; _result = result; _registration = registration; } internal void Retry(Task retryTask) { _registration.Dispose(); try { SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(_parent.Statistics); if (retryTask.IsFaulted) { _ = retryTask.Exception.InnerException; _parent.CloseInnerConnection(); _parent._currentCompletion = null; _result.SetException(retryTask.Exception.InnerException); return; } if (retryTask.IsCanceled) { _parent.CloseInnerConnection(); _parent._currentCompletion = null; _result.SetCanceled(); return; } bool flag; lock (_parent.InnerConnection) { flag = _parent.TryOpen(_retry); } if (flag) { _parent._currentCompletion = null; _result.SetResult(null); } else { _parent.CloseInnerConnection(); _parent._currentCompletion = null; _result.SetException(ADP.ExceptionWithStackTrace(ADP.InternalError(ADP.InternalErrorCode.CompletedConnectReturnedPending))); } } finally { SqlStatistics.StopTimer(statistics); } } catch (Exception exception) { _parent.CloseInnerConnection(); _parent._currentCompletion = null; _result.SetException(exception); } } } private bool _AsyncCommandInProgress; internal SqlStatistics _statistics; private bool _collectstats; private bool _fireInfoMessageEventOnUserErrors; private Tuple, Task> _currentCompletion; private string _connectionString; private int _connectRetryCount; private object _reconnectLock = new object(); internal Task _currentReconnectionTask; private Task _asyncWaitingForReconnection; private Guid _originalConnectionId = Guid.Empty; private CancellationTokenSource _reconnectionCancellationSource; internal SessionData _recoverySessionData; internal new bool _suppressStateChangeForReconnection; private int _reconnectCount; private static readonly DiagnosticListener s_diagnosticListener = new DiagnosticListener("SqlClientDiagnosticListener"); internal bool _applyTransientFaultHandling; private static readonly DbConnectionFactory s_connectionFactory = SqlConnectionFactory.SingletonInstance; private DbConnectionOptions _userConnectionOptions; private DbConnectionPoolGroup _poolGroup; private DbConnectionInternal _innerConnection; private int _closeCount; public bool StatisticsEnabled { get { return _collectstats; } set { if (value) { if (ConnectionState.Open == State) { if (_statistics == null) { _statistics = new SqlStatistics(); ADP.TimerCurrent(out _statistics._openTimestamp); } Parser.Statistics = _statistics; } } else if (_statistics != null && ConnectionState.Open == State) { Parser.Statistics = null; ADP.TimerCurrent(out _statistics._closeTimestamp); } _collectstats = value; } } internal bool AsyncCommandInProgress { get { return _AsyncCommandInProgress; } set { _AsyncCommandInProgress = value; } } internal SqlConnectionString.TransactionBindingEnum TransactionBinding => ((SqlConnectionString)ConnectionOptions).TransactionBinding; internal SqlConnectionString.TypeSystem TypeSystem => ((SqlConnectionString)ConnectionOptions).TypeSystemVersion; internal int ConnectRetryInterval => ((SqlConnectionString)ConnectionOptions).ConnectRetryInterval; public override string ConnectionString { get { return ConnectionString_Get(); } set { ConnectionString_Set(new SqlConnectionPoolKey(value)); _connectionString = value; CacheConnectionStringProperties(); } } public override int ConnectionTimeout => ((SqlConnectionString)ConnectionOptions)?.ConnectTimeout ?? 15; public override string Database { get { if (InnerConnection is SqlInternalConnection sqlInternalConnection) { return sqlInternalConnection.CurrentDatabase; } SqlConnectionString sqlConnectionString = (SqlConnectionString)ConnectionOptions; return (sqlConnectionString != null) ? sqlConnectionString.InitialCatalog : ""; } } public override string DataSource { get { if (InnerConnection is SqlInternalConnection sqlInternalConnection) { return sqlInternalConnection.CurrentDataSource; } SqlConnectionString sqlConnectionString = (SqlConnectionString)ConnectionOptions; return (sqlConnectionString != null) ? sqlConnectionString.DataSource : ""; } } public int PacketSize { get { if (InnerConnection is SqlInternalConnectionTds sqlInternalConnectionTds) { return sqlInternalConnectionTds.PacketSize; } return ((SqlConnectionString)ConnectionOptions)?.PacketSize ?? 8000; } } public Guid ClientConnectionId { get { if (InnerConnection is SqlInternalConnectionTds sqlInternalConnectionTds) { return sqlInternalConnectionTds.ClientConnectionId; } Task currentReconnectionTask = _currentReconnectionTask; if (currentReconnectionTask != null && !currentReconnectionTask.IsCompleted) { return _originalConnectionId; } return Guid.Empty; } } public override string ServerVersion => GetOpenTdsConnection().ServerVersion; public override ConnectionState State { get { Task currentReconnectionTask = _currentReconnectionTask; if (currentReconnectionTask != null && !currentReconnectionTask.IsCompleted) { return ConnectionState.Open; } return InnerConnection.State; } } internal SqlStatistics Statistics => _statistics; public string WorkstationId { get { SqlConnectionString sqlConnectionString = (SqlConnectionString)ConnectionOptions; if (sqlConnectionString == null) { return string.Empty; } return sqlConnectionString.WorkstationId; } } protected override DbProviderFactory DbProviderFactory => SqlClientFactory.Instance; public bool FireInfoMessageEventOnUserErrors { get { return _fireInfoMessageEventOnUserErrors; } set { _fireInfoMessageEventOnUserErrors = value; } } internal int ReconnectCount => _reconnectCount; internal bool ForceNewConnection { get; set; } internal bool HasLocalTransaction => GetOpenTdsConnection().HasLocalTransaction; internal bool HasLocalTransactionFromAPI { get { Task currentReconnectionTask = _currentReconnectionTask; if (currentReconnectionTask != null && !currentReconnectionTask.IsCompleted) { return false; } return GetOpenTdsConnection().HasLocalTransactionFromAPI; } } internal bool IsKatmaiOrNewer { get { if (_currentReconnectionTask != null) { return true; } return GetOpenTdsConnection().IsKatmaiOrNewer; } } internal TdsParser Parser => GetOpenTdsConnection().Parser; internal int CloseCount => _closeCount; internal DbConnectionFactory ConnectionFactory => s_connectionFactory; internal DbConnectionOptions ConnectionOptions => PoolGroup?.ConnectionOptions; internal DbConnectionInternal InnerConnection => _innerConnection; internal DbConnectionPoolGroup PoolGroup { get { return _poolGroup; } set { _poolGroup = value; } } internal DbConnectionOptions UserConnectionOptions => _userConnectionOptions; [MonoTODO] public SqlCredential Credentials { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } public string AccessToken { get { ThrowStub.ThrowNotSupportedException(); return null; } set { ThrowStub.ThrowNotSupportedException(); } } public static TimeSpan ColumnEncryptionKeyCacheTtl { get { ThrowStub.ThrowNotSupportedException(); return default(TimeSpan); } set { ThrowStub.ThrowNotSupportedException(); } } public static bool ColumnEncryptionQueryMetadataCacheEnabled { get { ThrowStub.ThrowNotSupportedException(); return default(bool); } set { ThrowStub.ThrowNotSupportedException(); } } public static IDictionary> ColumnEncryptionTrustedMasterKeyPaths { get { //IL_0007: Expected O, but got I4 ThrowStub.ThrowNotSupportedException(); return (IDictionary>)0; } } public SqlCredential Credential { get { ThrowStub.ThrowNotSupportedException(); return null; } set { ThrowStub.ThrowNotSupportedException(); } } public event SqlInfoMessageEventHandler InfoMessage; public SqlConnection(string connectionString) : this() { ConnectionString = connectionString; CacheConnectionStringProperties(); } private SqlConnection(SqlConnection connection) { GC.SuppressFinalize(this); CopyFrom(connection); _connectionString = connection._connectionString; CacheConnectionStringProperties(); } private void CacheConnectionStringProperties() { if (ConnectionOptions is SqlConnectionString sqlConnectionString) { _connectRetryCount = sqlConnectionString.ConnectRetryCount; } } protected override void OnStateChange(StateChangeEventArgs stateChange) { if (!_suppressStateChangeForReconnection) { base.OnStateChange(stateChange); } } public new SqlTransaction BeginTransaction() { return BeginTransaction(IsolationLevel.Unspecified, null); } public new SqlTransaction BeginTransaction(IsolationLevel iso) { return BeginTransaction(iso, null); } public SqlTransaction BeginTransaction(string transactionName) { return BeginTransaction(IsolationLevel.Unspecified, transactionName); } protected override DbTransaction BeginDbTransaction(IsolationLevel isolationLevel) { SqlTransaction result = BeginTransaction(isolationLevel); GC.KeepAlive(this); return result; } public SqlTransaction BeginTransaction(IsolationLevel iso, string transactionName) { WaitForPendingReconnection(); SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); bool shouldReconnect = true; SqlTransaction sqlTransaction; do { sqlTransaction = GetOpenTdsConnection().BeginSqlTransaction(iso, transactionName, shouldReconnect); shouldReconnect = false; } while (sqlTransaction.InternalTransaction.ConnectionHasBeenRestored); GC.KeepAlive(this); return sqlTransaction; } finally { SqlStatistics.StopTimer(statistics); } } public override void ChangeDatabase(string database) { SqlStatistics statistics = null; RepairInnerConnection(); try { statistics = SqlStatistics.StartTimer(Statistics); InnerConnection.ChangeDatabase(database); } finally { SqlStatistics.StopTimer(statistics); } } public static void ClearAllPools() { SqlConnectionFactory.SingletonInstance.ClearAllPools(); } public static void ClearPool(SqlConnection connection) { ADP.CheckArgumentNull(connection, "connection"); DbConnectionOptions userConnectionOptions = connection.UserConnectionOptions; if (userConnectionOptions != null) { SqlConnectionFactory.SingletonInstance.ClearPool(connection); } } private void CloseInnerConnection() { InnerConnection.CloseConnection(this, ConnectionFactory); } public override void Close() { ConnectionState state = State; Guid operationId = default(Guid); Guid clientConnectionId = default(Guid); if (state != 0) { operationId = s_diagnosticListener.WriteConnectionCloseBefore(this, "Close"); clientConnectionId = ClientConnectionId; } SqlStatistics statistics = null; Exception ex = null; try { statistics = SqlStatistics.StartTimer(Statistics); Task currentReconnectionTask = _currentReconnectionTask; if (currentReconnectionTask != null && !currentReconnectionTask.IsCompleted) { _reconnectionCancellationSource?.Cancel(); AsyncHelper.WaitForCompletion(currentReconnectionTask, 0, null, rethrowExceptions: false); if (State != ConnectionState.Open) { OnStateChange(DbConnectionInternal.StateChangeClosed); } } CancelOpenAndWait(); CloseInnerConnection(); GC.SuppressFinalize(this); if (Statistics != null) { ADP.TimerCurrent(out _statistics._closeTimestamp); } } catch (Exception ex2) { ex = ex2; throw; } finally { SqlStatistics.StopTimer(statistics); if (state != 0) { if (ex != null) { s_diagnosticListener.WriteConnectionCloseError(operationId, clientConnectionId, this, ex, "Close"); } else { s_diagnosticListener.WriteConnectionCloseAfter(operationId, clientConnectionId, this, "Close"); } } } } public new SqlCommand CreateCommand() { return new SqlCommand(null, this); } private void DisposeMe(bool disposing) { if (!disposing && InnerConnection is SqlInternalConnectionTds sqlInternalConnectionTds && !sqlInternalConnectionTds.ConnectionOptions.Pooling) { TdsParser parser = sqlInternalConnectionTds.Parser; if (parser != null && parser._physicalStateObj != null) { parser._physicalStateObj.DecrementPendingCallbacks(release: false); } } } public override void Open() { Guid operationId = s_diagnosticListener.WriteConnectionOpenBefore(this, "Open"); PrepareStatisticsForNewConnection(); SqlStatistics statistics = null; Exception ex = null; try { statistics = SqlStatistics.StartTimer(Statistics); if (!TryOpen(null)) { throw ADP.InternalError(ADP.InternalErrorCode.SynchronousConnectReturnedPending); } } catch (Exception ex2) { ex = ex2; throw; } finally { SqlStatistics.StopTimer(statistics); if (ex != null) { s_diagnosticListener.WriteConnectionOpenError(operationId, this, ex, "Open"); } else { s_diagnosticListener.WriteConnectionOpenAfter(operationId, this, "Open"); } } } internal void RegisterWaitingForReconnect(Task waitingTask) { if (!((SqlConnectionString)ConnectionOptions).MARS) { Interlocked.CompareExchange(ref _asyncWaitingForReconnection, waitingTask, null); if (_asyncWaitingForReconnection != waitingTask) { throw SQL.MARSUnspportedOnConnection(); } } } private async Task ReconnectAsync(int timeout) { _ = 1; try { long commandTimeoutExpiration = 0L; if (timeout > 0) { commandTimeoutExpiration = ADP.TimerCurrent() + ADP.TimerFromSeconds(timeout); } CancellationToken ctoken = (_reconnectionCancellationSource = new CancellationTokenSource()).Token; int retryCount = _connectRetryCount; for (int attempt = 0; attempt < retryCount; attempt++) { if (ctoken.IsCancellationRequested) { break; } try { try { ForceNewConnection = true; await OpenAsync(ctoken).ConfigureAwait(continueOnCapturedContext: false); _reconnectCount++; break; } finally { ForceNewConnection = false; } } catch (SqlException innerException) { if (attempt == retryCount - 1) { throw SQL.CR_AllAttemptsFailed(innerException, _originalConnectionId); } if (timeout > 0 && ADP.TimerRemaining(commandTimeoutExpiration) < ADP.TimerFromSeconds(ConnectRetryInterval)) { throw SQL.CR_NextAttemptWillExceedQueryTimeout(innerException, _originalConnectionId); } } await Task.Delay(1000 * ConnectRetryInterval, ctoken).ConfigureAwait(continueOnCapturedContext: false); } } finally { _recoverySessionData = null; _suppressStateChangeForReconnection = false; } } internal Task ValidateAndReconnect(Action beforeDisconnect, int timeout) { Task task = _currentReconnectionTask; while (task != null && task.IsCompleted) { Interlocked.CompareExchange(ref _currentReconnectionTask, null, task); task = _currentReconnectionTask; } if (task == null) { if (_connectRetryCount > 0) { SqlInternalConnectionTds openTdsConnection = GetOpenTdsConnection(); if (openTdsConnection._sessionRecoveryAcknowledged && !openTdsConnection.Parser._physicalStateObj.ValidateSNIConnection()) { if (openTdsConnection.Parser._sessionPool != null && openTdsConnection.Parser._sessionPool.ActiveSessionsCount > 0) { beforeDisconnect?.Invoke(); OnError(SQL.CR_UnrecoverableClient(ClientConnectionId), breakConnection: true, null); } SessionData currentSessionData = openTdsConnection.CurrentSessionData; if (currentSessionData._unrecoverableStatesCount == 0) { bool flag = false; lock (_reconnectLock) { openTdsConnection.CheckEnlistedTransactionBinding(); task = _currentReconnectionTask; if (task == null) { if (currentSessionData._unrecoverableStatesCount == 0) { _originalConnectionId = ClientConnectionId; _recoverySessionData = currentSessionData; beforeDisconnect?.Invoke(); try { _suppressStateChangeForReconnection = true; openTdsConnection.DoomThisConnection(); } catch (SqlException) { } task = (_currentReconnectionTask = Task.Run(() => ReconnectAsync(timeout))); } } else { flag = true; } } if (flag) { beforeDisconnect?.Invoke(); } } else { beforeDisconnect?.Invoke(); OnError(SQL.CR_UnrecoverableServer(ClientConnectionId), breakConnection: true, null); } } } } else { beforeDisconnect?.Invoke(); } return task; } private void WaitForPendingReconnection() { Task currentReconnectionTask = _currentReconnectionTask; if (currentReconnectionTask != null && !currentReconnectionTask.IsCompleted) { AsyncHelper.WaitForCompletion(currentReconnectionTask, 0, null, rethrowExceptions: false); } } private void CancelOpenAndWait() { Tuple, Task> currentCompletion = _currentCompletion; if (currentCompletion != null) { currentCompletion.Item1.TrySetCanceled(); ((IAsyncResult)currentCompletion.Item2).AsyncWaitHandle.WaitOne(); } } public override Task OpenAsync(CancellationToken cancellationToken) { Guid operationId = s_diagnosticListener.WriteConnectionOpenBefore(this, "OpenAsync"); PrepareStatisticsForNewConnection(); SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); TaskCompletionSource taskCompletionSource = new TaskCompletionSource(ADP.GetCurrentTransaction()); TaskCompletionSource taskCompletionSource2 = new TaskCompletionSource(); if (s_diagnosticListener.IsEnabled("System.Data.SqlClient.WriteConnectionOpenAfter") || s_diagnosticListener.IsEnabled("System.Data.SqlClient.WriteConnectionOpenError")) { taskCompletionSource2.Task.ContinueWith(delegate(Task t) { if (t.Exception != null) { s_diagnosticListener.WriteConnectionOpenError(operationId, this, t.Exception, "OpenAsync"); } else { s_diagnosticListener.WriteConnectionOpenAfter(operationId, this, "OpenAsync"); } }, TaskScheduler.Default); } if (cancellationToken.IsCancellationRequested) { taskCompletionSource2.SetCanceled(); return taskCompletionSource2.Task; } bool flag; try { flag = TryOpen(taskCompletionSource); } catch (Exception ex) { s_diagnosticListener.WriteConnectionOpenError(operationId, this, ex, "OpenAsync"); taskCompletionSource2.SetException(ex); return taskCompletionSource2.Task; } if (flag) { taskCompletionSource2.SetResult(null); return taskCompletionSource2.Task; } CancellationTokenRegistration registration = default(CancellationTokenRegistration); if (cancellationToken.CanBeCanceled) { registration = cancellationToken.Register(delegate(object s) { ((TaskCompletionSource)s).TrySetCanceled(); }, taskCompletionSource); } OpenAsyncRetry @object = new OpenAsyncRetry(this, taskCompletionSource, taskCompletionSource2, registration); _currentCompletion = new Tuple, Task>(taskCompletionSource, taskCompletionSource2.Task); taskCompletionSource.Task.ContinueWith(@object.Retry, TaskScheduler.Default); return taskCompletionSource2.Task; } catch (Exception ex2) { s_diagnosticListener.WriteConnectionOpenError(operationId, this, ex2, "OpenAsync"); throw; } finally { SqlStatistics.StopTimer(statistics); } } public override DataTable GetSchema() { return GetSchema(DbMetaDataCollectionNames.MetaDataCollections, null); } public override DataTable GetSchema(string collectionName) { return GetSchema(collectionName, null); } public override DataTable GetSchema(string collectionName, string[] restrictionValues) { return InnerConnection.GetSchema(ConnectionFactory, PoolGroup, this, collectionName, restrictionValues); } private void PrepareStatisticsForNewConnection() { if (StatisticsEnabled || s_diagnosticListener.IsEnabled("System.Data.SqlClient.WriteCommandAfter") || s_diagnosticListener.IsEnabled("System.Data.SqlClient.WriteConnectionOpenAfter")) { if (_statistics == null) { _statistics = new SqlStatistics(); } else { _statistics.ContinueOnNewConnection(); } } } private bool TryOpen(TaskCompletionSource retry) { SqlConnectionString sqlConnectionString = (SqlConnectionString)ConnectionOptions; _applyTransientFaultHandling = retry == null && sqlConnectionString != null && sqlConnectionString.ConnectRetryCount > 0; if (ForceNewConnection) { if (!InnerConnection.TryReplaceConnection(this, ConnectionFactory, retry, UserConnectionOptions)) { return false; } } else if (!InnerConnection.TryOpenConnection(this, ConnectionFactory, retry, UserConnectionOptions)) { return false; } SqlInternalConnectionTds sqlInternalConnectionTds = (SqlInternalConnectionTds)InnerConnection; if (!sqlInternalConnectionTds.ConnectionOptions.Pooling) { GC.ReRegisterForFinalize(this); } SqlStatistics statistics = _statistics; if (StatisticsEnabled || (s_diagnosticListener.IsEnabled("System.Data.SqlClient.WriteCommandAfter") && statistics != null)) { ADP.TimerCurrent(out _statistics._openTimestamp); sqlInternalConnectionTds.Parser.Statistics = _statistics; } else { sqlInternalConnectionTds.Parser.Statistics = null; _statistics = null; } return true; } internal void ValidateConnectionForExecute(string method, SqlCommand command) { Task asyncWaitingForReconnection = _asyncWaitingForReconnection; if (asyncWaitingForReconnection != null) { if (!asyncWaitingForReconnection.IsCompleted) { throw SQL.MARSUnspportedOnConnection(); } Interlocked.CompareExchange(ref _asyncWaitingForReconnection, null, asyncWaitingForReconnection); } if (_currentReconnectionTask != null) { Task currentReconnectionTask = _currentReconnectionTask; if (currentReconnectionTask != null && !currentReconnectionTask.IsCompleted) { return; } } GetOpenTdsConnection(method).ValidateConnectionForExecute(command); } internal static string FixupDatabaseTransactionName(string name) { if (!string.IsNullOrEmpty(name)) { return SqlServerEscapeHelper.EscapeIdentifier(name); } return name; } internal void OnError(SqlException exception, bool breakConnection, Action wrapCloseInAction) { if (breakConnection && ConnectionState.Open == State) { if (wrapCloseInAction != null) { int capturedCloseCount = _closeCount; Action obj = delegate { if (capturedCloseCount == _closeCount) { Close(); } }; wrapCloseInAction(obj); } else { Close(); } } if (exception.Class >= 11) { throw exception; } OnInfoMessage(new SqlInfoMessageEventArgs(exception)); } internal SqlInternalConnectionTds GetOpenTdsConnection() { if (!(InnerConnection is SqlInternalConnectionTds result)) { throw ADP.ClosedConnectionError(); } return result; } internal SqlInternalConnectionTds GetOpenTdsConnection(string method) { if (!(InnerConnection is SqlInternalConnectionTds result)) { throw ADP.OpenConnectionRequired(method, InnerConnection.State); } return result; } internal void OnInfoMessage(SqlInfoMessageEventArgs imevent) { OnInfoMessage(imevent, out var _); } internal void OnInfoMessage(SqlInfoMessageEventArgs imevent, out bool notified) { SqlInfoMessageEventHandler infoMessage = this.InfoMessage; if (infoMessage != null) { notified = true; try { infoMessage(this, imevent); return; } catch (Exception e) { if (!ADP.IsCatchableOrSecurityExceptionType(e)) { throw; } return; } } notified = false; } internal void RegisterForConnectionCloseNotification(ref Task outerTask, object value, int tag) { outerTask = outerTask.ContinueWith(delegate(Task task) { RemoveWeakReference(value); return task; }, TaskScheduler.Default).Unwrap(); } public void ResetStatistics() { if (Statistics != null) { Statistics.Reset(); if (ConnectionState.Open == State) { ADP.TimerCurrent(out _statistics._openTimestamp); } } } public IDictionary RetrieveStatistics() { if (Statistics != null) { UpdateStatistics(); return Statistics.GetDictionary(); } return new SqlStatistics().GetDictionary(); } private void UpdateStatistics() { if (ConnectionState.Open == State) { ADP.TimerCurrent(out _statistics._closeTimestamp); } Statistics.UpdateStatistics(); } object ICloneable.Clone() { return new SqlConnection(this); } private void CopyFrom(SqlConnection connection) { ADP.CheckArgumentNull(connection, "connection"); _userConnectionOptions = connection.UserConnectionOptions; _poolGroup = connection.PoolGroup; if (DbConnectionClosedNeverOpened.SingletonInstance == connection._innerConnection) { _innerConnection = DbConnectionClosedNeverOpened.SingletonInstance; } else { _innerConnection = DbConnectionClosedPreviouslyOpened.SingletonInstance; } } public SqlConnection() { GC.SuppressFinalize(this); _innerConnection = DbConnectionClosedNeverOpened.SingletonInstance; } private string ConnectionString_Get() { bool shouldHidePassword = InnerConnection.ShouldHidePassword; DbConnectionOptions userConnectionOptions = UserConnectionOptions; if (userConnectionOptions == null) { return ""; } return userConnectionOptions.UsersConnectionString(shouldHidePassword); } private void ConnectionString_Set(DbConnectionPoolKey key) { DbConnectionOptions userConnectionOptions = null; DbConnectionPoolGroup connectionPoolGroup = ConnectionFactory.GetConnectionPoolGroup(key, null, ref userConnectionOptions); DbConnectionInternal innerConnection = InnerConnection; bool flag = innerConnection.AllowSetConnectionString; if (flag) { flag = SetInnerConnectionFrom(DbConnectionClosedBusy.SingletonInstance, innerConnection); if (flag) { _userConnectionOptions = userConnectionOptions; _poolGroup = connectionPoolGroup; _innerConnection = DbConnectionClosedNeverOpened.SingletonInstance; } } if (!flag) { throw ADP.OpenConnectionPropertySet("ConnectionString", innerConnection.State); } } internal void Abort(Exception e) { DbConnectionInternal innerConnection = _innerConnection; if (ConnectionState.Open == innerConnection.State) { Interlocked.CompareExchange(ref _innerConnection, DbConnectionClosedPreviouslyOpened.SingletonInstance, innerConnection); innerConnection.DoomThisConnection(); } } internal void AddWeakReference(object value, int tag) { InnerConnection.AddWeakReference(value, tag); } protected override DbCommand CreateDbCommand() { DbCommand dbCommand = ConnectionFactory.ProviderFactory.CreateCommand(); dbCommand.Connection = this; return dbCommand; } protected override void Dispose(bool disposing) { if (disposing) { _userConnectionOptions = null; _poolGroup = null; Close(); } DisposeMe(disposing); base.Dispose(disposing); } private void RepairInnerConnection() { WaitForPendingReconnection(); if (_connectRetryCount != 0 && InnerConnection is SqlInternalConnectionTds sqlInternalConnectionTds) { sqlInternalConnectionTds.ValidateConnectionForExecute(null); sqlInternalConnectionTds.GetSessionAndReconnectIfNeeded(this); } } public override void EnlistTransaction(Transaction transaction) { Transaction enlistedTransaction = InnerConnection.EnlistedTransaction; if (enlistedTransaction != null) { if (enlistedTransaction.Equals(transaction)) { return; } if (enlistedTransaction.TransactionInformation.Status == TransactionStatus.Active) { throw ADP.TransactionPresent(); } } RepairInnerConnection(); InnerConnection.EnlistTransaction(transaction); GC.KeepAlive(this); } internal void NotifyWeakReference(int message) { InnerConnection.NotifyWeakReference(message); } internal void PermissionDemand() { DbConnectionOptions dbConnectionOptions = PoolGroup?.ConnectionOptions; if (dbConnectionOptions == null || dbConnectionOptions.IsEmpty) { throw ADP.NoConnectionString(); } _ = UserConnectionOptions; } internal void RemoveWeakReference(object value) { InnerConnection.RemoveWeakReference(value); } internal void SetInnerConnectionEvent(DbConnectionInternal to) { ConnectionState connectionState = _innerConnection.State & ConnectionState.Open; ConnectionState connectionState2 = to.State & ConnectionState.Open; if (connectionState != connectionState2 && connectionState2 == ConnectionState.Closed) { _closeCount++; } _innerConnection = to; if (connectionState == ConnectionState.Closed && ConnectionState.Open == connectionState2) { OnStateChange(DbConnectionInternal.StateChangeOpen); } else if (ConnectionState.Open == connectionState && connectionState2 == ConnectionState.Closed) { OnStateChange(DbConnectionInternal.StateChangeClosed); } else if (connectionState != connectionState2) { OnStateChange(new StateChangeEventArgs(connectionState, connectionState2)); } } internal bool SetInnerConnectionFrom(DbConnectionInternal to, DbConnectionInternal from) { return from == Interlocked.CompareExchange(ref _innerConnection, to, from); } internal void SetInnerConnectionTo(DbConnectionInternal to) { _innerConnection = to; } public SqlConnection(string connectionString, SqlCredential credential) { ConnectionString = connectionString; Credentials = credential; } [MonoTODO] public static void ChangePassword(string connectionString, string newPassword) { throw new NotImplementedException(); } public static void ChangePassword(string connectionString, SqlCredential credential, SecureString newSecurePassword) { ThrowStub.ThrowNotSupportedException(); } public void EnlistDistributedTransaction(ITransaction transaction) { ThrowStub.ThrowNotSupportedException(); } public static void RegisterColumnEncryptionKeyStoreProviders(IDictionary customProviders) { ThrowStub.ThrowNotSupportedException(); } } internal sealed class SqlConnectionFactory : DbConnectionFactory { private const string _metaDataXml = "MetaDataXml"; public static readonly SqlConnectionFactory SingletonInstance = new SqlConnectionFactory(); public override DbProviderFactory ProviderFactory => SqlClientFactory.Instance; private SqlConnectionFactory() { } protected override DbConnectionInternal CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection) { return CreateConnection(options, poolKey, poolGroupProviderInfo, pool, owningConnection, null); } protected override DbConnectionInternal CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) { SqlConnectionString sqlConnectionString = (SqlConnectionString)options; _ = (SqlConnectionPoolKey)poolKey; SessionData reconnectSessionData = null; SqlConnection sqlConnection = (SqlConnection)owningConnection; bool applyTransientFaultHandling = sqlConnection?._applyTransientFaultHandling ?? false; SqlConnectionString userConnectionOptions = null; if (userOptions != null) { userConnectionOptions = (SqlConnectionString)userOptions; } else if (sqlConnection != null) { userConnectionOptions = (SqlConnectionString)sqlConnection.UserConnectionOptions; } if (sqlConnection != null) { reconnectSessionData = sqlConnection._recoverySessionData; } bool redirectedUserInstance = false; DbConnectionPoolIdentity identity = null; if (sqlConnectionString.IntegratedSecurity) { identity = ((pool == null) ? DbConnectionPoolIdentity.GetCurrent() : pool.Identity); } if (sqlConnectionString.UserInstance) { redirectedUserInstance = true; string instanceName; if (pool == null || (pool != null && pool.Count <= 0)) { SqlInternalConnectionTds sqlInternalConnectionTds = null; try { SqlConnectionString connectionOptions = new SqlConnectionString(sqlConnectionString, sqlConnectionString.DataSource, userInstance: true, false); sqlInternalConnectionTds = new SqlInternalConnectionTds(identity, connectionOptions, null, redirectedUserInstance: false, null, null, applyTransientFaultHandling); instanceName = sqlInternalConnectionTds.InstanceName; if (!instanceName.StartsWith("\\\\.\\", StringComparison.Ordinal)) { throw SQL.NonLocalSSEInstance(); } if (pool != null) { ((SqlConnectionPoolProviderInfo)pool.ProviderInfo).InstanceName = instanceName; } } finally { sqlInternalConnectionTds?.Dispose(); } } else { instanceName = ((SqlConnectionPoolProviderInfo)pool.ProviderInfo).InstanceName; } sqlConnectionString = new SqlConnectionString(sqlConnectionString, instanceName, userInstance: false, null); poolGroupProviderInfo = null; } return new SqlInternalConnectionTds(identity, sqlConnectionString, poolGroupProviderInfo, redirectedUserInstance, userConnectionOptions, reconnectSessionData, applyTransientFaultHandling); } protected override DbConnectionOptions CreateConnectionOptions(string connectionString, DbConnectionOptions previous) { return new SqlConnectionString(connectionString); } internal override DbConnectionPoolProviderInfo CreateConnectionPoolProviderInfo(DbConnectionOptions connectionOptions) { DbConnectionPoolProviderInfo result = null; if (((SqlConnectionString)connectionOptions).UserInstance) { result = new SqlConnectionPoolProviderInfo(); } return result; } protected override DbConnectionPoolGroupOptions CreateConnectionPoolGroupOptions(DbConnectionOptions connectionOptions) { SqlConnectionString sqlConnectionString = (SqlConnectionString)connectionOptions; DbConnectionPoolGroupOptions result = null; if (sqlConnectionString.Pooling) { int num = sqlConnectionString.ConnectTimeout; if (0 < num && num < 2147483) { num *= 1000; } else if (num >= 2147483) { num = int.MaxValue; } result = new DbConnectionPoolGroupOptions(sqlConnectionString.IntegratedSecurity, sqlConnectionString.MinPoolSize, sqlConnectionString.MaxPoolSize, num, sqlConnectionString.LoadBalanceTimeout, sqlConnectionString.Enlist); } return result; } internal override DbConnectionPoolGroupProviderInfo CreateConnectionPoolGroupProviderInfo(DbConnectionOptions connectionOptions) { return new SqlConnectionPoolGroupProviderInfo((SqlConnectionString)connectionOptions); } internal static SqlConnectionString FindSqlConnectionOptions(SqlConnectionPoolKey key) { SqlConnectionString sqlConnectionString = (SqlConnectionString)SingletonInstance.FindConnectionOptions(key); if (sqlConnectionString == null) { sqlConnectionString = new SqlConnectionString(key.ConnectionString); } if (sqlConnectionString.IsEmpty) { throw ADP.NoConnectionString(); } return sqlConnectionString; } internal override DbConnectionPoolGroup GetConnectionPoolGroup(DbConnection connection) { if (connection is SqlConnection sqlConnection) { return sqlConnection.PoolGroup; } return null; } internal override DbConnectionInternal GetInnerConnection(DbConnection connection) { if (connection is SqlConnection sqlConnection) { return sqlConnection.InnerConnection; } return null; } internal override void PermissionDemand(DbConnection outerConnection) { if (outerConnection is SqlConnection sqlConnection) { sqlConnection.PermissionDemand(); } } internal override void SetConnectionPoolGroup(DbConnection outerConnection, DbConnectionPoolGroup poolGroup) { if (outerConnection is SqlConnection sqlConnection) { sqlConnection.PoolGroup = poolGroup; } } internal override void SetInnerConnectionEvent(DbConnection owningObject, DbConnectionInternal to) { if (owningObject is SqlConnection sqlConnection) { sqlConnection.SetInnerConnectionEvent(to); } } internal override bool SetInnerConnectionFrom(DbConnection owningObject, DbConnectionInternal to, DbConnectionInternal from) { if (owningObject is SqlConnection sqlConnection) { return sqlConnection.SetInnerConnectionFrom(to, from); } return false; } internal override void SetInnerConnectionTo(DbConnection owningObject, DbConnectionInternal to) { if (owningObject is SqlConnection sqlConnection) { sqlConnection.SetInnerConnectionTo(to); } } protected override DbMetaDataFactory CreateMetaDataFactory(DbConnectionInternal internalConnection, out bool cacheMetaDataFactory) { Stream? manifestResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("System.Data.SqlClient.SqlMetaData.xml"); cacheMetaDataFactory = true; return new SqlMetaDataFactory(manifestResourceStream, internalConnection.ServerVersion, internalConnection.ServerVersion); } } internal sealed class SqlConnectionPoolGroupProviderInfo : DbConnectionPoolGroupProviderInfo { private string _alias; private string _failoverPartner; private bool _useFailoverPartner; internal string FailoverPartner => _failoverPartner; internal bool UseFailoverPartner => _useFailoverPartner; internal SqlConnectionPoolGroupProviderInfo(SqlConnectionString connectionOptions) { _failoverPartner = connectionOptions.FailoverPartner; if (string.IsNullOrEmpty(_failoverPartner)) { _failoverPartner = null; } } internal void AliasCheck(string server) { if (!(_alias != server)) { return; } lock (this) { if (_alias == null) { _alias = server; } else if (_alias != server) { base.PoolGroup.Clear(); _alias = server; } } } internal void FailoverCheck(SqlInternalConnection connection, bool actualUseFailoverPartner, SqlConnectionString userConnectionOptions, string actualFailoverPartner) { if (UseFailoverPartner != actualUseFailoverPartner) { base.PoolGroup.Clear(); _useFailoverPartner = actualUseFailoverPartner; } if (_useFailoverPartner || !(_failoverPartner != actualFailoverPartner)) { return; } lock (this) { if (_failoverPartner != actualFailoverPartner) { _failoverPartner = actualFailoverPartner; } } } } internal class SqlConnectionPoolKey : DbConnectionPoolKey { private int _hashValue; internal override string ConnectionString { get { return base.ConnectionString; } set { base.ConnectionString = value; CalculateHashCode(); } } internal SqlConnectionPoolKey(string connectionString) : base(connectionString) { CalculateHashCode(); } private SqlConnectionPoolKey(SqlConnectionPoolKey key) : base(key) { CalculateHashCode(); } public override object Clone() { return new SqlConnectionPoolKey(this); } public override bool Equals(object obj) { if (obj is SqlConnectionPoolKey sqlConnectionPoolKey) { return ConnectionString == sqlConnectionPoolKey.ConnectionString; } return false; } public override int GetHashCode() { return _hashValue; } private void CalculateHashCode() { _hashValue = base.GetHashCode(); } } internal sealed class SqlConnectionPoolProviderInfo : DbConnectionPoolProviderInfo { private string _instanceName; internal string InstanceName { get { return _instanceName; } set { _instanceName = value; } } } internal sealed class SqlConnectionString : DbConnectionOptions { internal static class DEFAULT { internal const ApplicationIntent ApplicationIntent = ApplicationIntent.ReadWrite; internal const string Application_Name = "Core .Net SqlClient Data Provider"; internal const string AttachDBFilename = ""; internal const int Connect_Timeout = 15; internal const string Current_Language = ""; internal const string Data_Source = ""; internal const bool Encrypt = false; internal const bool Enlist = true; internal const string FailoverPartner = ""; internal const string Initial_Catalog = ""; internal const bool Integrated_Security = false; internal const int Load_Balance_Timeout = 0; internal const bool MARS = false; internal const int Max_Pool_Size = 100; internal const int Min_Pool_Size = 0; internal const bool MultiSubnetFailover = false; internal const int Packet_Size = 8000; internal const string Password = ""; internal const bool Persist_Security_Info = false; internal const bool Pooling = true; internal const bool TrustServerCertificate = false; internal const string Type_System_Version = ""; internal const string User_ID = ""; internal const bool User_Instance = false; internal const bool Replication = false; internal const int Connect_Retry_Count = 1; internal const int Connect_Retry_Interval = 10; } internal static class KEY { internal const string ApplicationIntent = "applicationintent"; internal const string Application_Name = "application name"; internal const string AsynchronousProcessing = "asynchronous processing"; internal const string AttachDBFilename = "attachdbfilename"; internal const string Connect_Timeout = "connect timeout"; internal const string Connection_Reset = "connection reset"; internal const string Context_Connection = "context connection"; internal const string Current_Language = "current language"; internal const string Data_Source = "data source"; internal const string Encrypt = "encrypt"; internal const string Enlist = "enlist"; internal const string FailoverPartner = "failover partner"; internal const string Initial_Catalog = "initial catalog"; internal const string Integrated_Security = "integrated security"; internal const string Load_Balance_Timeout = "load balance timeout"; internal const string MARS = "multipleactiveresultsets"; internal const string Max_Pool_Size = "max pool size"; internal const string Min_Pool_Size = "min pool size"; internal const string MultiSubnetFailover = "multisubnetfailover"; internal const string Network_Library = "network library"; internal const string Packet_Size = "packet size"; internal const string Password = "password"; internal const string Persist_Security_Info = "persist security info"; internal const string Pooling = "pooling"; internal const string TransactionBinding = "transaction binding"; internal const string TrustServerCertificate = "trustservercertificate"; internal const string Type_System_Version = "type system version"; internal const string User_ID = "user id"; internal const string User_Instance = "user instance"; internal const string Workstation_Id = "workstation id"; internal const string Replication = "replication"; internal const string Connect_Retry_Count = "connectretrycount"; internal const string Connect_Retry_Interval = "connectretryinterval"; } private static class SYNONYM { internal const string APP = "app"; internal const string Async = "async"; internal const string EXTENDED_PROPERTIES = "extended properties"; internal const string INITIAL_FILE_NAME = "initial file name"; internal const string CONNECTION_TIMEOUT = "connection timeout"; internal const string TIMEOUT = "timeout"; internal const string LANGUAGE = "language"; internal const string ADDR = "addr"; internal const string ADDRESS = "address"; internal const string SERVER = "server"; internal const string NETWORK_ADDRESS = "network address"; internal const string DATABASE = "database"; internal const string TRUSTED_CONNECTION = "trusted_connection"; internal const string Connection_Lifetime = "connection lifetime"; internal const string NET = "net"; internal const string NETWORK = "network"; internal const string Pwd = "pwd"; internal const string PERSISTSECURITYINFO = "persistsecurityinfo"; internal const string UID = "uid"; internal const string User = "user"; internal const string WSID = "wsid"; } internal enum TypeSystem { Latest = 2008, SQLServer2000 = 2000, SQLServer2005 = 2005, SQLServer2008 = 2008, SQLServer2012 = 2012 } internal static class TYPESYSTEMVERSION { internal const string Latest = "Latest"; internal const string SQL_Server_2000 = "SQL Server 2000"; internal const string SQL_Server_2005 = "SQL Server 2005"; internal const string SQL_Server_2008 = "SQL Server 2008"; internal const string SQL_Server_2012 = "SQL Server 2012"; } internal enum TransactionBindingEnum { ImplicitUnbind, ExplicitUnbind } internal static class TRANSACTIONBINDING { internal const string ImplicitUnbind = "Implicit Unbind"; internal const string ExplicitUnbind = "Explicit Unbind"; } internal const int SynonymCount = 18; internal const int DeprecatedSynonymCount = 3; private static Dictionary s_sqlClientSynonyms; private readonly bool _integratedSecurity; private readonly bool _encrypt; private readonly bool _trustServerCertificate; private readonly bool _enlist; private readonly bool _mars; private readonly bool _persistSecurityInfo; private readonly bool _pooling; private readonly bool _replication; private readonly bool _userInstance; private readonly bool _multiSubnetFailover; private readonly int _connectTimeout; private readonly int _loadBalanceTimeout; private readonly int _maxPoolSize; private readonly int _minPoolSize; private readonly int _packetSize; private readonly int _connectRetryCount; private readonly int _connectRetryInterval; private readonly ApplicationIntent _applicationIntent; private readonly string _applicationName; private readonly string _attachDBFileName; private readonly string _currentLanguage; private readonly string _dataSource; private readonly string _localDBInstance; private readonly string _failoverPartner; private readonly string _initialCatalog; private readonly string _password; private readonly string _userID; private readonly string _workstationId; private readonly TypeSystem _typeSystemVersion; private readonly TransactionBindingEnum _transactionBinding; internal bool IntegratedSecurity => _integratedSecurity; internal bool Asynchronous => true; internal bool ConnectionReset => true; internal bool Encrypt => _encrypt; internal bool TrustServerCertificate => _trustServerCertificate; internal bool Enlist => _enlist; internal bool MARS => _mars; internal bool MultiSubnetFailover => _multiSubnetFailover; internal bool PersistSecurityInfo => _persistSecurityInfo; internal bool Pooling => _pooling; internal bool Replication => _replication; internal bool UserInstance => _userInstance; internal int ConnectTimeout => _connectTimeout; internal int LoadBalanceTimeout => _loadBalanceTimeout; internal int MaxPoolSize => _maxPoolSize; internal int MinPoolSize => _minPoolSize; internal int PacketSize => _packetSize; internal int ConnectRetryCount => _connectRetryCount; internal int ConnectRetryInterval => _connectRetryInterval; internal ApplicationIntent ApplicationIntent => _applicationIntent; internal string ApplicationName => _applicationName; internal string AttachDBFilename => _attachDBFileName; internal string CurrentLanguage => _currentLanguage; internal string DataSource => _dataSource; internal string LocalDBInstance => _localDBInstance; internal string FailoverPartner => _failoverPartner; internal string InitialCatalog => _initialCatalog; internal string Password => _password; internal string UserID => _userID; internal string WorkstationId => _workstationId; internal TypeSystem TypeSystemVersion => _typeSystemVersion; internal TransactionBindingEnum TransactionBinding => _transactionBinding; internal SqlConnectionString(string connectionString) : base(connectionString, GetParseSynonyms()) { ThrowUnsupportedIfKeywordSet("asynchronous processing"); ThrowUnsupportedIfKeywordSet("connection reset"); ThrowUnsupportedIfKeywordSet("context connection"); if (ContainsKey("network library")) { throw SQL.NetworkLibraryKeywordNotSupported(); } _integratedSecurity = ConvertValueToIntegratedSecurity(); _encrypt = ConvertValueToBoolean("encrypt", defaultValue: false); _enlist = ConvertValueToBoolean("enlist", defaultValue: true); _mars = ConvertValueToBoolean("multipleactiveresultsets", defaultValue: false); _persistSecurityInfo = ConvertValueToBoolean("persist security info", defaultValue: false); _pooling = ConvertValueToBoolean("pooling", defaultValue: true); _replication = ConvertValueToBoolean("replication", defaultValue: false); _userInstance = ConvertValueToBoolean("user instance", defaultValue: false); _multiSubnetFailover = ConvertValueToBoolean("multisubnetfailover", defaultValue: false); _connectTimeout = ConvertValueToInt32("connect timeout", 15); _loadBalanceTimeout = ConvertValueToInt32("load balance timeout", 0); _maxPoolSize = ConvertValueToInt32("max pool size", 100); _minPoolSize = ConvertValueToInt32("min pool size", 0); _packetSize = ConvertValueToInt32("packet size", 8000); _connectRetryCount = ConvertValueToInt32("connectretrycount", 1); _connectRetryInterval = ConvertValueToInt32("connectretryinterval", 10); _applicationIntent = ConvertValueToApplicationIntent(); _applicationName = ConvertValueToString("application name", "Core .Net SqlClient Data Provider"); _attachDBFileName = ConvertValueToString("attachdbfilename", ""); _currentLanguage = ConvertValueToString("current language", ""); _dataSource = ConvertValueToString("data source", ""); _localDBInstance = LocalDBAPI.GetLocalDbInstanceNameFromServerName(_dataSource); _failoverPartner = ConvertValueToString("failover partner", ""); _initialCatalog = ConvertValueToString("initial catalog", ""); _password = ConvertValueToString("password", ""); _trustServerCertificate = ConvertValueToBoolean("trustservercertificate", defaultValue: false); string text = ConvertValueToString("type system version", null); string text2 = ConvertValueToString("transaction binding", null); _userID = ConvertValueToString("user id", ""); _workstationId = ConvertValueToString("workstation id", null); if (_loadBalanceTimeout < 0) { throw ADP.InvalidConnectionOptionValue("load balance timeout"); } if (_connectTimeout < 0) { throw ADP.InvalidConnectionOptionValue("connect timeout"); } if (_maxPoolSize < 1) { throw ADP.InvalidConnectionOptionValue("max pool size"); } if (_minPoolSize < 0) { throw ADP.InvalidConnectionOptionValue("min pool size"); } if (_maxPoolSize < _minPoolSize) { throw ADP.InvalidMinMaxPoolSizeValues(); } if (_packetSize < 512 || 32768 < _packetSize) { throw SQL.InvalidPacketSizeValue(); } ValidateValueLength(_applicationName, 128, "application name"); ValidateValueLength(_currentLanguage, 128, "current language"); ValidateValueLength(_dataSource, 128, "data source"); ValidateValueLength(_failoverPartner, 128, "failover partner"); ValidateValueLength(_initialCatalog, 128, "initial catalog"); ValidateValueLength(_password, 128, "password"); ValidateValueLength(_userID, 128, "user id"); if (_workstationId != null) { ValidateValueLength(_workstationId, 128, "workstation id"); } if (!string.Equals("", _failoverPartner, StringComparison.OrdinalIgnoreCase)) { if (_multiSubnetFailover) { throw SQL.MultiSubnetFailoverWithFailoverPartner(serverProvidedFailoverPartner: false, null); } if (string.Equals("", _initialCatalog, StringComparison.OrdinalIgnoreCase)) { throw ADP.MissingConnectionOptionValue("failover partner", "initial catalog"); } } if (0 <= _attachDBFileName.IndexOf('|')) { throw ADP.InvalidConnectionOptionValue("attachdbfilename"); } ValidateValueLength(_attachDBFileName, 260, "attachdbfilename"); if (_userInstance && !string.IsNullOrEmpty(_failoverPartner)) { throw SQL.UserInstanceFailoverNotCompatible(); } if (string.IsNullOrEmpty(text)) { text = "Latest"; } if (text.Equals("Latest", StringComparison.OrdinalIgnoreCase)) { _typeSystemVersion = TypeSystem.Latest; } else if (text.Equals("SQL Server 2000", StringComparison.OrdinalIgnoreCase)) { _typeSystemVersion = TypeSystem.SQLServer2000; } else if (text.Equals("SQL Server 2005", StringComparison.OrdinalIgnoreCase)) { _typeSystemVersion = TypeSystem.SQLServer2005; } else if (text.Equals("SQL Server 2008", StringComparison.OrdinalIgnoreCase)) { _typeSystemVersion = TypeSystem.Latest; } else { if (!text.Equals("SQL Server 2012", StringComparison.OrdinalIgnoreCase)) { throw ADP.InvalidConnectionOptionValue("type system version"); } _typeSystemVersion = TypeSystem.SQLServer2012; } if (string.IsNullOrEmpty(text2)) { text2 = "Implicit Unbind"; } if (text2.Equals("Implicit Unbind", StringComparison.OrdinalIgnoreCase)) { _transactionBinding = TransactionBindingEnum.ImplicitUnbind; } else { if (!text2.Equals("Explicit Unbind", StringComparison.OrdinalIgnoreCase)) { throw ADP.InvalidConnectionOptionValue("transaction binding"); } _transactionBinding = TransactionBindingEnum.ExplicitUnbind; } if (_applicationIntent == ApplicationIntent.ReadOnly && !string.IsNullOrEmpty(_failoverPartner)) { throw SQL.ROR_FailoverNotSupportedConnString(); } if (_connectRetryCount < 0 || _connectRetryCount > 255) { throw ADP.InvalidConnectRetryCountValue(); } if (_connectRetryInterval < 1 || _connectRetryInterval > 60) { throw ADP.InvalidConnectRetryIntervalValue(); } } internal SqlConnectionString(SqlConnectionString connectionOptions, string dataSource, bool userInstance, bool? setEnlistValue) : base(connectionOptions) { _integratedSecurity = connectionOptions._integratedSecurity; _encrypt = connectionOptions._encrypt; if (setEnlistValue.HasValue) { _enlist = setEnlistValue.Value; } else { _enlist = connectionOptions._enlist; } _mars = connectionOptions._mars; _persistSecurityInfo = connectionOptions._persistSecurityInfo; _pooling = connectionOptions._pooling; _replication = connectionOptions._replication; _userInstance = userInstance; _connectTimeout = connectionOptions._connectTimeout; _loadBalanceTimeout = connectionOptions._loadBalanceTimeout; _maxPoolSize = connectionOptions._maxPoolSize; _minPoolSize = connectionOptions._minPoolSize; _multiSubnetFailover = connectionOptions._multiSubnetFailover; _packetSize = connectionOptions._packetSize; _applicationName = connectionOptions._applicationName; _attachDBFileName = connectionOptions._attachDBFileName; _currentLanguage = connectionOptions._currentLanguage; _dataSource = dataSource; _localDBInstance = LocalDBAPI.GetLocalDbInstanceNameFromServerName(_dataSource); _failoverPartner = connectionOptions._failoverPartner; _initialCatalog = connectionOptions._initialCatalog; _password = connectionOptions._password; _userID = connectionOptions._userID; _workstationId = connectionOptions._workstationId; _typeSystemVersion = connectionOptions._typeSystemVersion; _transactionBinding = connectionOptions._transactionBinding; _applicationIntent = connectionOptions._applicationIntent; _connectRetryCount = connectionOptions._connectRetryCount; _connectRetryInterval = connectionOptions._connectRetryInterval; ValidateValueLength(_dataSource, 128, "data source"); } internal static Dictionary GetParseSynonyms() { Dictionary dictionary = s_sqlClientSynonyms; if (dictionary == null) { dictionary = (s_sqlClientSynonyms = new Dictionary(54) { { "applicationintent", "applicationintent" }, { "application name", "application name" }, { "asynchronous processing", "asynchronous processing" }, { "attachdbfilename", "attachdbfilename" }, { "connect timeout", "connect timeout" }, { "connection reset", "connection reset" }, { "context connection", "context connection" }, { "current language", "current language" }, { "data source", "data source" }, { "encrypt", "encrypt" }, { "enlist", "enlist" }, { "failover partner", "failover partner" }, { "initial catalog", "initial catalog" }, { "integrated security", "integrated security" }, { "load balance timeout", "load balance timeout" }, { "multipleactiveresultsets", "multipleactiveresultsets" }, { "max pool size", "max pool size" }, { "min pool size", "min pool size" }, { "multisubnetfailover", "multisubnetfailover" }, { "network library", "network library" }, { "packet size", "packet size" }, { "password", "password" }, { "persist security info", "persist security info" }, { "pooling", "pooling" }, { "replication", "replication" }, { "trustservercertificate", "trustservercertificate" }, { "transaction binding", "transaction binding" }, { "type system version", "type system version" }, { "user id", "user id" }, { "user instance", "user instance" }, { "workstation id", "workstation id" }, { "connectretrycount", "connectretrycount" }, { "connectretryinterval", "connectretryinterval" }, { "app", "application name" }, { "async", "asynchronous processing" }, { "extended properties", "attachdbfilename" }, { "initial file name", "attachdbfilename" }, { "connection timeout", "connect timeout" }, { "timeout", "connect timeout" }, { "language", "current language" }, { "addr", "data source" }, { "address", "data source" }, { "network address", "data source" }, { "server", "data source" }, { "database", "initial catalog" }, { "trusted_connection", "integrated security" }, { "connection lifetime", "load balance timeout" }, { "net", "network library" }, { "network", "network library" }, { "pwd", "password" }, { "persistsecurityinfo", "persist security info" }, { "uid", "user id" }, { "user", "user id" }, { "wsid", "workstation id" } }); } return dictionary; } internal string ObtainWorkstationId() { string text = WorkstationId; if (text == null) { text = ADP.MachineName(); ValidateValueLength(text, 128, "workstation id"); } return text; } private void ValidateValueLength(string value, int limit, string key) { if (limit < value.Length) { throw ADP.InvalidConnectionOptionValueLength(key, limit); } } internal ApplicationIntent ConvertValueToApplicationIntent() { if (!TryGetParsetableValue("applicationintent", out var value)) { return ApplicationIntent.ReadWrite; } try { return DbConnectionStringBuilderUtil.ConvertToApplicationIntent("applicationintent", value); } catch (FormatException inner) { throw ADP.InvalidConnectionOptionValue("applicationintent", inner); } catch (OverflowException inner2) { throw ADP.InvalidConnectionOptionValue("applicationintent", inner2); } } internal void ThrowUnsupportedIfKeywordSet(string keyword) { if (ContainsKey(keyword)) { throw SQL.UnsupportedKeyword(keyword); } } } public sealed class SqlConnectionStringBuilder : DbConnectionStringBuilder { private enum Keywords { DataSource, FailoverPartner, AttachDBFilename, InitialCatalog, IntegratedSecurity, PersistSecurityInfo, UserID, Password, Enlist, Pooling, MinPoolSize, MaxPoolSize, MultipleActiveResultSets, Replication, ConnectTimeout, Encrypt, TrustServerCertificate, LoadBalanceTimeout, PacketSize, TypeSystemVersion, ApplicationName, CurrentLanguage, WorkstationID, UserInstance, TransactionBinding, ApplicationIntent, MultiSubnetFailover, ConnectRetryCount, ConnectRetryInterval, KeywordsCount } private sealed class SqlInitialCatalogConverter : StringConverter { public override bool GetStandardValuesSupported(ITypeDescriptorContext context) { return GetStandardValuesSupportedInternal(context); } private bool GetStandardValuesSupportedInternal(ITypeDescriptorContext context) { bool result = false; if (context != null && context.Instance is SqlConnectionStringBuilder sqlConnectionStringBuilder && 0 < sqlConnectionStringBuilder.DataSource.Length && (sqlConnectionStringBuilder.IntegratedSecurity || 0 < sqlConnectionStringBuilder.UserID.Length)) { result = true; } return result; } public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) { return false; } public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) { if (GetStandardValuesSupportedInternal(context)) { List list = new List(); try { SqlConnectionStringBuilder sqlConnectionStringBuilder = (SqlConnectionStringBuilder)context.Instance; using SqlConnection sqlConnection = new SqlConnection(); sqlConnection.ConnectionString = sqlConnectionStringBuilder.ConnectionString; sqlConnection.Open(); foreach (DataRow row in sqlConnection.GetSchema("DATABASES").Rows) { string item = (string)row["database_name"]; list.Add(item); } } catch (SqlException e) { ADP.TraceExceptionWithoutRethrow(e); } return new StandardValuesCollection(list); } return null; } } internal const int KeywordsCount = 29; internal const int DeprecatedKeywordsCount = 4; private static readonly string[] s_validKeywords = CreateValidKeywords(); private static readonly Dictionary s_keywords = CreateKeywordsDictionary(); private ApplicationIntent _applicationIntent; private string _applicationName = "Core .Net SqlClient Data Provider"; private string _attachDBFilename = ""; private string _currentLanguage = ""; private string _dataSource = ""; private string _failoverPartner = ""; private string _initialCatalog = ""; private string _password = ""; private string _transactionBinding = "Implicit Unbind"; private string _typeSystemVersion = "Latest"; private string _userID = ""; private string _workstationID = ""; private int _connectTimeout = 15; private int _loadBalanceTimeout; private int _maxPoolSize = 100; private int _minPoolSize; private int _packetSize = 8000; private int _connectRetryCount = 1; private int _connectRetryInterval = 10; private bool _encrypt; private bool _trustServerCertificate; private bool _enlist = true; private bool _integratedSecurity; private bool _multipleActiveResultSets; private bool _multiSubnetFailover; private bool _persistSecurityInfo; private bool _pooling = true; private bool _replication; private bool _userInstance; private static readonly string[] s_notSupportedKeywords = new string[5] { "Asynchronous Processing", "Connection Reset", "Context Connection", "Transaction Binding", "async" }; private static readonly string[] s_notSupportedNetworkLibraryKeywords = new string[3] { "Network Library", "net", "network" }; public override object this[string keyword] { get { Keywords index = GetIndex(keyword); return GetAt(index); } set { if (value != null) { switch (GetIndex(keyword)) { case Keywords.ApplicationIntent: ApplicationIntent = ConvertToApplicationIntent(keyword, value); break; case Keywords.ApplicationName: ApplicationName = ConvertToString(value); break; case Keywords.AttachDBFilename: AttachDBFilename = ConvertToString(value); break; case Keywords.CurrentLanguage: CurrentLanguage = ConvertToString(value); break; case Keywords.DataSource: DataSource = ConvertToString(value); break; case Keywords.FailoverPartner: FailoverPartner = ConvertToString(value); break; case Keywords.InitialCatalog: InitialCatalog = ConvertToString(value); break; case Keywords.Password: Password = ConvertToString(value); break; case Keywords.UserID: UserID = ConvertToString(value); break; case Keywords.TransactionBinding: TransactionBinding = ConvertToString(value); break; case Keywords.TypeSystemVersion: TypeSystemVersion = ConvertToString(value); break; case Keywords.WorkstationID: WorkstationID = ConvertToString(value); break; case Keywords.ConnectTimeout: ConnectTimeout = ConvertToInt32(value); break; case Keywords.LoadBalanceTimeout: LoadBalanceTimeout = ConvertToInt32(value); break; case Keywords.MaxPoolSize: MaxPoolSize = ConvertToInt32(value); break; case Keywords.MinPoolSize: MinPoolSize = ConvertToInt32(value); break; case Keywords.PacketSize: PacketSize = ConvertToInt32(value); break; case Keywords.IntegratedSecurity: IntegratedSecurity = ConvertToIntegratedSecurity(value); break; case Keywords.Encrypt: Encrypt = ConvertToBoolean(value); break; case Keywords.TrustServerCertificate: TrustServerCertificate = ConvertToBoolean(value); break; case Keywords.Enlist: Enlist = ConvertToBoolean(value); break; case Keywords.MultipleActiveResultSets: MultipleActiveResultSets = ConvertToBoolean(value); break; case Keywords.MultiSubnetFailover: MultiSubnetFailover = ConvertToBoolean(value); break; case Keywords.PersistSecurityInfo: PersistSecurityInfo = ConvertToBoolean(value); break; case Keywords.Pooling: Pooling = ConvertToBoolean(value); break; case Keywords.Replication: Replication = ConvertToBoolean(value); break; case Keywords.UserInstance: UserInstance = ConvertToBoolean(value); break; case Keywords.ConnectRetryCount: ConnectRetryCount = ConvertToInt32(value); break; case Keywords.ConnectRetryInterval: ConnectRetryInterval = ConvertToInt32(value); break; default: throw UnsupportedKeyword(keyword); } } else { Remove(keyword); } } } public ApplicationIntent ApplicationIntent { get { return _applicationIntent; } set { if (!DbConnectionStringBuilderUtil.IsValidApplicationIntentValue(value)) { throw ADP.InvalidEnumerationValue(typeof(ApplicationIntent), (int)value); } SetApplicationIntentValue(value); _applicationIntent = value; } } public string ApplicationName { get { return _applicationName; } set { SetValue("Application Name", value); _applicationName = value; } } public string AttachDBFilename { get { return _attachDBFilename; } set { SetValue("AttachDbFilename", value); _attachDBFilename = value; } } public int ConnectTimeout { get { return _connectTimeout; } set { if (value < 0) { throw ADP.InvalidConnectionOptionValue("Connect Timeout"); } SetValue("Connect Timeout", value); _connectTimeout = value; } } public string CurrentLanguage { get { return _currentLanguage; } set { SetValue("Current Language", value); _currentLanguage = value; } } public string DataSource { get { return _dataSource; } set { SetValue("Data Source", value); _dataSource = value; } } public bool Encrypt { get { return _encrypt; } set { SetValue("Encrypt", value); _encrypt = value; } } public bool TrustServerCertificate { get { return _trustServerCertificate; } set { SetValue("TrustServerCertificate", value); _trustServerCertificate = value; } } public bool Enlist { get { return _enlist; } set { SetValue("Enlist", value); _enlist = value; } } public string FailoverPartner { get { return _failoverPartner; } set { SetValue("Failover Partner", value); _failoverPartner = value; } } [TypeConverter(typeof(SqlInitialCatalogConverter))] public string InitialCatalog { get { return _initialCatalog; } set { SetValue("Initial Catalog", value); _initialCatalog = value; } } public bool IntegratedSecurity { get { return _integratedSecurity; } set { SetValue("Integrated Security", value); _integratedSecurity = value; } } public int LoadBalanceTimeout { get { return _loadBalanceTimeout; } set { if (value < 0) { throw ADP.InvalidConnectionOptionValue("Load Balance Timeout"); } SetValue("Load Balance Timeout", value); _loadBalanceTimeout = value; } } public int MaxPoolSize { get { return _maxPoolSize; } set { if (value < 1) { throw ADP.InvalidConnectionOptionValue("Max Pool Size"); } SetValue("Max Pool Size", value); _maxPoolSize = value; } } public int ConnectRetryCount { get { return _connectRetryCount; } set { if (value < 0 || value > 255) { throw ADP.InvalidConnectionOptionValue("ConnectRetryCount"); } SetValue("ConnectRetryCount", value); _connectRetryCount = value; } } public int ConnectRetryInterval { get { return _connectRetryInterval; } set { if (value < 1 || value > 60) { throw ADP.InvalidConnectionOptionValue("ConnectRetryInterval"); } SetValue("ConnectRetryInterval", value); _connectRetryInterval = value; } } public int MinPoolSize { get { return _minPoolSize; } set { if (value < 0) { throw ADP.InvalidConnectionOptionValue("Min Pool Size"); } SetValue("Min Pool Size", value); _minPoolSize = value; } } public bool MultipleActiveResultSets { get { return _multipleActiveResultSets; } set { SetValue("MultipleActiveResultSets", value); _multipleActiveResultSets = value; } } public bool MultiSubnetFailover { get { return _multiSubnetFailover; } set { SetValue("MultiSubnetFailover", value); _multiSubnetFailover = value; } } public int PacketSize { get { return _packetSize; } set { if (value < 512 || 32768 < value) { throw SQL.InvalidPacketSizeValue(); } SetValue("Packet Size", value); _packetSize = value; } } public string Password { get { return _password; } set { SetValue("Password", value); _password = value; } } public bool PersistSecurityInfo { get { return _persistSecurityInfo; } set { SetValue("Persist Security Info", value); _persistSecurityInfo = value; } } public bool Pooling { get { return _pooling; } set { SetValue("Pooling", value); _pooling = value; } } public bool Replication { get { return _replication; } set { SetValue("Replication", value); _replication = value; } } public string TransactionBinding { get { return _transactionBinding; } set { SetValue("Transaction Binding", value); _transactionBinding = value; } } public string TypeSystemVersion { get { return _typeSystemVersion; } set { SetValue("Type System Version", value); _typeSystemVersion = value; } } public string UserID { get { return _userID; } set { SetValue("User ID", value); _userID = value; } } public bool UserInstance { get { return _userInstance; } set { SetValue("User Instance", value); _userInstance = value; } } public string WorkstationID { get { return _workstationID; } set { SetValue("Workstation ID", value); _workstationID = value; } } public override ICollection Keys => new ReadOnlyCollection(s_validKeywords); public override ICollection Values { get { object[] array = new object[s_validKeywords.Length]; for (int i = 0; i < array.Length; i++) { array[i] = GetAt((Keywords)i); } return new ReadOnlyCollection(array); } } [Obsolete("This property is ignored beginning in .NET Framework 4.5.For more information about SqlClient support for asynchronous programming, seehttps://docs.microsoft.com/en-us/dotnet/framework/data/adonet/asynchronous-programming")] public bool AsynchronousProcessing { get; set; } [Obsolete("ConnectionReset has been deprecated. SqlConnection will ignore the 'connection reset'keyword and always reset the connection")] public bool ConnectionReset { get; set; } [MonoTODO("Not implemented in corefx: https://github.com/dotnet/corefx/issues/22474")] public bool ContextConnection { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } [MonoTODO("Not implemented in corefx: https://github.com/dotnet/corefx/issues/22474")] public string NetworkLibrary { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } [MonoTODO("Not implemented in corefx: https://github.com/dotnet/corefx/issues/22474")] public PoolBlockingPeriod PoolBlockingPeriod { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } [MonoTODO("Not implemented in corefx: https://github.com/dotnet/corefx/issues/22474")] public bool TransparentNetworkIPResolution { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } [MonoTODO("Not implemented in corefx: https://github.com/dotnet/corefx/issues/22474")] public SqlConnectionColumnEncryptionSetting ColumnEncryptionSetting { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } public SqlAuthenticationMethod Authentication { get { ThrowStub.ThrowNotSupportedException(); return default(SqlAuthenticationMethod); } set { ThrowStub.ThrowNotSupportedException(); } } private static string[] CreateValidKeywords() { string[] array = new string[29]; array[25] = "ApplicationIntent"; array[20] = "Application Name"; array[2] = "AttachDbFilename"; array[14] = "Connect Timeout"; array[21] = "Current Language"; array[0] = "Data Source"; array[15] = "Encrypt"; array[8] = "Enlist"; array[1] = "Failover Partner"; array[3] = "Initial Catalog"; array[4] = "Integrated Security"; array[17] = "Load Balance Timeout"; array[11] = "Max Pool Size"; array[10] = "Min Pool Size"; array[12] = "MultipleActiveResultSets"; array[26] = "MultiSubnetFailover"; array[18] = "Packet Size"; array[7] = "Password"; array[5] = "Persist Security Info"; array[9] = "Pooling"; array[13] = "Replication"; array[24] = "Transaction Binding"; array[16] = "TrustServerCertificate"; array[19] = "Type System Version"; array[6] = "User ID"; array[23] = "User Instance"; array[22] = "Workstation ID"; array[27] = "ConnectRetryCount"; array[28] = "ConnectRetryInterval"; return array; } private static Dictionary CreateKeywordsDictionary() { return new Dictionary(47, StringComparer.OrdinalIgnoreCase) { { "ApplicationIntent", Keywords.ApplicationIntent }, { "Application Name", Keywords.ApplicationName }, { "AttachDbFilename", Keywords.AttachDBFilename }, { "Connect Timeout", Keywords.ConnectTimeout }, { "Current Language", Keywords.CurrentLanguage }, { "Data Source", Keywords.DataSource }, { "Encrypt", Keywords.Encrypt }, { "Enlist", Keywords.Enlist }, { "Failover Partner", Keywords.FailoverPartner }, { "Initial Catalog", Keywords.InitialCatalog }, { "Integrated Security", Keywords.IntegratedSecurity }, { "Load Balance Timeout", Keywords.LoadBalanceTimeout }, { "MultipleActiveResultSets", Keywords.MultipleActiveResultSets }, { "Max Pool Size", Keywords.MaxPoolSize }, { "Min Pool Size", Keywords.MinPoolSize }, { "MultiSubnetFailover", Keywords.MultiSubnetFailover }, { "Packet Size", Keywords.PacketSize }, { "Password", Keywords.Password }, { "Persist Security Info", Keywords.PersistSecurityInfo }, { "Pooling", Keywords.Pooling }, { "Replication", Keywords.Replication }, { "Transaction Binding", Keywords.TransactionBinding }, { "TrustServerCertificate", Keywords.TrustServerCertificate }, { "Type System Version", Keywords.TypeSystemVersion }, { "User ID", Keywords.UserID }, { "User Instance", Keywords.UserInstance }, { "Workstation ID", Keywords.WorkstationID }, { "ConnectRetryCount", Keywords.ConnectRetryCount }, { "ConnectRetryInterval", Keywords.ConnectRetryInterval }, { "app", Keywords.ApplicationName }, { "extended properties", Keywords.AttachDBFilename }, { "initial file name", Keywords.AttachDBFilename }, { "connection timeout", Keywords.ConnectTimeout }, { "timeout", Keywords.ConnectTimeout }, { "language", Keywords.CurrentLanguage }, { "addr", Keywords.DataSource }, { "address", Keywords.DataSource }, { "network address", Keywords.DataSource }, { "server", Keywords.DataSource }, { "database", Keywords.InitialCatalog }, { "trusted_connection", Keywords.IntegratedSecurity }, { "connection lifetime", Keywords.LoadBalanceTimeout }, { "pwd", Keywords.Password }, { "persistsecurityinfo", Keywords.PersistSecurityInfo }, { "uid", Keywords.UserID }, { "user", Keywords.UserID }, { "wsid", Keywords.WorkstationID } }; } public SqlConnectionStringBuilder() : this(null) { } public SqlConnectionStringBuilder(string connectionString) { if (!string.IsNullOrEmpty(connectionString)) { base.ConnectionString = connectionString; } } public override void Clear() { base.Clear(); for (int i = 0; i < s_validKeywords.Length; i++) { Reset((Keywords)i); } } public override bool ContainsKey(string keyword) { ADP.CheckArgumentNull(keyword, "keyword"); return s_keywords.ContainsKey(keyword); } private static bool ConvertToBoolean(object value) { return DbConnectionStringBuilderUtil.ConvertToBoolean(value); } private static int ConvertToInt32(object value) { return DbConnectionStringBuilderUtil.ConvertToInt32(value); } private static bool ConvertToIntegratedSecurity(object value) { return DbConnectionStringBuilderUtil.ConvertToIntegratedSecurity(value); } private static string ConvertToString(object value) { return DbConnectionStringBuilderUtil.ConvertToString(value); } private static ApplicationIntent ConvertToApplicationIntent(string keyword, object value) { return DbConnectionStringBuilderUtil.ConvertToApplicationIntent(keyword, value); } private object GetAt(Keywords index) { return index switch { Keywords.ApplicationIntent => ApplicationIntent, Keywords.ApplicationName => ApplicationName, Keywords.AttachDBFilename => AttachDBFilename, Keywords.ConnectTimeout => ConnectTimeout, Keywords.CurrentLanguage => CurrentLanguage, Keywords.DataSource => DataSource, Keywords.Encrypt => Encrypt, Keywords.Enlist => Enlist, Keywords.FailoverPartner => FailoverPartner, Keywords.InitialCatalog => InitialCatalog, Keywords.IntegratedSecurity => IntegratedSecurity, Keywords.LoadBalanceTimeout => LoadBalanceTimeout, Keywords.MultipleActiveResultSets => MultipleActiveResultSets, Keywords.MaxPoolSize => MaxPoolSize, Keywords.MinPoolSize => MinPoolSize, Keywords.MultiSubnetFailover => MultiSubnetFailover, Keywords.PacketSize => PacketSize, Keywords.Password => Password, Keywords.PersistSecurityInfo => PersistSecurityInfo, Keywords.Pooling => Pooling, Keywords.Replication => Replication, Keywords.TransactionBinding => TransactionBinding, Keywords.TrustServerCertificate => TrustServerCertificate, Keywords.TypeSystemVersion => TypeSystemVersion, Keywords.UserID => UserID, Keywords.UserInstance => UserInstance, Keywords.WorkstationID => WorkstationID, Keywords.ConnectRetryCount => ConnectRetryCount, Keywords.ConnectRetryInterval => ConnectRetryInterval, _ => throw UnsupportedKeyword(s_validKeywords[(int)index]), }; } private Keywords GetIndex(string keyword) { ADP.CheckArgumentNull(keyword, "keyword"); if (s_keywords.TryGetValue(keyword, out var value)) { return value; } throw UnsupportedKeyword(keyword); } public override bool Remove(string keyword) { ADP.CheckArgumentNull(keyword, "keyword"); if (s_keywords.TryGetValue(keyword, out var value) && base.Remove(s_validKeywords[(int)value])) { Reset(value); return true; } return false; } private void Reset(Keywords index) { switch (index) { case Keywords.ApplicationIntent: _applicationIntent = ApplicationIntent.ReadWrite; break; case Keywords.ApplicationName: _applicationName = "Core .Net SqlClient Data Provider"; break; case Keywords.AttachDBFilename: _attachDBFilename = ""; break; case Keywords.ConnectTimeout: _connectTimeout = 15; break; case Keywords.CurrentLanguage: _currentLanguage = ""; break; case Keywords.DataSource: _dataSource = ""; break; case Keywords.Encrypt: _encrypt = false; break; case Keywords.Enlist: _enlist = true; break; case Keywords.FailoverPartner: _failoverPartner = ""; break; case Keywords.InitialCatalog: _initialCatalog = ""; break; case Keywords.IntegratedSecurity: _integratedSecurity = false; break; case Keywords.LoadBalanceTimeout: _loadBalanceTimeout = 0; break; case Keywords.MultipleActiveResultSets: _multipleActiveResultSets = false; break; case Keywords.MaxPoolSize: _maxPoolSize = 100; break; case Keywords.MinPoolSize: _minPoolSize = 0; break; case Keywords.MultiSubnetFailover: _multiSubnetFailover = false; break; case Keywords.PacketSize: _packetSize = 8000; break; case Keywords.Password: _password = ""; break; case Keywords.PersistSecurityInfo: _persistSecurityInfo = false; break; case Keywords.Pooling: _pooling = true; break; case Keywords.ConnectRetryCount: _connectRetryCount = 1; break; case Keywords.ConnectRetryInterval: _connectRetryInterval = 10; break; case Keywords.Replication: _replication = false; break; case Keywords.TransactionBinding: _transactionBinding = "Implicit Unbind"; break; case Keywords.TrustServerCertificate: _trustServerCertificate = false; break; case Keywords.TypeSystemVersion: _typeSystemVersion = "Latest"; break; case Keywords.UserID: _userID = ""; break; case Keywords.UserInstance: _userInstance = false; break; case Keywords.WorkstationID: _workstationID = ""; break; default: throw UnsupportedKeyword(s_validKeywords[(int)index]); } } private void SetValue(string keyword, bool value) { base[keyword] = value.ToString(); } private void SetValue(string keyword, int value) { base[keyword] = value.ToString((IFormatProvider?)null); } private void SetValue(string keyword, string value) { ADP.CheckArgumentNull(value, keyword); base[keyword] = value; } private void SetApplicationIntentValue(ApplicationIntent value) { base["ApplicationIntent"] = DbConnectionStringBuilderUtil.ApplicationIntentToString(value); } public override bool ShouldSerialize(string keyword) { ADP.CheckArgumentNull(keyword, "keyword"); if (s_keywords.TryGetValue(keyword, out var value)) { return base.ShouldSerialize(s_validKeywords[(int)value]); } return false; } public override bool TryGetValue(string keyword, out object value) { if (s_keywords.TryGetValue(keyword, out var value2)) { value = GetAt(value2); return true; } value = null; return false; } private Exception UnsupportedKeyword(string keyword) { if (s_notSupportedKeywords.Contains(keyword, StringComparer.OrdinalIgnoreCase)) { return SQL.UnsupportedKeyword(keyword); } if (s_notSupportedNetworkLibraryKeywords.Contains(keyword, StringComparer.OrdinalIgnoreCase)) { return SQL.NetworkLibraryKeywordNotSupported(); } return ADP.KeywordNotSupported(keyword); } } internal enum SqlConnectionTimeoutErrorPhase { Undefined, PreLoginBegin, InitializeConnection, SendPreLoginHandshake, ConsumePreLoginHandshake, LoginBegin, ProcessConnectionAuth, PostLogin, Complete, Count } internal enum SqlConnectionInternalSourceType { Principle, Failover, RoutingDestination } internal class SqlConnectionTimeoutPhaseDuration { private Stopwatch _swDuration = new Stopwatch(); internal void StartCapture() { _swDuration.Start(); } internal void StopCapture() { if (_swDuration.IsRunning) { _swDuration.Stop(); } } internal long GetMilliSecondDuration() { return _swDuration.ElapsedMilliseconds; } } internal class SqlConnectionTimeoutErrorInternal { private SqlConnectionTimeoutPhaseDuration[] _phaseDurations; private SqlConnectionTimeoutPhaseDuration[] _originalPhaseDurations; private SqlConnectionTimeoutErrorPhase _currentPhase; private SqlConnectionInternalSourceType _currentSourceType; private bool _isFailoverScenario; internal SqlConnectionTimeoutErrorPhase CurrentPhase => _currentPhase; public SqlConnectionTimeoutErrorInternal() { _phaseDurations = new SqlConnectionTimeoutPhaseDuration[9]; for (int i = 0; i < _phaseDurations.Length; i++) { _phaseDurations[i] = null; } } public void SetFailoverScenario(bool useFailoverServer) { _isFailoverScenario = useFailoverServer; } public void SetInternalSourceType(SqlConnectionInternalSourceType sourceType) { _currentSourceType = sourceType; if (_currentSourceType == SqlConnectionInternalSourceType.RoutingDestination) { _originalPhaseDurations = _phaseDurations; _phaseDurations = new SqlConnectionTimeoutPhaseDuration[9]; SetAndBeginPhase(SqlConnectionTimeoutErrorPhase.PreLoginBegin); } } internal void ResetAndRestartPhase() { _currentPhase = SqlConnectionTimeoutErrorPhase.PreLoginBegin; for (int i = 0; i < _phaseDurations.Length; i++) { _phaseDurations[i] = null; } } internal void SetAndBeginPhase(SqlConnectionTimeoutErrorPhase timeoutErrorPhase) { _currentPhase = timeoutErrorPhase; if (_phaseDurations[(int)timeoutErrorPhase] == null) { _phaseDurations[(int)timeoutErrorPhase] = new SqlConnectionTimeoutPhaseDuration(); } _phaseDurations[(int)timeoutErrorPhase].StartCapture(); } internal void EndPhase(SqlConnectionTimeoutErrorPhase timeoutErrorPhase) { _phaseDurations[(int)timeoutErrorPhase].StopCapture(); } internal void SetAllCompleteMarker() { _currentPhase = SqlConnectionTimeoutErrorPhase.Complete; } internal string GetErrorMessage() { StringBuilder stringBuilder; string text; switch (_currentPhase) { case SqlConnectionTimeoutErrorPhase.PreLoginBegin: stringBuilder = new StringBuilder(SQLMessage.Timeout_PreLogin_Begin()); text = SQLMessage.Duration_PreLogin_Begin(_phaseDurations[1].GetMilliSecondDuration()); break; case SqlConnectionTimeoutErrorPhase.InitializeConnection: stringBuilder = new StringBuilder(SQLMessage.Timeout_PreLogin_InitializeConnection()); text = SQLMessage.Duration_PreLogin_Begin(_phaseDurations[1].GetMilliSecondDuration() + _phaseDurations[2].GetMilliSecondDuration()); break; case SqlConnectionTimeoutErrorPhase.SendPreLoginHandshake: stringBuilder = new StringBuilder(SQLMessage.Timeout_PreLogin_SendHandshake()); text = SQLMessage.Duration_PreLoginHandshake(_phaseDurations[1].GetMilliSecondDuration() + _phaseDurations[2].GetMilliSecondDuration(), _phaseDurations[3].GetMilliSecondDuration()); break; case SqlConnectionTimeoutErrorPhase.ConsumePreLoginHandshake: stringBuilder = new StringBuilder(SQLMessage.Timeout_PreLogin_ConsumeHandshake()); text = SQLMessage.Duration_PreLoginHandshake(_phaseDurations[1].GetMilliSecondDuration() + _phaseDurations[2].GetMilliSecondDuration(), _phaseDurations[3].GetMilliSecondDuration() + _phaseDurations[4].GetMilliSecondDuration()); break; case SqlConnectionTimeoutErrorPhase.LoginBegin: stringBuilder = new StringBuilder(SQLMessage.Timeout_Login_Begin()); text = SQLMessage.Duration_Login_Begin(_phaseDurations[1].GetMilliSecondDuration() + _phaseDurations[2].GetMilliSecondDuration(), _phaseDurations[3].GetMilliSecondDuration() + _phaseDurations[4].GetMilliSecondDuration(), _phaseDurations[5].GetMilliSecondDuration()); break; case SqlConnectionTimeoutErrorPhase.ProcessConnectionAuth: stringBuilder = new StringBuilder(SQLMessage.Timeout_Login_ProcessConnectionAuth()); text = SQLMessage.Duration_Login_ProcessConnectionAuth(_phaseDurations[1].GetMilliSecondDuration() + _phaseDurations[2].GetMilliSecondDuration(), _phaseDurations[3].GetMilliSecondDuration() + _phaseDurations[4].GetMilliSecondDuration(), _phaseDurations[5].GetMilliSecondDuration(), _phaseDurations[6].GetMilliSecondDuration()); break; case SqlConnectionTimeoutErrorPhase.PostLogin: stringBuilder = new StringBuilder(SQLMessage.Timeout_PostLogin()); text = SQLMessage.Duration_PostLogin(_phaseDurations[1].GetMilliSecondDuration() + _phaseDurations[2].GetMilliSecondDuration(), _phaseDurations[3].GetMilliSecondDuration() + _phaseDurations[4].GetMilliSecondDuration(), _phaseDurations[5].GetMilliSecondDuration(), _phaseDurations[6].GetMilliSecondDuration(), _phaseDurations[7].GetMilliSecondDuration()); break; default: stringBuilder = new StringBuilder(SQLMessage.Timeout()); text = null; break; } if (_currentPhase != 0 && _currentPhase != SqlConnectionTimeoutErrorPhase.Complete) { if (_isFailoverScenario) { stringBuilder.Append(" "); stringBuilder.AppendFormat(null, SQLMessage.Timeout_FailoverInfo(), _currentSourceType); } else if (_currentSourceType == SqlConnectionInternalSourceType.RoutingDestination) { stringBuilder.Append(" "); stringBuilder.AppendFormat(null, SQLMessage.Timeout_RoutingDestination(), _originalPhaseDurations[1].GetMilliSecondDuration() + _originalPhaseDurations[2].GetMilliSecondDuration(), _originalPhaseDurations[3].GetMilliSecondDuration() + _originalPhaseDurations[4].GetMilliSecondDuration(), _originalPhaseDurations[5].GetMilliSecondDuration(), _originalPhaseDurations[6].GetMilliSecondDuration(), _originalPhaseDurations[7].GetMilliSecondDuration()); } } if (text != null) { stringBuilder.Append(" "); stringBuilder.Append(text); } return stringBuilder.ToString(); } } public sealed class SqlDataAdapter : DbDataAdapter, IDbDataAdapter, IDataAdapter, ICloneable { private static readonly object EventRowUpdated = new object(); private static readonly object EventRowUpdating = new object(); private SqlCommand _deleteCommand; private SqlCommand _insertCommand; private SqlCommand _selectCommand; private SqlCommand _updateCommand; private SqlCommandSet _commandSet; private int _updateBatchSize = 1; public new SqlCommand DeleteCommand { get { return _deleteCommand; } set { _deleteCommand = value; } } IDbCommand IDbDataAdapter.DeleteCommand { get { return _deleteCommand; } set { _deleteCommand = (SqlCommand)value; } } public new SqlCommand InsertCommand { get { return _insertCommand; } set { _insertCommand = value; } } IDbCommand IDbDataAdapter.InsertCommand { get { return _insertCommand; } set { _insertCommand = (SqlCommand)value; } } public new SqlCommand SelectCommand { get { return _selectCommand; } set { _selectCommand = value; } } IDbCommand IDbDataAdapter.SelectCommand { get { return _selectCommand; } set { _selectCommand = (SqlCommand)value; } } public new SqlCommand UpdateCommand { get { return _updateCommand; } set { _updateCommand = value; } } IDbCommand IDbDataAdapter.UpdateCommand { get { return _updateCommand; } set { _updateCommand = (SqlCommand)value; } } public override int UpdateBatchSize { get { return _updateBatchSize; } set { if (0 > value) { throw ADP.ArgumentOutOfRange("UpdateBatchSize"); } _updateBatchSize = value; } } public event SqlRowUpdatedEventHandler RowUpdated { add { base.Events.AddHandler(EventRowUpdated, value); } remove { base.Events.RemoveHandler(EventRowUpdated, value); } } public event SqlRowUpdatingEventHandler RowUpdating { add { SqlRowUpdatingEventHandler sqlRowUpdatingEventHandler = (SqlRowUpdatingEventHandler)base.Events[EventRowUpdating]; if (sqlRowUpdatingEventHandler != null && value.Target is DbCommandBuilder) { SqlRowUpdatingEventHandler sqlRowUpdatingEventHandler2 = (SqlRowUpdatingEventHandler)ADP.FindBuilder(sqlRowUpdatingEventHandler); if (sqlRowUpdatingEventHandler2 != null) { base.Events.RemoveHandler(EventRowUpdating, sqlRowUpdatingEventHandler2); } } base.Events.AddHandler(EventRowUpdating, value); } remove { base.Events.RemoveHandler(EventRowUpdating, value); } } public SqlDataAdapter() { GC.SuppressFinalize(this); } public SqlDataAdapter(SqlCommand selectCommand) : this() { SelectCommand = selectCommand; } public SqlDataAdapter(string selectCommandText, string selectConnectionString) : this() { SqlConnection connection = new SqlConnection(selectConnectionString); SelectCommand = new SqlCommand(selectCommandText, connection); } public SqlDataAdapter(string selectCommandText, SqlConnection selectConnection) : this() { SelectCommand = new SqlCommand(selectCommandText, selectConnection); } private SqlDataAdapter(SqlDataAdapter from) : base(from) { GC.SuppressFinalize(this); } protected override int AddToBatch(IDbCommand command) { int commandCount = _commandSet.CommandCount; _commandSet.Append((SqlCommand)command); return commandCount; } protected override void ClearBatch() { _commandSet.Clear(); } protected override int ExecuteBatch() { return _commandSet.ExecuteNonQuery(); } protected override IDataParameter GetBatchedParameter(int commandIdentifier, int parameterIndex) { return _commandSet.GetParameter(commandIdentifier, parameterIndex); } protected override bool GetBatchedRecordsAffected(int commandIdentifier, out int recordsAffected, out Exception error) { return _commandSet.GetBatchedAffected(commandIdentifier, out recordsAffected, out error); } protected override void InitializeBatching() { _commandSet = new SqlCommandSet(); SqlCommand sqlCommand = SelectCommand; if (sqlCommand == null) { sqlCommand = InsertCommand; if (sqlCommand == null) { sqlCommand = UpdateCommand; if (sqlCommand == null) { sqlCommand = DeleteCommand; } } } if (sqlCommand != null) { _commandSet.Connection = sqlCommand.Connection; _commandSet.Transaction = sqlCommand.Transaction; _commandSet.CommandTimeout = sqlCommand.CommandTimeout; } } protected override void TerminateBatching() { if (_commandSet != null) { _commandSet.Dispose(); _commandSet = null; } } object ICloneable.Clone() { return new SqlDataAdapter(this); } protected override RowUpdatedEventArgs CreateRowUpdatedEvent(DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) { return new SqlRowUpdatedEventArgs(dataRow, command, statementType, tableMapping); } protected override RowUpdatingEventArgs CreateRowUpdatingEvent(DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) { return new SqlRowUpdatingEventArgs(dataRow, command, statementType, tableMapping); } protected override void OnRowUpdated(RowUpdatedEventArgs value) { SqlRowUpdatedEventHandler sqlRowUpdatedEventHandler = (SqlRowUpdatedEventHandler)base.Events[EventRowUpdated]; if (sqlRowUpdatedEventHandler != null && value is SqlRowUpdatedEventArgs) { sqlRowUpdatedEventHandler(this, (SqlRowUpdatedEventArgs)value); } base.OnRowUpdated(value); } protected override void OnRowUpdating(RowUpdatingEventArgs value) { SqlRowUpdatingEventHandler sqlRowUpdatingEventHandler = (SqlRowUpdatingEventHandler)base.Events[EventRowUpdating]; if (sqlRowUpdatingEventHandler != null && value is SqlRowUpdatingEventArgs) { sqlRowUpdatingEventHandler(this, (SqlRowUpdatingEventArgs)value); } base.OnRowUpdating(value); } } public class SqlDataReader : DbDataReader, IDataReader, IDisposable, IDataRecord, IDbColumnSchemaGenerator { private enum ALTROWSTATUS { Null, AltRow, Done } internal class SharedState { internal int _nextColumnHeaderToRead; internal int _nextColumnDataToRead; internal long _columnDataBytesRemaining; internal bool _dataReady; } private class Snapshot { public bool _dataReady; public bool _haltRead; public bool _metaDataConsumed; public bool _browseModeInfoConsumed; public bool _hasRows; public ALTROWSTATUS _altRowStatus; public int _nextColumnDataToRead; public int _nextColumnHeaderToRead; public long _columnDataBytesRead; public long _columnDataBytesRemaining; public _SqlMetaDataSet _metadata; public _SqlMetaDataSetCollection _altMetaDataSetCollection; public MultiPartTableName[] _tableNames; public SqlSequentialStream _currentStream; public SqlSequentialTextReader _currentTextReader; } internal SharedState _sharedState; private TdsParser _parser; private TdsParserStateObject _stateObj; private SqlCommand _command; private SqlConnection _connection; private int _defaultLCID; private bool _haltRead; private bool _metaDataConsumed; private bool _browseModeInfoConsumed; private bool _isClosed; private bool _isInitialized; private bool _hasRows; private ALTROWSTATUS _altRowStatus; private int _recordsAffected; private long _defaultTimeoutMilliseconds; private SqlConnectionString.TypeSystem _typeSystem; private SqlStatistics _statistics; private SqlBuffer[] _data; private SqlStreamingXml _streamingXml; private _SqlMetaDataSet _metaData; private _SqlMetaDataSetCollection _altMetaDataSetCollection; private FieldNameLookup _fieldNameLookup; private CommandBehavior _commandBehavior; private static int s_objectTypeCount; private static readonly ReadOnlyCollection s_emptySchema = new ReadOnlyCollection(Array.Empty()); internal readonly int ObjectID; private MultiPartTableName[] _tableNames; private string _resetOptionsString; private int _lastColumnWithDataChunkRead; private long _columnDataBytesRead; private long _columnDataCharsRead; private char[] _columnDataChars; private int _columnDataCharsIndex; private Task _currentTask; private Snapshot _snapshot; private CancellationTokenSource _cancelAsyncOnCloseTokenSource; private CancellationToken _cancelAsyncOnCloseToken; internal static readonly Type _typeofINullable = typeof(INullable); private static readonly Type s_typeofSqlString = typeof(SqlString); private SqlSequentialStream _currentStream; private SqlSequentialTextReader _currentTextReader; internal bool BrowseModeInfoConsumed { set { _browseModeInfoConsumed = value; } } internal SqlCommand Command => _command; protected SqlConnection Connection => _connection; public override int Depth { get { if (IsClosed) { throw ADP.DataReaderClosed("Depth"); } return 0; } } public override int FieldCount { get { if (IsClosed) { throw ADP.DataReaderClosed("FieldCount"); } if (_currentTask != null) { throw ADP.AsyncOperationPending(); } if (MetaData == null) { return 0; } return _metaData.Length; } } public override bool HasRows { get { if (IsClosed) { throw ADP.DataReaderClosed("HasRows"); } if (_currentTask != null) { throw ADP.AsyncOperationPending(); } return _hasRows; } } public override bool IsClosed => _isClosed; internal bool IsInitialized { get { return _isInitialized; } set { _isInitialized = value; } } internal _SqlMetaDataSet MetaData { get { if (IsClosed) { throw ADP.DataReaderClosed("MetaData"); } if (_metaData == null && !_metaDataConsumed) { if (_currentTask != null) { throw SQL.PendingBeginXXXExists(); } if (!TryConsumeMetaData()) { throw SQL.SynchronousCallMayNotPend(); } } return _metaData; } } public override int RecordsAffected { get { if (_command != null) { return _command.InternalRecordsAffected; } return _recordsAffected; } } internal string ResetOptionsString { set { _resetOptionsString = value; } } private SqlStatistics Statistics => _statistics; internal MultiPartTableName[] TableNames { get { return _tableNames; } set { _tableNames = value; } } public override int VisibleFieldCount { get { if (IsClosed) { throw ADP.DataReaderClosed("VisibleFieldCount"); } return MetaData?.visibleColumns ?? 0; } } public override object this[int i] => GetValue(i); public override object this[string name] => GetValue(GetOrdinal(name)); internal SqlDataReader(SqlCommand command, CommandBehavior behavior) { _sharedState = new SharedState(); _recordsAffected = -1; ObjectID = Interlocked.Increment(ref s_objectTypeCount); base..ctor(); _command = command; _commandBehavior = behavior; if (_command != null) { _defaultTimeoutMilliseconds = (long)command.CommandTimeout * 1000L; _connection = command.Connection; if (_connection != null) { _statistics = _connection.Statistics; _typeSystem = _connection.TypeSystem; } } _sharedState._dataReady = false; _metaDataConsumed = false; _hasRows = false; _browseModeInfoConsumed = false; _currentStream = null; _currentTextReader = null; _cancelAsyncOnCloseTokenSource = new CancellationTokenSource(); _cancelAsyncOnCloseToken = _cancelAsyncOnCloseTokenSource.Token; _columnDataCharsIndex = -1; } internal long ColumnDataBytesRemaining() { if (-1 == _sharedState._columnDataBytesRemaining) { _sharedState._columnDataBytesRemaining = (long)_parser.PlpBytesLeft(_stateObj); } return _sharedState._columnDataBytesRemaining; } internal virtual SmiExtendedMetaData[] GetInternalSmiMetaData() { SmiExtendedMetaData[] array = null; _SqlMetaDataSet metaData = MetaData; if (metaData != null && 0 < metaData.Length) { array = new SmiExtendedMetaData[metaData.visibleColumns]; for (int i = 0; i < metaData.Length; i++) { _SqlMetaData sqlMetaData = metaData[i]; if (!sqlMetaData.isHidden) { SqlCollation collation = sqlMetaData.collation; string typeSpecificNamePart = null; string typeSpecificNamePart2 = null; string typeSpecificNamePart3 = null; if (SqlDbType.Xml == sqlMetaData.type) { typeSpecificNamePart = sqlMetaData.xmlSchemaCollectionDatabase; typeSpecificNamePart2 = sqlMetaData.xmlSchemaCollectionOwningSchema; typeSpecificNamePart3 = sqlMetaData.xmlSchemaCollectionName; } else if (SqlDbType.Udt == sqlMetaData.type) { throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString()); } int num = sqlMetaData.length; if (num > 8000) { num = -1; } else if (SqlDbType.NChar == sqlMetaData.type || SqlDbType.NVarChar == sqlMetaData.type) { num /= 2; } array[i] = new SmiQueryMetaData(sqlMetaData.type, num, sqlMetaData.precision, sqlMetaData.scale, collation?.LCID ?? _defaultLCID, collation?.SqlCompareOptions ?? SqlCompareOptions.None, isMultiValued: false, null, null, sqlMetaData.column, typeSpecificNamePart, typeSpecificNamePart2, typeSpecificNamePart3, sqlMetaData.isNullable, sqlMetaData.serverName, sqlMetaData.catalogName, sqlMetaData.schemaName, sqlMetaData.tableName, sqlMetaData.baseColumn, sqlMetaData.isKey, sqlMetaData.isIdentity, sqlMetaData.updatability == 0, sqlMetaData.isExpression, sqlMetaData.isDifferentName, sqlMetaData.isHidden); } } } return array; } internal void Bind(TdsParserStateObject stateObj) { stateObj.Owner = this; _stateObj = stateObj; _parser = stateObj.Parser; _defaultLCID = _parser.DefaultLCID; } internal DataTable BuildSchemaTable() { _SqlMetaDataSet metaData = MetaData; DataTable dataTable = new DataTable("SchemaTable"); dataTable.Locale = CultureInfo.InvariantCulture; dataTable.MinimumCapacity = metaData.Length; DataColumn column = new DataColumn(SchemaTableColumn.ColumnName, typeof(string)); DataColumn dataColumn = new DataColumn(SchemaTableColumn.ColumnOrdinal, typeof(int)); DataColumn column2 = new DataColumn(SchemaTableColumn.ColumnSize, typeof(int)); DataColumn column3 = new DataColumn(SchemaTableColumn.NumericPrecision, typeof(short)); DataColumn column4 = new DataColumn(SchemaTableColumn.NumericScale, typeof(short)); DataColumn column5 = new DataColumn(SchemaTableColumn.DataType, typeof(Type)); DataColumn column6 = new DataColumn(SchemaTableOptionalColumn.ProviderSpecificDataType, typeof(Type)); DataColumn column7 = new DataColumn(SchemaTableColumn.NonVersionedProviderType, typeof(int)); DataColumn column8 = new DataColumn(SchemaTableColumn.ProviderType, typeof(int)); DataColumn dataColumn2 = new DataColumn(SchemaTableColumn.IsLong, typeof(bool)); DataColumn column9 = new DataColumn(SchemaTableColumn.AllowDBNull, typeof(bool)); DataColumn column10 = new DataColumn(SchemaTableOptionalColumn.IsReadOnly, typeof(bool)); DataColumn column11 = new DataColumn(SchemaTableOptionalColumn.IsRowVersion, typeof(bool)); DataColumn column12 = new DataColumn(SchemaTableColumn.IsUnique, typeof(bool)); DataColumn column13 = new DataColumn(SchemaTableColumn.IsKey, typeof(bool)); DataColumn column14 = new DataColumn(SchemaTableOptionalColumn.IsAutoIncrement, typeof(bool)); DataColumn column15 = new DataColumn(SchemaTableOptionalColumn.IsHidden, typeof(bool)); DataColumn column16 = new DataColumn(SchemaTableOptionalColumn.BaseCatalogName, typeof(string)); DataColumn column17 = new DataColumn(SchemaTableColumn.BaseSchemaName, typeof(string)); DataColumn column18 = new DataColumn(SchemaTableColumn.BaseTableName, typeof(string)); DataColumn column19 = new DataColumn(SchemaTableColumn.BaseColumnName, typeof(string)); DataColumn column20 = new DataColumn(SchemaTableOptionalColumn.BaseServerName, typeof(string)); DataColumn column21 = new DataColumn(SchemaTableColumn.IsAliased, typeof(bool)); DataColumn column22 = new DataColumn(SchemaTableColumn.IsExpression, typeof(bool)); DataColumn column23 = new DataColumn("IsIdentity", typeof(bool)); DataColumn column24 = new DataColumn("DataTypeName", typeof(string)); DataColumn column25 = new DataColumn("UdtAssemblyQualifiedName", typeof(string)); DataColumn column26 = new DataColumn("XmlSchemaCollectionDatabase", typeof(string)); DataColumn column27 = new DataColumn("XmlSchemaCollectionOwningSchema", typeof(string)); DataColumn column28 = new DataColumn("XmlSchemaCollectionName", typeof(string)); DataColumn column29 = new DataColumn("IsColumnSet", typeof(bool)); dataColumn.DefaultValue = 0; dataColumn2.DefaultValue = false; DataColumnCollection columns = dataTable.Columns; columns.Add(column); columns.Add(dataColumn); columns.Add(column2); columns.Add(column3); columns.Add(column4); columns.Add(column12); columns.Add(column13); columns.Add(column20); columns.Add(column16); columns.Add(column19); columns.Add(column17); columns.Add(column18); columns.Add(column5); columns.Add(column9); columns.Add(column8); columns.Add(column21); columns.Add(column22); columns.Add(column23); columns.Add(column14); columns.Add(column11); columns.Add(column15); columns.Add(dataColumn2); columns.Add(column10); columns.Add(column6); columns.Add(column24); columns.Add(column26); columns.Add(column27); columns.Add(column28); columns.Add(column25); columns.Add(column7); columns.Add(column29); for (int i = 0; i < metaData.Length; i++) { _SqlMetaData sqlMetaData = metaData[i]; DataRow dataRow = dataTable.NewRow(); dataRow[column] = sqlMetaData.column; dataRow[dataColumn] = sqlMetaData.ordinal; dataRow[column2] = ((sqlMetaData.metaType.IsSizeInCharacters && sqlMetaData.length != int.MaxValue) ? (sqlMetaData.length / 2) : sqlMetaData.length); dataRow[column5] = GetFieldTypeInternal(sqlMetaData); dataRow[column6] = GetProviderSpecificFieldTypeInternal(sqlMetaData); dataRow[column7] = (int)sqlMetaData.type; dataRow[column24] = GetDataTypeNameInternal(sqlMetaData); if (_typeSystem <= SqlConnectionString.TypeSystem.SQLServer2005 && sqlMetaData.IsNewKatmaiDateTimeType) { dataRow[column8] = SqlDbType.NVarChar; switch (sqlMetaData.type) { case SqlDbType.Date: dataRow[column2] = 10; break; case SqlDbType.Time: dataRow[column2] = TdsEnums.WHIDBEY_TIME_LENGTH[(byte.MaxValue != sqlMetaData.scale) ? sqlMetaData.scale : sqlMetaData.metaType.Scale]; break; case SqlDbType.DateTime2: dataRow[column2] = TdsEnums.WHIDBEY_DATETIME2_LENGTH[(byte.MaxValue != sqlMetaData.scale) ? sqlMetaData.scale : sqlMetaData.metaType.Scale]; break; case SqlDbType.DateTimeOffset: dataRow[column2] = TdsEnums.WHIDBEY_DATETIMEOFFSET_LENGTH[(byte.MaxValue != sqlMetaData.scale) ? sqlMetaData.scale : sqlMetaData.metaType.Scale]; break; } } else if (_typeSystem <= SqlConnectionString.TypeSystem.SQLServer2005 && sqlMetaData.IsLargeUdt) { if (_typeSystem == SqlConnectionString.TypeSystem.SQLServer2005) { dataRow[column8] = SqlDbType.VarBinary; } else { dataRow[column8] = SqlDbType.Image; } } else if (_typeSystem != SqlConnectionString.TypeSystem.SQLServer2000) { dataRow[column8] = (int)sqlMetaData.type; if (sqlMetaData.type == SqlDbType.Udt) { dataRow[column25] = sqlMetaData.udtAssemblyQualifiedName; } else if (sqlMetaData.type == SqlDbType.Xml) { dataRow[column26] = sqlMetaData.xmlSchemaCollectionDatabase; dataRow[column27] = sqlMetaData.xmlSchemaCollectionOwningSchema; dataRow[column28] = sqlMetaData.xmlSchemaCollectionName; } } else { dataRow[column8] = GetVersionedMetaType(sqlMetaData.metaType).SqlDbType; } if (byte.MaxValue != sqlMetaData.precision) { dataRow[column3] = sqlMetaData.precision; } else { dataRow[column3] = sqlMetaData.metaType.Precision; } if (_typeSystem <= SqlConnectionString.TypeSystem.SQLServer2005 && sqlMetaData.IsNewKatmaiDateTimeType) { dataRow[column4] = MetaType.MetaNVarChar.Scale; } else if (byte.MaxValue != sqlMetaData.scale) { dataRow[column4] = sqlMetaData.scale; } else { dataRow[column4] = sqlMetaData.metaType.Scale; } dataRow[column9] = sqlMetaData.isNullable; if (_browseModeInfoConsumed) { dataRow[column21] = sqlMetaData.isDifferentName; dataRow[column13] = sqlMetaData.isKey; dataRow[column15] = sqlMetaData.isHidden; dataRow[column22] = sqlMetaData.isExpression; } dataRow[column23] = sqlMetaData.isIdentity; dataRow[column14] = sqlMetaData.isIdentity; dataRow[dataColumn2] = sqlMetaData.metaType.IsLong; if (SqlDbType.Timestamp == sqlMetaData.type) { dataRow[column12] = true; dataRow[column11] = true; } else { dataRow[column12] = false; dataRow[column11] = false; } dataRow[column10] = sqlMetaData.updatability == 0; dataRow[column29] = sqlMetaData.isColumnSet; if (!string.IsNullOrEmpty(sqlMetaData.serverName)) { dataRow[column20] = sqlMetaData.serverName; } if (!string.IsNullOrEmpty(sqlMetaData.catalogName)) { dataRow[column16] = sqlMetaData.catalogName; } if (!string.IsNullOrEmpty(sqlMetaData.schemaName)) { dataRow[column17] = sqlMetaData.schemaName; } if (!string.IsNullOrEmpty(sqlMetaData.tableName)) { dataRow[column18] = sqlMetaData.tableName; } if (!string.IsNullOrEmpty(sqlMetaData.baseColumn)) { dataRow[column19] = sqlMetaData.baseColumn; } else if (!string.IsNullOrEmpty(sqlMetaData.column)) { dataRow[column19] = sqlMetaData.column; } dataTable.Rows.Add(dataRow); dataRow.AcceptChanges(); } foreach (DataColumn item in columns) { item.ReadOnly = true; } return dataTable; } internal void Cancel(SqlCommand command) { _stateObj?.Cancel(command); } private bool TryCleanPartialRead() { if (_stateObj._partialHeaderBytesRead > 0 && !_stateObj.TryProcessHeader()) { return false; } if (-1 != _lastColumnWithDataChunkRead) { CloseActiveSequentialStreamAndTextReader(); } if (_sharedState._nextColumnHeaderToRead == 0) { if (!_stateObj.Parser.TrySkipRow(_metaData, _stateObj)) { return false; } } else { if (!TryResetBlobState()) { return false; } if (!_stateObj.Parser.TrySkipRow(_metaData, _sharedState._nextColumnHeaderToRead, _stateObj)) { return false; } } _sharedState._dataReady = false; return true; } private void CleanPartialReadReliable() { TryCleanPartialRead(); } protected override void Dispose(bool disposing) { if (disposing) { Close(); } base.Dispose(disposing); } public override void Close() { SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); TdsParserStateObject stateObj = _stateObj; _cancelAsyncOnCloseTokenSource.Cancel(); Task currentTask = _currentTask; if (currentTask != null && !currentTask.IsCompleted) { try { ((IAsyncResult)currentTask).AsyncWaitHandle.WaitOne(); ((IAsyncResult)stateObj._networkPacketTaskSource?.Task).AsyncWaitHandle.WaitOne(); } catch (Exception) { _connection.InnerConnection.DoomThisConnection(); _isClosed = true; if (stateObj != null) { lock (stateObj) { _stateObj = null; _command = null; _connection = null; } } throw; } } CloseActiveSequentialStreamAndTextReader(); if (stateObj == null) { return; } lock (stateObj) { if (_stateObj != null) { if (_snapshot != null) { PrepareForAsyncContinuation(); } SetTimeout(_defaultTimeoutMilliseconds); stateObj._syncOverAsync = true; if (!TryCloseInternal(closeReader: true)) { throw SQL.SynchronousCallMayNotPend(); } } } } finally { SqlStatistics.StopTimer(statistics); } } private bool TryCloseInternal(bool closeReader) { TdsParser parser = _parser; TdsParserStateObject stateObj = _stateObj; bool flag = IsCommandBehavior(CommandBehavior.CloseConnection); bool flag2 = false; bool flag3 = false; try { if (!_isClosed && parser != null && stateObj != null && stateObj._pendingData && parser.State == TdsParserState.OpenLoggedIn) { if (_altRowStatus == ALTROWSTATUS.AltRow) { _sharedState._dataReady = true; } _stateObj._internalTimeout = false; if (_sharedState._dataReady) { flag3 = true; if (!TryCleanPartialRead()) { return false; } flag3 = false; } if (!parser.TryRun(RunBehavior.Clean, _command, this, null, stateObj, out var _)) { return false; } } RestoreServerSettings(parser, stateObj); return true; } finally { if (flag2) { _isClosed = true; _command = null; _connection = null; _statistics = null; _stateObj = null; _parser = null; } else if (closeReader) { bool isClosed = _isClosed; _isClosed = true; _parser = null; _stateObj = null; _data = null; if (_snapshot != null) { CleanupAfterAsyncInvocationInternal(stateObj); } if (Connection != null) { Connection.RemoveWeakReference(this); } if (!isClosed && stateObj != null) { if (!flag3) { stateObj.CloseSession(); } else if (parser != null) { parser.State = TdsParserState.Broken; parser.PutSession(stateObj); parser.Connection.BreakConnection(); } } TrySetMetaData(null, moreInfo: false); _fieldNameLookup = null; if (flag && Connection != null) { Connection.Close(); } if (_command != null) { _recordsAffected = _command.InternalRecordsAffected; } _command = null; _connection = null; _statistics = null; } } } internal virtual void CloseReaderFromConnection() { TdsParser parser = _parser; if (parser != null && parser.State == TdsParserState.OpenLoggedIn) { Close(); return; } TdsParserStateObject stateObj = _stateObj; _isClosed = true; _cancelAsyncOnCloseTokenSource.Cancel(); if (stateObj != null) { stateObj._networkPacketTaskSource?.TrySetException(ADP.ClosedConnectionError()); if (_snapshot != null) { CleanupAfterAsyncInvocationInternal(stateObj, resetNetworkPacketTaskSource: false); } stateObj._syncOverAsync = true; stateObj.RemoveOwner(); } } private bool TryConsumeMetaData() { while (_parser != null && _stateObj != null && _stateObj._pendingData && !_metaDataConsumed) { if (_parser.State == TdsParserState.Broken || _parser.State == TdsParserState.Closed) { if (_parser.Connection != null) { _parser.Connection.DoomThisConnection(); } throw SQL.ConnectionDoomed(); } if (!_parser.TryRun(RunBehavior.ReturnImmediately, _command, this, null, _stateObj, out var _)) { return false; } } if (_metaData != null) { if (_snapshot != null && _snapshot._metadata == _metaData) { _metaData = (_SqlMetaDataSet)_metaData.Clone(); } _metaData.visibleColumns = 0; int[] array = new int[_metaData.Length]; for (int i = 0; i < array.Length; i++) { array[i] = _metaData.visibleColumns; if (!_metaData[i].isHidden) { _metaData.visibleColumns++; } } _metaData.indexMap = array; } return true; } public override string GetDataTypeName(int i) { SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); CheckMetaDataIsReady(i); return GetDataTypeNameInternal(_metaData[i]); } finally { SqlStatistics.StopTimer(statistics); } } private string GetDataTypeNameInternal(_SqlMetaData metaData) { string text = null; if (_typeSystem <= SqlConnectionString.TypeSystem.SQLServer2005 && metaData.IsNewKatmaiDateTimeType) { return MetaType.MetaNVarChar.TypeName; } if (_typeSystem <= SqlConnectionString.TypeSystem.SQLServer2005 && metaData.IsLargeUdt) { if (_typeSystem == SqlConnectionString.TypeSystem.SQLServer2005) { return MetaType.MetaMaxVarBinary.TypeName; } return MetaType.MetaImage.TypeName; } if (_typeSystem != SqlConnectionString.TypeSystem.SQLServer2000) { if (metaData.type == SqlDbType.Udt) { return metaData.udtDatabaseName + "." + metaData.udtSchemaName + "." + metaData.udtTypeName; } return metaData.metaType.TypeName; } return GetVersionedMetaType(metaData.metaType).TypeName; } internal virtual SqlBuffer.StorageType GetVariantInternalStorageType(int i) { return _data[i].VariantInternalStorageType; } public override IEnumerator GetEnumerator() { return new DbEnumerator(this, IsCommandBehavior(CommandBehavior.CloseConnection)); } public override Type GetFieldType(int i) { SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); CheckMetaDataIsReady(i); return GetFieldTypeInternal(_metaData[i]); } finally { SqlStatistics.StopTimer(statistics); } } private Type GetFieldTypeInternal(_SqlMetaData metaData) { Type type = null; if (_typeSystem <= SqlConnectionString.TypeSystem.SQLServer2005 && metaData.IsNewKatmaiDateTimeType) { return MetaType.MetaNVarChar.ClassType; } if (_typeSystem <= SqlConnectionString.TypeSystem.SQLServer2005 && metaData.IsLargeUdt) { if (_typeSystem == SqlConnectionString.TypeSystem.SQLServer2005) { return MetaType.MetaMaxVarBinary.ClassType; } return MetaType.MetaImage.ClassType; } if (_typeSystem != SqlConnectionString.TypeSystem.SQLServer2000) { if (metaData.type == SqlDbType.Udt) { return MetaType.MetaMaxVarBinary.ClassType; } return metaData.metaType.ClassType; } return GetVersionedMetaType(metaData.metaType).ClassType; } internal virtual int GetLocaleId(int i) { _SqlMetaData sqlMetaData = MetaData[i]; if (sqlMetaData.collation != null) { return sqlMetaData.collation.LCID; } return 0; } public override string GetName(int i) { CheckMetaDataIsReady(i); return _metaData[i].column; } public override Type GetProviderSpecificFieldType(int i) { SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); CheckMetaDataIsReady(i); return GetProviderSpecificFieldTypeInternal(_metaData[i]); } finally { SqlStatistics.StopTimer(statistics); } } private Type GetProviderSpecificFieldTypeInternal(_SqlMetaData metaData) { Type type = null; if (_typeSystem <= SqlConnectionString.TypeSystem.SQLServer2005 && metaData.IsNewKatmaiDateTimeType) { return MetaType.MetaNVarChar.SqlType; } if (_typeSystem <= SqlConnectionString.TypeSystem.SQLServer2005 && metaData.IsLargeUdt) { if (_typeSystem == SqlConnectionString.TypeSystem.SQLServer2005) { return MetaType.MetaMaxVarBinary.SqlType; } return MetaType.MetaImage.SqlType; } if (_typeSystem != SqlConnectionString.TypeSystem.SQLServer2000) { if (metaData.type == SqlDbType.Udt) { return MetaType.MetaMaxVarBinary.SqlType; } return metaData.metaType.SqlType; } return GetVersionedMetaType(metaData.metaType).SqlType; } public override int GetOrdinal(string name) { SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); if (_fieldNameLookup == null) { CheckMetaDataIsReady(); _fieldNameLookup = new FieldNameLookup(this, _defaultLCID); } return _fieldNameLookup.GetOrdinal(name); } finally { SqlStatistics.StopTimer(statistics); } } public override object GetProviderSpecificValue(int i) { return GetSqlValue(i); } public override int GetProviderSpecificValues(object[] values) { return GetSqlValues(values); } public override DataTable GetSchemaTable() { SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); if ((_metaData == null || _metaData.schemaTable == null) && MetaData != null) { _metaData.schemaTable = BuildSchemaTable(); } return _metaData?.schemaTable; } finally { SqlStatistics.StopTimer(statistics); } } public override bool GetBoolean(int i) { ReadColumn(i); return _data[i].Boolean; } public virtual XmlReader GetXmlReader(int i) { CheckDataIsReady(i, allowPartiallyReadColumn: false, permitAsync: false, "GetXmlReader"); if (_metaData[i].metaType.SqlDbType != SqlDbType.Xml) { throw SQL.XmlReaderNotSupportOnColumnType(_metaData[i].column); } if (IsCommandBehavior(CommandBehavior.SequentialAccess)) { _currentStream = new SqlSequentialStream(this, i); _lastColumnWithDataChunkRead = i; return SqlTypeWorkarounds.SqlXmlCreateSqlXmlReader(_currentStream, closeInput: true); } ReadColumn(i); if (_data[i].IsNull) { return SqlTypeWorkarounds.SqlXmlCreateSqlXmlReader(new MemoryStream(Array.Empty(), writable: false), closeInput: true); } return _data[i].SqlXml.CreateReader(); } public override Stream GetStream(int i) { CheckDataIsReady(i, allowPartiallyReadColumn: false, permitAsync: false, "GetStream"); MetaType metaType = _metaData[i].metaType; if ((!metaType.IsBinType || metaType.SqlDbType == SqlDbType.Timestamp) && metaType.SqlDbType != SqlDbType.Variant) { throw SQL.StreamNotSupportOnColumnType(_metaData[i].column); } if (metaType.SqlDbType != SqlDbType.Variant && IsCommandBehavior(CommandBehavior.SequentialAccess)) { _currentStream = new SqlSequentialStream(this, i); _lastColumnWithDataChunkRead = i; return _currentStream; } ReadColumn(i); byte[] buffer = ((!_data[i].IsNull) ? _data[i].SqlBinary.Value : Array.Empty()); return new MemoryStream(buffer, writable: false); } public override byte GetByte(int i) { ReadColumn(i); return _data[i].Byte; } public override long GetBytes(int i, long dataIndex, byte[] buffer, int bufferIndex, int length) { SqlStatistics statistics = null; long num = 0L; CheckDataIsReady(i, allowPartiallyReadColumn: true, permitAsync: false, "GetBytes"); MetaType metaType = _metaData[i].metaType; if ((!metaType.IsLong && !metaType.IsBinType) || SqlDbType.Xml == metaType.SqlDbType) { throw SQL.NonBlobColumn(_metaData[i].column); } try { statistics = SqlStatistics.StartTimer(Statistics); SetTimeout(_defaultTimeoutMilliseconds); num = GetBytesInternal(i, dataIndex, buffer, bufferIndex, length); _lastColumnWithDataChunkRead = i; return num; } finally { SqlStatistics.StopTimer(statistics); } } internal virtual long GetBytesInternal(int i, long dataIndex, byte[] buffer, int bufferIndex, int length) { if (_currentTask != null) { throw ADP.AsyncOperationPending(); } if (!TryGetBytesInternal(i, dataIndex, buffer, bufferIndex, length, out var remaining)) { throw SQL.SynchronousCallMayNotPend(); } return remaining; } private bool TryGetBytesInternal(int i, long dataIndex, byte[] buffer, int bufferIndex, int length, out long remaining) { remaining = 0L; int maxLen = 0; if (IsCommandBehavior(CommandBehavior.SequentialAccess)) { if (_sharedState._nextColumnHeaderToRead <= i && !TryReadColumnHeader(i)) { return false; } if (_data[i] != null && _data[i].IsNull) { throw new SqlNullValueException(); } if (-1 == _sharedState._columnDataBytesRemaining && _metaData[i].metaType.IsPlp) { if (!_parser.TryPlpBytesLeft(_stateObj, out var left)) { return false; } _sharedState._columnDataBytesRemaining = (long)left; } if (_sharedState._columnDataBytesRemaining == 0L) { return true; } if (buffer == null) { if (_metaData[i].metaType.IsPlp) { remaining = (long)_parser.PlpBytesTotalLength(_stateObj); return true; } remaining = _sharedState._columnDataBytesRemaining; return true; } if (dataIndex < 0) { throw ADP.NegativeParameter("dataIndex"); } if (dataIndex < _columnDataBytesRead) { throw ADP.NonSeqByteAccess(dataIndex, _columnDataBytesRead, "GetBytes"); } long num = dataIndex - _columnDataBytesRead; if (num > _sharedState._columnDataBytesRemaining && !_metaData[i].metaType.IsPlp) { return true; } if (bufferIndex < 0 || bufferIndex >= buffer.Length) { throw ADP.InvalidDestinationBufferIndex(buffer.Length, bufferIndex, "bufferIndex"); } if (length + bufferIndex > buffer.Length) { throw ADP.InvalidBufferSizeOrIndex(length, bufferIndex); } if (length < 0) { throw ADP.InvalidDataLength(length); } if (num > 0) { if (_metaData[i].metaType.IsPlp) { if (!_parser.TrySkipPlpValue((ulong)num, _stateObj, out var totalBytesSkipped)) { return false; } _columnDataBytesRead += (long)totalBytesSkipped; } else { if (!_stateObj.TrySkipLongBytes(num)) { return false; } _columnDataBytesRead += num; _sharedState._columnDataBytesRemaining -= num; } } int bytesRead; bool result = TryGetBytesInternalSequential(i, buffer, bufferIndex, length, out bytesRead); remaining = bytesRead; return result; } if (dataIndex < 0) { throw ADP.NegativeParameter("dataIndex"); } if (dataIndex > int.MaxValue) { throw ADP.InvalidSourceBufferIndex(maxLen, dataIndex, "dataIndex"); } int num2 = (int)dataIndex; byte[] array; if (_metaData[i].metaType.IsBinType) { array = GetSqlBinary(i).Value; } else { SqlString sqlString = GetSqlString(i); array = ((!_metaData[i].metaType.IsNCharType) ? sqlString.GetNonUnicodeBytes() : sqlString.GetUnicodeBytes()); } maxLen = array.Length; if (buffer == null) { remaining = maxLen; return true; } if (num2 < 0 || num2 >= maxLen) { return true; } try { if (num2 < maxLen) { maxLen = ((num2 + length <= maxLen) ? length : (maxLen - num2)); } Buffer.BlockCopy(array, num2, buffer, bufferIndex, maxLen); } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } maxLen = array.Length; if (length < 0) { throw ADP.InvalidDataLength(length); } if (bufferIndex < 0 || bufferIndex >= buffer.Length) { throw ADP.InvalidDestinationBufferIndex(buffer.Length, bufferIndex, "bufferIndex"); } if (maxLen + bufferIndex > buffer.Length) { throw ADP.InvalidBufferSizeOrIndex(maxLen, bufferIndex); } throw; } remaining = maxLen; return true; } internal int GetBytesInternalSequential(int i, byte[] buffer, int index, int length, long? timeoutMilliseconds = null) { if (_currentTask != null) { throw ADP.AsyncOperationPending(); } SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); SetTimeout(timeoutMilliseconds ?? _defaultTimeoutMilliseconds); if (!TryReadColumnHeader(i)) { throw SQL.SynchronousCallMayNotPend(); } if (!TryGetBytesInternalSequential(i, buffer, index, length, out var bytesRead)) { throw SQL.SynchronousCallMayNotPend(); } return bytesRead; } finally { SqlStatistics.StopTimer(statistics); } } internal bool TryGetBytesInternalSequential(int i, byte[] buffer, int index, int length, out int bytesRead) { bytesRead = 0; if (_sharedState._columnDataBytesRemaining == 0L || length == 0) { bytesRead = 0; return true; } if (_metaData[i].metaType.IsPlp) { bool num = _stateObj.TryReadPlpBytes(ref buffer, index, length, out bytesRead); _columnDataBytesRead += bytesRead; if (!num) { return false; } if (!_parser.TryPlpBytesLeft(_stateObj, out var left)) { _sharedState._columnDataBytesRemaining = -1L; return false; } _sharedState._columnDataBytesRemaining = (long)left; return true; } int len = (int)Math.Min(length, _sharedState._columnDataBytesRemaining); bool result = _stateObj.TryReadByteArray(buffer, index, len, out bytesRead); _columnDataBytesRead += bytesRead; _sharedState._columnDataBytesRemaining -= bytesRead; return result; } public override TextReader GetTextReader(int i) { CheckDataIsReady(i, allowPartiallyReadColumn: false, permitAsync: false, "GetTextReader"); MetaType metaType = _metaData[i].metaType; if ((!metaType.IsCharType && metaType.SqlDbType != SqlDbType.Variant) || metaType.SqlDbType == SqlDbType.Xml) { throw SQL.TextReaderNotSupportOnColumnType(_metaData[i].column); } if (metaType.SqlDbType != SqlDbType.Variant && IsCommandBehavior(CommandBehavior.SequentialAccess)) { Encoding encoding = ((!metaType.IsNCharType) ? _metaData[i].encoding : SqlUnicodeEncoding.SqlUnicodeEncodingInstance); _currentTextReader = new SqlSequentialTextReader(this, i, encoding); _lastColumnWithDataChunkRead = i; return _currentTextReader; } ReadColumn(i); string s = ((!_data[i].IsNull) ? _data[i].SqlString.Value : string.Empty); return new StringReader(s); } [EditorBrowsable(EditorBrowsableState.Never)] public override char GetChar(int i) { throw ADP.NotSupported(); } public override long GetChars(int i, long dataIndex, char[] buffer, int bufferIndex, int length) { SqlStatistics statistics = null; CheckMetaDataIsReady(i); if (_currentTask != null) { throw ADP.AsyncOperationPending(); } try { statistics = SqlStatistics.StartTimer(Statistics); SetTimeout(_defaultTimeoutMilliseconds); if (_metaData[i].metaType.IsPlp && IsCommandBehavior(CommandBehavior.SequentialAccess)) { if (length < 0) { throw ADP.InvalidDataLength(length); } if (bufferIndex < 0 || (buffer != null && bufferIndex >= buffer.Length)) { throw ADP.InvalidDestinationBufferIndex(buffer.Length, bufferIndex, "bufferIndex"); } if (buffer != null && length + bufferIndex > buffer.Length) { throw ADP.InvalidBufferSizeOrIndex(length, bufferIndex); } long num = 0L; if (_metaData[i].type == SqlDbType.Xml) { try { CheckDataIsReady(i, allowPartiallyReadColumn: true, permitAsync: false, "GetChars"); } catch (Exception ex) { if (ADP.IsCatchableExceptionType(ex)) { throw new TargetInvocationException(ex); } throw; } num = GetStreamingXmlChars(i, dataIndex, buffer, bufferIndex, length); } else { CheckDataIsReady(i, allowPartiallyReadColumn: true, permitAsync: false, "GetChars"); num = GetCharsFromPlpData(i, dataIndex, buffer, bufferIndex, length); } _lastColumnWithDataChunkRead = i; return num; } if (_sharedState._nextColumnDataToRead == i + 1 && _sharedState._nextColumnHeaderToRead == i + 1 && _columnDataChars != null && IsCommandBehavior(CommandBehavior.SequentialAccess) && dataIndex < _columnDataCharsRead) { throw ADP.NonSeqByteAccess(dataIndex, _columnDataCharsRead, "GetChars"); } if (_columnDataCharsIndex != i) { string value = GetSqlString(i).Value; _columnDataChars = value.ToCharArray(); _columnDataCharsRead = 0L; _columnDataCharsIndex = i; } int num2 = _columnDataChars.Length; if (dataIndex > int.MaxValue) { throw ADP.InvalidSourceBufferIndex(num2, dataIndex, "dataIndex"); } int num3 = (int)dataIndex; if (buffer == null) { return num2; } if (num3 < 0 || num3 >= num2) { return 0L; } try { if (num3 < num2) { num2 = ((num3 + length <= num2) ? length : (num2 - num3)); } Array.Copy(_columnDataChars, num3, buffer, bufferIndex, num2); _columnDataCharsRead += num2; } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } num2 = _columnDataChars.Length; if (length < 0) { throw ADP.InvalidDataLength(length); } if (bufferIndex < 0 || bufferIndex >= buffer.Length) { throw ADP.InvalidDestinationBufferIndex(buffer.Length, bufferIndex, "bufferIndex"); } if (num2 + bufferIndex > buffer.Length) { throw ADP.InvalidBufferSizeOrIndex(num2, bufferIndex); } throw; } return num2; } finally { SqlStatistics.StopTimer(statistics); } } private long GetCharsFromPlpData(int i, long dataIndex, char[] buffer, int bufferIndex, int length) { if (!_metaData[i].metaType.IsCharType) { throw SQL.NonCharColumn(_metaData[i].column); } if (_sharedState._nextColumnHeaderToRead <= i) { ReadColumnHeader(i); } if (_data[i] != null && _data[i].IsNull) { throw new SqlNullValueException(); } if (dataIndex < _columnDataCharsRead) { throw ADP.NonSeqByteAccess(dataIndex, _columnDataCharsRead, "GetChars"); } if (dataIndex == 0L) { _stateObj._plpdecoder = null; } bool isNCharType = _metaData[i].metaType.IsNCharType; if (-1 == _sharedState._columnDataBytesRemaining) { _sharedState._columnDataBytesRemaining = (long)_parser.PlpBytesLeft(_stateObj); } if (_sharedState._columnDataBytesRemaining == 0L) { _stateObj._plpdecoder = null; return 0L; } long num; if (buffer == null) { num = (long)_parser.PlpBytesTotalLength(_stateObj); if (!isNCharType || num <= 0) { return num; } return num >> 1; } if (dataIndex > _columnDataCharsRead) { _stateObj._plpdecoder = null; num = dataIndex - _columnDataCharsRead; num = (isNCharType ? (num << 1) : num); num = (long)_parser.SkipPlpValue((ulong)num, _stateObj); _columnDataBytesRead += num; _columnDataCharsRead += ((isNCharType && num > 0) ? (num >> 1) : num); } num = length; if (isNCharType) { num = _parser.ReadPlpUnicodeChars(ref buffer, bufferIndex, length, _stateObj); _columnDataBytesRead += num << 1; } else { num = _parser.ReadPlpAnsiChars(ref buffer, bufferIndex, length, _metaData[i], _stateObj); _columnDataBytesRead += num << 1; } _columnDataCharsRead += num; _sharedState._columnDataBytesRemaining = (long)_parser.PlpBytesLeft(_stateObj); return num; } internal long GetStreamingXmlChars(int i, long dataIndex, char[] buffer, int bufferIndex, int length) { SqlStreamingXml sqlStreamingXml = null; if (_streamingXml != null && _streamingXml.ColumnOrdinal != i) { _streamingXml.Close(); _streamingXml = null; } sqlStreamingXml = ((_streamingXml != null) ? _streamingXml : new SqlStreamingXml(i, this)); long chars = sqlStreamingXml.GetChars(dataIndex, buffer, bufferIndex, length); if (_streamingXml == null) { _streamingXml = sqlStreamingXml; } return chars; } public override DateTime GetDateTime(int i) { ReadColumn(i); DateTime result = _data[i].DateTime; if (_typeSystem <= SqlConnectionString.TypeSystem.SQLServer2005 && _metaData[i].IsNewKatmaiDateTimeType) { result = (DateTime)(object)_data[i].String; } return result; } public override decimal GetDecimal(int i) { ReadColumn(i); return _data[i].Decimal; } public override double GetDouble(int i) { ReadColumn(i); return _data[i].Double; } public override float GetFloat(int i) { ReadColumn(i); return _data[i].Single; } public override Guid GetGuid(int i) { ReadColumn(i); return _data[i].SqlGuid.Value; } public override short GetInt16(int i) { ReadColumn(i); return _data[i].Int16; } public override int GetInt32(int i) { ReadColumn(i); return _data[i].Int32; } public override long GetInt64(int i) { ReadColumn(i); return _data[i].Int64; } public virtual SqlBoolean GetSqlBoolean(int i) { ReadColumn(i); return _data[i].SqlBoolean; } public virtual SqlBinary GetSqlBinary(int i) { ReadColumn(i, setTimeout: true, allowPartiallyReadColumn: true); return _data[i].SqlBinary; } public virtual SqlByte GetSqlByte(int i) { ReadColumn(i); return _data[i].SqlByte; } public virtual SqlBytes GetSqlBytes(int i) { ReadColumn(i); return new SqlBytes(_data[i].SqlBinary); } public virtual SqlChars GetSqlChars(int i) { ReadColumn(i); SqlString value = ((_typeSystem > SqlConnectionString.TypeSystem.SQLServer2005 || !_metaData[i].IsNewKatmaiDateTimeType) ? _data[i].SqlString : _data[i].KatmaiDateTimeSqlString); return new SqlChars(value); } public virtual SqlDateTime GetSqlDateTime(int i) { ReadColumn(i); return _data[i].SqlDateTime; } public virtual SqlDecimal GetSqlDecimal(int i) { ReadColumn(i); return _data[i].SqlDecimal; } public virtual SqlGuid GetSqlGuid(int i) { ReadColumn(i); return _data[i].SqlGuid; } public virtual SqlDouble GetSqlDouble(int i) { ReadColumn(i); return _data[i].SqlDouble; } public virtual SqlInt16 GetSqlInt16(int i) { ReadColumn(i); return _data[i].SqlInt16; } public virtual SqlInt32 GetSqlInt32(int i) { ReadColumn(i); return _data[i].SqlInt32; } public virtual SqlInt64 GetSqlInt64(int i) { ReadColumn(i); return _data[i].SqlInt64; } public virtual SqlMoney GetSqlMoney(int i) { ReadColumn(i); return _data[i].SqlMoney; } public virtual SqlSingle GetSqlSingle(int i) { ReadColumn(i); return _data[i].SqlSingle; } public virtual SqlString GetSqlString(int i) { ReadColumn(i); if (_typeSystem <= SqlConnectionString.TypeSystem.SQLServer2005 && _metaData[i].IsNewKatmaiDateTimeType) { return _data[i].KatmaiDateTimeSqlString; } return _data[i].SqlString; } public virtual SqlXml GetSqlXml(int i) { ReadColumn(i); SqlXml sqlXml = null; if (_typeSystem != SqlConnectionString.TypeSystem.SQLServer2000) { return _data[i].IsNull ? SqlXml.Null : _data[i].SqlCachedBuffer.ToSqlXml(); } sqlXml = (_data[i].IsNull ? SqlXml.Null : _data[i].SqlCachedBuffer.ToSqlXml()); return (SqlXml)(object)_data[i].String; } public virtual object GetSqlValue(int i) { SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); SetTimeout(_defaultTimeoutMilliseconds); return GetSqlValueInternal(i); } finally { SqlStatistics.StopTimer(statistics); } } private object GetSqlValueInternal(int i) { if (_currentTask != null) { throw ADP.AsyncOperationPending(); } if (!TryReadColumn(i, setTimeout: false)) { throw SQL.SynchronousCallMayNotPend(); } return GetSqlValueFromSqlBufferInternal(_data[i], _metaData[i]); } private object GetSqlValueFromSqlBufferInternal(SqlBuffer data, _SqlMetaData metaData) { if (_typeSystem <= SqlConnectionString.TypeSystem.SQLServer2005 && metaData.IsNewKatmaiDateTimeType) { return data.KatmaiDateTimeSqlString; } if (_typeSystem <= SqlConnectionString.TypeSystem.SQLServer2005 && metaData.IsLargeUdt) { return data.SqlValue; } if (_typeSystem != SqlConnectionString.TypeSystem.SQLServer2000) { if (metaData.type == SqlDbType.Udt) { if (_connection != null) { throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString()); } throw ADP.DataReaderClosed("GetSqlValueFromSqlBufferInternal"); } return data.SqlValue; } if (metaData.type == SqlDbType.Xml) { return data.SqlString; } return data.SqlValue; } public virtual int GetSqlValues(object[] values) { SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); CheckDataIsReady(); if (values == null) { throw ADP.ArgumentNull("values"); } SetTimeout(_defaultTimeoutMilliseconds); int num = ((values.Length < _metaData.visibleColumns) ? values.Length : _metaData.visibleColumns); for (int i = 0; i < num; i++) { values[_metaData.indexMap[i]] = GetSqlValueInternal(i); } return num; } finally { SqlStatistics.StopTimer(statistics); } } public override string GetString(int i) { ReadColumn(i); if (_typeSystem <= SqlConnectionString.TypeSystem.SQLServer2005 && _metaData[i].IsNewKatmaiDateTimeType) { return _data[i].KatmaiDateTimeString; } return _data[i].String; } public override T GetFieldValue(int i) { SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); SetTimeout(_defaultTimeoutMilliseconds); return GetFieldValueInternal(i); } finally { SqlStatistics.StopTimer(statistics); } } public override object GetValue(int i) { SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); SetTimeout(_defaultTimeoutMilliseconds); return GetValueInternal(i); } finally { SqlStatistics.StopTimer(statistics); } } public virtual TimeSpan GetTimeSpan(int i) { ReadColumn(i); TimeSpan result = _data[i].Time; if (_typeSystem <= SqlConnectionString.TypeSystem.SQLServer2005) { result = (TimeSpan)(object)_data[i].String; } return result; } public virtual DateTimeOffset GetDateTimeOffset(int i) { ReadColumn(i); DateTimeOffset result = _data[i].DateTimeOffset; if (_typeSystem <= SqlConnectionString.TypeSystem.SQLServer2005) { result = (DateTimeOffset)(object)_data[i].String; } return result; } private object GetValueInternal(int i) { if (_currentTask != null) { throw ADP.AsyncOperationPending(); } if (!TryReadColumn(i, setTimeout: false)) { throw SQL.SynchronousCallMayNotPend(); } return GetValueFromSqlBufferInternal(_data[i], _metaData[i]); } private object GetValueFromSqlBufferInternal(SqlBuffer data, _SqlMetaData metaData) { if (_typeSystem <= SqlConnectionString.TypeSystem.SQLServer2005 && metaData.IsNewKatmaiDateTimeType) { if (data.IsNull) { return DBNull.Value; } return data.KatmaiDateTimeString; } if (_typeSystem <= SqlConnectionString.TypeSystem.SQLServer2005 && metaData.IsLargeUdt) { return data.Value; } if (_typeSystem != SqlConnectionString.TypeSystem.SQLServer2000) { if (metaData.type != SqlDbType.Udt) { return data.Value; } if (_connection != null) { throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString()); } throw ADP.DataReaderClosed("GetValueFromSqlBufferInternal"); } return data.Value; } private T GetFieldValueInternal(int i) { if (_currentTask != null) { throw ADP.AsyncOperationPending(); } if (!TryReadColumn(i, setTimeout: false)) { throw SQL.SynchronousCallMayNotPend(); } return GetFieldValueFromSqlBufferInternal(_data[i], _metaData[i]); } private T GetFieldValueFromSqlBufferInternal(SqlBuffer data, _SqlMetaData metaData) { Type typeFromHandle = typeof(T); if (_typeofINullable.IsAssignableFrom(typeFromHandle)) { object obj = GetSqlValueFromSqlBufferInternal(data, metaData); if (typeFromHandle == s_typeofSqlString && obj is SqlXml sqlXml) { obj = ((!sqlXml.IsNull) ? ((object)new SqlString(sqlXml.Value)) : ((object)SqlString.Null)); } return (T)obj; } try { return (T)GetValueFromSqlBufferInternal(data, metaData); } catch (InvalidCastException) { if (data.IsNull) { throw SQL.SqlNullValue(); } throw; } } public override int GetValues(object[] values) { SqlStatistics statistics = null; bool flag = IsCommandBehavior(CommandBehavior.SequentialAccess); try { statistics = SqlStatistics.StartTimer(Statistics); if (values == null) { throw ADP.ArgumentNull("values"); } CheckMetaDataIsReady(); int num = ((values.Length < _metaData.visibleColumns) ? values.Length : _metaData.visibleColumns); int num2 = num - 1; SetTimeout(_defaultTimeoutMilliseconds); _commandBehavior &= ~CommandBehavior.SequentialAccess; if (!TryReadColumn(num2, setTimeout: false)) { throw SQL.SynchronousCallMayNotPend(); } for (int i = 0; i < num; i++) { values[_metaData.indexMap[i]] = GetValueFromSqlBufferInternal(_data[i], _metaData[i]); if (flag && i < num2) { _data[i].Clear(); } } return num; } finally { if (flag) { _commandBehavior |= CommandBehavior.SequentialAccess; } SqlStatistics.StopTimer(statistics); } } private MetaType GetVersionedMetaType(MetaType actualMetaType) { MetaType metaType = null; if (actualMetaType == MetaType.MetaUdt) { return MetaType.MetaVarBinary; } if (actualMetaType == MetaType.MetaXml) { return MetaType.MetaNText; } if (actualMetaType == MetaType.MetaMaxVarBinary) { return MetaType.MetaImage; } if (actualMetaType == MetaType.MetaMaxVarChar) { return MetaType.MetaText; } if (actualMetaType == MetaType.MetaMaxNVarChar) { return MetaType.MetaNText; } return actualMetaType; } private bool TryHasMoreResults(out bool moreResults) { if (_parser != null) { if (!TryHasMoreRows(out var moreRows)) { moreResults = false; return false; } if (moreRows) { moreResults = false; return true; } while (_stateObj._pendingData) { if (!_stateObj.TryPeekByte(out var value)) { moreResults = false; return false; } switch (value) { case 211: if (_altRowStatus == ALTROWSTATUS.Null) { _altMetaDataSetCollection.metaDataSet = _metaData; _metaData = null; } _altRowStatus = ALTROWSTATUS.AltRow; _hasRows = true; moreResults = true; return true; case 209: case 210: moreResults = true; return true; case 253: _altRowStatus = ALTROWSTATUS.Null; _metaData = null; _altMetaDataSetCollection = null; moreResults = true; return true; case 129: moreResults = true; return true; default: { if (_parser.State == TdsParserState.Broken || _parser.State == TdsParserState.Closed) { throw ADP.ClosedConnectionError(); } if (!_parser.TryRun(RunBehavior.ReturnImmediately, _command, this, null, _stateObj, out var _)) { moreResults = false; return false; } break; } } } } moreResults = false; return true; } private bool TryHasMoreRows(out bool moreRows) { if (_parser != null) { if (_sharedState._dataReady) { moreRows = true; return true; } switch (_altRowStatus) { case ALTROWSTATUS.AltRow: moreRows = true; return true; case ALTROWSTATUS.Done: moreRows = false; return true; } if (_stateObj._pendingData) { if (!_stateObj.TryPeekByte(out var value)) { moreRows = false; return false; } bool flag = false; while (value == 253 || value == 254 || value == byte.MaxValue || (!flag && (value == 228 || value == 227 || value == 169 || value == 170 || value == 171))) { if (value == 253 || value == 254 || value == byte.MaxValue) { flag = true; } if (_parser.State == TdsParserState.Broken || _parser.State == TdsParserState.Closed) { throw ADP.ClosedConnectionError(); } if (!_parser.TryRun(RunBehavior.ReturnImmediately, _command, this, null, _stateObj, out var _)) { moreRows = false; return false; } if (!_stateObj._pendingData) { break; } if (!_stateObj.TryPeekByte(out value)) { moreRows = false; return false; } } if (IsRowToken(value)) { moreRows = true; return true; } } } moreRows = false; return true; } private bool IsRowToken(byte token) { if (209 != token) { return 210 == token; } return true; } public override bool IsDBNull(int i) { CheckHeaderIsReady(i, permitAsync: false, "IsDBNull"); SetTimeout(_defaultTimeoutMilliseconds); ReadColumnHeader(i); return _data[i].IsNull; } protected internal bool IsCommandBehavior(CommandBehavior condition) { return condition == (condition & _commandBehavior); } public override bool NextResult() { if (_currentTask != null) { throw SQL.PendingBeginXXXExists(); } if (!TryNextResult(out var more)) { throw SQL.SynchronousCallMayNotPend(); } return more; } private bool TryNextResult(out bool more) { SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); SetTimeout(_defaultTimeoutMilliseconds); if (IsClosed) { throw ADP.DataReaderClosed("NextResult"); } _fieldNameLookup = null; bool flag = false; _hasRows = false; if (IsCommandBehavior(CommandBehavior.SingleResult)) { if (!TryCloseInternal(closeReader: false)) { more = false; return false; } ClearMetaData(); more = flag; return true; } if (_parser != null) { bool more2 = true; while (more2) { if (!TryReadInternal(setTimeout: false, out more2)) { more = false; return false; } } } if (_parser != null) { if (!TryHasMoreResults(out var moreResults)) { more = false; return false; } if (moreResults) { _metaDataConsumed = false; _browseModeInfoConsumed = false; switch (_altRowStatus) { case ALTROWSTATUS.AltRow: { if (!_parser.TryGetAltRowId(_stateObj, out var id)) { more = false; return false; } _SqlMetaDataSet altMetaData = _altMetaDataSetCollection.GetAltMetaData(id); if (altMetaData != null) { _metaData = altMetaData; } break; } case ALTROWSTATUS.Done: _metaData = _altMetaDataSetCollection.metaDataSet; _altRowStatus = ALTROWSTATUS.Null; break; default: if (!TryConsumeMetaData()) { more = false; return false; } if (_metaData == null) { more = false; return true; } break; } flag = true; } else { if (!TryCloseInternal(closeReader: false)) { more = false; return false; } if (!TrySetMetaData(null, moreInfo: false)) { more = false; return false; } } } else { ClearMetaData(); } more = flag; return true; } finally { SqlStatistics.StopTimer(statistics); } } public override bool Read() { if (_currentTask != null) { throw SQL.PendingBeginXXXExists(); } if (!TryReadInternal(setTimeout: true, out var more)) { throw SQL.SynchronousCallMayNotPend(); } return more; } private bool TryReadInternal(bool setTimeout, out bool more) { SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); if (_parser != null) { if (setTimeout) { SetTimeout(_defaultTimeoutMilliseconds); } if (_sharedState._dataReady && !TryCleanPartialRead()) { more = false; return false; } SqlBuffer.Clear(_data); _sharedState._nextColumnHeaderToRead = 0; _sharedState._nextColumnDataToRead = 0; _sharedState._columnDataBytesRemaining = -1L; _lastColumnWithDataChunkRead = -1; if (!_haltRead) { if (!TryHasMoreRows(out var moreRows)) { more = false; return false; } if (moreRows) { while (_stateObj._pendingData) { if (_altRowStatus != ALTROWSTATUS.AltRow) { if (!_parser.TryRun(RunBehavior.ReturnImmediately, _command, this, null, _stateObj, out _sharedState._dataReady)) { more = false; return false; } if (_sharedState._dataReady) { break; } continue; } _altRowStatus = ALTROWSTATUS.Done; _sharedState._dataReady = true; break; } if (_sharedState._dataReady) { _haltRead = IsCommandBehavior(CommandBehavior.SingleRow); more = true; return true; } } if (!_stateObj._pendingData && !TryCloseInternal(closeReader: false)) { more = false; return false; } } else { if (!TryHasMoreRows(out var moreRows2)) { more = false; return false; } while (moreRows2) { while (_stateObj._pendingData && !_sharedState._dataReady) { if (!_parser.TryRun(RunBehavior.ReturnImmediately, _command, this, null, _stateObj, out _sharedState._dataReady)) { more = false; return false; } } if (_sharedState._dataReady && !TryCleanPartialRead()) { more = false; return false; } SqlBuffer.Clear(_data); _sharedState._nextColumnHeaderToRead = 0; if (!TryHasMoreRows(out moreRows2)) { more = false; return false; } } _haltRead = false; } } else if (IsClosed) { throw ADP.DataReaderClosed("Read"); } more = false; return true; } finally { SqlStatistics.StopTimer(statistics); } } private void ReadColumn(int i, bool setTimeout = true, bool allowPartiallyReadColumn = false) { if (_currentTask != null) { throw ADP.AsyncOperationPending(); } if (!TryReadColumn(i, setTimeout, allowPartiallyReadColumn)) { throw SQL.SynchronousCallMayNotPend(); } } private bool TryReadColumn(int i, bool setTimeout, bool allowPartiallyReadColumn = false) { CheckDataIsReady(i, allowPartiallyReadColumn, permitAsync: true, null); if (setTimeout) { SetTimeout(_defaultTimeoutMilliseconds); } if (!TryReadColumnInternal(i)) { return false; } return true; } private bool TryReadColumnData() { if (!_data[_sharedState._nextColumnDataToRead].IsNull) { _SqlMetaData md = _metaData[_sharedState._nextColumnDataToRead]; if (!_parser.TryReadSqlValue(_data[_sharedState._nextColumnDataToRead], md, (int)_sharedState._columnDataBytesRemaining, _stateObj)) { return false; } _sharedState._columnDataBytesRemaining = 0L; } _sharedState._nextColumnDataToRead++; return true; } private void ReadColumnHeader(int i) { if (!TryReadColumnHeader(i)) { throw SQL.SynchronousCallMayNotPend(); } } private bool TryReadColumnHeader(int i) { if (!_sharedState._dataReady) { throw SQL.InvalidRead(); } return TryReadColumnInternal(i, readHeaderOnly: true); } private bool TryReadColumnInternal(int i, bool readHeaderOnly = false) { if (i < _sharedState._nextColumnHeaderToRead) { if (i == _sharedState._nextColumnDataToRead && !readHeaderOnly) { return TryReadColumnData(); } return true; } bool flag = IsCommandBehavior(CommandBehavior.SequentialAccess); if (flag) { if (0 < _sharedState._nextColumnDataToRead) { _data[_sharedState._nextColumnDataToRead - 1].Clear(); } if (_lastColumnWithDataChunkRead > -1 && i > _lastColumnWithDataChunkRead) { CloseActiveSequentialStreamAndTextReader(); } } else if (_sharedState._nextColumnDataToRead < _sharedState._nextColumnHeaderToRead && !TryReadColumnData()) { return false; } if (!TryResetBlobState()) { return false; } do { _SqlMetaData sqlMetaData = _metaData[_sharedState._nextColumnHeaderToRead]; if (flag && _sharedState._nextColumnHeaderToRead < i) { if (!_parser.TrySkipValue(sqlMetaData, _sharedState._nextColumnHeaderToRead, _stateObj)) { return false; } _sharedState._nextColumnDataToRead = _sharedState._nextColumnHeaderToRead; _sharedState._nextColumnHeaderToRead++; } else { if (!_parser.TryProcessColumnHeader(sqlMetaData, _stateObj, _sharedState._nextColumnHeaderToRead, out var isNull, out var length)) { return false; } _sharedState._nextColumnDataToRead = _sharedState._nextColumnHeaderToRead; _sharedState._nextColumnHeaderToRead++; if (isNull && sqlMetaData.type != SqlDbType.Timestamp) { _parser.GetNullSqlValue(_data[_sharedState._nextColumnDataToRead], sqlMetaData); if (!readHeaderOnly) { _sharedState._nextColumnDataToRead++; } } else if (i > _sharedState._nextColumnDataToRead || !readHeaderOnly) { if (!_parser.TryReadSqlValue(_data[_sharedState._nextColumnDataToRead], sqlMetaData, (int)length, _stateObj)) { return false; } _sharedState._nextColumnDataToRead++; } else { _sharedState._columnDataBytesRemaining = (long)length; } } if (_snapshot != null) { _snapshot = null; PrepareAsyncInvocation(useSnapshot: true); } } while (_sharedState._nextColumnHeaderToRead <= i); return true; } private bool WillHaveEnoughData(int targetColumn, bool headerOnly = false) { if (_lastColumnWithDataChunkRead == _sharedState._nextColumnDataToRead && _metaData[_lastColumnWithDataChunkRead].metaType.IsPlp) { return false; } int num = Math.Min(checked(_stateObj._inBytesRead - _stateObj._inBytesUsed), _stateObj._inBytesPacket); num--; if (targetColumn >= _sharedState._nextColumnDataToRead && _sharedState._nextColumnDataToRead < _sharedState._nextColumnHeaderToRead) { if (_sharedState._columnDataBytesRemaining > num) { return false; } num = checked(num - (int)_sharedState._columnDataBytesRemaining); } int num2 = _sharedState._nextColumnHeaderToRead; while (num >= 0 && num2 <= targetColumn) { if (!_stateObj.IsNullCompressionBitSet(num2)) { MetaType metaType = _metaData[num2].metaType; if (metaType.IsLong || metaType.IsPlp || metaType.SqlDbType == SqlDbType.Udt || metaType.SqlDbType == SqlDbType.Structured) { return false; } byte b = (byte)(_metaData[num2].tdsType & 0x30u); int num3 = ((b == 32 || b == 0) ? (((_metaData[num2].tdsType & 0x80u) != 0) ? 2 : (((_metaData[num2].tdsType & 0xCu) != 0) ? 1 : 4)) : 0); checked { num -= num3; if (num2 < targetColumn || !headerOnly) { num -= _metaData[num2].length; } } } num2++; } return num >= 0; } private bool TryResetBlobState() { if (_sharedState._nextColumnDataToRead < _sharedState._nextColumnHeaderToRead) { if (_sharedState._nextColumnHeaderToRead > 0 && _metaData[_sharedState._nextColumnHeaderToRead - 1].metaType.IsPlp) { if (_stateObj._longlen != 0L && !_stateObj.Parser.TrySkipPlpValue(ulong.MaxValue, _stateObj, out var _)) { return false; } if (_streamingXml != null) { SqlStreamingXml streamingXml = _streamingXml; _streamingXml = null; streamingXml.Close(); } } else if (0 < _sharedState._columnDataBytesRemaining && !_stateObj.TrySkipLongBytes(_sharedState._columnDataBytesRemaining)) { return false; } } _sharedState._columnDataBytesRemaining = 0L; _columnDataBytesRead = 0L; _columnDataCharsRead = 0L; _columnDataChars = null; _columnDataCharsIndex = -1; _stateObj._plpdecoder = null; return true; } private void CloseActiveSequentialStreamAndTextReader() { if (_currentStream != null) { _currentStream.SetClosed(); _currentStream = null; } if (_currentTextReader != null) { _currentTextReader.SetClosed(); _currentStream = null; } } private void RestoreServerSettings(TdsParser parser, TdsParserStateObject stateObj) { if (parser != null && _resetOptionsString != null) { if (parser.State == TdsParserState.OpenLoggedIn) { parser.TdsExecuteSQLBatch(_resetOptionsString, (_command != null) ? _command.CommandTimeout : 0, null, stateObj, sync: true); parser.Run(RunBehavior.UntilDone, _command, this, null, stateObj); } _resetOptionsString = null; } } internal bool TrySetAltMetaDataSet(_SqlMetaDataSet metaDataSet, bool metaDataConsumed) { if (_altMetaDataSetCollection == null) { _altMetaDataSetCollection = new _SqlMetaDataSetCollection(); } else if (_snapshot != null && _snapshot._altMetaDataSetCollection == _altMetaDataSetCollection) { _altMetaDataSetCollection = (_SqlMetaDataSetCollection)_altMetaDataSetCollection.Clone(); } _altMetaDataSetCollection.SetAltMetaData(metaDataSet); _metaDataConsumed = metaDataConsumed; if (_metaDataConsumed && _parser != null) { if (!_stateObj.TryPeekByte(out var value)) { return false; } if (169 == value) { if (!_parser.TryRun(RunBehavior.ReturnImmediately, _command, this, null, _stateObj, out var _)) { return false; } if (!_stateObj.TryPeekByte(out value)) { return false; } } if (value == 171) { try { _stateObj._accumulateInfoEvents = true; if (!_parser.TryRun(RunBehavior.ReturnImmediately, _command, null, null, _stateObj, out var _)) { return false; } } finally { _stateObj._accumulateInfoEvents = false; } if (!_stateObj.TryPeekByte(out value)) { return false; } } _hasRows = IsRowToken(value); } if (metaDataSet != null && (_data == null || _data.Length < metaDataSet.Length)) { _data = SqlBuffer.CreateBufferArray(metaDataSet.Length); } return true; } private void ClearMetaData() { _metaData = null; _tableNames = null; _fieldNameLookup = null; _metaDataConsumed = false; _browseModeInfoConsumed = false; } internal bool TrySetMetaData(_SqlMetaDataSet metaData, bool moreInfo) { _metaData = metaData; _tableNames = null; if (_metaData != null) { _data = SqlBuffer.CreateBufferArray(metaData.Length); } _fieldNameLookup = null; if (metaData != null) { if (!moreInfo) { _metaDataConsumed = true; if (_parser != null) { if (!_stateObj.TryPeekByte(out var value)) { return false; } if (value == 169) { if (!_parser.TryRun(RunBehavior.ReturnImmediately, null, null, null, _stateObj, out var _)) { return false; } if (!_stateObj.TryPeekByte(out value)) { return false; } } if (value == 171) { try { _stateObj._accumulateInfoEvents = true; if (!_parser.TryRun(RunBehavior.ReturnImmediately, null, null, null, _stateObj, out var _)) { return false; } } finally { _stateObj._accumulateInfoEvents = false; } if (!_stateObj.TryPeekByte(out value)) { return false; } } _hasRows = IsRowToken(value); if (136 == value) { _metaDataConsumed = false; } } } } else { _metaDataConsumed = false; } _browseModeInfoConsumed = false; return true; } private void SetTimeout(long timeoutMilliseconds) { _stateObj?.SetTimeoutMilliseconds(timeoutMilliseconds); } private bool HasActiveStreamOrTextReaderOnColumn(int columnIndex) { return false | (_currentStream != null && _currentStream.ColumnIndex == columnIndex) | (_currentTextReader != null && _currentTextReader.ColumnIndex == columnIndex); } private void CheckMetaDataIsReady() { if (_currentTask != null) { throw ADP.AsyncOperationPending(); } if (MetaData == null) { throw SQL.InvalidRead(); } } private void CheckMetaDataIsReady(int columnIndex, bool permitAsync = false) { if (!permitAsync && _currentTask != null) { throw ADP.AsyncOperationPending(); } if (MetaData == null) { throw SQL.InvalidRead(); } if (columnIndex < 0 || columnIndex >= _metaData.Length) { throw ADP.IndexOutOfRange(); } } private void CheckDataIsReady() { if (_currentTask != null) { throw ADP.AsyncOperationPending(); } if (!_sharedState._dataReady || _metaData == null) { throw SQL.InvalidRead(); } } private void CheckHeaderIsReady(int columnIndex, bool permitAsync = false, [CallerMemberName] string methodName = null) { if (_isClosed) { throw ADP.DataReaderClosed(methodName ?? "CheckHeaderIsReady"); } if (!permitAsync && _currentTask != null) { throw ADP.AsyncOperationPending(); } if (!_sharedState._dataReady || _metaData == null) { throw SQL.InvalidRead(); } if (columnIndex < 0 || columnIndex >= _metaData.Length) { throw ADP.IndexOutOfRange(); } if (IsCommandBehavior(CommandBehavior.SequentialAccess) && (_sharedState._nextColumnHeaderToRead > columnIndex + 1 || _lastColumnWithDataChunkRead > columnIndex)) { throw ADP.NonSequentialColumnAccess(columnIndex, Math.Max(_sharedState._nextColumnHeaderToRead - 1, _lastColumnWithDataChunkRead)); } } private void CheckDataIsReady(int columnIndex, bool allowPartiallyReadColumn = false, bool permitAsync = false, [CallerMemberName] string methodName = null) { if (_isClosed) { throw ADP.DataReaderClosed(methodName ?? "CheckDataIsReady"); } if (!permitAsync && _currentTask != null) { throw ADP.AsyncOperationPending(); } if (!_sharedState._dataReady || _metaData == null) { throw SQL.InvalidRead(); } if (columnIndex < 0 || columnIndex >= _metaData.Length) { throw ADP.IndexOutOfRange(); } if (IsCommandBehavior(CommandBehavior.SequentialAccess) && (_sharedState._nextColumnDataToRead > columnIndex || _lastColumnWithDataChunkRead > columnIndex || (!allowPartiallyReadColumn && _lastColumnWithDataChunkRead == columnIndex) || (allowPartiallyReadColumn && HasActiveStreamOrTextReaderOnColumn(columnIndex)))) { throw ADP.NonSequentialColumnAccess(columnIndex, Math.Max(_sharedState._nextColumnDataToRead, _lastColumnWithDataChunkRead + 1)); } } [Conditional("DEBUG")] private void AssertReaderState(bool requireData, bool permitAsync, int? columnIndex = null, bool enforceSequentialAccess = false) { _ = columnIndex.HasValue; } public override Task NextResultAsync(CancellationToken cancellationToken) { TaskCompletionSource taskCompletionSource = new TaskCompletionSource(); if (IsClosed) { taskCompletionSource.SetException(ADP.ExceptionWithStackTrace(ADP.DataReaderClosed("NextResultAsync"))); return taskCompletionSource.Task; } IDisposable objectToDispose = null; if (cancellationToken.CanBeCanceled) { if (cancellationToken.IsCancellationRequested) { taskCompletionSource.SetCanceled(); return taskCompletionSource.Task; } objectToDispose = cancellationToken.Register(delegate(object s) { ((SqlCommand)s).CancelIgnoreFailure(); }, _command); } if (Interlocked.CompareExchange(ref _currentTask, taskCompletionSource.Task, null) != null) { taskCompletionSource.SetException(ADP.ExceptionWithStackTrace(SQL.PendingBeginXXXExists())); return taskCompletionSource.Task; } if (_cancelAsyncOnCloseToken.IsCancellationRequested) { taskCompletionSource.SetCanceled(); _currentTask = null; return taskCompletionSource.Task; } PrepareAsyncInvocation(useSnapshot: true); Func> moreFunc = null; moreFunc = delegate(Task t) { if (t != null) { PrepareForAsyncContinuation(); } bool more; return TryNextResult(out more) ? ((!more) ? ADP.FalseTask : ADP.TrueTask) : ContinueRetryable(moreFunc); }; return InvokeRetryable(moreFunc, taskCompletionSource, objectToDispose); } internal Task GetBytesAsync(int i, byte[] buffer, int index, int length, int timeout, CancellationToken cancellationToken, out int bytesRead) { bytesRead = 0; if (IsClosed) { return Task.FromException(ADP.ExceptionWithStackTrace(ADP.DataReaderClosed("GetBytesAsync"))); } if (_currentTask != null) { return Task.FromException(ADP.ExceptionWithStackTrace(ADP.AsyncOperationPending())); } if (cancellationToken.CanBeCanceled && cancellationToken.IsCancellationRequested) { return null; } if (_sharedState._nextColumnHeaderToRead <= _lastColumnWithDataChunkRead || _sharedState._nextColumnDataToRead < _lastColumnWithDataChunkRead) { TaskCompletionSource taskCompletionSource = new TaskCompletionSource(); if (Interlocked.CompareExchange(ref _currentTask, taskCompletionSource.Task, null) != null) { taskCompletionSource.SetException(ADP.ExceptionWithStackTrace(ADP.AsyncOperationPending())); return taskCompletionSource.Task; } PrepareAsyncInvocation(useSnapshot: true); Func> moreFunc = null; CancellationToken timeoutToken = CancellationToken.None; CancellationTokenSource cancellationTokenSource = null; if (timeout > 0) { cancellationTokenSource = new CancellationTokenSource(); cancellationTokenSource.CancelAfter(timeout); timeoutToken = cancellationTokenSource.Token; } moreFunc = delegate(Task t) { if (t != null) { PrepareForAsyncContinuation(); } SetTimeout(_defaultTimeoutMilliseconds); if (TryReadColumnHeader(i)) { if (cancellationToken.IsCancellationRequested) { return Task.FromCanceled(cancellationToken); } if (timeoutToken.IsCancellationRequested) { return Task.FromException(ADP.ExceptionWithStackTrace(ADP.IO(SQLMessage.Timeout()))); } SwitchToAsyncWithoutSnapshot(); int bytesRead2; Task bytesAsyncReadDataStage = GetBytesAsyncReadDataStage(i, buffer, index, length, timeout, isContinuation: true, cancellationToken, timeoutToken, out bytesRead2); if (bytesAsyncReadDataStage == null) { return Task.FromResult(bytesRead2); } return bytesAsyncReadDataStage; } return ContinueRetryable(moreFunc); }; return InvokeRetryable(moreFunc, taskCompletionSource, cancellationTokenSource); } PrepareAsyncInvocation(useSnapshot: false); try { return GetBytesAsyncReadDataStage(i, buffer, index, length, timeout, isContinuation: false, cancellationToken, CancellationToken.None, out bytesRead); } catch { CleanupAfterAsyncInvocation(); throw; } } private Task GetBytesAsyncReadDataStage(int i, byte[] buffer, int index, int length, int timeout, bool isContinuation, CancellationToken cancellationToken, CancellationToken timeoutToken, out int bytesRead) { _lastColumnWithDataChunkRead = i; TaskCompletionSource source = null; CancellationTokenSource timeoutCancellationSource = null; SetTimeout(_defaultTimeoutMilliseconds); if (!TryGetBytesInternalSequential(i, buffer, index, length, out bytesRead)) { int totalBytesRead = bytesRead; if (!isContinuation) { source = new TaskCompletionSource(); if (Interlocked.CompareExchange(ref _currentTask, source.Task, null) != null) { source.SetException(ADP.ExceptionWithStackTrace(ADP.AsyncOperationPending())); return source.Task; } if (_cancelAsyncOnCloseToken.IsCancellationRequested) { source.SetCanceled(); _currentTask = null; return source.Task; } if (timeout > 0) { timeoutCancellationSource = new CancellationTokenSource(); timeoutCancellationSource.CancelAfter(timeout); timeoutToken = timeoutCancellationSource.Token; } } Func> moreFunc = null; moreFunc = delegate { PrepareForAsyncContinuation(); if (cancellationToken.IsCancellationRequested) { return Task.FromCanceled(cancellationToken); } if (timeoutToken.IsCancellationRequested) { return Task.FromException(ADP.ExceptionWithStackTrace(ADP.IO(SQLMessage.Timeout()))); } SetTimeout(_defaultTimeoutMilliseconds); int bytesRead2; bool num = TryGetBytesInternalSequential(i, buffer, index + totalBytesRead, length - totalBytesRead, out bytesRead2); totalBytesRead += bytesRead2; return num ? Task.FromResult(totalBytesRead) : ContinueRetryable(moreFunc); }; Task task = ContinueRetryable(moreFunc); if (isContinuation) { return task; } task.ContinueWith(delegate(Task t) { CompleteRetryable(t, source, timeoutCancellationSource); }, TaskScheduler.Default); return source.Task; } if (!isContinuation) { CleanupAfterAsyncInvocation(); } return null; } public override Task ReadAsync(CancellationToken cancellationToken) { if (IsClosed) { return Task.FromException(ADP.ExceptionWithStackTrace(ADP.DataReaderClosed("ReadAsync"))); } if (cancellationToken.IsCancellationRequested) { return Task.FromCanceled(cancellationToken); } if (_currentTask != null) { return Task.FromException(ADP.ExceptionWithStackTrace(SQL.PendingBeginXXXExists())); } bool rowTokenRead = false; bool more = false; try { if (!_haltRead && (!_sharedState._dataReady || WillHaveEnoughData(_metaData.Length - 1))) { if (_sharedState._dataReady) { CleanPartialReadReliable(); } if (_stateObj.IsRowTokenReady()) { TryReadInternal(setTimeout: true, out more); rowTokenRead = true; if (!more) { return ADP.FalseTask; } if (IsCommandBehavior(CommandBehavior.SequentialAccess)) { return ADP.TrueTask; } if (WillHaveEnoughData(_metaData.Length - 1)) { TryReadColumn(_metaData.Length - 1, setTimeout: true); return ADP.TrueTask; } } } } catch (Exception ex) { if (!ADP.IsCatchableExceptionType(ex)) { throw; } return Task.FromException(ex); } TaskCompletionSource taskCompletionSource = new TaskCompletionSource(); if (Interlocked.CompareExchange(ref _currentTask, taskCompletionSource.Task, null) != null) { taskCompletionSource.SetException(ADP.ExceptionWithStackTrace(SQL.PendingBeginXXXExists())); return taskCompletionSource.Task; } if (_cancelAsyncOnCloseToken.IsCancellationRequested) { taskCompletionSource.SetCanceled(); _currentTask = null; return taskCompletionSource.Task; } IDisposable objectToDispose = null; if (cancellationToken.CanBeCanceled) { objectToDispose = cancellationToken.Register(delegate(object s) { ((SqlCommand)s).CancelIgnoreFailure(); }, _command); } PrepareAsyncInvocation(useSnapshot: true); Func> moreFunc = null; moreFunc = delegate(Task t) { if (t != null) { PrepareForAsyncContinuation(); } if (rowTokenRead || TryReadInternal(setTimeout: true, out more)) { if (!more || (_commandBehavior & CommandBehavior.SequentialAccess) == CommandBehavior.SequentialAccess) { if (!more) { return ADP.FalseTask; } return ADP.TrueTask; } if (!rowTokenRead) { rowTokenRead = true; _snapshot = null; PrepareAsyncInvocation(useSnapshot: true); } if (TryReadColumn(_metaData.Length - 1, setTimeout: true)) { return ADP.TrueTask; } } return ContinueRetryable(moreFunc); }; return InvokeRetryable(moreFunc, taskCompletionSource, objectToDispose); } public override Task IsDBNullAsync(int i, CancellationToken cancellationToken) { try { CheckHeaderIsReady(i, permitAsync: false, "IsDBNullAsync"); } catch (Exception ex) { if (!ADP.IsCatchableExceptionType(ex)) { throw; } return Task.FromException(ex); } if (_sharedState._nextColumnHeaderToRead > i && !cancellationToken.IsCancellationRequested && _currentTask == null) { SqlBuffer[] data = _data; if (data != null) { if (!data[i].IsNull) { return ADP.FalseTask; } return ADP.TrueTask; } return Task.FromException(ADP.ExceptionWithStackTrace(ADP.DataReaderClosed("IsDBNullAsync"))); } if (_currentTask != null) { return Task.FromException(ADP.ExceptionWithStackTrace(ADP.AsyncOperationPending())); } if (cancellationToken.IsCancellationRequested) { return Task.FromCanceled(cancellationToken); } try { if (WillHaveEnoughData(i, headerOnly: true)) { ReadColumnHeader(i); return _data[i].IsNull ? ADP.TrueTask : ADP.FalseTask; } } catch (Exception ex2) { if (!ADP.IsCatchableExceptionType(ex2)) { throw; } return Task.FromException(ex2); } TaskCompletionSource taskCompletionSource = new TaskCompletionSource(); if (Interlocked.CompareExchange(ref _currentTask, taskCompletionSource.Task, null) != null) { taskCompletionSource.SetException(ADP.ExceptionWithStackTrace(ADP.AsyncOperationPending())); return taskCompletionSource.Task; } if (_cancelAsyncOnCloseToken.IsCancellationRequested) { taskCompletionSource.SetCanceled(); _currentTask = null; return taskCompletionSource.Task; } IDisposable objectToDispose = null; if (cancellationToken.CanBeCanceled) { objectToDispose = cancellationToken.Register(delegate(object s) { ((SqlCommand)s).CancelIgnoreFailure(); }, _command); } PrepareAsyncInvocation(useSnapshot: true); Func> moreFunc = null; moreFunc = delegate(Task t) { if (t != null) { PrepareForAsyncContinuation(); } return TryReadColumnHeader(i) ? ((!_data[i].IsNull) ? ADP.FalseTask : ADP.TrueTask) : ContinueRetryable(moreFunc); }; return InvokeRetryable(moreFunc, taskCompletionSource, objectToDispose); } public override Task GetFieldValueAsync(int i, CancellationToken cancellationToken) { try { CheckDataIsReady(i, allowPartiallyReadColumn: false, permitAsync: false, "GetFieldValueAsync"); if (!IsCommandBehavior(CommandBehavior.SequentialAccess) && _sharedState._nextColumnDataToRead > i && !cancellationToken.IsCancellationRequested && _currentTask == null) { SqlBuffer[] data = _data; _SqlMetaDataSet metaData = _metaData; if (data != null && metaData != null) { return Task.FromResult(GetFieldValueFromSqlBufferInternal(data[i], metaData[i])); } return Task.FromException(ADP.ExceptionWithStackTrace(ADP.DataReaderClosed("GetFieldValueAsync"))); } } catch (Exception ex) { if (!ADP.IsCatchableExceptionType(ex)) { throw; } return Task.FromException(ex); } if (_currentTask != null) { return Task.FromException(ADP.ExceptionWithStackTrace(ADP.AsyncOperationPending())); } if (cancellationToken.IsCancellationRequested) { return Task.FromCanceled(cancellationToken); } try { if (WillHaveEnoughData(i)) { return Task.FromResult(GetFieldValueInternal(i)); } } catch (Exception ex2) { if (!ADP.IsCatchableExceptionType(ex2)) { throw; } return Task.FromException(ex2); } TaskCompletionSource taskCompletionSource = new TaskCompletionSource(); if (Interlocked.CompareExchange(ref _currentTask, taskCompletionSource.Task, null) != null) { taskCompletionSource.SetException(ADP.ExceptionWithStackTrace(ADP.AsyncOperationPending())); return taskCompletionSource.Task; } if (_cancelAsyncOnCloseToken.IsCancellationRequested) { taskCompletionSource.SetCanceled(); _currentTask = null; return taskCompletionSource.Task; } IDisposable objectToDispose = null; if (cancellationToken.CanBeCanceled) { objectToDispose = cancellationToken.Register(delegate(object s) { ((SqlCommand)s).CancelIgnoreFailure(); }, _command); } PrepareAsyncInvocation(useSnapshot: true); Func> moreFunc = null; moreFunc = delegate(Task t) { if (t != null) { PrepareForAsyncContinuation(); } return TryReadColumn(i, setTimeout: false) ? Task.FromResult(GetFieldValueFromSqlBufferInternal(_data[i], _metaData[i])) : ContinueRetryable(moreFunc); }; return InvokeRetryable(moreFunc, taskCompletionSource, objectToDispose); } private Task ContinueRetryable(Func> moreFunc) { TaskCompletionSource networkPacketTaskSource = _stateObj._networkPacketTaskSource; if (_cancelAsyncOnCloseToken.IsCancellationRequested || networkPacketTaskSource == null) { return Task.FromException(ADP.ExceptionWithStackTrace(ADP.ClosedConnectionError())); } return networkPacketTaskSource.Task.ContinueWith(delegate(Task retryTask) { if (retryTask.IsFaulted) { return Task.FromException(retryTask.Exception.InnerException); } if (!_cancelAsyncOnCloseToken.IsCancellationRequested) { TdsParserStateObject stateObj = _stateObj; if (stateObj != null) { lock (stateObj) { if (_stateObj != null) { if (retryTask.IsCanceled) { if (_parser != null) { _parser.State = TdsParserState.Broken; _parser.Connection.BreakConnection(); _parser.ThrowExceptionAndWarning(_stateObj); } } else if (!IsClosed) { try { return moreFunc(retryTask); } catch (Exception) { CleanupAfterAsyncInvocation(); throw; } } } } } } return Task.FromException(ADP.ExceptionWithStackTrace(ADP.ClosedConnectionError())); }, TaskScheduler.Default).Unwrap(); } private Task InvokeRetryable(Func> moreFunc, TaskCompletionSource source, IDisposable objectToDispose = null) { try { Task task; try { task = moreFunc(null); } catch (Exception exception) { task = Task.FromException(exception); } if (task.IsCompleted) { CompleteRetryable(task, source, objectToDispose); } else { task.ContinueWith(delegate(Task t) { CompleteRetryable(t, source, objectToDispose); }, TaskScheduler.Default); } } catch (AggregateException ex) { source.TrySetException(ex.InnerException); } catch (Exception exception2) { source.TrySetException(exception2); } return source.Task; } private void CompleteRetryable(Task task, TaskCompletionSource source, IDisposable objectToDispose) { objectToDispose?.Dispose(); bool ignoreCloseToken = _stateObj?._syncOverAsync ?? false; CleanupAfterAsyncInvocation(ignoreCloseToken); Interlocked.CompareExchange(ref _currentTask, null, source.Task); if (task.IsFaulted) { Exception innerException = task.Exception.InnerException; source.TrySetException(innerException); } else if (task.IsCanceled) { source.TrySetCanceled(); } else { source.TrySetResult(task.Result); } } private void PrepareAsyncInvocation(bool useSnapshot) { if (useSnapshot) { if (_snapshot == null) { _snapshot = new Snapshot { _dataReady = _sharedState._dataReady, _haltRead = _haltRead, _metaDataConsumed = _metaDataConsumed, _browseModeInfoConsumed = _browseModeInfoConsumed, _hasRows = _hasRows, _altRowStatus = _altRowStatus, _nextColumnDataToRead = _sharedState._nextColumnDataToRead, _nextColumnHeaderToRead = _sharedState._nextColumnHeaderToRead, _columnDataBytesRead = _columnDataBytesRead, _columnDataBytesRemaining = _sharedState._columnDataBytesRemaining, _metadata = _metaData, _altMetaDataSetCollection = _altMetaDataSetCollection, _tableNames = _tableNames, _currentStream = _currentStream, _currentTextReader = _currentTextReader }; _stateObj.SetSnapshot(); } } else { _stateObj._asyncReadWithoutSnapshot = true; } _stateObj._syncOverAsync = false; _stateObj._executionContext = ExecutionContext.Capture(); } private void CleanupAfterAsyncInvocation(bool ignoreCloseToken = false) { TdsParserStateObject stateObj = _stateObj; if (stateObj == null || (!ignoreCloseToken && _cancelAsyncOnCloseToken.IsCancellationRequested && !stateObj._asyncReadWithoutSnapshot)) { return; } lock (stateObj) { if (_stateObj != null) { CleanupAfterAsyncInvocationInternal(_stateObj); } } } private void CleanupAfterAsyncInvocationInternal(TdsParserStateObject stateObj, bool resetNetworkPacketTaskSource = true) { if (resetNetworkPacketTaskSource) { stateObj._networkPacketTaskSource = null; } stateObj.ResetSnapshot(); stateObj._syncOverAsync = true; stateObj._executionContext = null; stateObj._asyncReadWithoutSnapshot = false; _snapshot = null; } private void PrepareForAsyncContinuation() { if (_snapshot != null) { _sharedState._dataReady = _snapshot._dataReady; _haltRead = _snapshot._haltRead; _metaDataConsumed = _snapshot._metaDataConsumed; _browseModeInfoConsumed = _snapshot._browseModeInfoConsumed; _hasRows = _snapshot._hasRows; _altRowStatus = _snapshot._altRowStatus; _sharedState._nextColumnDataToRead = _snapshot._nextColumnDataToRead; _sharedState._nextColumnHeaderToRead = _snapshot._nextColumnHeaderToRead; _columnDataBytesRead = _snapshot._columnDataBytesRead; _sharedState._columnDataBytesRemaining = _snapshot._columnDataBytesRemaining; _metaData = _snapshot._metadata; _altMetaDataSetCollection = _snapshot._altMetaDataSetCollection; _tableNames = _snapshot._tableNames; _currentStream = _snapshot._currentStream; _currentTextReader = _snapshot._currentTextReader; _stateObj.PrepareReplaySnapshot(); } _stateObj._executionContext = ExecutionContext.Capture(); } private void SwitchToAsyncWithoutSnapshot() { _snapshot = null; _stateObj.ResetSnapshot(); _stateObj._asyncReadWithoutSnapshot = true; } private Exception UdtNotSupportedException() { return SQL.UnsupportedFeatureAndToken(_parser.Connection, SqlDbType.Udt.ToString()); } public ReadOnlyCollection GetColumnSchema() { SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); if ((_metaData == null || _metaData.dbColumnSchema == null) && MetaData != null) { _metaData.dbColumnSchema = BuildColumnSchema(); } if (_metaData != null) { return _metaData.dbColumnSchema; } return s_emptySchema; } finally { SqlStatistics.StopTimer(statistics); } } private ReadOnlyCollection BuildColumnSchema() { _SqlMetaDataSet metaData = MetaData; DbColumn[] array = new DbColumn[metaData.Length]; for (int i = 0; i < metaData.Length; i++) { _SqlMetaData sqlMetaData = metaData[i]; SqlDbColumn sqlDbColumn = new SqlDbColumn(metaData[i]); if (_typeSystem <= SqlConnectionString.TypeSystem.SQLServer2005 && sqlMetaData.IsNewKatmaiDateTimeType) { sqlDbColumn.SqlNumericScale = MetaType.MetaNVarChar.Scale; } else if (byte.MaxValue != sqlMetaData.scale) { sqlDbColumn.SqlNumericScale = sqlMetaData.scale; } else { sqlDbColumn.SqlNumericScale = sqlMetaData.metaType.Scale; } if (_browseModeInfoConsumed) { sqlDbColumn.SqlIsAliased = sqlMetaData.isDifferentName; sqlDbColumn.SqlIsKey = sqlMetaData.isKey; sqlDbColumn.SqlIsHidden = sqlMetaData.isHidden; sqlDbColumn.SqlIsExpression = sqlMetaData.isExpression; } sqlDbColumn.SqlDataType = GetFieldTypeInternal(sqlMetaData); sqlDbColumn.SqlDataTypeName = GetDataTypeNameInternal(sqlMetaData); array[i] = sqlDbColumn; } return new ReadOnlyCollection(array); } internal SqlDataReader() { ThrowStub.ThrowNotSupportedException(); } } internal class SqlDbColumn : DbColumn { private readonly _SqlMetaData _metadata; internal bool? SqlIsAliased { set { base.IsAliased = value; } } internal bool? SqlIsKey { set { base.IsKey = value; } } internal bool? SqlIsHidden { set { base.IsHidden = value; } } internal bool? SqlIsExpression { set { base.IsExpression = value; } } internal Type SqlDataType { set { base.DataType = value; } } internal string SqlDataTypeName { set { base.DataTypeName = value; } } internal int? SqlNumericScale { set { base.NumericScale = value; } } internal SqlDbColumn(_SqlMetaData md) { _metadata = md; Populate(); } private void Populate() { base.AllowDBNull = _metadata.isNullable; base.BaseCatalogName = _metadata.catalogName; base.BaseColumnName = _metadata.baseColumn; base.BaseSchemaName = _metadata.schemaName; base.BaseServerName = _metadata.serverName; base.BaseTableName = _metadata.tableName; base.ColumnName = _metadata.column; base.ColumnOrdinal = _metadata.ordinal; base.ColumnSize = ((_metadata.metaType.IsSizeInCharacters && _metadata.length != int.MaxValue) ? (_metadata.length / 2) : _metadata.length); base.IsAutoIncrement = _metadata.isIdentity; base.IsIdentity = _metadata.isIdentity; base.IsLong = _metadata.metaType.IsLong; if (SqlDbType.Timestamp == _metadata.type) { base.IsUnique = true; } else { base.IsUnique = false; } if (byte.MaxValue != _metadata.precision) { base.NumericPrecision = _metadata.precision; } else { base.NumericPrecision = _metadata.metaType.Precision; } base.IsReadOnly = _metadata.updatability == 0; base.UdtAssemblyQualifiedName = _metadata.udtAssemblyQualifiedName; } } internal sealed class SqlDelegatedTransaction : IPromotableSinglePhaseNotification, ITransactionPromoter { private static int _objectTypeCount; private readonly int _objectID = Interlocked.Increment(ref _objectTypeCount); private const int _globalTransactionsTokenVersionSizeInBytes = 4; private SqlInternalConnection _connection; private IsolationLevel _isolationLevel; private SqlInternalTransaction _internalTransaction; private Transaction _atomicTransaction; private bool _active; internal int ObjectID => _objectID; internal Transaction Transaction => _atomicTransaction; internal bool IsActive => _active; internal SqlDelegatedTransaction(SqlInternalConnection connection, Transaction tx) { _connection = connection; _atomicTransaction = tx; _active = false; System.Transactions.IsolationLevel isolationLevel = tx.IsolationLevel; switch (isolationLevel) { case System.Transactions.IsolationLevel.ReadCommitted: _isolationLevel = IsolationLevel.ReadCommitted; break; case System.Transactions.IsolationLevel.ReadUncommitted: _isolationLevel = IsolationLevel.ReadUncommitted; break; case System.Transactions.IsolationLevel.RepeatableRead: _isolationLevel = IsolationLevel.RepeatableRead; break; case System.Transactions.IsolationLevel.Serializable: _isolationLevel = IsolationLevel.Serializable; break; case System.Transactions.IsolationLevel.Snapshot: _isolationLevel = IsolationLevel.Snapshot; break; default: throw SQL.UnknownSysTxIsolationLevel(isolationLevel); } } public void Initialize() { SqlInternalConnection connection = _connection; SqlConnection connection2 = connection.Connection; RuntimeHelpers.PrepareConstrainedRegions(); try { if (connection.IsEnlistedInTransaction) { connection.EnlistNull(); } _internalTransaction = new SqlInternalTransaction(connection, TransactionType.Delegated, null); connection.ExecuteTransaction(SqlInternalConnection.TransactionRequest.Begin, null, _isolationLevel, _internalTransaction, isDelegateControlRequest: true); if (connection.CurrentTransaction == null) { connection.DoomThisConnection(); throw ADP.InternalError(ADP.InternalErrorCode.UnknownTransactionFailure); } _active = true; } catch (OutOfMemoryException e) { connection2.Abort(e); throw; } catch (StackOverflowException e2) { connection2.Abort(e2); throw; } catch (ThreadAbortException e3) { connection2.Abort(e3); throw; } } public byte[] Promote() { SqlInternalConnection validConnection = GetValidConnection(); byte[] result = null; SqlConnection connection = validConnection.Connection; RuntimeHelpers.PrepareConstrainedRegions(); Exception ex; try { lock (validConnection) { try { ValidateActiveOnConnection(validConnection); validConnection.ExecuteTransaction(SqlInternalConnection.TransactionRequest.Promote, null, IsolationLevel.Unspecified, _internalTransaction, isDelegateControlRequest: true); result = _connection.PromotedDTCToken; if (_connection.IsGlobalTransaction) { if (SysTxForGlobalTransactions.SetDistributedTransactionIdentifier == null) { throw SQL.UnsupportedSysTxForGlobalTransactions(); } if (!_connection.IsGlobalTransactionsEnabledForServer) { throw SQL.GlobalTransactionsNotEnabled(); } SysTxForGlobalTransactions.SetDistributedTransactionIdentifier.Invoke(_atomicTransaction, new object[2] { this, GetGlobalTxnIdentifierFromToken() }); } ex = null; } catch (SqlException ex2) { ex = ex2; validConnection.DoomThisConnection(); } catch (InvalidOperationException ex3) { ex = ex3; validConnection.DoomThisConnection(); } } } catch (OutOfMemoryException e) { connection.Abort(e); throw; } catch (StackOverflowException e2) { connection.Abort(e2); throw; } catch (ThreadAbortException e3) { connection.Abort(e3); throw; } if (ex != null) { throw SQL.PromotionFailed(ex); } return result; } public void Rollback(SinglePhaseEnlistment enlistment) { SqlInternalConnection validConnection = GetValidConnection(); SqlConnection connection = validConnection.Connection; RuntimeHelpers.PrepareConstrainedRegions(); try { lock (validConnection) { try { ValidateActiveOnConnection(validConnection); _active = false; _connection = null; if (!_internalTransaction.IsAborted) { validConnection.ExecuteTransaction(SqlInternalConnection.TransactionRequest.Rollback, null, IsolationLevel.Unspecified, _internalTransaction, isDelegateControlRequest: true); } } catch (SqlException) { validConnection.DoomThisConnection(); } catch (InvalidOperationException) { validConnection.DoomThisConnection(); } } validConnection.CleanupConnectionOnTransactionCompletion(_atomicTransaction); enlistment.Aborted(); } catch (OutOfMemoryException e) { connection.Abort(e); throw; } catch (StackOverflowException e2) { connection.Abort(e2); throw; } catch (ThreadAbortException e3) { connection.Abort(e3); throw; } } public void SinglePhaseCommit(SinglePhaseEnlistment enlistment) { SqlInternalConnection validConnection = GetValidConnection(); SqlConnection connection = validConnection.Connection; RuntimeHelpers.PrepareConstrainedRegions(); try { if (validConnection.IsConnectionDoomed) { lock (validConnection) { _active = false; _connection = null; } enlistment.Aborted(SQL.ConnectionDoomed()); return; } Exception ex; lock (validConnection) { try { ValidateActiveOnConnection(validConnection); _active = false; _connection = null; validConnection.ExecuteTransaction(SqlInternalConnection.TransactionRequest.Commit, null, IsolationLevel.Unspecified, _internalTransaction, isDelegateControlRequest: true); ex = null; } catch (SqlException ex2) { ex = ex2; validConnection.DoomThisConnection(); } catch (InvalidOperationException ex3) { ex = ex3; validConnection.DoomThisConnection(); } } if (ex != null) { if (_internalTransaction.IsCommitted) { enlistment.Committed(); } else if (_internalTransaction.IsAborted) { enlistment.Aborted(ex); } else { enlistment.InDoubt(ex); } } validConnection.CleanupConnectionOnTransactionCompletion(_atomicTransaction); if (ex == null) { enlistment.Committed(); } } catch (OutOfMemoryException e) { connection.Abort(e); throw; } catch (StackOverflowException e2) { connection.Abort(e2); throw; } catch (ThreadAbortException e3) { connection.Abort(e3); throw; } } internal void TransactionEnded(Transaction transaction) { SqlInternalConnection connection = _connection; if (connection == null) { return; } lock (connection) { if (_atomicTransaction.Equals(transaction)) { _active = false; _connection = null; } } } private SqlInternalConnection GetValidConnection() { SqlInternalConnection connection = _connection; if (connection == null) { throw ADP.ObjectDisposed(this); } return connection; } private void ValidateActiveOnConnection(SqlInternalConnection connection) { if (!_active || connection != _connection || connection.DelegatedTransaction != this) { connection?.DoomThisConnection(); if (connection != _connection && _connection != null) { _connection.DoomThisConnection(); } throw ADP.InternalError(ADP.InternalErrorCode.UnpooledObjectHasWrongOwner); } } private Guid GetGlobalTxnIdentifierFromToken() { byte[] array = new byte[16]; Array.Copy(_connection.PromotedDTCToken, 4, array, 0, array.Length); return new Guid(array); } } public sealed class SqlDependency { internal class IdentityUserNamePair { private DbConnectionPoolIdentity _identity; private string _userName; internal DbConnectionPoolIdentity Identity => _identity; internal string UserName => _userName; internal IdentityUserNamePair(DbConnectionPoolIdentity identity, string userName) { _identity = identity; _userName = userName; } public override bool Equals(object value) { IdentityUserNamePair identityUserNamePair = (IdentityUserNamePair)value; bool result = false; if (identityUserNamePair == null) { result = false; } else if (this == identityUserNamePair) { result = true; } else if (_identity != null) { if (_identity.Equals(identityUserNamePair._identity)) { result = true; } } else if (_userName == identityUserNamePair._userName) { result = true; } return result; } public override int GetHashCode() { int num = 0; if (_identity != null) { return _identity.GetHashCode(); } return _userName.GetHashCode(); } } private class DatabaseServicePair { private string _database; private string _service; internal string Database => _database; internal string Service => _service; internal DatabaseServicePair(string database, string service) { _database = database; _service = service; } public override bool Equals(object value) { DatabaseServicePair databaseServicePair = (DatabaseServicePair)value; bool result = false; if (databaseServicePair == null) { result = false; } else if (this == databaseServicePair) { result = true; } else if (_database == databaseServicePair._database) { result = true; } return result; } public override int GetHashCode() { return _database.GetHashCode(); } } internal class EventContextPair { private OnChangeEventHandler _eventHandler; private ExecutionContext _context; private SqlDependency _dependency; private SqlNotificationEventArgs _args; private static ContextCallback s_contextCallback = InvokeCallback; internal EventContextPair(OnChangeEventHandler eventHandler, SqlDependency dependency) { _eventHandler = eventHandler; _context = ExecutionContext.Capture(); _dependency = dependency; } public override bool Equals(object value) { EventContextPair eventContextPair = (EventContextPair)value; bool result = false; if (eventContextPair == null) { result = false; } else if (this == eventContextPair) { result = true; } else if (_eventHandler == eventContextPair._eventHandler) { result = true; } return result; } public override int GetHashCode() { return _eventHandler.GetHashCode(); } internal void Invoke(SqlNotificationEventArgs args) { _args = args; ExecutionContext.Run(_context, s_contextCallback, this); } private static void InvokeCallback(object eventContextPair) { EventContextPair eventContextPair2 = (EventContextPair)eventContextPair; eventContextPair2._eventHandler(eventContextPair2._dependency, eventContextPair2._args); } } private readonly string _id = Guid.NewGuid().ToString() + ";" + s_appDomainKey; private string _options; private int _timeout; private bool _dependencyFired; private List _eventList = new List(); private object _eventHandlerLock = new object(); private DateTime _expirationTime = DateTime.MaxValue; private List _serverList = new List(); private static object s_startStopLock = new object(); private static readonly string s_appDomainKey = Guid.NewGuid().ToString(); private static Dictionary>> s_serverUserHash = new Dictionary>>(StringComparer.OrdinalIgnoreCase); private static SqlDependencyProcessDispatcher s_processDispatcher = null; private static readonly string s_assemblyName = typeof(SqlDependencyProcessDispatcher).Assembly.FullName; private static readonly string s_typeName = typeof(SqlDependencyProcessDispatcher).FullName; public bool HasChanges => _dependencyFired; public string Id => _id; internal static string AppDomainKey => s_appDomainKey; internal DateTime ExpirationTime => _expirationTime; internal string Options => _options; internal static SqlDependencyProcessDispatcher ProcessDispatcher => s_processDispatcher; internal int Timeout => _timeout; public event OnChangeEventHandler OnChange { add { if (value == null) { return; } SqlNotificationEventArgs sqlNotificationEventArgs = null; lock (_eventHandlerLock) { if (_dependencyFired) { sqlNotificationEventArgs = new SqlNotificationEventArgs(SqlNotificationType.Subscribe, SqlNotificationInfo.AlreadyChanged, SqlNotificationSource.Client); } else { EventContextPair item = new EventContextPair(value, this); if (_eventList.Contains(item)) { throw SQL.SqlDependencyEventNoDuplicate(); } _eventList.Add(item); } } if (sqlNotificationEventArgs != null) { value(this, sqlNotificationEventArgs); } } remove { if (value == null) { return; } EventContextPair item = new EventContextPair(value, this); lock (_eventHandlerLock) { int num = _eventList.IndexOf(item); if (0 <= num) { _eventList.RemoveAt(num); } } } } public SqlDependency() : this(null, null, 0) { } public SqlDependency(SqlCommand command) : this(command, null, 0) { } public SqlDependency(SqlCommand command, string options, int timeout) { if (timeout < 0) { throw SQL.InvalidSqlDependencyTimeout("timeout"); } _timeout = timeout; if (options != null) { _options = options; } AddCommandInternal(command); SqlDependencyPerAppDomainDispatcher.SingletonInstance.AddDependencyEntry(this); } public void AddCommandDependency(SqlCommand command) { if (command == null) { throw ADP.ArgumentNull("command"); } AddCommandInternal(command); } public static bool Start(string connectionString) { return Start(connectionString, null, useDefaults: true); } public static bool Start(string connectionString, string queue) { return Start(connectionString, queue, useDefaults: false); } internal static bool Start(string connectionString, string queue, bool useDefaults) { if (string.IsNullOrEmpty(connectionString)) { if (connectionString == null) { throw ADP.ArgumentNull("connectionString"); } throw ADP.Argument("connectionString"); } if (!useDefaults && string.IsNullOrEmpty(queue)) { useDefaults = true; queue = null; } bool errorOccurred = false; bool result = false; lock (s_startStopLock) { try { if (s_processDispatcher == null) { s_processDispatcher = SqlDependencyProcessDispatcher.SingletonProcessDispatcher; } if (useDefaults) { string server = null; DbConnectionPoolIdentity identity = null; string user = null; string database = null; string service = null; bool appDomainStart = false; RuntimeHelpers.PrepareConstrainedRegions(); try { result = s_processDispatcher.StartWithDefault(connectionString, out server, out identity, out user, out database, ref service, s_appDomainKey, SqlDependencyPerAppDomainDispatcher.SingletonInstance, out errorOccurred, out appDomainStart); } finally { if (appDomainStart && !errorOccurred) { IdentityUserNamePair identityUser = new IdentityUserNamePair(identity, user); DatabaseServicePair databaseService = new DatabaseServicePair(database, service); if (!AddToServerUserHash(server, identityUser, databaseService)) { try { Stop(connectionString, queue, useDefaults, startFailed: true); } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } ADP.TraceExceptionWithoutRethrow(e); } throw SQL.SqlDependencyDuplicateStart(); } } } } else { result = s_processDispatcher.Start(connectionString, queue, s_appDomainKey, SqlDependencyPerAppDomainDispatcher.SingletonInstance); } } catch (Exception e2) { if (!ADP.IsCatchableExceptionType(e2)) { throw; } ADP.TraceExceptionWithoutRethrow(e2); throw; } } return result; } public static bool Stop(string connectionString) { return Stop(connectionString, null, useDefaults: true, startFailed: false); } public static bool Stop(string connectionString, string queue) { return Stop(connectionString, queue, useDefaults: false, startFailed: false); } internal static bool Stop(string connectionString, string queue, bool useDefaults, bool startFailed) { if (string.IsNullOrEmpty(connectionString)) { if (connectionString == null) { throw ADP.ArgumentNull("connectionString"); } throw ADP.Argument("connectionString"); } if (!useDefaults && string.IsNullOrEmpty(queue)) { useDefaults = true; queue = null; } bool result = false; lock (s_startStopLock) { if (s_processDispatcher != null) { try { string server = null; DbConnectionPoolIdentity identity = null; string user = null; string database = null; string queueService = null; if (useDefaults) { bool appDomainStop = false; RuntimeHelpers.PrepareConstrainedRegions(); try { result = s_processDispatcher.Stop(connectionString, out server, out identity, out user, out database, ref queueService, s_appDomainKey, out appDomainStop); } finally { if (appDomainStop && !startFailed) { IdentityUserNamePair identityUser = new IdentityUserNamePair(identity, user); DatabaseServicePair databaseService = new DatabaseServicePair(database, queueService); RemoveFromServerUserHash(server, identityUser, databaseService); } } } else { result = s_processDispatcher.Stop(connectionString, out server, out identity, out user, out database, ref queue, s_appDomainKey, out var _); } } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } ADP.TraceExceptionWithoutRethrow(e); } } } return result; } private static bool AddToServerUserHash(string server, IdentityUserNamePair identityUser, DatabaseServicePair databaseService) { bool result = false; lock (s_serverUserHash) { Dictionary> dictionary; if (!s_serverUserHash.ContainsKey(server)) { dictionary = new Dictionary>(); s_serverUserHash.Add(server, dictionary); } else { dictionary = s_serverUserHash[server]; } List list; if (!dictionary.ContainsKey(identityUser)) { list = new List(); dictionary.Add(identityUser, list); } else { list = dictionary[identityUser]; } if (!list.Contains(databaseService)) { list.Add(databaseService); result = true; } } return result; } private static void RemoveFromServerUserHash(string server, IdentityUserNamePair identityUser, DatabaseServicePair databaseService) { lock (s_serverUserHash) { if (!s_serverUserHash.ContainsKey(server)) { return; } Dictionary> dictionary = s_serverUserHash[server]; if (!dictionary.ContainsKey(identityUser)) { return; } List list = dictionary[identityUser]; int num = list.IndexOf(databaseService); if (num < 0) { return; } list.RemoveAt(num); if (list.Count == 0) { dictionary.Remove(identityUser); if (dictionary.Count == 0) { s_serverUserHash.Remove(server); } } } } internal static string GetDefaultComposedOptions(string server, string failoverServer, IdentityUserNamePair identityUser, string database) { lock (s_serverUserHash) { if (!s_serverUserHash.ContainsKey(server)) { if (s_serverUserHash.Count == 0) { throw SQL.SqlDepDefaultOptionsButNoStart(); } if (string.IsNullOrEmpty(failoverServer) || !s_serverUserHash.ContainsKey(failoverServer)) { throw SQL.SqlDependencyNoMatchingServerStart(); } server = failoverServer; } Dictionary> dictionary = s_serverUserHash[server]; List list = null; if (!dictionary.ContainsKey(identityUser)) { if (dictionary.Count > 1) { throw SQL.SqlDependencyNoMatchingServerStart(); } using Dictionary>.Enumerator enumerator = dictionary.GetEnumerator(); if (enumerator.MoveNext()) { list = enumerator.Current.Value; } } else { list = dictionary[identityUser]; } DatabaseServicePair item = new DatabaseServicePair(database, null); DatabaseServicePair databaseServicePair = null; int num = list.IndexOf(item); if (num != -1) { databaseServicePair = list[num]; } if (databaseServicePair != null) { database = FixupServiceOrDatabaseName(databaseServicePair.Database); string text = FixupServiceOrDatabaseName(databaseServicePair.Service); return "Service=" + text + ";Local Database=" + database; } if (list.Count == 1) { databaseServicePair = list.ToArray()[0]; string text2 = FixupServiceOrDatabaseName(databaseServicePair.Database); string text3 = FixupServiceOrDatabaseName(databaseServicePair.Service); return "Service=" + text3 + ";Local Database=" + text2; } throw SQL.SqlDependencyNoMatchingServerDatabaseStart(); } } internal void AddToServerList(string server) { lock (_serverList) { int num = _serverList.BinarySearch(server, StringComparer.OrdinalIgnoreCase); if (0 > num) { num = ~num; _serverList.Insert(num, server); } } } internal bool ContainsServer(string server) { lock (_serverList) { return _serverList.Contains(server); } } internal string ComputeHashAndAddToDispatcher(SqlCommand command) { string commandHash = ComputeCommandHash(command.Connection.ConnectionString, command); return SqlDependencyPerAppDomainDispatcher.SingletonInstance.AddCommandEntry(commandHash, this); } internal void Invalidate(SqlNotificationType type, SqlNotificationInfo info, SqlNotificationSource source) { List list = null; lock (_eventHandlerLock) { if (_dependencyFired && SqlNotificationInfo.AlreadyChanged != info && SqlNotificationSource.Client != source) { if (!(ExpirationTime >= DateTime.UtcNow)) { } } else { _dependencyFired = true; list = _eventList; _eventList = new List(); } } if (list == null) { return; } foreach (EventContextPair item in list) { item.Invoke(new SqlNotificationEventArgs(type, info, source)); } } internal void StartTimer(SqlNotificationRequest notificationRequest) { if (_expirationTime == DateTime.MaxValue) { int num = 432000; if (_timeout != 0) { num = _timeout; } if (notificationRequest != null && notificationRequest.Timeout < num && notificationRequest.Timeout != 0) { num = notificationRequest.Timeout; } _expirationTime = DateTime.UtcNow.AddSeconds(num); SqlDependencyPerAppDomainDispatcher.SingletonInstance.StartTimer(this); } } private void AddCommandInternal(SqlCommand cmd) { if (cmd == null) { return; } _ = cmd.Connection; if (cmd.Notification != null) { if (cmd._sqlDep == null || cmd._sqlDep != this) { throw SQL.SqlCommandHasExistingSqlNotificationRequest(); } return; } bool flag = false; lock (_eventHandlerLock) { if (!_dependencyFired) { cmd.Notification = new SqlNotificationRequest { Timeout = _timeout }; if (_options != null) { cmd.Notification.Options = _options; } cmd._sqlDep = this; } else if (_eventList.Count == 0) { flag = true; } } if (flag) { Invalidate(SqlNotificationType.Subscribe, SqlNotificationInfo.AlreadyChanged, SqlNotificationSource.Client); } } private string ComputeCommandHash(string connectionString, SqlCommand command) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendFormat("{0};{1}", connectionString, command.CommandText); for (int i = 0; i < command.Parameters.Count; i++) { object value = command.Parameters[i].Value; if (value == null || value == DBNull.Value) { stringBuilder.Append("; NULL"); continue; } Type type = value.GetType(); if (type == typeof(byte[])) { stringBuilder.Append(";"); byte[] array = (byte[])value; for (int j = 0; j < array.Length; j++) { stringBuilder.Append(array[j].ToString("x2", CultureInfo.InvariantCulture)); } } else if (type == typeof(char[])) { stringBuilder.Append((char[])value); } else if (type == typeof(XmlReader)) { stringBuilder.Append(";"); stringBuilder.Append(Guid.NewGuid().ToString()); } else { stringBuilder.Append(";"); stringBuilder.Append(value.ToString()); } } return stringBuilder.ToString(); } internal static string FixupServiceOrDatabaseName(string name) { if (!string.IsNullOrEmpty(name)) { return "\"" + name.Replace("\"", "\"\"") + "\""; } return name; } } internal class SqlDependencyPerAppDomainDispatcher : MarshalByRefObject { private sealed class DependencyList : List { public readonly string CommandHash; internal DependencyList(string commandHash) { CommandHash = commandHash; } } internal static readonly SqlDependencyPerAppDomainDispatcher SingletonInstance = new SqlDependencyPerAppDomainDispatcher(); internal object _instanceLock = new object(); private Dictionary _dependencyIdToDependencyHash; private Dictionary _notificationIdToDependenciesHash; private Dictionary _commandHashToNotificationId; private bool _sqlDependencyTimeOutTimerStarted; private DateTime _nextTimeout; private Timer _timeoutTimer; private SqlDependencyPerAppDomainDispatcher() { _dependencyIdToDependencyHash = new Dictionary(); _notificationIdToDependenciesHash = new Dictionary(); _commandHashToNotificationId = new Dictionary(); _timeoutTimer = new Timer(TimeoutTimerCallback, null, -1, -1); SubscribeToAppDomainUnload(); } public override object InitializeLifetimeService() { return null; } internal void AddDependencyEntry(SqlDependency dep) { lock (_instanceLock) { _dependencyIdToDependencyHash.Add(dep.Id, dep); } } internal string AddCommandEntry(string commandHash, SqlDependency dep) { string value = string.Empty; lock (_instanceLock) { if (_dependencyIdToDependencyHash.ContainsKey(dep.Id)) { if (_commandHashToNotificationId.TryGetValue(commandHash, out value)) { DependencyList value2 = null; if (!_notificationIdToDependenciesHash.TryGetValue(value, out value2)) { throw ADP.InternalError(ADP.InternalErrorCode.SqlDependencyCommandHashIsNotAssociatedWithNotification); } if (!value2.Contains(dep)) { value2.Add(dep); } } else { value = string.Format(CultureInfo.InvariantCulture, "{0};{1}", SqlDependency.AppDomainKey, Guid.NewGuid().ToString("D", CultureInfo.InvariantCulture)); DependencyList dependencyList = new DependencyList(commandHash); dependencyList.Add(dep); _commandHashToNotificationId.Add(commandHash, value); _notificationIdToDependenciesHash.Add(value, dependencyList); } } } return value; } internal void InvalidateCommandID(SqlNotification sqlNotification) { List list = null; lock (_instanceLock) { list = LookupCommandEntryWithRemove(sqlNotification.Key); if (list != null) { foreach (SqlDependency item in list) { LookupDependencyEntryWithRemove(item.Id); RemoveDependencyFromCommandToDependenciesHash(item); } } } if (list == null) { return; } foreach (SqlDependency item2 in list) { try { item2.Invalidate(sqlNotification.Type, sqlNotification.Info, sqlNotification.Source); } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } ADP.TraceExceptionWithoutRethrow(e); } } } internal void InvalidateServer(string server, SqlNotification sqlNotification) { List list = new List(); lock (_instanceLock) { foreach (KeyValuePair item in _dependencyIdToDependencyHash) { SqlDependency value = item.Value; if (value.ContainsServer(server)) { list.Add(value); } } foreach (SqlDependency item2 in list) { LookupDependencyEntryWithRemove(item2.Id); RemoveDependencyFromCommandToDependenciesHash(item2); } } foreach (SqlDependency item3 in list) { try { item3.Invalidate(sqlNotification.Type, sqlNotification.Info, sqlNotification.Source); } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } ADP.TraceExceptionWithoutRethrow(e); } } } internal SqlDependency LookupDependencyEntry(string id) { if (id == null) { throw ADP.ArgumentNull("id"); } if (string.IsNullOrEmpty(id)) { throw SQL.SqlDependencyIdMismatch(); } SqlDependency result = null; lock (_instanceLock) { if (_dependencyIdToDependencyHash.ContainsKey(id)) { result = _dependencyIdToDependencyHash[id]; } } return result; } private void LookupDependencyEntryWithRemove(string id) { lock (_instanceLock) { if (_dependencyIdToDependencyHash.ContainsKey(id)) { _dependencyIdToDependencyHash.Remove(id); if (_dependencyIdToDependencyHash.Count == 0) { _timeoutTimer.Change(-1, -1); _sqlDependencyTimeOutTimerStarted = false; } } } } private List LookupCommandEntryWithRemove(string notificationId) { DependencyList value = null; lock (_instanceLock) { if (_notificationIdToDependenciesHash.TryGetValue(notificationId, out value)) { _notificationIdToDependenciesHash.Remove(notificationId); _commandHashToNotificationId.Remove(value.CommandHash); } } return value; } private void RemoveDependencyFromCommandToDependenciesHash(SqlDependency dependency) { lock (_instanceLock) { List list = new List(); List list2 = new List(); foreach (KeyValuePair item in _notificationIdToDependenciesHash) { DependencyList value = item.Value; if (value.Remove(dependency) && value.Count == 0) { list.Add(item.Key); list2.Add(item.Value.CommandHash); } } for (int i = 0; i < list.Count; i++) { _notificationIdToDependenciesHash.Remove(list[i]); _commandHashToNotificationId.Remove(list2[i]); } } } internal void StartTimer(SqlDependency dep) { lock (_instanceLock) { if (!_sqlDependencyTimeOutTimerStarted) { _timeoutTimer.Change(15000, 15000); _nextTimeout = dep.ExpirationTime; _sqlDependencyTimeOutTimerStarted = true; } else if (_nextTimeout > dep.ExpirationTime) { _nextTimeout = dep.ExpirationTime; } } } private static void TimeoutTimerCallback(object state) { SqlDependency[] array; lock (SingletonInstance._instanceLock) { if (SingletonInstance._dependencyIdToDependencyHash.Count == 0 || SingletonInstance._nextTimeout > DateTime.UtcNow) { return; } array = new SqlDependency[SingletonInstance._dependencyIdToDependencyHash.Count]; SingletonInstance._dependencyIdToDependencyHash.Values.CopyTo(array, 0); } DateTime utcNow = DateTime.UtcNow; DateTime dateTime = DateTime.MaxValue; for (int i = 0; i < array.Length; i++) { if (array[i].ExpirationTime <= utcNow) { try { array[i].Invalidate(SqlNotificationType.Change, SqlNotificationInfo.Error, SqlNotificationSource.Timeout); } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } ADP.TraceExceptionWithoutRethrow(e); } } else { if (array[i].ExpirationTime < dateTime) { dateTime = array[i].ExpirationTime; } array[i] = null; } } lock (SingletonInstance._instanceLock) { for (int j = 0; j < array.Length; j++) { if (array[j] != null) { SingletonInstance._dependencyIdToDependencyHash.Remove(array[j].Id); } } if (dateTime < SingletonInstance._nextTimeout) { SingletonInstance._nextTimeout = dateTime; } } } private void SubscribeToAppDomainUnload() { } } internal class SqlNotification : MarshalByRefObject { private readonly SqlNotificationInfo _info; private readonly SqlNotificationSource _source; private readonly SqlNotificationType _type; private readonly string _key; internal SqlNotificationInfo Info => _info; internal string Key => _key; internal SqlNotificationSource Source => _source; internal SqlNotificationType Type => _type; internal SqlNotification(SqlNotificationInfo info, SqlNotificationSource source, SqlNotificationType type, string key) { _info = info; _source = source; _type = type; _key = key; } } internal sealed class MetaType { private static class MetaTypeName { public const string BIGINT = "bigint"; public const string BINARY = "binary"; public const string BIT = "bit"; public const string CHAR = "char"; public const string DATETIME = "datetime"; public const string DECIMAL = "decimal"; public const string FLOAT = "float"; public const string IMAGE = "image"; public const string INT = "int"; public const string MONEY = "money"; public const string NCHAR = "nchar"; public const string NTEXT = "ntext"; public const string NVARCHAR = "nvarchar"; public const string REAL = "real"; public const string ROWGUID = "uniqueidentifier"; public const string SMALLDATETIME = "smalldatetime"; public const string SMALLINT = "smallint"; public const string SMALLMONEY = "smallmoney"; public const string TEXT = "text"; public const string TIMESTAMP = "timestamp"; public const string TINYINT = "tinyint"; public const string UDT = "udt"; public const string VARBINARY = "varbinary"; public const string VARCHAR = "varchar"; public const string VARIANT = "sql_variant"; public const string XML = "xml"; public const string TABLE = "table"; public const string DATE = "date"; public const string TIME = "time"; public const string DATETIME2 = "datetime2"; public const string DATETIMEOFFSET = "datetimeoffset"; } internal readonly Type ClassType; internal readonly Type SqlType; internal readonly int FixedLength; internal readonly bool IsFixed; internal readonly bool IsLong; internal readonly bool IsPlp; internal readonly byte Precision; internal readonly byte Scale; internal readonly byte TDSType; internal readonly byte NullableType; internal readonly string TypeName; internal readonly SqlDbType SqlDbType; internal readonly DbType DbType; internal readonly byte PropBytes; internal readonly bool IsAnsiType; internal readonly bool IsBinType; internal readonly bool IsCharType; internal readonly bool IsNCharType; internal readonly bool IsSizeInCharacters; internal readonly bool IsNewKatmaiType; internal readonly bool IsVarTime; internal readonly bool Is70Supported; internal readonly bool Is80Supported; internal readonly bool Is90Supported; internal readonly bool Is100Supported; private static readonly MetaType s_metaBigInt = new MetaType(19, byte.MaxValue, 8, isFixed: true, isLong: false, isPlp: false, 127, 38, "bigint", typeof(long), typeof(SqlInt64), SqlDbType.BigInt, DbType.Int64, 0); private static readonly MetaType s_metaFloat = new MetaType(15, byte.MaxValue, 8, isFixed: true, isLong: false, isPlp: false, 62, 109, "float", typeof(double), typeof(SqlDouble), SqlDbType.Float, DbType.Double, 0); private static readonly MetaType s_metaReal = new MetaType(7, byte.MaxValue, 4, isFixed: true, isLong: false, isPlp: false, 59, 109, "real", typeof(float), typeof(SqlSingle), SqlDbType.Real, DbType.Single, 0); private static readonly MetaType s_metaBinary = new MetaType(byte.MaxValue, byte.MaxValue, -1, isFixed: false, isLong: false, isPlp: false, 173, 173, "binary", typeof(byte[]), typeof(SqlBinary), SqlDbType.Binary, DbType.Binary, 2); private static readonly MetaType s_metaTimestamp = new MetaType(byte.MaxValue, byte.MaxValue, -1, isFixed: false, isLong: false, isPlp: false, 173, 173, "timestamp", typeof(byte[]), typeof(SqlBinary), SqlDbType.Timestamp, DbType.Binary, 2); internal static readonly MetaType MetaVarBinary = new MetaType(byte.MaxValue, byte.MaxValue, -1, isFixed: false, isLong: false, isPlp: false, 165, 165, "varbinary", typeof(byte[]), typeof(SqlBinary), SqlDbType.VarBinary, DbType.Binary, 2); internal static readonly MetaType MetaMaxVarBinary = new MetaType(byte.MaxValue, byte.MaxValue, -1, isFixed: false, isLong: true, isPlp: true, 165, 165, "varbinary", typeof(byte[]), typeof(SqlBinary), SqlDbType.VarBinary, DbType.Binary, 2); private static readonly MetaType s_metaSmallVarBinary = new MetaType(byte.MaxValue, byte.MaxValue, -1, isFixed: false, isLong: false, isPlp: false, 37, 173, ADP.StrEmpty, typeof(byte[]), typeof(SqlBinary), (SqlDbType)24, DbType.Binary, 2); internal static readonly MetaType MetaImage = new MetaType(byte.MaxValue, byte.MaxValue, -1, isFixed: false, isLong: true, isPlp: false, 34, 34, "image", typeof(byte[]), typeof(SqlBinary), SqlDbType.Image, DbType.Binary, 0); private static readonly MetaType s_metaBit = new MetaType(byte.MaxValue, byte.MaxValue, 1, isFixed: true, isLong: false, isPlp: false, 50, 104, "bit", typeof(bool), typeof(SqlBoolean), SqlDbType.Bit, DbType.Boolean, 0); private static readonly MetaType s_metaTinyInt = new MetaType(3, byte.MaxValue, 1, isFixed: true, isLong: false, isPlp: false, 48, 38, "tinyint", typeof(byte), typeof(SqlByte), SqlDbType.TinyInt, DbType.Byte, 0); private static readonly MetaType s_metaSmallInt = new MetaType(5, byte.MaxValue, 2, isFixed: true, isLong: false, isPlp: false, 52, 38, "smallint", typeof(short), typeof(SqlInt16), SqlDbType.SmallInt, DbType.Int16, 0); private static readonly MetaType s_metaInt = new MetaType(10, byte.MaxValue, 4, isFixed: true, isLong: false, isPlp: false, 56, 38, "int", typeof(int), typeof(SqlInt32), SqlDbType.Int, DbType.Int32, 0); private static readonly MetaType s_metaChar = new MetaType(byte.MaxValue, byte.MaxValue, -1, isFixed: false, isLong: false, isPlp: false, 175, 175, "char", typeof(string), typeof(SqlString), SqlDbType.Char, DbType.AnsiStringFixedLength, 7); private static readonly MetaType s_metaVarChar = new MetaType(byte.MaxValue, byte.MaxValue, -1, isFixed: false, isLong: false, isPlp: false, 167, 167, "varchar", typeof(string), typeof(SqlString), SqlDbType.VarChar, DbType.AnsiString, 7); internal static readonly MetaType MetaMaxVarChar = new MetaType(byte.MaxValue, byte.MaxValue, -1, isFixed: false, isLong: true, isPlp: true, 167, 167, "varchar", typeof(string), typeof(SqlString), SqlDbType.VarChar, DbType.AnsiString, 7); internal static readonly MetaType MetaText = new MetaType(byte.MaxValue, byte.MaxValue, -1, isFixed: false, isLong: true, isPlp: false, 35, 35, "text", typeof(string), typeof(SqlString), SqlDbType.Text, DbType.AnsiString, 0); private static readonly MetaType s_metaNChar = new MetaType(byte.MaxValue, byte.MaxValue, -1, isFixed: false, isLong: false, isPlp: false, 239, 239, "nchar", typeof(string), typeof(SqlString), SqlDbType.NChar, DbType.StringFixedLength, 7); internal static readonly MetaType MetaNVarChar = new MetaType(byte.MaxValue, byte.MaxValue, -1, isFixed: false, isLong: false, isPlp: false, 231, 231, "nvarchar", typeof(string), typeof(SqlString), SqlDbType.NVarChar, DbType.String, 7); internal static readonly MetaType MetaMaxNVarChar = new MetaType(byte.MaxValue, byte.MaxValue, -1, isFixed: false, isLong: true, isPlp: true, 231, 231, "nvarchar", typeof(string), typeof(SqlString), SqlDbType.NVarChar, DbType.String, 7); internal static readonly MetaType MetaNText = new MetaType(byte.MaxValue, byte.MaxValue, -1, isFixed: false, isLong: true, isPlp: false, 99, 99, "ntext", typeof(string), typeof(SqlString), SqlDbType.NText, DbType.String, 7); internal static readonly MetaType MetaDecimal = new MetaType(38, 4, 17, isFixed: true, isLong: false, isPlp: false, 108, 108, "decimal", typeof(decimal), typeof(SqlDecimal), SqlDbType.Decimal, DbType.Decimal, 2); internal static readonly MetaType MetaXml = new MetaType(byte.MaxValue, byte.MaxValue, -1, isFixed: false, isLong: true, isPlp: true, 241, 241, "xml", typeof(string), typeof(SqlXml), SqlDbType.Xml, DbType.Xml, 0); private static readonly MetaType s_metaDateTime = new MetaType(23, 3, 8, isFixed: true, isLong: false, isPlp: false, 61, 111, "datetime", typeof(DateTime), typeof(SqlDateTime), SqlDbType.DateTime, DbType.DateTime, 0); private static readonly MetaType s_metaSmallDateTime = new MetaType(16, 0, 4, isFixed: true, isLong: false, isPlp: false, 58, 111, "smalldatetime", typeof(DateTime), typeof(SqlDateTime), SqlDbType.SmallDateTime, DbType.DateTime, 0); private static readonly MetaType s_metaMoney = new MetaType(19, byte.MaxValue, 8, isFixed: true, isLong: false, isPlp: false, 60, 110, "money", typeof(decimal), typeof(SqlMoney), SqlDbType.Money, DbType.Currency, 0); private static readonly MetaType s_metaSmallMoney = new MetaType(10, byte.MaxValue, 4, isFixed: true, isLong: false, isPlp: false, 122, 110, "smallmoney", typeof(decimal), typeof(SqlMoney), SqlDbType.SmallMoney, DbType.Currency, 0); private static readonly MetaType s_metaUniqueId = new MetaType(byte.MaxValue, byte.MaxValue, 16, isFixed: true, isLong: false, isPlp: false, 36, 36, "uniqueidentifier", typeof(Guid), typeof(SqlGuid), SqlDbType.UniqueIdentifier, DbType.Guid, 0); private static readonly MetaType s_metaVariant = new MetaType(byte.MaxValue, byte.MaxValue, -1, isFixed: true, isLong: false, isPlp: false, 98, 98, "sql_variant", typeof(object), typeof(object), SqlDbType.Variant, DbType.Object, 0); internal static readonly MetaType MetaUdt = new MetaType(byte.MaxValue, byte.MaxValue, -1, isFixed: false, isLong: false, isPlp: true, 240, 240, "udt", typeof(object), typeof(object), SqlDbType.Udt, DbType.Object, 0); private static readonly MetaType s_metaMaxUdt = new MetaType(byte.MaxValue, byte.MaxValue, -1, isFixed: false, isLong: true, isPlp: true, 240, 240, "udt", typeof(object), typeof(object), SqlDbType.Udt, DbType.Object, 0); private static readonly MetaType s_metaTable = new MetaType(byte.MaxValue, byte.MaxValue, -1, isFixed: false, isLong: false, isPlp: false, 243, 243, "table", typeof(IEnumerable), typeof(IEnumerable), SqlDbType.Structured, DbType.Object, 0); private static readonly MetaType s_metaSUDT = new MetaType(byte.MaxValue, byte.MaxValue, -1, isFixed: false, isLong: false, isPlp: false, 31, 31, "", typeof(SqlDataRecord), typeof(SqlDataRecord), SqlDbType.Structured, DbType.Object, 0); private static readonly MetaType s_metaDate = new MetaType(byte.MaxValue, byte.MaxValue, 3, isFixed: true, isLong: false, isPlp: false, 40, 40, "date", typeof(DateTime), typeof(DateTime), SqlDbType.Date, DbType.Date, 0); internal static readonly MetaType MetaTime = new MetaType(byte.MaxValue, 7, -1, isFixed: false, isLong: false, isPlp: false, 41, 41, "time", typeof(TimeSpan), typeof(TimeSpan), SqlDbType.Time, DbType.Time, 1); private static readonly MetaType s_metaDateTime2 = new MetaType(byte.MaxValue, 7, -1, isFixed: false, isLong: false, isPlp: false, 42, 42, "datetime2", typeof(DateTime), typeof(DateTime), SqlDbType.DateTime2, DbType.DateTime2, 1); internal static readonly MetaType MetaDateTimeOffset = new MetaType(byte.MaxValue, 7, -1, isFixed: false, isLong: false, isPlp: false, 43, 43, "datetimeoffset", typeof(DateTimeOffset), typeof(DateTimeOffset), SqlDbType.DateTimeOffset, DbType.DateTimeOffset, 1); public int TypeId => 0; public MetaType(byte precision, byte scale, int fixedLength, bool isFixed, bool isLong, bool isPlp, byte tdsType, byte nullableTdsType, string typeName, Type classType, Type sqlType, SqlDbType sqldbType, DbType dbType, byte propBytes) { Precision = precision; Scale = scale; FixedLength = fixedLength; IsFixed = isFixed; IsLong = isLong; IsPlp = isPlp; TDSType = tdsType; NullableType = nullableTdsType; TypeName = typeName; SqlDbType = sqldbType; DbType = dbType; ClassType = classType; SqlType = sqlType; PropBytes = propBytes; IsAnsiType = _IsAnsiType(sqldbType); IsBinType = _IsBinType(sqldbType); IsCharType = _IsCharType(sqldbType); IsNCharType = _IsNCharType(sqldbType); IsSizeInCharacters = _IsSizeInCharacters(sqldbType); IsNewKatmaiType = _IsNewKatmaiType(sqldbType); IsVarTime = _IsVarTime(sqldbType); Is70Supported = _Is70Supported(SqlDbType); Is80Supported = _Is80Supported(SqlDbType); Is90Supported = _Is90Supported(SqlDbType); Is100Supported = _Is100Supported(SqlDbType); } private static bool _IsAnsiType(SqlDbType type) { if (type != SqlDbType.Char && type != SqlDbType.VarChar) { return type == SqlDbType.Text; } return true; } private static bool _IsSizeInCharacters(SqlDbType type) { if (type != SqlDbType.NChar && type != SqlDbType.NVarChar && type != SqlDbType.Xml) { return type == SqlDbType.NText; } return true; } private static bool _IsCharType(SqlDbType type) { if (type != SqlDbType.NChar && type != SqlDbType.NVarChar && type != SqlDbType.NText && type != SqlDbType.Char && type != SqlDbType.VarChar && type != SqlDbType.Text) { return type == SqlDbType.Xml; } return true; } private static bool _IsNCharType(SqlDbType type) { if (type != SqlDbType.NChar && type != SqlDbType.NVarChar && type != SqlDbType.NText) { return type == SqlDbType.Xml; } return true; } private static bool _IsBinType(SqlDbType type) { if (type != SqlDbType.Image && type != SqlDbType.Binary && type != SqlDbType.VarBinary && type != SqlDbType.Timestamp && type != SqlDbType.Udt) { return type == (SqlDbType)24; } return true; } private static bool _Is70Supported(SqlDbType type) { if (type != 0 && type > SqlDbType.BigInt) { return type <= SqlDbType.VarChar; } return false; } private static bool _Is80Supported(SqlDbType type) { if (type >= SqlDbType.BigInt) { return type <= SqlDbType.Variant; } return false; } private static bool _Is90Supported(SqlDbType type) { if (!_Is80Supported(type) && SqlDbType.Xml != type) { return SqlDbType.Udt == type; } return true; } private static bool _Is100Supported(SqlDbType type) { if (!_Is90Supported(type) && SqlDbType.Date != type && SqlDbType.Time != type && SqlDbType.DateTime2 != type) { return SqlDbType.DateTimeOffset == type; } return true; } private static bool _IsNewKatmaiType(SqlDbType type) { return SqlDbType.Structured == type; } internal static bool _IsVarTime(SqlDbType type) { if (type != SqlDbType.Time && type != SqlDbType.DateTime2) { return type == SqlDbType.DateTimeOffset; } return true; } internal static MetaType GetMetaTypeFromSqlDbType(SqlDbType target, bool isMultiValued) { switch (target) { case SqlDbType.BigInt: return s_metaBigInt; case SqlDbType.Binary: return s_metaBinary; case SqlDbType.Bit: return s_metaBit; case SqlDbType.Char: return s_metaChar; case SqlDbType.DateTime: return s_metaDateTime; case SqlDbType.Decimal: return MetaDecimal; case SqlDbType.Float: return s_metaFloat; case SqlDbType.Image: return MetaImage; case SqlDbType.Int: return s_metaInt; case SqlDbType.Money: return s_metaMoney; case SqlDbType.NChar: return s_metaNChar; case SqlDbType.NText: return MetaNText; case SqlDbType.NVarChar: return MetaNVarChar; case SqlDbType.Real: return s_metaReal; case SqlDbType.UniqueIdentifier: return s_metaUniqueId; case SqlDbType.SmallDateTime: return s_metaSmallDateTime; case SqlDbType.SmallInt: return s_metaSmallInt; case SqlDbType.SmallMoney: return s_metaSmallMoney; case SqlDbType.Text: return MetaText; case SqlDbType.Timestamp: return s_metaTimestamp; case SqlDbType.TinyInt: return s_metaTinyInt; case SqlDbType.VarBinary: return MetaVarBinary; case SqlDbType.VarChar: return s_metaVarChar; case SqlDbType.Variant: return s_metaVariant; case (SqlDbType)24: return s_metaSmallVarBinary; case SqlDbType.Xml: return MetaXml; case SqlDbType.Udt: return MetaUdt; case SqlDbType.Structured: if (isMultiValued) { return s_metaTable; } return s_metaSUDT; case SqlDbType.Date: return s_metaDate; case SqlDbType.Time: return MetaTime; case SqlDbType.DateTime2: return s_metaDateTime2; case SqlDbType.DateTimeOffset: return MetaDateTimeOffset; default: throw SQL.InvalidSqlDbType(target); } } internal static MetaType GetMetaTypeFromDbType(DbType target) { switch (target) { case DbType.AnsiString: return s_metaVarChar; case DbType.AnsiStringFixedLength: return s_metaChar; case DbType.Binary: return MetaVarBinary; case DbType.Byte: return s_metaTinyInt; case DbType.Boolean: return s_metaBit; case DbType.Currency: return s_metaMoney; case DbType.Date: case DbType.DateTime: return s_metaDateTime; case DbType.Decimal: return MetaDecimal; case DbType.Double: return s_metaFloat; case DbType.Guid: return s_metaUniqueId; case DbType.Int16: return s_metaSmallInt; case DbType.Int32: return s_metaInt; case DbType.Int64: return s_metaBigInt; case DbType.Object: return s_metaVariant; case DbType.Single: return s_metaReal; case DbType.String: return MetaNVarChar; case DbType.StringFixedLength: return s_metaNChar; case DbType.Time: return s_metaDateTime; case DbType.Xml: return MetaXml; case DbType.DateTime2: return s_metaDateTime2; case DbType.DateTimeOffset: return MetaDateTimeOffset; default: throw ADP.DbTypeNotSupported(target, typeof(SqlDbType)); } } internal static MetaType GetMaxMetaTypeFromMetaType(MetaType mt) { switch (mt.SqlDbType) { case SqlDbType.Binary: case SqlDbType.VarBinary: return MetaMaxVarBinary; case SqlDbType.Char: case SqlDbType.VarChar: return MetaMaxVarChar; case SqlDbType.NChar: case SqlDbType.NVarChar: return MetaMaxNVarChar; case SqlDbType.Udt: return s_metaMaxUdt; default: return mt; } } internal static MetaType GetMetaTypeFromType(Type dataType, bool streamAllowed = true) { if (dataType == typeof(byte[])) { return MetaVarBinary; } if (dataType == typeof(Guid)) { return s_metaUniqueId; } if (dataType == typeof(object)) { return s_metaVariant; } if (dataType == typeof(SqlBinary)) { return MetaVarBinary; } if (dataType == typeof(SqlBoolean)) { return s_metaBit; } if (dataType == typeof(SqlByte)) { return s_metaTinyInt; } if (dataType == typeof(SqlBytes)) { return MetaVarBinary; } if (dataType == typeof(SqlChars)) { return MetaNVarChar; } if (dataType == typeof(SqlDateTime)) { return s_metaDateTime; } if (dataType == typeof(SqlDouble)) { return s_metaFloat; } if (dataType == typeof(SqlGuid)) { return s_metaUniqueId; } if (dataType == typeof(SqlInt16)) { return s_metaSmallInt; } if (dataType == typeof(SqlInt32)) { return s_metaInt; } if (dataType == typeof(SqlInt64)) { return s_metaBigInt; } if (dataType == typeof(SqlMoney)) { return s_metaMoney; } if (dataType == typeof(SqlDecimal)) { return MetaDecimal; } if (dataType == typeof(SqlSingle)) { return s_metaReal; } if (dataType == typeof(SqlXml)) { return MetaXml; } if (dataType == typeof(SqlString)) { return MetaNVarChar; } if (dataType == typeof(IEnumerable)) { return s_metaTable; } if (dataType == typeof(TimeSpan)) { return MetaTime; } if (dataType == typeof(DateTimeOffset)) { return MetaDateTimeOffset; } if (dataType == typeof(DBNull)) { throw ADP.InvalidDataType("DBNull"); } if (dataType == typeof(bool)) { return s_metaBit; } if (dataType == typeof(char)) { throw ADP.InvalidDataType("Char"); } if (dataType == typeof(sbyte)) { throw ADP.InvalidDataType("SByte"); } if (dataType == typeof(byte)) { return s_metaTinyInt; } if (dataType == typeof(short)) { return s_metaSmallInt; } if (dataType == typeof(ushort)) { throw ADP.InvalidDataType("UInt16"); } if (dataType == typeof(int)) { return s_metaInt; } if (dataType == typeof(uint)) { throw ADP.InvalidDataType("UInt32"); } if (dataType == typeof(long)) { return s_metaBigInt; } if (dataType == typeof(ulong)) { throw ADP.InvalidDataType("UInt64"); } if (dataType == typeof(float)) { return s_metaReal; } if (dataType == typeof(double)) { return s_metaFloat; } if (dataType == typeof(decimal)) { return MetaDecimal; } if (dataType == typeof(DateTime)) { return s_metaDateTime; } if (dataType == typeof(string)) { return MetaNVarChar; } throw ADP.UnknownDataType(dataType); } internal static MetaType GetMetaTypeFromValue(object value, bool inferLen = true, bool streamAllowed = true) { if (value == null) { throw ADP.InvalidDataType("null"); } if (value is DBNull) { throw ADP.InvalidDataType("DBNull"); } Type type = value.GetType(); switch (Convert.GetTypeCode(value)) { case TypeCode.Empty: throw ADP.InvalidDataType("Empty"); case TypeCode.Object: if (type == typeof(byte[])) { if (!inferLen || ((byte[])value).Length <= 8000) { return MetaVarBinary; } return MetaImage; } if (type == typeof(Guid)) { return s_metaUniqueId; } if (type == typeof(object)) { return s_metaVariant; } if (type == typeof(SqlBinary)) { return MetaVarBinary; } if (type == typeof(SqlBoolean)) { return s_metaBit; } if (type == typeof(SqlByte)) { return s_metaTinyInt; } if (type == typeof(SqlBytes)) { return MetaVarBinary; } if (type == typeof(SqlChars)) { return MetaNVarChar; } if (type == typeof(SqlDateTime)) { return s_metaDateTime; } if (type == typeof(SqlDouble)) { return s_metaFloat; } if (type == typeof(SqlGuid)) { return s_metaUniqueId; } if (type == typeof(SqlInt16)) { return s_metaSmallInt; } if (type == typeof(SqlInt32)) { return s_metaInt; } if (type == typeof(SqlInt64)) { return s_metaBigInt; } if (type == typeof(SqlMoney)) { return s_metaMoney; } if (type == typeof(SqlDecimal)) { return MetaDecimal; } if (type == typeof(SqlSingle)) { return s_metaReal; } if (type == typeof(SqlXml)) { return MetaXml; } if (type == typeof(SqlString)) { if (!inferLen || ((SqlString)value).IsNull) { return MetaNVarChar; } return PromoteStringType(((SqlString)value).Value); } if (type == typeof(IEnumerable) || type == typeof(DataTable)) { return s_metaTable; } if (type == typeof(TimeSpan)) { return MetaTime; } if (type == typeof(DateTimeOffset)) { return MetaDateTimeOffset; } if (streamAllowed) { if (value is Stream) { return MetaVarBinary; } if (value is TextReader) { return MetaNVarChar; } if (value is XmlReader) { return MetaXml; } } throw ADP.UnknownDataType(type); case TypeCode.Boolean: return s_metaBit; case TypeCode.Char: throw ADP.InvalidDataType("Char"); case TypeCode.SByte: throw ADP.InvalidDataType("SByte"); case TypeCode.Byte: return s_metaTinyInt; case TypeCode.Int16: return s_metaSmallInt; case TypeCode.UInt16: throw ADP.InvalidDataType("UInt16"); case TypeCode.Int32: return s_metaInt; case TypeCode.UInt32: throw ADP.InvalidDataType("UInt32"); case TypeCode.Int64: return s_metaBigInt; case TypeCode.UInt64: throw ADP.InvalidDataType("UInt64"); case TypeCode.Single: return s_metaReal; case TypeCode.Double: return s_metaFloat; case TypeCode.Decimal: return MetaDecimal; case TypeCode.DateTime: return s_metaDateTime; case TypeCode.String: if (!inferLen) { return MetaNVarChar; } return PromoteStringType((string)value); default: throw ADP.UnknownDataType(type); } } internal static object GetNullSqlValue(Type sqlType) { if (sqlType == typeof(SqlSingle)) { return SqlSingle.Null; } if (sqlType == typeof(SqlString)) { return SqlString.Null; } if (sqlType == typeof(SqlDouble)) { return SqlDouble.Null; } if (sqlType == typeof(SqlBinary)) { return SqlBinary.Null; } if (sqlType == typeof(SqlGuid)) { return SqlGuid.Null; } if (sqlType == typeof(SqlBoolean)) { return SqlBoolean.Null; } if (sqlType == typeof(SqlByte)) { return SqlByte.Null; } if (sqlType == typeof(SqlInt16)) { return SqlInt16.Null; } if (sqlType == typeof(SqlInt32)) { return SqlInt32.Null; } if (sqlType == typeof(SqlInt64)) { return SqlInt64.Null; } if (sqlType == typeof(SqlDecimal)) { return SqlDecimal.Null; } if (sqlType == typeof(SqlDateTime)) { return SqlDateTime.Null; } if (sqlType == typeof(SqlMoney)) { return SqlMoney.Null; } if (sqlType == typeof(SqlXml)) { return SqlXml.Null; } if (sqlType == typeof(object)) { return DBNull.Value; } if (sqlType == typeof(IEnumerable)) { return DBNull.Value; } if (sqlType == typeof(DataTable)) { return DBNull.Value; } if (sqlType == typeof(DateTime)) { return DBNull.Value; } if (sqlType == typeof(TimeSpan)) { return DBNull.Value; } _ = sqlType == typeof(DateTimeOffset); return DBNull.Value; } internal static MetaType PromoteStringType(string s) { if (s.Length << 1 > 8000) { return s_metaVarChar; } return MetaNVarChar; } internal static object GetComValueFromSqlVariant(object sqlVal) { object result = null; if (ADP.IsNull(sqlVal)) { return result; } if (sqlVal is SqlSingle sqlSingle) { result = sqlSingle.Value; } else if (sqlVal is SqlString sqlString) { result = sqlString.Value; } else if (sqlVal is SqlDouble sqlDouble) { result = sqlDouble.Value; } else if (sqlVal is SqlBinary sqlBinary) { result = sqlBinary.Value; } else if (sqlVal is SqlGuid sqlGuid) { result = sqlGuid.Value; } else if (sqlVal is SqlBoolean sqlBoolean) { result = sqlBoolean.Value; } else if (sqlVal is SqlByte sqlByte) { result = sqlByte.Value; } else if (sqlVal is SqlInt16 sqlInt) { result = sqlInt.Value; } else if (sqlVal is SqlInt32 sqlInt2) { result = sqlInt2.Value; } else if (sqlVal is SqlInt64 sqlInt3) { result = sqlInt3.Value; } else if (sqlVal is SqlDecimal sqlDecimal) { result = sqlDecimal.Value; } else if (sqlVal is SqlDateTime sqlDateTime) { result = sqlDateTime.Value; } else if (sqlVal is SqlMoney sqlMoney) { result = sqlMoney.Value; } else if (sqlVal is SqlXml) { result = ((SqlXml)sqlVal).Value; } return result; } internal static object GetSqlValueFromComVariant(object comVal) { object result = null; if (comVal != null && DBNull.Value != comVal) { if (comVal is float) { result = new SqlSingle((float)comVal); } else if (comVal is string) { result = new SqlString((string)comVal); } else if (comVal is double) { result = new SqlDouble((double)comVal); } else if (comVal is byte[]) { result = new SqlBinary((byte[])comVal); } else if (comVal is char c) { result = new SqlString(c.ToString()); } else if (comVal is char[]) { result = new SqlChars((char[])comVal); } else if (comVal is Guid) { result = new SqlGuid((Guid)comVal); } else if (comVal is bool) { result = new SqlBoolean((bool)comVal); } else if (comVal is byte) { result = new SqlByte((byte)comVal); } else if (comVal is short) { result = new SqlInt16((short)comVal); } else if (comVal is int) { result = new SqlInt32((int)comVal); } else if (comVal is long) { result = new SqlInt64((long)comVal); } else if (comVal is decimal) { result = new SqlDecimal((decimal)comVal); } else if (comVal is DateTime) { result = new SqlDateTime((DateTime)comVal); } else if (comVal is XmlReader) { result = new SqlXml((XmlReader)comVal); } else if (comVal is TimeSpan || comVal is DateTimeOffset) { result = comVal; } } return result; } internal static SqlDbType GetSqlDbTypeFromOleDbType(short dbType, string typeName) { return SqlDbType.Variant; } internal static MetaType GetSqlDataType(int tdsType, uint userType, int length) { switch (tdsType) { case 110: if (4 != length) { return s_metaMoney; } return s_metaSmallMoney; case 111: if (4 != length) { return s_metaDateTime; } return s_metaSmallDateTime; case 38: if (4 > length) { if (2 != length) { return s_metaTinyInt; } return s_metaSmallInt; } if (4 != length) { return s_metaBigInt; } return s_metaInt; case 109: if (4 != length) { return s_metaFloat; } return s_metaReal; case 35: return MetaText; case 37: return s_metaSmallVarBinary; case 165: return MetaVarBinary; case 39: case 167: return s_metaVarChar; case 45: case 173: if (80 != userType) { return s_metaBinary; } return s_metaTimestamp; case 34: return MetaImage; case 47: case 175: return s_metaChar; case 48: return s_metaTinyInt; case 50: case 104: return s_metaBit; case 52: return s_metaSmallInt; case 56: return s_metaInt; case 127: return s_metaBigInt; case 60: return s_metaMoney; case 61: return s_metaDateTime; case 62: return s_metaFloat; case 59: return s_metaReal; case 122: return s_metaSmallMoney; case 58: return s_metaSmallDateTime; case 106: case 108: return MetaDecimal; case 36: return s_metaUniqueId; case 239: return s_metaNChar; case 231: return MetaNVarChar; case 99: return MetaNText; case 98: return s_metaVariant; case 240: return MetaUdt; case 241: return MetaXml; case 243: return s_metaTable; case 40: return s_metaDate; case 41: return MetaTime; case 42: return s_metaDateTime2; case 43: return MetaDateTimeOffset; default: throw SQL.InvalidSqlDbType((SqlDbType)tdsType); } } internal static MetaType GetDefaultMetaType() { return MetaNVarChar; } internal static string GetStringFromXml(XmlReader xmlreader) { return new SqlXml(xmlreader).Value; } public static TdsDateTime FromDateTime(DateTime dateTime, byte cb) { TdsDateTime result = default(TdsDateTime); SqlDateTime sqlDateTime; if (cb == 8) { sqlDateTime = new SqlDateTime(dateTime); result.time = sqlDateTime.TimeTicks; } else { sqlDateTime = new SqlDateTime(dateTime.AddSeconds(30.0)); result.time = sqlDateTime.TimeTicks / SqlDateTime.SQLTicksPerMinute; } result.days = sqlDateTime.DayTicks; return result; } public static DateTime ToDateTime(int sqlDays, int sqlTime, int length) { if (length == 4) { return new SqlDateTime(sqlDays, sqlTime * SqlDateTime.SQLTicksPerMinute).Value; } return new SqlDateTime(sqlDays, sqlTime).Value; } internal static int GetTimeSizeFromScale(byte scale) { if (scale <= 2) { return 3; } if (scale <= 4) { return 4; } return 5; } } internal struct TdsDateTime { public int days; public int time; } [Serializable] public sealed class SqlError { private string _source; private int _number; private byte _state; private byte _errorClass; private string _server; private string _message; private string _procedure; private int _lineNumber; private int _win32ErrorCode; private Exception _exception; public string Source => _source; public int Number => _number; public byte State => _state; public byte Class => _errorClass; public string Server => _server; public string Message => _message; public string Procedure => _procedure; public int LineNumber => _lineNumber; internal int Win32ErrorCode => _win32ErrorCode; internal Exception Exception => _exception; internal SqlError(int infoNumber, byte errorState, byte errorClass, string server, string errorMessage, string procedure, int lineNumber, uint win32ErrorCode, Exception exception = null) : this(infoNumber, errorState, errorClass, server, errorMessage, procedure, lineNumber, exception) { _win32ErrorCode = (int)win32ErrorCode; } internal SqlError(int infoNumber, byte errorState, byte errorClass, string server, string errorMessage, string procedure, int lineNumber, Exception exception = null) { _source = "Core .Net SqlClient Data Provider"; base..ctor(); _number = infoNumber; _state = errorState; _errorClass = errorClass; _server = server; _message = errorMessage; _procedure = procedure; _lineNumber = lineNumber; _win32ErrorCode = 0; _exception = exception; } public override string ToString() { return typeof(SqlError).ToString() + ": " + _message; } internal SqlError() { ThrowStub.ThrowNotSupportedException(); } } [Serializable] public sealed class SqlErrorCollection : ICollection, IEnumerable { private readonly List _errors = new List(); public int Count => _errors.Count; object ICollection.SyncRoot => this; bool ICollection.IsSynchronized => false; public SqlError this[int index] => (SqlError)_errors[index]; internal SqlErrorCollection() { } public void CopyTo(Array array, int index) { ((ICollection)_errors).CopyTo(array, index); } public void CopyTo(SqlError[] array, int index) { _errors.CopyTo(array, index); } public IEnumerator GetEnumerator() { return _errors.GetEnumerator(); } internal void Add(SqlError error) { _errors.Add(error); } } [Serializable] public sealed class SqlException : DbException { private const string OriginalClientConnectionIdKey = "OriginalClientConnectionId"; private const string RoutingDestinationKey = "RoutingDestination"; private const int SqlExceptionHResult = -2146232060; private SqlErrorCollection _errors; private Guid _clientConnectionId; internal bool _doNotReconnect; private const string DEF_MESSAGE = "SQL Exception has occured."; public SqlErrorCollection Errors { get { if (_errors == null) { _errors = new SqlErrorCollection(); } return _errors; } } public Guid ClientConnectionId => _clientConnectionId; public byte Class => Errors[0].Class; public int LineNumber => Errors[0].LineNumber; public int Number => Errors[0].Number; public string Procedure => Errors[0].Procedure; public string Server => Errors[0].Server; public byte State => Errors[0].State; public override string Source => Errors[0].Source; public override string Message { get { if (Errors.Count == 0) { return base.Message; } StringBuilder stringBuilder = new StringBuilder(); if (base.Message != "SQL Exception has occured.") { stringBuilder.Append(base.Message); stringBuilder.Append("\n"); } for (int i = 0; i < Errors.Count - 1; i++) { stringBuilder.Append(Errors[i].Message); stringBuilder.Append("\n"); } stringBuilder.Append(Errors[Errors.Count - 1].Message); return stringBuilder.ToString(); } } private SqlException(string message, SqlErrorCollection errorCollection, Exception innerException, Guid conId) { _clientConnectionId = Guid.Empty; base..ctor(message, innerException); base.HResult = -2146232060; _errors = errorCollection; _clientConnectionId = conId; } [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)] public override void GetObjectData(SerializationInfo si, StreamingContext context) { base.GetObjectData(si, context); } public override string ToString() { StringBuilder stringBuilder = new StringBuilder(base.ToString()); stringBuilder.AppendLine(); stringBuilder.AppendFormat(SQLMessage.ExClientConnectionId(), _clientConnectionId); if (Number != 0) { stringBuilder.AppendLine(); stringBuilder.AppendFormat(SQLMessage.ExErrorNumberStateClass(), Number, State, Class); } if (Data.Contains("OriginalClientConnectionId")) { stringBuilder.AppendLine(); stringBuilder.AppendFormat(SQLMessage.ExOriginalClientConnectionId(), Data["OriginalClientConnectionId"]); } if (Data.Contains("RoutingDestination")) { stringBuilder.AppendLine(); stringBuilder.AppendFormat(SQLMessage.ExRoutingDestination(), Data["RoutingDestination"]); } return stringBuilder.ToString(); } internal static SqlException CreateException(SqlErrorCollection errorCollection, string serverVersion) { return CreateException(errorCollection, serverVersion, Guid.Empty); } internal static SqlException CreateException(SqlErrorCollection errorCollection, string serverVersion, SqlInternalConnectionTds internalConnection, Exception innerException = null) { Guid conId = internalConnection?._clientConnectionId ?? Guid.Empty; SqlException ex = CreateException(errorCollection, serverVersion, conId, innerException); if (internalConnection != null) { if (internalConnection.OriginalClientConnectionId != Guid.Empty && internalConnection.OriginalClientConnectionId != internalConnection.ClientConnectionId) { ex.Data.Add("OriginalClientConnectionId", internalConnection.OriginalClientConnectionId); } if (!string.IsNullOrEmpty(internalConnection.RoutingDestination)) { ex.Data.Add("RoutingDestination", internalConnection.RoutingDestination); } } return ex; } internal static SqlException CreateException(SqlErrorCollection errorCollection, string serverVersion, Guid conId, Exception innerException = null) { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < errorCollection.Count; i++) { if (i > 0) { stringBuilder.Append(Environment.NewLine); } stringBuilder.Append(errorCollection[i].Message); } if (innerException == null && errorCollection[0].Win32ErrorCode != 0 && errorCollection[0].Win32ErrorCode != -1) { innerException = new Win32Exception(errorCollection[0].Win32ErrorCode); } SqlException ex = new SqlException(stringBuilder.ToString(), errorCollection, innerException, conId); ex.Data.Add("HelpLink.ProdName", "Microsoft SQL Server"); if (!string.IsNullOrEmpty(serverVersion)) { ex.Data.Add("HelpLink.ProdVer", serverVersion); } ex.Data.Add("HelpLink.EvtSrc", "MSSQLServer"); ex.Data.Add("HelpLink.EvtID", errorCollection[0].Number.ToString(CultureInfo.InvariantCulture)); ex.Data.Add("HelpLink.BaseHelpUrl", "http://go.microsoft.com/fwlink"); ex.Data.Add("HelpLink.LinkId", "20476"); return ex; } internal SqlException InternalClone() { SqlException ex = new SqlException(Message, _errors, base.InnerException, _clientConnectionId); if (Data != null) { foreach (DictionaryEntry datum in Data) { ex.Data.Add(datum.Key, datum.Value); } } ex._doNotReconnect = _doNotReconnect; return ex; } internal SqlException() { ThrowStub.ThrowNotSupportedException(); } } public sealed class SqlInfoMessageEventArgs : EventArgs { private SqlException _exception; public SqlErrorCollection Errors => _exception.Errors; public string Message => _exception.Message; public string Source => _exception.Source; internal SqlInfoMessageEventArgs(SqlException exception) { _exception = exception; } private bool ShouldSerializeErrors() { if (_exception != null) { return 0 < _exception.Errors.Count; } return false; } public override string ToString() { return Message; } internal SqlInfoMessageEventArgs() { ThrowStub.ThrowNotSupportedException(); } } public delegate void SqlInfoMessageEventHandler(object sender, SqlInfoMessageEventArgs e); internal abstract class SqlInternalConnection : DbConnectionInternal { internal enum TransactionRequest { Begin, Promote, Commit, Rollback, IfRollback, Save } private readonly SqlConnectionString _connectionOptions; private bool _isEnlistedInTransaction; private byte[] _promotedDTCToken; private byte[] _whereAbouts; private bool _isGlobalTransaction; private bool _isGlobalTransactionEnabledForServer; private static readonly Guid _globalTransactionTMID = new Guid("1c742caf-6680-40ea-9c26-6b6846079764"); internal string CurrentDatabase { get; set; } internal string CurrentDataSource { get; set; } internal SqlDelegatedTransaction DelegatedTransaction { get; set; } internal SqlConnection Connection => (SqlConnection)base.Owner; internal SqlConnectionString ConnectionOptions => _connectionOptions; internal abstract SqlInternalTransaction CurrentTransaction { get; } internal virtual SqlInternalTransaction AvailableInternalTransaction => CurrentTransaction; internal abstract SqlInternalTransaction PendingTransaction { get; } protected internal override bool IsNonPoolableTransactionRoot => IsTransactionRoot; internal override bool IsTransactionRoot => DelegatedTransaction?.IsActive ?? false; internal bool HasLocalTransaction => CurrentTransaction?.IsLocal ?? false; internal bool HasLocalTransactionFromAPI => CurrentTransaction?.HasParentTransaction ?? false; internal bool IsEnlistedInTransaction => _isEnlistedInTransaction; internal abstract bool IsLockedForBulkCopy { get; } internal abstract bool IsKatmaiOrNewer { get; } internal byte[] PromotedDTCToken { get { return _promotedDTCToken; } set { _promotedDTCToken = value; } } internal bool IsGlobalTransaction { get { return _isGlobalTransaction; } set { _isGlobalTransaction = value; } } internal bool IsGlobalTransactionsEnabledForServer { get { return _isGlobalTransactionEnabledForServer; } set { _isGlobalTransactionEnabledForServer = value; } } internal SqlInternalConnection(SqlConnectionString connectionOptions) { _connectionOptions = connectionOptions; } public override DbTransaction BeginTransaction(IsolationLevel iso) { return BeginSqlTransaction(iso, null, shouldReconnect: false); } internal virtual SqlTransaction BeginSqlTransaction(IsolationLevel iso, string transactionName, bool shouldReconnect) { SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Connection.Statistics); ValidateConnectionForExecute(null); if (HasLocalTransactionFromAPI) { throw ADP.ParallelTransactionsNotSupported(Connection); } if (iso == IsolationLevel.Unspecified) { iso = IsolationLevel.ReadCommitted; } SqlTransaction sqlTransaction = new SqlTransaction(this, Connection, iso, AvailableInternalTransaction); sqlTransaction.InternalTransaction.RestoreBrokenConnection = shouldReconnect; ExecuteTransaction(TransactionRequest.Begin, transactionName, iso, sqlTransaction.InternalTransaction, isDelegateControlRequest: false); sqlTransaction.InternalTransaction.RestoreBrokenConnection = false; return sqlTransaction; } finally { SqlStatistics.StopTimer(statistics); } } public override void ChangeDatabase(string database) { if (string.IsNullOrEmpty(database)) { throw ADP.EmptyDatabaseName(); } ValidateConnectionForExecute(null); ChangeDatabaseInternal(database); } protected abstract void ChangeDatabaseInternal(string database); protected override void CleanupTransactionOnCompletion(Transaction transaction) { DelegatedTransaction?.TransactionEnded(transaction); } protected override DbReferenceCollection CreateReferenceCollection() { return new SqlReferenceCollection(); } protected override void Deactivate() { try { ((SqlReferenceCollection)base.ReferenceCollection)?.Deactivate(); InternalDeactivate(); } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } DoomThisConnection(); } } internal abstract void DisconnectTransaction(SqlInternalTransaction internalTransaction); public override void Dispose() { _whereAbouts = null; base.Dispose(); } protected void Enlist(Transaction tx) { if (null == tx) { if (IsEnlistedInTransaction) { EnlistNull(); return; } Transaction enlistedTransaction = base.EnlistedTransaction; if (enlistedTransaction != null && enlistedTransaction.TransactionInformation.Status != 0) { EnlistNull(); } } else if (!tx.Equals(base.EnlistedTransaction)) { EnlistNonNull(tx); } } private void EnlistNonNull(Transaction tx) { bool flag = false; SqlDelegatedTransaction sqlDelegatedTransaction = new SqlDelegatedTransaction(this, tx); try { flag = ((!_isGlobalTransaction) ? tx.EnlistPromotableSinglePhase(sqlDelegatedTransaction) : ((!(SysTxForGlobalTransactions.EnlistPromotableSinglePhase == null)) ? ((bool)SysTxForGlobalTransactions.EnlistPromotableSinglePhase.Invoke(tx, new object[2] { sqlDelegatedTransaction, _globalTransactionTMID })) : tx.EnlistPromotableSinglePhase(sqlDelegatedTransaction))); if (flag) { DelegatedTransaction = sqlDelegatedTransaction; } } catch (SqlException ex) { if (ex.Class >= 20) { throw; } if (this is SqlInternalConnectionTds sqlInternalConnectionTds) { TdsParser parser = sqlInternalConnectionTds.Parser; if (parser == null || parser.State != TdsParserState.OpenLoggedIn) { throw; } } } if (!flag) { byte[] array = null; if (_isGlobalTransaction) { if (SysTxForGlobalTransactions.GetPromotedToken == null) { throw SQL.UnsupportedSysTxForGlobalTransactions(); } array = (byte[])SysTxForGlobalTransactions.GetPromotedToken.Invoke(tx, null); } else { if (_whereAbouts == null) { byte[] dTCAddress = GetDTCAddress(); if (dTCAddress == null) { throw SQL.CannotGetDTCAddress(); } _whereAbouts = dTCAddress; } array = GetTransactionCookie(tx, _whereAbouts); } PropagateTransactionCookie(array); _isEnlistedInTransaction = true; } base.EnlistedTransaction = tx; } internal void EnlistNull() { PropagateTransactionCookie(null); _isEnlistedInTransaction = false; base.EnlistedTransaction = null; } public override void EnlistTransaction(Transaction transaction) { ValidateConnectionForExecute(null); if (HasLocalTransaction) { throw ADP.LocalTransactionPresent(); } if (null != transaction && transaction.Equals(base.EnlistedTransaction)) { return; } try { Enlist(transaction); } catch (OutOfMemoryException e) { Connection.Abort(e); throw; } catch (StackOverflowException e2) { Connection.Abort(e2); throw; } catch (ThreadAbortException e3) { Connection.Abort(e3); throw; } } internal abstract void ExecuteTransaction(TransactionRequest transactionRequest, string name, IsolationLevel iso, SqlInternalTransaction internalTransaction, bool isDelegateControlRequest); internal SqlDataReader FindLiveReader(SqlCommand command) { SqlDataReader result = null; SqlReferenceCollection sqlReferenceCollection = (SqlReferenceCollection)base.ReferenceCollection; if (sqlReferenceCollection != null) { result = sqlReferenceCollection.FindLiveReader(command); } return result; } internal SqlCommand FindLiveCommand(TdsParserStateObject stateObj) { SqlCommand result = null; SqlReferenceCollection sqlReferenceCollection = (SqlReferenceCollection)base.ReferenceCollection; if (sqlReferenceCollection != null) { result = sqlReferenceCollection.FindLiveCommand(stateObj); } return result; } protected abstract byte[] GetDTCAddress(); private static byte[] GetTransactionCookie(Transaction transaction, byte[] whereAbouts) { byte[] result = null; if (null != transaction) { result = TransactionInterop.GetExportCookie(transaction, whereAbouts); } return result; } protected virtual void InternalDeactivate() { } internal void OnError(SqlException exception, bool breakConnection, Action wrapCloseInAction = null) { if (breakConnection) { DoomThisConnection(); } SqlConnection connection = Connection; if (connection != null) { connection.OnError(exception, breakConnection, wrapCloseInAction); } else if (exception.Class >= 11) { throw exception; } } protected abstract void PropagateTransactionCookie(byte[] transactionCookie); internal abstract void ValidateConnectionForExecute(SqlCommand command); } internal class SessionStateRecord { internal bool _recoverable; internal uint _version; internal int _dataLength; internal byte[] _data; } internal class SessionData { internal const int _maxNumberOfSessionStates = 256; internal uint _tdsVersion; internal bool _encrypted; internal string _database; internal SqlCollation _collation; internal string _language; internal string _initialDatabase; internal SqlCollation _initialCollation; internal string _initialLanguage; internal byte _unrecoverableStatesCount; internal Dictionary> _resolvedAliases; internal SessionStateRecord[] _delta = new SessionStateRecord[256]; internal bool _deltaDirty; internal byte[][] _initialState = new byte[256][]; public SessionData(SessionData recoveryData) { _initialDatabase = recoveryData._initialDatabase; _initialCollation = recoveryData._initialCollation; _initialLanguage = recoveryData._initialLanguage; _resolvedAliases = recoveryData._resolvedAliases; for (int i = 0; i < 256; i++) { if (recoveryData._initialState[i] != null) { _initialState[i] = (byte[])recoveryData._initialState[i].Clone(); } } } public SessionData() { _resolvedAliases = new Dictionary>(2); } public void Reset() { _database = null; _collation = null; _language = null; if (_deltaDirty) { _delta = new SessionStateRecord[256]; _deltaDirty = false; } _unrecoverableStatesCount = 0; } [Conditional("DEBUG")] public void AssertUnrecoverableStateCountIsCorrect() { byte b = 0; SessionStateRecord[] delta = _delta; foreach (SessionStateRecord sessionStateRecord in delta) { if (sessionStateRecord != null && !sessionStateRecord._recoverable) { b++; } } } } internal sealed class SqlInternalConnectionTds : SqlInternalConnection, IDisposable { internal class SyncAsyncLock { private SemaphoreSlim _semaphore = new SemaphoreSlim(1); internal bool CanBeReleasedFromAnyThread => _semaphore.CurrentCount == 0; internal void Wait(bool canReleaseFromAnyThread) { Monitor.Enter(_semaphore); if (canReleaseFromAnyThread || _semaphore.CurrentCount == 0) { _semaphore.Wait(); if (canReleaseFromAnyThread) { Monitor.Exit(_semaphore); } else { _semaphore.Release(); } } } internal void Wait(bool canReleaseFromAnyThread, int timeout, ref bool lockTaken) { lockTaken = false; bool lockTaken2 = false; try { Monitor.TryEnter(_semaphore, timeout, ref lockTaken2); if (!lockTaken2) { return; } if (canReleaseFromAnyThread || _semaphore.CurrentCount == 0) { if (_semaphore.Wait(timeout)) { if (canReleaseFromAnyThread) { Monitor.Exit(_semaphore); lockTaken2 = false; } else { _semaphore.Release(); } lockTaken = true; } } else { lockTaken = true; } } finally { if (!lockTaken && lockTaken2) { Monitor.Exit(_semaphore); } } } internal void Release() { if (_semaphore.CurrentCount == 0) { _semaphore.Release(); } else { Monitor.Exit(_semaphore); } } internal bool ThreadMayHaveLock() { if (!Monitor.IsEntered(_semaphore)) { return _semaphore.CurrentCount == 0; } return true; } } private readonly SqlConnectionPoolGroupProviderInfo _poolGroupProviderInfo; private TdsParser _parser; private SqlLoginAck _loginAck; private bool _sessionRecoveryRequested; internal bool _sessionRecoveryAcknowledged; internal SessionData _currentSessionData; private SessionData _recoverySessionData; private static readonly HashSet s_transientErrors = new HashSet { 4060, 10928, 10929, 40197, 40501, 40613 }; private bool _fConnectionOpen; private bool _fResetConnection; private string _originalDatabase; private string _currentFailoverPartner; private string _originalLanguage; private string _currentLanguage; private int _currentPacketSize; private int _asyncCommandCount; private string _instanceName = string.Empty; private DbConnectionPoolIdentity _identity; internal SyncAsyncLock _parserLock = new SyncAsyncLock(); private int _threadIdOwningParserLock = -1; private SqlConnectionTimeoutErrorInternal _timeoutErrorInternal; internal Guid _clientConnectionId = Guid.Empty; private RoutingInfo _routingInfo; private Guid _originalClientConnectionId = Guid.Empty; private string _routingDestination; internal SessionData CurrentSessionData { get { if (_currentSessionData != null) { _currentSessionData._database = base.CurrentDatabase; _currentSessionData._language = _currentLanguage; } return _currentSessionData; } } internal SqlConnectionTimeoutErrorInternal TimeoutErrorInternal => _timeoutErrorInternal; internal Guid ClientConnectionId => _clientConnectionId; internal Guid OriginalClientConnectionId => _originalClientConnectionId; internal string RoutingDestination => _routingDestination; internal override SqlInternalTransaction CurrentTransaction => _parser.CurrentTransaction; internal override SqlInternalTransaction AvailableInternalTransaction { get { if (!_parser._fResetConnection) { return CurrentTransaction; } return null; } } internal override SqlInternalTransaction PendingTransaction => _parser.PendingTransaction; internal DbConnectionPoolIdentity Identity => _identity; internal string InstanceName => _instanceName; internal override bool IsLockedForBulkCopy { get { if (!Parser.MARSOn) { return Parser._physicalStateObj.BcpLock; } return false; } } protected internal override bool IsNonPoolableTransactionRoot { get { if (IsTransactionRoot) { if (IsKatmaiOrNewer) { return base.Pool == null; } return true; } return false; } } internal override bool IsKatmaiOrNewer => _parser.IsKatmaiOrNewer; internal int PacketSize => _currentPacketSize; internal TdsParser Parser => _parser; internal string ServerProvidedFailOverPartner => _currentFailoverPartner; internal SqlConnectionPoolGroupProviderInfo PoolGroupProviderInfo => _poolGroupProviderInfo; protected override bool ReadyToPrepareTransaction => FindLiveReader(null) == null; public override string ServerVersion => string.Format(null, "{0:00}.{1:00}.{2:0000}", _loginAck.majorVersion, (short)_loginAck.minorVersion, _loginAck.buildNum); protected override bool UnbindOnTransactionCompletion => false; internal bool IgnoreEnvChange => _routingInfo != null; internal bool ThreadHasParserLockForClose { get { return _threadIdOwningParserLock == Thread.CurrentThread.ManagedThreadId; } set { if (value) { _threadIdOwningParserLock = Thread.CurrentThread.ManagedThreadId; } else if (_threadIdOwningParserLock == Thread.CurrentThread.ManagedThreadId) { _threadIdOwningParserLock = -1; } } } internal SqlInternalConnectionTds(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, object providerInfo, bool redirectedUserInstance, SqlConnectionString userConnectionOptions = null, SessionData reconnectSessionData = null, bool applyTransientFaultHandling = false) : base(connectionOptions) { if (connectionOptions.ConnectRetryCount > 0) { _recoverySessionData = reconnectSessionData; if (reconnectSessionData == null) { _currentSessionData = new SessionData(); } else { _currentSessionData = new SessionData(_recoverySessionData); _originalDatabase = _recoverySessionData._initialDatabase; _originalLanguage = _recoverySessionData._initialLanguage; } } _identity = identity; _poolGroupProviderInfo = (SqlConnectionPoolGroupProviderInfo)providerInfo; _fResetConnection = connectionOptions.ConnectionReset; if (_fResetConnection && _recoverySessionData == null) { _originalDatabase = connectionOptions.InitialCatalog; _originalLanguage = connectionOptions.CurrentLanguage; } _timeoutErrorInternal = new SqlConnectionTimeoutErrorInternal(); _parserLock.Wait(canReleaseFromAnyThread: false); ThreadHasParserLockForClose = true; try { TimeoutTimer timeoutTimer = TimeoutTimer.StartSecondsTimeout(connectionOptions.ConnectTimeout); int num = ((!applyTransientFaultHandling) ? 1 : (connectionOptions.ConnectRetryCount + 1)); int num2 = connectionOptions.ConnectRetryInterval * 1000; for (int i = 0; i < num; i++) { try { OpenLoginEnlist(timeoutTimer, connectionOptions, redirectedUserInstance); break; } catch (SqlException ex) { if (i + 1 == num || !applyTransientFaultHandling || timeoutTimer.IsExpired || timeoutTimer.MillisecondsRemaining < num2 || !IsTransientError(ex)) { throw ex; } Thread.Sleep(num2); } } } finally { ThreadHasParserLockForClose = false; _parserLock.Release(); } } private bool IsTransientError(SqlException exc) { if (exc == null) { return false; } foreach (SqlError error in exc.Errors) { if (s_transientErrors.Contains(error.Number)) { return true; } } return false; } protected override void ChangeDatabaseInternal(string database) { database = SqlConnection.FixupDatabaseTransactionName(database); _parser.TdsExecuteSQLBatch("use " + database, base.ConnectionOptions.ConnectTimeout, null, _parser._physicalStateObj, sync: true); _parser.Run(RunBehavior.UntilDone, null, null, null, _parser._physicalStateObj); } public override void Dispose() { try { Interlocked.Exchange(ref _parser, null)?.Disconnect(); } finally { _loginAck = null; _fConnectionOpen = false; } base.Dispose(); } internal override void ValidateConnectionForExecute(SqlCommand command) { TdsParser parser = _parser; if (parser == null || parser.State == TdsParserState.Broken || parser.State == TdsParserState.Closed) { throw ADP.ClosedConnectionError(); } SqlDataReader sqlDataReader = null; if (parser.MARSOn) { if (command != null) { sqlDataReader = FindLiveReader(command); } } else { if (_asyncCommandCount > 0) { throw SQL.MARSUnspportedOnConnection(); } sqlDataReader = FindLiveReader(null); } if (sqlDataReader != null) { throw ADP.OpenReaderExists(); } if (!parser.MARSOn && parser._physicalStateObj._pendingData) { parser.DrainData(parser._physicalStateObj); } parser.RollbackOrphanedAPITransactions(); } internal void CheckEnlistedTransactionBinding() { Transaction enlistedTransaction = base.EnlistedTransaction; if (!(enlistedTransaction != null)) { return; } if (base.ConnectionOptions.TransactionBinding == SqlConnectionString.TransactionBindingEnum.ExplicitUnbind) { Transaction current = Transaction.Current; if (enlistedTransaction.TransactionInformation.Status != 0 || !enlistedTransaction.Equals(current)) { throw ADP.TransactionConnectionMismatch(); } } else if (enlistedTransaction.TransactionInformation.Status != 0) { if (!base.EnlistedTransactionDisposed) { throw ADP.TransactionCompletedButNotDisposed(); } DetachTransaction(enlistedTransaction, isExplicitlyReleasing: true); } } internal override bool IsConnectionAlive(bool throwOnException) { return _parser._physicalStateObj.IsConnectionAlive(throwOnException); } protected override void Activate(Transaction transaction) { if (null != transaction) { if (base.ConnectionOptions.Enlist) { Enlist(transaction); } } else { Enlist(null); } } protected override void InternalDeactivate() { if (_asyncCommandCount != 0) { DoomThisConnection(); } if (!IsNonPoolableTransactionRoot && _parser != null) { _parser.Deactivate(base.IsConnectionDoomed); if (!base.IsConnectionDoomed) { ResetConnection(); } } } private void ResetConnection() { if (_fResetConnection) { _parser.PrepareResetConnection(IsTransactionRoot && !IsNonPoolableTransactionRoot); base.CurrentDatabase = _originalDatabase; _currentLanguage = _originalLanguage; } } internal void DecrementAsyncCount() { Interlocked.Decrement(ref _asyncCommandCount); } internal void IncrementAsyncCount() { Interlocked.Increment(ref _asyncCommandCount); } internal override void DisconnectTransaction(SqlInternalTransaction internalTransaction) { Parser?.DisconnectTransaction(internalTransaction); } internal void ExecuteTransaction(TransactionRequest transactionRequest, string name, IsolationLevel iso) { ExecuteTransaction(transactionRequest, name, iso, null, isDelegateControlRequest: false); } internal override void ExecuteTransaction(TransactionRequest transactionRequest, string name, IsolationLevel iso, SqlInternalTransaction internalTransaction, bool isDelegateControlRequest) { if (base.IsConnectionDoomed) { if (transactionRequest != TransactionRequest.Rollback && transactionRequest != TransactionRequest.IfRollback) { throw SQL.ConnectionDoomed(); } return; } if ((transactionRequest == TransactionRequest.Commit || transactionRequest == TransactionRequest.Rollback || transactionRequest == TransactionRequest.IfRollback) && !Parser.MARSOn && Parser._physicalStateObj.BcpLock) { throw SQL.ConnectionLockedForBcpEvent(); } string transactionName = ((name == null) ? string.Empty : name); ExecuteTransactionYukon(transactionRequest, transactionName, iso, internalTransaction, isDelegateControlRequest); } internal void ExecuteTransactionYukon(TransactionRequest transactionRequest, string transactionName, IsolationLevel iso, SqlInternalTransaction internalTransaction, bool isDelegateControlRequest) { TdsEnums.TransactionManagerRequestType request = TdsEnums.TransactionManagerRequestType.Begin; TdsEnums.TransactionManagerIsolationLevel transactionManagerIsolationLevel = TdsEnums.TransactionManagerIsolationLevel.ReadCommitted; transactionManagerIsolationLevel = iso switch { IsolationLevel.Unspecified => TdsEnums.TransactionManagerIsolationLevel.Unspecified, IsolationLevel.ReadCommitted => TdsEnums.TransactionManagerIsolationLevel.ReadCommitted, IsolationLevel.ReadUncommitted => TdsEnums.TransactionManagerIsolationLevel.ReadUncommitted, IsolationLevel.RepeatableRead => TdsEnums.TransactionManagerIsolationLevel.RepeatableRead, IsolationLevel.Serializable => TdsEnums.TransactionManagerIsolationLevel.Serializable, IsolationLevel.Snapshot => TdsEnums.TransactionManagerIsolationLevel.Snapshot, IsolationLevel.Chaos => throw SQL.NotSupportedIsolationLevel(iso), _ => throw ADP.InvalidIsolationLevel(iso), }; TdsParserStateObject tdsParserStateObject = _parser._physicalStateObj; TdsParser parser = _parser; bool flag = false; bool releaseConnectionLock = false; if (!ThreadHasParserLockForClose) { _parserLock.Wait(canReleaseFromAnyThread: false); ThreadHasParserLockForClose = true; releaseConnectionLock = true; } try { switch (transactionRequest) { case TransactionRequest.Begin: request = TdsEnums.TransactionManagerRequestType.Begin; break; case TransactionRequest.Promote: request = TdsEnums.TransactionManagerRequestType.Promote; break; case TransactionRequest.Commit: request = TdsEnums.TransactionManagerRequestType.Commit; break; case TransactionRequest.Rollback: case TransactionRequest.IfRollback: request = TdsEnums.TransactionManagerRequestType.Rollback; break; case TransactionRequest.Save: request = TdsEnums.TransactionManagerRequestType.Save; break; } if ((internalTransaction?.RestoreBrokenConnection ?? false) && releaseConnectionLock) { Task task = internalTransaction.Parent.Connection.ValidateAndReconnect(delegate { ThreadHasParserLockForClose = false; _parserLock.Release(); releaseConnectionLock = false; }, 0); if (task != null) { AsyncHelper.WaitForCompletion(task, 0); internalTransaction.ConnectionHasBeenRestored = true; return; } } if (internalTransaction != null && internalTransaction.IsDelegated) { if (_parser.MARSOn) { tdsParserStateObject = _parser.GetSession(this); flag = true; } else { _ = internalTransaction.OpenResultsCount; } } _parser.TdsExecuteTransactionManagerRequest(null, request, transactionName, transactionManagerIsolationLevel, base.ConnectionOptions.ConnectTimeout, internalTransaction, tdsParserStateObject, isDelegateControlRequest); } finally { if (flag) { parser.PutSession(tdsParserStateObject); } if (releaseConnectionLock) { ThreadHasParserLockForClose = false; _parserLock.Release(); } } } internal override void DelegatedTransactionEnded() { base.DelegatedTransactionEnded(); } protected override byte[] GetDTCAddress() { return _parser.GetDTCAddress(base.ConnectionOptions.ConnectTimeout, _parser.GetSession(this)); } protected override void PropagateTransactionCookie(byte[] cookie) { _parser.PropagateDistributedTransaction(cookie, base.ConnectionOptions.ConnectTimeout, _parser._physicalStateObj); } private void CompleteLogin(bool enlistOK) { _parser.Run(RunBehavior.UntilDone, null, null, null, _parser._physicalStateObj); if (_routingInfo == null) { if (!_sessionRecoveryAcknowledged) { _currentSessionData = null; if (_recoverySessionData != null) { throw SQL.CR_NoCRAckAtReconnection(this); } } if (_currentSessionData != null && _recoverySessionData == null) { _currentSessionData._initialDatabase = base.CurrentDatabase; _currentSessionData._initialCollation = _currentSessionData._collation; _currentSessionData._initialLanguage = _currentLanguage; } bool flag = _parser.EncryptionOptions == EncryptionOptions.ON; if (_recoverySessionData != null && _recoverySessionData._encrypted != flag) { throw SQL.CR_EncryptionChanged(this); } if (_currentSessionData != null) { _currentSessionData._encrypted = flag; } _recoverySessionData = null; } _parser._physicalStateObj.SniContext = SniContext.Snix_EnableMars; _parser.EnableMars(); _fConnectionOpen = true; if (enlistOK && base.ConnectionOptions.Enlist) { _parser._physicalStateObj.SniContext = SniContext.Snix_AutoEnlist; Transaction currentTransaction = ADP.GetCurrentTransaction(); Enlist(currentTransaction); } _parser._physicalStateObj.SniContext = SniContext.Snix_Login; } private void Login(ServerInfo server, TimeoutTimer timeout) { SqlLogin sqlLogin = new SqlLogin(); base.CurrentDatabase = server.ResolvedDatabaseName; _currentPacketSize = base.ConnectionOptions.PacketSize; _currentLanguage = base.ConnectionOptions.CurrentLanguage; int timeout2 = 0; if (!timeout.IsInfinite) { long num = timeout.MillisecondsRemaining / 1000; if (int.MaxValue > num) { timeout2 = (int)num; } } sqlLogin.timeout = timeout2; sqlLogin.userInstance = base.ConnectionOptions.UserInstance; sqlLogin.hostName = base.ConnectionOptions.ObtainWorkstationId(); sqlLogin.userName = base.ConnectionOptions.UserID; sqlLogin.password = base.ConnectionOptions.Password; sqlLogin.applicationName = base.ConnectionOptions.ApplicationName; sqlLogin.language = _currentLanguage; if (!sqlLogin.userInstance) { sqlLogin.database = base.CurrentDatabase; sqlLogin.attachDBFilename = base.ConnectionOptions.AttachDBFilename; } sqlLogin.serverName = server.UserServerName; sqlLogin.useReplication = base.ConnectionOptions.Replication; sqlLogin.useSSPI = base.ConnectionOptions.IntegratedSecurity; sqlLogin.packetSize = _currentPacketSize; sqlLogin.readOnlyIntent = base.ConnectionOptions.ApplicationIntent == ApplicationIntent.ReadOnly; TdsEnums.FeatureExtension featureExtension = TdsEnums.FeatureExtension.None; if (base.ConnectionOptions.ConnectRetryCount > 0) { featureExtension |= TdsEnums.FeatureExtension.SessionRecovery; _sessionRecoveryRequested = true; } featureExtension |= TdsEnums.FeatureExtension.GlobalTransactions; _parser.TdsLogin(sqlLogin, featureExtension, _recoverySessionData); } private void LoginFailure() { if (_parser != null) { _parser.Disconnect(); } } private void OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, bool redirectedUserInstance) { ServerInfo serverInfo = new ServerInfo(connectionOptions); bool flag; string failoverPartner; if (PoolGroupProviderInfo != null) { flag = PoolGroupProviderInfo.UseFailoverPartner; failoverPartner = PoolGroupProviderInfo.FailoverPartner; } else { flag = false; failoverPartner = base.ConnectionOptions.FailoverPartner; } _timeoutErrorInternal.SetInternalSourceType(flag ? SqlConnectionInternalSourceType.Failover : SqlConnectionInternalSourceType.Principle); bool flag2 = !string.IsNullOrEmpty(failoverPartner); try { _timeoutErrorInternal.SetAndBeginPhase(SqlConnectionTimeoutErrorPhase.PreLoginBegin); if (flag2) { _timeoutErrorInternal.SetFailoverScenario(useFailoverServer: true); LoginWithFailover(flag, serverInfo, failoverPartner, redirectedUserInstance, connectionOptions, timeout); } else { _timeoutErrorInternal.SetFailoverScenario(useFailoverServer: false); LoginNoFailover(serverInfo, redirectedUserInstance, connectionOptions, timeout); } _timeoutErrorInternal.EndPhase(SqlConnectionTimeoutErrorPhase.PostLogin); } catch (Exception e) { if (ADP.IsCatchableExceptionType(e)) { LoginFailure(); } throw; } _timeoutErrorInternal.SetAllCompleteMarker(); } private bool IsDoNotRetryConnectError(SqlException exc) { if (18456 != exc.Number && 18488 != exc.Number && 1346 != exc.Number) { return exc._doNotReconnect; } return true; } private void LoginNoFailover(ServerInfo serverInfo, bool redirectedUserInstance, SqlConnectionString connectionOptions, TimeoutTimer timeout) { int num = 0; ServerInfo serverInfo2 = serverInfo; int num2 = 100; ResolveExtendedServerName(serverInfo, !redirectedUserInstance, connectionOptions); long num3 = 0L; if (connectionOptions.MultiSubnetFailover) { num3 = ((!timeout.IsInfinite) ? checked((long)(0.08f * (float)timeout.MillisecondsRemaining)) : 1200); } int num4 = 0; TimeoutTimer timeoutTimer = null; while (true) { if (connectionOptions.MultiSubnetFailover) { num4++; long num5 = checked(num3 * num4); long millisecondsRemaining = timeout.MillisecondsRemaining; if (num5 > millisecondsRemaining) { num5 = millisecondsRemaining; } timeoutTimer = TimeoutTimer.StartMillisecondsTimeout(num5); } if (_parser != null) { _parser.Disconnect(); } _parser = new TdsParser(base.ConnectionOptions.MARS, base.ConnectionOptions.Asynchronous); try { AttemptOneLogin(serverInfo, !connectionOptions.MultiSubnetFailover, connectionOptions.MultiSubnetFailover ? timeoutTimer : timeout); if (connectionOptions.MultiSubnetFailover && ServerProvidedFailOverPartner != null) { throw SQL.MultiSubnetFailoverWithFailoverPartner(serverProvidedFailoverPartner: true, this); } if (_routingInfo != null) { if (num > 0) { throw SQL.ROR_RecursiveRoutingNotSupported(this); } if (timeout.IsExpired) { throw SQL.ROR_TimeoutAfterRoutingInfo(this); } serverInfo = new ServerInfo(base.ConnectionOptions, _routingInfo, serverInfo.ResolvedServerName); _timeoutErrorInternal.SetInternalSourceType(SqlConnectionInternalSourceType.RoutingDestination); _originalClientConnectionId = _clientConnectionId; _routingDestination = serverInfo.UserServerName; _currentPacketSize = base.ConnectionOptions.PacketSize; _currentLanguage = (_originalLanguage = base.ConnectionOptions.CurrentLanguage); base.CurrentDatabase = (_originalDatabase = base.ConnectionOptions.InitialCatalog); _currentFailoverPartner = null; _instanceName = string.Empty; num++; continue; } } catch (SqlException exc) { if (_parser == null || _parser.State != 0 || IsDoNotRetryConnectError(exc) || timeout.IsExpired) { throw; } if (timeout.MillisecondsRemaining <= num2) { throw; } goto IL_01e9; } break; IL_01e9: if (ServerProvidedFailOverPartner != null) { if (connectionOptions.MultiSubnetFailover) { throw SQL.MultiSubnetFailoverWithFailoverPartner(serverProvidedFailoverPartner: true, this); } _timeoutErrorInternal.ResetAndRestartPhase(); _timeoutErrorInternal.SetAndBeginPhase(SqlConnectionTimeoutErrorPhase.PreLoginBegin); _timeoutErrorInternal.SetInternalSourceType(SqlConnectionInternalSourceType.Failover); _timeoutErrorInternal.SetFailoverScenario(useFailoverServer: true); LoginWithFailover(useFailoverHost: true, serverInfo, ServerProvidedFailOverPartner, redirectedUserInstance, connectionOptions, timeout); return; } Thread.Sleep(num2); num2 = ((num2 < 500) ? (num2 * 2) : 1000); } if (PoolGroupProviderInfo != null) { PoolGroupProviderInfo.FailoverCheck(this, actualUseFailoverPartner: false, connectionOptions, ServerProvidedFailOverPartner); } base.CurrentDataSource = serverInfo2.UserServerName; } private void LoginWithFailover(bool useFailoverHost, ServerInfo primaryServerInfo, string failoverHost, bool redirectedUserInstance, SqlConnectionString connectionOptions, TimeoutTimer timeout) { int num = 100; ServerInfo serverInfo = new ServerInfo(connectionOptions, failoverHost); ResolveExtendedServerName(primaryServerInfo, !redirectedUserInstance, connectionOptions); if (ServerProvidedFailOverPartner == null) { ResolveExtendedServerName(serverInfo, !redirectedUserInstance && failoverHost != primaryServerInfo.UserServerName, connectionOptions); } long num2 = checked((!timeout.IsInfinite) ? ((long)(0.08f * (float)timeout.MillisecondsRemaining)) : ((long)(0.08f * (float)ADP.TimerFromSeconds(15)))); int num3 = 0; while (true) { TimeoutTimer timeout2; ServerInfo serverInfo2; checked { long num4 = num2 * (unchecked(num3 / 2) + 1); long millisecondsRemaining = timeout.MillisecondsRemaining; if (num4 > millisecondsRemaining) { num4 = millisecondsRemaining; } timeout2 = TimeoutTimer.StartMillisecondsTimeout(num4); if (_parser != null) { _parser.Disconnect(); } _parser = new TdsParser(base.ConnectionOptions.MARS, base.ConnectionOptions.Asynchronous); if (useFailoverHost) { if (ServerProvidedFailOverPartner != null && serverInfo.ResolvedServerName != ServerProvidedFailOverPartner) { serverInfo.SetDerivedNames(string.Empty, ServerProvidedFailOverPartner); } serverInfo2 = serverInfo; _timeoutErrorInternal.SetInternalSourceType(SqlConnectionInternalSourceType.Failover); } else { serverInfo2 = primaryServerInfo; _timeoutErrorInternal.SetInternalSourceType(SqlConnectionInternalSourceType.Principle); } } try { AttemptOneLogin(serverInfo2, ignoreSniOpenTimeout: false, timeout2, withFailover: true); if (_routingInfo != null) { throw SQL.ROR_UnexpectedRoutingInfo(this); } } catch (SqlException exc) { if (IsDoNotRetryConnectError(exc) || timeout.IsExpired) { throw; } if (base.IsConnectionDoomed) { throw; } if (1 == num3 % 2 && timeout.MillisecondsRemaining <= num) { throw; } goto IL_0168; } break; IL_0168: if (1 == num3 % 2) { Thread.Sleep(num); num = ((num < 500) ? (num * 2) : 1000); } num3++; useFailoverHost = !useFailoverHost; } if (useFailoverHost && ServerProvidedFailOverPartner == null) { throw SQL.InvalidPartnerConfiguration(failoverHost, base.CurrentDatabase); } if (PoolGroupProviderInfo != null) { PoolGroupProviderInfo.FailoverCheck(this, useFailoverHost, connectionOptions, ServerProvidedFailOverPartner); } base.CurrentDataSource = (useFailoverHost ? failoverHost : primaryServerInfo.UserServerName); } private void ResolveExtendedServerName(ServerInfo serverInfo, bool aliasLookup, SqlConnectionString options) { if (serverInfo.ExtendedServerName == null) { string userServerName = serverInfo.UserServerName; string userProtocol = serverInfo.UserProtocol; serverInfo.SetDerivedNames(userProtocol, userServerName); } } private void AttemptOneLogin(ServerInfo serverInfo, bool ignoreSniOpenTimeout, TimeoutTimer timeout, bool withFailover = false) { _routingInfo = null; _parser._physicalStateObj.SniContext = SniContext.Snix_Connect; _parser.Connect(serverInfo, this, ignoreSniOpenTimeout, timeout.LegacyTimerExpire, base.ConnectionOptions.Encrypt, base.ConnectionOptions.TrustServerCertificate, base.ConnectionOptions.IntegratedSecurity, withFailover); _timeoutErrorInternal.EndPhase(SqlConnectionTimeoutErrorPhase.ConsumePreLoginHandshake); _timeoutErrorInternal.SetAndBeginPhase(SqlConnectionTimeoutErrorPhase.LoginBegin); _parser._physicalStateObj.SniContext = SniContext.Snix_Login; Login(serverInfo, timeout); _timeoutErrorInternal.EndPhase(SqlConnectionTimeoutErrorPhase.ProcessConnectionAuth); _timeoutErrorInternal.SetAndBeginPhase(SqlConnectionTimeoutErrorPhase.PostLogin); CompleteLogin(!base.ConnectionOptions.Pooling); _timeoutErrorInternal.EndPhase(SqlConnectionTimeoutErrorPhase.PostLogin); } protected override object ObtainAdditionalLocksForClose() { bool num = !ThreadHasParserLockForClose; if (num) { _parserLock.Wait(canReleaseFromAnyThread: false); ThreadHasParserLockForClose = true; } return num; } protected override void ReleaseAdditionalLocksForClose(object lockToken) { if ((bool)lockToken) { ThreadHasParserLockForClose = false; _parserLock.Release(); } } internal bool GetSessionAndReconnectIfNeeded(SqlConnection parent, int timeout = 0) { if (ThreadHasParserLockForClose) { return false; } _parserLock.Wait(canReleaseFromAnyThread: false); ThreadHasParserLockForClose = true; bool releaseConnectionLock = true; try { Task task = parent.ValidateAndReconnect(delegate { ThreadHasParserLockForClose = false; _parserLock.Release(); releaseConnectionLock = false; }, timeout); if (task != null) { AsyncHelper.WaitForCompletion(task, timeout); return true; } return false; } finally { if (releaseConnectionLock) { ThreadHasParserLockForClose = false; _parserLock.Release(); } } } internal void BreakConnection() { SqlConnection connection = base.Connection; DoomThisConnection(); connection?.Close(); } internal void OnEnvChange(SqlEnvChange rec) { switch (rec.type) { case 1: if (!_fConnectionOpen && _recoverySessionData == null) { _originalDatabase = rec.newValue; } base.CurrentDatabase = rec.newValue; break; case 2: if (!_fConnectionOpen && _recoverySessionData == null) { _originalLanguage = rec.newValue; } _currentLanguage = rec.newValue; break; case 4: _currentPacketSize = int.Parse(rec.newValue, CultureInfo.InvariantCulture); break; case 7: if (_currentSessionData != null) { _currentSessionData._collation = rec.newCollation; } break; case 13: if (base.ConnectionOptions.ApplicationIntent == ApplicationIntent.ReadOnly) { throw SQL.ROR_FailoverNotSupportedServer(this); } _currentFailoverPartner = rec.newValue; break; case 15: base.PromotedDTCToken = rec.newBinValue; break; case 18: if (_currentSessionData != null) { _currentSessionData.Reset(); } break; case 19: _instanceName = rec.newValue; break; case 20: if (string.IsNullOrEmpty(rec.newRoutingInfo.ServerName) || rec.newRoutingInfo.Protocol != 0 || rec.newRoutingInfo.Port == 0) { throw SQL.ROR_InvalidRoutingInfo(this); } _routingInfo = rec.newRoutingInfo; break; case 3: case 5: case 6: case 8: case 9: case 10: case 11: case 12: case 14: case 16: case 17: break; } } internal void OnLoginAck(SqlLoginAck rec) { _loginAck = rec; if (_recoverySessionData != null && _recoverySessionData._tdsVersion != rec.tdsVersion) { throw SQL.CR_TDSVersionNotPreserved(this); } if (_currentSessionData != null) { _currentSessionData._tdsVersion = rec.tdsVersion; } } internal void OnFeatureExtAck(int featureId, byte[] data) { if (_routingInfo != null) { return; } switch (featureId) { case 1: { if (!_sessionRecoveryRequested) { throw SQL.ParsingError(); } _sessionRecoveryAcknowledged = true; int num = 0; while (num < data.Length) { byte b = data[num]; num++; byte b2 = data[num]; num++; int num2; if (b2 == byte.MaxValue) { num2 = BitConverter.ToInt32(data, num); num += 4; } else { num2 = b2; } byte[] array = new byte[num2]; Buffer.BlockCopy(data, num, array, 0, num2); num += num2; if (_recoverySessionData == null) { _currentSessionData._initialState[b] = array; continue; } _currentSessionData._delta[b] = new SessionStateRecord { _data = array, _dataLength = num2, _recoverable = true, _version = 0u }; _currentSessionData._deltaDirty = true; } break; } case 5: if (data.Length < 1) { throw SQL.ParsingError(); } base.IsGlobalTransaction = true; if (1 == data[0]) { base.IsGlobalTransactionsEnabledForServer = true; } break; default: throw SQL.ParsingError(); } } internal override bool TryReplaceConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource retry, DbConnectionOptions userOptions) { return TryOpenConnectionInternal(outerConnection, connectionFactory, retry, userOptions); } } internal sealed class ServerInfo { private string _userServerName; internal readonly string PreRoutingServerName; internal string ExtendedServerName { get; private set; } internal string ResolvedServerName { get; private set; } internal string ResolvedDatabaseName { get; private set; } internal string UserProtocol { get; private set; } internal string UserServerName { get { return _userServerName; } private set { _userServerName = value; } } internal ServerInfo(SqlConnectionString userOptions) : this(userOptions, userOptions.DataSource) { } internal ServerInfo(SqlConnectionString userOptions, string serverName) { UserServerName = serverName ?? string.Empty; UserProtocol = string.Empty; ResolvedDatabaseName = userOptions.InitialCatalog; PreRoutingServerName = null; } internal ServerInfo(SqlConnectionString userOptions, RoutingInfo routing, string preRoutingServerName) { if (routing == null || routing.ServerName == null) { UserServerName = string.Empty; } else { UserServerName = string.Format(CultureInfo.InvariantCulture, "{0},{1}", routing.ServerName, routing.Port); } PreRoutingServerName = preRoutingServerName; UserProtocol = "tcp"; SetDerivedNames(UserProtocol, UserServerName); ResolvedDatabaseName = userOptions.InitialCatalog; } internal void SetDerivedNames(string protocol, string serverName) { if (!string.IsNullOrEmpty(protocol)) { ExtendedServerName = protocol + ":" + serverName; } else { ExtendedServerName = serverName; } ResolvedServerName = serverName; } } public class SqlNotificationEventArgs : EventArgs { private SqlNotificationType _type; private SqlNotificationInfo _info; private SqlNotificationSource _source; internal static SqlNotificationEventArgs s_notifyError = new SqlNotificationEventArgs(SqlNotificationType.Subscribe, SqlNotificationInfo.Error, SqlNotificationSource.Object); public SqlNotificationType Type => _type; public SqlNotificationInfo Info => _info; public SqlNotificationSource Source => _source; public SqlNotificationEventArgs(SqlNotificationType type, SqlNotificationInfo info, SqlNotificationSource source) { _info = info; _source = source; _type = type; } } public enum SqlNotificationInfo { Truncate = 0, Insert = 1, Update = 2, Delete = 3, Drop = 4, Alter = 5, Restart = 6, Error = 7, Query = 8, Invalid = 9, Options = 10, Isolation = 11, Expired = 12, Resource = 13, PreviousFire = 14, TemplateLimit = 15, Merge = 16, Unknown = -1, AlreadyChanged = -2 } public enum SqlNotificationSource { Data = 0, Timeout = 1, Object = 2, Database = 3, System = 4, Statement = 5, Environment = 6, Execution = 7, Owner = 8, Unknown = -1, Client = -2 } public enum SqlNotificationType { Change = 0, Subscribe = 1, Unknown = -1 } internal abstract class DataFeed { } internal class StreamDataFeed : DataFeed { internal Stream _source; internal StreamDataFeed(Stream source) { _source = source; } } internal class TextDataFeed : DataFeed { internal TextReader _source; internal TextDataFeed(TextReader source) { _source = source; } } internal class XmlDataFeed : DataFeed { internal XmlReader _source; internal XmlDataFeed(XmlReader source) { _source = source; } } public sealed class SqlParameter : DbParameter, IDbDataParameter, IDataParameter, ICloneable { private MetaType _metaType; private SqlCollation _collation; private string _xmlSchemaCollectionDatabase; private string _xmlSchemaCollectionOwningSchema; private string _xmlSchemaCollectionName; private string _typeName; private string _parameterName; private byte _precision; private byte _scale; private bool _hasScale; private MetaType _internalMetaType; private SqlBuffer _sqlBufferReturnValue; private INullable _valueAsINullable; private bool _isSqlParameterSqlType; private bool _isNull = true; private bool _coercedValueIsSqlType; private bool _coercedValueIsDataFeed; private int _actualSize = -1; private DataRowVersion _sourceVersion; private object _value; private object _parent; private ParameterDirection _direction; private int _size; private int _offset; private string _sourceColumn; private bool _sourceColumnNullMapping; private bool _isNullable; private object _coercedValue; internal SqlCollation Collation { get { return _collation; } set { _collation = value; } } public SqlCompareOptions CompareInfo { get { return _collation?.SqlCompareOptions ?? SqlCompareOptions.None; } set { SqlCollation sqlCollation = _collation; if (sqlCollation == null) { sqlCollation = (_collation = new SqlCollation()); } if ((value & (SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreNonSpace | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth | SqlCompareOptions.BinarySort | SqlCompareOptions.BinarySort2)) != value) { throw ADP.ArgumentOutOfRange("CompareInfo"); } sqlCollation.SqlCompareOptions = value; } } public string XmlSchemaCollectionDatabase { get { string xmlSchemaCollectionDatabase = _xmlSchemaCollectionDatabase; if (xmlSchemaCollectionDatabase == null) { return ADP.StrEmpty; } return xmlSchemaCollectionDatabase; } set { _xmlSchemaCollectionDatabase = value; } } public string XmlSchemaCollectionOwningSchema { get { string xmlSchemaCollectionOwningSchema = _xmlSchemaCollectionOwningSchema; if (xmlSchemaCollectionOwningSchema == null) { return ADP.StrEmpty; } return xmlSchemaCollectionOwningSchema; } set { _xmlSchemaCollectionOwningSchema = value; } } public string XmlSchemaCollectionName { get { string xmlSchemaCollectionName = _xmlSchemaCollectionName; if (xmlSchemaCollectionName == null) { return ADP.StrEmpty; } return xmlSchemaCollectionName; } set { _xmlSchemaCollectionName = value; } } public override DbType DbType { get { return GetMetaTypeOnly().DbType; } set { MetaType metaType = _metaType; if (metaType == null || metaType.DbType != value || value == DbType.Date || value == DbType.Time) { PropertyTypeChanging(); _metaType = MetaType.GetMetaTypeFromDbType(value); } } } internal MetaType InternalMetaType { get { return _internalMetaType; } set { _internalMetaType = value; } } public int LocaleId { get { return _collation?.LCID ?? 0; } set { SqlCollation sqlCollation = _collation; if (sqlCollation == null) { sqlCollation = (_collation = new SqlCollation()); } if ((ulong)value != (0xFFFFFuL & (ulong)value)) { throw ADP.ArgumentOutOfRange("LocaleId"); } sqlCollation.LCID = value; } } internal bool SizeInferred => _size == 0; internal bool ParameterIsSqlType { get { return _isSqlParameterSqlType; } set { _isSqlParameterSqlType = value; } } public override string ParameterName { get { string parameterName = _parameterName; if (parameterName == null) { return ADP.StrEmpty; } return parameterName; } set { if (string.IsNullOrEmpty(value) || value.Length < 128 || ('@' == value[0] && value.Length <= 128)) { if (_parameterName != value) { PropertyChanging(); _parameterName = value; } return; } throw SQL.InvalidParameterNameLength(value); } } internal string ParameterNameFixed { get { string text = ParameterName; if (0 < text.Length && '@' != text[0]) { text = "@" + text; } return text; } } public override byte Precision { get { return PrecisionInternal; } set { PrecisionInternal = value; } } internal byte PrecisionInternal { get { byte b = _precision; SqlDbType metaSqlDbTypeOnly = GetMetaSqlDbTypeOnly(); if (b == 0 && SqlDbType.Decimal == metaSqlDbTypeOnly) { b = ValuePrecision(SqlValue); } return b; } set { if (SqlDbType == SqlDbType.Decimal && value > 38) { throw SQL.PrecisionValueOutOfRange(value); } if (_precision != value) { PropertyChanging(); _precision = value; } } } public override byte Scale { get { return ScaleInternal; } set { ScaleInternal = value; } } internal byte ScaleInternal { get { byte b = _scale; SqlDbType metaSqlDbTypeOnly = GetMetaSqlDbTypeOnly(); if (b == 0 && SqlDbType.Decimal == metaSqlDbTypeOnly) { b = ValueScale(SqlValue); } return b; } set { if (_scale != value || !_hasScale) { PropertyChanging(); _scale = value; _hasScale = true; _actualSize = -1; } } } public SqlDbType SqlDbType { get { return GetMetaTypeOnly().SqlDbType; } set { MetaType metaType = _metaType; if ((SqlDbType)24 == value) { throw SQL.InvalidSqlDbType(value); } if (metaType == null || metaType.SqlDbType != value) { PropertyTypeChanging(); _metaType = MetaType.GetMetaTypeFromSqlDbType(value, value == SqlDbType.Structured); } } } public object SqlValue { get { if (_value != null) { if (_value == DBNull.Value) { return MetaType.GetNullSqlValue(GetMetaTypeOnly().SqlType); } if (_value is INullable) { return _value; } if (_value is DateTime) { SqlDbType sqlDbType = GetMetaTypeOnly().SqlDbType; if (sqlDbType == SqlDbType.Date || sqlDbType == SqlDbType.DateTime2) { return _value; } } return MetaType.GetSqlValueFromComVariant(_value); } if (_sqlBufferReturnValue != null) { return _sqlBufferReturnValue.SqlValue; } return null; } set { Value = value; } } public string TypeName { get { string typeName = _typeName; if (typeName == null) { return ADP.StrEmpty; } return typeName; } set { _typeName = value; } } public override object Value { get { if (_value != null) { return _value; } if (_sqlBufferReturnValue != null) { if (ParameterIsSqlType) { return _sqlBufferReturnValue.SqlValue; } return _sqlBufferReturnValue.Value; } return null; } set { _value = value; _sqlBufferReturnValue = null; _coercedValue = null; _valueAsINullable = _value as INullable; _isSqlParameterSqlType = _valueAsINullable != null; _isNull = _value == null || _value == DBNull.Value || (_isSqlParameterSqlType && _valueAsINullable.IsNull); _actualSize = -1; } } internal INullable ValueAsINullable => _valueAsINullable; internal bool IsNull { get { if (_internalMetaType.SqlDbType == SqlDbType.Udt) { _isNull = _value == null || _value == DBNull.Value || (_isSqlParameterSqlType && _valueAsINullable.IsNull); } return _isNull; } } internal bool CoercedValueIsSqlType { get { if (_coercedValue == null) { GetCoercedValue(); } return _coercedValueIsSqlType; } } internal bool CoercedValueIsDataFeed { get { if (_coercedValue == null) { GetCoercedValue(); } return _coercedValueIsDataFeed; } } public override DataRowVersion SourceVersion { get { DataRowVersion sourceVersion = _sourceVersion; if (sourceVersion == (DataRowVersion)0) { return DataRowVersion.Current; } return sourceVersion; } set { switch (value) { case DataRowVersion.Original: case DataRowVersion.Current: case DataRowVersion.Proposed: case DataRowVersion.Default: _sourceVersion = value; break; default: throw ADP.InvalidDataRowVersion(value); } } } private object CoercedValue { get { return _coercedValue; } set { _coercedValue = value; } } public override ParameterDirection Direction { get { ParameterDirection direction = _direction; if (direction == (ParameterDirection)0) { return ParameterDirection.Input; } return direction; } set { if (_direction != value) { if ((uint)(value - 1) > 2u && value != ParameterDirection.ReturnValue) { throw ADP.InvalidParameterDirection(value); } PropertyChanging(); _direction = value; } } } public override bool IsNullable { get { return _isNullable; } set { _isNullable = value; } } public int Offset { get { return _offset; } set { if (value < 0) { throw ADP.InvalidOffsetValue(value); } _offset = value; } } public override int Size { get { int num = _size; if (num == 0) { num = ValueSize(Value); } return num; } set { if (_size != value) { if (value < -1) { throw ADP.InvalidSizeValue(value); } PropertyChanging(); _size = value; } } } public override string SourceColumn { get { string sourceColumn = _sourceColumn; if (sourceColumn == null) { return ADP.StrEmpty; } return sourceColumn; } set { _sourceColumn = value; } } public override bool SourceColumnNullMapping { get { return _sourceColumnNullMapping; } set { _sourceColumnNullMapping = value; } } [MonoTODO] public string UdtTypeName { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } public bool ForceColumnEncryption { [CompilerGenerated] get { ThrowStub.ThrowNotSupportedException(); return default(bool); } [CompilerGenerated] set { ThrowStub.ThrowNotSupportedException(); } } public SqlParameter() { } public SqlParameter(string parameterName, SqlDbType dbType) : this() { ParameterName = parameterName; SqlDbType = dbType; } public SqlParameter(string parameterName, object value) : this() { ParameterName = parameterName; Value = value; } public SqlParameter(string parameterName, SqlDbType dbType, int size) : this() { ParameterName = parameterName; SqlDbType = dbType; Size = size; } public SqlParameter(string parameterName, SqlDbType dbType, int size, string sourceColumn) : this() { ParameterName = parameterName; SqlDbType = dbType; Size = size; SourceColumn = sourceColumn; } public SqlParameter(string parameterName, SqlDbType dbType, int size, ParameterDirection direction, bool isNullable, byte precision, byte scale, string sourceColumn, DataRowVersion sourceVersion, object value) : this(parameterName, dbType, size, sourceColumn) { Direction = direction; IsNullable = isNullable; Precision = precision; Scale = scale; SourceVersion = sourceVersion; Value = value; } public SqlParameter(string parameterName, SqlDbType dbType, int size, ParameterDirection direction, byte precision, byte scale, string sourceColumn, DataRowVersion sourceVersion, bool sourceColumnNullMapping, object value, string xmlSchemaCollectionDatabase, string xmlSchemaCollectionOwningSchema, string xmlSchemaCollectionName) : this() { ParameterName = parameterName; SqlDbType = dbType; Size = size; Direction = direction; Precision = precision; Scale = scale; SourceColumn = sourceColumn; SourceVersion = sourceVersion; SourceColumnNullMapping = sourceColumnNullMapping; Value = value; XmlSchemaCollectionDatabase = xmlSchemaCollectionDatabase; XmlSchemaCollectionOwningSchema = xmlSchemaCollectionOwningSchema; XmlSchemaCollectionName = xmlSchemaCollectionName; } private SqlParameter(SqlParameter source) : this() { ADP.CheckArgumentNull(source, "source"); source.CloneHelper(this); if (_value is ICloneable cloneable) { _value = cloneable.Clone(); } } public override void ResetDbType() { ResetSqlDbType(); } internal SmiParameterMetaData MetaDataForSmi(out ParameterPeekAheadValue peekAhead) { peekAhead = null; MetaType metaType = ValidateTypeLengths(); long num = GetActualSize(); long num2 = Size; if (!metaType.IsLong) { if (SqlDbType.NChar == metaType.SqlDbType || SqlDbType.NVarChar == metaType.SqlDbType) { num /= 2; } if (num > num2) { num2 = num; } } if (num2 == 0L) { if (SqlDbType.Binary == metaType.SqlDbType || SqlDbType.VarBinary == metaType.SqlDbType) { num2 = 8000L; } else if (SqlDbType.Char == metaType.SqlDbType || SqlDbType.VarChar == metaType.SqlDbType) { num2 = 8000L; } else if (SqlDbType.NChar == metaType.SqlDbType || SqlDbType.NVarChar == metaType.SqlDbType) { num2 = 4000L; } } else if ((num2 > 8000 && (SqlDbType.Binary == metaType.SqlDbType || SqlDbType.VarBinary == metaType.SqlDbType)) || (num2 > 8000 && (SqlDbType.Char == metaType.SqlDbType || SqlDbType.VarChar == metaType.SqlDbType)) || (num2 > 4000 && (SqlDbType.NChar == metaType.SqlDbType || SqlDbType.NVarChar == metaType.SqlDbType))) { num2 = -1L; } int num3 = LocaleId; if (num3 == 0 && metaType.IsCharType) { object coercedValue = GetCoercedValue(); num3 = ((!(coercedValue is SqlString sqlString) || sqlString.IsNull) ? CultureInfo.CurrentCulture.LCID : ((SqlString)coercedValue).LCID); } SqlCompareOptions sqlCompareOptions = CompareInfo; if (sqlCompareOptions == SqlCompareOptions.None && metaType.IsCharType) { object coercedValue2 = GetCoercedValue(); sqlCompareOptions = ((!(coercedValue2 is SqlString sqlString2) || sqlString2.IsNull) ? SmiMetaData.GetDefaultForType(metaType.SqlDbType).CompareOptions : ((SqlString)coercedValue2).SqlCompareOptions); } string text = null; string text2 = null; string text3 = null; if (SqlDbType.Xml == metaType.SqlDbType) { text = XmlSchemaCollectionDatabase; text2 = XmlSchemaCollectionOwningSchema; text3 = XmlSchemaCollectionName; } else if (SqlDbType.Udt == metaType.SqlDbType || (SqlDbType.Structured == metaType.SqlDbType && !string.IsNullOrEmpty(TypeName))) { if (SqlDbType.Udt == metaType.SqlDbType) { throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString()); } string[] array = ParseTypeName(TypeName); if (1 == array.Length) { text3 = array[0]; } else if (2 == array.Length) { text2 = array[0]; text3 = array[1]; } else { if (3 != array.Length) { throw ADP.ArgumentOutOfRange("names"); } text = array[0]; text2 = array[1]; text3 = array[2]; } if ((!string.IsNullOrEmpty(text) && 255 < text.Length) || (!string.IsNullOrEmpty(text2) && 255 < text2.Length) || (!string.IsNullOrEmpty(text3) && 255 < text3.Length)) { throw ADP.ArgumentOutOfRange("names"); } } byte b = GetActualPrecision(); byte actualScale = GetActualScale(); if (SqlDbType.Decimal == metaType.SqlDbType && b == 0) { b = 29; } List fields = null; SmiMetaDataPropertyCollection props = null; if (SqlDbType.Structured == metaType.SqlDbType) { GetActualFieldsAndProperties(out fields, out props, out peekAhead); } return new SmiParameterMetaData(metaType.SqlDbType, num2, b, actualScale, num3, sqlCompareOptions, SqlDbType.Structured == metaType.SqlDbType, fields, props, ParameterNameFixed, text, text2, text3, Direction); } private bool ShouldSerializePrecision() { return _precision != 0; } private bool ShouldSerializeScale() { return _scale != 0; } private bool ShouldSerializeSqlDbType() { return _metaType != null; } public void ResetSqlDbType() { if (_metaType != null) { PropertyTypeChanging(); _metaType = null; } } internal int GetActualSize() { MetaType metaType = InternalMetaType; SqlDbType sqlDbType = metaType.SqlDbType; if (_actualSize == -1 || sqlDbType == SqlDbType.Udt) { _actualSize = 0; object coercedValue = GetCoercedValue(); bool flag = false; if (IsNull && !metaType.IsVarTime) { return 0; } if (sqlDbType == SqlDbType.Variant) { metaType = MetaType.GetMetaTypeFromValue(coercedValue, inferLen: true, streamAllowed: false); sqlDbType = MetaType.GetSqlDataType(metaType.TDSType, 0u, 0).SqlDbType; flag = true; } if (metaType.IsFixed) { _actualSize = metaType.FixedLength; } else { int num = 0; switch (sqlDbType) { case SqlDbType.NChar: case SqlDbType.NText: case SqlDbType.NVarChar: case SqlDbType.Xml: num = ((!_isNull && !_coercedValueIsDataFeed) ? StringSize(coercedValue, _coercedValueIsSqlType) : 0); _actualSize = (ShouldSerializeSize() ? Size : 0); _actualSize = ((ShouldSerializeSize() && _actualSize <= num) ? _actualSize : num); if (_actualSize == -1) { _actualSize = num; } _actualSize <<= 1; break; case SqlDbType.Char: case SqlDbType.Text: case SqlDbType.VarChar: num = ((!_isNull && !_coercedValueIsDataFeed) ? StringSize(coercedValue, _coercedValueIsSqlType) : 0); _actualSize = (ShouldSerializeSize() ? Size : 0); _actualSize = ((ShouldSerializeSize() && _actualSize <= num) ? _actualSize : num); if (_actualSize == -1) { _actualSize = num; } break; case SqlDbType.Binary: case SqlDbType.Image: case SqlDbType.Timestamp: case SqlDbType.VarBinary: num = ((!_isNull && !_coercedValueIsDataFeed) ? BinarySize(coercedValue, _coercedValueIsSqlType) : 0); _actualSize = (ShouldSerializeSize() ? Size : 0); _actualSize = ((ShouldSerializeSize() && _actualSize <= num) ? _actualSize : num); if (_actualSize == -1) { _actualSize = num; } break; case SqlDbType.Udt: throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString()); case SqlDbType.Structured: num = -1; break; case SqlDbType.Time: _actualSize = (flag ? 5 : MetaType.GetTimeSizeFromScale(GetActualScale())); break; case SqlDbType.DateTime2: _actualSize = 3 + (flag ? 5 : MetaType.GetTimeSizeFromScale(GetActualScale())); break; case SqlDbType.DateTimeOffset: _actualSize = 5 + (flag ? 5 : MetaType.GetTimeSizeFromScale(GetActualScale())); break; } if (flag && num > 8000) { throw SQL.ParameterInvalidVariant(ParameterName); } } } return _actualSize; } internal static object CoerceValue(object value, MetaType destinationType, out bool coercedToDataFeed, out bool typeChanged, bool allowStreaming = true) { coercedToDataFeed = false; typeChanged = false; Type type = value.GetType(); if (typeof(object) != destinationType.ClassType && type != destinationType.ClassType && (type != destinationType.SqlType || SqlDbType.Xml == destinationType.SqlDbType)) { try { typeChanged = true; if (typeof(string) == destinationType.ClassType) { if (typeof(SqlXml) == type) { value = MetaType.GetStringFromXml(((SqlXml)value).CreateReader()); } else if (typeof(SqlString) == type) { typeChanged = false; } else if (typeof(XmlReader).IsAssignableFrom(type)) { if (allowStreaming) { coercedToDataFeed = true; value = new XmlDataFeed((XmlReader)value); } else { value = MetaType.GetStringFromXml((XmlReader)value); } } else if (typeof(char[]) == type) { value = new string((char[])value); } else if (typeof(SqlChars) == type) { 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, null); } } else if (DbType.Currency == destinationType.DbType && typeof(string) == type) { value = decimal.Parse((string)value, NumberStyles.Currency, null); } else if (typeof(SqlBytes) == type && typeof(byte[]) == destinationType.ClassType) { typeChanged = false; } else if (typeof(string) == type && SqlDbType.Time == destinationType.SqlDbType) { value = TimeSpan.Parse((string)value); } else if (typeof(string) == type && SqlDbType.DateTimeOffset == destinationType.SqlDbType) { value = DateTimeOffset.Parse((string)value, null); } else if (typeof(DateTime) == type && SqlDbType.DateTimeOffset == destinationType.SqlDbType) { value = new DateTimeOffset((DateTime)value); } else if (243 == destinationType.TDSType && (value is DataTable || value is DbDataReader || value is IEnumerable)) { 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, null); } } catch (Exception ex) { if (!ADP.IsCatchableExceptionType(ex)) { throw; } throw ADP.ParameterConversionFailed(value, destinationType.ClassType, ex); } } return value; } internal void FixStreamDataForNonPLP() { object coercedValue = GetCoercedValue(); if (!_coercedValueIsDataFeed) { return; } _coercedValueIsDataFeed = false; if (coercedValue is TextDataFeed) { if (Size > 0) { char[] array = new char[Size]; int length = ((TextDataFeed)coercedValue)._source.ReadBlock(array, 0, Size); CoercedValue = new string(array, 0, length); } else { CoercedValue = ((TextDataFeed)coercedValue)._source.ReadToEnd(); } } else if (coercedValue is StreamDataFeed) { if (Size > 0) { byte[] array2 = new byte[Size]; int i = 0; Stream source = ((StreamDataFeed)coercedValue)._source; int num; for (; i < Size; i += num) { num = source.Read(array2, i, Size - i); if (num == 0) { break; } } if (i < Size) { Array.Resize(ref array2, i); } CoercedValue = array2; } else { MemoryStream memoryStream = new MemoryStream(); ((StreamDataFeed)coercedValue)._source.CopyTo(memoryStream); CoercedValue = memoryStream.ToArray(); } } else if (coercedValue is XmlDataFeed) { CoercedValue = MetaType.GetStringFromXml(((XmlDataFeed)coercedValue)._source); } } internal byte GetActualPrecision() { if (!ShouldSerializePrecision()) { return ValuePrecision(CoercedValue); } return PrecisionInternal; } internal byte GetActualScale() { if (ShouldSerializeScale()) { return ScaleInternal; } if (GetMetaTypeOnly().IsVarTime) { return 7; } return ValueScale(CoercedValue); } internal int GetParameterSize() { if (!ShouldSerializeSize()) { return ValueSize(CoercedValue); } return Size; } private void GetActualFieldsAndProperties(out List fields, out SmiMetaDataPropertyCollection props, out ParameterPeekAheadValue peekAhead) { fields = null; props = null; peekAhead = null; object coercedValue = GetCoercedValue(); if (coercedValue is DataTable dataTable) { if (dataTable.Columns.Count <= 0) { throw SQL.NotEnoughColumnsInStructuredType(); } fields = new List(dataTable.Columns.Count); bool[] array = new bool[dataTable.Columns.Count]; bool flag = false; if (dataTable.PrimaryKey != null && dataTable.PrimaryKey.Length != 0) { DataColumn[] primaryKey = dataTable.PrimaryKey; foreach (DataColumn dataColumn in primaryKey) { array[dataColumn.Ordinal] = true; flag = true; } } for (int j = 0; j < dataTable.Columns.Count; j++) { fields.Add(MetaDataUtilsSmi.SmiMetaDataFromDataColumn(dataTable.Columns[j], dataTable)); if (!flag && dataTable.Columns[j].Unique) { array[j] = true; flag = true; } } if (flag) { props = new SmiMetaDataPropertyCollection(); props[SmiPropertySelector.UniqueKey] = new SmiUniqueKeyProperty(new List(array)); } return; } if (coercedValue is SqlDataReader) { fields = new List(((SqlDataReader)coercedValue).GetInternalSmiMetaData()); if (fields.Count <= 0) { throw SQL.NotEnoughColumnsInStructuredType(); } bool[] array2 = new bool[fields.Count]; bool flag2 = false; for (int k = 0; k < fields.Count; k++) { if (fields[k] is SmiQueryMetaData smiQueryMetaData && !smiQueryMetaData.IsKey.IsNull && smiQueryMetaData.IsKey.Value) { array2[k] = true; flag2 = true; } } if (flag2) { props = new SmiMetaDataPropertyCollection(); props[SmiPropertySelector.UniqueKey] = new SmiUniqueKeyProperty(new List(array2)); } return; } if (coercedValue is IEnumerable) { IEnumerator enumerator = ((IEnumerable)coercedValue).GetEnumerator(); SqlDataRecord sqlDataRecord = null; try { if (enumerator.MoveNext()) { sqlDataRecord = enumerator.Current; int fieldCount = sqlDataRecord.FieldCount; if (0 < fieldCount) { bool[] array3 = new bool[fieldCount]; bool[] array4 = new bool[fieldCount]; bool[] array5 = new bool[fieldCount]; int num = -1; bool flag3 = false; bool flag4 = false; int num2 = 0; SmiOrderProperty.SmiColumnOrder[] array6 = new SmiOrderProperty.SmiColumnOrder[fieldCount]; fields = new List(fieldCount); for (int l = 0; l < fieldCount; l++) { SqlMetaData sqlMetaData = sqlDataRecord.GetSqlMetaData(l); fields.Add(MetaDataUtilsSmi.SqlMetaDataToSmiExtendedMetaData(sqlMetaData)); if (sqlMetaData.IsUniqueKey) { array3[l] = true; flag3 = true; } if (sqlMetaData.UseServerDefault) { array4[l] = true; flag4 = true; } array6[l].Order = sqlMetaData.SortOrder; if (SortOrder.Unspecified != sqlMetaData.SortOrder) { if (fieldCount <= sqlMetaData.SortOrdinal) { throw SQL.SortOrdinalGreaterThanFieldCount(l, sqlMetaData.SortOrdinal); } if (array5[sqlMetaData.SortOrdinal]) { throw SQL.DuplicateSortOrdinal(sqlMetaData.SortOrdinal); } array6[l].SortOrdinal = sqlMetaData.SortOrdinal; array5[sqlMetaData.SortOrdinal] = true; if (sqlMetaData.SortOrdinal > num) { num = sqlMetaData.SortOrdinal; } num2++; } } if (flag3) { props = new SmiMetaDataPropertyCollection(); props[SmiPropertySelector.UniqueKey] = new SmiUniqueKeyProperty(new List(array3)); } if (flag4) { if (props == null) { props = new SmiMetaDataPropertyCollection(); } props[SmiPropertySelector.DefaultFields] = new SmiDefaultFieldsProperty(new List(array4)); } if (0 < num2) { if (num >= num2) { int m; for (m = 0; m < num2 && array5[m]; m++) { } throw SQL.MissingSortOrdinal(m); } if (props == null) { props = new SmiMetaDataPropertyCollection(); } props[SmiPropertySelector.SortOrder] = new SmiOrderProperty(new List(array6)); } peekAhead = new ParameterPeekAheadValue(); peekAhead.Enumerator = enumerator; peekAhead.FirstRecord = sqlDataRecord; enumerator = null; return; } throw SQL.NotEnoughColumnsInStructuredType(); } throw SQL.IEnumerableOfSqlDataRecordHasNoRows(); } finally { enumerator?.Dispose(); } } if (!(coercedValue is DbDataReader)) { return; } DataTable schemaTable = ((DbDataReader)coercedValue).GetSchemaTable(); if (schemaTable.Rows.Count <= 0) { throw SQL.NotEnoughColumnsInStructuredType(); } int count = schemaTable.Rows.Count; fields = new List(count); bool[] array7 = new bool[count]; bool flag5 = false; int ordinal = schemaTable.Columns[SchemaTableColumn.IsKey].Ordinal; int ordinal2 = schemaTable.Columns[SchemaTableColumn.ColumnOrdinal].Ordinal; for (int n = 0; n < count; n++) { DataRow dataRow = schemaTable.Rows[n]; SmiExtendedMetaData smiExtendedMetaData = MetaDataUtilsSmi.SmiMetaDataFromSchemaTableRow(dataRow); int num3 = n; if (!dataRow.IsNull(ordinal2)) { num3 = (int)dataRow[ordinal2]; } if (num3 >= count || num3 < 0) { throw SQL.InvalidSchemaTableOrdinals(); } while (num3 > fields.Count) { fields.Add(null); } if (fields.Count == num3) { fields.Add(smiExtendedMetaData); } else { if (fields[num3] != null) { throw SQL.InvalidSchemaTableOrdinals(); } fields[num3] = smiExtendedMetaData; } if (!dataRow.IsNull(ordinal) && (bool)dataRow[ordinal]) { array7[num3] = true; flag5 = true; } } if (flag5) { props = new SmiMetaDataPropertyCollection(); props[SmiPropertySelector.UniqueKey] = new SmiUniqueKeyProperty(new List(array7)); } } internal object GetCoercedValue() { if (_coercedValue == null || _internalMetaType.SqlDbType == SqlDbType.Udt) { bool flag = Value is DataFeed; if (IsNull || flag) { _coercedValue = Value; _coercedValueIsSqlType = _coercedValue != null && _isSqlParameterSqlType; _coercedValueIsDataFeed = flag; _actualSize = ((!IsNull) ? (-1) : 0); } else { _coercedValue = CoerceValue(Value, _internalMetaType, out _coercedValueIsDataFeed, out var typeChanged); _coercedValueIsSqlType = _isSqlParameterSqlType && !typeChanged; _actualSize = -1; } } return _coercedValue; } [Conditional("DEBUG")] internal void AssertCachedPropertiesAreValid() { } [Conditional("DEBUG")] internal void AssertPropertiesAreValid(object value, bool? isSqlType = null, bool? isDataFeed = null, bool? isNull = null) { } private SqlDbType GetMetaSqlDbTypeOnly() { MetaType metaType = _metaType; if (metaType == null) { metaType = MetaType.GetDefaultMetaType(); } return metaType.SqlDbType; } private MetaType GetMetaTypeOnly() { if (_metaType != null) { return _metaType; } if (_value != null && DBNull.Value != _value) { if (_value is char) { _value = _value.ToString(); } else if (Value is char[]) { _value = new string((char[])_value); } return MetaType.GetMetaTypeFromValue(_value, inferLen: false); } if (_sqlBufferReturnValue != null) { Type typeFromStorageType = _sqlBufferReturnValue.GetTypeFromStorageType(_isSqlParameterSqlType); if (null != typeFromStorageType) { return MetaType.GetMetaTypeFromType(typeFromStorageType); } } return MetaType.GetDefaultMetaType(); } internal void Prepare(SqlCommand cmd) { if (_metaType == null) { throw ADP.PrepareParameterType(cmd); } if (!ShouldSerializeSize() && !_metaType.IsFixed) { throw ADP.PrepareParameterSize(cmd); } if (!ShouldSerializePrecision() && !ShouldSerializeScale() && _metaType.SqlDbType == SqlDbType.Decimal) { throw ADP.PrepareParameterScale(cmd, SqlDbType.ToString()); } } private void PropertyChanging() { _internalMetaType = null; } private void PropertyTypeChanging() { PropertyChanging(); CoercedValue = null; } internal void SetSqlBuffer(SqlBuffer buff) { _sqlBufferReturnValue = buff; _value = null; _coercedValue = null; _isNull = _sqlBufferReturnValue.IsNull; _coercedValueIsDataFeed = false; _coercedValueIsSqlType = false; _actualSize = -1; } internal void Validate(int index, bool isCommandProc) { MetaType metaType = (_internalMetaType = GetMetaTypeOnly()); if (ADP.IsDirection(this, ParameterDirection.Output) && !ADP.IsDirection(this, ParameterDirection.ReturnValue) && !metaType.IsFixed && !ShouldSerializeSize() && (_value == null || _value == DBNull.Value) && SqlDbType != SqlDbType.Timestamp && SqlDbType != SqlDbType.Udt && SqlDbType != SqlDbType.Xml && !metaType.IsVarTime) { throw ADP.UninitializedParameterSize(index, metaType.ClassType); } if (metaType.SqlDbType != SqlDbType.Udt && Direction != ParameterDirection.Output) { GetCoercedValue(); } if (metaType.SqlDbType == SqlDbType.Structured) { if (!isCommandProc && string.IsNullOrEmpty(TypeName)) { throw SQL.MustSetTypeNameForParam(metaType.TypeName, ParameterName); } if (ParameterDirection.Input != Direction) { throw SQL.UnsupportedTVPOutputParameter(Direction, ParameterName); } if (DBNull.Value == GetCoercedValue()) { throw SQL.DBNullNotSupportedForTVPValues(ParameterName); } } else if (!string.IsNullOrEmpty(TypeName)) { throw SQL.UnexpectedTypeNameForNonStructParams(ParameterName); } } internal MetaType ValidateTypeLengths() { MetaType metaType = InternalMetaType; if (SqlDbType.Udt != metaType.SqlDbType && !metaType.IsFixed && !metaType.IsLong) { long num = GetActualSize(); long num2 = Size; long num3 = 0L; num3 = ((!metaType.IsNCharType) ? ((num2 > num) ? num2 : num) : ((num2 * 2 > num) ? (num2 * 2) : num)); if (num3 > 8000 || _coercedValueIsDataFeed || num2 == -1 || num == -1) { metaType = (InternalMetaType = (_metaType = MetaType.GetMaxMetaTypeFromMetaType(metaType))); if (!metaType.IsPlp) { if (metaType.SqlDbType == SqlDbType.Xml) { throw ADP.InvalidMetaDataValue(); } if (metaType.SqlDbType == SqlDbType.NVarChar || metaType.SqlDbType == SqlDbType.VarChar || metaType.SqlDbType == SqlDbType.VarBinary) { Size = -1; } } } } return metaType; } private byte ValuePrecision(object value) { if (value is SqlDecimal sqlDecimal) { if (sqlDecimal.IsNull) { return 0; } return ((SqlDecimal)value).Precision; } return ValuePrecisionCore(value); } private byte ValueScale(object value) { if (value is SqlDecimal sqlDecimal) { if (sqlDecimal.IsNull) { return 0; } return ((SqlDecimal)value).Scale; } return ValueScaleCore(value); } private static int StringSize(object value, bool isSqlType) { if (isSqlType) { if (value is SqlString sqlString) { return sqlString.Value.Length; } if (value is SqlChars) { return ((SqlChars)value).Value.Length; } } else { if (value is string text) { return text.Length; } if (value is char[] array) { return array.Length; } if (value is char) { return 1; } } return 0; } private static int BinarySize(object value, bool isSqlType) { if (isSqlType) { if (value is SqlBinary sqlBinary) { return sqlBinary.Length; } if (value is SqlBytes) { return ((SqlBytes)value).Value.Length; } } else { if (value is byte[] array) { return array.Length; } if (value is byte) { return 1; } } return 0; } private int ValueSize(object value) { if (value is SqlString sqlString) { if (sqlString.IsNull) { return 0; } return ((SqlString)value).Value.Length; } if (value is SqlChars) { if (((SqlChars)value).IsNull) { return 0; } return ((SqlChars)value).Value.Length; } if (value is SqlBinary sqlBinary) { if (sqlBinary.IsNull) { return 0; } return ((SqlBinary)value).Length; } if (value is SqlBytes) { if (((SqlBytes)value).IsNull) { return 0; } return (int)((SqlBytes)value).Length; } if (value is DataFeed) { return 0; } return ValueSizeCore(value); } internal static string[] ParseTypeName(string typeName) { try { string property = "SqlParameter.TypeName is an invalid multipart name"; return MultipartIdentifier.ParseMultipartIdentifier(typeName, "[\"", "]\"", '.', 3, removequotes: true, property, ThrowOnEmptyMultipartName: true); } catch (ArgumentException) { throw SQL.InvalidParameterTypeNameFormat(); } } object ICloneable.Clone() { return new SqlParameter(this); } private void CloneHelper(SqlParameter destination) { CloneHelperCore(destination); destination._metaType = _metaType; destination._collation = _collation; destination._xmlSchemaCollectionDatabase = _xmlSchemaCollectionDatabase; destination._xmlSchemaCollectionOwningSchema = _xmlSchemaCollectionOwningSchema; destination._xmlSchemaCollectionName = _xmlSchemaCollectionName; destination._typeName = _typeName; destination._parameterName = _parameterName; destination._precision = _precision; destination._scale = _scale; destination._sqlBufferReturnValue = _sqlBufferReturnValue; destination._isSqlParameterSqlType = _isSqlParameterSqlType; destination._internalMetaType = _internalMetaType; destination.CoercedValue = CoercedValue; destination._valueAsINullable = _valueAsINullable; destination._isNull = _isNull; destination._coercedValueIsDataFeed = _coercedValueIsDataFeed; destination._coercedValueIsSqlType = _coercedValueIsSqlType; destination._actualSize = _actualSize; } private void CloneHelperCore(SqlParameter destination) { destination._value = _value; destination._direction = _direction; destination._size = _size; destination._offset = _offset; destination._sourceColumn = _sourceColumn; destination._sourceVersion = _sourceVersion; destination._sourceColumnNullMapping = _sourceColumnNullMapping; destination._isNullable = _isNullable; } private bool ShouldSerializeSize() { return _size != 0; } internal object CompareExchangeParent(object value, object comparand) { object parent = _parent; if (comparand == parent) { _parent = value; } return parent; } internal void ResetParent() { _parent = null; } public override string ToString() { return ParameterName; } private byte ValuePrecisionCore(object value) { if (value is decimal) { return ((SqlDecimal)(decimal)value).Precision; } return 0; } private byte ValueScaleCore(object value) { if (value is decimal) { return (byte)((decimal.GetBits((decimal)value)[3] & 0xFF0000) >> 16); } return 0; } private int ValueSizeCore(object value) { if (!ADP.IsNull(value)) { if (value is string text) { return text.Length; } if (value is byte[] array) { return array.Length; } if (value is char[] array2) { return array2.Length; } if (value is byte || value is char) { return 1; } } return 0; } internal void CopyTo(SqlParameter destination) { ADP.CheckArgumentNull(destination, "destination"); destination._value = _value; destination._direction = _direction; destination._size = _size; destination._offset = _offset; destination._sourceColumn = _sourceColumn; destination._sourceVersion = _sourceVersion; destination._sourceColumnNullMapping = _sourceColumnNullMapping; destination._isNullable = _isNullable; } } public sealed class SqlParameterCollection : DbParameterCollection, ICollection, IEnumerable, IList, IDataParameterCollection { private bool _isDirty; private static Type s_itemType = typeof(SqlParameter); private List _items; internal bool IsDirty { get { return _isDirty; } set { _isDirty = value; } } public new SqlParameter this[int index] { get { return (SqlParameter)GetParameter(index); } set { SetParameter(index, value); } } public new SqlParameter this[string parameterName] { get { return (SqlParameter)GetParameter(parameterName); } set { SetParameter(parameterName, value); } } public override int Count { get { if (_items == null) { return 0; } return _items.Count; } } private List InnerList { get { List list = _items; if (list == null) { list = (_items = new List()); } return list; } } public override object SyncRoot => ((ICollection)InnerList).SyncRoot; internal SqlParameterCollection() { } public SqlParameter Add(SqlParameter value) { Add((object)value); return value; } public SqlParameter AddWithValue(string parameterName, object value) { return Add(new SqlParameter(parameterName, value)); } public SqlParameter Add(string parameterName, SqlDbType sqlDbType) { return Add(new SqlParameter(parameterName, sqlDbType)); } public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size) { return Add(new SqlParameter(parameterName, sqlDbType, size)); } public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size, string sourceColumn) { return Add(new SqlParameter(parameterName, sqlDbType, size, sourceColumn)); } public void AddRange(SqlParameter[] values) { AddRange((Array)values); } public override bool Contains(string value) { return -1 != IndexOf(value); } public bool Contains(SqlParameter value) { return -1 != IndexOf(value); } public void CopyTo(SqlParameter[] array, int index) { CopyTo((Array)array, index); } public int IndexOf(SqlParameter value) { return IndexOf((object)value); } public void Insert(int index, SqlParameter value) { Insert(index, (object)value); } private void OnChange() { IsDirty = true; } public void Remove(SqlParameter value) { Remove((object)value); } [EditorBrowsable(EditorBrowsableState.Never)] public override int Add(object value) { OnChange(); ValidateType(value); Validate(-1, value); InnerList.Add((SqlParameter)value); return Count - 1; } public override void AddRange(Array values) { OnChange(); if (values == null) { throw ADP.ArgumentNull("values"); } foreach (object value in values) { ValidateType(value); } foreach (SqlParameter value2 in values) { Validate(-1, value2); InnerList.Add(value2); } } private int CheckName(string parameterName) { int num = IndexOf(parameterName); if (num < 0) { throw ADP.ParametersSourceIndex(parameterName, this, s_itemType); } return num; } public override void Clear() { OnChange(); List innerList = InnerList; if (innerList == null) { return; } foreach (SqlParameter item in innerList) { item.ResetParent(); } innerList.Clear(); } public override bool Contains(object value) { return -1 != IndexOf(value); } public override void CopyTo(Array array, int index) { ((ICollection)InnerList).CopyTo(array, index); } public override IEnumerator GetEnumerator() { return ((IEnumerable)InnerList).GetEnumerator(); } protected override DbParameter GetParameter(int index) { RangeCheck(index); return InnerList[index]; } protected override DbParameter GetParameter(string parameterName) { int num = IndexOf(parameterName); if (num < 0) { throw ADP.ParametersSourceIndex(parameterName, this, s_itemType); } return InnerList[num]; } private static int IndexOf(IEnumerable items, string parameterName) { if (items != null) { int num = 0; foreach (SqlParameter item in items) { if (parameterName == item.ParameterName) { return num; } num++; } num = 0; foreach (SqlParameter item2 in items) { if (ADP.DstCompare(parameterName, item2.ParameterName) == 0) { return num; } num++; } } return -1; } public override int IndexOf(string parameterName) { return IndexOf(InnerList, parameterName); } public override int IndexOf(object value) { if (value != null) { ValidateType(value); List innerList = InnerList; if (innerList != null) { int count = innerList.Count; for (int i = 0; i < count; i++) { if (value == innerList[i]) { return i; } } } } return -1; } public override void Insert(int index, object value) { OnChange(); ValidateType(value); Validate(-1, (SqlParameter)value); InnerList.Insert(index, (SqlParameter)value); } private void RangeCheck(int index) { if (index < 0 || Count <= index) { throw ADP.ParametersMappingIndex(index, this); } } public override void Remove(object value) { OnChange(); ValidateType(value); int num = IndexOf(value); if (-1 != num) { RemoveIndex(num); } else if (this != ((SqlParameter)value).CompareExchangeParent(null, this)) { throw ADP.CollectionRemoveInvalidObject(s_itemType, this); } } public override void RemoveAt(int index) { OnChange(); RangeCheck(index); RemoveIndex(index); } public override void RemoveAt(string parameterName) { OnChange(); int index = CheckName(parameterName); RemoveIndex(index); } private void RemoveIndex(int index) { List innerList = InnerList; SqlParameter sqlParameter = innerList[index]; innerList.RemoveAt(index); sqlParameter.ResetParent(); } private void Replace(int index, object newValue) { List innerList = InnerList; ValidateType(newValue); Validate(index, newValue); SqlParameter sqlParameter = innerList[index]; innerList[index] = (SqlParameter)newValue; sqlParameter.ResetParent(); } protected override void SetParameter(int index, DbParameter value) { OnChange(); RangeCheck(index); Replace(index, value); } protected override void SetParameter(string parameterName, DbParameter value) { OnChange(); int num = IndexOf(parameterName); if (num < 0) { throw ADP.ParametersSourceIndex(parameterName, this, s_itemType); } Replace(num, value); } private void Validate(int index, object value) { if (value == null) { throw ADP.ParameterNull("value", this, s_itemType); } object obj = ((SqlParameter)value).CompareExchangeParent(this, null); if (obj != null) { if (this != obj) { throw ADP.ParametersIsNotParent(s_itemType, this); } if (index != IndexOf(value)) { throw ADP.ParametersIsParent(s_itemType, this); } } string parameterName = ((SqlParameter)value).ParameterName; if (parameterName.Length == 0) { index = 1; do { parameterName = "Parameter" + index.ToString(CultureInfo.CurrentCulture); index++; } while (-1 != IndexOf(parameterName)); ((SqlParameter)value).ParameterName = parameterName; } } private void ValidateType(object value) { if (value == null) { throw ADP.ParameterNull("value", this, s_itemType); } if (!s_itemType.IsInstanceOfType(value)) { throw ADP.InvalidParameterType(this, s_itemType, value); } } public SqlParameter Add(string parameterName, object value) { return Add(new SqlParameter(parameterName, value)); } } internal sealed class SqlReferenceCollection : DbReferenceCollection { internal const int DataReaderTag = 1; internal const int CommandTag = 2; internal const int BulkCopyTag = 3; public override void Add(object value, int tag) { AddItem(value, tag); } internal void Deactivate() { Notify(0); } internal SqlDataReader FindLiveReader(SqlCommand command) { if (command == null) { return FindItem(1, (SqlDataReader dataReader) => !dataReader.IsClosed); } return FindItem(1, (SqlDataReader dataReader) => !dataReader.IsClosed && command == dataReader.Command); } internal SqlCommand FindLiveCommand(TdsParserStateObject stateObj) { return FindItem(2, (SqlCommand command) => command.StateObject == stateObj); } protected override void NotifyItem(int message, int tag, object value) { switch (tag) { case 1: { SqlDataReader sqlDataReader = (SqlDataReader)value; if (!sqlDataReader.IsClosed) { sqlDataReader.CloseReaderFromConnection(); } break; } case 2: ((SqlCommand)value).OnConnectionClosed(); break; case 3: ((SqlBulkCopy)value).OnConnectionClosed(); break; } } public override void Remove(object value) { RemoveItem(value); } } public sealed class SqlRowUpdatedEventArgs : RowUpdatedEventArgs { public new SqlCommand Command => (SqlCommand)base.Command; public SqlRowUpdatedEventArgs(DataRow row, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) : base(row, command, statementType, tableMapping) { } } public delegate void SqlRowUpdatedEventHandler(object sender, SqlRowUpdatedEventArgs e); public sealed class SqlRowUpdatingEventArgs : RowUpdatingEventArgs { public new SqlCommand Command { get { return base.Command as SqlCommand; } set { base.Command = value; } } protected override IDbCommand BaseCommand { get { return base.BaseCommand; } set { base.BaseCommand = value as SqlCommand; } } public SqlRowUpdatingEventArgs(DataRow row, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) : base(row, command, statementType, tableMapping) { } } public delegate void SqlRowUpdatingEventHandler(object sender, SqlRowUpdatingEventArgs e); internal sealed class SqlSequentialStream : Stream { private SqlDataReader _reader; private int _columnIndex; private Task _currentTask; private int _readTimeout; private CancellationTokenSource _disposalTokenSource; public override bool CanRead { get { if (_reader != null) { return !_reader.IsClosed; } return false; } } public override bool CanSeek => false; public override bool CanTimeout => true; public override bool CanWrite => false; public override long Length { get { throw ADP.NotSupported(); } } public override long Position { get { throw ADP.NotSupported(); } set { throw ADP.NotSupported(); } } public override int ReadTimeout { get { return _readTimeout; } set { if (value > 0 || value == -1) { _readTimeout = value; return; } throw ADP.ArgumentOutOfRange("value"); } } internal int ColumnIndex => _columnIndex; internal SqlSequentialStream(SqlDataReader reader, int columnIndex) { _reader = reader; _columnIndex = columnIndex; _currentTask = null; _disposalTokenSource = new CancellationTokenSource(); if (reader.Command != null && reader.Command.CommandTimeout != 0) { _readTimeout = (int)Math.Min((long)reader.Command.CommandTimeout * 1000L, 2147483647L); } else { _readTimeout = -1; } } public override void Flush() { } public override int Read(byte[] buffer, int offset, int count) { ValidateReadParameters(buffer, offset, count); if (!CanRead) { throw ADP.ObjectDisposed(this); } if (_currentTask != null) { throw ADP.AsyncOperationPending(); } try { return _reader.GetBytesInternalSequential(_columnIndex, buffer, offset, count, _readTimeout); } catch (SqlException internalException) { throw ADP.ErrorReadingFromStream(internalException); } } public override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { ValidateReadParameters(buffer, offset, count); TaskCompletionSource completion = new TaskCompletionSource(); if (!CanRead) { completion.SetException(ADP.ExceptionWithStackTrace(ADP.ObjectDisposed(this))); } else { try { if (Interlocked.CompareExchange(ref _currentTask, completion.Task, null) != null) { completion.SetException(ADP.ExceptionWithStackTrace(ADP.AsyncOperationPending())); } else { CancellationTokenSource combinedTokenSource; if (!cancellationToken.CanBeCanceled) { combinedTokenSource = _disposalTokenSource; } else { combinedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, _disposalTokenSource.Token); } int bytesRead = 0; Task task = null; SqlDataReader reader = _reader; if (reader != null && !cancellationToken.IsCancellationRequested && !_disposalTokenSource.Token.IsCancellationRequested) { task = reader.GetBytesAsync(_columnIndex, buffer, offset, count, _readTimeout, combinedTokenSource.Token, out bytesRead); } if (task == null) { _currentTask = null; if (cancellationToken.IsCancellationRequested) { completion.SetCanceled(); } else if (!CanRead) { completion.SetException(ADP.ExceptionWithStackTrace(ADP.ObjectDisposed(this))); } else { completion.SetResult(bytesRead); } if (combinedTokenSource != _disposalTokenSource) { combinedTokenSource.Dispose(); } } else { task.ContinueWith(delegate(Task t) { _currentTask = null; if (t.Status == TaskStatus.RanToCompletion && CanRead) { completion.SetResult(t.Result); } else if (t.Status == TaskStatus.Faulted) { if (t.Exception.InnerException is SqlException) { completion.SetException(ADP.ExceptionWithStackTrace(ADP.ErrorReadingFromStream(t.Exception.InnerException))); } else { completion.SetException(t.Exception.InnerException); } } else if (!CanRead) { completion.SetException(ADP.ExceptionWithStackTrace(ADP.ObjectDisposed(this))); } else { completion.SetCanceled(); } if (combinedTokenSource != _disposalTokenSource) { combinedTokenSource.Dispose(); } }, TaskScheduler.Default); } } } catch (Exception exception) { completion.TrySetException(exception); Interlocked.CompareExchange(ref _currentTask, null, completion.Task); throw; } } return completion.Task; } public override IAsyncResult BeginRead(byte[] array, int offset, int count, AsyncCallback asyncCallback, object asyncState) { return System.Threading.Tasks.TaskToApm.Begin(ReadAsync(array, offset, count, CancellationToken.None), asyncCallback, asyncState); } public override int EndRead(IAsyncResult asyncResult) { return System.Threading.Tasks.TaskToApm.End(asyncResult); } public override long Seek(long offset, SeekOrigin origin) { throw ADP.NotSupported(); } public override void SetLength(long value) { throw ADP.NotSupported(); } public override void Write(byte[] buffer, int offset, int count) { throw ADP.NotSupported(); } internal void SetClosed() { _disposalTokenSource.Cancel(); _reader = null; ((IAsyncResult)_currentTask)?.AsyncWaitHandle.WaitOne(); } protected override void Dispose(bool disposing) { if (disposing) { SetClosed(); } base.Dispose(disposing); } internal static void ValidateReadParameters(byte[] buffer, int offset, int count) { if (buffer == null) { throw ADP.ArgumentNull("buffer"); } if (offset < 0) { throw ADP.ArgumentOutOfRange("offset"); } if (count < 0) { throw ADP.ArgumentOutOfRange("count"); } try { if (checked(offset + count) > buffer.Length) { throw ExceptionBuilder.InvalidOffsetLength(); } } catch (OverflowException) { throw ExceptionBuilder.InvalidOffsetLength(); } } } internal sealed class SqlSequentialTextReader : TextReader { private SqlDataReader _reader; private int _columnIndex; private Encoding _encoding; private Decoder _decoder; private byte[] _leftOverBytes; private int _peekedChar; private Task _currentTask; private CancellationTokenSource _disposalTokenSource; internal int ColumnIndex => _columnIndex; private bool IsClosed => _reader == null; private bool HasPeekedChar => _peekedChar >= 0; internal SqlSequentialTextReader(SqlDataReader reader, int columnIndex, Encoding encoding) { _reader = reader; _columnIndex = columnIndex; _encoding = encoding; _decoder = encoding.GetDecoder(); _leftOverBytes = null; _peekedChar = -1; _currentTask = null; _disposalTokenSource = new CancellationTokenSource(); } public override int Peek() { if (_currentTask != null) { throw ADP.AsyncOperationPending(); } if (IsClosed) { throw ADP.ObjectDisposed(this); } if (!HasPeekedChar) { _peekedChar = Read(); } return _peekedChar; } public override int Read() { if (_currentTask != null) { throw ADP.AsyncOperationPending(); } if (IsClosed) { throw ADP.ObjectDisposed(this); } int result = -1; if (HasPeekedChar) { result = _peekedChar; _peekedChar = -1; } else { char[] array = new char[1]; if (InternalRead(array, 0, 1) == 1) { result = array[0]; } } return result; } public override int Read(char[] buffer, int index, int count) { ValidateReadParameters(buffer, index, count); if (IsClosed) { throw ADP.ObjectDisposed(this); } if (_currentTask != null) { throw ADP.AsyncOperationPending(); } int num = 0; int num2 = count; if (num2 > 0 && HasPeekedChar) { buffer[index + num] = (char)_peekedChar; num++; num2--; _peekedChar = -1; } return num + InternalRead(buffer, index + num, num2); } public override Task ReadAsync(char[] buffer, int index, int count) { ValidateReadParameters(buffer, index, count); TaskCompletionSource completion = new TaskCompletionSource(); if (IsClosed) { completion.SetException(ADP.ExceptionWithStackTrace(ADP.ObjectDisposed(this))); } else { try { if (Interlocked.CompareExchange(ref _currentTask, completion.Task, null) != null) { completion.SetException(ADP.ExceptionWithStackTrace(ADP.AsyncOperationPending())); } else { bool flag = true; int charsRead = 0; int adjustedIndex = index; int charsNeeded = count; if (HasPeekedChar && charsNeeded > 0) { int peekedChar = _peekedChar; if (peekedChar >= 0) { buffer[adjustedIndex] = (char)peekedChar; adjustedIndex++; charsRead++; charsNeeded--; _peekedChar = -1; } } int byteBufferUsed; byte[] byteBuffer = PrepareByteBuffer(charsNeeded, out byteBufferUsed); if (byteBufferUsed < byteBuffer.Length || byteBuffer.Length == 0) { SqlDataReader reader = _reader; if (reader != null) { int bytesRead; Task bytesAsync = reader.GetBytesAsync(_columnIndex, byteBuffer, byteBufferUsed, byteBuffer.Length - byteBufferUsed, -1, _disposalTokenSource.Token, out bytesRead); if (bytesAsync == null) { byteBufferUsed += bytesRead; } else { flag = false; bytesAsync.ContinueWith(delegate(Task t) { _currentTask = null; if (t.Status == TaskStatus.RanToCompletion && !IsClosed) { try { int result = t.Result; byteBufferUsed += result; if (byteBufferUsed > 0) { charsRead += DecodeBytesToChars(byteBuffer, byteBufferUsed, buffer, adjustedIndex, charsNeeded); } completion.SetResult(charsRead); return; } catch (Exception exception2) { completion.SetException(exception2); return; } } if (IsClosed) { completion.SetException(ADP.ExceptionWithStackTrace(ADP.ObjectDisposed(this))); } else if (t.Status == TaskStatus.Faulted) { if (t.Exception.InnerException is SqlException) { completion.SetException(ADP.ExceptionWithStackTrace(ADP.ErrorReadingFromStream(t.Exception.InnerException))); } else { completion.SetException(t.Exception.InnerException); } } else { completion.SetCanceled(); } }, TaskScheduler.Default); } if (flag && byteBufferUsed > 0) { charsRead += DecodeBytesToChars(byteBuffer, byteBufferUsed, buffer, adjustedIndex, charsNeeded); } } else { completion.SetException(ADP.ExceptionWithStackTrace(ADP.ObjectDisposed(this))); } } if (flag) { _currentTask = null; if (IsClosed) { completion.SetCanceled(); } else { completion.SetResult(charsRead); } } } } catch (Exception exception) { completion.TrySetException(exception); Interlocked.CompareExchange(ref _currentTask, null, completion.Task); throw; } } return completion.Task; } protected override void Dispose(bool disposing) { if (disposing) { SetClosed(); } base.Dispose(disposing); } internal void SetClosed() { _disposalTokenSource.Cancel(); _reader = null; _peekedChar = -1; ((IAsyncResult)_currentTask)?.AsyncWaitHandle.WaitOne(); } private int InternalRead(char[] buffer, int index, int count) { try { int byteBufferUsed; byte[] array = PrepareByteBuffer(count, out byteBufferUsed); byteBufferUsed += _reader.GetBytesInternalSequential(_columnIndex, array, byteBufferUsed, array.Length - byteBufferUsed); if (byteBufferUsed > 0) { return DecodeBytesToChars(array, byteBufferUsed, buffer, index, count); } return 0; } catch (SqlException internalException) { throw ADP.ErrorReadingFromStream(internalException); } } private byte[] PrepareByteBuffer(int numberOfChars, out int byteBufferUsed) { byte[] array; if (numberOfChars == 0) { array = Array.Empty(); byteBufferUsed = 0; } else { int maxByteCount = _encoding.GetMaxByteCount(numberOfChars); if (_leftOverBytes != null) { if (_leftOverBytes.Length > maxByteCount) { array = _leftOverBytes; byteBufferUsed = array.Length; } else { array = new byte[maxByteCount]; Buffer.BlockCopy(_leftOverBytes, 0, array, 0, _leftOverBytes.Length); byteBufferUsed = _leftOverBytes.Length; } } else { array = new byte[maxByteCount]; byteBufferUsed = 0; } } return array; } private int DecodeBytesToChars(byte[] inBuffer, int inBufferCount, char[] outBuffer, int outBufferOffset, int outBufferCount) { _decoder.Convert(inBuffer, 0, inBufferCount, outBuffer, outBufferOffset, outBufferCount, flush: false, out var bytesUsed, out var charsUsed, out var completed); if (!completed && bytesUsed < inBufferCount) { _leftOverBytes = new byte[inBufferCount - bytesUsed]; Buffer.BlockCopy(inBuffer, bytesUsed, _leftOverBytes, 0, _leftOverBytes.Length); } else { _leftOverBytes = null; } return charsUsed; } internal static void ValidateReadParameters(char[] buffer, int index, int count) { if (buffer == null) { throw ADP.ArgumentNull("buffer"); } if (index < 0) { throw ADP.ArgumentOutOfRange("index"); } if (count < 0) { throw ADP.ArgumentOutOfRange("count"); } try { if (checked(index + count) > buffer.Length) { throw ExceptionBuilder.InvalidOffsetLength(); } } catch (OverflowException) { throw ExceptionBuilder.InvalidOffsetLength(); } } } internal sealed class SqlUnicodeEncoding : UnicodeEncoding { private sealed class SqlUnicodeDecoder : Decoder { public override int GetCharCount(byte[] bytes, int index, int count) { return count / 2; } public override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex) { Convert(bytes, byteIndex, byteCount, chars, charIndex, chars.Length - charIndex, flush: true, out var _, out var charsUsed, out var _); return charsUsed; } public override void Convert(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex, int charCount, bool flush, out int bytesUsed, out int charsUsed, out bool completed) { charsUsed = Math.Min(charCount, byteCount / 2); bytesUsed = charsUsed * 2; completed = bytesUsed == byteCount; Buffer.BlockCopy(bytes, byteIndex, chars, charIndex * 2, bytesUsed); } } private static SqlUnicodeEncoding s_singletonEncoding = new SqlUnicodeEncoding(); public static Encoding SqlUnicodeEncodingInstance => s_singletonEncoding; private SqlUnicodeEncoding() : base(bigEndian: false, byteOrderMark: false, throwOnInvalidBytes: false) { } public override Decoder GetDecoder() { return new SqlUnicodeDecoder(); } public override int GetMaxByteCount(int charCount) { return charCount * 2; } } internal sealed class SqlStatistics { private sealed class StatisticsDictionary : Dictionary, IDictionary, ICollection, IEnumerable { private sealed class Collection : ICollection, IEnumerable { private readonly StatisticsDictionary _dictionary; private readonly ICollection _collection; int ICollection.Count => _collection.Count; bool ICollection.IsSynchronized => _collection.IsSynchronized; object ICollection.SyncRoot => _collection.SyncRoot; public Collection(StatisticsDictionary dictionary, ICollection collection) { _dictionary = dictionary; _collection = collection; } void ICollection.CopyTo(Array array, int arrayIndex) { if (_collection is KeyCollection) { _dictionary.CopyKeys(array, arrayIndex); } else { _dictionary.CopyValues(array, arrayIndex); } } IEnumerator IEnumerable.GetEnumerator() { return _collection.GetEnumerator(); } } private Collection _keys; private Collection _values; ICollection IDictionary.Keys => _keys ?? (_keys = new Collection(this, base.Keys)); ICollection IDictionary.Values => _values ?? (_values = new Collection(this, base.Values)); public StatisticsDictionary(int capacity) : base(capacity) { } IEnumerator IEnumerable.GetEnumerator() { return ((IDictionary)this).GetEnumerator(); } void ICollection.CopyTo(Array array, int arrayIndex) { ValidateCopyToArguments(array, arrayIndex); using Enumerator enumerator = GetEnumerator(); while (enumerator.MoveNext()) { KeyValuePair current = enumerator.Current; DictionaryEntry dictionaryEntry = new DictionaryEntry(current.Key, current.Value); array.SetValue(dictionaryEntry, arrayIndex++); } } private void CopyKeys(Array array, int arrayIndex) { ValidateCopyToArguments(array, arrayIndex); using Enumerator enumerator = GetEnumerator(); while (enumerator.MoveNext()) { array.SetValue(enumerator.Current.Key, arrayIndex++); } } private void CopyValues(Array array, int arrayIndex) { ValidateCopyToArguments(array, arrayIndex); using Enumerator enumerator = GetEnumerator(); while (enumerator.MoveNext()) { array.SetValue(enumerator.Current.Value, arrayIndex++); } } private void ValidateCopyToArguments(Array array, int arrayIndex) { if (array == null) { throw new ArgumentNullException("array"); } if (array.Rank != 1) { throw new ArgumentException("Only single dimensional arrays are supported for the requested action."); } if (arrayIndex < 0) { throw new ArgumentOutOfRangeException("arrayIndex", "Non-negative number required."); } if (array.Length - arrayIndex < base.Count) { throw new ArgumentException("Destination array is not long enough to copy all the items in the collection. Check array index and length."); } } } internal long _closeTimestamp; internal long _openTimestamp; internal long _startExecutionTimestamp; internal long _startFetchTimestamp; internal long _startNetworkServerTimestamp; internal long _buffersReceived; internal long _buffersSent; internal long _bytesReceived; internal long _bytesSent; internal long _connectionTime; internal long _cursorOpens; internal long _executionTime; internal long _iduCount; internal long _iduRows; internal long _networkServerTime; internal long _preparedExecs; internal long _prepares; internal long _selectCount; internal long _selectRows; internal long _serverRoundtrips; internal long _sumResultSets; internal long _transactions; internal long _unpreparedExecs; private bool _waitForDoneAfterRow; private bool _waitForReply; internal bool WaitForDoneAfterRow { get { return _waitForDoneAfterRow; } set { _waitForDoneAfterRow = value; } } internal bool WaitForReply => _waitForReply; internal static SqlStatistics StartTimer(SqlStatistics statistics) { if (statistics != null && !statistics.RequestExecutionTimer()) { statistics = null; } return statistics; } internal static void StopTimer(SqlStatistics statistics) { statistics?.ReleaseAndUpdateExecutionTimer(); } internal SqlStatistics() { } internal void ContinueOnNewConnection() { _startExecutionTimestamp = 0L; _startFetchTimestamp = 0L; _waitForDoneAfterRow = false; _waitForReply = false; } internal IDictionary GetDictionary() { return new StatisticsDictionary(18) { { "BuffersReceived", _buffersReceived }, { "BuffersSent", _buffersSent }, { "BytesReceived", _bytesReceived }, { "BytesSent", _bytesSent }, { "CursorOpens", _cursorOpens }, { "IduCount", _iduCount }, { "IduRows", _iduRows }, { "PreparedExecs", _preparedExecs }, { "Prepares", _prepares }, { "SelectCount", _selectCount }, { "SelectRows", _selectRows }, { "ServerRoundtrips", _serverRoundtrips }, { "SumResultSets", _sumResultSets }, { "Transactions", _transactions }, { "UnpreparedExecs", _unpreparedExecs }, { "ConnectionTime", ADP.TimerToMilliseconds(_connectionTime) }, { "ExecutionTime", ADP.TimerToMilliseconds(_executionTime) }, { "NetworkServerTime", ADP.TimerToMilliseconds(_networkServerTime) } }; } internal bool RequestExecutionTimer() { if (_startExecutionTimestamp == 0L) { ADP.TimerCurrent(out _startExecutionTimestamp); return true; } return false; } internal void RequestNetworkServerTimer() { if (_startNetworkServerTimestamp == 0L) { ADP.TimerCurrent(out _startNetworkServerTimestamp); } _waitForReply = true; } internal void ReleaseAndUpdateExecutionTimer() { if (_startExecutionTimestamp > 0) { _executionTime += ADP.TimerCurrent() - _startExecutionTimestamp; _startExecutionTimestamp = 0L; } } internal void ReleaseAndUpdateNetworkServerTimer() { if (_waitForReply && _startNetworkServerTimestamp > 0) { _networkServerTime += ADP.TimerCurrent() - _startNetworkServerTimestamp; _startNetworkServerTimestamp = 0L; } _waitForReply = false; } internal void Reset() { _buffersReceived = 0L; _buffersSent = 0L; _bytesReceived = 0L; _bytesSent = 0L; _connectionTime = 0L; _cursorOpens = 0L; _executionTime = 0L; _iduCount = 0L; _iduRows = 0L; _networkServerTime = 0L; _preparedExecs = 0L; _prepares = 0L; _selectCount = 0L; _selectRows = 0L; _serverRoundtrips = 0L; _sumResultSets = 0L; _transactions = 0L; _unpreparedExecs = 0L; _waitForDoneAfterRow = false; _waitForReply = false; _startExecutionTimestamp = 0L; _startNetworkServerTimestamp = 0L; } internal void SafeAdd(ref long value, long summand) { if (long.MaxValue - value > summand) { value += summand; } else { value = long.MaxValue; } } internal long SafeIncrement(ref long value) { if (value < long.MaxValue) { value++; } return value; } internal void UpdateStatistics() { if (_closeTimestamp >= _openTimestamp) { SafeAdd(ref _connectionTime, _closeTimestamp - _openTimestamp); } else { _connectionTime = long.MaxValue; } } } internal sealed class SqlStream : Stream { private SqlDataReader _reader; private int _columnOrdinal; private long _bytesCol; private int _bom; private byte[] _bufferedData; private bool _processAllRows; private bool _advanceReader; private bool _readFirstRow; private bool _endOfColumn; public override bool CanRead => true; public override bool CanSeek => false; public override bool CanWrite => false; public override long Length { get { throw ADP.NotSupported(); } } public override long Position { get { throw ADP.NotSupported(); } set { throw ADP.NotSupported(); } } internal SqlStream(SqlDataReader reader, bool addByteOrderMark, bool processAllRows) : this(0, reader, addByteOrderMark, processAllRows, advanceReader: true) { } internal SqlStream(int columnOrdinal, SqlDataReader reader, bool addByteOrderMark, bool processAllRows, bool advanceReader) { _columnOrdinal = columnOrdinal; _reader = reader; _bom = (addByteOrderMark ? 65279 : 0); _processAllRows = processAllRows; _advanceReader = advanceReader; } protected override void Dispose(bool disposing) { try { if (disposing && _advanceReader && _reader != null && !_reader.IsClosed) { _reader.Close(); } _reader = null; } finally { base.Dispose(disposing); } } public override void Flush() { throw ADP.NotSupported(); } public override int Read(byte[] buffer, int offset, int count) { int num = 0; int num2 = 0; if (_reader == null) { throw ADP.StreamClosed("Read"); } if (buffer == null) { throw ADP.ArgumentNull("buffer"); } if (offset < 0 || count < 0) { throw ADP.ArgumentOutOfRange(string.Empty, (offset < 0) ? "offset" : "count"); } if (buffer.Length - offset < count) { throw ADP.ArgumentOutOfRange("count"); } if (_bom > 0) { _bufferedData = new byte[2]; num2 = ReadBytes(_bufferedData, 0, 2); if (num2 < 2 || (_bufferedData[0] == 223 && _bufferedData[1] == byte.MaxValue)) { _bom = 0; } while (count > 0 && _bom > 0) { buffer[offset] = (byte)_bom; _bom >>= 8; offset++; count--; num++; } } if (num2 > 0) { while (count > 0) { buffer[offset++] = _bufferedData[0]; num++; count--; if (num2 > 1 && count > 0) { buffer[offset++] = _bufferedData[1]; num++; count--; break; } } _bufferedData = null; } return num + ReadBytes(buffer, offset, count); } private static bool AdvanceToNextRow(SqlDataReader reader) { do { if (reader.Read()) { return true; } } while (reader.NextResult()); return false; } private int ReadBytes(byte[] buffer, int offset, int count) { bool flag = true; int num = 0; int num2 = 0; if (_reader.IsClosed || _endOfColumn) { return 0; } try { while (count > 0) { if (_advanceReader && _bytesCol == 0L) { flag = false; if ((!_readFirstRow || _processAllRows) && AdvanceToNextRow(_reader)) { _readFirstRow = true; if (_reader.IsDBNull(_columnOrdinal)) { continue; } flag = true; } } if (!flag) { break; } num2 = (int)_reader.GetBytesInternal(_columnOrdinal, _bytesCol, buffer, offset, count); if (num2 < count) { _bytesCol = 0L; flag = false; if (!_advanceReader) { _endOfColumn = true; } } else { _bytesCol += num2; } count -= num2; offset += num2; num += num2; } if (!flag && _advanceReader) { _reader.Close(); } } catch (Exception e) { if (_advanceReader && ADP.IsCatchableExceptionType(e)) { _reader.Close(); } throw; } return num; } internal XmlReader ToXmlReader(bool async = false) { return SqlTypeWorkarounds.SqlXmlCreateSqlXmlReader(this, closeInput: true, async); } public override long Seek(long offset, SeekOrigin origin) { throw ADP.NotSupported(); } public override void SetLength(long value) { throw ADP.NotSupported(); } public override void Write(byte[] buffer, int offset, int count) { throw ADP.NotSupported(); } } internal sealed class SqlCachedStream : Stream { private int _currentPosition; private int _currentArrayIndex; private List _cachedBytes; private long _totalLength; public override bool CanRead => true; public override bool CanSeek => true; public override bool CanWrite => false; public override long Length => TotalLength; public override long Position { get { long num = 0L; if (_currentArrayIndex > 0) { for (int i = 0; i < _currentArrayIndex; i++) { num += _cachedBytes[i].Length; } } return num + _currentPosition; } set { if (_cachedBytes == null) { throw ADP.StreamClosed("set_Position"); } SetInternalPosition(value, "set_Position"); } } private long TotalLength { get { if (_totalLength == 0L && _cachedBytes != null) { long num = 0L; for (int i = 0; i < _cachedBytes.Count; i++) { num += _cachedBytes[i].Length; } _totalLength = num; } return _totalLength; } } internal SqlCachedStream(SqlCachedBuffer sqlBuf) { _cachedBytes = sqlBuf.CachedBytes; } protected override void Dispose(bool disposing) { try { if (disposing && _cachedBytes != null) { _cachedBytes.Clear(); } _cachedBytes = null; _currentPosition = 0; _currentArrayIndex = 0; _totalLength = 0L; } finally { base.Dispose(disposing); } } public override void Flush() { throw ADP.NotSupported(); } public override int Read(byte[] buffer, int offset, int count) { int num = 0; if (_cachedBytes == null) { throw ADP.StreamClosed("Read"); } if (buffer == null) { throw ADP.ArgumentNull("buffer"); } if (offset < 0 || count < 0) { throw ADP.ArgumentOutOfRange(string.Empty, (offset < 0) ? "offset" : "count"); } if (buffer.Length - offset < count) { throw ADP.ArgumentOutOfRange("count"); } if (_cachedBytes.Count <= _currentArrayIndex) { return 0; } while (count > 0) { if (_cachedBytes[_currentArrayIndex].Length <= _currentPosition) { _currentArrayIndex++; if (_cachedBytes.Count <= _currentArrayIndex) { break; } _currentPosition = 0; } int num2 = _cachedBytes[_currentArrayIndex].Length - _currentPosition; if (num2 > count) { num2 = count; } Buffer.BlockCopy(_cachedBytes[_currentArrayIndex], _currentPosition, buffer, offset, num2); _currentPosition += num2; count -= num2; offset += num2; num += num2; } return num; } public override long Seek(long offset, SeekOrigin origin) { long num = 0L; if (_cachedBytes == null) { throw ADP.StreamClosed("Seek"); } switch (origin) { case SeekOrigin.Begin: SetInternalPosition(offset, "offset"); break; case SeekOrigin.Current: num = offset + Position; SetInternalPosition(num, "offset"); break; case SeekOrigin.End: num = TotalLength + offset; SetInternalPosition(num, "offset"); break; default: throw ADP.InvalidSeekOrigin("offset"); } return num; } public override void SetLength(long value) { throw ADP.NotSupported(); } public override void Write(byte[] buffer, int offset, int count) { throw ADP.NotSupported(); } private void SetInternalPosition(long lPos, string argumentName) { long num = lPos; if (num < 0) { throw new ArgumentOutOfRangeException(argumentName); } for (int i = 0; i < _cachedBytes.Count; i++) { if (num > _cachedBytes[i].Length) { num -= _cachedBytes[i].Length; continue; } _currentArrayIndex = i; _currentPosition = (int)num; return; } if (num > 0) { throw new ArgumentOutOfRangeException(argumentName); } } } internal sealed class SqlStreamingXml { private int _columnOrdinal; private SqlDataReader _reader; private XmlReader _xmlReader; private XmlWriter _xmlWriter; private StringWriter _strWriter; private long _charsRemoved; public int ColumnOrdinal => _columnOrdinal; public SqlStreamingXml(int i, SqlDataReader reader) { _columnOrdinal = i; _reader = reader; } public void Close() { ((IDisposable)_xmlWriter).Dispose(); ((IDisposable)_xmlReader).Dispose(); _reader = null; _xmlReader = null; _xmlWriter = null; _strWriter = null; } public long GetChars(long dataIndex, char[] buffer, int bufferIndex, int length) { if (_xmlReader == null) { SqlStream sqlStream = new SqlStream(_columnOrdinal, _reader, addByteOrderMark: true, processAllRows: false, advanceReader: false); _xmlReader = sqlStream.ToXmlReader(); _strWriter = new StringWriter((IFormatProvider?)null); XmlWriterSettings xmlWriterSettings = new XmlWriterSettings(); xmlWriterSettings.CloseOutput = true; xmlWriterSettings.ConformanceLevel = ConformanceLevel.Fragment; _xmlWriter = XmlWriter.Create(_strWriter, xmlWriterSettings); } int num = 0; int num2 = 0; if (dataIndex < _charsRemoved) { throw ADP.NonSeqByteAccess(dataIndex, _charsRemoved, "GetChars"); } if (dataIndex > _charsRemoved) { num = (int)(dataIndex - _charsRemoved); } if (buffer == null) { return -1L; } StringBuilder stringBuilder = _strWriter.GetStringBuilder(); while (!_xmlReader.EOF && stringBuilder.Length < length + num) { WriteXmlElement(); if (num > 0) { num2 = ((stringBuilder.Length < num) ? stringBuilder.Length : num); stringBuilder.Remove(0, num2); num -= num2; _charsRemoved += num2; } } if (num > 0) { num2 = ((stringBuilder.Length < num) ? stringBuilder.Length : num); stringBuilder.Remove(0, num2); num -= num2; _charsRemoved += num2; } if (stringBuilder.Length == 0) { return 0L; } num2 = ((stringBuilder.Length < length) ? stringBuilder.Length : length); for (int i = 0; i < num2; i++) { buffer[bufferIndex + i] = stringBuilder[i]; } stringBuilder.Remove(0, num2); _charsRemoved += num2; return num2; } private void WriteXmlElement() { if (_xmlReader.EOF) { return; } bool canReadValueChunk = _xmlReader.CanReadValueChunk; char[] array = null; _xmlReader.Read(); switch (_xmlReader.NodeType) { case XmlNodeType.Element: _xmlWriter.WriteStartElement(_xmlReader.Prefix, _xmlReader.LocalName, _xmlReader.NamespaceURI); _xmlWriter.WriteAttributes(_xmlReader, defattr: true); if (_xmlReader.IsEmptyElement) { _xmlWriter.WriteEndElement(); } break; case XmlNodeType.Text: if (canReadValueChunk) { if (array == null) { array = new char[1024]; } int count; while ((count = _xmlReader.ReadValueChunk(array, 0, 1024)) > 0) { _xmlWriter.WriteChars(array, 0, count); } } else { _xmlWriter.WriteString(_xmlReader.Value); } break; case XmlNodeType.Whitespace: case XmlNodeType.SignificantWhitespace: _xmlWriter.WriteWhitespace(_xmlReader.Value); break; case XmlNodeType.CDATA: _xmlWriter.WriteCData(_xmlReader.Value); break; case XmlNodeType.EntityReference: _xmlWriter.WriteEntityRef(_xmlReader.Name); break; case XmlNodeType.ProcessingInstruction: case XmlNodeType.XmlDeclaration: _xmlWriter.WriteProcessingInstruction(_xmlReader.Name, _xmlReader.Value); break; case XmlNodeType.DocumentType: _xmlWriter.WriteDocType(_xmlReader.Name, _xmlReader.GetAttribute("PUBLIC"), _xmlReader.GetAttribute("SYSTEM"), _xmlReader.Value); break; case XmlNodeType.Comment: _xmlWriter.WriteComment(_xmlReader.Value); break; case XmlNodeType.EndElement: _xmlWriter.WriteFullEndElement(); break; } _xmlWriter.Flush(); } } public sealed class SqlTransaction : DbTransaction { private static readonly DiagnosticListener s_diagnosticListener = new DiagnosticListener("SqlClientDiagnosticListener"); internal readonly IsolationLevel _isolationLevel; private SqlInternalTransaction _internalTransaction; private SqlConnection _connection; private bool _isFromAPI; public new SqlConnection Connection { get { if (IsZombied) { return null; } return _connection; } } protected override DbConnection DbConnection => Connection; internal SqlInternalTransaction InternalTransaction => _internalTransaction; public override IsolationLevel IsolationLevel { get { ZombieCheck(); return _isolationLevel; } } private bool IsYukonPartialZombie { get { if (_internalTransaction != null) { return _internalTransaction.IsCompleted; } return false; } } internal bool IsZombied { get { if (_internalTransaction != null) { return _internalTransaction.IsCompleted; } return true; } } internal SqlStatistics Statistics { get { if (_connection != null && _connection.StatisticsEnabled) { return _connection.Statistics; } return null; } } internal SqlTransaction(SqlInternalConnection internalConnection, SqlConnection con, IsolationLevel iso, SqlInternalTransaction internalTransaction) { _isolationLevel = IsolationLevel.ReadCommitted; base..ctor(); _isolationLevel = iso; _connection = con; if (internalTransaction == null) { _internalTransaction = new SqlInternalTransaction(internalConnection, TransactionType.LocalFromAPI, this); return; } _internalTransaction = internalTransaction; _internalTransaction.InitParent(this); } public override void Commit() { Exception ex = null; Guid operationId = s_diagnosticListener.WriteTransactionCommitBefore(_isolationLevel, _connection, "Commit"); ZombieCheck(); SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); _isFromAPI = true; _internalTransaction.Commit(); } catch (Exception ex2) { ex = ex2; throw; } finally { if (ex != null) { s_diagnosticListener.WriteTransactionCommitError(operationId, _isolationLevel, _connection, ex, "Commit"); } else { s_diagnosticListener.WriteTransactionCommitAfter(operationId, _isolationLevel, _connection, "Commit"); } _isFromAPI = false; SqlStatistics.StopTimer(statistics); } } protected override void Dispose(bool disposing) { if (disposing && !IsZombied && !IsYukonPartialZombie) { _internalTransaction.Dispose(); } base.Dispose(disposing); } public override void Rollback() { Exception ex = null; Guid operationId = s_diagnosticListener.WriteTransactionRollbackBefore(_isolationLevel, _connection, null, "Rollback"); if (IsYukonPartialZombie) { _internalTransaction = null; return; } ZombieCheck(); SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); _isFromAPI = true; _internalTransaction.Rollback(); } catch (Exception ex2) { ex = ex2; throw; } finally { if (ex != null) { s_diagnosticListener.WriteTransactionRollbackError(operationId, _isolationLevel, _connection, null, ex, "Rollback"); } else { s_diagnosticListener.WriteTransactionRollbackAfter(operationId, _isolationLevel, _connection, null, "Rollback"); } _isFromAPI = false; SqlStatistics.StopTimer(statistics); } } public void Rollback(string transactionName) { Exception ex = null; Guid operationId = s_diagnosticListener.WriteTransactionRollbackBefore(_isolationLevel, _connection, transactionName, "Rollback"); ZombieCheck(); SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); _isFromAPI = true; _internalTransaction.Rollback(transactionName); } catch (Exception ex2) { ex = ex2; throw; } finally { if (ex != null) { s_diagnosticListener.WriteTransactionRollbackError(operationId, _isolationLevel, _connection, transactionName, ex, "Rollback"); } else { s_diagnosticListener.WriteTransactionRollbackAfter(operationId, _isolationLevel, _connection, transactionName, "Rollback"); } _isFromAPI = false; SqlStatistics.StopTimer(statistics); } } public void Save(string savePointName) { ZombieCheck(); SqlStatistics statistics = null; try { statistics = SqlStatistics.StartTimer(Statistics); _internalTransaction.Save(savePointName); } finally { SqlStatistics.StopTimer(statistics); } } internal void Zombie() { if (!(_connection.InnerConnection is SqlInternalConnection) || _isFromAPI) { _internalTransaction = null; } } private void ZombieCheck() { if (IsZombied) { if (IsYukonPartialZombie) { _internalTransaction = null; } throw ADP.TransactionZombied(this); } } internal SqlTransaction() { ThrowStub.ThrowNotSupportedException(); } } internal static class AsyncHelper { internal static Task CreateContinuationTask(Task task, Action onSuccess, SqlInternalConnectionTds connectionToDoom = null, Action onFailure = null) { if (task == null) { onSuccess(); return null; } TaskCompletionSource completion = new TaskCompletionSource(); ContinueTask(task, completion, delegate { onSuccess(); completion.SetResult(null); }, connectionToDoom, onFailure); return completion.Task; } internal static Task CreateContinuationTask(Task task, Action onSuccess, T1 arg1, T2 arg2, SqlInternalConnectionTds connectionToDoom = null, Action onFailure = null) { return CreateContinuationTask(task, (Action)delegate { onSuccess(arg1, arg2); }, connectionToDoom, onFailure); } internal static void ContinueTask(Task task, TaskCompletionSource completion, Action onSuccess, SqlInternalConnectionTds connectionToDoom = null, Action onFailure = null, Action onCancellation = null, Func exceptionConverter = null, SqlConnection connectionToAbort = null) { task.ContinueWith(delegate(Task tsk) { if (tsk.Exception != null) { Exception ex = tsk.Exception.InnerException; if (exceptionConverter != null) { ex = exceptionConverter(ex); } try { if (onFailure != null) { onFailure(ex); } return; } finally { completion.TrySetException(ex); } } if (tsk.IsCanceled) { try { if (onCancellation != null) { onCancellation(); } return; } finally { completion.TrySetCanceled(); } } try { onSuccess(); } catch (Exception exception) { completion.SetException(exception); } }, TaskScheduler.Default); } internal static void WaitForCompletion(Task task, int timeout, Action onTimeout = null, bool rethrowExceptions = true) { try { task.Wait((timeout > 0) ? (1000 * timeout) : (-1)); } catch (AggregateException ex) { if (rethrowExceptions) { ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); } } if (!task.IsCompleted) { onTimeout?.Invoke(); } } internal static void SetTimeoutException(TaskCompletionSource completion, int timeout, Func exc, CancellationToken ctoken) { if (timeout <= 0) { return; } Task.Delay(timeout * 1000, ctoken).ContinueWith(delegate(Task tsk) { if (!tsk.IsCanceled && !completion.Task.IsCompleted) { completion.TrySetException(exc()); } }); } } internal static class SQL { internal static readonly byte[] AttentionHeader = new byte[8] { 6, 1, 0, 8, 0, 0, 0, 0 }; internal const int SqlDependencyTimeoutDefault = 0; internal const int SqlDependencyServerTimeout = 432000; internal const string SqlNotificationServiceDefault = "SqlQueryNotificationService"; internal const string SqlNotificationStoredProcedureDefault = "SqlQueryNotificationStoredProcedure"; internal static Exception CannotGetDTCAddress() { return ADP.InvalidOperation(SR.GetString("Unable to get the address of the distributed transaction coordinator for the server, from the server. Is DTC enabled on the server?")); } internal static Exception InvalidInternalPacketSize(string str) { return ADP.ArgumentOutOfRange(str); } internal static Exception InvalidPacketSize() { return ADP.ArgumentOutOfRange(SR.GetString("Invalid Packet Size.")); } internal static Exception InvalidPacketSizeValue() { return ADP.Argument(SR.GetString("Invalid 'Packet Size'. The value must be an integer >= 512 and <= 32768.")); } internal static Exception InvalidSSPIPacketSize() { return ADP.Argument(SR.GetString("Invalid SSPI packet size.")); } internal static Exception NullEmptyTransactionName() { return ADP.Argument(SR.GetString("Invalid transaction or invalid name for a point at which to save within the transaction.")); } internal static Exception UserInstanceFailoverNotCompatible() { return ADP.Argument(SR.GetString("User Instance and Failover are not compatible options. Please choose only one of the two in the connection string.")); } internal static Exception InvalidSQLServerVersionUnknown() { return ADP.DataAdapter(SR.GetString("Unsupported SQL Server version. The .Net Framework SqlClient Data Provider can only be used with SQL Server versions 7.0 and later.")); } internal static Exception SynchronousCallMayNotPend() { return new Exception(SR.GetString("Internal Error")); } internal static Exception ConnectionLockedForBcpEvent() { return ADP.InvalidOperation(SR.GetString("The connection cannot be used because there is an ongoing operation that must be finished.")); } internal static Exception InstanceFailure() { return ADP.InvalidOperation(SR.GetString("Instance failure.")); } internal static Exception GlobalTransactionsNotEnabled() { return ADP.InvalidOperation(SR.GetString("Global Transactions are not enabled for this Azure SQL Database. Please contact Azure SQL Database support for assistance.")); } internal static Exception UnknownSysTxIsolationLevel(System.Transactions.IsolationLevel isolationLevel) { return ADP.InvalidOperation(SR.GetString("Unrecognized System.Transactions.IsolationLevel enumeration value: {0}.", isolationLevel.ToString())); } internal static Exception InvalidPartnerConfiguration(string server, string database) { return ADP.InvalidOperation(SR.GetString("Server {0}, database {1} is not configured for database mirroring.", server, database)); } internal static Exception MARSUnspportedOnConnection() { return ADP.InvalidOperation(SR.GetString("The connection does not support MultipleActiveResultSets.")); } internal static Exception CannotModifyPropertyAsyncOperationInProgress([CallerMemberName] string property = "") { return ADP.InvalidOperation(SR.GetString("{0} cannot be changed while async operation is in progress.", property)); } internal static Exception NonLocalSSEInstance() { return ADP.NotSupported(SR.GetString("SSE Instance re-direction is not supported for non-local user instances.")); } internal static ArgumentOutOfRangeException NotSupportedEnumerationValue(Type type, int value) { return ADP.ArgumentOutOfRange(SR.GetString("The {0} enumeration value, {1}, is not supported by the .Net Framework SqlClient Data Provider.", type.Name, value.ToString(CultureInfo.InvariantCulture)), type.Name); } internal static ArgumentOutOfRangeException NotSupportedCommandType(CommandType value) { return NotSupportedEnumerationValue(typeof(CommandType), (int)value); } internal static ArgumentOutOfRangeException NotSupportedIsolationLevel(IsolationLevel value) { return NotSupportedEnumerationValue(typeof(IsolationLevel), (int)value); } internal static Exception OperationCancelled() { return ADP.InvalidOperation(SR.GetString("Operation cancelled by user.")); } internal static Exception PendingBeginXXXExists() { return ADP.InvalidOperation(SR.GetString("The command execution cannot proceed due to a pending asynchronous operation already in progress.")); } internal static ArgumentOutOfRangeException InvalidSqlDependencyTimeout(string param) { return ADP.ArgumentOutOfRange(SR.GetString("Timeout specified is invalid. Timeout cannot be < 0."), param); } internal static Exception NonXmlResult() { return ADP.InvalidOperation(SR.GetString("Invalid command sent to ExecuteXmlReader. The command must return an Xml result.")); } internal static Exception InvalidParameterTypeNameFormat() { return ADP.Argument(SR.GetString("Invalid 3 part name format for TypeName.")); } internal static Exception InvalidParameterNameLength(string value) { return ADP.Argument(SR.GetString("The length of the parameter '{0}' exceeds the limit of 128 characters.", value)); } internal static Exception PrecisionValueOutOfRange(byte precision) { return ADP.Argument(SR.GetString("Precision value '{0}' is either less than 0 or greater than the maximum allowed precision of 38.", precision.ToString(CultureInfo.InvariantCulture))); } internal static Exception ScaleValueOutOfRange(byte scale) { return ADP.Argument(SR.GetString("Scale value '{0}' is either less than 0 or greater than the maximum allowed scale of 38.", scale.ToString(CultureInfo.InvariantCulture))); } internal static Exception TimeScaleValueOutOfRange(byte scale) { return ADP.Argument(SR.GetString("Scale value '{0}' is either less than 0 or greater than the maximum allowed scale of 7.", scale.ToString(CultureInfo.InvariantCulture))); } internal static Exception InvalidSqlDbType(SqlDbType value) { return ADP.InvalidEnumerationValue(typeof(SqlDbType), (int)value); } internal static Exception UnsupportedTVPOutputParameter(ParameterDirection direction, string paramName) { return ADP.NotSupported(SR.GetString("ParameterDirection '{0}' specified for parameter '{1}' is not supported. Table-valued parameters only support ParameterDirection.Input.", direction.ToString(), paramName)); } internal static Exception DBNullNotSupportedForTVPValues(string paramName) { return ADP.NotSupported(SR.GetString("DBNull value for parameter '{0}' is not supported. Table-valued parameters cannot be DBNull.", paramName)); } internal static Exception UnexpectedTypeNameForNonStructParams(string paramName) { return ADP.NotSupported(SR.GetString("TypeName specified for parameter '{0}'. TypeName must only be set for Structured parameters.", paramName)); } internal static Exception ParameterInvalidVariant(string paramName) { return ADP.InvalidOperation(SR.GetString("Parameter '{0}' exceeds the size limit for the sql_variant datatype.", paramName)); } internal static Exception MustSetTypeNameForParam(string paramType, string paramName) { return ADP.Argument(SR.GetString("The {0} type parameter '{1}' must have a valid type name.", paramType, paramName)); } internal static Exception NullSchemaTableDataTypeNotSupported(string columnName) { return ADP.Argument(SR.GetString("DateType column for field '{0}' in schema table is null. DataType must be non-null.", columnName)); } internal static Exception InvalidSchemaTableOrdinals() { return ADP.Argument(SR.GetString("Invalid column ordinals in schema table. ColumnOrdinals, if present, must not have duplicates or gaps.")); } internal static Exception EnumeratedRecordMetaDataChanged(string fieldName, int recordNumber) { return ADP.Argument(SR.GetString("Metadata for field '{0}' of record '{1}' did not match the original record's metadata.", fieldName, recordNumber)); } internal static Exception EnumeratedRecordFieldCountChanged(int recordNumber) { return ADP.Argument(SR.GetString("Number of fields in record '{0}' does not match the number in the original record.", recordNumber)); } internal static Exception InvalidTDSVersion() { return ADP.InvalidOperation(SR.GetString("The SQL Server instance returned an invalid or unsupported protocol version during login negotiation.")); } internal static Exception ParsingError() { return ADP.InvalidOperation(SR.GetString("Internal connection fatal error.")); } internal static Exception MoneyOverflow(string moneyValue) { return ADP.Overflow(SR.GetString("SqlDbType.SmallMoney overflow. Value '{0}' is out of range. Must be between -214,748.3648 and 214,748.3647.", moneyValue)); } internal static Exception SmallDateTimeOverflow(string datetime) { return ADP.Overflow(SR.GetString("SqlDbType.SmallDateTime overflow. Value '{0}' is out of range. Must be between 1/1/1900 12:00:00 AM and 6/6/2079 11:59:59 PM.", datetime)); } internal static Exception SNIPacketAllocationFailure() { return ADP.InvalidOperation(SR.GetString("Memory allocation for internal connection failed.")); } internal static Exception TimeOverflow(string time) { return ADP.Overflow(SR.GetString("SqlDbType.Time overflow. Value '{0}' is out of range. Must be between 00:00:00.0000000 and 23:59:59.9999999.", time)); } internal static Exception InvalidRead() { return ADP.InvalidOperation(SR.GetString("Invalid attempt to read when no data is present.")); } internal static Exception NonBlobColumn(string columnName) { return ADP.InvalidCast(SR.GetString("Invalid attempt to GetBytes on column '{0}'. The GetBytes function can only be used on columns of type Text, NText, or Image.", columnName)); } internal static Exception NonCharColumn(string columnName) { return ADP.InvalidCast(SR.GetString("Invalid attempt to GetChars on column '{0}'. The GetChars function can only be used on columns of type Text, NText, Xml, VarChar or NVarChar.", columnName)); } internal static Exception StreamNotSupportOnColumnType(string columnName) { return ADP.InvalidCast(SR.GetString("Invalid attempt to GetStream on column '{0}'. The GetStream function can only be used on columns of type Binary, Image, Udt or VarBinary.", columnName)); } internal static Exception TextReaderNotSupportOnColumnType(string columnName) { return ADP.InvalidCast(SR.GetString("Invalid attempt to GetTextReader on column '{0}'. The GetTextReader function can only be used on columns of type Char, NChar, NText, NVarChar, Text or VarChar.", columnName)); } internal static Exception XmlReaderNotSupportOnColumnType(string columnName) { return ADP.InvalidCast(SR.GetString("Invalid attempt to GetXmlReader on column '{0}'. The GetXmlReader function can only be used on columns of type Xml.", columnName)); } internal static Exception SqlCommandHasExistingSqlNotificationRequest() { return ADP.InvalidOperation(SR.GetString("This SqlCommand object is already associated with another SqlDependency object.")); } internal static Exception SqlDepDefaultOptionsButNoStart() { return ADP.InvalidOperation(SR.GetString("When using SqlDependency without providing an options value, SqlDependency.Start() must be called prior to execution of a command added to the SqlDependency instance.")); } internal static Exception SqlDependencyDatabaseBrokerDisabled() { return ADP.InvalidOperation(SR.GetString("The SQL Server Service Broker for the current database is not enabled, and as a result query notifications are not supported. Please enable the Service Broker for this database if you wish to use notifications.")); } internal static Exception SqlDependencyEventNoDuplicate() { return ADP.InvalidOperation(SR.GetString("SqlDependency.OnChange does not support multiple event registrations for the same delegate.")); } internal static Exception SqlDependencyDuplicateStart() { return ADP.InvalidOperation(SR.GetString("SqlDependency does not support calling Start() with different connection strings having the same server, user, and database in the same app domain.")); } internal static Exception SqlDependencyIdMismatch() { return ADP.InvalidOperation(SR.GetString("No SqlDependency exists for the key.")); } internal static Exception SqlDependencyNoMatchingServerStart() { return ADP.InvalidOperation(SR.GetString("When using SqlDependency without providing an options value, SqlDependency.Start() must be called for each server that is being executed against.")); } internal static Exception SqlDependencyNoMatchingServerDatabaseStart() { return ADP.InvalidOperation(SR.GetString("SqlDependency.Start has been called for the server the command is executing against more than once, but there is no matching server/user/database Start() call for current command.")); } internal static TransactionPromotionException PromotionFailed(Exception inner) { TransactionPromotionException ex = new TransactionPromotionException(SR.GetString("Failure while attempting to promote transaction."), inner); ADP.TraceExceptionAsReturnValue(ex); return ex; } internal static Exception InvalidSqlDbTypeForConstructor(SqlDbType type) { return ADP.Argument(SR.GetString("The dbType {0} is invalid for this constructor.", type.ToString())); } internal static Exception NameTooLong(string parameterName) { return ADP.Argument(SR.GetString("The name is too long."), parameterName); } internal static Exception InvalidSortOrder(SortOrder order) { return ADP.InvalidEnumerationValue(typeof(SortOrder), (int)order); } internal static Exception MustSpecifyBothSortOrderAndOrdinal(SortOrder order, int ordinal) { return ADP.InvalidOperation(SR.GetString("The sort order and ordinal must either both be specified, or neither should be specified (SortOrder.Unspecified and -1). The values given were: order = {0}, ordinal = {1}.", order.ToString(), ordinal)); } internal static Exception UnsupportedColumnTypeForSqlProvider(string columnName, string typeName) { return ADP.Argument(SR.GetString("The type of column '{0}' is not supported. The type is '{1}'", columnName, typeName)); } internal static Exception InvalidColumnMaxLength(string columnName, long maxLength) { return ADP.Argument(SR.GetString("The size of column '{0}' is not supported. The size is {1}.", columnName, maxLength)); } internal static Exception InvalidColumnPrecScale() { return ADP.Argument(SR.GetString("Invalid numeric precision/scale.")); } internal static Exception NotEnoughColumnsInStructuredType() { return ADP.Argument(SR.GetString("There are not enough fields in the Structured type. Structured types must have at least one field.")); } internal static Exception DuplicateSortOrdinal(int sortOrdinal) { return ADP.InvalidOperation(SR.GetString("The sort ordinal {0} was specified twice.", sortOrdinal)); } internal static Exception MissingSortOrdinal(int sortOrdinal) { return ADP.InvalidOperation(SR.GetString("The sort ordinal {0} was not specified.", sortOrdinal)); } internal static Exception SortOrdinalGreaterThanFieldCount(int columnOrdinal, int sortOrdinal) { return ADP.InvalidOperation(SR.GetString("The sort ordinal {0} on field {1} exceeds the total number of fields.", sortOrdinal, columnOrdinal)); } internal static Exception IEnumerableOfSqlDataRecordHasNoRows() { return ADP.Argument(SR.GetString("There are no records in the SqlDataRecord enumeration. To send a table-valued parameter with no rows, use a null reference for the value instead.")); } internal static Exception BulkLoadMappingInaccessible() { return ADP.InvalidOperation(SR.GetString("The mapped collection is in use and cannot be accessed at this time;")); } internal static Exception BulkLoadMappingsNamesOrOrdinalsOnly() { return ADP.InvalidOperation(SR.GetString("Mappings must be either all name or all ordinal based.")); } internal static Exception BulkLoadCannotConvertValue(Type sourcetype, MetaType metatype, Exception e) { return ADP.InvalidOperation(SR.GetString("The given value of type {0} from the data source cannot be converted to type {1} of the specified target column.", sourcetype.Name, metatype.TypeName), e); } internal static Exception BulkLoadNonMatchingColumnMapping() { return ADP.InvalidOperation(SR.GetString("The given ColumnMapping does not match up with any column in the source or destination.")); } internal static Exception BulkLoadNonMatchingColumnName(string columnName) { return BulkLoadNonMatchingColumnName(columnName, null); } internal static Exception BulkLoadNonMatchingColumnName(string columnName, Exception e) { return ADP.InvalidOperation(SR.GetString("The given ColumnName '{0}' does not match up with any column in data source.", columnName), e); } internal static Exception BulkLoadStringTooLong() { return ADP.InvalidOperation(SR.GetString("String or binary data would be truncated.")); } internal static Exception BulkLoadInvalidVariantValue() { return ADP.InvalidOperation(SR.GetString("Value cannot be converted to SqlVariant.")); } internal static Exception BulkLoadInvalidTimeout(int timeout) { return ADP.Argument(SR.GetString("Timeout Value '{0}' is less than 0.", timeout.ToString(CultureInfo.InvariantCulture))); } internal static Exception BulkLoadExistingTransaction() { return ADP.InvalidOperation(SR.GetString("Unexpected existing transaction.")); } internal static Exception BulkLoadNoCollation() { return ADP.InvalidOperation(SR.GetString("Failed to obtain column collation information for the destination table. If the table is not in the current database the name must be qualified using the database name (e.g. [mydb]..[mytable](e.g. [mydb]..[mytable]); this also applies to temporary-tables (e.g. #mytable would be specified as tempdb..#mytable).")); } internal static Exception BulkLoadConflictingTransactionOption() { return ADP.Argument(SR.GetString("Must not specify SqlBulkCopyOption.UseInternalTransaction and pass an external Transaction at the same time.")); } internal static Exception BulkLoadLcidMismatch(int sourceLcid, string sourceColumnName, int destinationLcid, string destinationColumnName) { return ADP.InvalidOperation(SR.GetString("The locale id '{0}' of the source column '{1}' and the locale id '{2}' of the destination column '{3}' do not match.", sourceLcid, sourceColumnName, destinationLcid, destinationColumnName)); } internal static Exception InvalidOperationInsideEvent() { return ADP.InvalidOperation(SR.GetString("Function must not be called during event.")); } internal static Exception BulkLoadMissingDestinationTable() { return ADP.InvalidOperation(SR.GetString("The DestinationTableName property must be set before calling this method.")); } internal static Exception BulkLoadInvalidDestinationTable(string tableName, Exception inner) { return ADP.InvalidOperation(SR.GetString("Cannot access destination table '{0}'.", tableName), inner); } internal static Exception BulkLoadBulkLoadNotAllowDBNull(string columnName) { return ADP.InvalidOperation(SR.GetString("Column '{0}' does not allow DBNull.Value.", columnName)); } internal static Exception BulkLoadPendingOperation() { return ADP.InvalidOperation(SR.GetString("Attempt to invoke bulk copy on an object that has a pending operation.")); } internal static Exception InvalidTableDerivedPrecisionForTvp(string columnName, byte precision) { return ADP.InvalidOperation(SR.GetString("Precision '{0}' required to send all values in column '{1}' exceeds the maximum supported precision '{2}'. The values must all fit in a single precision.", precision, columnName, SqlDecimal.MaxPrecision)); } internal static Exception ConnectionDoomed() { return ADP.InvalidOperation(SR.GetString("The requested operation cannot be completed because the connection has been broken.")); } internal static Exception OpenResultCountExceeded() { return ADP.InvalidOperation(SR.GetString("Open result count exceeded.")); } internal static Exception UnsupportedSysTxForGlobalTransactions() { return ADP.InvalidOperation(SR.GetString("The currently loaded System.Transactions.dll does not support Global Transactions.")); } internal static Exception MultiSubnetFailoverWithFailoverPartner(bool serverProvidedFailoverPartner, SqlInternalConnectionTds internalConnection) { string @string = SR.GetString("Connecting to a mirrored SQL Server instance using the MultiSubnetFailover connection option is not supported."); if (serverProvidedFailoverPartner) { SqlException ex = SqlException.CreateException(new SqlErrorCollection { new SqlError(0, 0, 20, null, @string, "", 0) }, null, internalConnection); ex._doNotReconnect = true; return ex; } return ADP.Argument(@string); } internal static Exception MultiSubnetFailoverWithMoreThan64IPs() { return ADP.InvalidOperation(GetSNIErrorMessage(47)); } internal static Exception MultiSubnetFailoverWithInstanceSpecified() { return ADP.Argument(GetSNIErrorMessage(48)); } internal static Exception MultiSubnetFailoverWithNonTcpProtocol() { return ADP.Argument(GetSNIErrorMessage(49)); } internal static Exception ROR_FailoverNotSupportedConnString() { return ADP.Argument(SR.GetString("Connecting to a mirrored SQL Server instance using the ApplicationIntent ReadOnly connection option is not supported.")); } internal static Exception ROR_FailoverNotSupportedServer(SqlInternalConnectionTds internalConnection) { SqlException ex = SqlException.CreateException(new SqlErrorCollection { new SqlError(0, 0, 20, null, SR.GetString("Connecting to a mirrored SQL Server instance using the ApplicationIntent ReadOnly connection option is not supported."), "", 0) }, null, internalConnection); ex._doNotReconnect = true; return ex; } internal static Exception ROR_RecursiveRoutingNotSupported(SqlInternalConnectionTds internalConnection) { SqlException ex = SqlException.CreateException(new SqlErrorCollection { new SqlError(0, 0, 20, null, SR.GetString("Two or more redirections have occurred. Only one redirection per login is allowed."), "", 0) }, null, internalConnection); ex._doNotReconnect = true; return ex; } internal static Exception ROR_UnexpectedRoutingInfo(SqlInternalConnectionTds internalConnection) { SqlException ex = SqlException.CreateException(new SqlErrorCollection { new SqlError(0, 0, 20, null, SR.GetString("Unexpected routing information received."), "", 0) }, null, internalConnection); ex._doNotReconnect = true; return ex; } internal static Exception ROR_InvalidRoutingInfo(SqlInternalConnectionTds internalConnection) { SqlException ex = SqlException.CreateException(new SqlErrorCollection { new SqlError(0, 0, 20, null, SR.GetString("Invalid routing information received."), "", 0) }, null, internalConnection); ex._doNotReconnect = true; return ex; } internal static Exception ROR_TimeoutAfterRoutingInfo(SqlInternalConnectionTds internalConnection) { SqlException ex = SqlException.CreateException(new SqlErrorCollection { new SqlError(0, 0, 20, null, SR.GetString("Server provided routing information, but timeout already expired."), "", 0) }, null, internalConnection); ex._doNotReconnect = true; return ex; } internal static SqlException CR_ReconnectTimeout() { return SqlException.CreateException(new SqlErrorCollection { new SqlError(-2, 0, 11, null, SQLMessage.Timeout(), "", 0, 258u) }, ""); } internal static SqlException CR_ReconnectionCancelled() { return SqlException.CreateException(new SqlErrorCollection { new SqlError(0, 0, 11, null, SQLMessage.OperationCancelled(), "", 0) }, ""); } internal static Exception CR_NextAttemptWillExceedQueryTimeout(SqlException innerException, Guid connectionId) { return SqlException.CreateException(new SqlErrorCollection { new SqlError(0, 0, 11, null, SR.GetString("Next reconnection attempt will exceed query timeout. Reconnection was terminated."), "", 0) }, "", connectionId, innerException); } internal static Exception CR_EncryptionChanged(SqlInternalConnectionTds internalConnection) { return SqlException.CreateException(new SqlErrorCollection { new SqlError(0, 0, 20, null, SR.GetString("The server did not preserve SSL encryption during a recovery attempt, connection recovery is not possible."), "", 0) }, "", internalConnection); } internal static SqlException CR_AllAttemptsFailed(SqlException innerException, Guid connectionId) { return SqlException.CreateException(new SqlErrorCollection { new SqlError(0, 0, 11, null, SR.GetString("The connection is broken and recovery is not possible. The client driver attempted to recover the connection one or more times and all attempts failed. Increase the value of ConnectRetryCount to increase the number of recovery attempts."), "", 0) }, "", connectionId, innerException); } internal static SqlException CR_NoCRAckAtReconnection(SqlInternalConnectionTds internalConnection) { return SqlException.CreateException(new SqlErrorCollection { new SqlError(0, 0, 20, null, SR.GetString("The server did not acknowledge a recovery attempt, connection recovery is not possible."), "", 0) }, "", internalConnection); } internal static SqlException CR_TDSVersionNotPreserved(SqlInternalConnectionTds internalConnection) { return SqlException.CreateException(new SqlErrorCollection { new SqlError(0, 0, 20, null, SR.GetString("The server did not preserve the exact client TDS version requested during a recovery attempt, connection recovery is not possible."), "", 0) }, "", internalConnection); } internal static SqlException CR_UnrecoverableServer(Guid connectionId) { return SqlException.CreateException(new SqlErrorCollection { new SqlError(0, 0, 20, null, SR.GetString("The connection is broken and recovery is not possible. The connection is marked by the server as unrecoverable. No attempt was made to restore the connection."), "", 0) }, "", connectionId); } internal static SqlException CR_UnrecoverableClient(Guid connectionId) { return SqlException.CreateException(new SqlErrorCollection { new SqlError(0, 0, 20, null, SR.GetString("The connection is broken and recovery is not possible. The connection is marked by the client driver as unrecoverable. No attempt was made to restore the connection."), "", 0) }, "", connectionId); } internal static Exception StreamWriteNotSupported() { return ADP.NotSupported(SR.GetString("The Stream does not support writing.")); } internal static Exception StreamReadNotSupported() { return ADP.NotSupported(SR.GetString("The Stream does not support reading.")); } internal static Exception StreamSeekNotSupported() { return ADP.NotSupported(SR.GetString("The Stream does not support seeking.")); } internal static SqlNullValueException SqlNullValue() { return new SqlNullValueException(); } internal static Exception SubclassMustOverride() { return ADP.InvalidOperation(SR.GetString("Subclass did not override a required method.")); } internal static Exception UnsupportedKeyword(string keyword) { return ADP.NotSupported(SR.GetString("The keyword '{0}' is not supported on this platform.", keyword)); } internal static Exception NetworkLibraryKeywordNotSupported() { return ADP.NotSupported(SR.GetString("The keyword 'Network Library' is not supported on this platform, prefix the 'Data Source' with the protocol desired instead ('tcp:' for a TCP connection, or 'np:' for a Named Pipe connection).")); } internal static Exception UnsupportedFeatureAndToken(SqlInternalConnectionTds internalConnection, string token) { NotSupportedException innerException = ADP.NotSupported(SR.GetString("Received an unsupported token '{0}' while reading data from the server.", token)); return SqlException.CreateException(new SqlErrorCollection { new SqlError(0, 0, 20, null, SR.GetString("The server is attempting to use a feature that is not supported on this platform."), "", 0) }, "", internalConnection, innerException); } internal static Exception BatchedUpdatesNotAvailableOnContextConnection() { return ADP.InvalidOperation(SR.GetString("Batching updates is not supported on the context connection.")); } internal static string GetSNIErrorMessage(int sniError) { string text = string.Format(null, "SNI_ERROR_{0}", sniError); return SR.GetResourceString(text, text); } } internal sealed class SQLMessage { private SQLMessage() { } internal static string CultureIdError() { return SR.GetString("The Collation specified by SQL Server is not supported."); } internal static string EncryptionNotSupportedByClient() { return SR.GetString("The instance of SQL Server you attempted to connect to requires encryption but this machine does not support it."); } internal static string EncryptionNotSupportedByServer() { return SR.GetString("The instance of SQL Server you attempted to connect to does not support encryption."); } internal static string OperationCancelled() { return SR.GetString("Operation cancelled by user."); } internal static string SevereError() { return SR.GetString("A severe error occurred on the current command. The results, if any, should be discarded."); } internal static string SSPIInitializeError() { return SR.GetString("Cannot initialize SSPI package."); } internal static string SSPIGenerateError() { return SR.GetString("Failed to generate SSPI context."); } internal static string SqlServerBrowserNotAccessible() { return SR.GetString("Cannot connect to SQL Server Browser. Ensure SQL Server Browser has been started."); } internal static string KerberosTicketMissingError() { return SR.GetString("Cannot access Kerberos ticket. Ensure Kerberos has been initialized with 'kinit'."); } internal static string Timeout() { return SR.GetString("Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding."); } internal static string Timeout_PreLogin_Begin() { return SR.GetString("Connection Timeout Expired. The timeout period elapsed at the start of the pre-login phase. This could be because of insufficient time provided for connection timeout."); } internal static string Timeout_PreLogin_InitializeConnection() { return SR.GetString("Connection Timeout Expired. The timeout period elapsed while attempting to create and initialize a socket to the server. This could be either because the server was unreachable or unable to respond back in time."); } internal static string Timeout_PreLogin_SendHandshake() { return SR.GetString("Connection Timeout Expired. The timeout period elapsed while making a pre-login handshake request. This could be because the server was unable to respond back in time."); } internal static string Timeout_PreLogin_ConsumeHandshake() { return SR.GetString("Connection Timeout Expired. The timeout period elapsed while attempting to consume the pre-login handshake acknowledgement. This could be because the pre-login handshake failed or the server was unable to respond back in time."); } internal static string Timeout_Login_Begin() { return SR.GetString("Connection Timeout Expired. The timeout period elapsed at the start of the login phase. This could be because of insufficient time provided for connection timeout."); } internal static string Timeout_Login_ProcessConnectionAuth() { return SR.GetString("Connection Timeout Expired. The timeout period elapsed while attempting to authenticate the login. This could be because the server failed to authenticate the user or the server was unable to respond back in time."); } internal static string Timeout_PostLogin() { return SR.GetString("Connection Timeout Expired. The timeout period elapsed during the post-login phase. The connection could have timed out while waiting for server to complete the login process and respond; Or it could have timed out while attempting to create multiple active connections."); } internal static string Timeout_FailoverInfo() { return SR.GetString("This failure occurred while attempting to connect to the {0} server."); } internal static string Timeout_RoutingDestination() { return SR.GetString("This failure occurred while attempting to connect to the routing destination. The duration spent while attempting to connect to the original server was - [Pre-Login] initialization={0}; handshake={1}; [Login] initialization={2}; authentication={3}; [Post-Login] complete={4}; "); } internal static string Duration_PreLogin_Begin(long PreLoginBeginDuration) { return SR.GetString("The duration spent while attempting to connect to this server was - [Pre-Login] initialization={0};", PreLoginBeginDuration); } internal static string Duration_PreLoginHandshake(long PreLoginBeginDuration, long PreLoginHandshakeDuration) { return SR.GetString("The duration spent while attempting to connect to this server was - [Pre-Login] initialization={0}; handshake={1}; ", PreLoginBeginDuration, PreLoginHandshakeDuration); } internal static string Duration_Login_Begin(long PreLoginBeginDuration, long PreLoginHandshakeDuration, long LoginBeginDuration) { return SR.GetString("The duration spent while attempting to connect to this server was - [Pre-Login] initialization={0}; handshake={1}; [Login] initialization={2}; ", PreLoginBeginDuration, PreLoginHandshakeDuration, LoginBeginDuration); } internal static string Duration_Login_ProcessConnectionAuth(long PreLoginBeginDuration, long PreLoginHandshakeDuration, long LoginBeginDuration, long LoginAuthDuration) { return SR.GetString("The duration spent while attempting to connect to this server was - [Pre-Login] initialization={0}; handshake={1}; [Login] initialization={2}; authentication={3}; ", PreLoginBeginDuration, PreLoginHandshakeDuration, LoginBeginDuration, LoginAuthDuration); } internal static string Duration_PostLogin(long PreLoginBeginDuration, long PreLoginHandshakeDuration, long LoginBeginDuration, long LoginAuthDuration, long PostLoginDuration) { return SR.GetString("The duration spent while attempting to connect to this server was - [Pre-Login] initialization={0}; handshake={1}; [Login] initialization={2}; authentication={3}; [Post-Login] complete={4}; ", PreLoginBeginDuration, PreLoginHandshakeDuration, LoginBeginDuration, LoginAuthDuration, PostLoginDuration); } internal static string UserInstanceFailure() { return SR.GetString("A user instance was requested in the connection string but the server specified does not support this option."); } internal static string PreloginError() { return SR.GetString("A connection was successfully established with the server, but then an error occurred during the pre-login handshake."); } internal static string ExClientConnectionId() { return SR.GetString("ClientConnectionId:{0}"); } internal static string ExErrorNumberStateClass() { return SR.GetString("Error Number:{0},State:{1},Class:{2}"); } internal static string ExOriginalClientConnectionId() { return SR.GetString("ClientConnectionId before routing:{0}"); } internal static string ExRoutingDestination() { return SR.GetString("Routing Destination:{0}"); } } internal static class SqlServerEscapeHelper { internal static string EscapeIdentifier(string name) { return "[" + name.Replace("]", "]]") + "]"; } internal static void EscapeIdentifier(StringBuilder builder, string name) { builder.Append("["); builder.Append(name.Replace("]", "]]")); builder.Append("]"); } internal static string EscapeStringAsLiteral(string input) { return input.Replace("'", "''"); } internal static string MakeStringLiteral(string input) { if (string.IsNullOrEmpty(input)) { return "''"; } return "'" + EscapeStringAsLiteral(input) + "'"; } } internal static class SysTxForGlobalTransactions { private static readonly Lazy _enlistPromotableSinglePhase = new Lazy(() => typeof(Transaction).GetMethod("EnlistPromotableSinglePhase", new Type[2] { typeof(IPromotableSinglePhaseNotification), typeof(Guid) })); private static readonly Lazy _setDistributedTransactionIdentifier = new Lazy(() => typeof(Transaction).GetMethod("SetDistributedTransactionIdentifier", new Type[2] { typeof(IPromotableSinglePhaseNotification), typeof(Guid) })); private static readonly Lazy _getPromotedToken = new Lazy(() => typeof(Transaction).GetMethod("GetPromotedToken")); public static MethodInfo EnlistPromotableSinglePhase => _enlistPromotableSinglePhase.Value; public static MethodInfo SetDistributedTransactionIdentifier => _setDistributedTransactionIdentifier.Value; public static MethodInfo GetPromotedToken => _getPromotedToken.Value; } internal static class TdsEnums { public enum EnvChangeType : byte { ENVCHANGE_DATABASE = 1, ENVCHANGE_LANG = 2, ENVCHANGE_CHARSET = 3, ENVCHANGE_PACKETSIZE = 4, ENVCHANGE_LOCALEID = 5, ENVCHANGE_COMPFLAGS = 6, ENVCHANGE_COLLATION = 7, ENVCHANGE_BEGINTRAN = 8, ENVCHANGE_COMMITTRAN = 9, ENVCHANGE_ROLLBACKTRAN = 10, ENVCHANGE_ENLISTDTC = 11, ENVCHANGE_DEFECTDTC = 12, ENVCHANGE_LOGSHIPNODE = 13, ENVCHANGE_PROMOTETRANSACTION = 15, ENVCHANGE_TRANSACTIONMANAGERADDRESS = 16, ENVCHANGE_TRANSACTIONENDED = 17, ENVCHANGE_SPRESETCONNECTIONACK = 18, ENVCHANGE_USERINSTANCE = 19, ENVCHANGE_ROUTING = 20 } [Flags] public enum FeatureExtension : uint { None = 0u, SessionRecovery = 1u, GlobalTransactions = 8u } internal enum TransactionManagerRequestType { GetDTCAddress = 0, Propagate = 1, Begin = 5, Promote = 6, Commit = 7, Rollback = 8, Save = 9 } internal enum TransactionManagerIsolationLevel { Unspecified, ReadUncommitted, ReadCommitted, RepeatableRead, Serializable, Snapshot } internal enum GenericType { MultiSet = 131 } public const string SQL_PROVIDER_NAME = "Core .Net SqlClient Data Provider"; public static readonly decimal SQL_SMALL_MONEY_MIN = new decimal(-214748.3648); public static readonly decimal SQL_SMALL_MONEY_MAX = new decimal(214748.3647); public const SqlDbType SmallVarBinary = (SqlDbType)24; public const string TCP = "tcp"; public const string NP = "np"; public const string RPC = "rpc"; public const string BV = "bv"; public const string ADSP = "adsp"; public const string SPX = "spx"; public const string VIA = "via"; public const string LPC = "lpc"; public const string ADMIN = "admin"; public const string INIT_SSPI_PACKAGE = "InitSSPIPackage"; public const string INIT_SESSION = "InitSession"; public const string CONNECTION_GET_SVR_USER = "ConnectionGetSvrUser"; public const string GEN_CLIENT_CONTEXT = "GenClientContext"; public const byte SOFTFLUSH = 0; public const byte HARDFLUSH = 1; public const byte IGNORE = 2; public const int HEADER_LEN = 8; public const int HEADER_LEN_FIELD_OFFSET = 2; public const int YUKON_HEADER_LEN = 12; public const int MARS_ID_OFFSET = 8; public const int HEADERTYPE_QNOTIFICATION = 1; public const int HEADERTYPE_MARS = 2; public const int HEADERTYPE_TRACE = 3; public const int SUCCEED = 1; public const int FAIL = 0; public const short TYPE_SIZE_LIMIT = 8000; public const int MIN_PACKET_SIZE = 512; public const int DEFAULT_LOGIN_PACKET_SIZE = 4096; public const int MAX_PRELOGIN_PAYLOAD_LENGTH = 1024; public const int MAX_PACKET_SIZE = 32768; public const int MAX_SERVER_USER_NAME = 256; public const byte MIN_ERROR_CLASS = 11; public const byte MAX_USER_CORRECTABLE_ERROR_CLASS = 16; public const byte FATAL_ERROR_CLASS = 20; public const byte MT_SQL = 1; public const byte MT_LOGIN = 2; public const byte MT_RPC = 3; public const byte MT_TOKENS = 4; public const byte MT_BINARY = 5; public const byte MT_ATTN = 6; public const byte MT_BULK = 7; public const byte MT_OPEN = 8; public const byte MT_CLOSE = 9; public const byte MT_ERROR = 10; public const byte MT_ACK = 11; public const byte MT_ECHO = 12; public const byte MT_LOGOUT = 13; public const byte MT_TRANS = 14; public const byte MT_OLEDB = 15; public const byte MT_LOGIN7 = 16; public const byte MT_SSPI = 17; public const byte MT_PRELOGIN = 18; public const byte ST_EOM = 1; public const byte ST_AACK = 2; public const byte ST_IGNORE = 2; public const byte ST_BATCH = 4; public const byte ST_RESET_CONNECTION = 8; public const byte ST_RESET_CONNECTION_PRESERVE_TRANSACTION = 16; public const byte SQLCOLFMT = 161; public const byte SQLPROCID = 124; public const byte SQLCOLNAME = 160; public const byte SQLTABNAME = 164; public const byte SQLCOLINFO = 165; public const byte SQLALTNAME = 167; public const byte SQLALTFMT = 168; public const byte SQLERROR = 170; public const byte SQLINFO = 171; public const byte SQLRETURNVALUE = 172; public const byte SQLRETURNSTATUS = 121; public const byte SQLRETURNTOK = 219; public const byte SQLALTCONTROL = 175; public const byte SQLROW = 209; public const byte SQLNBCROW = 210; public const byte SQLALTROW = 211; public const byte SQLDONE = 253; public const byte SQLDONEPROC = 254; public const byte SQLDONEINPROC = byte.MaxValue; public const byte SQLOFFSET = 120; public const byte SQLORDER = 169; public const byte SQLDEBUG_CMD = 96; public const byte SQLLOGINACK = 173; public const byte SQLFEATUREEXTACK = 174; public const byte SQLSESSIONSTATE = 228; public const byte SQLENVCHANGE = 227; public const byte SQLSECLEVEL = 237; public const byte SQLROWCRC = 57; public const byte SQLCOLMETADATA = 129; public const byte SQLALTMETADATA = 136; public const byte SQLSSPI = 237; public const byte ENV_DATABASE = 1; public const byte ENV_LANG = 2; public const byte ENV_CHARSET = 3; public const byte ENV_PACKETSIZE = 4; public const byte ENV_LOCALEID = 5; public const byte ENV_COMPFLAGS = 6; public const byte ENV_COLLATION = 7; public const byte ENV_BEGINTRAN = 8; public const byte ENV_COMMITTRAN = 9; public const byte ENV_ROLLBACKTRAN = 10; public const byte ENV_ENLISTDTC = 11; public const byte ENV_DEFECTDTC = 12; public const byte ENV_LOGSHIPNODE = 13; public const byte ENV_PROMOTETRANSACTION = 15; public const byte ENV_TRANSACTIONMANAGERADDRESS = 16; public const byte ENV_TRANSACTIONENDED = 17; public const byte ENV_SPRESETCONNECTIONACK = 18; public const byte ENV_USERINSTANCE = 19; public const byte ENV_ROUTING = 20; public const int DONE_MORE = 1; public const int DONE_ERROR = 2; public const int DONE_INXACT = 4; public const int DONE_PROC = 8; public const int DONE_COUNT = 16; public const int DONE_ATTN = 32; public const int DONE_INPROC = 64; public const int DONE_RPCINBATCH = 128; public const int DONE_SRVERROR = 256; public const int DONE_FMTSENT = 32768; public const byte FEATUREEXT_TERMINATOR = byte.MaxValue; public const byte FEATUREEXT_SRECOVERY = 1; public const byte FEATUREEXT_GLOBALTRANSACTIONS = 5; public const byte MAX_LOG_NAME = 30; public const byte MAX_PROG_NAME = 10; public const byte SEC_COMP_LEN = 8; public const byte MAX_PK_LEN = 6; public const byte MAX_NIC_SIZE = 6; public const byte SQLVARIANT_SIZE = 2; public const byte VERSION_SIZE = 4; public const int CLIENT_PROG_VER = 100663296; public const int YUKON_LOG_REC_FIXED_LEN = 94; public const int TEXT_TIME_STAMP_LEN = 8; public const int COLLATION_INFO_LEN = 4; public const int YUKON_MAJOR = 114; public const int KATMAI_MAJOR = 115; public const int DENALI_MAJOR = 116; public const int YUKON_INCREMENT = 9; public const int KATMAI_INCREMENT = 11; public const int DENALI_INCREMENT = 0; public const int YUKON_RTM_MINOR = 2; public const int KATMAI_MINOR = 3; public const int DENALI_MINOR = 4; public const int ORDER_68000 = 1; public const int USE_DB_ON = 1; public const int INIT_DB_FATAL = 1; public const int SET_LANG_ON = 1; public const int INIT_LANG_FATAL = 1; public const int ODBC_ON = 1; public const int SSPI_ON = 1; public const int REPL_ON = 3; public const int READONLY_INTENT_ON = 1; public const byte SQLLenMask = 48; public const byte SQLFixedLen = 48; public const byte SQLVarLen = 32; public const byte SQLZeroLen = 16; public const byte SQLVarCnt = 0; public const byte SQLDifferentName = 32; public const byte SQLExpression = 4; public const byte SQLKey = 8; public const byte SQLHidden = 16; public const byte Nullable = 1; public const byte Identity = 16; public const byte Updatability = 11; public const byte ClrFixedLen = 1; public const byte IsColumnSet = 4; public const uint VARLONGNULL = uint.MaxValue; public const int VARNULL = 65535; public const int MAXSIZE = 8000; public const byte FIXEDNULL = 0; public const ulong UDTNULL = ulong.MaxValue; public const int SQLVOID = 31; public const int SQLTEXT = 35; public const int SQLVARBINARY = 37; public const int SQLINTN = 38; public const int SQLVARCHAR = 39; public const int SQLBINARY = 45; public const int SQLIMAGE = 34; public const int SQLCHAR = 47; public const int SQLINT1 = 48; public const int SQLBIT = 50; public const int SQLINT2 = 52; public const int SQLINT4 = 56; public const int SQLMONEY = 60; public const int SQLDATETIME = 61; public const int SQLFLT8 = 62; public const int SQLFLTN = 109; public const int SQLMONEYN = 110; public const int SQLDATETIMN = 111; public const int SQLFLT4 = 59; public const int SQLMONEY4 = 122; public const int SQLDATETIM4 = 58; public const int SQLDECIMALN = 106; public const int SQLNUMERICN = 108; public const int SQLUNIQUEID = 36; public const int SQLBIGCHAR = 175; public const int SQLBIGVARCHAR = 167; public const int SQLBIGBINARY = 173; public const int SQLBIGVARBINARY = 165; public const int SQLBITN = 104; public const int SQLNCHAR = 239; public const int SQLNVARCHAR = 231; public const int SQLNTEXT = 99; public const int SQLUDT = 240; public const int AOPCNTB = 9; public const int AOPSTDEV = 48; public const int AOPSTDEVP = 49; public const int AOPVAR = 50; public const int AOPVARP = 51; public const int AOPCNT = 75; public const int AOPSUM = 77; public const int AOPAVG = 79; public const int AOPMIN = 81; public const int AOPMAX = 82; public const int AOPANY = 83; public const int AOPNOOP = 86; public const int SQLTIMESTAMP = 80; public const int MAX_NUMERIC_LEN = 17; public const int DEFAULT_NUMERIC_PRECISION = 29; public const int SPHINX_DEFAULT_NUMERIC_PRECISION = 28; public const int MAX_NUMERIC_PRECISION = 38; public const byte UNKNOWN_PRECISION_SCALE = byte.MaxValue; public const int SQLINT8 = 127; public const int SQLVARIANT = 98; public const int SQLXMLTYPE = 241; public const int XMLUNICODEBOM = 65279; public static readonly byte[] XMLUNICODEBOMBYTES = new byte[2] { 255, 254 }; public const int SQLTABLE = 243; public const int SQLDATE = 40; public const int SQLTIME = 41; public const int SQLDATETIME2 = 42; public const int SQLDATETIMEOFFSET = 43; public const int DEFAULT_VARTIME_SCALE = 7; public const ulong SQL_PLP_NULL = ulong.MaxValue; public const ulong SQL_PLP_UNKNOWNLEN = 18446744073709551614uL; public const int SQL_PLP_CHUNK_TERMINATOR = 0; public const ushort SQL_USHORTVARMAXLEN = ushort.MaxValue; public const byte TVP_ROWCOUNT_ESTIMATE = 18; public const byte TVP_ROW_TOKEN = 1; public const byte TVP_END_TOKEN = 0; public const ushort TVP_NOMETADATA_TOKEN = ushort.MaxValue; public const byte TVP_ORDER_UNIQUE_TOKEN = 16; public const int TVP_DEFAULT_COLUMN = 512; public const byte TVP_ORDERASC_FLAG = 1; public const byte TVP_ORDERDESC_FLAG = 2; public const byte TVP_UNIQUE_FLAG = 4; public const string SP_EXECUTESQL = "sp_executesql"; public const string SP_PREPEXEC = "sp_prepexec"; public const string SP_PREPARE = "sp_prepare"; public const string SP_EXECUTE = "sp_execute"; public const string SP_UNPREPARE = "sp_unprepare"; public const string SP_PARAMS = "sp_procedure_params_rowset"; public const string SP_PARAMS_MANAGED = "sp_procedure_params_managed"; public const string SP_PARAMS_MGD10 = "sp_procedure_params_100_managed"; public const ushort RPC_PROCID_CURSOR = 1; public const ushort RPC_PROCID_CURSOROPEN = 2; public const ushort RPC_PROCID_CURSORPREPARE = 3; public const ushort RPC_PROCID_CURSOREXECUTE = 4; public const ushort RPC_PROCID_CURSORPREPEXEC = 5; public const ushort RPC_PROCID_CURSORUNPREPARE = 6; public const ushort RPC_PROCID_CURSORFETCH = 7; public const ushort RPC_PROCID_CURSOROPTION = 8; public const ushort RPC_PROCID_CURSORCLOSE = 9; public const ushort RPC_PROCID_EXECUTESQL = 10; public const ushort RPC_PROCID_PREPARE = 11; public const ushort RPC_PROCID_EXECUTE = 12; public const ushort RPC_PROCID_PREPEXEC = 13; public const ushort RPC_PROCID_PREPEXECRPC = 14; public const ushort RPC_PROCID_UNPREPARE = 15; public const string TRANS_BEGIN = "BEGIN TRANSACTION"; public const string TRANS_COMMIT = "COMMIT TRANSACTION"; public const string TRANS_ROLLBACK = "ROLLBACK TRANSACTION"; public const string TRANS_IF_ROLLBACK = "IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION"; public const string TRANS_SAVE = "SAVE TRANSACTION"; public const string TRANS_READ_COMMITTED = "SET TRANSACTION ISOLATION LEVEL READ COMMITTED"; public const string TRANS_READ_UNCOMMITTED = "SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED"; public const string TRANS_REPEATABLE_READ = "SET TRANSACTION ISOLATION LEVEL REPEATABLE READ"; public const string TRANS_SERIALIZABLE = "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE"; public const string TRANS_SNAPSHOT = "SET TRANSACTION ISOLATION LEVEL SNAPSHOT"; public const byte SHILOH_RPCBATCHFLAG = 128; public const byte YUKON_RPCBATCHFLAG = byte.MaxValue; public const byte RPC_RECOMPILE = 1; public const byte RPC_NOMETADATA = 2; public const byte RPC_PARAM_BYREF = 1; public const byte RPC_PARAM_DEFAULT = 2; public const byte RPC_PARAM_IS_LOB_COOKIE = 8; public const string PARAM_OUTPUT = "output"; public const int MAX_PARAMETER_NAME_LENGTH = 128; public const string FMTONLY_ON = " SET FMTONLY ON;"; public const string FMTONLY_OFF = " SET FMTONLY OFF;"; public const string BROWSE_ON = " SET NO_BROWSETABLE ON;"; public const string BROWSE_OFF = " SET NO_BROWSETABLE OFF;"; public const string TABLE = "Table"; public const int EXEC_THRESHOLD = 3; public const short TIMEOUT_EXPIRED = -2; public const short ENCRYPTION_NOT_SUPPORTED = 20; public const int LOGON_FAILED = 18456; public const int PASSWORD_EXPIRED = 18488; public const int IMPERSONATION_FAILED = 1346; public const int P_TOKENTOOLONG = 103; public const uint SNI_UNINITIALIZED = uint.MaxValue; public const uint SNI_SUCCESS = 0u; public const uint SNI_ERROR = 1u; public const uint SNI_WAIT_TIMEOUT = 258u; public const uint SNI_SUCCESS_IO_PENDING = 997u; public const short SNI_WSAECONNRESET = 10054; public const uint SNI_QUEUE_FULL = 1048576u; public const uint SNI_SSL_VALIDATE_CERTIFICATE = 1u; public const uint SNI_SSL_USE_SCHANNEL_CACHE = 2u; public const uint SNI_SSL_IGNORE_CHANNEL_BINDINGS = 16u; public const string DEFAULT_ENGLISH_CODE_PAGE_STRING = "iso_1"; public const short DEFAULT_ENGLISH_CODE_PAGE_VALUE = 1252; public const short CHARSET_CODE_PAGE_OFFSET = 2; internal const int MAX_SERVERNAME = 255; internal const ushort SELECT = 193; internal const ushort INSERT = 195; internal const ushort DELETE = 196; internal const ushort UPDATE = 197; internal const ushort ABORT = 210; internal const ushort BEGINXACT = 212; internal const ushort ENDXACT = 213; internal const ushort BULKINSERT = 240; internal const ushort OPENCURSOR = 32; internal const ushort MERGE = 279; internal const ushort MAXLEN_HOSTNAME = 128; internal const ushort MAXLEN_USERNAME = 128; internal const ushort MAXLEN_PASSWORD = 128; internal const ushort MAXLEN_APPNAME = 128; internal const ushort MAXLEN_SERVERNAME = 128; internal const ushort MAXLEN_CLIENTINTERFACE = 128; internal const ushort MAXLEN_LANGUAGE = 128; internal const ushort MAXLEN_DATABASE = 128; internal const ushort MAXLEN_ATTACHDBFILE = 260; internal const ushort MAXLEN_NEWPASSWORD = 128; public static readonly ushort[] CODE_PAGE_FROM_SORT_ID = new ushort[256] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 437, 437, 437, 437, 437, 0, 0, 0, 0, 0, 850, 850, 850, 850, 850, 0, 0, 0, 0, 850, 1252, 1252, 1252, 1252, 1252, 850, 850, 850, 850, 850, 850, 850, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1252, 1252, 1252, 1252, 1252, 0, 0, 0, 0, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 0, 0, 0, 0, 0, 1251, 1251, 1251, 1251, 1251, 0, 0, 0, 1253, 1253, 1253, 0, 0, 0, 0, 0, 1253, 1253, 1253, 0, 1253, 0, 0, 0, 1254, 1254, 1254, 0, 0, 0, 0, 0, 1255, 1255, 1255, 0, 0, 0, 0, 0, 1256, 1256, 1256, 0, 0, 0, 0, 0, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1252, 1252, 1252, 1252, 0, 0, 0, 0, 0, 932, 932, 949, 949, 950, 950, 936, 936, 932, 949, 950, 936, 874, 874, 874, 0, 0, 0, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; internal static readonly long[] TICKS_FROM_SCALE = new long[8] { 10000000L, 1000000L, 100000L, 10000L, 1000L, 100L, 10L, 1L }; internal const int WHIDBEY_DATE_LENGTH = 10; internal static readonly int[] WHIDBEY_TIME_LENGTH = new int[8] { 8, 10, 11, 12, 13, 14, 15, 16 }; internal static readonly int[] WHIDBEY_DATETIME2_LENGTH = new int[8] { 19, 21, 22, 23, 24, 25, 26, 27 }; internal static readonly int[] WHIDBEY_DATETIMEOFFSET_LENGTH = new int[8] { 26, 28, 29, 30, 31, 32, 33, 34 }; internal static string GetSniContextEnumName(SniContext sniContext) { return sniContext switch { SniContext.Undefined => "Undefined", SniContext.Snix_Connect => "Snix_Connect", SniContext.Snix_PreLoginBeforeSuccessfulWrite => "Snix_PreLoginBeforeSuccessfulWrite", SniContext.Snix_PreLogin => "Snix_PreLogin", SniContext.Snix_LoginSspi => "Snix_LoginSspi", SniContext.Snix_ProcessSspi => "Snix_ProcessSspi", SniContext.Snix_Login => "Snix_Login", SniContext.Snix_EnableMars => "Snix_EnableMars", SniContext.Snix_AutoEnlist => "Snix_AutoEnlist", SniContext.Snix_GetMarsSession => "Snix_GetMarsSession", SniContext.Snix_Execute => "Snix_Execute", SniContext.Snix_Read => "Snix_Read", SniContext.Snix_Close => "Snix_Close", SniContext.Snix_SendRows => "Snix_SendRows", _ => null, }; } } internal enum SniContext { Undefined, Snix_Connect, Snix_PreLoginBeforeSuccessfulWrite, Snix_PreLogin, Snix_LoginSspi, Snix_ProcessSspi, Snix_Login, Snix_EnableMars, Snix_AutoEnlist, Snix_GetMarsSession, Snix_Execute, Snix_Read, Snix_Close, Snix_SendRows } internal class TdsParameterSetter : SmiTypedGetterSetter { private TdsRecordBufferSetter _target; internal override bool CanGet => false; internal override bool CanSet => true; internal TdsParameterSetter(TdsParserStateObject stateObj, SmiMetaData md) { _target = new TdsRecordBufferSetter(stateObj, md); } internal override SmiTypedGetterSetter GetTypedGetterSetter(SmiEventSink sink, int ordinal) { return _target; } public override void SetDBNull(SmiEventSink sink, int ordinal) { _target.EndElements(sink); } } internal sealed class TdsParser { private class TdsOrderUnique { internal short ColumnOrdinal; internal byte Flags; internal TdsOrderUnique(short ordinal, byte flags) { ColumnOrdinal = ordinal; Flags = flags; } } private class TdsOutputStream : Stream { private TdsParser _parser; private TdsParserStateObject _stateObj; private byte[] _preambleToStrip; public override bool CanRead => false; public override bool CanSeek => false; public override bool CanWrite => true; public override long Length { get { throw new NotSupportedException(); } } public override long Position { get { throw new NotSupportedException(); } set { throw new NotSupportedException(); } } public TdsOutputStream(TdsParser parser, TdsParserStateObject stateObj, byte[] preambleToStrip) { _parser = parser; _stateObj = stateObj; _preambleToStrip = preambleToStrip; } public override void Flush() { } public override int Read(byte[] buffer, int offset, int count) { throw new NotSupportedException(); } public override long Seek(long offset, SeekOrigin origin) { throw new NotSupportedException(); } public override void SetLength(long value) { throw new NotSupportedException(); } private void StripPreamble(byte[] buffer, ref int offset, ref int count) { if (_preambleToStrip != null && count >= _preambleToStrip.Length) { for (int i = 0; i < _preambleToStrip.Length; i++) { if (_preambleToStrip[i] != buffer[i]) { _preambleToStrip = null; return; } } offset += _preambleToStrip.Length; count -= _preambleToStrip.Length; } _preambleToStrip = null; } public override void Write(byte[] buffer, int offset, int count) { ValidateWriteParameters(buffer, offset, count); StripPreamble(buffer, ref offset, ref count); if (count > 0) { _parser.WriteInt(count, _stateObj); _stateObj.WriteByteArray(buffer, count, offset); } } public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { ValidateWriteParameters(buffer, offset, count); StripPreamble(buffer, ref offset, ref count); Task task = null; if (count > 0) { _parser.WriteInt(count, _stateObj); task = _stateObj.WriteByteArray(buffer, count, offset, canAccumulate: false); } return task ?? Task.CompletedTask; } internal static void ValidateWriteParameters(byte[] buffer, int offset, int count) { if (buffer == null) { throw ADP.ArgumentNull("buffer"); } if (offset < 0) { throw ADP.ArgumentOutOfRange("offset"); } if (count < 0) { throw ADP.ArgumentOutOfRange("count"); } try { if (checked(offset + count) > buffer.Length) { throw ExceptionBuilder.InvalidOffsetLength(); } } catch (OverflowException) { throw ExceptionBuilder.InvalidOffsetLength(); } } } private class ConstrainedTextWriter : TextWriter { private TextWriter _next; private int _size; private int _written; public bool IsComplete { get { if (_size > 0) { return _written >= _size; } return false; } } public override Encoding Encoding => _next.Encoding; public ConstrainedTextWriter(TextWriter next, int size) { _next = next; _size = size; _written = 0; if (_size < 1) { _size = int.MaxValue; } } public override void Flush() { _next.Flush(); } public override Task FlushAsync() { return _next.FlushAsync(); } public override void Write(char value) { if (_written < _size) { _next.Write(value); _written++; } } public override void Write(char[] buffer, int index, int count) { ValidateWriteParameters(buffer, index, count); count = Math.Min(_size - _written, count); if (count > 0) { _next.Write(buffer, index, count); } _written += count; } public override Task WriteAsync(char value) { if (_written < _size) { _written++; return _next.WriteAsync(value); } return Task.CompletedTask; } public override Task WriteAsync(char[] buffer, int index, int count) { ValidateWriteParameters(buffer, index, count); count = Math.Min(_size - _written, count); if (count > 0) { _written += count; return _next.WriteAsync(buffer, index, count); } return Task.CompletedTask; } public override Task WriteAsync(string value) { return WriteAsync(value.ToCharArray()); } internal static void ValidateWriteParameters(char[] buffer, int offset, int count) { if (buffer == null) { throw ADP.ArgumentNull("buffer"); } if (offset < 0) { throw ADP.ArgumentOutOfRange("offset"); } if (count < 0) { throw ADP.ArgumentOutOfRange("count"); } try { if (checked(offset + count) > buffer.Length) { throw ExceptionBuilder.InvalidOffsetLength(); } } catch (OverflowException) { throw ExceptionBuilder.InvalidOffsetLength(); } } } internal TdsParserStateObject _physicalStateObj; internal TdsParserStateObject _pMarsPhysicalConObj; private const int constBinBufferSize = 4096; private const int constTextBufferSize = 4096; internal TdsParserState _state; private string _server = ""; internal volatile bool _fResetConnection; internal volatile bool _fPreserveTransaction; private SqlCollation _defaultCollation; private int _defaultCodePage; private int _defaultLCID; internal Encoding _defaultEncoding; private static EncryptionOptions s_sniSupportedEncryptionOption = TdsParserStateObjectFactory.Singleton.EncryptionOptions; private EncryptionOptions _encryptionOption = s_sniSupportedEncryptionOption; private SqlInternalTransaction _currentTransaction; private SqlInternalTransaction _pendingTransaction; private long _retainedTransactionId; private int _nonTransactedOpenResultCount; private SqlInternalConnectionTds _connHandler; private bool _fMARS; internal bool _loginWithFailover; internal AutoResetEvent _resetConnectionEvent; internal TdsParserSessionPool _sessionPool; private bool _isYukon; private bool _isKatmai; private bool _isDenali; private byte[] _sniSpnBuffer; private SqlStatistics _statistics; private bool _statisticsIsInTransaction; private static byte[] s_nicAddress; private static volatile uint s_maxSSPILength = 0u; private static readonly byte[] s_longDataHeader = new byte[25] { 16, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }; private static object s_tdsParserLock = new object(); private static readonly byte[] s_xmlMetadataSubstituteSequence = new byte[8] { 231, 255, 255, 0, 0, 0, 0, 0 }; private const int GUID_SIZE = 16; internal bool _asyncWrite; private static readonly IEnumerable s_tvpEmptyValue = new SqlDataRecord[0]; private const ulong _indeterminateSize = ulong.MaxValue; internal SqlInternalConnectionTds Connection => _connHandler; internal SqlInternalTransaction CurrentTransaction { get { return _currentTransaction; } set { if ((_currentTransaction == null && value != null) || (_currentTransaction != null && value == null)) { _currentTransaction = value; } } } internal int DefaultLCID => _defaultLCID; internal EncryptionOptions EncryptionOptions { get { return _encryptionOption; } set { _encryptionOption = value; } } internal bool IsKatmaiOrNewer => _isKatmai; internal bool MARSOn => _fMARS; internal SqlInternalTransaction PendingTransaction { get { return _pendingTransaction; } set { _pendingTransaction = value; } } internal string Server => _server; internal TdsParserState State { get { return _state; } set { _state = value; } } internal SqlStatistics Statistics { get { return _statistics; } set { _statistics = value; } } internal void PostReadAsyncForMars() { } private void LoadSSPILibrary() { } private void WaitForSSLHandShakeToComplete(ref uint error) { } private SNIErrorDetails GetSniErrorDetails() { SNIError lastError = SNIProxy.Singleton.GetLastError(); SNIErrorDetails result = default(SNIErrorDetails); result.sniErrorNumber = lastError.sniError; result.errorMessage = lastError.errorMessage; result.nativeError = lastError.nativeError; result.provider = (int)lastError.provider; result.lineNumber = lastError.lineNumber; result.function = lastError.function; result.exception = lastError.exception; return result; } internal TdsParser(bool MARS, bool fAsynchronous) { _fMARS = MARS; _physicalStateObj = TdsParserStateObjectFactory.Singleton.CreateTdsParserStateObject(this); } internal int IncrementNonTransactedOpenResultCount() { return Interlocked.Increment(ref _nonTransactedOpenResultCount); } internal void DecrementNonTransactedOpenResultCount() { Interlocked.Decrement(ref _nonTransactedOpenResultCount); } internal void ProcessPendingAck(TdsParserStateObject stateObj) { if (stateObj._attentionSent) { ProcessAttention(stateObj); } } internal void Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, bool ignoreSniOpenTimeout, long timerExpire, bool encrypt, bool trustServerCert, bool integratedSecurity, bool withFailover) { if (_state != 0) { return; } _connHandler = connHandler; _loginWithFailover = withFailover; if (TdsParserStateObjectFactory.Singleton.SNIStatus != 0) { _physicalStateObj.AddError(ProcessSNIError(_physicalStateObj)); _physicalStateObj.Dispose(); ThrowExceptionAndWarning(_physicalStateObj); } _sniSpnBuffer = null; if (integratedSecurity) { LoadSSPILibrary(); } byte[] instanceName = null; _connHandler.TimeoutErrorInternal.EndPhase(SqlConnectionTimeoutErrorPhase.PreLoginBegin); _connHandler.TimeoutErrorInternal.SetAndBeginPhase(SqlConnectionTimeoutErrorPhase.InitializeConnection); bool multiSubnetFailover = _connHandler.ConnectionOptions.MultiSubnetFailover; _physicalStateObj.CreatePhysicalSNIHandle(serverInfo.ExtendedServerName, ignoreSniOpenTimeout, timerExpire, out instanceName, ref _sniSpnBuffer, flushCache: false, async: true, multiSubnetFailover, integratedSecurity); if (_physicalStateObj.Status != 0) { _physicalStateObj.AddError(ProcessSNIError(_physicalStateObj)); _physicalStateObj.Dispose(); ThrowExceptionAndWarning(_physicalStateObj); } _server = serverInfo.ResolvedServerName; if (connHandler.PoolGroupProviderInfo != null) { connHandler.PoolGroupProviderInfo.AliasCheck((serverInfo.PreRoutingServerName == null) ? serverInfo.ResolvedServerName : serverInfo.PreRoutingServerName); } _state = TdsParserState.OpenNotLoggedIn; _physicalStateObj.SniContext = SniContext.Snix_PreLoginBeforeSuccessfulWrite; _physicalStateObj.TimeoutTime = timerExpire; bool marsCapable = false; _connHandler.TimeoutErrorInternal.EndPhase(SqlConnectionTimeoutErrorPhase.InitializeConnection); _connHandler.TimeoutErrorInternal.SetAndBeginPhase(SqlConnectionTimeoutErrorPhase.SendPreLoginHandshake); _physicalStateObj.SniGetConnectionId(ref _connHandler._clientConnectionId); SendPreLoginHandshake(instanceName, encrypt); _connHandler.TimeoutErrorInternal.EndPhase(SqlConnectionTimeoutErrorPhase.SendPreLoginHandshake); _connHandler.TimeoutErrorInternal.SetAndBeginPhase(SqlConnectionTimeoutErrorPhase.ConsumePreLoginHandshake); _physicalStateObj.SniContext = SniContext.Snix_PreLogin; if (ConsumePreLoginHandshake(encrypt, trustServerCert, integratedSecurity, out marsCapable) == PreLoginHandshakeStatus.InstanceFailure) { _physicalStateObj.Dispose(); _physicalStateObj.SniContext = SniContext.Snix_Connect; _physicalStateObj.CreatePhysicalSNIHandle(serverInfo.ExtendedServerName, ignoreSniOpenTimeout, timerExpire, out instanceName, ref _sniSpnBuffer, flushCache: true, async: true, multiSubnetFailover, integratedSecurity); if (_physicalStateObj.Status != 0) { _physicalStateObj.AddError(ProcessSNIError(_physicalStateObj)); ThrowExceptionAndWarning(_physicalStateObj); } _physicalStateObj.SniGetConnectionId(ref _connHandler._clientConnectionId); SendPreLoginHandshake(instanceName, encrypt); if (ConsumePreLoginHandshake(encrypt, trustServerCert, integratedSecurity, out marsCapable) == PreLoginHandshakeStatus.InstanceFailure) { throw SQL.InstanceFailure(); } } if (_fMARS && marsCapable) { _sessionPool = new TdsParserSessionPool(this); } else { _fMARS = false; } } internal void RemoveEncryption() { if (_physicalStateObj.DisabeSsl() != 0) { _physicalStateObj.AddError(ProcessSNIError(_physicalStateObj)); ThrowExceptionAndWarning(_physicalStateObj); } _physicalStateObj.ClearAllWritePackets(); } internal void EnableMars() { if (_fMARS) { _pMarsPhysicalConObj = _physicalStateObj; if (TdsParserStateObjectFactory.UseManagedSNI) { _pMarsPhysicalConObj.IncrementPendingCallbacks(); } uint info = 0u; if (_pMarsPhysicalConObj.EnableMars(ref info) != 0) { _physicalStateObj.AddError(ProcessSNIError(_physicalStateObj)); ThrowExceptionAndWarning(_physicalStateObj); } PostReadAsyncForMars(); _physicalStateObj = CreateSession(); } } internal TdsParserStateObject CreateSession() { return TdsParserStateObjectFactory.Singleton.CreateSessionObject(this, _pMarsPhysicalConObj, v: true); } internal TdsParserStateObject GetSession(object owner) { TdsParserStateObject tdsParserStateObject = null; if (MARSOn) { return _sessionPool.GetSession(owner); } return _physicalStateObj; } internal void PutSession(TdsParserStateObject session) { if (MARSOn) { _sessionPool.PutSession(session); } else if (_state == TdsParserState.Closed || _state == TdsParserState.Broken) { _physicalStateObj.SniContext = SniContext.Snix_Close; _physicalStateObj.Dispose(); } else { _physicalStateObj.Owner = null; } } private void SendPreLoginHandshake(byte[] instanceName, bool encrypt) { _physicalStateObj._outputMessageType = 18; int num = 31; byte[] array = new byte[1054]; int num2 = 0; for (int i = 0; i < 6; i++) { int num3 = 0; _physicalStateObj.WriteByte((byte)i); _physicalStateObj.WriteByte((byte)((num & 0xFF00) >> 8)); _physicalStateObj.WriteByte((byte)((uint)num & 0xFFu)); switch (i) { case 0: { Version assemblyVersion = ADP.GetAssemblyVersion(); array[num2++] = (byte)((uint)assemblyVersion.Major & 0xFFu); array[num2++] = (byte)((uint)assemblyVersion.Minor & 0xFFu); array[num2++] = (byte)((assemblyVersion.Build & 0xFF00) >> 8); array[num2++] = (byte)((uint)assemblyVersion.Build & 0xFFu); array[num2++] = (byte)((uint)assemblyVersion.Revision & 0xFFu); array[num2++] = (byte)((assemblyVersion.Revision & 0xFF00) >> 8); num += 6; num3 = 6; break; } case 1: if (_encryptionOption == EncryptionOptions.NOT_SUP) { array[num2] = 2; } else if (encrypt) { array[num2] = 1; _encryptionOption = EncryptionOptions.ON; } else { array[num2] = 0; _encryptionOption = EncryptionOptions.OFF; } num2++; num++; num3 = 1; break; case 2: { int j; for (j = 0; instanceName[j] != 0; j++) { array[num2] = instanceName[j]; num2++; } array[num2] = 0; num2++; j++; num += j; num3 = j; break; } case 3: { int currentThreadIdForTdsLoginOnly = TdsParserStaticMethods.GetCurrentThreadIdForTdsLoginOnly(); array[num2++] = (byte)((0xFF000000u & currentThreadIdForTdsLoginOnly) >> 24); array[num2++] = (byte)((0xFF0000 & currentThreadIdForTdsLoginOnly) >> 16); array[num2++] = (byte)((0xFF00 & currentThreadIdForTdsLoginOnly) >> 8); array[num2++] = (byte)(0xFFu & (uint)currentThreadIdForTdsLoginOnly); num += 4; num3 = 4; break; } case 4: array[num2++] = (byte)(_fMARS ? 1u : 0u); num++; num3++; break; case 5: { Buffer.BlockCopy(_connHandler._clientConnectionId.ToByteArray(), 0, array, num2, 16); num2 += 16; num += 16; num3 = 16; ActivityCorrelator.ActivityId activityId = ActivityCorrelator.Next(); Buffer.BlockCopy(activityId.Id.ToByteArray(), 0, array, num2, 16); num2 += 16; array[num2++] = (byte)(0xFFu & activityId.Sequence); array[num2++] = (byte)((0xFF00 & activityId.Sequence) >> 8); array[num2++] = (byte)((0xFF0000 & activityId.Sequence) >> 16); array[num2++] = (byte)((0xFF000000u & activityId.Sequence) >> 24); int num4 = 20; num += num4; num3 += num4; break; } } _physicalStateObj.WriteByte((byte)((num3 & 0xFF00) >> 8)); _physicalStateObj.WriteByte((byte)((uint)num3 & 0xFFu)); } _physicalStateObj.WriteByte(byte.MaxValue); _physicalStateObj.WriteByteArray(array, num2, 0); _physicalStateObj.WritePacket(1); } private PreLoginHandshakeStatus ConsumePreLoginHandshake(bool encrypt, bool trustServerCert, bool integratedSecurity, out bool marsCapable) { marsCapable = _fMARS; bool flag = false; if (!_physicalStateObj.TryReadNetworkPacket()) { throw SQL.SynchronousCallMayNotPend(); } if (_physicalStateObj._inBytesRead == 0) { _physicalStateObj.AddError(new SqlError(0, 0, 20, _server, SQLMessage.PreloginError(), "", 0)); _physicalStateObj.Dispose(); ThrowExceptionAndWarning(_physicalStateObj); } if (!_physicalStateObj.TryProcessHeader()) { throw SQL.SynchronousCallMayNotPend(); } if (_physicalStateObj._inBytesPacket > 32768 || _physicalStateObj._inBytesPacket <= 0) { throw SQL.ParsingError(); } byte[] array = new byte[_physicalStateObj._inBytesPacket]; if (!_physicalStateObj.TryReadByteArray(array, 0, array.Length)) { throw SQL.SynchronousCallMayNotPend(); } if (array[0] == 170) { throw SQL.InvalidSQLServerVersionUnknown(); } int num = 0; int num2 = 0; int num3 = array[num++]; while (true) { switch (num3) { case 0: { num2 = (array[num++] << 8) | array[num++]; _ = array[num++]; _ = array[num++]; byte num5 = array[num2]; _ = array[num2 + 1]; _ = array[num2 + 2]; _ = array[num2 + 3]; flag = num5 >= 9; if (!flag) { marsCapable = false; } goto IL_0345; } case 1: { num2 = (array[num++] << 8) | array[num++]; _ = array[num++]; _ = array[num++]; EncryptionOptions encryptionOptions = (EncryptionOptions)array[num2]; switch (_encryptionOption) { case EncryptionOptions.ON: if (encryptionOptions == EncryptionOptions.NOT_SUP) { _physicalStateObj.AddError(new SqlError(20, 0, 20, _server, SQLMessage.EncryptionNotSupportedByServer(), "", 0)); _physicalStateObj.Dispose(); ThrowExceptionAndWarning(_physicalStateObj); } break; case EncryptionOptions.OFF: switch (encryptionOptions) { case EncryptionOptions.OFF: _encryptionOption = EncryptionOptions.LOGIN; break; case EncryptionOptions.REQ: _encryptionOption = EncryptionOptions.ON; break; } break; case EncryptionOptions.NOT_SUP: if (encryptionOptions == EncryptionOptions.REQ) { _physicalStateObj.AddError(new SqlError(20, 0, 20, _server, SQLMessage.EncryptionNotSupportedByClient(), "", 0)); _physicalStateObj.Dispose(); ThrowExceptionAndWarning(_physicalStateObj); } break; } if (_encryptionOption == EncryptionOptions.ON || _encryptionOption == EncryptionOptions.LOGIN) { uint num4 = 0u; uint info = ((encrypt && !trustServerCert) ? 1u : 0u) | (flag ? 2u : 0u); if (encrypt && !integratedSecurity) { info |= 0x10u; } num4 = _physicalStateObj.EnableSsl(ref info); if (num4 != 0) { _physicalStateObj.AddError(ProcessSNIError(_physicalStateObj)); ThrowExceptionAndWarning(_physicalStateObj); } WaitForSSLHandShakeToComplete(ref num4); _physicalStateObj.ClearAllWritePackets(); } goto IL_0345; } case 2: { num2 = (array[num++] << 8) | array[num++]; _ = array[num++]; _ = array[num++]; byte b = 1; if (array[num2] == b) { return PreLoginHandshakeStatus.InstanceFailure; } goto IL_0345; } case 3: num += 4; goto IL_0345; case 4: num2 = (array[num++] << 8) | array[num++]; _ = array[num++]; _ = array[num++]; marsCapable = ((array[num2] != 0) ? true : false); goto IL_0345; case 5: num += 4; goto IL_0345; default: num += 4; goto IL_0345; case 255: break; IL_0345: if (num < array.Length) { goto IL_034b; } break; } break; IL_034b: num3 = array[num++]; } return PreLoginHandshakeStatus.Successful; } internal void Deactivate(bool connectionIsDoomed) { if (MARSOn) { _sessionPool.Deactivate(); } if (!connectionIsDoomed && _physicalStateObj != null) { if (_physicalStateObj._pendingData) { DrainData(_physicalStateObj); } if (_physicalStateObj.HasOpenResult) { _physicalStateObj.DecrementOpenResultCount(); } } SqlInternalTransaction currentTransaction = CurrentTransaction; if (currentTransaction != null && currentTransaction.HasParentTransaction) { currentTransaction.CloseFromConnection(); } Statistics = null; } internal void Disconnect() { if (_sessionPool != null) { _sessionPool.Dispose(); } if (_state == TdsParserState.Closed) { return; } _state = TdsParserState.Closed; try { if (!_physicalStateObj.HasOwner) { _physicalStateObj.SniContext = SniContext.Snix_Close; _physicalStateObj.Dispose(); } else { _physicalStateObj.DecrementPendingCallbacks(release: false); } if (_pMarsPhysicalConObj != null) { _pMarsPhysicalConObj.Dispose(); } } finally { _pMarsPhysicalConObj = null; } } private void FireInfoMessageEvent(SqlConnection connection, TdsParserStateObject stateObj, SqlError error) { string serverVersion = null; if (_state == TdsParserState.OpenLoggedIn) { serverVersion = _connHandler.ServerVersion; } SqlException exception = SqlException.CreateException(new SqlErrorCollection { error }, serverVersion, _connHandler); connection.OnInfoMessage(new SqlInfoMessageEventArgs(exception), out var notified); if (notified) { stateObj._syncOverAsync = true; } } internal void DisconnectTransaction(SqlInternalTransaction internalTransaction) { if (_currentTransaction != null && _currentTransaction == internalTransaction) { _currentTransaction = null; } } internal void RollbackOrphanedAPITransactions() { SqlInternalTransaction currentTransaction = CurrentTransaction; if (currentTransaction != null && currentTransaction.HasParentTransaction && currentTransaction.IsOrphaned) { currentTransaction.CloseFromConnection(); } } internal void ThrowExceptionAndWarning(TdsParserStateObject stateObj, bool callerHasConnectionLock = false, bool asyncClose = false) { SqlException ex = null; bool broken; SqlErrorCollection fullErrorAndWarningCollection = stateObj.GetFullErrorAndWarningCollection(out broken); broken &= _state != TdsParserState.Closed; if (broken) { if (_state == TdsParserState.OpenNotLoggedIn && (_connHandler.ConnectionOptions.MultiSubnetFailover || _loginWithFailover) && fullErrorAndWarningCollection.Count == 1 && (fullErrorAndWarningCollection[0].Number == -2 || (long)fullErrorAndWarningCollection[0].Number == 258)) { broken = false; Disconnect(); } else { _state = TdsParserState.Broken; } } if (fullErrorAndWarningCollection != null && fullErrorAndWarningCollection.Count > 0) { string serverVersion = null; if (_state == TdsParserState.OpenLoggedIn) { serverVersion = _connHandler.ServerVersion; } ex = ((fullErrorAndWarningCollection.Count != 1 || fullErrorAndWarningCollection[0].Exception == null) ? SqlException.CreateException(fullErrorAndWarningCollection, serverVersion, _connHandler) : SqlException.CreateException(fullErrorAndWarningCollection, serverVersion, _connHandler, fullErrorAndWarningCollection[0].Exception)); } if (ex == null) { return; } if (broken) { stateObj._networkPacketTaskSource?.TrySetException(ADP.ExceptionWithStackTrace(ex)); } if (asyncClose) { SqlInternalConnectionTds connHandler = _connHandler; Action wrapCloseInAction = delegate(Action closeAction) { Task.Factory.StartNew(delegate { connHandler._parserLock.Wait(canReleaseFromAnyThread: false); connHandler.ThreadHasParserLockForClose = true; try { closeAction(); } finally { connHandler.ThreadHasParserLockForClose = false; connHandler._parserLock.Release(); } }); }; _connHandler.OnError(ex, broken, wrapCloseInAction); return; } bool threadHasParserLockForClose = _connHandler.ThreadHasParserLockForClose; if (callerHasConnectionLock) { _connHandler.ThreadHasParserLockForClose = true; } try { _connHandler.OnError(ex, broken); } finally { if (callerHasConnectionLock) { _connHandler.ThreadHasParserLockForClose = threadHasParserLockForClose; } } } internal SqlError ProcessSNIError(TdsParserStateObject stateObj) { SNIErrorDetails sniErrorDetails = GetSniErrorDetails(); if (sniErrorDetails.sniErrorNumber != 0) { switch (sniErrorDetails.sniErrorNumber) { case 47u: throw SQL.MultiSubnetFailoverWithMoreThan64IPs(); case 48u: throw SQL.MultiSubnetFailoverWithInstanceSpecified(); case 49u: throw SQL.MultiSubnetFailoverWithNonTcpProtocol(); } } string text = sniErrorDetails.errorMessage; _ = TdsParserStateObjectFactory.UseManagedSNI; string sniContextEnumName = TdsEnums.GetSniContextEnumName(stateObj.SniContext); string resourceString = SR.GetResourceString(sniContextEnumName, sniContextEnumName); string text2 = string.Format(null, "SNI_PN{0}", sniErrorDetails.provider); string resourceString2 = SR.GetResourceString(text2, text2); if (sniErrorDetails.sniErrorNumber == 0) { int num = text.IndexOf(':'); if (0 <= num) { int length = text.Length; length -= Environment.NewLine.Length; num += 2; length -= num; if (length > 0) { text = text.Substring(num, length); } } } else if (TdsParserStateObjectFactory.UseManagedSNI) { string sNIErrorMessage = SQL.GetSNIErrorMessage((int)sniErrorDetails.sniErrorNumber); text = ((text != string.Empty) ? (sNIErrorMessage + ": " + text) : sNIErrorMessage); } else { text = SQL.GetSNIErrorMessage((int)sniErrorDetails.sniErrorNumber); if (sniErrorDetails.sniErrorNumber == 50) { text += LocalDBAPI.GetLocalDBMessage((int)sniErrorDetails.nativeError); } } text = string.Format(null, "{0} (provider: {1}, error: {2} - {3})", resourceString, resourceString2, (int)sniErrorDetails.sniErrorNumber, text); return new SqlError((int)sniErrorDetails.nativeError, 0, 20, _server, text, sniErrorDetails.function, (int)sniErrorDetails.lineNumber, sniErrorDetails.nativeError, sniErrorDetails.exception); } internal void CheckResetConnection(TdsParserStateObject stateObj) { if (!_fResetConnection || stateObj._fResetConnectionSent) { return; } try { if (_fMARS && !stateObj._fResetEventOwned) { stateObj._fResetEventOwned = _resetConnectionEvent.WaitOne(stateObj.GetTimeoutRemaining()); if (stateObj._fResetEventOwned && stateObj.TimeoutHasExpired) { stateObj._fResetEventOwned = !_resetConnectionEvent.Set(); stateObj.TimeoutTime = 0L; } if (!stateObj._fResetEventOwned) { stateObj.ResetBuffer(); stateObj.AddError(new SqlError(-2, 0, 11, _server, _connHandler.TimeoutErrorInternal.GetErrorMessage(), "", 0, 258u)); ThrowExceptionAndWarning(stateObj, callerHasConnectionLock: true); } } if (_fResetConnection) { if (_fPreserveTransaction) { stateObj._outBuff[1] = (byte)(stateObj._outBuff[1] | 0x10u); } else { stateObj._outBuff[1] = (byte)(stateObj._outBuff[1] | 8u); } if (!_fMARS) { _fResetConnection = false; _fPreserveTransaction = false; } else { stateObj._fResetConnectionSent = true; } } else if (_fMARS && stateObj._fResetEventOwned) { stateObj._fResetEventOwned = !_resetConnectionEvent.Set(); } } catch (Exception) { if (_fMARS && stateObj._fResetEventOwned) { stateObj._fResetConnectionSent = false; stateObj._fResetEventOwned = !_resetConnectionEvent.Set(); } throw; } } internal void WriteShort(int v, TdsParserStateObject stateObj) { if (stateObj._outBytesUsed + 2 > stateObj._outBuff.Length) { stateObj.WriteByte((byte)((uint)v & 0xFFu)); stateObj.WriteByte((byte)((uint)(v >> 8) & 0xFFu)); } else { stateObj._outBuff[stateObj._outBytesUsed] = (byte)((uint)v & 0xFFu); stateObj._outBuff[stateObj._outBytesUsed + 1] = (byte)((uint)(v >> 8) & 0xFFu); stateObj._outBytesUsed += 2; } } internal void WriteUnsignedShort(ushort us, TdsParserStateObject stateObj) { WriteShort((short)us, stateObj); } internal void WriteUnsignedInt(uint i, TdsParserStateObject stateObj) { WriteInt((int)i, stateObj); } internal void WriteInt(int v, TdsParserStateObject stateObj) { if (stateObj._outBytesUsed + 4 > stateObj._outBuff.Length) { for (int i = 0; i < 32; i += 8) { stateObj.WriteByte((byte)((uint)(v >> i) & 0xFFu)); } } else { stateObj._outBuff[stateObj._outBytesUsed] = (byte)((uint)v & 0xFFu); stateObj._outBuff[stateObj._outBytesUsed + 1] = (byte)((uint)(v >> 8) & 0xFFu); stateObj._outBuff[stateObj._outBytesUsed + 2] = (byte)((uint)(v >> 16) & 0xFFu); stateObj._outBuff[stateObj._outBytesUsed + 3] = (byte)((uint)(v >> 24) & 0xFFu); stateObj._outBytesUsed += 4; } } internal void WriteFloat(float v, TdsParserStateObject stateObj) { byte[] bytes = BitConverter.GetBytes(v); stateObj.WriteByteArray(bytes, bytes.Length, 0); } internal void WriteLong(long v, TdsParserStateObject stateObj) { if (stateObj._outBytesUsed + 8 > stateObj._outBuff.Length) { for (int i = 0; i < 64; i += 8) { stateObj.WriteByte((byte)((v >> i) & 0xFF)); } return; } stateObj._outBuff[stateObj._outBytesUsed] = (byte)(v & 0xFF); stateObj._outBuff[stateObj._outBytesUsed + 1] = (byte)((v >> 8) & 0xFF); stateObj._outBuff[stateObj._outBytesUsed + 2] = (byte)((v >> 16) & 0xFF); stateObj._outBuff[stateObj._outBytesUsed + 3] = (byte)((v >> 24) & 0xFF); stateObj._outBuff[stateObj._outBytesUsed + 4] = (byte)((v >> 32) & 0xFF); stateObj._outBuff[stateObj._outBytesUsed + 5] = (byte)((v >> 40) & 0xFF); stateObj._outBuff[stateObj._outBytesUsed + 6] = (byte)((v >> 48) & 0xFF); stateObj._outBuff[stateObj._outBytesUsed + 7] = (byte)((v >> 56) & 0xFF); stateObj._outBytesUsed += 8; } internal void WritePartialLong(long v, int length, TdsParserStateObject stateObj) { if (stateObj._outBytesUsed + length > stateObj._outBuff.Length) { for (int i = 0; i < length * 8; i += 8) { stateObj.WriteByte((byte)((v >> i) & 0xFF)); } return; } for (int j = 0; j < length; j++) { stateObj._outBuff[stateObj._outBytesUsed + j] = (byte)((v >> j * 8) & 0xFF); } stateObj._outBytesUsed += length; } internal void WriteUnsignedLong(ulong uv, TdsParserStateObject stateObj) { WriteLong((long)uv, stateObj); } internal void WriteDouble(double v, TdsParserStateObject stateObj) { byte[] bytes = BitConverter.GetBytes(v); stateObj.WriteByteArray(bytes, bytes.Length, 0); } internal void PrepareResetConnection(bool preserveTransaction) { _fResetConnection = true; _fPreserveTransaction = preserveTransaction; } internal bool Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) { bool syncOverAsync = stateObj._syncOverAsync; try { stateObj._syncOverAsync = true; TryRun(runBehavior, cmdHandler, dataStream, bulkCopyHandler, stateObj, out var dataReady); return dataReady; } finally { stateObj._syncOverAsync = syncOverAsync; } } internal static bool IsValidTdsToken(byte token) { if (token != 170 && token != 171 && token != 173 && token != 227 && token != 172 && token != 121 && token != 160 && token != 161 && token != 129 && token != 136 && token != 164 && token != 165 && token != 169 && token != 211 && token != 209 && token != 210 && token != 253 && token != 254 && token != byte.MaxValue && token != 57 && token != 237 && token != 124 && token != 120 && token != 237 && token != 174) { return token == 228; } return true; } internal bool TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, out bool dataReady) { if (TdsParserState.Broken == State || State == TdsParserState.Closed) { dataReady = true; return true; } dataReady = false; do { if (stateObj._internalTimeout) { runBehavior = RunBehavior.Attention; } if (TdsParserState.Broken == State || State == TdsParserState.Closed) { break; } if (!stateObj._accumulateInfoEvents && stateObj._pendingInfoEvents != null) { if (RunBehavior.Clean != (RunBehavior.Clean & runBehavior)) { SqlConnection sqlConnection = null; if (_connHandler != null) { sqlConnection = _connHandler.Connection; } if (sqlConnection != null && sqlConnection.FireInfoMessageEventOnUserErrors) { foreach (SqlError pendingInfoEvent in stateObj._pendingInfoEvents) { FireInfoMessageEvent(sqlConnection, stateObj, pendingInfoEvent); } } else { foreach (SqlError pendingInfoEvent2 in stateObj._pendingInfoEvents) { stateObj.AddWarning(pendingInfoEvent2); } } } stateObj._pendingInfoEvents = null; } if (!stateObj.TryReadByte(out var value)) { return false; } if (!IsValidTdsToken(value)) { _state = TdsParserState.Broken; _connHandler.BreakConnection(); throw SQL.ParsingError(); } if (!TryGetTokenLength(value, stateObj, out var tokenLength)) { return false; } switch (value) { case 170: stateObj._errorTokenReceived = true; goto case 171; case 171: { if (!TryProcessError(value, stateObj, out var error)) { return false; } if (value == 171 && stateObj._accumulateInfoEvents) { if (stateObj._pendingInfoEvents == null) { stateObj._pendingInfoEvents = new List(); } stateObj._pendingInfoEvents.Add(error); stateObj._syncOverAsync = true; } else if (RunBehavior.Clean != (RunBehavior.Clean & runBehavior)) { SqlConnection sqlConnection2 = null; if (_connHandler != null) { sqlConnection2 = _connHandler.Connection; } if (sqlConnection2 != null && sqlConnection2.FireInfoMessageEventOnUserErrors && error.Class <= 16) { FireInfoMessageEvent(sqlConnection2, stateObj, error); } else if (error.Class < 11) { stateObj.AddWarning(error); } else if (error.Class < 20) { stateObj.AddError(error); if (dataStream != null && !dataStream.IsInitialized) { runBehavior = RunBehavior.UntilDone; } } else { stateObj.AddError(error); runBehavior = RunBehavior.UntilDone; } } else if (error.Class >= 20) { stateObj.AddError(error); } break; } case 165: if (dataStream != null) { if (!TryProcessColInfo(dataStream.MetaData, dataStream, stateObj, out var metaData2)) { return false; } if (!dataStream.TrySetMetaData(metaData2, moreInfo: false)) { return false; } dataStream.BrowseModeInfoConsumed = true; } else if (!stateObj.TrySkipBytes(tokenLength)) { return false; } break; case 253: case 254: case byte.MaxValue: if (!TryProcessDone(cmdHandler, dataStream, ref runBehavior, stateObj)) { return false; } if (value == 254) { cmdHandler?.OnDoneProc(); } break; case 169: if (!stateObj.TrySkipBytes(tokenLength)) { return false; } break; case 136: { stateObj.CloneCleanupAltMetaDataSetArray(); if (stateObj._cleanupAltMetaDataSetArray == null) { stateObj._cleanupAltMetaDataSetArray = new _SqlMetaDataSetCollection(); } if (!TryProcessAltMetaData(tokenLength, stateObj, out var metaData)) { return false; } stateObj._cleanupAltMetaDataSetArray.SetAltMetaData(metaData); if (dataStream != null) { if (!stateObj.TryPeekByte(out var value3)) { return false; } if (!dataStream.TrySetAltMetaDataSet(metaData, 136 != value3)) { return false; } } break; } case 211: if (!stateObj.TryStartNewRow(isNullCompressed: false)) { return false; } if (RunBehavior.ReturnImmediately != (RunBehavior.ReturnImmediately & runBehavior)) { if (!stateObj.TryReadUInt16(out var value2)) { return false; } if (!TrySkipRow(stateObj._cleanupAltMetaDataSetArray.GetAltMetaData(value2), stateObj)) { return false; } } else { dataReady = true; } break; case 227: { stateObj._syncOverAsync = true; if (!TryProcessEnvChange(tokenLength, stateObj, out var sqlEnvChange)) { return false; } for (int i = 0; i < sqlEnvChange.Length; i++) { if (sqlEnvChange[i] == null || Connection.IgnoreEnvChange) { continue; } switch (sqlEnvChange[i].type) { case 8: case 11: _currentTransaction = _pendingTransaction; _pendingTransaction = null; if (_currentTransaction != null) { _currentTransaction.TransactionId = sqlEnvChange[i].newLongValue; } else { TransactionType type = TransactionType.LocalFromTSQL; _currentTransaction = new SqlInternalTransaction(_connHandler, type, null, sqlEnvChange[i].newLongValue); } if (_statistics != null && !_statisticsIsInTransaction) { _statistics.SafeIncrement(ref _statistics._transactions); } _statisticsIsInTransaction = true; _retainedTransactionId = 0L; break; case 9: case 12: case 17: _retainedTransactionId = 0L; goto case 10; case 10: if (_currentTransaction != null) { if (9 == sqlEnvChange[i].type) { _currentTransaction.Completed(TransactionState.Committed); } else if (10 == sqlEnvChange[i].type) { if (_currentTransaction.IsDistributed && _currentTransaction.IsActive) { _retainedTransactionId = sqlEnvChange[i].oldLongValue; } _currentTransaction.Completed(TransactionState.Aborted); } else { _currentTransaction.Completed(TransactionState.Unknown); } _currentTransaction = null; } _statisticsIsInTransaction = false; break; default: _connHandler.OnEnvChange(sqlEnvChange[i]); break; } } break; } case 173: { if (!TryProcessLoginAck(stateObj, out var sqlLoginAck)) { return false; } _connHandler.OnLoginAck(sqlLoginAck); break; } case 174: if (!TryProcessFeatureExtAck(stateObj)) { return false; } break; case 228: if (!TryProcessSessionState(stateObj, tokenLength, _connHandler._currentSessionData)) { return false; } break; case 129: if (tokenLength != 65535) { if (!TryProcessMetaData(tokenLength, stateObj, out var metaData3)) { return false; } stateObj._cleanupMetaData = metaData3; } else if (cmdHandler != null) { stateObj._cleanupMetaData = cmdHandler.MetaData; } if (dataStream != null) { if (!stateObj.TryPeekByte(out var value5)) { return false; } if (!dataStream.TrySetMetaData(stateObj._cleanupMetaData, 164 == value5 || 165 == value5)) { return false; } } else { bulkCopyHandler?.SetMetaData(stateObj._cleanupMetaData); } break; case 210: if (!stateObj.TryStartNewRow(isNullCompressed: true, stateObj._cleanupMetaData.Length)) { return false; } goto IL_07d9; case 209: if (!stateObj.TryStartNewRow(isNullCompressed: false)) { return false; } goto IL_07d9; case 121: { if (!stateObj.TryReadInt32(out var value4)) { return false; } cmdHandler?.OnReturnStatus(value4); break; } case 172: { if (!TryProcessReturnValue(tokenLength, stateObj, out var returnValue)) { return false; } cmdHandler?.OnReturnValue(returnValue); break; } case 237: stateObj._syncOverAsync = true; ProcessSSPI(tokenLength); break; case 164: { if (dataStream != null) { if (!TryProcessTableName(tokenLength, stateObj, out var multiPartTableNames)) { return false; } dataStream.TableNames = multiPartTableNames; } else if (!stateObj.TrySkipBytes(tokenLength)) { return false; } break; } IL_07d9: if (bulkCopyHandler != null) { if (!TryProcessRow(stateObj._cleanupMetaData, bulkCopyHandler.CreateRowBuffer(), bulkCopyHandler.CreateIndexMap(), stateObj)) { return false; } } else if (RunBehavior.ReturnImmediately != (RunBehavior.ReturnImmediately & runBehavior)) { if (!TrySkipRow(stateObj._cleanupMetaData, stateObj)) { return false; } } else { dataReady = true; } if (_statistics != null) { _statistics.WaitForDoneAfterRow = true; } break; } } while ((stateObj._pendingData && RunBehavior.ReturnImmediately != (RunBehavior.ReturnImmediately & runBehavior)) || (!stateObj._pendingData && stateObj._attentionSent && !stateObj._attentionReceived)); if (!stateObj._pendingData && CurrentTransaction != null) { CurrentTransaction.Activate(); } if (stateObj._attentionReceived) { SpinWait.SpinUntil(() => !stateObj._attentionSending); if (stateObj._attentionSent) { stateObj._attentionSent = false; stateObj._attentionReceived = false; if (RunBehavior.Clean != (RunBehavior.Clean & runBehavior) && !stateObj._internalTimeout) { stateObj.AddError(new SqlError(0, 0, 11, _server, SQLMessage.OperationCancelled(), "", 0)); } } } if (stateObj.HasErrorOrWarning) { ThrowExceptionAndWarning(stateObj); } return true; } private bool TryProcessEnvChange(int tokenLength, TdsParserStateObject stateObj, out SqlEnvChange[] sqlEnvChange) { int i = 0; int num = 0; SqlEnvChange[] array = new SqlEnvChange[3]; sqlEnvChange = null; SqlEnvChange sqlEnvChange2; for (; tokenLength > i; i += sqlEnvChange2.length) { if (num >= array.Length) { SqlEnvChange[] array2 = new SqlEnvChange[array.Length + 3]; for (int j = 0; j < array.Length; j++) { array2[j] = array[j]; } array = array2; } sqlEnvChange2 = new SqlEnvChange(); if (!stateObj.TryReadByte(out sqlEnvChange2.type)) { return false; } array[num] = sqlEnvChange2; num++; byte value7; switch (sqlEnvChange2.type) { case 1: case 2: if (!TryReadTwoStringFields(sqlEnvChange2, stateObj)) { return false; } break; case 3: if (!TryReadTwoStringFields(sqlEnvChange2, stateObj)) { return false; } if (sqlEnvChange2.newValue == "iso_1") { _defaultCodePage = 1252; _defaultEncoding = Encoding.GetEncoding(_defaultCodePage); } else { string s = sqlEnvChange2.newValue.Substring(2); _defaultCodePage = int.Parse(s, NumberStyles.Integer, CultureInfo.InvariantCulture); _defaultEncoding = Encoding.GetEncoding(_defaultCodePage); } break; case 4: { if (!TryReadTwoStringFields(sqlEnvChange2, stateObj)) { throw SQL.SynchronousCallMayNotPend(); } int num2 = int.Parse(sqlEnvChange2.newValue, NumberStyles.Integer, CultureInfo.InvariantCulture); if (_physicalStateObj.SetPacketSize(num2)) { _physicalStateObj.ClearAllWritePackets(); uint unsignedPacketSize = (uint)num2; _physicalStateObj.SetConnectionBufferSize(ref unsignedPacketSize); } break; } case 5: if (!TryReadTwoStringFields(sqlEnvChange2, stateObj)) { return false; } _defaultLCID = int.Parse(sqlEnvChange2.newValue, NumberStyles.Integer, CultureInfo.InvariantCulture); break; case 6: if (!TryReadTwoStringFields(sqlEnvChange2, stateObj)) { return false; } break; case 7: if (!stateObj.TryReadByte(out value7)) { return false; } sqlEnvChange2.newLength = value7; if (sqlEnvChange2.newLength == 5) { if (!TryProcessCollation(stateObj, out sqlEnvChange2.newCollation)) { return false; } _defaultCollation = sqlEnvChange2.newCollation; int codePage = GetCodePage(sqlEnvChange2.newCollation, stateObj); if (codePage != _defaultCodePage) { _defaultCodePage = codePage; _defaultEncoding = Encoding.GetEncoding(_defaultCodePage); } _defaultLCID = sqlEnvChange2.newCollation.LCID; } if (!stateObj.TryReadByte(out value7)) { return false; } sqlEnvChange2.oldLength = value7; if (sqlEnvChange2.oldLength == 5 && !TryProcessCollation(stateObj, out sqlEnvChange2.oldCollation)) { return false; } sqlEnvChange2.length = 3 + sqlEnvChange2.newLength + sqlEnvChange2.oldLength; break; case 8: case 9: case 10: case 11: case 12: case 17: if (!stateObj.TryReadByte(out value7)) { return false; } sqlEnvChange2.newLength = value7; if (sqlEnvChange2.newLength > 0) { if (!stateObj.TryReadInt64(out sqlEnvChange2.newLongValue)) { return false; } } else { sqlEnvChange2.newLongValue = 0L; } if (!stateObj.TryReadByte(out value7)) { return false; } sqlEnvChange2.oldLength = value7; if (sqlEnvChange2.oldLength > 0) { if (!stateObj.TryReadInt64(out sqlEnvChange2.oldLongValue)) { return false; } } else { sqlEnvChange2.oldLongValue = 0L; } sqlEnvChange2.length = 3 + sqlEnvChange2.newLength + sqlEnvChange2.oldLength; break; case 13: if (!TryReadTwoStringFields(sqlEnvChange2, stateObj)) { return false; } break; case 15: if (!stateObj.TryReadInt32(out sqlEnvChange2.newLength)) { return false; } sqlEnvChange2.newBinValue = new byte[sqlEnvChange2.newLength]; if (!stateObj.TryReadByteArray(sqlEnvChange2.newBinValue, 0, sqlEnvChange2.newLength)) { return false; } if (!stateObj.TryReadByte(out value7)) { return false; } sqlEnvChange2.oldLength = value7; sqlEnvChange2.length = 5 + sqlEnvChange2.newLength; break; case 16: case 18: if (!TryReadTwoBinaryFields(sqlEnvChange2, stateObj)) { return false; } break; case 19: if (!TryReadTwoStringFields(sqlEnvChange2, stateObj)) { return false; } break; case 20: { if (!stateObj.TryReadUInt16(out var value)) { return false; } sqlEnvChange2.newLength = value; if (!stateObj.TryReadByte(out var value2)) { return false; } if (!stateObj.TryReadUInt16(out var value3)) { return false; } if (!stateObj.TryReadUInt16(out var value4)) { return false; } if (!stateObj.TryReadString(value4, out var value5)) { return false; } sqlEnvChange2.newRoutingInfo = new RoutingInfo(value2, value3, value5); if (!stateObj.TryReadUInt16(out var value6)) { return false; } if (!stateObj.TrySkipBytes(value6)) { return false; } sqlEnvChange2.length = sqlEnvChange2.newLength + value6 + 5; break; } } } sqlEnvChange = array; return true; } private bool TryReadTwoBinaryFields(SqlEnvChange env, TdsParserStateObject stateObj) { if (!stateObj.TryReadByte(out var value)) { return false; } env.newLength = value; env.newBinValue = new byte[env.newLength]; if (!stateObj.TryReadByteArray(env.newBinValue, 0, env.newLength)) { return false; } if (!stateObj.TryReadByte(out value)) { return false; } env.oldLength = value; env.oldBinValue = new byte[env.oldLength]; if (!stateObj.TryReadByteArray(env.oldBinValue, 0, env.oldLength)) { return false; } env.length = 3 + env.newLength + env.oldLength; return true; } private bool TryReadTwoStringFields(SqlEnvChange env, TdsParserStateObject stateObj) { if (!stateObj.TryReadByte(out var value)) { return false; } if (!stateObj.TryReadString(value, out var value2)) { return false; } if (!stateObj.TryReadByte(out var value3)) { return false; } if (!stateObj.TryReadString(value3, out var value4)) { return false; } env.newLength = value; env.newValue = value2; env.oldLength = value3; env.oldValue = value4; env.length = 3 + env.newLength * 2 + env.oldLength * 2; return true; } private bool TryProcessDone(SqlCommand cmd, SqlDataReader reader, ref RunBehavior run, TdsParserStateObject stateObj) { stateObj._syncOverAsync = true; if (!stateObj.TryReadUInt16(out var value)) { return false; } if (!stateObj.TryReadUInt16(out var value2)) { return false; } if (!stateObj.TryReadInt64(out var value3)) { return false; } int num = (int)value3; if (32 == (value & 0x20)) { stateObj._attentionReceived = true; } if (cmd != null && 16 == (value & 0x10)) { if (value2 != 193) { cmd.InternalRecordsAffected = num; } if (stateObj._receivedColMetaData || value2 != 193) { cmd.OnStatementCompleted(num); } } stateObj._receivedColMetaData = false; if (2 == (2 & value) && stateObj.ErrorCount == 0 && !stateObj._errorTokenReceived && RunBehavior.Clean != (RunBehavior.Clean & run)) { stateObj.AddError(new SqlError(0, 0, 11, _server, SQLMessage.SevereError(), "", 0)); if (reader != null && !reader.IsInitialized) { run = RunBehavior.UntilDone; } } if (256 == (0x100 & value) && RunBehavior.Clean != (RunBehavior.Clean & run)) { stateObj.AddError(new SqlError(0, 0, 20, _server, SQLMessage.SevereError(), "", 0)); if (reader != null && !reader.IsInitialized) { run = RunBehavior.UntilDone; } } ProcessSqlStatistics(value2, value, num); if (1 != (value & 1)) { stateObj._errorTokenReceived = false; if (stateObj._inBytesUsed >= stateObj._inBytesRead) { stateObj._pendingData = false; } } if (!stateObj._pendingData && stateObj._hasOpenResult) { stateObj.DecrementOpenResultCount(); } return true; } private void ProcessSqlStatistics(ushort curCmd, ushort status, int count) { if (_statistics != null) { if (_statistics.WaitForDoneAfterRow) { _statistics.SafeIncrement(ref _statistics._sumResultSets); _statistics.WaitForDoneAfterRow = false; } if (16 != (status & 0x10)) { count = 0; } switch (curCmd) { case 195: case 196: case 197: case 279: _statistics.SafeIncrement(ref _statistics._iduCount); _statistics.SafeAdd(ref _statistics._iduRows, count); if (!_statisticsIsInTransaction) { _statistics.SafeIncrement(ref _statistics._transactions); } break; case 193: _statistics.SafeIncrement(ref _statistics._selectCount); _statistics.SafeAdd(ref _statistics._selectRows, count); break; case 212: if (!_statisticsIsInTransaction) { _statistics.SafeIncrement(ref _statistics._transactions); } _statisticsIsInTransaction = true; break; case 32: _statistics.SafeIncrement(ref _statistics._cursorOpens); break; case 210: _statisticsIsInTransaction = false; break; case 213: _statisticsIsInTransaction = false; break; } } else { switch (curCmd) { case 212: _statisticsIsInTransaction = true; break; case 210: case 213: _statisticsIsInTransaction = false; break; case 211: break; } } } private bool TryProcessFeatureExtAck(TdsParserStateObject stateObj) { byte value; do { if (!stateObj.TryReadByte(out value)) { return false; } if (value != byte.MaxValue) { if (!stateObj.TryReadUInt32(out var value2)) { return false; } byte[] array = new byte[value2]; if (value2 != 0 && !stateObj.TryReadByteArray(array, 0, checked((int)value2))) { return false; } _connHandler.OnFeatureExtAck(value, array); } } while (value != byte.MaxValue); return true; } private bool TryProcessSessionState(TdsParserStateObject stateObj, int length, SessionData sdata) { if (length < 5) { throw SQL.ParsingError(); } if (!stateObj.TryReadUInt32(out var value)) { return false; } if (value == uint.MaxValue) { _connHandler.DoNotPoolThisConnection(); } if (!stateObj.TryReadByte(out var value2)) { return false; } if (value2 > 1) { throw SQL.ParsingError(); } bool flag = value2 != 0; length -= 5; while (length > 0) { if (!stateObj.TryReadByte(out var value3)) { return false; } if (!stateObj.TryReadByte(out var value4)) { return false; } int value5; if (value4 < byte.MaxValue) { value5 = value4; } else if (!stateObj.TryReadInt32(out value5)) { return false; } byte[] array = null; checked { lock (sdata._delta) { if (sdata._delta[value3] == null) { array = new byte[value5]; sdata._delta[value3] = new SessionStateRecord { _version = value, _dataLength = value5, _data = array, _recoverable = flag }; sdata._deltaDirty = true; if (!flag) { sdata._unrecoverableStatesCount = (byte)(unchecked((uint)sdata._unrecoverableStatesCount) + 1u); } } else if (sdata._delta[value3]._version <= value) { SessionStateRecord sessionStateRecord = sdata._delta[value3]; sessionStateRecord._version = value; sessionStateRecord._dataLength = value5; if (sessionStateRecord._recoverable != flag) { if (flag) { unchecked { sdata._unrecoverableStatesCount--; } } else { sdata._unrecoverableStatesCount = (byte)(unchecked((uint)sdata._unrecoverableStatesCount) + 1u); } sessionStateRecord._recoverable = flag; } array = sessionStateRecord._data; if (array.Length < value5) { array = (sessionStateRecord._data = new byte[value5]); } } } if (array != null) { if (!stateObj.TryReadByteArray(array, 0, value5)) { return false; } } else if (!stateObj.TrySkipBytes(value5)) { return false; } } length = ((value4 >= byte.MaxValue) ? (length - (6 + value5)) : (length - (2 + value5))); } return true; } private bool TryProcessLoginAck(TdsParserStateObject stateObj, out SqlLoginAck sqlLoginAck) { SqlLoginAck sqlLoginAck2 = new SqlLoginAck(); sqlLoginAck = null; if (!stateObj.TrySkipBytes(1)) { return false; } byte[] array = new byte[4]; if (!stateObj.TryReadByteArray(array, 0, array.Length)) { return false; } sqlLoginAck2.tdsVersion = (uint)((((((array[0] << 8) | array[1]) << 8) | array[2]) << 8) | array[3]); uint num = sqlLoginAck2.tdsVersion & 0xFF00FFFFu; uint num2 = (sqlLoginAck2.tdsVersion >> 16) & 0xFFu; switch (num) { case 1912602626u: if (num2 != 9) { throw SQL.InvalidTDSVersion(); } _isYukon = true; break; case 1929379843u: if (num2 != 11) { throw SQL.InvalidTDSVersion(); } _isKatmai = true; break; case 1946157060u: if (num2 != 0) { throw SQL.InvalidTDSVersion(); } _isDenali = true; break; default: throw SQL.InvalidTDSVersion(); } _isKatmai |= _isDenali; _isYukon |= _isKatmai; stateObj._outBytesUsed = stateObj._outputHeaderLen; if (!stateObj.TryReadByte(out var value)) { return false; } if (!stateObj.TrySkipBytes(value * 2)) { return false; } if (!stateObj.TryReadByte(out sqlLoginAck2.majorVersion)) { return false; } if (!stateObj.TryReadByte(out sqlLoginAck2.minorVersion)) { return false; } if (!stateObj.TryReadByte(out var value2)) { return false; } if (!stateObj.TryReadByte(out var value3)) { return false; } sqlLoginAck2.buildNum = (short)((value2 << 8) + value3); _state = TdsParserState.OpenLoggedIn; if (_fMARS) { _resetConnectionEvent = new AutoResetEvent(initialState: true); } if (_connHandler.ConnectionOptions.UserInstance && string.IsNullOrEmpty(_connHandler.InstanceName)) { stateObj.AddError(new SqlError(0, 0, 20, Server, SQLMessage.UserInstanceFailure(), "", 0)); ThrowExceptionAndWarning(stateObj); } sqlLoginAck = sqlLoginAck2; return true; } internal bool TryProcessError(byte token, TdsParserStateObject stateObj, out SqlError error) { error = null; if (!stateObj.TryReadInt32(out var value)) { return false; } if (!stateObj.TryReadByte(out var value2)) { return false; } if (!stateObj.TryReadByte(out var value3)) { return false; } if (!stateObj.TryReadUInt16(out var value4)) { return false; } if (!stateObj.TryReadString(value4, out var value5)) { return false; } if (!stateObj.TryReadByte(out var value6)) { return false; } string server; if (value6 == 0) { server = _server; } else if (!stateObj.TryReadString(value6, out server)) { return false; } if (!stateObj.TryReadByte(out value6)) { return false; } if (!stateObj.TryReadString(value6, out var value7)) { return false; } int value8; if (_isYukon) { if (!stateObj.TryReadInt32(out value8)) { return false; } } else { if (!stateObj.TryReadUInt16(out var value9)) { return false; } value8 = value9; if (_state == TdsParserState.OpenNotLoggedIn) { if (!stateObj.TryPeekByte(out var value10)) { return false; } if (value10 == 0) { if (!stateObj.TryReadUInt16(out var value11)) { return false; } value8 = (value8 << 16) + value11; } } } error = new SqlError(value, value2, value3, _server, value5, value7, value8); return true; } internal bool TryProcessReturnValue(int length, TdsParserStateObject stateObj, out SqlReturnValue returnValue) { returnValue = null; SqlReturnValue sqlReturnValue = new SqlReturnValue(); sqlReturnValue.length = length; if (!stateObj.TryReadUInt16(out var _)) { return false; } if (!stateObj.TryReadByte(out var value2)) { return false; } if (value2 > 0 && !stateObj.TryReadString(value2, out sqlReturnValue.parameter)) { return false; } if (!stateObj.TryReadByte(out var _)) { return false; } if (!stateObj.TryReadUInt32(out var value4)) { return false; } if (!stateObj.TryReadUInt16(out var _)) { return false; } if (!stateObj.TryReadByte(out var value6)) { return false; } int tokenLength; if (value6 == 241) { tokenLength = 65535; } else if (IsVarTimeTds(value6)) { tokenLength = 0; } else if (value6 == 40) { tokenLength = 3; } else if (!TryGetTokenLength(value6, stateObj, out tokenLength)) { return false; } sqlReturnValue.metaType = MetaType.GetSqlDataType(value6, value4, tokenLength); sqlReturnValue.type = sqlReturnValue.metaType.SqlDbType; sqlReturnValue.tdsType = sqlReturnValue.metaType.NullableType; sqlReturnValue.isNullable = true; if (tokenLength == 65535) { sqlReturnValue.metaType = MetaType.GetMaxMetaTypeFromMetaType(sqlReturnValue.metaType); } if (sqlReturnValue.type == SqlDbType.Decimal) { if (!stateObj.TryReadByte(out sqlReturnValue.precision)) { return false; } if (!stateObj.TryReadByte(out sqlReturnValue.scale)) { return false; } } if (sqlReturnValue.metaType.IsVarTime && !stateObj.TryReadByte(out sqlReturnValue.scale)) { return false; } if (value6 == 240 && !TryProcessUDTMetaData(sqlReturnValue, stateObj)) { return false; } if (sqlReturnValue.type == SqlDbType.Xml) { if (!stateObj.TryReadByte(out var value7)) { return false; } if (((uint)value7 & (true ? 1u : 0u)) != 0) { if (!stateObj.TryReadByte(out value2)) { return false; } if (value2 != 0 && !stateObj.TryReadString(value2, out sqlReturnValue.xmlSchemaCollectionDatabase)) { return false; } if (!stateObj.TryReadByte(out value2)) { return false; } if (value2 != 0 && !stateObj.TryReadString(value2, out sqlReturnValue.xmlSchemaCollectionOwningSchema)) { return false; } if (!stateObj.TryReadInt16(out var value8)) { return false; } if (value8 != 0 && !stateObj.TryReadString(value8, out sqlReturnValue.xmlSchemaCollectionName)) { return false; } } } else if (sqlReturnValue.metaType.IsCharType) { if (!TryProcessCollation(stateObj, out sqlReturnValue.collation)) { return false; } int codePage = GetCodePage(sqlReturnValue.collation, stateObj); if (codePage == _defaultCodePage) { sqlReturnValue.codePage = _defaultCodePage; sqlReturnValue.encoding = _defaultEncoding; } else { sqlReturnValue.codePage = codePage; sqlReturnValue.encoding = Encoding.GetEncoding(sqlReturnValue.codePage); } } bool isNull = false; if (!TryProcessColumnHeaderNoNBC(sqlReturnValue, stateObj, out isNull, out var length2)) { return false; } int length3 = (int)((length2 > int.MaxValue) ? int.MaxValue : length2); if (sqlReturnValue.metaType.IsPlp) { length3 = int.MaxValue; } if (isNull) { GetNullSqlValue(sqlReturnValue.value, sqlReturnValue); } else if (!TryReadSqlValue(sqlReturnValue.value, sqlReturnValue, length3, stateObj)) { return false; } returnValue = sqlReturnValue; return true; } internal bool TryProcessCollation(TdsParserStateObject stateObj, out SqlCollation collation) { SqlCollation sqlCollation = new SqlCollation(); if (!stateObj.TryReadUInt32(out sqlCollation.info)) { collation = null; return false; } if (!stateObj.TryReadByte(out sqlCollation.sortId)) { collation = null; return false; } collation = sqlCollation; return true; } private void WriteCollation(SqlCollation collation, TdsParserStateObject stateObj) { if (collation == null) { _physicalStateObj.WriteByte(0); return; } _physicalStateObj.WriteByte(5); WriteUnsignedInt(collation.info, _physicalStateObj); _physicalStateObj.WriteByte(collation.sortId); } internal int GetCodePage(SqlCollation collation, TdsParserStateObject stateObj) { int num = 0; if (collation.sortId != 0) { num = TdsEnums.CODE_PAGE_FROM_SORT_ID[collation.sortId]; } else { int lCID = collation.LCID; bool flag = false; try { num = CultureInfo.GetCultureInfo(lCID).TextInfo.ANSICodePage; flag = true; } catch (ArgumentException) { } if (!flag || num == 0) { switch (lCID) { case 66564: case 66577: case 66578: case 67588: case 68612: case 69636: case 70660: lCID &= 0x3FFF; try { num = new CultureInfo(lCID).TextInfo.ANSICodePage; flag = true; } catch (ArgumentException) { } break; case 2087: try { num = new CultureInfo(1063).TextInfo.ANSICodePage; flag = true; } catch (ArgumentException) { } break; } if (!flag) { ThrowUnsupportedCollationEncountered(stateObj); } } } return num; } internal void DrainData(TdsParserStateObject stateObj) { try { SqlDataReader.SharedState readerState = stateObj._readerState; if (readerState != null && readerState._dataReady) { _SqlMetaDataSet cleanupMetaData = stateObj._cleanupMetaData; if (stateObj._partialHeaderBytesRead > 0 && !stateObj.TryProcessHeader()) { throw SQL.SynchronousCallMayNotPend(); } if (readerState._nextColumnHeaderToRead == 0) { if (!stateObj.Parser.TrySkipRow(stateObj._cleanupMetaData, stateObj)) { throw SQL.SynchronousCallMayNotPend(); } } else { if (readerState._nextColumnDataToRead < readerState._nextColumnHeaderToRead) { if (readerState._nextColumnHeaderToRead > 0 && cleanupMetaData[readerState._nextColumnHeaderToRead - 1].metaType.IsPlp) { if (stateObj._longlen != 0L && !TrySkipPlpValue(ulong.MaxValue, stateObj, out var _)) { throw SQL.SynchronousCallMayNotPend(); } } else if (0 < readerState._columnDataBytesRemaining && !stateObj.TrySkipLongBytes(readerState._columnDataBytesRemaining)) { throw SQL.SynchronousCallMayNotPend(); } } if (!stateObj.Parser.TrySkipRow(cleanupMetaData, readerState._nextColumnHeaderToRead, stateObj)) { throw SQL.SynchronousCallMayNotPend(); } } } Run(RunBehavior.Clean, null, null, null, stateObj); } catch { _connHandler.DoomThisConnection(); throw; } } internal void ThrowUnsupportedCollationEncountered(TdsParserStateObject stateObj) { stateObj.AddError(new SqlError(0, 0, 11, _server, SQLMessage.CultureIdError(), "", 0)); if (stateObj != null) { DrainData(stateObj); stateObj._pendingData = false; } ThrowExceptionAndWarning(stateObj); } internal bool TryProcessAltMetaData(int cColumns, TdsParserStateObject stateObj, out _SqlMetaDataSet metaData) { metaData = null; _SqlMetaDataSet sqlMetaDataSet = new _SqlMetaDataSet(cColumns); int[] array = new int[cColumns]; if (!stateObj.TryReadUInt16(out sqlMetaDataSet.id)) { return false; } if (!stateObj.TryReadByte(out var value)) { return false; } while (value > 0) { if (!stateObj.TrySkipBytes(2)) { return false; } value--; } for (int i = 0; i < cColumns; i++) { _SqlMetaData col = sqlMetaDataSet[i]; if (!stateObj.TryReadByte(out var _)) { return false; } if (!stateObj.TryReadUInt16(out var _)) { return false; } if (!TryCommonProcessMetaData(stateObj, col)) { return false; } array[i] = i; } sqlMetaDataSet.indexMap = array; sqlMetaDataSet.visibleColumns = cColumns; metaData = sqlMetaDataSet; return true; } internal bool TryProcessMetaData(int cColumns, TdsParserStateObject stateObj, out _SqlMetaDataSet metaData) { _SqlMetaDataSet sqlMetaDataSet = new _SqlMetaDataSet(cColumns); for (int i = 0; i < cColumns; i++) { if (!TryCommonProcessMetaData(stateObj, sqlMetaDataSet[i])) { metaData = null; return false; } } metaData = sqlMetaDataSet; return true; } private bool IsVarTimeTds(byte tdsType) { if (tdsType != 41 && tdsType != 42) { return tdsType == 43; } return true; } private bool TryCommonProcessMetaData(TdsParserStateObject stateObj, _SqlMetaData col) { if (!stateObj.TryReadUInt32(out var value)) { return false; } if (!stateObj.TryReadByte(out var value2)) { return false; } col.updatability = (byte)((value2 & 0xB) >> 2); col.isNullable = 1 == (value2 & 1); col.isIdentity = 16 == (value2 & 0x10); if (!stateObj.TryReadByte(out value2)) { return false; } col.isColumnSet = 4 == (value2 & 4); if (!stateObj.TryReadByte(out var value3)) { return false; } if (value3 == 241) { col.length = 65535; } else if (IsVarTimeTds(value3)) { col.length = 0; } else if (value3 == 40) { col.length = 3; } else if (!TryGetTokenLength(value3, stateObj, out col.length)) { return false; } col.metaType = MetaType.GetSqlDataType(value3, value, col.length); col.type = col.metaType.SqlDbType; col.tdsType = (col.isNullable ? col.metaType.NullableType : col.metaType.TDSType); if (240 == value3 && !TryProcessUDTMetaData(col, stateObj)) { return false; } byte value5; if (col.length == 65535) { col.metaType = MetaType.GetMaxMetaTypeFromMetaType(col.metaType); col.length = int.MaxValue; if (value3 == 241) { if (!stateObj.TryReadByte(out var value4)) { return false; } if (((uint)value4 & (true ? 1u : 0u)) != 0) { if (!stateObj.TryReadByte(out value5)) { return false; } if (value5 != 0 && !stateObj.TryReadString(value5, out col.xmlSchemaCollectionDatabase)) { return false; } if (!stateObj.TryReadByte(out value5)) { return false; } if (value5 != 0 && !stateObj.TryReadString(value5, out col.xmlSchemaCollectionOwningSchema)) { return false; } if (!stateObj.TryReadInt16(out var value6)) { return false; } if (value5 != 0 && !stateObj.TryReadString(value6, out col.xmlSchemaCollectionName)) { return false; } } } } if (col.type == SqlDbType.Decimal) { if (!stateObj.TryReadByte(out col.precision)) { return false; } if (!stateObj.TryReadByte(out col.scale)) { return false; } } if (col.metaType.IsVarTime) { if (!stateObj.TryReadByte(out col.scale)) { return false; } switch (col.metaType.SqlDbType) { case SqlDbType.Time: col.length = MetaType.GetTimeSizeFromScale(col.scale); break; case SqlDbType.DateTime2: col.length = 3 + MetaType.GetTimeSizeFromScale(col.scale); break; case SqlDbType.DateTimeOffset: col.length = 5 + MetaType.GetTimeSizeFromScale(col.scale); break; } } if (col.metaType.IsCharType && value3 != 241) { if (!TryProcessCollation(stateObj, out col.collation)) { return false; } int codePage = GetCodePage(col.collation, stateObj); if (codePage == _defaultCodePage) { col.codePage = _defaultCodePage; col.encoding = _defaultEncoding; } else { col.codePage = codePage; col.encoding = Encoding.GetEncoding(col.codePage); } } if (col.metaType.IsLong && !col.metaType.IsPlp) { int length = 65535; if (!TryProcessOneTable(stateObj, ref length, out col.multiPartTableName)) { return false; } } if (!stateObj.TryReadByte(out value5)) { return false; } if (!stateObj.TryReadString(value5, out col.column)) { return false; } stateObj._receivedColMetaData = true; return true; } internal bool TryProcessTableName(int length, TdsParserStateObject stateObj, out MultiPartTableName[] multiPartTableNames) { int num = 0; MultiPartTableName[] array = new MultiPartTableName[1]; while (length > 0) { if (!TryProcessOneTable(stateObj, ref length, out var multiPartTableName)) { multiPartTableNames = null; return false; } if (num == 0) { array[num] = multiPartTableName; } else { MultiPartTableName[] array2 = new MultiPartTableName[array.Length + 1]; Array.Copy(array, 0, array2, 0, array.Length); array2[array.Length] = multiPartTableName; array = array2; } num++; } multiPartTableNames = array; return true; } private bool TryProcessOneTable(TdsParserStateObject stateObj, ref int length, out MultiPartTableName multiPartTableName) { multiPartTableName = default(MultiPartTableName); MultiPartTableName multiPartTableName2 = default(MultiPartTableName); if (!stateObj.TryReadByte(out var value)) { return false; } length--; ushort value2; string value3; if (value == 4) { if (!stateObj.TryReadUInt16(out value2)) { return false; } length -= 2; if (!stateObj.TryReadString(value2, out value3)) { return false; } multiPartTableName2.ServerName = value3; value--; length -= value2 * 2; } if (value == 3) { if (!stateObj.TryReadUInt16(out value2)) { return false; } length -= 2; if (!stateObj.TryReadString(value2, out value3)) { return false; } multiPartTableName2.CatalogName = value3; length -= value2 * 2; value--; } if (value == 2) { if (!stateObj.TryReadUInt16(out value2)) { return false; } length -= 2; if (!stateObj.TryReadString(value2, out value3)) { return false; } multiPartTableName2.SchemaName = value3; length -= value2 * 2; value--; } if (value == 1) { if (!stateObj.TryReadUInt16(out value2)) { return false; } length -= 2; if (!stateObj.TryReadString(value2, out value3)) { return false; } multiPartTableName2.TableName = value3; length -= value2 * 2; value--; } multiPartTableName = multiPartTableName2; return true; } private bool TryProcessColInfo(_SqlMetaDataSet columns, SqlDataReader reader, TdsParserStateObject stateObj, out _SqlMetaDataSet metaData) { metaData = null; for (int i = 0; i < columns.Length; i++) { _SqlMetaData sqlMetaData = columns[i]; if (!stateObj.TryReadByte(out var _)) { return false; } if (!stateObj.TryReadByte(out sqlMetaData.tableNum)) { return false; } if (!stateObj.TryReadByte(out var value2)) { return false; } sqlMetaData.isDifferentName = 32 == (value2 & 0x20); sqlMetaData.isExpression = 4 == (value2 & 4); sqlMetaData.isKey = 8 == (value2 & 8); sqlMetaData.isHidden = 16 == (value2 & 0x10); if (sqlMetaData.isDifferentName) { if (!stateObj.TryReadByte(out var value3)) { return false; } if (!stateObj.TryReadString(value3, out sqlMetaData.baseColumn)) { return false; } } if (reader.TableNames != null && sqlMetaData.tableNum > 0) { sqlMetaData.multiPartTableName = reader.TableNames[sqlMetaData.tableNum - 1]; } if (sqlMetaData.isExpression) { sqlMetaData.updatability = 0; } } metaData = columns; return true; } internal bool TryProcessColumnHeader(SqlMetaDataPriv col, TdsParserStateObject stateObj, int columnOrdinal, out bool isNull, out ulong length) { if (stateObj.IsNullCompressionBitSet(columnOrdinal)) { isNull = true; length = 0uL; return true; } return TryProcessColumnHeaderNoNBC(col, stateObj, out isNull, out length); } private bool TryProcessColumnHeaderNoNBC(SqlMetaDataPriv col, TdsParserStateObject stateObj, out bool isNull, out ulong length) { if (col.metaType.IsLong && !col.metaType.IsPlp) { if (!stateObj.TryReadByte(out var value)) { isNull = false; length = 0uL; return false; } if (value != 0) { if (!stateObj.TrySkipBytes(value)) { isNull = false; length = 0uL; return false; } if (!stateObj.TrySkipBytes(8)) { isNull = false; length = 0uL; return false; } isNull = false; return TryGetDataLength(col, stateObj, out length); } isNull = true; length = 0uL; return true; } if (!TryGetDataLength(col, stateObj, out var length2)) { isNull = false; length = 0uL; return false; } isNull = IsNull(col.metaType, length2); length = (isNull ? 0 : length2); return true; } internal bool TryGetAltRowId(TdsParserStateObject stateObj, out int id) { if (!stateObj.TryReadByte(out var _)) { id = 0; return false; } if (!stateObj.TryStartNewRow(isNullCompressed: false)) { id = 0; return false; } if (!stateObj.TryReadUInt16(out var value2)) { id = 0; return false; } id = value2; return true; } private bool TryProcessRow(_SqlMetaDataSet columns, object[] buffer, int[] map, TdsParserStateObject stateObj) { SqlBuffer sqlBuffer = new SqlBuffer(); for (int i = 0; i < columns.Length; i++) { _SqlMetaData sqlMetaData = columns[i]; if (!TryProcessColumnHeader(sqlMetaData, stateObj, i, out var isNull, out var length)) { return false; } if (isNull) { GetNullSqlValue(sqlBuffer, sqlMetaData); buffer[map[i]] = sqlBuffer.SqlValue; } else { if (!TryReadSqlValue(sqlBuffer, sqlMetaData, (int)(sqlMetaData.metaType.IsPlp ? int.MaxValue : length), stateObj)) { return false; } buffer[map[i]] = sqlBuffer.SqlValue; if (stateObj._longlen != 0L) { throw new SqlTruncateException(SR.GetString("Data returned is larger than 2Gb in size. Use SequentialAccess command behavior in order to get all of the data.")); } } sqlBuffer.Clear(); } return true; } internal object GetNullSqlValue(SqlBuffer nullVal, SqlMetaDataPriv md) { switch (md.type) { case SqlDbType.Real: nullVal.SetToNullOfType(SqlBuffer.StorageType.Single); break; case SqlDbType.Float: nullVal.SetToNullOfType(SqlBuffer.StorageType.Double); break; case SqlDbType.Binary: case SqlDbType.Image: case SqlDbType.VarBinary: case SqlDbType.Udt: nullVal.SqlBinary = SqlBinary.Null; break; case SqlDbType.UniqueIdentifier: nullVal.SqlGuid = SqlGuid.Null; break; case SqlDbType.Bit: nullVal.SetToNullOfType(SqlBuffer.StorageType.Boolean); break; case SqlDbType.TinyInt: nullVal.SetToNullOfType(SqlBuffer.StorageType.Byte); break; case SqlDbType.SmallInt: nullVal.SetToNullOfType(SqlBuffer.StorageType.Int16); break; case SqlDbType.Int: nullVal.SetToNullOfType(SqlBuffer.StorageType.Int32); break; case SqlDbType.BigInt: nullVal.SetToNullOfType(SqlBuffer.StorageType.Int64); break; case SqlDbType.Char: case SqlDbType.NChar: case SqlDbType.NText: case SqlDbType.NVarChar: case SqlDbType.Text: case SqlDbType.VarChar: nullVal.SetToNullOfType(SqlBuffer.StorageType.String); break; case SqlDbType.Decimal: nullVal.SetToNullOfType(SqlBuffer.StorageType.Decimal); break; case SqlDbType.DateTime: case SqlDbType.SmallDateTime: nullVal.SetToNullOfType(SqlBuffer.StorageType.DateTime); break; case SqlDbType.Money: case SqlDbType.SmallMoney: nullVal.SetToNullOfType(SqlBuffer.StorageType.Money); break; case SqlDbType.Variant: nullVal.SetToNullOfType(SqlBuffer.StorageType.Empty); break; case SqlDbType.Xml: nullVal.SqlCachedBuffer = SqlCachedBuffer.Null; break; case SqlDbType.Date: nullVal.SetToNullOfType(SqlBuffer.StorageType.Date); break; case SqlDbType.Time: nullVal.SetToNullOfType(SqlBuffer.StorageType.Time); break; case SqlDbType.DateTime2: nullVal.SetToNullOfType(SqlBuffer.StorageType.DateTime2); break; case SqlDbType.DateTimeOffset: nullVal.SetToNullOfType(SqlBuffer.StorageType.DateTimeOffset); break; } return nullVal; } internal bool TrySkipRow(_SqlMetaDataSet columns, TdsParserStateObject stateObj) { return TrySkipRow(columns, 0, stateObj); } internal bool TrySkipRow(_SqlMetaDataSet columns, int startCol, TdsParserStateObject stateObj) { for (int i = startCol; i < columns.Length; i++) { _SqlMetaData md = columns[i]; if (!TrySkipValue(md, i, stateObj)) { return false; } } return true; } internal bool TrySkipValue(SqlMetaDataPriv md, int columnOrdinal, TdsParserStateObject stateObj) { if (stateObj.IsNullCompressionBitSet(columnOrdinal)) { return true; } if (md.metaType.IsPlp) { if (!TrySkipPlpValue(ulong.MaxValue, stateObj, out var _)) { return false; } } else if (md.metaType.IsLong) { if (!stateObj.TryReadByte(out var value)) { return false; } if (value != 0) { if (!stateObj.TrySkipBytes(value + 8)) { return false; } if (!TryGetTokenLength(md.tdsType, stateObj, out var tokenLength)) { return false; } if (!stateObj.TrySkipBytes(tokenLength)) { return false; } } } else { if (!TryGetTokenLength(md.tdsType, stateObj, out var tokenLength2)) { return false; } if (!IsNull(md.metaType, (ulong)tokenLength2) && !stateObj.TrySkipBytes(tokenLength2)) { return false; } } return true; } private bool IsNull(MetaType mt, ulong length) { if (mt.IsPlp) { return ulong.MaxValue == length; } if (65535 == length && !mt.IsLong) { return true; } if (length == 0L && !mt.IsCharType) { return !mt.IsBinType; } return false; } private bool TryReadSqlStringValue(SqlBuffer value, byte type, int length, Encoding encoding, bool isPlp, TdsParserStateObject stateObj) { switch (type) { case 35: case 39: case 47: case 167: case 175: { if (encoding == null) { encoding = _defaultEncoding; } if (!stateObj.TryReadStringWithEncoding(length, encoding, isPlp, out var value3)) { return false; } value.SetToString(value3); break; } case 99: case 231: case 239: { string value2 = null; if (isPlp) { char[] buff = null; if (!TryReadPlpUnicodeChars(ref buff, 0, length >> 1, stateObj, out length)) { return false; } value2 = ((length <= 0) ? ADP.StrEmpty : new string(buff, 0, length)); } else if (!stateObj.TryReadString(length >> 1, out value2)) { return false; } value.SetToString(value2); break; } } return true; } internal bool TryReadSqlValue(SqlBuffer value, SqlMetaDataPriv md, int length, TdsParserStateObject stateObj) { bool isPlp = md.metaType.IsPlp; byte tdsType = md.tdsType; if (isPlp) { length = int.MaxValue; } switch (tdsType) { case 106: case 108: if (!TryReadSqlDecimal(value, length, md.precision, md.scale, stateObj)) { return false; } break; case 34: case 37: case 45: case 165: case 173: case 240: { byte[] buff = null; if (isPlp) { if (!stateObj.TryReadPlpBytes(ref buff, 0, length, out var _)) { return false; } } else { buff = new byte[length]; if (!stateObj.TryReadByteArray(buff, 0, length)) { return false; } } value.SqlBinary = SqlTypeWorkarounds.SqlBinaryCtor(buff, ignored: true); break; } case 35: case 39: case 47: case 99: case 167: case 175: case 231: case 239: if (!TryReadSqlStringValue(value, tdsType, length, md.encoding, isPlp, stateObj)) { return false; } break; case 241: { if (!SqlCachedBuffer.TryCreate(md, this, stateObj, out var buffer)) { return false; } value.SqlCachedBuffer = buffer; break; } case 40: case 41: case 42: case 43: if (!TryReadSqlDateTime(value, tdsType, length, md.scale, stateObj)) { return false; } break; default: if (!TryReadSqlValueInternal(value, tdsType, length, stateObj)) { return false; } break; } return true; } private bool TryReadSqlDateTime(SqlBuffer value, byte tdsType, int length, byte scale, TdsParserStateObject stateObj) { byte[] array = new byte[length]; if (!stateObj.TryReadByteArray(array, 0, length)) { return false; } switch (tdsType) { case 40: value.SetToDate(array); break; case 41: value.SetToTime(array, length, scale); break; case 42: value.SetToDateTime2(array, length, scale); break; case 43: value.SetToDateTimeOffset(array, length, scale); break; } return true; } internal bool TryReadSqlValueInternal(SqlBuffer value, byte tdsType, int length, TdsParserStateObject stateObj) { byte value2; int value5; switch (tdsType) { case 50: case 104: if (!stateObj.TryReadByte(out value2)) { return false; } value.Boolean = value2 != 0; break; case 38: if (length == 1) { goto case 48; } if (length == 2) { goto case 52; } if (length == 4) { goto case 56; } goto case 127; case 48: if (!stateObj.TryReadByte(out value2)) { return false; } value.Byte = value2; break; case 52: { if (!stateObj.TryReadInt16(out var value9)) { return false; } value.Int16 = value9; break; } case 56: if (!stateObj.TryReadInt32(out value5)) { return false; } value.Int32 = value5; break; case 127: { if (!stateObj.TryReadInt64(out var value12)) { return false; } value.Int64 = value12; break; } case 109: if (length == 4) { goto case 59; } goto case 62; case 59: { if (!stateObj.TryReadSingle(out var value13)) { return false; } value.Single = value13; break; } case 62: { if (!stateObj.TryReadDouble(out var value6)) { return false; } value.Double = value6; break; } case 110: if (length != 4) { goto case 60; } goto case 122; case 60: { if (!stateObj.TryReadInt32(out var value3)) { return false; } if (!stateObj.TryReadUInt32(out var value4)) { return false; } long toMoney = ((long)value3 << 32) + value4; value.SetToMoney(toMoney); break; } case 122: if (!stateObj.TryReadInt32(out value5)) { return false; } value.SetToMoney(value5); break; case 111: if (length == 4) { goto case 58; } goto case 61; case 58: { if (!stateObj.TryReadUInt16(out var value7)) { return false; } if (!stateObj.TryReadUInt16(out var value8)) { return false; } value.SetToDateTime(value7, value8 * SqlDateTime.SQLTicksPerMinute); break; } case 61: { if (!stateObj.TryReadInt32(out var value10)) { return false; } if (!stateObj.TryReadUInt32(out var value11)) { return false; } value.SetToDateTime(value10, (int)value11); break; } case 36: { byte[] array2 = new byte[length]; if (!stateObj.TryReadByteArray(array2, 0, length)) { return false; } value.SqlGuid = SqlTypeWorkarounds.SqlGuidCtor(array2, ignored: true); break; } case 34: case 37: case 45: case 165: case 173: { byte[] array = new byte[length]; if (!stateObj.TryReadByteArray(array, 0, length)) { return false; } value.SqlBinary = SqlTypeWorkarounds.SqlBinaryCtor(array, ignored: true); break; } case 98: if (!TryReadSqlVariant(value, length, stateObj)) { return false; } break; } return true; } internal bool TryReadSqlVariant(SqlBuffer value, int lenTotal, TdsParserStateObject stateObj) { if (!stateObj.TryReadByte(out var value2)) { return false; } ushort value3 = 0; if (!stateObj.TryReadByte(out var value4)) { return false; } byte propBytes = MetaType.GetSqlDataType(value2, 0u, 0).PropBytes; int num = 2 + value4; int length = lenTotal - num; switch (value2) { case 36: case 48: case 50: case 52: case 56: case 58: case 59: case 60: case 61: case 62: case 122: case 127: if (!TryReadSqlValueInternal(value, value2, length, stateObj)) { return false; } break; case 106: case 108: { if (!stateObj.TryReadByte(out var value6)) { return false; } if (!stateObj.TryReadByte(out var value7)) { return false; } if (value4 > propBytes && !stateObj.TrySkipBytes(value4 - propBytes)) { return false; } if (!TryReadSqlDecimal(value, 17, value6, value7, stateObj)) { return false; } break; } case 165: case 173: if (!stateObj.TryReadUInt16(out value3)) { return false; } if (value4 > propBytes && !stateObj.TrySkipBytes(value4 - propBytes)) { return false; } goto case 36; case 167: case 175: case 231: case 239: { if (!TryProcessCollation(stateObj, out var collation)) { return false; } if (!stateObj.TryReadUInt16(out value3)) { return false; } if (value4 > propBytes && !stateObj.TrySkipBytes(value4 - propBytes)) { return false; } Encoding encoding = Encoding.GetEncoding(GetCodePage(collation, stateObj)); if (!TryReadSqlStringValue(value, value2, length, encoding, isPlp: false, stateObj)) { return false; } break; } case 40: if (!TryReadSqlDateTime(value, value2, length, 0, stateObj)) { return false; } break; case 41: case 42: case 43: { if (!stateObj.TryReadByte(out var value5)) { return false; } if (value4 > propBytes && !stateObj.TrySkipBytes(value4 - propBytes)) { return false; } if (!TryReadSqlDateTime(value, value2, length, value5, stateObj)) { return false; } break; } } return true; } internal Task WriteSqlVariantValue(object value, int length, int offset, TdsParserStateObject stateObj, bool canAccumulate = true) { if (ADP.IsNull(value)) { WriteInt(0, stateObj); WriteInt(0, stateObj); return null; } MetaType metaTypeFromValue = MetaType.GetMetaTypeFromValue(value); if (108 == metaTypeFromValue.TDSType && 8 == length) { metaTypeFromValue = MetaType.GetMetaTypeFromValue(new SqlMoney((decimal)value)); } if (metaTypeFromValue.IsAnsiType) { length = GetEncodingCharLength((string)value, length, 0, _defaultEncoding); } WriteInt(2 + metaTypeFromValue.PropBytes + length, stateObj); WriteInt(2 + metaTypeFromValue.PropBytes + length, stateObj); stateObj.WriteByte(metaTypeFromValue.TDSType); stateObj.WriteByte(metaTypeFromValue.PropBytes); switch (metaTypeFromValue.TDSType) { case 59: WriteFloat((float)value, stateObj); break; case 62: WriteDouble((double)value, stateObj); break; case 127: WriteLong((long)value, stateObj); break; case 56: WriteInt((int)value, stateObj); break; case 52: WriteShort((short)value, stateObj); break; case 48: stateObj.WriteByte((byte)value); break; case 50: if ((bool)value) { stateObj.WriteByte(1); } else { stateObj.WriteByte(0); } break; case 165: { byte[] b2 = (byte[])value; WriteShort(length, stateObj); return stateObj.WriteByteArray(b2, length, offset, canAccumulate); } case 167: { string s2 = (string)value; WriteUnsignedInt(_defaultCollation.info, stateObj); stateObj.WriteByte(_defaultCollation.sortId); WriteShort(length, stateObj); return WriteEncodingChar(s2, _defaultEncoding, stateObj, canAccumulate); } case 36: { byte[] b = ((Guid)value).ToByteArray(); stateObj.WriteByteArray(b, length, 0); break; } case 231: { string s = (string)value; WriteUnsignedInt(_defaultCollation.info, stateObj); stateObj.WriteByte(_defaultCollation.sortId); WriteShort(length, stateObj); length >>= 1; return WriteString(s, length, offset, stateObj, canAccumulate); } case 61: { TdsDateTime tdsDateTime = MetaType.FromDateTime((DateTime)value, 8); WriteInt(tdsDateTime.days, stateObj); WriteInt(tdsDateTime.time, stateObj); break; } case 60: WriteCurrency((decimal)value, 8, stateObj); break; case 108: stateObj.WriteByte(metaTypeFromValue.Precision); stateObj.WriteByte((byte)((decimal.GetBits((decimal)value)[3] & 0xFF0000) >> 16)); WriteDecimal((decimal)value, stateObj); break; case 41: stateObj.WriteByte(metaTypeFromValue.Scale); WriteTime((TimeSpan)value, metaTypeFromValue.Scale, length, stateObj); break; case 43: stateObj.WriteByte(metaTypeFromValue.Scale); WriteDateTimeOffset((DateTimeOffset)value, metaTypeFromValue.Scale, length, stateObj); break; } return null; } internal Task WriteSqlVariantDataRowValue(object value, TdsParserStateObject stateObj, bool canAccumulate = true) { if (value == null || DBNull.Value == value) { WriteInt(0, stateObj); return null; } MetaType metaTypeFromValue = MetaType.GetMetaTypeFromValue(value); int numChars = 0; if (metaTypeFromValue.IsAnsiType) { numChars = GetEncodingCharLength((string)value, numChars, 0, _defaultEncoding); } switch (metaTypeFromValue.TDSType) { case 59: WriteSqlVariantHeader(6, metaTypeFromValue.TDSType, metaTypeFromValue.PropBytes, stateObj); WriteFloat((float)value, stateObj); break; case 62: WriteSqlVariantHeader(10, metaTypeFromValue.TDSType, metaTypeFromValue.PropBytes, stateObj); WriteDouble((double)value, stateObj); break; case 127: WriteSqlVariantHeader(10, metaTypeFromValue.TDSType, metaTypeFromValue.PropBytes, stateObj); WriteLong((long)value, stateObj); break; case 56: WriteSqlVariantHeader(6, metaTypeFromValue.TDSType, metaTypeFromValue.PropBytes, stateObj); WriteInt((int)value, stateObj); break; case 52: WriteSqlVariantHeader(4, metaTypeFromValue.TDSType, metaTypeFromValue.PropBytes, stateObj); WriteShort((short)value, stateObj); break; case 48: WriteSqlVariantHeader(3, metaTypeFromValue.TDSType, metaTypeFromValue.PropBytes, stateObj); stateObj.WriteByte((byte)value); break; case 50: WriteSqlVariantHeader(3, metaTypeFromValue.TDSType, metaTypeFromValue.PropBytes, stateObj); if ((bool)value) { stateObj.WriteByte(1); } else { stateObj.WriteByte(0); } break; case 165: { byte[] array2 = (byte[])value; numChars = array2.Length; WriteSqlVariantHeader(4 + numChars, metaTypeFromValue.TDSType, metaTypeFromValue.PropBytes, stateObj); WriteShort(numChars, stateObj); return stateObj.WriteByteArray(array2, numChars, 0, canAccumulate); } case 167: { string text2 = (string)value; numChars = text2.Length; WriteSqlVariantHeader(9 + numChars, metaTypeFromValue.TDSType, metaTypeFromValue.PropBytes, stateObj); WriteUnsignedInt(_defaultCollation.info, stateObj); stateObj.WriteByte(_defaultCollation.sortId); WriteShort(numChars, stateObj); return WriteEncodingChar(text2, _defaultEncoding, stateObj, canAccumulate); } case 36: { byte[] array = ((Guid)value).ToByteArray(); numChars = array.Length; WriteSqlVariantHeader(18, metaTypeFromValue.TDSType, metaTypeFromValue.PropBytes, stateObj); stateObj.WriteByteArray(array, numChars, 0); break; } case 231: { string text = (string)value; numChars = text.Length * 2; WriteSqlVariantHeader(9 + numChars, metaTypeFromValue.TDSType, metaTypeFromValue.PropBytes, stateObj); WriteUnsignedInt(_defaultCollation.info, stateObj); stateObj.WriteByte(_defaultCollation.sortId); WriteShort(numChars, stateObj); numChars >>= 1; return WriteString(text, numChars, 0, stateObj, canAccumulate); } case 61: { TdsDateTime tdsDateTime = MetaType.FromDateTime((DateTime)value, 8); WriteSqlVariantHeader(10, metaTypeFromValue.TDSType, metaTypeFromValue.PropBytes, stateObj); WriteInt(tdsDateTime.days, stateObj); WriteInt(tdsDateTime.time, stateObj); break; } case 60: WriteSqlVariantHeader(10, metaTypeFromValue.TDSType, metaTypeFromValue.PropBytes, stateObj); WriteCurrency((decimal)value, 8, stateObj); break; case 108: WriteSqlVariantHeader(21, metaTypeFromValue.TDSType, metaTypeFromValue.PropBytes, stateObj); stateObj.WriteByte(metaTypeFromValue.Precision); stateObj.WriteByte((byte)((decimal.GetBits((decimal)value)[3] & 0xFF0000) >> 16)); WriteDecimal((decimal)value, stateObj); break; case 41: WriteSqlVariantHeader(8, metaTypeFromValue.TDSType, metaTypeFromValue.PropBytes, stateObj); stateObj.WriteByte(metaTypeFromValue.Scale); WriteTime((TimeSpan)value, metaTypeFromValue.Scale, 5, stateObj); break; case 43: WriteSqlVariantHeader(13, metaTypeFromValue.TDSType, metaTypeFromValue.PropBytes, stateObj); stateObj.WriteByte(metaTypeFromValue.Scale); WriteDateTimeOffset((DateTimeOffset)value, metaTypeFromValue.Scale, 10, stateObj); break; } return null; } internal void WriteSqlVariantHeader(int length, byte tdstype, byte propbytes, TdsParserStateObject stateObj) { WriteInt(length, stateObj); stateObj.WriteByte(tdstype); stateObj.WriteByte(propbytes); } internal void WriteSqlVariantDateTime2(DateTime value, TdsParserStateObject stateObj) { SmiMetaData defaultDateTime = SmiMetaData.DefaultDateTime2; WriteSqlVariantHeader((int)(defaultDateTime.MaxLength + 3), 42, 1, stateObj); stateObj.WriteByte(defaultDateTime.Scale); WriteDateTime2(value, defaultDateTime.Scale, (int)defaultDateTime.MaxLength, stateObj); } internal void WriteSqlVariantDate(DateTime value, TdsParserStateObject stateObj) { SmiMetaData defaultDate = SmiMetaData.DefaultDate; WriteSqlVariantHeader((int)(defaultDate.MaxLength + 2), 40, 0, stateObj); WriteDate(value, stateObj); } private void WriteSqlMoney(SqlMoney value, int length, TdsParserStateObject stateObj) { int[] bits = decimal.GetBits(value.Value); bool num = (bits[3] & int.MinValue) != 0; long num2 = (long)(((ulong)(uint)bits[1] << 32) | (uint)bits[0]); if (num) { num2 = -num2; } if (length == 4) { decimal value2 = value.Value; if (value2 < TdsEnums.SQL_SMALL_MONEY_MIN || value2 > TdsEnums.SQL_SMALL_MONEY_MAX) { throw SQL.MoneyOverflow(value2.ToString(CultureInfo.InvariantCulture)); } WriteInt((int)num2, stateObj); } else { WriteInt((int)(num2 >> 32), stateObj); WriteInt((int)num2, stateObj); } } private void WriteCurrency(decimal value, int length, TdsParserStateObject stateObj) { int[] bits = decimal.GetBits(new SqlMoney(value).Value); bool num = (bits[3] & int.MinValue) != 0; long num2 = (long)(((ulong)(uint)bits[1] << 32) | (uint)bits[0]); if (num) { num2 = -num2; } if (length == 4) { if (value < TdsEnums.SQL_SMALL_MONEY_MIN || value > TdsEnums.SQL_SMALL_MONEY_MAX) { throw SQL.MoneyOverflow(value.ToString(CultureInfo.InvariantCulture)); } WriteInt((int)num2, stateObj); } else { WriteInt((int)(num2 >> 32), stateObj); WriteInt((int)num2, stateObj); } } private void WriteDate(DateTime value, TdsParserStateObject stateObj) { long v = value.Subtract(DateTime.MinValue).Days; WritePartialLong(v, 3, stateObj); } private void WriteTime(TimeSpan value, byte scale, int length, TdsParserStateObject stateObj) { if (0 > value.Ticks || value.Ticks >= 864000000000L) { throw SQL.TimeOverflow(value.ToString()); } long v = value.Ticks / TdsEnums.TICKS_FROM_SCALE[scale]; WritePartialLong(v, length, stateObj); } private void WriteDateTime2(DateTime value, byte scale, int length, TdsParserStateObject stateObj) { long v = value.TimeOfDay.Ticks / TdsEnums.TICKS_FROM_SCALE[scale]; WritePartialLong(v, length - 3, stateObj); WriteDate(value, stateObj); } private void WriteDateTimeOffset(DateTimeOffset value, byte scale, int length, TdsParserStateObject stateObj) { WriteDateTime2(value.UtcDateTime, scale, length - 2, stateObj); short num = (short)value.Offset.TotalMinutes; stateObj.WriteByte((byte)((uint)num & 0xFFu)); stateObj.WriteByte((byte)((uint)(num >> 8) & 0xFFu)); } private bool TryReadSqlDecimal(SqlBuffer value, int length, byte precision, byte scale, TdsParserStateObject stateObj) { if (!stateObj.TryReadByte(out var value2)) { return false; } bool positive = 1 == value2; length = checked(length - 1); if (!TryReadDecimalBits(length, stateObj, out var bits)) { return false; } value.SetToDecimal(precision, scale, positive, bits); return true; } private bool TryReadDecimalBits(int length, TdsParserStateObject stateObj, out int[] bits) { bits = stateObj._decimalBits; if (bits == null) { bits = new int[4]; stateObj._decimalBits = bits; } else { for (int i = 0; i < bits.Length; i++) { bits[i] = 0; } } int num = length >> 2; for (int i = 0; i < num; i++) { if (!stateObj.TryReadInt32(out bits[i])) { return false; } } return true; } internal static SqlDecimal AdjustSqlDecimalScale(SqlDecimal d, int newScale) { if (d.Scale != newScale) { return SqlDecimal.AdjustScale(d, newScale - d.Scale, fRound: false); } return d; } internal static decimal AdjustDecimalScale(decimal value, int newScale) { int num = (decimal.GetBits(value)[3] & 0xFF0000) >> 16; if (newScale != num) { SqlDecimal n = new SqlDecimal(value); return SqlDecimal.AdjustScale(n, newScale - num, fRound: false).Value; } return value; } internal void WriteSqlDecimal(SqlDecimal d, TdsParserStateObject stateObj) { if (d.IsPositive) { stateObj.WriteByte(1); } else { stateObj.WriteByte(0); } SqlTypeWorkarounds.SqlDecimalExtractData(d, out var data, out var data2, out var data3, out var data4); WriteUnsignedInt(data, stateObj); WriteUnsignedInt(data2, stateObj); WriteUnsignedInt(data3, stateObj); WriteUnsignedInt(data4, stateObj); } private void WriteDecimal(decimal value, TdsParserStateObject stateObj) { stateObj._decimalBits = decimal.GetBits(value); if (2147483648u == (stateObj._decimalBits[3] & 0x80000000u)) { stateObj.WriteByte(0); } else { stateObj.WriteByte(1); } WriteInt(stateObj._decimalBits[0], stateObj); WriteInt(stateObj._decimalBits[1], stateObj); WriteInt(stateObj._decimalBits[2], stateObj); WriteInt(0, stateObj); } private void WriteIdentifier(string s, TdsParserStateObject stateObj) { if (s != null) { stateObj.WriteByte(checked((byte)s.Length)); WriteString(s, stateObj); } else { stateObj.WriteByte(0); } } private void WriteIdentifierWithShortLength(string s, TdsParserStateObject stateObj) { if (s != null) { WriteShort(checked((short)s.Length), stateObj); WriteString(s, stateObj); } else { WriteShort(0, stateObj); } } private Task WriteString(string s, TdsParserStateObject stateObj, bool canAccumulate = true) { return WriteString(s, s.Length, 0, stateObj, canAccumulate); } internal Task WriteCharArray(char[] carr, int length, int offset, TdsParserStateObject stateObj, bool canAccumulate = true) { int num = 2 * length; if (num < stateObj._outBuff.Length - stateObj._outBytesUsed) { CopyCharsToBytes(carr, offset, stateObj._outBuff, stateObj._outBytesUsed, length); stateObj._outBytesUsed += num; return null; } if (stateObj._bTmp == null || stateObj._bTmp.Length < num) { stateObj._bTmp = new byte[num]; } CopyCharsToBytes(carr, offset, stateObj._bTmp, 0, length); return stateObj.WriteByteArray(stateObj._bTmp, num, 0, canAccumulate); } internal Task WriteString(string s, int length, int offset, TdsParserStateObject stateObj, bool canAccumulate = true) { int num = 2 * length; if (num < stateObj._outBuff.Length - stateObj._outBytesUsed) { CopyStringToBytes(s, offset, stateObj._outBuff, stateObj._outBytesUsed, length); stateObj._outBytesUsed += num; return null; } if (stateObj._bTmp == null || stateObj._bTmp.Length < num) { stateObj._bTmp = new byte[num]; } CopyStringToBytes(s, offset, stateObj._bTmp, 0, length); return stateObj.WriteByteArray(stateObj._bTmp, num, 0, canAccumulate); } private static void CopyCharsToBytes(char[] source, int sourceOffset, byte[] dest, int destOffset, int charLength) { Buffer.BlockCopy(source, sourceOffset, dest, destOffset, charLength * 2); } private static void CopyStringToBytes(string source, int sourceOffset, byte[] dest, int destOffset, int charLength) { Encoding.Unicode.GetBytes(source, sourceOffset, charLength, dest, destOffset); } private Task WriteEncodingChar(string s, Encoding encoding, TdsParserStateObject stateObj, bool canAccumulate = true) { return WriteEncodingChar(s, s.Length, 0, encoding, stateObj, canAccumulate); } private Task WriteEncodingChar(string s, int numChars, int offset, Encoding encoding, TdsParserStateObject stateObj, bool canAccumulate = true) { if (encoding == null) { encoding = _defaultEncoding; } char[] array = s.ToCharArray(offset, numChars); int num = stateObj._outBuff.Length - stateObj._outBytesUsed; if (numChars <= num && encoding.GetMaxByteCount(array.Length) <= num) { int bytes = encoding.GetBytes(array, 0, array.Length, stateObj._outBuff, stateObj._outBytesUsed); stateObj._outBytesUsed += bytes; return null; } byte[] bytes2 = encoding.GetBytes(array, 0, numChars); return stateObj.WriteByteArray(bytes2, bytes2.Length, 0, canAccumulate); } internal int GetEncodingCharLength(string value, int numChars, int charOffset, Encoding encoding) { if (value == null || value == ADP.StrEmpty) { return 0; } if (encoding == null) { if (_defaultEncoding == null) { ThrowUnsupportedCollationEncountered(null); } encoding = _defaultEncoding; } char[] chars = value.ToCharArray(charOffset, numChars); return encoding.GetByteCount(chars, 0, numChars); } internal bool TryGetDataLength(SqlMetaDataPriv colmeta, TdsParserStateObject stateObj, out ulong length) { if (colmeta.metaType.IsPlp) { return stateObj.TryReadPlpLength(returnPlpNullIfNull: true, out length); } if (!TryGetTokenLength(colmeta.tdsType, stateObj, out var tokenLength)) { length = 0uL; return false; } length = (ulong)tokenLength; return true; } internal bool TryGetTokenLength(byte token, TdsParserStateObject stateObj, out int tokenLength) { switch (token) { case 174: tokenLength = -1; return true; case 228: return stateObj.TryReadInt32(out tokenLength); case 240: tokenLength = -1; return true; case 172: tokenLength = -1; return true; case 241: { if (!stateObj.TryReadUInt16(out var value3)) { tokenLength = 0; return false; } tokenLength = value3; return true; } default: switch (token & 0x30) { case 48: tokenLength = (1 << ((token & 0xC) >> 2)) & 0xFF; return true; case 16: tokenLength = 0; return true; case 0: case 32: { if ((token & 0x80u) != 0) { if (!stateObj.TryReadUInt16(out var value)) { tokenLength = 0; return false; } tokenLength = value; return true; } if ((token & 0xC) == 0) { if (!stateObj.TryReadInt32(out tokenLength)) { return false; } return true; } if (!stateObj.TryReadByte(out var value2)) { tokenLength = 0; return false; } tokenLength = value2; return true; } default: tokenLength = 0; return true; } } } private void ProcessAttention(TdsParserStateObject stateObj) { if (_state == TdsParserState.Closed || _state == TdsParserState.Broken) { return; } stateObj.StoreErrorAndWarningForAttention(); try { Run(RunBehavior.Attention, null, null, null, stateObj); } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } _state = TdsParserState.Broken; _connHandler.BreakConnection(); throw; } stateObj.RestoreErrorAndWarningAfterAttention(); } private static int StateValueLength(int dataLen) { if (dataLen >= 255) { return dataLen + 5; } return dataLen + 1; } internal int WriteSessionRecoveryFeatureRequest(SessionData reconnectData, bool write) { int num = 1; if (write) { _physicalStateObj.WriteByte(1); } if (reconnectData == null) { if (write) { WriteInt(0, _physicalStateObj); } return num + 4; } int num2 = 0; num2 += 1 + 2 * TdsParserStaticMethods.NullAwareStringLength(reconnectData._initialDatabase); num2 += 1 + 2 * TdsParserStaticMethods.NullAwareStringLength(reconnectData._initialLanguage); num2 += ((reconnectData._initialCollation == null) ? 1 : 6); for (int i = 0; i < 256; i++) { if (reconnectData._initialState[i] != null) { num2 += 1 + StateValueLength(reconnectData._initialState[i].Length); } } int num3 = 0; num3 += 1 + 2 * ((!(reconnectData._initialDatabase == reconnectData._database)) ? TdsParserStaticMethods.NullAwareStringLength(reconnectData._database) : 0); num3 += 1 + 2 * ((!(reconnectData._initialLanguage == reconnectData._language)) ? TdsParserStaticMethods.NullAwareStringLength(reconnectData._language) : 0); num3 += ((reconnectData._collation == null || SqlCollation.AreSame(reconnectData._collation, reconnectData._initialCollation)) ? 1 : 6); bool[] array = new bool[256]; for (int j = 0; j < 256; j++) { if (reconnectData._delta[j] == null) { continue; } array[j] = true; if (reconnectData._initialState[j] != null && reconnectData._initialState[j].Length == reconnectData._delta[j]._dataLength) { array[j] = false; for (int k = 0; k < reconnectData._delta[j]._dataLength; k++) { if (reconnectData._initialState[j][k] != reconnectData._delta[j]._data[k]) { array[j] = true; break; } } } if (array[j]) { num3 += 1 + StateValueLength(reconnectData._delta[j]._dataLength); } } if (write) { WriteInt(8 + num2 + num3, _physicalStateObj); WriteInt(num2, _physicalStateObj); WriteIdentifier(reconnectData._initialDatabase, _physicalStateObj); WriteCollation(reconnectData._initialCollation, _physicalStateObj); WriteIdentifier(reconnectData._initialLanguage, _physicalStateObj); for (int l = 0; l < 256; l++) { if (reconnectData._initialState[l] != null) { _physicalStateObj.WriteByte((byte)l); if (reconnectData._initialState[l].Length < 255) { _physicalStateObj.WriteByte((byte)reconnectData._initialState[l].Length); } else { _physicalStateObj.WriteByte(byte.MaxValue); WriteInt(reconnectData._initialState[l].Length, _physicalStateObj); } _physicalStateObj.WriteByteArray(reconnectData._initialState[l], reconnectData._initialState[l].Length, 0); } } WriteInt(num3, _physicalStateObj); WriteIdentifier((reconnectData._database != reconnectData._initialDatabase) ? reconnectData._database : null, _physicalStateObj); WriteCollation(SqlCollation.AreSame(reconnectData._initialCollation, reconnectData._collation) ? null : reconnectData._collation, _physicalStateObj); WriteIdentifier((reconnectData._language != reconnectData._initialLanguage) ? reconnectData._language : null, _physicalStateObj); for (int m = 0; m < 256; m++) { if (array[m]) { _physicalStateObj.WriteByte((byte)m); if (reconnectData._delta[m]._dataLength < 255) { _physicalStateObj.WriteByte((byte)reconnectData._delta[m]._dataLength); } else { _physicalStateObj.WriteByte(byte.MaxValue); WriteInt(reconnectData._delta[m]._dataLength, _physicalStateObj); } _physicalStateObj.WriteByteArray(reconnectData._delta[m]._data, reconnectData._delta[m]._dataLength, 0); } } } return num + (num2 + num3 + 12); } internal int WriteGlobalTransactionsFeatureRequest(bool write) { if (write) { _physicalStateObj.WriteByte(5); WriteInt(0, _physicalStateObj); } return 5; } internal void TdsLogin(SqlLogin rec, TdsEnums.FeatureExtension requestedFeatures, SessionData recoverySessionData) { _physicalStateObj.SetTimeoutSeconds(rec.timeout); _connHandler.TimeoutErrorInternal.EndPhase(SqlConnectionTimeoutErrorPhase.LoginBegin); _connHandler.TimeoutErrorInternal.SetAndBeginPhase(SqlConnectionTimeoutErrorPhase.ProcessConnectionAuth); byte[] array = null; bool flag = requestedFeatures != TdsEnums.FeatureExtension.None; string userName = rec.userName; array = TdsParserStaticMethods.ObfuscatePassword(rec.password); int num = array.Length; _physicalStateObj._outputMessageType = 16; int num2 = 94; string text = "Core .Net SqlClient Data Provider"; byte[] sendBuff; uint sendLength; int v; checked { num2 += (rec.hostName.Length + rec.applicationName.Length + rec.serverName.Length + text.Length + rec.language.Length + rec.database.Length + rec.attachDBFilename.Length) * 2; if (flag) { num2 += 4; } sendBuff = null; sendLength = 0u; if (!rec.useSSPI) { num2 += userName.Length * 2 + num; } else if (rec.useSSPI) { sendBuff = new byte[s_maxSSPILength]; sendLength = s_maxSSPILength; _physicalStateObj.SniContext = SniContext.Snix_LoginSspi; SSPIData(null, 0u, ref sendBuff, ref sendLength); if (sendLength > int.MaxValue) { throw SQL.InvalidSSPIPacketSize(); } _physicalStateObj.SniContext = SniContext.Snix_Login; num2 += (int)sendLength; } v = num2; } if (flag) { if ((requestedFeatures & TdsEnums.FeatureExtension.SessionRecovery) != 0) { num2 += WriteSessionRecoveryFeatureRequest(recoverySessionData, write: false); } if ((requestedFeatures & TdsEnums.FeatureExtension.GlobalTransactions) != 0) { num2 += WriteGlobalTransactionsFeatureRequest(write: false); } num2++; } try { WriteInt(num2, _physicalStateObj); if (recoverySessionData == null) { WriteInt(1946157060, _physicalStateObj); } else { WriteUnsignedInt(recoverySessionData._tdsVersion, _physicalStateObj); } WriteInt(rec.packetSize, _physicalStateObj); WriteInt(100663296, _physicalStateObj); WriteInt(TdsParserStaticMethods.GetCurrentProcessIdForTdsLoginOnly(), _physicalStateObj); WriteInt(0, _physicalStateObj); int num3 = 0; num3 |= 0x20; num3 |= 0x40; num3 |= 0x80; num3 |= 0x100; num3 |= 0x200; if (rec.useReplication) { num3 |= 0x3000; } if (rec.useSSPI) { num3 |= 0x8000; } if (rec.readOnlyIntent) { num3 |= 0x200000; } if (rec.userInstance) { num3 |= 0x4000000; } if (flag) { num3 |= 0x10000000; } WriteInt(num3, _physicalStateObj); WriteInt(0, _physicalStateObj); WriteInt(0, _physicalStateObj); int num4 = 94; WriteShort(num4, _physicalStateObj); WriteShort(rec.hostName.Length, _physicalStateObj); num4 += rec.hostName.Length * 2; if (!rec.useSSPI) { WriteShort(num4, _physicalStateObj); WriteShort(userName.Length, _physicalStateObj); num4 += userName.Length * 2; WriteShort(num4, _physicalStateObj); WriteShort(num / 2, _physicalStateObj); num4 += num; } else { WriteShort(0, _physicalStateObj); WriteShort(0, _physicalStateObj); WriteShort(0, _physicalStateObj); WriteShort(0, _physicalStateObj); } WriteShort(num4, _physicalStateObj); WriteShort(rec.applicationName.Length, _physicalStateObj); num4 += rec.applicationName.Length * 2; WriteShort(num4, _physicalStateObj); WriteShort(rec.serverName.Length, _physicalStateObj); num4 += rec.serverName.Length * 2; WriteShort(num4, _physicalStateObj); if (flag) { WriteShort(4, _physicalStateObj); num4 += 4; } else { WriteShort(0, _physicalStateObj); } WriteShort(num4, _physicalStateObj); WriteShort(text.Length, _physicalStateObj); num4 += text.Length * 2; WriteShort(num4, _physicalStateObj); WriteShort(rec.language.Length, _physicalStateObj); num4 += rec.language.Length * 2; WriteShort(num4, _physicalStateObj); WriteShort(rec.database.Length, _physicalStateObj); num4 += rec.database.Length * 2; if (s_nicAddress == null) { s_nicAddress = TdsParserStaticMethods.GetNetworkPhysicalAddressForTdsLoginOnly(); } _physicalStateObj.WriteByteArray(s_nicAddress, s_nicAddress.Length, 0); WriteShort(num4, _physicalStateObj); if (rec.useSSPI) { WriteShort((int)sendLength, _physicalStateObj); num4 += (int)sendLength; } else { WriteShort(0, _physicalStateObj); } WriteShort(num4, _physicalStateObj); WriteShort(rec.attachDBFilename.Length, _physicalStateObj); num4 += rec.attachDBFilename.Length * 2; WriteShort(num4, _physicalStateObj); WriteShort(0, _physicalStateObj); WriteInt(0, _physicalStateObj); WriteString(rec.hostName, _physicalStateObj); if (!rec.useSSPI) { WriteString(userName, _physicalStateObj); _physicalStateObj.WriteByteArray(array, num, 0); } WriteString(rec.applicationName, _physicalStateObj); WriteString(rec.serverName, _physicalStateObj); if (flag) { WriteInt(v, _physicalStateObj); } WriteString(text, _physicalStateObj); WriteString(rec.language, _physicalStateObj); WriteString(rec.database, _physicalStateObj); if (rec.useSSPI) { _physicalStateObj.WriteByteArray(sendBuff, (int)sendLength, 0); } WriteString(rec.attachDBFilename, _physicalStateObj); if (flag) { if ((requestedFeatures & TdsEnums.FeatureExtension.SessionRecovery) != 0) { num2 += WriteSessionRecoveryFeatureRequest(recoverySessionData, write: true); } if ((requestedFeatures & TdsEnums.FeatureExtension.GlobalTransactions) != 0) { WriteGlobalTransactionsFeatureRequest(write: true); } _physicalStateObj.WriteByte(byte.MaxValue); } } catch (Exception e) { if (ADP.IsCatchableExceptionType(e)) { _physicalStateObj._outputPacketNumber = 1; _physicalStateObj.ResetBuffer(); } throw; } _physicalStateObj.WritePacket(1); _physicalStateObj._pendingData = true; _physicalStateObj._messageStatus = 0; } private void SSPIData(byte[] receivedBuff, uint receivedLength, ref byte[] sendBuff, ref uint sendLength) { SNISSPIData(receivedBuff, receivedLength, ref sendBuff, ref sendLength); } private void SNISSPIData(byte[] receivedBuff, uint receivedLength, ref byte[] sendBuff, ref uint sendLength) { if (TdsParserStateObjectFactory.UseManagedSNI) { try { _physicalStateObj.GenerateSspiClientContext(receivedBuff, receivedLength, ref sendBuff, ref sendLength, _sniSpnBuffer); return; } catch (Exception ex) { SSPIError(ex.Message + Environment.NewLine + ex.StackTrace, "GenClientContext"); return; } } if (receivedBuff == null) { receivedLength = 0u; } if (_physicalStateObj.GenerateSspiClientContext(receivedBuff, receivedLength, ref sendBuff, ref sendLength, _sniSpnBuffer) != 0) { SSPIError(SQLMessage.SSPIGenerateError(), "GenClientContext"); } } private void ProcessSSPI(int receivedLength) { SniContext sniContext = _physicalStateObj.SniContext; _physicalStateObj.SniContext = SniContext.Snix_ProcessSspi; byte[] array = new byte[receivedLength]; if (!_physicalStateObj.TryReadByteArray(array, 0, receivedLength)) { throw SQL.SynchronousCallMayNotPend(); } byte[] sendBuff = new byte[s_maxSSPILength]; uint sendLength = s_maxSSPILength; SSPIData(array, (uint)receivedLength, ref sendBuff, ref sendLength); _physicalStateObj.WriteByteArray(sendBuff, (int)sendLength, 0); _physicalStateObj._outputMessageType = 17; _physicalStateObj.WritePacket(1); _physicalStateObj.SniContext = sniContext; } private void SSPIError(string error, string procedure) { _physicalStateObj.AddError(new SqlError(0, 0, 11, _server, error, procedure, 0)); ThrowExceptionAndWarning(_physicalStateObj); } internal byte[] GetDTCAddress(int timeout, TdsParserStateObject stateObj) { byte[] array = null; using (SqlDataReader sqlDataReader = TdsExecuteTransactionManagerRequest(null, TdsEnums.TransactionManagerRequestType.GetDTCAddress, null, TdsEnums.TransactionManagerIsolationLevel.Unspecified, timeout, null, stateObj, isDelegateControlRequest: true)) { if (sqlDataReader != null && sqlDataReader.Read()) { long bytes = sqlDataReader.GetBytes(0, 0L, null, 0, 0); if (bytes <= int.MaxValue) { int num = (int)bytes; array = new byte[num]; sqlDataReader.GetBytes(0, 0L, array, 0, num); } } } return array; } internal void PropagateDistributedTransaction(byte[] buffer, int timeout, TdsParserStateObject stateObj) { TdsExecuteTransactionManagerRequest(buffer, TdsEnums.TransactionManagerRequestType.Propagate, null, TdsEnums.TransactionManagerIsolationLevel.Unspecified, timeout, null, stateObj, isDelegateControlRequest: true); } internal SqlDataReader TdsExecuteTransactionManagerRequest(byte[] buffer, TdsEnums.TransactionManagerRequestType request, string transactionName, TdsEnums.TransactionManagerIsolationLevel isoLevel, int timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, bool isDelegateControlRequest) { if (TdsParserState.Broken == State || State == TdsParserState.Closed) { return null; } bool threadHasParserLockForClose = _connHandler.ThreadHasParserLockForClose; if (!threadHasParserLockForClose) { _connHandler._parserLock.Wait(canReleaseFromAnyThread: false); _connHandler.ThreadHasParserLockForClose = true; } bool asyncWrite = _asyncWrite; try { _asyncWrite = false; if (!isDelegateControlRequest) { _connHandler.CheckEnlistedTransactionBinding(); } stateObj._outputMessageType = 14; stateObj.SetTimeoutSeconds(timeout); stateObj.SniContext = SniContext.Snix_Execute; WriteInt(22, stateObj); WriteInt(18, stateObj); WriteMarsHeaderData(stateObj, _currentTransaction); WriteShort((short)request, stateObj); bool flag = false; switch (request) { case TdsEnums.TransactionManagerRequestType.GetDTCAddress: WriteShort(0, stateObj); flag = true; break; case TdsEnums.TransactionManagerRequestType.Propagate: if (buffer != null) { WriteShort(buffer.Length, stateObj); stateObj.WriteByteArray(buffer, buffer.Length, 0); } else { WriteShort(0, stateObj); } break; case TdsEnums.TransactionManagerRequestType.Begin: if (_currentTransaction != transaction) { PendingTransaction = transaction; } stateObj.WriteByte((byte)isoLevel); stateObj.WriteByte((byte)(transactionName.Length * 2)); WriteString(transactionName, stateObj); break; case TdsEnums.TransactionManagerRequestType.Commit: stateObj.WriteByte(0); stateObj.WriteByte(0); break; case TdsEnums.TransactionManagerRequestType.Rollback: stateObj.WriteByte((byte)(transactionName.Length * 2)); WriteString(transactionName, stateObj); stateObj.WriteByte(0); break; case TdsEnums.TransactionManagerRequestType.Save: stateObj.WriteByte((byte)(transactionName.Length * 2)); WriteString(transactionName, stateObj); break; } stateObj.WritePacket(1); stateObj._pendingData = true; stateObj._messageStatus = 0; SqlDataReader sqlDataReader = null; stateObj.SniContext = SniContext.Snix_Read; if (flag) { sqlDataReader = new SqlDataReader(null, CommandBehavior.Default); sqlDataReader.Bind(stateObj); _ = sqlDataReader.MetaData; } else { Run(RunBehavior.UntilDone, null, null, null, stateObj); } if ((request == TdsEnums.TransactionManagerRequestType.Begin || request == TdsEnums.TransactionManagerRequestType.Propagate) && (transaction == null || transaction.TransactionId != _retainedTransactionId)) { _retainedTransactionId = 0L; } return sqlDataReader; } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } FailureCleanup(stateObj, e); throw; } finally { _pendingTransaction = null; _asyncWrite = asyncWrite; if (!threadHasParserLockForClose) { _connHandler.ThreadHasParserLockForClose = false; _connHandler._parserLock.Release(); } } } internal void FailureCleanup(TdsParserStateObject stateObj, Exception e) { byte outputPacketNumber = stateObj._outputPacketNumber; if (stateObj.HasOpenResult) { stateObj.DecrementOpenResultCount(); } stateObj.ResetBuffer(); stateObj._outputPacketNumber = 1; if (outputPacketNumber != 1 && _state == TdsParserState.OpenLoggedIn) { bool threadHasParserLockForClose = _connHandler.ThreadHasParserLockForClose; try { _connHandler.ThreadHasParserLockForClose = true; stateObj.SendAttention(); ProcessAttention(stateObj); } finally { _connHandler.ThreadHasParserLockForClose = threadHasParserLockForClose; } } } internal Task TdsExecuteSQLBatch(string text, int timeout, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, bool sync, bool callerHasConnectionLock = false) { if (TdsParserState.Broken == State || State == TdsParserState.Closed) { return null; } if (stateObj.BcpLock) { throw SQL.ConnectionLockedForBcpEvent(); } bool num = !callerHasConnectionLock && !_connHandler.ThreadHasParserLockForClose; bool flag = false; if (num) { _connHandler._parserLock.Wait(!sync); flag = true; } _asyncWrite = !sync; try { if (_state == TdsParserState.Closed || _state == TdsParserState.Broken) { throw ADP.ClosedConnectionError(); } _connHandler.CheckEnlistedTransactionBinding(); stateObj.SetTimeoutSeconds(timeout); stateObj.SniContext = SniContext.Snix_Execute; WriteRPCBatchHeaders(stateObj, notificationRequest); stateObj._outputMessageType = 1; WriteString(text, text.Length, 0, stateObj); Task task = stateObj.ExecuteFlush(); if (task == null) { stateObj.SniContext = SniContext.Snix_Read; return null; } bool taskReleaseConnectionLock = flag; flag = false; return task.ContinueWith(delegate(Task t) { try { if (t.IsFaulted) { FailureCleanup(stateObj, t.Exception.InnerException); throw t.Exception.InnerException; } stateObj.SniContext = SniContext.Snix_Read; } finally { if (taskReleaseConnectionLock) { _connHandler._parserLock.Release(); } } }, TaskScheduler.Default); } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } FailureCleanup(stateObj, e); throw; } finally { if (flag) { _connHandler._parserLock.Release(); } } } internal Task TdsExecuteRPC(_SqlRPC[] rpcArray, int timeout, bool inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, bool isCommandProc, bool sync = true, TaskCompletionSource completion = null, int startRpc = 0, int startParam = 0) { bool flag = completion == null; bool flag2 = false; try { _SqlRPC sqlRPC = null; if (flag) { _connHandler._parserLock.Wait(!sync); flag2 = true; } try { if (TdsParserState.Broken == State || State == TdsParserState.Closed) { throw ADP.ClosedConnectionError(); } if (flag) { _asyncWrite = !sync; _connHandler.CheckEnlistedTransactionBinding(); stateObj.SetTimeoutSeconds(timeout); stateObj.SniContext = SniContext.Snix_Execute; WriteRPCBatchHeaders(stateObj, notificationRequest); stateObj._outputMessageType = 3; } for (int ii = startRpc; ii < rpcArray.Length; ii++) { sqlRPC = rpcArray[ii]; if (startParam == 0 || ii > startRpc) { if (sqlRPC.ProcID != 0) { WriteShort(65535, stateObj); WriteShort((short)sqlRPC.ProcID, stateObj); } else { int length = sqlRPC.rpcName.Length; WriteShort(length, stateObj); WriteString(sqlRPC.rpcName, length, 0, stateObj); } WriteShort((short)sqlRPC.options, stateObj); } SqlParameter[] parameters = sqlRPC.parameters; int i; for (i = ((ii == startRpc) ? startParam : 0); i < parameters.Length; i++) { SqlParameter sqlParameter = parameters[i]; if (sqlParameter == null) { break; } sqlParameter.Validate(i, isCommandProc); MetaType internalMetaType = sqlParameter.InternalMetaType; if (internalMetaType.IsNewKatmaiType) { WriteSmiParameter(sqlParameter, i, (sqlRPC.paramoptions[i] & 2) != 0, stateObj); continue; } if (!_isKatmai && !internalMetaType.Is90Supported) { throw ADP.VersionDoesNotSupportDataType(internalMetaType.TypeName); } object obj = null; bool flag3 = true; bool flag4 = false; bool flag5 = false; if (sqlParameter.Direction == ParameterDirection.Output) { flag4 = sqlParameter.ParameterIsSqlType; sqlParameter.Value = null; sqlParameter.ParameterIsSqlType = flag4; } else { obj = sqlParameter.GetCoercedValue(); flag3 = sqlParameter.IsNull; if (!flag3) { flag4 = sqlParameter.CoercedValueIsSqlType; flag5 = sqlParameter.CoercedValueIsDataFeed; } } WriteParameterName(sqlParameter.ParameterNameFixed, stateObj); stateObj.WriteByte(sqlRPC.paramoptions[i]); stateObj.WriteByte(internalMetaType.NullableType); if (internalMetaType.TDSType == 98) { WriteSqlVariantValue(flag4 ? MetaType.GetComValueFromSqlVariant(obj) : obj, sqlParameter.GetActualSize(), sqlParameter.Offset, stateObj); continue; } int num = (internalMetaType.IsSizeInCharacters ? (sqlParameter.GetParameterSize() * 2) : sqlParameter.GetParameterSize()); int num2 = ((internalMetaType.TDSType != 240) ? sqlParameter.GetActualSize() : 0); int num3 = 0; int num4 = 0; if (internalMetaType.IsAnsiType) { if (!flag3 && !flag5) { string value = ((!flag4) ? ((string)obj) : ((!(obj is SqlString sqlString)) ? new string(((SqlChars)obj).Value) : sqlString.Value)); num3 = GetEncodingCharLength(value, num2, sqlParameter.Offset, _defaultEncoding); } if (internalMetaType.IsPlp) { WriteShort(65535, stateObj); } else { num4 = ((num > num3) ? num : num3); if (num4 == 0) { num4 = ((!internalMetaType.IsNCharType) ? 1 : 2); } WriteParameterVarLen(internalMetaType, num4, isNull: false, stateObj); } } else if (internalMetaType.SqlDbType == SqlDbType.Timestamp) { WriteParameterVarLen(internalMetaType, 8, isNull: false, stateObj); } else { if (internalMetaType.SqlDbType == SqlDbType.Udt) { throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString()); } if (internalMetaType.IsPlp) { if (internalMetaType.SqlDbType != SqlDbType.Xml) { WriteShort(65535, stateObj); } } else if (!internalMetaType.IsVarTime && internalMetaType.SqlDbType != SqlDbType.Date) { num4 = ((num > num2) ? num : num2); if (num4 == 0) { num4 = ((!internalMetaType.IsNCharType) ? 1 : 2); } WriteParameterVarLen(internalMetaType, num4, isNull: false, stateObj); } } if (internalMetaType.SqlDbType == SqlDbType.Decimal) { byte actualPrecision = sqlParameter.GetActualPrecision(); byte actualScale = sqlParameter.GetActualScale(); if (actualPrecision > 38) { throw SQL.PrecisionValueOutOfRange(actualPrecision); } if (!flag3) { if (flag4) { obj = AdjustSqlDecimalScale((SqlDecimal)obj, actualScale); if (actualPrecision != 0 && actualPrecision < ((SqlDecimal)obj).Precision) { throw ADP.ParameterValueOutOfRange((SqlDecimal)obj); } } else { obj = AdjustDecimalScale((decimal)obj, actualScale); SqlDecimal sqlDecimal = new SqlDecimal((decimal)obj); if (actualPrecision != 0 && actualPrecision < sqlDecimal.Precision) { throw ADP.ParameterValueOutOfRange((decimal)obj); } } } if (actualPrecision == 0) { stateObj.WriteByte(29); } else { stateObj.WriteByte(actualPrecision); } stateObj.WriteByte(actualScale); } else if (internalMetaType.IsVarTime) { stateObj.WriteByte(sqlParameter.GetActualScale()); } if (internalMetaType.SqlDbType == SqlDbType.Xml) { if ((sqlParameter.XmlSchemaCollectionDatabase != null && sqlParameter.XmlSchemaCollectionDatabase != ADP.StrEmpty) || (sqlParameter.XmlSchemaCollectionOwningSchema != null && sqlParameter.XmlSchemaCollectionOwningSchema != ADP.StrEmpty) || (sqlParameter.XmlSchemaCollectionName != null && sqlParameter.XmlSchemaCollectionName != ADP.StrEmpty)) { stateObj.WriteByte(1); if (sqlParameter.XmlSchemaCollectionDatabase != null && sqlParameter.XmlSchemaCollectionDatabase != ADP.StrEmpty) { int length = sqlParameter.XmlSchemaCollectionDatabase.Length; stateObj.WriteByte((byte)length); WriteString(sqlParameter.XmlSchemaCollectionDatabase, length, 0, stateObj); } else { stateObj.WriteByte(0); } if (sqlParameter.XmlSchemaCollectionOwningSchema != null && sqlParameter.XmlSchemaCollectionOwningSchema != ADP.StrEmpty) { int length = sqlParameter.XmlSchemaCollectionOwningSchema.Length; stateObj.WriteByte((byte)length); WriteString(sqlParameter.XmlSchemaCollectionOwningSchema, length, 0, stateObj); } else { stateObj.WriteByte(0); } if (sqlParameter.XmlSchemaCollectionName != null && sqlParameter.XmlSchemaCollectionName != ADP.StrEmpty) { int length = sqlParameter.XmlSchemaCollectionName.Length; WriteShort((short)length, stateObj); WriteString(sqlParameter.XmlSchemaCollectionName, length, 0, stateObj); } else { WriteShort(0, stateObj); } } else { stateObj.WriteByte(0); } } else if (internalMetaType.IsCharType) { SqlCollation sqlCollation = ((sqlParameter.Collation != null) ? sqlParameter.Collation : _defaultCollation); WriteUnsignedInt(sqlCollation.info, stateObj); stateObj.WriteByte(sqlCollation.sortId); } if (num3 == 0) { WriteParameterVarLen(internalMetaType, num2, flag3, stateObj, flag5); } else { WriteParameterVarLen(internalMetaType, num3, flag3, stateObj, flag5); } Task task = null; if (!flag3) { task = ((!flag4) ? WriteValue(obj, internalMetaType, sqlParameter.GetActualScale(), num2, num3, sqlParameter.Offset, stateObj, sqlParameter.Size, flag5) : WriteSqlValue(obj, internalMetaType, num2, num3, sqlParameter.Offset, stateObj)); } if (sync) { continue; } if (task == null) { task = stateObj.WaitForAccumulatedWrites(); } if (task == null) { continue; } Task task2 = null; if (completion == null) { completion = new TaskCompletionSource(); task2 = completion.Task; } AsyncHelper.ContinueTask(task, completion, delegate { TdsExecuteRPC(rpcArray, timeout, inSchema, notificationRequest, stateObj, isCommandProc, sync, completion, ii, i + 1); }, _connHandler, delegate(Exception exc) { TdsExecuteRPC_OnFailure(exc, stateObj); }); if (flag2) { task2.ContinueWith(delegate { _connHandler._parserLock.Release(); }, TaskScheduler.Default); flag2 = false; } return task2; } if (ii < rpcArray.Length - 1) { stateObj.WriteByte(byte.MaxValue); } } Task task3 = stateObj.ExecuteFlush(); if (task3 != null) { Task result = null; if (completion == null) { completion = new TaskCompletionSource(); result = completion.Task; } bool taskReleaseConnectionLock = flag2; task3.ContinueWith(delegate(Task tsk) { ExecuteFlushTaskCallback(tsk, stateObj, completion, taskReleaseConnectionLock); }, TaskScheduler.Default); flag2 = false; return result; } } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } FailureCleanup(stateObj, e); throw; } FinalizeExecuteRPC(stateObj); if (completion != null) { completion.SetResult(null); } return null; } catch (Exception exception) { FinalizeExecuteRPC(stateObj); if (completion != null) { completion.SetException(exception); return null; } throw; } finally { if (flag2) { _connHandler._parserLock.Release(); } } } private void FinalizeExecuteRPC(TdsParserStateObject stateObj) { stateObj.SniContext = SniContext.Snix_Read; _asyncWrite = false; } private void TdsExecuteRPC_OnFailure(Exception exc, TdsParserStateObject stateObj) { FailureCleanup(stateObj, exc); } private void ExecuteFlushTaskCallback(Task tsk, TdsParserStateObject stateObj, TaskCompletionSource completion, bool releaseConnectionLock) { try { FinalizeExecuteRPC(stateObj); if (tsk.Exception != null) { Exception exception = tsk.Exception.InnerException; try { FailureCleanup(stateObj, tsk.Exception); } catch (Exception ex) { exception = ex; } completion.SetException(exception); } else { completion.SetResult(null); } } finally { if (releaseConnectionLock) { _connHandler._parserLock.Release(); } } } private void WriteParameterName(string parameterName, TdsParserStateObject stateObj) { if (!string.IsNullOrEmpty(parameterName)) { int num = parameterName.Length & 0xFF; stateObj.WriteByte((byte)num); WriteString(parameterName, num, 0, stateObj); } else { stateObj.WriteByte(0); } } private void WriteSmiParameter(SqlParameter param, int paramIndex, bool sendDefault, TdsParserStateObject stateObj) { ParameterPeekAheadValue peekAhead; SmiParameterMetaData smiParameterMetaData = param.MetaDataForSmi(out peekAhead); if (!_isKatmai) { throw ADP.VersionDoesNotSupportDataType(MetaType.GetMetaTypeFromSqlDbType(smiParameterMetaData.SqlDbType, smiParameterMetaData.IsMultiValued).TypeName); } object value; ExtendedClrTypeCode typeCode; if (sendDefault) { if (SqlDbType.Structured == smiParameterMetaData.SqlDbType && smiParameterMetaData.IsMultiValued) { value = s_tvpEmptyValue; typeCode = ExtendedClrTypeCode.IEnumerableOfSqlDataRecord; } else { value = null; typeCode = ExtendedClrTypeCode.DBNull; } } else if (param.Direction == ParameterDirection.Output) { bool parameterIsSqlType = param.ParameterIsSqlType; param.Value = null; value = null; typeCode = ExtendedClrTypeCode.DBNull; param.ParameterIsSqlType = parameterIsSqlType; } else { value = param.GetCoercedValue(); typeCode = MetaDataUtilsSmi.DetermineExtendedTypeCodeForUseWithSqlDbType(smiParameterMetaData.SqlDbType, smiParameterMetaData.IsMultiValued, value); } WriteSmiParameterMetaData(smiParameterMetaData, sendDefault, stateObj); TdsParameterSetter setters = new TdsParameterSetter(stateObj, smiParameterMetaData); ValueUtilsSmi.SetCompatibleValueV200(new SmiEventSink_Default(), setters, 0, smiParameterMetaData, value, typeCode, param.Offset, (0 < param.Size) ? param.Size : (-1), peekAhead); } private void WriteSmiParameterMetaData(SmiParameterMetaData metaData, bool sendDefault, TdsParserStateObject stateObj) { byte b = 0; if (ParameterDirection.Output == metaData.Direction || ParameterDirection.InputOutput == metaData.Direction) { b = (byte)(b | 1u); } if (sendDefault) { b = (byte)(b | 2u); } WriteParameterName(metaData.Name, stateObj); stateObj.WriteByte(b); WriteSmiTypeInfo(metaData, stateObj); } private void WriteSmiTypeInfo(SmiExtendedMetaData metaData, TdsParserStateObject stateObj) { checked { switch (metaData.SqlDbType) { case SqlDbType.BigInt: stateObj.WriteByte(38); stateObj.WriteByte((byte)metaData.MaxLength); break; case SqlDbType.Binary: stateObj.WriteByte(173); WriteUnsignedShort((ushort)metaData.MaxLength, stateObj); break; case SqlDbType.Bit: stateObj.WriteByte(104); stateObj.WriteByte((byte)metaData.MaxLength); break; case SqlDbType.Char: stateObj.WriteByte(175); WriteUnsignedShort((ushort)metaData.MaxLength, stateObj); WriteUnsignedInt(_defaultCollation.info, stateObj); stateObj.WriteByte(_defaultCollation.sortId); break; case SqlDbType.DateTime: stateObj.WriteByte(111); stateObj.WriteByte((byte)metaData.MaxLength); break; case SqlDbType.Decimal: stateObj.WriteByte(108); stateObj.WriteByte((byte)MetaType.MetaDecimal.FixedLength); stateObj.WriteByte(unchecked((byte)((metaData.Precision == 0) ? 1 : metaData.Precision))); stateObj.WriteByte(metaData.Scale); break; case SqlDbType.Float: stateObj.WriteByte(109); stateObj.WriteByte((byte)metaData.MaxLength); break; case SqlDbType.Image: stateObj.WriteByte(165); WriteUnsignedShort(ushort.MaxValue, stateObj); break; case SqlDbType.Int: stateObj.WriteByte(38); stateObj.WriteByte((byte)metaData.MaxLength); break; case SqlDbType.Money: stateObj.WriteByte(110); stateObj.WriteByte((byte)metaData.MaxLength); break; case SqlDbType.NChar: stateObj.WriteByte(239); WriteUnsignedShort((ushort)(metaData.MaxLength * 2), stateObj); WriteUnsignedInt(_defaultCollation.info, stateObj); stateObj.WriteByte(_defaultCollation.sortId); break; case SqlDbType.NText: stateObj.WriteByte(231); WriteUnsignedShort(ushort.MaxValue, stateObj); WriteUnsignedInt(_defaultCollation.info, stateObj); stateObj.WriteByte(_defaultCollation.sortId); break; case SqlDbType.NVarChar: stateObj.WriteByte(231); if (-1 == metaData.MaxLength) { WriteUnsignedShort(ushort.MaxValue, stateObj); } else { WriteUnsignedShort((ushort)(metaData.MaxLength * 2), stateObj); } WriteUnsignedInt(_defaultCollation.info, stateObj); stateObj.WriteByte(_defaultCollation.sortId); break; case SqlDbType.Real: stateObj.WriteByte(109); stateObj.WriteByte((byte)metaData.MaxLength); break; case SqlDbType.UniqueIdentifier: stateObj.WriteByte(36); stateObj.WriteByte((byte)metaData.MaxLength); break; case SqlDbType.SmallDateTime: stateObj.WriteByte(111); stateObj.WriteByte((byte)metaData.MaxLength); break; case SqlDbType.SmallInt: stateObj.WriteByte(38); stateObj.WriteByte((byte)metaData.MaxLength); break; case SqlDbType.SmallMoney: stateObj.WriteByte(110); stateObj.WriteByte((byte)metaData.MaxLength); break; case SqlDbType.Text: stateObj.WriteByte(167); WriteUnsignedShort(ushort.MaxValue, stateObj); WriteUnsignedInt(_defaultCollation.info, stateObj); stateObj.WriteByte(_defaultCollation.sortId); break; case SqlDbType.Timestamp: stateObj.WriteByte(173); WriteShort((int)metaData.MaxLength, stateObj); break; case SqlDbType.TinyInt: stateObj.WriteByte(38); stateObj.WriteByte((byte)metaData.MaxLength); break; case SqlDbType.VarBinary: stateObj.WriteByte(165); WriteUnsignedShort(unchecked((ushort)metaData.MaxLength), stateObj); break; case SqlDbType.VarChar: stateObj.WriteByte(167); WriteUnsignedShort(unchecked((ushort)metaData.MaxLength), stateObj); WriteUnsignedInt(_defaultCollation.info, stateObj); stateObj.WriteByte(_defaultCollation.sortId); break; case SqlDbType.Variant: stateObj.WriteByte(98); WriteInt((int)metaData.MaxLength, stateObj); break; case SqlDbType.Xml: stateObj.WriteByte(241); if (string.IsNullOrEmpty(metaData.TypeSpecificNamePart1) && string.IsNullOrEmpty(metaData.TypeSpecificNamePart2) && string.IsNullOrEmpty(metaData.TypeSpecificNamePart3)) { stateObj.WriteByte(0); break; } stateObj.WriteByte(1); WriteIdentifier(metaData.TypeSpecificNamePart1, stateObj); WriteIdentifier(metaData.TypeSpecificNamePart2, stateObj); WriteIdentifierWithShortLength(metaData.TypeSpecificNamePart3, stateObj); break; case SqlDbType.Udt: stateObj.WriteByte(240); WriteIdentifier(metaData.TypeSpecificNamePart1, stateObj); WriteIdentifier(metaData.TypeSpecificNamePart2, stateObj); WriteIdentifier(metaData.TypeSpecificNamePart3, stateObj); break; case SqlDbType.Structured: if (metaData.IsMultiValued) { WriteTvpTypeInfo(metaData, stateObj); } break; case SqlDbType.Date: stateObj.WriteByte(40); break; case SqlDbType.Time: stateObj.WriteByte(41); stateObj.WriteByte(metaData.Scale); break; case SqlDbType.DateTime2: stateObj.WriteByte(42); stateObj.WriteByte(metaData.Scale); break; case SqlDbType.DateTimeOffset: stateObj.WriteByte(43); stateObj.WriteByte(metaData.Scale); break; case (SqlDbType)24: case (SqlDbType)26: case (SqlDbType)27: case (SqlDbType)28: break; } } } private void WriteTvpTypeInfo(SmiExtendedMetaData metaData, TdsParserStateObject stateObj) { stateObj.WriteByte(243); WriteIdentifier(metaData.TypeSpecificNamePart1, stateObj); WriteIdentifier(metaData.TypeSpecificNamePart2, stateObj); WriteIdentifier(metaData.TypeSpecificNamePart3, stateObj); if (metaData.FieldMetaData.Count == 0) { WriteUnsignedShort(ushort.MaxValue, stateObj); } else { WriteUnsignedShort(checked((ushort)metaData.FieldMetaData.Count), stateObj); SmiDefaultFieldsProperty smiDefaultFieldsProperty = (SmiDefaultFieldsProperty)metaData.ExtendedProperties[SmiPropertySelector.DefaultFields]; for (int i = 0; i < metaData.FieldMetaData.Count; i++) { WriteTvpColumnMetaData(metaData.FieldMetaData[i], smiDefaultFieldsProperty[i], stateObj); } WriteTvpOrderUnique(metaData, stateObj); } stateObj.WriteByte(0); } private void WriteTvpColumnMetaData(SmiExtendedMetaData md, bool isDefault, TdsParserStateObject stateObj) { if (SqlDbType.Timestamp == md.SqlDbType) { WriteUnsignedInt(80u, stateObj); } else { WriteUnsignedInt(0u, stateObj); } ushort num = 1; if (isDefault) { num = (ushort)(num | 0x200u); } WriteUnsignedShort(num, stateObj); WriteSmiTypeInfo(md, stateObj); WriteIdentifier(null, stateObj); } private void WriteTvpOrderUnique(SmiExtendedMetaData metaData, TdsParserStateObject stateObj) { SmiOrderProperty smiOrderProperty = (SmiOrderProperty)metaData.ExtendedProperties[SmiPropertySelector.SortOrder]; SmiUniqueKeyProperty smiUniqueKeyProperty = (SmiUniqueKeyProperty)metaData.ExtendedProperties[SmiPropertySelector.UniqueKey]; List list = new List(metaData.FieldMetaData.Count); for (int i = 0; i < metaData.FieldMetaData.Count; i++) { byte b = 0; SmiOrderProperty.SmiColumnOrder smiColumnOrder = smiOrderProperty[i]; if (smiColumnOrder.Order == SortOrder.Ascending) { b = 1; } else if (SortOrder.Descending == smiColumnOrder.Order) { b = 2; } if (smiUniqueKeyProperty[i]) { b = (byte)(b | 4u); } if (b != 0) { list.Add(new TdsOrderUnique(checked((short)(i + 1)), b)); } } if (0 >= list.Count) { return; } stateObj.WriteByte(16); WriteShort(list.Count, stateObj); foreach (TdsOrderUnique item in list) { WriteShort(item.ColumnOrdinal, stateObj); stateObj.WriteByte(item.Flags); } } internal Task WriteBulkCopyDone(TdsParserStateObject stateObj) { if (State != TdsParserState.OpenNotLoggedIn && State != TdsParserState.OpenLoggedIn) { throw ADP.ClosedConnectionError(); } stateObj.WriteByte(253); WriteShort(0, stateObj); WriteShort(0, stateObj); WriteInt(0, stateObj); stateObj._pendingData = true; stateObj._messageStatus = 0; return stateObj.WritePacket(1); } internal void WriteBulkCopyMetaData(_SqlMetaDataSet metadataCollection, int count, TdsParserStateObject stateObj) { if (State != TdsParserState.OpenNotLoggedIn && State != TdsParserState.OpenLoggedIn) { throw ADP.ClosedConnectionError(); } stateObj.WriteByte(129); WriteShort(count, stateObj); for (int i = 0; i < metadataCollection.Length; i++) { if (metadataCollection[i] == null) { continue; } _SqlMetaData sqlMetaData = metadataCollection[i]; WriteInt(0, stateObj); ushort num = (ushort)(sqlMetaData.updatability << 2); num = (ushort)(num | (sqlMetaData.isNullable ? 1u : 0u)); num = (ushort)(num | (sqlMetaData.isIdentity ? 16u : 0u)); WriteShort(num, stateObj); switch (sqlMetaData.type) { case SqlDbType.Decimal: stateObj.WriteByte(sqlMetaData.tdsType); WriteTokenLength(sqlMetaData.tdsType, sqlMetaData.length, stateObj); stateObj.WriteByte(sqlMetaData.precision); stateObj.WriteByte(sqlMetaData.scale); break; case SqlDbType.Xml: stateObj.WriteByteArray(s_xmlMetadataSubstituteSequence, s_xmlMetadataSubstituteSequence.Length, 0); break; case SqlDbType.Udt: throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString()); case SqlDbType.Date: stateObj.WriteByte(sqlMetaData.tdsType); break; case SqlDbType.Time: case SqlDbType.DateTime2: case SqlDbType.DateTimeOffset: stateObj.WriteByte(sqlMetaData.tdsType); stateObj.WriteByte(sqlMetaData.scale); break; default: stateObj.WriteByte(sqlMetaData.tdsType); WriteTokenLength(sqlMetaData.tdsType, sqlMetaData.length, stateObj); if (sqlMetaData.metaType.IsCharType) { WriteUnsignedInt(sqlMetaData.collation.info, stateObj); stateObj.WriteByte(sqlMetaData.collation.sortId); } break; } if (sqlMetaData.metaType.IsLong && !sqlMetaData.metaType.IsPlp) { WriteShort(sqlMetaData.tableName.Length, stateObj); WriteString(sqlMetaData.tableName, stateObj); } stateObj.WriteByte((byte)sqlMetaData.column.Length); WriteString(sqlMetaData.column, stateObj); } } internal Task WriteBulkCopyValue(object value, SqlMetaDataPriv metadata, TdsParserStateObject stateObj, bool isSqlType, bool isDataFeed, bool isNull) { Encoding defaultEncoding = _defaultEncoding; SqlCollation defaultCollation = _defaultCollation; int defaultCodePage = _defaultCodePage; int defaultLCID = _defaultLCID; Task result = null; Task task = null; if (State != TdsParserState.OpenNotLoggedIn && State != TdsParserState.OpenLoggedIn) { throw ADP.ClosedConnectionError(); } try { if (metadata.encoding != null) { _defaultEncoding = metadata.encoding; } if (metadata.collation != null) { _defaultCollation = metadata.collation; _defaultLCID = _defaultCollation.LCID; } _defaultCodePage = metadata.codePage; MetaType metaType = metadata.metaType; int num = 0; int num2 = 0; if (isNull) { if (metaType.IsPlp && (metaType.NullableType != 240 || metaType.IsLong)) { WriteLong(-1L, stateObj); } else if (!metaType.IsFixed && !metaType.IsLong && !metaType.IsVarTime) { WriteShort(65535, stateObj); } else { stateObj.WriteByte(0); } return result; } if (!isDataFeed) { switch (metaType.NullableType) { case 34: case 165: case 173: case 240: num = (isSqlType ? ((SqlBinary)value).Length : ((byte[])value).Length); break; case 36: num = 16; break; case 35: case 167: case 175: { if (_defaultEncoding == null) { ThrowUnsupportedCollationEncountered(null); } string text = null; text = ((!isSqlType) ? ((string)value) : ((SqlString)value).Value); num = text.Length; num2 = _defaultEncoding.GetByteCount(text); break; } case 99: case 231: case 239: num = (isSqlType ? ((SqlString)value).Value.Length : ((string)value).Length) * 2; break; case 241: if (value is XmlReader) { value = MetaType.GetStringFromXml((XmlReader)value); } num = (isSqlType ? ((SqlString)value).Value.Length : ((string)value).Length) * 2; break; default: num = metadata.length; break; } } if (metaType.IsLong) { switch (metaType.SqlDbType) { case SqlDbType.Image: case SqlDbType.NText: case SqlDbType.Text: stateObj.WriteByteArray(s_longDataHeader, s_longDataHeader.Length, 0); WriteTokenLength(metadata.tdsType, (num2 == 0) ? num : num2, stateObj); break; case SqlDbType.NVarChar: case SqlDbType.VarBinary: case SqlDbType.VarChar: case SqlDbType.Xml: case SqlDbType.Udt: WriteUnsignedLong(18446744073709551614uL, stateObj); break; } } else { WriteTokenLength(metadata.tdsType, (num2 == 0) ? num : num2, stateObj); } if (isSqlType) { task = WriteSqlValue(value, metaType, num, num2, 0, stateObj); } else if (metaType.SqlDbType != SqlDbType.Udt || metaType.IsLong) { task = WriteValue(value, metaType, metadata.scale, num, num2, 0, stateObj, metadata.length, isDataFeed); if (task == null && _asyncWrite) { task = stateObj.WaitForAccumulatedWrites(); } } else { WriteShort(num, stateObj); task = stateObj.WriteByteArray((byte[])value, num, 0); } if (task != null) { result = WriteBulkCopyValueSetupContinuation(task, defaultEncoding, defaultCollation, defaultCodePage, defaultLCID); } } finally { if (task == null) { _defaultEncoding = defaultEncoding; _defaultCollation = defaultCollation; _defaultCodePage = defaultCodePage; _defaultLCID = defaultLCID; } } return result; } private Task WriteBulkCopyValueSetupContinuation(Task internalWriteTask, Encoding saveEncoding, SqlCollation saveCollation, int saveCodePage, int saveLCID) { return internalWriteTask.ContinueWith(delegate(Task t) { _defaultEncoding = saveEncoding; _defaultCollation = saveCollation; _defaultCodePage = saveCodePage; _defaultLCID = saveLCID; return t; }, TaskScheduler.Default).Unwrap(); } private void WriteMarsHeaderData(TdsParserStateObject stateObj, SqlInternalTransaction transaction) { WriteShort(2, stateObj); if (transaction != null && transaction.TransactionId != 0L) { WriteLong(transaction.TransactionId, stateObj); WriteInt(stateObj.IncrementAndObtainOpenResultCount(transaction), stateObj); } else { WriteLong(0L, stateObj); WriteInt(stateObj.IncrementAndObtainOpenResultCount(null), stateObj); } } private int GetNotificationHeaderSize(SqlNotificationRequest notificationRequest) { if (notificationRequest != null) { string userData = notificationRequest.UserData; string options = notificationRequest.Options; int timeout = notificationRequest.Timeout; if (userData == null) { throw ADP.ArgumentNull("callbackId"); } if (65535 < userData.Length) { throw ADP.ArgumentOutOfRange("callbackId"); } if (options == null) { throw ADP.ArgumentNull("service"); } if (65535 < options.Length) { throw ADP.ArgumentOutOfRange("service"); } if (-1 > timeout) { throw ADP.ArgumentOutOfRange("timeout"); } int num = 8 + userData.Length * 2 + 2 + options.Length * 2; if (timeout > 0) { num += 4; } return num; } return 0; } private void WriteQueryNotificationHeaderData(SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj) { string userData = notificationRequest.UserData; string options = notificationRequest.Options; int timeout = notificationRequest.Timeout; WriteShort(1, stateObj); WriteShort(userData.Length * 2, stateObj); WriteString(userData, stateObj); WriteShort(options.Length * 2, stateObj); WriteString(options, stateObj); if (timeout > 0) { WriteInt(timeout, stateObj); } } private void WriteRPCBatchHeaders(TdsParserStateObject stateObj, SqlNotificationRequest notificationRequest) { int notificationHeaderSize = GetNotificationHeaderSize(notificationRequest); int v = 22 + notificationHeaderSize; WriteInt(v, stateObj); WriteInt(18, stateObj); WriteMarsHeaderData(stateObj, CurrentTransaction); if (notificationHeaderSize != 0) { WriteInt(notificationHeaderSize, stateObj); WriteQueryNotificationHeaderData(notificationRequest, stateObj); } } private void WriteTokenLength(byte token, int length, TdsParserStateObject stateObj) { int num = 0; if (240 == token) { num = 8; } else if (token == 241) { num = 8; } if (num == 0) { switch (token & 0x30) { case 48: num = 0; break; case 16: num = 0; break; case 0: case 32: num = (((token & 0x80) == 0) ? (((token & 0xCu) != 0) ? 1 : 4) : 2); break; } switch (num) { case 1: stateObj.WriteByte((byte)length); break; case 2: WriteShort(length, stateObj); break; case 4: WriteInt(length, stateObj); break; case 8: WriteShort(65535, stateObj); break; } } } private bool IsBOMNeeded(MetaType type, object value) { if (type.NullableType == 241) { Type type2 = value.GetType(); if (type2 == typeof(SqlString)) { if (!((SqlString)value).IsNull && ((SqlString)value).Value.Length > 0 && (((SqlString)value).Value[0] & 0xFF) != 255) { return true; } } else if (type2 == typeof(string) && ((string)value).Length > 0) { if (value != null && (((string)value)[0] & 0xFF) != 255) { return true; } } else if (type2 == typeof(SqlXml)) { if (!((SqlXml)value).IsNull) { return true; } } else if (type2 == typeof(XmlDataFeed)) { return true; } } return false; } private Task GetTerminationTask(Task unterminatedWriteTask, object value, MetaType type, int actualLength, TdsParserStateObject stateObj, bool isDataFeed) { if (type.IsPlp && (actualLength > 0 || isDataFeed)) { if (unterminatedWriteTask == null) { WriteInt(0, stateObj); return null; } return AsyncHelper.CreateContinuationTask(unterminatedWriteTask, WriteInt, 0, stateObj, _connHandler); } return unterminatedWriteTask; } private Task WriteSqlValue(object value, MetaType type, int actualLength, int codePageByteSize, int offset, TdsParserStateObject stateObj) { return GetTerminationTask(WriteUnterminatedSqlValue(value, type, actualLength, codePageByteSize, offset, stateObj), value, type, actualLength, stateObj, isDataFeed: false); } private Task WriteUnterminatedSqlValue(object value, MetaType type, int actualLength, int codePageByteSize, int offset, TdsParserStateObject stateObj) { switch (type.NullableType) { case 109: if (type.FixedLength == 4) { WriteFloat(((SqlSingle)value).Value, stateObj); } else { WriteDouble(((SqlDouble)value).Value, stateObj); } break; case 34: case 165: case 173: if (type.IsPlp) { WriteInt(actualLength, stateObj); } if (value is SqlBinary) { return stateObj.WriteByteArray(((SqlBinary)value).Value, actualLength, offset, canAccumulate: false); } return stateObj.WriteByteArray(((SqlBytes)value).Value, actualLength, offset, canAccumulate: false); case 36: { byte[] b = ((SqlGuid)value).ToByteArray(); stateObj.WriteByteArray(b, actualLength, 0); break; } case 104: if (((SqlBoolean)value).Value) { stateObj.WriteByte(1); } else { stateObj.WriteByte(0); } break; case 38: if (type.FixedLength == 1) { stateObj.WriteByte(((SqlByte)value).Value); } else if (type.FixedLength == 2) { WriteShort(((SqlInt16)value).Value, stateObj); } else if (type.FixedLength == 4) { WriteInt(((SqlInt32)value).Value, stateObj); } else { WriteLong(((SqlInt64)value).Value, stateObj); } break; case 35: case 167: case 175: if (type.IsPlp) { WriteInt(codePageByteSize, stateObj); } if (value is SqlChars) { string s = new string(((SqlChars)value).Value); return WriteEncodingChar(s, actualLength, offset, _defaultEncoding, stateObj, canAccumulate: false); } return WriteEncodingChar(((SqlString)value).Value, actualLength, offset, _defaultEncoding, stateObj, canAccumulate: false); case 99: case 231: case 239: case 241: if (type.IsPlp) { if (IsBOMNeeded(type, value)) { WriteInt(actualLength + 2, stateObj); WriteShort(65279, stateObj); } else { WriteInt(actualLength, stateObj); } } if (actualLength != 0) { actualLength >>= 1; } if (value is SqlChars) { return WriteCharArray(((SqlChars)value).Value, actualLength, offset, stateObj, canAccumulate: false); } return WriteString(((SqlString)value).Value, actualLength, offset, stateObj, canAccumulate: false); case 108: WriteSqlDecimal((SqlDecimal)value, stateObj); break; case 111: { SqlDateTime sqlDateTime = (SqlDateTime)value; if (type.FixedLength == 4) { if (0 > sqlDateTime.DayTicks || sqlDateTime.DayTicks > 65535) { throw SQL.SmallDateTimeOverflow(sqlDateTime.ToString()); } WriteShort(sqlDateTime.DayTicks, stateObj); WriteShort(sqlDateTime.TimeTicks / SqlDateTime.SQLTicksPerMinute, stateObj); } else { WriteInt(sqlDateTime.DayTicks, stateObj); WriteInt(sqlDateTime.TimeTicks, stateObj); } break; } case 110: WriteSqlMoney((SqlMoney)value, type.FixedLength, stateObj); break; case 240: throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString()); } return null; } private async Task WriteXmlFeed(XmlDataFeed feed, TdsParserStateObject stateObj, bool needBom, Encoding encoding, int size) { byte[] preambleToStrip = null; if (!needBom) { preambleToStrip = encoding.GetPreamble(); } ConstrainedTextWriter writer = new ConstrainedTextWriter(new StreamWriter(new TdsOutputStream(this, stateObj, preambleToStrip), encoding), size); XmlWriterSettings xmlWriterSettings = new XmlWriterSettings(); xmlWriterSettings.CloseOutput = false; xmlWriterSettings.ConformanceLevel = ConformanceLevel.Fragment; if (_asyncWrite) { xmlWriterSettings.Async = true; } XmlWriter ww = XmlWriter.Create(writer, xmlWriterSettings); if (feed._source.ReadState == ReadState.Initial) { feed._source.Read(); } while (!feed._source.EOF && !writer.IsComplete) { if (feed._source.NodeType == XmlNodeType.XmlDeclaration) { feed._source.Read(); } else if (_asyncWrite) { await ww.WriteNodeAsync(feed._source, defattr: true).ConfigureAwait(continueOnCapturedContext: false); } else { ww.WriteNode(feed._source, defattr: true); } } if (_asyncWrite) { await ww.FlushAsync().ConfigureAwait(continueOnCapturedContext: false); } else { ww.Flush(); } } private async Task WriteTextFeed(TextDataFeed feed, Encoding encoding, bool needBom, TdsParserStateObject stateObj, int size) { char[] inBuff = new char[4096]; encoding = encoding ?? new UnicodeEncoding(bigEndian: false, byteOrderMark: false); ConstrainedTextWriter writer = new ConstrainedTextWriter(new StreamWriter(new TdsOutputStream(this, stateObj, null), encoding), size); if (needBom) { if (_asyncWrite) { await writer.WriteAsync('\ufeff').ConfigureAwait(continueOnCapturedContext: false); } else { writer.Write('\ufeff'); } } int nWritten = 0; do { int nRead = ((!_asyncWrite) ? feed._source.ReadBlock(inBuff, 0, 4096) : (await feed._source.ReadBlockAsync(inBuff, 0, 4096).ConfigureAwait(continueOnCapturedContext: false))); if (nRead == 0) { break; } if (_asyncWrite) { await writer.WriteAsync(inBuff, 0, nRead).ConfigureAwait(continueOnCapturedContext: false); } else { writer.Write(inBuff, 0, nRead); } nWritten += nRead; } while (!writer.IsComplete); if (_asyncWrite) { await writer.FlushAsync().ConfigureAwait(continueOnCapturedContext: false); } else { writer.Flush(); } } private async Task WriteStreamFeed(StreamDataFeed feed, TdsParserStateObject stateObj, int len) { TdsOutputStream output = new TdsOutputStream(this, stateObj, null); byte[] buff = new byte[4096]; int nWritten = 0; do { int readSize = 4096; if (len > 0 && nWritten + readSize > len) { readSize = len - nWritten; } int nRead = ((!_asyncWrite) ? feed._source.Read(buff, 0, readSize) : (await feed._source.ReadAsync(buff, 0, readSize).ConfigureAwait(continueOnCapturedContext: false))); if (nRead == 0) { break; } if (_asyncWrite) { await output.WriteAsync(buff, 0, nRead).ConfigureAwait(continueOnCapturedContext: false); } else { output.Write(buff, 0, nRead); } nWritten += nRead; } while (len <= 0 || nWritten < len); } private Task NullIfCompletedWriteTask(Task task) { if (task == null) { return null; } return task.Status switch { TaskStatus.RanToCompletion => null, TaskStatus.Faulted => throw task.Exception.InnerException, TaskStatus.Canceled => throw SQL.OperationCancelled(), _ => task, }; } private Task WriteValue(object value, MetaType type, byte scale, int actualLength, int encodingByteSize, int offset, TdsParserStateObject stateObj, int paramSize, bool isDataFeed) { return GetTerminationTask(WriteUnterminatedValue(value, type, scale, actualLength, encodingByteSize, offset, stateObj, paramSize, isDataFeed), value, type, actualLength, stateObj, isDataFeed); } private Task WriteUnterminatedValue(object value, MetaType type, byte scale, int actualLength, int encodingByteSize, int offset, TdsParserStateObject stateObj, int paramSize, bool isDataFeed) { switch (type.NullableType) { case 109: if (type.FixedLength == 4) { WriteFloat((float)value, stateObj); } else { WriteDouble((double)value, stateObj); } break; case 34: case 165: case 173: case 240: if (isDataFeed) { return NullIfCompletedWriteTask(WriteStreamFeed((StreamDataFeed)value, stateObj, paramSize)); } if (type.IsPlp) { WriteInt(actualLength, stateObj); } return stateObj.WriteByteArray((byte[])value, actualLength, offset, canAccumulate: false); case 36: { byte[] b = ((Guid)value).ToByteArray(); stateObj.WriteByteArray(b, actualLength, 0); break; } case 104: if ((bool)value) { stateObj.WriteByte(1); } else { stateObj.WriteByte(0); } break; case 38: if (type.FixedLength == 1) { stateObj.WriteByte((byte)value); } else if (type.FixedLength == 2) { WriteShort((short)value, stateObj); } else if (type.FixedLength == 4) { WriteInt((int)value, stateObj); } else { WriteLong((long)value, stateObj); } break; case 35: case 167: case 175: if (isDataFeed) { if (!(value is TextDataFeed feed2)) { return NullIfCompletedWriteTask(WriteXmlFeed((XmlDataFeed)value, stateObj, needBom: true, _defaultEncoding, paramSize)); } return NullIfCompletedWriteTask(WriteTextFeed(feed2, _defaultEncoding, needBom: false, stateObj, paramSize)); } if (type.IsPlp) { WriteInt(encodingByteSize, stateObj); } if (value is byte[]) { return stateObj.WriteByteArray((byte[])value, actualLength, 0, canAccumulate: false); } return WriteEncodingChar((string)value, actualLength, offset, _defaultEncoding, stateObj, canAccumulate: false); case 99: case 231: case 239: case 241: if (isDataFeed) { if (!(value is TextDataFeed feed)) { return NullIfCompletedWriteTask(WriteXmlFeed((XmlDataFeed)value, stateObj, IsBOMNeeded(type, value), Encoding.Unicode, paramSize)); } return NullIfCompletedWriteTask(WriteTextFeed(feed, null, IsBOMNeeded(type, value), stateObj, paramSize)); } if (type.IsPlp) { if (IsBOMNeeded(type, value)) { WriteInt(actualLength + 2, stateObj); WriteShort(65279, stateObj); } else { WriteInt(actualLength, stateObj); } } if (value is byte[]) { return stateObj.WriteByteArray((byte[])value, actualLength, 0, canAccumulate: false); } actualLength >>= 1; return WriteString((string)value, actualLength, offset, stateObj, canAccumulate: false); case 108: WriteDecimal((decimal)value, stateObj); break; case 111: { TdsDateTime tdsDateTime = MetaType.FromDateTime((DateTime)value, (byte)type.FixedLength); if (type.FixedLength == 4) { if (0 > tdsDateTime.days || tdsDateTime.days > 65535) { throw SQL.SmallDateTimeOverflow(MetaType.ToDateTime(tdsDateTime.days, tdsDateTime.time, 4).ToString(CultureInfo.InvariantCulture)); } WriteShort(tdsDateTime.days, stateObj); WriteShort(tdsDateTime.time, stateObj); } else { WriteInt(tdsDateTime.days, stateObj); WriteInt(tdsDateTime.time, stateObj); } break; } case 110: WriteCurrency((decimal)value, type.FixedLength, stateObj); break; case 40: WriteDate((DateTime)value, stateObj); break; case 41: if (scale > 7) { throw SQL.TimeScaleValueOutOfRange(scale); } WriteTime((TimeSpan)value, scale, actualLength, stateObj); break; case 42: if (scale > 7) { throw SQL.TimeScaleValueOutOfRange(scale); } WriteDateTime2((DateTime)value, scale, actualLength, stateObj); break; case 43: WriteDateTimeOffset((DateTimeOffset)value, scale, actualLength, stateObj); break; } return null; } internal void WriteParameterVarLen(MetaType type, int size, bool isNull, TdsParserStateObject stateObj, bool unknownLength = false) { if (type.IsLong) { if (isNull) { if (type.IsPlp) { WriteLong(-1L, stateObj); } else { WriteInt(-1, stateObj); } } else if (type.NullableType == 241 || unknownLength) { WriteUnsignedLong(18446744073709551614uL, stateObj); } else if (type.IsPlp) { WriteLong(size, stateObj); } else { WriteInt(size, stateObj); } } else if (type.IsVarTime) { if (isNull) { stateObj.WriteByte(0); } else { stateObj.WriteByte((byte)size); } } else if (!type.IsFixed) { if (isNull) { WriteShort(65535, stateObj); } else { WriteShort(size, stateObj); } } else if (isNull) { stateObj.WriteByte(0); } else { stateObj.WriteByte((byte)((uint)type.FixedLength & 0xFFu)); } } private bool TryReadPlpUnicodeCharsChunk(char[] buff, int offst, int len, TdsParserStateObject stateObj, out int charsRead) { if (stateObj._longlenleft == 0L) { charsRead = 0; return true; } charsRead = len; if (stateObj._longlenleft >> 1 < (ulong)len) { charsRead = (int)(stateObj._longlenleft >> 1); } for (int i = 0; i < charsRead; i++) { if (!stateObj.TryReadChar(out buff[offst + i])) { return false; } } stateObj._longlenleft -= (ulong)((long)charsRead << 1); return true; } internal int ReadPlpUnicodeChars(ref char[] buff, int offst, int len, TdsParserStateObject stateObj) { if (!TryReadPlpUnicodeChars(ref buff, offst, len, stateObj, out var totalCharsRead)) { throw SQL.SynchronousCallMayNotPend(); } return totalCharsRead; } internal bool TryReadPlpUnicodeChars(ref char[] buff, int offst, int len, TdsParserStateObject stateObj, out int totalCharsRead) { int num = 0; int num2 = 0; if (stateObj._longlen == 0L) { totalCharsRead = 0; return true; } num2 = len; if (buff == null && stateObj._longlen != 18446744073709551614uL) { buff = new char[Math.Min((int)stateObj._longlen, len)]; } if (stateObj._longlenleft == 0L) { if (!stateObj.TryReadPlpLength(returnPlpNullIfNull: false, out var _)) { totalCharsRead = 0; return false; } if (stateObj._longlenleft == 0L) { totalCharsRead = 0; return true; } } totalCharsRead = 0; while (num2 > 0) { num = (int)Math.Min(stateObj._longlenleft + 1 >> 1, (ulong)num2); if (buff == null || buff.Length < offst + num) { char[] array = new char[offst + num]; if (buff != null) { Buffer.BlockCopy(buff, 0, array, 0, offst * 2); } buff = array; } if (num > 0) { if (!TryReadPlpUnicodeCharsChunk(buff, offst, num, stateObj, out num)) { return false; } num2 -= num; offst += num; totalCharsRead += num; } if (stateObj._longlenleft == 1 && num2 > 0) { if (!stateObj.TryReadByte(out var value)) { return false; } stateObj._longlenleft--; if (!stateObj.TryReadPlpLength(returnPlpNullIfNull: false, out var _)) { return false; } if (!stateObj.TryReadByte(out var value2)) { return false; } stateObj._longlenleft--; buff[offst] = (char)(((value2 & 0xFF) << 8) + (value & 0xFF)); offst = checked(offst + 1); num++; num2--; totalCharsRead++; } if (stateObj._longlenleft == 0L && !stateObj.TryReadPlpLength(returnPlpNullIfNull: false, out var _)) { return false; } if (stateObj._longlenleft == 0L) { break; } } return true; } internal int ReadPlpAnsiChars(ref char[] buff, int offst, int len, SqlMetaDataPriv metadata, TdsParserStateObject stateObj) { int num = 0; int num2 = 0; int num3 = 0; int num4 = 0; if (stateObj._longlen == 0L) { return 0; } num2 = len; if (stateObj._longlenleft == 0L) { stateObj.ReadPlpLength(returnPlpNullIfNull: false); if (stateObj._longlenleft == 0L) { stateObj._plpdecoder = null; return 0; } } if (stateObj._plpdecoder == null) { Encoding encoding = metadata.encoding; if (encoding == null) { if (_defaultEncoding == null) { ThrowUnsupportedCollationEncountered(stateObj); } encoding = _defaultEncoding; } stateObj._plpdecoder = encoding.GetDecoder(); } while (num2 > 0) { num3 = (int)Math.Min(stateObj._longlenleft, (ulong)num2); if (stateObj._bTmp == null || stateObj._bTmp.Length < num3) { stateObj._bTmp = new byte[num3]; } num3 = stateObj.ReadPlpBytesChunk(stateObj._bTmp, 0, num3); num = stateObj._plpdecoder.GetChars(stateObj._bTmp, 0, num3, buff, offst); num2 -= num; offst += num; num4 += num; if (stateObj._longlenleft == 0L) { stateObj.ReadPlpLength(returnPlpNullIfNull: false); } if (stateObj._longlenleft == 0L) { stateObj._plpdecoder = null; break; } } return num4; } internal ulong SkipPlpValue(ulong cb, TdsParserStateObject stateObj) { if (!TrySkipPlpValue(cb, stateObj, out var totalBytesSkipped)) { throw SQL.SynchronousCallMayNotPend(); } return totalBytesSkipped; } internal bool TrySkipPlpValue(ulong cb, TdsParserStateObject stateObj, out ulong totalBytesSkipped) { totalBytesSkipped = 0uL; if (stateObj._longlenleft == 0L && !stateObj.TryReadPlpLength(returnPlpNullIfNull: false, out var _)) { return false; } while (totalBytesSkipped < cb && stateObj._longlenleft != 0) { int num = (int)((stateObj._longlenleft <= int.MaxValue) ? stateObj._longlenleft : int.MaxValue); num = ((cb - totalBytesSkipped < (ulong)num) ? ((int)(cb - totalBytesSkipped)) : num); if (!stateObj.TrySkipBytes(num)) { return false; } stateObj._longlenleft -= (ulong)num; totalBytesSkipped += (ulong)num; if (stateObj._longlenleft == 0L && !stateObj.TryReadPlpLength(returnPlpNullIfNull: false, out var _)) { return false; } } return true; } internal ulong PlpBytesLeft(TdsParserStateObject stateObj) { if (stateObj._longlen != 0L && stateObj._longlenleft == 0L) { stateObj.ReadPlpLength(returnPlpNullIfNull: false); } return stateObj._longlenleft; } internal bool TryPlpBytesLeft(TdsParserStateObject stateObj, out ulong left) { if (stateObj._longlen != 0L && stateObj._longlenleft == 0L && !stateObj.TryReadPlpLength(returnPlpNullIfNull: false, out left)) { return false; } left = stateObj._longlenleft; return true; } internal ulong PlpBytesTotalLength(TdsParserStateObject stateObj) { if (stateObj._longlen == 18446744073709551614uL) { return ulong.MaxValue; } if (stateObj._longlen == ulong.MaxValue) { return 0uL; } return stateObj._longlen; } private bool TryProcessUDTMetaData(SqlMetaDataPriv metaData, TdsParserStateObject stateObj) { if (!stateObj.TryReadUInt16(out var value)) { return false; } metaData.length = value; if (!stateObj.TryReadByte(out var value2)) { return false; } if (value2 != 0 && !stateObj.TryReadString(value2, out metaData.udtDatabaseName)) { return false; } if (!stateObj.TryReadByte(out value2)) { return false; } if (value2 != 0 && !stateObj.TryReadString(value2, out metaData.udtSchemaName)) { return false; } if (!stateObj.TryReadByte(out value2)) { return false; } if (value2 != 0 && !stateObj.TryReadString(value2, out metaData.udtTypeName)) { return false; } if (!stateObj.TryReadUInt16(out value)) { return false; } if (value != 0 && !stateObj.TryReadString(value, out metaData.udtAssemblyQualifiedName)) { return false; } return true; } } internal struct SNIErrorDetails { public string errorMessage; public uint nativeError; public uint sniErrorNumber; public int provider; public uint lineNumber; public string function; public Exception exception; } internal enum CallbackType { Read, Write } internal enum EncryptionOptions { OFF, ON, NOT_SUP, REQ, LOGIN } internal enum PreLoginHandshakeStatus { Successful, InstanceFailure } internal enum PreLoginOptions { VERSION = 0, ENCRYPT = 1, INSTANCE = 2, THREADID = 3, MARS = 4, TRACEID = 5, NUMOPT = 6, LASTOPT = 255 } internal enum RunBehavior { UntilDone = 1, ReturnImmediately = 2, Clean = 5, Attention = 13 } internal enum TdsParserState { Closed, OpenNotLoggedIn, OpenLoggedIn, Broken } internal sealed class SqlCollation { private const uint IgnoreCase = 1048576u; private const uint IgnoreNonSpace = 2097152u; private const uint IgnoreWidth = 4194304u; private const uint IgnoreKanaType = 8388608u; private const uint BinarySort = 16777216u; internal const uint MaskLcid = 1048575u; private const int LcidVersionBitOffset = 28; private const uint MaskLcidVersion = 4026531840u; private const uint MaskCompareOpt = 32505856u; internal uint info; internal byte sortId; internal int LCID { get { return (int)(info & 0xFFFFF); } set { int num = value & 0xFFFFF; int num2 = FirstSupportedCollationVersion(num) << 28; info = (info & 0x1F00000u) | (uint)num | (uint)num2; } } internal SqlCompareOptions SqlCompareOptions { get { SqlCompareOptions sqlCompareOptions = SqlCompareOptions.None; if ((info & 0x100000u) != 0) { sqlCompareOptions |= SqlCompareOptions.IgnoreCase; } if ((info & 0x200000u) != 0) { sqlCompareOptions |= SqlCompareOptions.IgnoreNonSpace; } if ((info & 0x400000u) != 0) { sqlCompareOptions |= SqlCompareOptions.IgnoreWidth; } if ((info & 0x800000u) != 0) { sqlCompareOptions |= SqlCompareOptions.IgnoreKanaType; } if ((info & 0x1000000u) != 0) { sqlCompareOptions |= SqlCompareOptions.BinarySort; } return sqlCompareOptions; } set { uint num = 0u; if ((value & SqlCompareOptions.IgnoreCase) != 0) { num |= 0x100000u; } if ((value & SqlCompareOptions.IgnoreNonSpace) != 0) { num |= 0x200000u; } if ((value & SqlCompareOptions.IgnoreWidth) != 0) { num |= 0x400000u; } if ((value & SqlCompareOptions.IgnoreKanaType) != 0) { num |= 0x800000u; } if ((value & SqlCompareOptions.BinarySort) != 0) { num |= 0x1000000u; } info = (info & 0xFFFFFu) | num; } } private static int FirstSupportedCollationVersion(int lcid) { return lcid switch { 1044 => 2, 1047 => 2, 1056 => 2, 1065 => 2, 1068 => 2, 1070 => 2, 1071 => 1, 1081 => 1, 1082 => 2, 1083 => 2, 1087 => 1, 1090 => 2, 1091 => 1, 1092 => 1, 1093 => 2, 1101 => 2, 1105 => 2, 1106 => 2, 1107 => 2, 1108 => 2, 1114 => 1, 1121 => 2, 1122 => 2, 1123 => 2, 1125 => 1, 1133 => 2, 1146 => 2, 1148 => 2, 1150 => 2, 1152 => 2, 1153 => 2, 1155 => 2, 1157 => 2, 1164 => 2, 2074 => 2, 2092 => 2, 2107 => 2, 2143 => 2, 3076 => 1, 3098 => 2, 5124 => 2, 5146 => 2, 8218 => 2, _ => 0, }; } internal static bool AreSame(SqlCollation a, SqlCollation b) { if (a == null || b == null) { return a == b; } if (a.info == b.info) { return a.sortId == b.sortId; } return false; } } internal class RoutingInfo { internal byte Protocol { get; private set; } internal ushort Port { get; private set; } internal string ServerName { get; private set; } internal RoutingInfo(byte protocol, ushort port, string servername) { Protocol = protocol; Port = port; ServerName = servername; } } internal sealed class SqlEnvChange { internal byte type; internal byte oldLength; internal int newLength; internal int length; internal string newValue; internal string oldValue; internal byte[] newBinValue; internal byte[] oldBinValue; internal long newLongValue; internal long oldLongValue; internal SqlCollation newCollation; internal SqlCollation oldCollation; internal RoutingInfo newRoutingInfo; } internal sealed class SqlLogin { internal int timeout; internal bool userInstance; internal string hostName = ""; internal string userName = ""; internal string password = ""; internal string applicationName = ""; internal string serverName = ""; internal string language = ""; internal string database = ""; internal string attachDBFilename = ""; internal bool useReplication; internal bool useSSPI; internal int packetSize = 8000; internal bool readOnlyIntent; } internal sealed class SqlLoginAck { internal byte majorVersion; internal byte minorVersion; internal short buildNum; internal uint tdsVersion; } internal sealed class _SqlMetaData : SqlMetaDataPriv { internal string column; internal string baseColumn; internal MultiPartTableName multiPartTableName; internal readonly int ordinal; internal byte updatability; internal byte tableNum; internal bool isDifferentName; internal bool isKey; internal bool isHidden; internal bool isExpression; internal bool isIdentity; internal bool isColumnSet; internal byte op; internal ushort operand; internal string serverName => multiPartTableName.ServerName; internal string catalogName => multiPartTableName.CatalogName; internal string schemaName => multiPartTableName.SchemaName; internal string tableName => multiPartTableName.TableName; internal bool IsNewKatmaiDateTimeType { get { if (SqlDbType.Date != type && SqlDbType.Time != type && SqlDbType.DateTime2 != type) { return SqlDbType.DateTimeOffset == type; } return true; } } internal bool IsLargeUdt { get { if (type == SqlDbType.Udt) { return length == int.MaxValue; } return false; } } internal _SqlMetaData(int ordinal) { this.ordinal = ordinal; } public object Clone() { _SqlMetaData sqlMetaData = new _SqlMetaData(ordinal); sqlMetaData.CopyFrom(this); sqlMetaData.column = column; sqlMetaData.baseColumn = baseColumn; sqlMetaData.multiPartTableName = multiPartTableName; sqlMetaData.updatability = updatability; sqlMetaData.tableNum = tableNum; sqlMetaData.isDifferentName = isDifferentName; sqlMetaData.isKey = isKey; sqlMetaData.isHidden = isHidden; sqlMetaData.isExpression = isExpression; sqlMetaData.isIdentity = isIdentity; sqlMetaData.isColumnSet = isColumnSet; sqlMetaData.op = op; sqlMetaData.operand = operand; return sqlMetaData; } } internal sealed class _SqlMetaDataSet { internal ushort id; internal int[] indexMap; internal int visibleColumns; internal DataTable schemaTable; private readonly _SqlMetaData[] _metaDataArray; internal ReadOnlyCollection dbColumnSchema; internal int Length => _metaDataArray.Length; internal _SqlMetaData this[int index] { get { return _metaDataArray[index]; } set { _metaDataArray[index] = value; } } internal _SqlMetaDataSet(int count) { _metaDataArray = new _SqlMetaData[count]; for (int i = 0; i < _metaDataArray.Length; i++) { _metaDataArray[i] = new _SqlMetaData(i); } } private _SqlMetaDataSet(_SqlMetaDataSet original) { id = original.id; indexMap = original.indexMap; visibleColumns = original.visibleColumns; dbColumnSchema = original.dbColumnSchema; if (original._metaDataArray == null) { _metaDataArray = null; return; } _metaDataArray = new _SqlMetaData[original._metaDataArray.Length]; for (int i = 0; i < _metaDataArray.Length; i++) { _metaDataArray[i] = (_SqlMetaData)original._metaDataArray[i].Clone(); } } public object Clone() { return new _SqlMetaDataSet(this); } } internal sealed class _SqlMetaDataSetCollection { private readonly List<_SqlMetaDataSet> _altMetaDataSetArray; internal _SqlMetaDataSet metaDataSet; internal _SqlMetaDataSetCollection() { _altMetaDataSetArray = new List<_SqlMetaDataSet>(); } internal void SetAltMetaData(_SqlMetaDataSet altMetaDataSet) { int id = altMetaDataSet.id; for (int i = 0; i < _altMetaDataSetArray.Count; i++) { if (_altMetaDataSetArray[i].id == id) { _altMetaDataSetArray[i] = altMetaDataSet; return; } } _altMetaDataSetArray.Add(altMetaDataSet); } internal _SqlMetaDataSet GetAltMetaData(int id) { foreach (_SqlMetaDataSet item in _altMetaDataSetArray) { if (item.id == id) { return item; } } return null; } public object Clone() { _SqlMetaDataSetCollection sqlMetaDataSetCollection = new _SqlMetaDataSetCollection(); sqlMetaDataSetCollection.metaDataSet = ((metaDataSet == null) ? null : ((_SqlMetaDataSet)metaDataSet.Clone())); foreach (_SqlMetaDataSet item in _altMetaDataSetArray) { sqlMetaDataSetCollection._altMetaDataSetArray.Add((_SqlMetaDataSet)item.Clone()); } return sqlMetaDataSetCollection; } } internal class SqlMetaDataPriv { internal SqlDbType type; internal byte tdsType; internal byte precision = byte.MaxValue; internal byte scale = byte.MaxValue; internal int length; internal SqlCollation collation; internal int codePage; internal Encoding encoding; internal bool isNullable; internal string udtDatabaseName; internal string udtSchemaName; internal string udtTypeName; internal string udtAssemblyQualifiedName; internal string xmlSchemaCollectionDatabase; internal string xmlSchemaCollectionOwningSchema; internal string xmlSchemaCollectionName; internal MetaType metaType; internal SqlMetaDataPriv() { } internal virtual void CopyFrom(SqlMetaDataPriv original) { type = original.type; tdsType = original.tdsType; precision = original.precision; scale = original.scale; length = original.length; collation = original.collation; codePage = original.codePage; encoding = original.encoding; isNullable = original.isNullable; udtDatabaseName = original.udtDatabaseName; udtSchemaName = original.udtSchemaName; udtTypeName = original.udtTypeName; udtAssemblyQualifiedName = original.udtAssemblyQualifiedName; xmlSchemaCollectionDatabase = original.xmlSchemaCollectionDatabase; xmlSchemaCollectionOwningSchema = original.xmlSchemaCollectionOwningSchema; xmlSchemaCollectionName = original.xmlSchemaCollectionName; metaType = original.metaType; } } internal sealed class _SqlRPC { internal string rpcName; internal ushort ProcID; internal ushort options; internal SqlParameter[] parameters; internal byte[] paramoptions; internal int? recordsAffected; internal int cumulativeRecordsAffected; internal int errorsIndexStart; internal int errorsIndexEnd; internal SqlErrorCollection errors; internal int warningsIndexStart; internal int warningsIndexEnd; internal SqlErrorCollection warnings; internal string GetCommandTextOrRpcName() { if (10 == ProcID) { return (string)parameters[0].Value; } return rpcName; } } internal sealed class SqlReturnValue : SqlMetaDataPriv { internal string parameter; internal readonly SqlBuffer value; internal SqlReturnValue() { value = new SqlBuffer(); } } internal struct MultiPartTableName { private string _multipartName; private string _serverName; private string _catalogName; private string _schemaName; private string _tableName; internal static readonly MultiPartTableName Null = new MultiPartTableName(new string[4]); internal string ServerName { get { ParseMultipartName(); return _serverName; } set { _serverName = value; } } internal string CatalogName { get { ParseMultipartName(); return _catalogName; } set { _catalogName = value; } } internal string SchemaName { get { ParseMultipartName(); return _schemaName; } set { _schemaName = value; } } internal string TableName { get { ParseMultipartName(); return _tableName; } set { _tableName = value; } } internal MultiPartTableName(string[] parts) { _multipartName = null; _serverName = parts[0]; _catalogName = parts[1]; _schemaName = parts[2]; _tableName = parts[3]; } internal MultiPartTableName(string multipartName) { _multipartName = multipartName; _serverName = null; _catalogName = null; _schemaName = null; _tableName = null; } private void ParseMultipartName() { if (_multipartName != null) { string[] array = MultipartIdentifier.ParseMultipartIdentifier(_multipartName, "[\"", "]\"", "Processing of results from SQL Server failed because of an invalid multipart name", ThrowOnEmptyMultipartName: false); _serverName = array[0]; _catalogName = array[1]; _schemaName = array[2]; _tableName = array[3]; _multipartName = null; } } } internal class TdsParserSessionPool { private const int MaxInactiveCount = 10; private readonly TdsParser _parser; private readonly List _cache; private int _cachedCount; private TdsParserStateObject[] _freeStateObjects; private int _freeStateObjectCount; private bool IsDisposed => _freeStateObjects == null; internal int ActiveSessionsCount => _cachedCount - _freeStateObjectCount; internal TdsParserSessionPool(TdsParser parser) { _parser = parser; _cache = new List(); _freeStateObjects = new TdsParserStateObject[10]; _freeStateObjectCount = 0; } internal void Deactivate() { lock (_cache) { for (int num = _cache.Count - 1; num >= 0; num--) { TdsParserStateObject tdsParserStateObject = _cache[num]; if (tdsParserStateObject != null && tdsParserStateObject.IsOrphaned) { PutSession(tdsParserStateObject); } } } } internal void Dispose() { lock (_cache) { for (int i = 0; i < _freeStateObjectCount; i++) { if (_freeStateObjects[i] != null) { _freeStateObjects[i].Dispose(); } } _freeStateObjects = null; _freeStateObjectCount = 0; for (int j = 0; j < _cache.Count; j++) { if (_cache[j] != null) { if (_cache[j].IsOrphaned) { _cache[j].Dispose(); } else { _cache[j].DecrementPendingCallbacks(release: false); } } } _cache.Clear(); _cachedCount = 0; } } internal TdsParserStateObject GetSession(object owner) { lock (_cache) { if (IsDisposed) { throw ADP.ClosedConnectionError(); } TdsParserStateObject tdsParserStateObject; if (_freeStateObjectCount > 0) { _freeStateObjectCount--; tdsParserStateObject = _freeStateObjects[_freeStateObjectCount]; _freeStateObjects[_freeStateObjectCount] = null; } else { tdsParserStateObject = _parser.CreateSession(); _cache.Add(tdsParserStateObject); _cachedCount = _cache.Count; } tdsParserStateObject.Activate(owner); return tdsParserStateObject; } } internal void PutSession(TdsParserStateObject session) { bool flag = session.Deactivate(); lock (_cache) { if (IsDisposed) { session.Dispose(); } else if (flag && _freeStateObjectCount < 10) { _freeStateObjects[_freeStateObjectCount] = session; _freeStateObjectCount++; } else { _cache.Remove(session); _cachedCount = _cache.Count; session.Dispose(); } session.RemoveOwner(); } } } internal sealed class LastIOTimer { internal long _value; } internal abstract class TdsParserStateObject { private struct NullBitmap { private byte[] _nullBitmap; private int _columnsCount; internal bool TryInitialize(TdsParserStateObject stateObj, int columnsCount) { _columnsCount = columnsCount; int num = (columnsCount + 7) / 8; if (_nullBitmap == null || _nullBitmap.Length != num) { _nullBitmap = new byte[num]; } if (!stateObj.TryReadByteArray(_nullBitmap, 0, _nullBitmap.Length)) { return false; } return true; } internal bool ReferenceEquals(NullBitmap obj) { return _nullBitmap == obj._nullBitmap; } internal NullBitmap Clone() { NullBitmap result = default(NullBitmap); result._nullBitmap = ((_nullBitmap == null) ? null : ((byte[])_nullBitmap.Clone())); result._columnsCount = _columnsCount; return result; } internal void Clean() { _columnsCount = 0; } internal bool IsGuaranteedNull(int columnOrdinal) { if (_columnsCount == 0) { return false; } byte num = (byte)(1 << (columnOrdinal & 7)); byte b = _nullBitmap[columnOrdinal >> 3]; return (num & b) != 0; } } private class PacketData { public byte[] Buffer; public int Read; } private class StateSnapshot { private List _snapshotInBuffs; private int _snapshotInBuffCurrent; private int _snapshotInBytesUsed; private int _snapshotInBytesPacket; private bool _snapshotPendingData; private bool _snapshotErrorTokenReceived; private bool _snapshotHasOpenResult; private bool _snapshotReceivedColumnMetadata; private bool _snapshotAttentionReceived; private byte _snapshotMessageStatus; private NullBitmap _snapshotNullBitmapInfo; private ulong _snapshotLongLen; private ulong _snapshotLongLenLeft; private _SqlMetaDataSet _snapshotCleanupMetaData; private _SqlMetaDataSetCollection _snapshotCleanupAltMetaDataSetArray; private readonly TdsParserStateObject _stateObj; public StateSnapshot(TdsParserStateObject state) { _snapshotInBuffs = new List(); _stateObj = state; } internal void CloneNullBitmapInfo() { if (_stateObj._nullBitmapInfo.ReferenceEquals(_snapshotNullBitmapInfo)) { _stateObj._nullBitmapInfo = _stateObj._nullBitmapInfo.Clone(); } } internal void CloneCleanupAltMetaDataSetArray() { if (_stateObj._cleanupAltMetaDataSetArray != null && _snapshotCleanupAltMetaDataSetArray == _stateObj._cleanupAltMetaDataSetArray) { _stateObj._cleanupAltMetaDataSetArray = (_SqlMetaDataSetCollection)_stateObj._cleanupAltMetaDataSetArray.Clone(); } } internal void PushBuffer(byte[] buffer, int read) { PacketData packetData = new PacketData(); packetData.Buffer = buffer; packetData.Read = read; _snapshotInBuffs.Add(packetData); } internal bool Replay() { if (_snapshotInBuffCurrent < _snapshotInBuffs.Count) { PacketData packetData = _snapshotInBuffs[_snapshotInBuffCurrent]; _stateObj._inBuff = packetData.Buffer; _stateObj._inBytesUsed = 0; _stateObj._inBytesRead = packetData.Read; _snapshotInBuffCurrent++; return true; } return false; } internal void Snap() { _snapshotInBuffs.Clear(); _snapshotInBuffCurrent = 0; _snapshotInBytesUsed = _stateObj._inBytesUsed; _snapshotInBytesPacket = _stateObj._inBytesPacket; _snapshotPendingData = _stateObj._pendingData; _snapshotErrorTokenReceived = _stateObj._errorTokenReceived; _snapshotMessageStatus = _stateObj._messageStatus; _snapshotNullBitmapInfo = _stateObj._nullBitmapInfo; _snapshotLongLen = _stateObj._longlen; _snapshotLongLenLeft = _stateObj._longlenleft; _snapshotCleanupMetaData = _stateObj._cleanupMetaData; _snapshotCleanupAltMetaDataSetArray = _stateObj._cleanupAltMetaDataSetArray; _snapshotHasOpenResult = _stateObj._hasOpenResult; _snapshotReceivedColumnMetadata = _stateObj._receivedColMetaData; _snapshotAttentionReceived = _stateObj._attentionReceived; PushBuffer(_stateObj._inBuff, _stateObj._inBytesRead); } internal void ResetSnapshotState() { _snapshotInBuffCurrent = 0; Replay(); _stateObj._inBytesUsed = _snapshotInBytesUsed; _stateObj._inBytesPacket = _snapshotInBytesPacket; _stateObj._pendingData = _snapshotPendingData; _stateObj._errorTokenReceived = _snapshotErrorTokenReceived; _stateObj._messageStatus = _snapshotMessageStatus; _stateObj._nullBitmapInfo = _snapshotNullBitmapInfo; _stateObj._cleanupMetaData = _snapshotCleanupMetaData; _stateObj._cleanupAltMetaDataSetArray = _snapshotCleanupAltMetaDataSetArray; _stateObj._hasOpenResult = _snapshotHasOpenResult; _stateObj._receivedColMetaData = _snapshotReceivedColumnMetadata; _stateObj._attentionReceived = _snapshotAttentionReceived; _stateObj._bTmpRead = 0; _stateObj._partialHeaderBytesRead = 0; _stateObj._longlen = _snapshotLongLen; _stateObj._longlenleft = _snapshotLongLenLeft; _stateObj._snapshotReplay = true; } internal void PrepareReplay() { ResetSnapshotState(); } } private const int AttentionTimeoutSeconds = 5; private const long CheckConnectionWindow = 50000L; protected readonly TdsParser _parser; private readonly WeakReference _owner = new WeakReference(null); internal SqlDataReader.SharedState _readerState; private int _activateCount; internal readonly int _inputHeaderLen = 8; internal readonly int _outputHeaderLen = 8; internal byte[] _outBuff; internal int _outBytesUsed = 8; protected byte[] _inBuff; internal int _inBytesUsed; internal int _inBytesRead; internal int _inBytesPacket; internal byte _outputMessageType; internal byte _messageStatus; internal byte _outputPacketNumber = 1; internal bool _pendingData; internal volatile bool _fResetEventOwned; internal volatile bool _fResetConnectionSent; internal bool _errorTokenReceived; internal bool _bulkCopyOpperationInProgress; internal bool _bulkCopyWriteTimeout; protected readonly object _writePacketLockObject = new object(); private int _pendingCallbacks; private long _timeoutMilliseconds; private long _timeoutTime; internal volatile bool _attentionSent; internal bool _attentionReceived; internal volatile bool _attentionSending; internal bool _internalTimeout; private readonly LastIOTimer _lastSuccessfulIOTimer; private bool _cancelled; private const int _waitForCancellationLockPollTimeout = 100; private WeakReference _cancellationOwner = new WeakReference(null); internal bool _hasOpenResult; internal SqlInternalTransaction _executedUnderTransaction; internal ulong _longlen; internal ulong _longlenleft; internal int[] _decimalBits; internal byte[] _bTmp = new byte[12]; internal int _bTmpRead; internal Decoder _plpdecoder; internal bool _accumulateInfoEvents; internal List _pendingInfoEvents; private byte[] _partialHeaderBuffer = new byte[8]; internal int _partialHeaderBytesRead; internal _SqlMetaDataSet _cleanupMetaData; internal _SqlMetaDataSetCollection _cleanupAltMetaDataSetArray; internal bool _receivedColMetaData; private SniContext _sniContext; private bool _bcpLock; private NullBitmap _nullBitmapInfo; internal TaskCompletionSource _networkPacketTaskSource; private Timer _networkPacketTimeout; internal bool _syncOverAsync = true; private bool _snapshotReplay; private StateSnapshot _snapshot; internal ExecutionContext _executionContext; internal bool _asyncReadWithoutSnapshot; internal SqlErrorCollection _errors; internal SqlErrorCollection _warnings; internal object _errorAndWarningsLock = new object(); private bool _hasErrorOrWarning; internal SqlErrorCollection _preAttentionErrors; internal SqlErrorCollection _preAttentionWarnings; private volatile TaskCompletionSource _writeCompletionSource; protected volatile int _asyncWriteCount; private volatile Exception _delayedWriteAsyncCallbackException; private int _readingCount; internal bool BcpLock { get { return _bcpLock; } set { _bcpLock = value; } } internal bool HasOpenResult => _hasOpenResult; internal bool IsOrphaned { get { if (_activateCount != 0) { return !_owner.IsAlive; } return false; } } internal object Owner { set { if (!(value is SqlDataReader sqlDataReader)) { _readerState = null; } else { _readerState = sqlDataReader._sharedState; } _owner.Target = value; } } internal bool HasOwner => _owner.IsAlive; internal TdsParser Parser => _parser; internal SniContext SniContext { get { return _sniContext; } set { _sniContext = value; } } internal abstract uint Status { get; } internal abstract object SessionHandle { get; } internal bool TimeoutHasExpired => TdsParserStaticMethods.TimeoutHasExpired(_timeoutTime); internal long TimeoutTime { get { if (_timeoutMilliseconds != 0L) { _timeoutTime = TdsParserStaticMethods.GetTimeout(_timeoutMilliseconds); _timeoutMilliseconds = 0L; } return _timeoutTime; } set { _timeoutMilliseconds = 0L; _timeoutTime = value; } } internal bool HasErrorOrWarning => _hasErrorOrWarning; internal int ErrorCount { get { int result = 0; lock (_errorAndWarningsLock) { if (_errors != null) { result = _errors.Count; } } return result; } } internal int WarningCount { get { int result = 0; lock (_errorAndWarningsLock) { if (_warnings != null) { result = _warnings.Count; } } return result; } } protected abstract object EmptyReadPacket { get; } internal TdsParserStateObject(TdsParser parser) { _parser = parser; SetPacketSize(4096); IncrementPendingCallbacks(); _lastSuccessfulIOTimer = new LastIOTimer(); } internal TdsParserStateObject(TdsParser parser, TdsParserStateObject physicalConnection, bool async) { _parser = parser; SniContext = SniContext.Snix_GetMarsSession; SetPacketSize(_parser._physicalStateObj._outBuff.Length); CreateSessionHandle(physicalConnection, async); if (IsFailedHandle()) { AddError(parser.ProcessSNIError(this)); ThrowExceptionAndWarning(); } IncrementPendingCallbacks(); _lastSuccessfulIOTimer = parser._physicalStateObj._lastSuccessfulIOTimer; } internal abstract uint DisabeSsl(); internal abstract uint EnableMars(ref uint info); internal int GetTimeoutRemaining() { int result; if (_timeoutMilliseconds != 0L) { result = (int)Math.Min(2147483647L, _timeoutMilliseconds); _timeoutTime = TdsParserStaticMethods.GetTimeout(_timeoutMilliseconds); _timeoutMilliseconds = 0L; } else { result = TdsParserStaticMethods.GetTimeoutMilliseconds(_timeoutTime); } return result; } internal bool TryStartNewRow(bool isNullCompressed, int nullBitmapColumnsCount = 0) { if (_snapshot != null) { _snapshot.CloneNullBitmapInfo(); } if (isNullCompressed) { if (!_nullBitmapInfo.TryInitialize(this, nullBitmapColumnsCount)) { return false; } } else { _nullBitmapInfo.Clean(); } return true; } internal bool IsRowTokenReady() { int num = Math.Min(_inBytesPacket, _inBytesRead - _inBytesUsed) - 1; if (num > 0) { if (_inBuff[_inBytesUsed] == 209) { return true; } if (_inBuff[_inBytesUsed] == 210) { return 1 + (_cleanupMetaData.Length + 7) / 8 <= num; } } return false; } internal bool IsNullCompressionBitSet(int columnOrdinal) { return _nullBitmapInfo.IsGuaranteedNull(columnOrdinal); } internal void Activate(object owner) { Owner = owner; Interlocked.Increment(ref _activateCount); } internal void Cancel(object caller) { bool lockTaken = false; try { while (!lockTaken && _parser.State != 0 && _parser.State != TdsParserState.Broken) { Monitor.TryEnter(this, 100, ref lockTaken); if (!lockTaken || _cancelled || _cancellationOwner.Target != caller) { continue; } _cancelled = true; if (!_pendingData || _attentionSent) { continue; } bool lockTaken2 = false; while (!lockTaken2 && _parser.State != 0 && _parser.State != TdsParserState.Broken) { try { _parser.Connection._parserLock.Wait(canReleaseFromAnyThread: false, 100, ref lockTaken2); if (lockTaken2) { _parser.Connection.ThreadHasParserLockForClose = true; SendAttention(); } } finally { if (lockTaken2) { if (_parser.Connection.ThreadHasParserLockForClose) { _parser.Connection.ThreadHasParserLockForClose = false; } _parser.Connection._parserLock.Release(); } } } } } finally { if (lockTaken) { Monitor.Exit(this); } } } internal void CancelRequest() { ResetBuffer(); _outputPacketNumber = 1; if (!_bulkCopyWriteTimeout) { SendAttention(); Parser.ProcessPendingAck(this); } } public void CheckSetResetConnectionState(uint error, CallbackType callbackType) { if (_fResetEventOwned) { if (callbackType == CallbackType.Read && error == 0) { _parser._fResetConnection = false; _fResetConnectionSent = false; _fResetEventOwned = !_parser._resetConnectionEvent.Set(); } if (error != 0) { _fResetConnectionSent = false; _fResetEventOwned = !_parser._resetConnectionEvent.Set(); } } } internal void CloseSession() { ResetCancelAndProcessAttention(); Parser.PutSession(this); } private void ResetCancelAndProcessAttention() { lock (this) { _cancelled = false; _cancellationOwner.Target = null; if (_attentionSent) { Parser.ProcessPendingAck(this); } _internalTimeout = false; } } internal abstract void CreatePhysicalSNIHandle(string serverName, bool ignoreSniOpenTimeout, long timerExpire, out byte[] instanceName, ref byte[] spnBuffer, bool flushCache, bool async, bool fParallel, bool isIntegratedSecurity = false); internal abstract uint SniGetConnectionId(ref Guid clientConnectionId); internal abstract bool IsFailedHandle(); protected abstract void CreateSessionHandle(TdsParserStateObject physicalConnection, bool async); protected abstract void FreeGcHandle(int remaining, bool release); internal abstract uint EnableSsl(ref uint info); internal abstract uint WaitForSSLHandShakeToComplete(); internal abstract void Dispose(); internal abstract void DisposePacketCache(); internal abstract bool IsPacketEmpty(object readPacket); internal abstract object ReadSyncOverAsync(int timeoutRemaining, bool isMarsOn, out uint error); internal abstract object ReadAsync(out uint error, ref object handle); internal abstract uint CheckConnection(); internal abstract uint SetConnectionBufferSize(ref uint unsignedPacketSize); internal abstract void ReleasePacket(object syncReadPacket); protected abstract uint SNIPacketGetData(object packet, byte[] _inBuff, ref uint dataSize); internal abstract object GetResetWritePacket(); internal abstract void ClearAllWritePackets(); internal abstract object AddPacketToPendingList(object packet); protected abstract void RemovePacketFromPendingList(object pointer); internal abstract uint GenerateSspiClientContext(byte[] receivedBuff, uint receivedLength, ref byte[] sendBuff, ref uint sendLength, byte[] _sniSpnBuffer); internal bool Deactivate() { bool result = false; try { TdsParserState state = Parser.State; if (state != TdsParserState.Broken && state != 0) { if (_pendingData) { Parser.DrainData(this); } if (HasOpenResult) { DecrementOpenResultCount(); } ResetCancelAndProcessAttention(); result = true; } } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } } return result; } internal void RemoveOwner() { if (_parser.MARSOn) { Interlocked.Decrement(ref _activateCount); } Owner = null; } internal void DecrementOpenResultCount() { if (_executedUnderTransaction == null) { _parser.DecrementNonTransactedOpenResultCount(); } else { _executedUnderTransaction.DecrementAndObtainOpenResultCount(); _executedUnderTransaction = null; } _hasOpenResult = false; } internal int DecrementPendingCallbacks(bool release) { int num = Interlocked.Decrement(ref _pendingCallbacks); FreeGcHandle(num, release); return num; } internal void DisposeCounters() { Timer networkPacketTimeout = _networkPacketTimeout; if (networkPacketTimeout != null) { _networkPacketTimeout = null; networkPacketTimeout.Dispose(); } if (Volatile.Read(ref _readingCount) > 0) { SpinWait.SpinUntil(() => Volatile.Read(ref _readingCount) == 0); } } internal int IncrementAndObtainOpenResultCount(SqlInternalTransaction transaction) { _hasOpenResult = true; if (transaction == null) { return _parser.IncrementNonTransactedOpenResultCount(); } _executedUnderTransaction = transaction; return transaction.IncrementAndObtainOpenResultCount(); } internal int IncrementPendingCallbacks() { return Interlocked.Increment(ref _pendingCallbacks); } internal void SetTimeoutSeconds(int timeout) { SetTimeoutMilliseconds((long)timeout * 1000L); } internal void SetTimeoutMilliseconds(long timeout) { if (timeout <= 0) { _timeoutMilliseconds = 0L; _timeoutTime = long.MaxValue; } else { _timeoutMilliseconds = timeout; _timeoutTime = 0L; } } internal void StartSession(object cancellationOwner) { _cancellationOwner.Target = cancellationOwner; } internal void ThrowExceptionAndWarning(bool callerHasConnectionLock = false, bool asyncClose = false) { _parser.ThrowExceptionAndWarning(this, callerHasConnectionLock, asyncClose); } internal Task ExecuteFlush() { lock (this) { if (_cancelled && 1 == _outputPacketNumber) { ResetBuffer(); _cancelled = false; throw SQL.OperationCancelled(); } Task task = WritePacket(1); if (task == null) { _pendingData = true; _messageStatus = 0; return null; } return AsyncHelper.CreateContinuationTask(task, delegate { _pendingData = true; _messageStatus = 0; }); } } internal bool TryProcessHeader() { if (_partialHeaderBytesRead > 0 || _inBytesUsed + _inputHeaderLen > _inBytesRead) { do { int num = Math.Min(_inBytesRead - _inBytesUsed, _inputHeaderLen - _partialHeaderBytesRead); Buffer.BlockCopy(_inBuff, _inBytesUsed, _partialHeaderBuffer, _partialHeaderBytesRead, num); _partialHeaderBytesRead += num; _inBytesUsed += num; if (_partialHeaderBytesRead == _inputHeaderLen) { _partialHeaderBytesRead = 0; _inBytesPacket = ((_partialHeaderBuffer[2] << 8) | _partialHeaderBuffer[3]) - _inputHeaderLen; _messageStatus = _partialHeaderBuffer[1]; continue; } if (_parser.State == TdsParserState.Broken || _parser.State == TdsParserState.Closed) { ThrowExceptionAndWarning(); return true; } if (!TryReadNetworkPacket()) { return false; } if (_internalTimeout) { ThrowExceptionAndWarning(); return true; } } while (_partialHeaderBytesRead != 0); } else { _messageStatus = _inBuff[_inBytesUsed + 1]; _inBytesPacket = ((_inBuff[_inBytesUsed + 2] << 8) | _inBuff[_inBytesUsed + 2 + 1]) - _inputHeaderLen; _inBytesUsed += _inputHeaderLen; } if (_inBytesPacket < 0) { throw SQL.ParsingError(); } return true; } internal bool TryPrepareBuffer() { if (_inBytesPacket == 0 && _inBytesUsed < _inBytesRead && !TryProcessHeader()) { return false; } if (_inBytesUsed == _inBytesRead) { if (_inBytesPacket > 0) { if (!TryReadNetworkPacket()) { return false; } } else if (_inBytesPacket == 0) { if (!TryReadNetworkPacket()) { return false; } if (!TryProcessHeader()) { return false; } if (_inBytesUsed == _inBytesRead && !TryReadNetworkPacket()) { return false; } } } return true; } internal void ResetBuffer() { _outBytesUsed = _outputHeaderLen; } internal bool SetPacketSize(int size) { if (size > 32768) { throw SQL.InvalidPacketSize(); } if (_inBuff == null || _inBuff.Length != size) { if (_inBuff == null) { _inBuff = new byte[size]; _inBytesRead = 0; _inBytesUsed = 0; } else if (size != _inBuff.Length) { if (_inBytesRead > _inBytesUsed) { byte[] inBuff = _inBuff; _inBuff = new byte[size]; int num = _inBytesRead - _inBytesUsed; if (inBuff.Length < _inBytesUsed + num || _inBuff.Length < num) { throw SQL.InvalidInternalPacketSize(SR.GetString("Invalid internal packet size:") + " " + inBuff.Length + ", " + _inBytesUsed + ", " + num + ", " + _inBuff.Length); } Buffer.BlockCopy(inBuff, _inBytesUsed, _inBuff, 0, num); _inBytesRead -= _inBytesUsed; _inBytesUsed = 0; } else { _inBuff = new byte[size]; _inBytesRead = 0; _inBytesUsed = 0; } } _outBuff = new byte[size]; _outBytesUsed = _outputHeaderLen; return true; } return false; } internal bool TryPeekByte(out byte value) { if (!TryReadByte(out value)) { return false; } _inBytesPacket++; _inBytesUsed--; return true; } public bool TryReadByteArray(byte[] buff, int offset, int len) { int totalRead; return TryReadByteArray(buff, offset, len, out totalRead); } public bool TryReadByteArray(byte[] buff, int offset, int len, out int totalRead) { totalRead = 0; while (len > 0) { if ((_inBytesPacket == 0 || _inBytesUsed == _inBytesRead) && !TryPrepareBuffer()) { return false; } int num = Math.Min(len, Math.Min(_inBytesPacket, _inBytesRead - _inBytesUsed)); if (buff != null) { Buffer.BlockCopy(_inBuff, _inBytesUsed, buff, offset + totalRead, num); } totalRead += num; _inBytesUsed += num; _inBytesPacket -= num; len -= num; } if (_messageStatus != 1 && (_inBytesPacket == 0 || _inBytesUsed == _inBytesRead) && !TryPrepareBuffer()) { return false; } return true; } internal bool TryReadByte(out byte value) { value = 0; if ((_inBytesPacket == 0 || _inBytesUsed == _inBytesRead) && !TryPrepareBuffer()) { return false; } _inBytesPacket--; value = _inBuff[_inBytesUsed++]; return true; } internal bool TryReadChar(out char value) { byte[] array; int num; if (_inBytesUsed + 2 > _inBytesRead || _inBytesPacket < 2) { if (!TryReadByteArray(_bTmp, 0, 2)) { value = '\0'; return false; } array = _bTmp; num = 0; } else { array = _inBuff; num = _inBytesUsed; _inBytesUsed += 2; _inBytesPacket -= 2; } value = (char)((array[num + 1] << 8) + array[num]); return true; } internal bool TryReadInt16(out short value) { byte[] array; int num; if (_inBytesUsed + 2 > _inBytesRead || _inBytesPacket < 2) { if (!TryReadByteArray(_bTmp, 0, 2)) { value = 0; return false; } array = _bTmp; num = 0; } else { array = _inBuff; num = _inBytesUsed; _inBytesUsed += 2; _inBytesPacket -= 2; } value = (short)((array[num + 1] << 8) + array[num]); return true; } internal bool TryReadInt32(out int value) { if (_inBytesUsed + 4 > _inBytesRead || _inBytesPacket < 4) { if (!TryReadByteArray(_bTmp, 0, 4)) { value = 0; return false; } value = BitConverter.ToInt32(_bTmp, 0); return true; } value = BitConverter.ToInt32(_inBuff, _inBytesUsed); _inBytesUsed += 4; _inBytesPacket -= 4; return true; } internal bool TryReadInt64(out long value) { if ((_inBytesPacket == 0 || _inBytesUsed == _inBytesRead) && !TryPrepareBuffer()) { value = 0L; return false; } if (_bTmpRead > 0 || _inBytesUsed + 8 > _inBytesRead || _inBytesPacket < 8) { int totalRead = 0; if (!TryReadByteArray(_bTmp, _bTmpRead, 8 - _bTmpRead, out totalRead)) { _bTmpRead += totalRead; value = 0L; return false; } _bTmpRead = 0; value = BitConverter.ToInt64(_bTmp, 0); return true; } value = BitConverter.ToInt64(_inBuff, _inBytesUsed); _inBytesUsed += 8; _inBytesPacket -= 8; return true; } internal bool TryReadUInt16(out ushort value) { byte[] array; int num; if (_inBytesUsed + 2 > _inBytesRead || _inBytesPacket < 2) { if (!TryReadByteArray(_bTmp, 0, 2)) { value = 0; return false; } array = _bTmp; num = 0; } else { array = _inBuff; num = _inBytesUsed; _inBytesUsed += 2; _inBytesPacket -= 2; } value = (ushort)((array[num + 1] << 8) + array[num]); return true; } internal bool TryReadUInt32(out uint value) { if ((_inBytesPacket == 0 || _inBytesUsed == _inBytesRead) && !TryPrepareBuffer()) { value = 0u; return false; } if (_bTmpRead > 0 || _inBytesUsed + 4 > _inBytesRead || _inBytesPacket < 4) { int totalRead = 0; if (!TryReadByteArray(_bTmp, _bTmpRead, 4 - _bTmpRead, out totalRead)) { _bTmpRead += totalRead; value = 0u; return false; } _bTmpRead = 0; value = BitConverter.ToUInt32(_bTmp, 0); return true; } value = BitConverter.ToUInt32(_inBuff, _inBytesUsed); _inBytesUsed += 4; _inBytesPacket -= 4; return true; } internal bool TryReadSingle(out float value) { if (_inBytesUsed + 4 > _inBytesRead || _inBytesPacket < 4) { if (!TryReadByteArray(_bTmp, 0, 4)) { value = 0f; return false; } value = BitConverter.ToSingle(_bTmp, 0); return true; } value = BitConverter.ToSingle(_inBuff, _inBytesUsed); _inBytesUsed += 4; _inBytesPacket -= 4; return true; } internal bool TryReadDouble(out double value) { if (_inBytesUsed + 8 > _inBytesRead || _inBytesPacket < 8) { if (!TryReadByteArray(_bTmp, 0, 8)) { value = 0.0; return false; } value = BitConverter.ToDouble(_bTmp, 0); return true; } value = BitConverter.ToDouble(_inBuff, _inBytesUsed); _inBytesUsed += 8; _inBytesPacket -= 8; return true; } internal bool TryReadString(int length, out string value) { int num = length << 1; int index = 0; byte[] bytes; if (_inBytesUsed + num > _inBytesRead || _inBytesPacket < num) { if (_bTmp == null || _bTmp.Length < num) { _bTmp = new byte[num]; } if (!TryReadByteArray(_bTmp, 0, num)) { value = null; return false; } bytes = _bTmp; } else { bytes = _inBuff; index = _inBytesUsed; _inBytesUsed += num; _inBytesPacket -= num; } value = Encoding.Unicode.GetString(bytes, index, num); return true; } internal bool TryReadStringWithEncoding(int length, Encoding encoding, bool isPlp, out string value) { if (encoding == null) { if (isPlp) { if (!_parser.TrySkipPlpValue((ulong)length, this, out var _)) { value = null; return false; } } else if (!TrySkipBytes(length)) { value = null; return false; } _parser.ThrowUnsupportedCollationEncountered(this); } byte[] buff = null; int index = 0; if (isPlp) { if (!TryReadPlpBytes(ref buff, 0, int.MaxValue, out length)) { value = null; return false; } } else if (_inBytesUsed + length > _inBytesRead || _inBytesPacket < length) { if (_bTmp == null || _bTmp.Length < length) { _bTmp = new byte[length]; } if (!TryReadByteArray(_bTmp, 0, length)) { value = null; return false; } buff = _bTmp; } else { buff = _inBuff; index = _inBytesUsed; _inBytesUsed += length; _inBytesPacket -= length; } value = encoding.GetString(buff, index, length); return true; } internal ulong ReadPlpLength(bool returnPlpNullIfNull) { if (!TryReadPlpLength(returnPlpNullIfNull, out var lengthLeft)) { throw SQL.SynchronousCallMayNotPend(); } return lengthLeft; } internal bool TryReadPlpLength(bool returnPlpNullIfNull, out ulong lengthLeft) { bool flag = false; if (_longlen == 0L) { if (!TryReadInt64(out var value)) { lengthLeft = 0uL; return false; } _longlen = (ulong)value; } if (_longlen == ulong.MaxValue) { _longlen = 0uL; _longlenleft = 0uL; flag = true; } else { if (!TryReadUInt32(out var value2)) { lengthLeft = 0uL; return false; } if (value2 == 0) { _longlenleft = 0uL; _longlen = 0uL; } else { _longlenleft = value2; } } if (flag && returnPlpNullIfNull) { lengthLeft = ulong.MaxValue; return true; } lengthLeft = _longlenleft; return true; } internal int ReadPlpBytesChunk(byte[] buff, int offset, int len) { int num = (int)Math.Min(_longlenleft, (ulong)len); int totalRead; bool num2 = TryReadByteArray(buff, offset, num, out totalRead); _longlenleft -= (ulong)num; if (!num2) { throw SQL.SynchronousCallMayNotPend(); } return totalRead; } internal bool TryReadPlpBytes(ref byte[] buff, int offset, int len, out int totalBytesRead) { int totalRead = 0; if (_longlen == 0L) { if (buff == null) { buff = Array.Empty(); } totalBytesRead = 0; return true; } int num = len; if (buff == null && _longlen != 18446744073709551614uL) { buff = new byte[Math.Min((int)_longlen, len)]; } ulong lengthLeft; if (_longlenleft == 0L) { if (!TryReadPlpLength(returnPlpNullIfNull: false, out lengthLeft)) { totalBytesRead = 0; return false; } if (_longlenleft == 0L) { totalBytesRead = 0; return true; } } if (buff == null) { buff = new byte[_longlenleft]; } totalBytesRead = 0; while (num > 0) { int num2 = (int)Math.Min(_longlenleft, (ulong)num); if (buff.Length < offset + num2) { byte[] array = new byte[offset + num2]; Buffer.BlockCopy(buff, 0, array, 0, offset); buff = array; } bool num3 = TryReadByteArray(buff, offset, num2, out totalRead); num -= totalRead; offset += totalRead; totalBytesRead += totalRead; _longlenleft -= (ulong)totalRead; if (!num3) { return false; } if (_longlenleft == 0L && !TryReadPlpLength(returnPlpNullIfNull: false, out lengthLeft)) { return false; } if (_longlenleft == 0L) { break; } } return true; } internal bool TrySkipLongBytes(long num) { int num2 = 0; while (num > 0) { num2 = (int)Math.Min(2147483647L, num); if (!TryReadByteArray(null, 0, num2)) { return false; } num -= num2; } return true; } internal bool TrySkipBytes(int num) { return TryReadByteArray(null, 0, num); } internal void SetSnapshot() { _snapshot = new StateSnapshot(this); _snapshot.Snap(); _snapshotReplay = false; } internal void ResetSnapshot() { _snapshot = null; _snapshotReplay = false; } internal bool TryReadNetworkPacket() { if (_snapshot != null) { if (_snapshotReplay && _snapshot.Replay()) { return true; } _inBuff = new byte[_inBuff.Length]; } if (_syncOverAsync) { ReadSniSyncOverAsync(); return true; } ReadSni(new TaskCompletionSource()); return false; } internal void PrepareReplaySnapshot() { _networkPacketTaskSource = null; _snapshot.PrepareReplay(); } internal void ReadSniSyncOverAsync() { if (_parser.State == TdsParserState.Broken || _parser.State == TdsParserState.Closed) { throw ADP.ClosedConnectionError(); } object obj = null; bool flag = false; try { Interlocked.Increment(ref _readingCount); flag = true; obj = ReadSyncOverAsync(GetTimeoutRemaining(), isMarsOn: false, out var error); Interlocked.Decrement(ref _readingCount); flag = false; if (_parser.MARSOn) { CheckSetResetConnectionState(error, CallbackType.Read); } if (error == 0) { ProcessSniPacket(obj, 0u); } else { ReadSniError(this, error); } } finally { if (flag) { Interlocked.Decrement(ref _readingCount); } if (!IsPacketEmpty(obj)) { ReleasePacket(obj); } } } internal void OnConnectionClosed() { Parser.State = TdsParserState.Broken; Parser.Connection.BreakConnection(); Interlocked.MemoryBarrier(); _networkPacketTaskSource?.TrySetException(ADP.ExceptionWithStackTrace(ADP.ClosedConnectionError())); _writeCompletionSource?.TrySetException(ADP.ExceptionWithStackTrace(ADP.ClosedConnectionError())); } private void OnTimeout(object state) { if (_internalTimeout) { return; } _internalTimeout = true; lock (this) { if (_attentionSent) { return; } AddError(new SqlError(-2, 0, 11, _parser.Server, _parser.Connection.TimeoutErrorInternal.GetErrorMessage(), "", 0, 258u)); TaskCompletionSource source = _networkPacketTaskSource; if (_parser.Connection.IsInPool) { _parser.State = TdsParserState.Broken; _parser.Connection.BreakConnection(); if (source != null) { source.TrySetCanceled(); } } else if (_parser.State == TdsParserState.OpenLoggedIn) { try { SendAttention(mustTakeWriteLock: true); } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } if (source != null) { source.TrySetCanceled(); } } } if (source == null) { return; } Task.Delay(5000).ContinueWith(delegate { if (!source.Task.IsCompleted) { int num = IncrementPendingCallbacks(); try { if (num == 3 && !source.Task.IsCompleted) { bool flag = false; try { CheckThrowSNIException(); } catch (Exception exception) { if (source.TrySetException(exception)) { flag = true; } } _parser.State = TdsParserState.Broken; _parser.Connection.BreakConnection(); if (!flag) { source.TrySetCanceled(); } } } finally { DecrementPendingCallbacks(release: false); } } }); } } internal void ReadSni(TaskCompletionSource completion) { _networkPacketTaskSource = completion; Interlocked.MemoryBarrier(); if (_parser.State == TdsParserState.Broken || _parser.State == TdsParserState.Closed) { throw ADP.ClosedConnectionError(); } object obj = null; uint error = 0u; try { if (_networkPacketTimeout == null) { _networkPacketTimeout = new Timer(OnTimeout, null, -1, -1); } int timeoutRemaining = GetTimeoutRemaining(); if (timeoutRemaining > 0) { ChangeNetworkPacketTimeout(timeoutRemaining, -1); } object obj2 = null; Interlocked.Increment(ref _readingCount); obj2 = SessionHandle; if (obj2 != null) { IncrementPendingCallbacks(); obj = ReadAsync(out error, ref obj2); if (error != 0 && 997 != error) { DecrementPendingCallbacks(release: false); } } Interlocked.Decrement(ref _readingCount); if (obj2 == null) { throw ADP.ClosedConnectionError(); } if (error == 0) { ReadAsyncCallback(IntPtr.Zero, obj, 0u); } else if (997 != error) { ReadSniError(this, error); _networkPacketTaskSource.TrySetResult(null); ChangeNetworkPacketTimeout(-1, -1); } else if (timeoutRemaining == 0) { ChangeNetworkPacketTimeout(0, -1); } } finally { if (!TdsParserStateObjectFactory.UseManagedSNI && !IsPacketEmpty(obj)) { ReleasePacket(obj); } } } internal bool IsConnectionAlive(bool throwOnException) { bool result = true; if (DateTime.UtcNow.Ticks - _lastSuccessfulIOTimer._value > 50000) { if (_parser == null || _parser.State == TdsParserState.Broken || _parser.State == TdsParserState.Closed) { result = false; if (throwOnException) { throw SQL.ConnectionDoomed(); } } else if (_pendingCallbacks <= 1 && (_parser.Connection == null || _parser.Connection.IsInPool)) { object emptyReadPacket = EmptyReadPacket; try { SniContext = SniContext.Snix_Connect; uint num = CheckConnection(); if (num != 0 && num != 258) { result = false; if (throwOnException) { AddError(_parser.ProcessSNIError(this)); ThrowExceptionAndWarning(); } } else { _lastSuccessfulIOTimer._value = DateTime.UtcNow.Ticks; } } finally { if (!IsPacketEmpty(emptyReadPacket)) { ReleasePacket(emptyReadPacket); } } } } return result; } internal bool ValidateSNIConnection() { if (_parser == null || _parser.State == TdsParserState.Broken || _parser.State == TdsParserState.Closed) { return false; } if (DateTime.UtcNow.Ticks - _lastSuccessfulIOTimer._value <= 50000) { return true; } uint num = 0u; SniContext = SniContext.Snix_Connect; try { Interlocked.Increment(ref _readingCount); num = CheckConnection(); } finally { Interlocked.Decrement(ref _readingCount); } if (num != 0) { return num == 258; } return true; } private void ReadSniError(TdsParserStateObject stateObj, uint error) { if (258 == error) { bool flag = false; if (_internalTimeout) { flag = true; } else { stateObj._internalTimeout = true; AddError(new SqlError(-2, 0, 11, _parser.Server, _parser.Connection.TimeoutErrorInternal.GetErrorMessage(), "", 0, 258u)); if (!stateObj._attentionSent) { if (stateObj.Parser.State == TdsParserState.OpenLoggedIn) { stateObj.SendAttention(mustTakeWriteLock: true); object obj = null; bool flag2 = false; try { Interlocked.Increment(ref _readingCount); flag2 = true; obj = ReadSyncOverAsync(stateObj.GetTimeoutRemaining(), _parser.MARSOn, out error); Interlocked.Decrement(ref _readingCount); flag2 = false; if (error == 0) { stateObj.ProcessSniPacket(obj, 0u); return; } flag = true; } finally { if (flag2) { Interlocked.Decrement(ref _readingCount); } if (!IsPacketEmpty(obj)) { ReleasePacket(obj); } } } else if (_parser._loginWithFailover) { _parser.Disconnect(); } else if (_parser.State == TdsParserState.OpenNotLoggedIn && _parser.Connection.ConnectionOptions.MultiSubnetFailover) { _parser.Disconnect(); } else { flag = true; } } } if (flag) { _parser.State = TdsParserState.Broken; _parser.Connection.BreakConnection(); } } else { AddError(_parser.ProcessSNIError(stateObj)); } ThrowExceptionAndWarning(); } public void ProcessSniPacket(object packet, uint error) { if (error != 0) { if (_parser.State != 0 && _parser.State != TdsParserState.Broken) { AddError(_parser.ProcessSNIError(this)); } return; } uint dataSize = 0u; if (SNIPacketGetData(packet, _inBuff, ref dataSize) == 0) { if (_inBuff.Length < dataSize) { throw SQL.InvalidInternalPacketSize(SR.GetString("Invalid array size.")); } _lastSuccessfulIOTimer._value = DateTime.UtcNow.Ticks; _inBytesRead = (int)dataSize; _inBytesUsed = 0; if (_snapshot != null) { _snapshot.PushBuffer(_inBuff, _inBytesRead); if (_snapshotReplay) { _snapshot.Replay(); } } SniReadStatisticsAndTracing(); return; } throw SQL.ParsingError(); } private void ChangeNetworkPacketTimeout(int dueTime, int period) { Timer networkPacketTimeout = _networkPacketTimeout; if (networkPacketTimeout != null) { try { networkPacketTimeout.Change(dueTime, period); } catch (ObjectDisposedException) { } } } public void ReadAsyncCallback(T packet, uint error) { ReadAsyncCallback(IntPtr.Zero, packet, error); } public void ReadAsyncCallback(IntPtr key, T packet, uint error) { TaskCompletionSource source = _networkPacketTaskSource; if (source == null && _parser._pMarsPhysicalConObj == this) { return; } bool flag = true; try { if (_parser.MARSOn) { CheckSetResetConnectionState(error, CallbackType.Read); } ChangeNetworkPacketTimeout(-1, -1); ProcessSniPacket(packet, error); } catch (Exception e) { flag = ADP.IsCatchableExceptionType(e); throw; } finally { int num = DecrementPendingCallbacks(release: false); if (flag && source != null && num < 2) { if (error == 0) { if (_executionContext != null) { ExecutionContext.Run(_executionContext, delegate { source.TrySetResult(null); }, null); } else { source.TrySetResult(null); } } else if (_executionContext != null) { ExecutionContext.Run(_executionContext, delegate { ReadAsyncCallbackCaptureException(source); }, null); } else { ReadAsyncCallbackCaptureException(source); } } } } protected abstract bool CheckPacket(object packet, TaskCompletionSource source); private void ReadAsyncCallbackCaptureException(TaskCompletionSource source) { bool flag = false; try { if (_hasErrorOrWarning) { ThrowExceptionAndWarning(callerHasConnectionLock: false, asyncClose: true); } else if (_parser.State == TdsParserState.Closed || _parser.State == TdsParserState.Broken) { throw ADP.ClosedConnectionError(); } } catch (Exception exception) { if (source.TrySetException(exception)) { flag = true; } } if (!flag) { Task.Factory.StartNew(delegate { _parser.State = TdsParserState.Broken; _parser.Connection.BreakConnection(); source.TrySetCanceled(); }); } } public void WriteAsyncCallback(T packet, uint sniError) { WriteAsyncCallback(IntPtr.Zero, packet, sniError); } public void WriteAsyncCallback(IntPtr key, T packet, uint sniError) { RemovePacketFromPendingList(packet); try { if (sniError != 0) { try { AddError(_parser.ProcessSNIError(this)); ThrowExceptionAndWarning(callerHasConnectionLock: false, asyncClose: true); } catch (Exception ex) { TaskCompletionSource writeCompletionSource = _writeCompletionSource; if (writeCompletionSource != null) { writeCompletionSource.TrySetException(ex); return; } _delayedWriteAsyncCallbackException = ex; Interlocked.MemoryBarrier(); writeCompletionSource = _writeCompletionSource; if (writeCompletionSource != null) { Exception ex2 = Interlocked.Exchange(ref _delayedWriteAsyncCallbackException, null); if (ex2 != null) { writeCompletionSource.TrySetException(ex2); } } return; } } else { _lastSuccessfulIOTimer._value = DateTime.UtcNow.Ticks; } } finally { Interlocked.Decrement(ref _asyncWriteCount); } TaskCompletionSource writeCompletionSource2 = _writeCompletionSource; if (_asyncWriteCount == 0) { writeCompletionSource2?.TrySetResult(null); } } internal Task WaitForAccumulatedWrites() { Exception ex = Interlocked.Exchange(ref _delayedWriteAsyncCallbackException, null); if (ex != null) { throw ex; } if (_asyncWriteCount == 0) { return null; } _writeCompletionSource = new TaskCompletionSource(); Task task = _writeCompletionSource.Task; Interlocked.MemoryBarrier(); if (_parser.State == TdsParserState.Closed || _parser.State == TdsParserState.Broken) { throw ADP.ClosedConnectionError(); } ex = Interlocked.Exchange(ref _delayedWriteAsyncCallbackException, null); if (ex != null) { throw ex; } if (_asyncWriteCount == 0 && (!task.IsCompleted || task.Exception == null)) { task = null; } return task; } internal void WriteByte(byte b) { if (_outBytesUsed == _outBuff.Length) { WritePacket(0, canAccumulate: true); } _outBuff[_outBytesUsed++] = b; } internal Task WriteByteArray(byte[] b, int len, int offsetBuffer, bool canAccumulate = true, TaskCompletionSource completion = null) { try { _ = _parser._asyncWrite; int num = offsetBuffer; do { if (_outBytesUsed + len > _outBuff.Length) { int num2 = _outBuff.Length - _outBytesUsed; Buffer.BlockCopy(b, num, _outBuff, _outBytesUsed, num2); num += num2; _outBytesUsed += num2; len -= num2; Task task = WritePacket(0, canAccumulate); if (task != null) { Task result = null; if (completion == null) { completion = new TaskCompletionSource(); result = completion.Task; } WriteByteArraySetupContinuation(b, len, completion, num, task); return result; } continue; } Buffer.BlockCopy(b, num, _outBuff, _outBytesUsed, len); _outBytesUsed += len; break; } while (len > 0); completion?.SetResult(null); return null; } catch (Exception exception) { if (completion != null) { completion.SetException(exception); return null; } throw; } } private void WriteByteArraySetupContinuation(byte[] b, int len, TaskCompletionSource completion, int offset, Task packetTask) { AsyncHelper.ContinueTask(packetTask, completion, delegate { WriteByteArray(b, len, offset, canAccumulate: false, completion); }, _parser.Connection); } internal Task WritePacket(byte flushMode, bool canAccumulate = false) { if (_parser.State == TdsParserState.Closed || _parser.State == TdsParserState.Broken) { throw ADP.ClosedConnectionError(); } if ((_parser.State == TdsParserState.OpenLoggedIn && !_bulkCopyOpperationInProgress && _outBytesUsed == _outputHeaderLen + BitConverter.ToInt32(_outBuff, _outputHeaderLen) && _outputPacketNumber == 1) || (_outBytesUsed == _outputHeaderLen && _outputPacketNumber == 1)) { return null; } byte outputPacketNumber = _outputPacketNumber; int num; byte b; if (_cancelled) { num = (_parser._asyncWrite ? 1 : 0); if (num != 0) { b = 3; _outputPacketNumber = 1; goto IL_00cb; } } else { num = 0; } if (1 == flushMode) { b = 1; _outputPacketNumber = 1; } else if (flushMode == 0) { b = 4; _outputPacketNumber++; } else { b = 1; } goto IL_00cb; IL_00cb: _outBuff[0] = _outputMessageType; _outBuff[1] = b; _outBuff[2] = (byte)(_outBytesUsed >> 8); _outBuff[3] = (byte)((uint)_outBytesUsed & 0xFFu); _outBuff[4] = 0; _outBuff[5] = 0; _outBuff[6] = outputPacketNumber; _outBuff[7] = 0; Task task = null; _parser.CheckResetConnection(this); task = WriteSni(canAccumulate); if (num != 0) { task = AsyncHelper.CreateContinuationTask(task, CancelWritePacket, _parser.Connection); } return task; } private void CancelWritePacket() { _parser.Connection.ThreadHasParserLockForClose = true; try { SendAttention(); ResetCancelAndProcessAttention(); throw SQL.OperationCancelled(); } finally { _parser.Connection.ThreadHasParserLockForClose = false; } } private Task SNIWritePacket(object packet, out uint sniError, bool canAccumulate, bool callerHasConnectionLock) { Exception ex = Interlocked.Exchange(ref _delayedWriteAsyncCallbackException, null); if (ex != null) { throw ex; } Task task = null; _writeCompletionSource = null; object pointer = EmptyReadPacket; bool flag = !_parser._asyncWrite; if (flag && _asyncWriteCount > 0) { Task task2 = WaitForAccumulatedWrites(); if (task2 != null) { try { task2.Wait(); } catch (AggregateException ex2) { throw ex2.InnerException; } } } if (!flag) { pointer = AddPacketToPendingList(packet); } try { } finally { sniError = WritePacket(packet, flag); } if (sniError == 997) { Interlocked.Increment(ref _asyncWriteCount); if (!canAccumulate) { _writeCompletionSource = new TaskCompletionSource(); task = _writeCompletionSource.Task; Interlocked.MemoryBarrier(); ex = Interlocked.Exchange(ref _delayedWriteAsyncCallbackException, null); if (ex != null) { throw ex; } if (_asyncWriteCount == 0 && (!task.IsCompleted || task.Exception == null)) { task = null; } } } else { if (_parser.MARSOn) { CheckSetResetConnectionState(sniError, CallbackType.Write); } if (sniError == 0) { _lastSuccessfulIOTimer._value = DateTime.UtcNow.Ticks; if (!flag) { RemovePacketFromPendingList(pointer); } } else { AddError(_parser.ProcessSNIError(this)); ThrowExceptionAndWarning(callerHasConnectionLock); } } return task; } internal abstract bool IsValidPacket(object packetPointer); internal abstract uint WritePacket(object packet, bool sync); internal void SendAttention(bool mustTakeWriteLock = false) { if (_attentionSent || _parser.State == TdsParserState.Closed || _parser.State == TdsParserState.Broken) { return; } object packet = CreateAndSetAttentionPacket(); try { _attentionSending = true; bool flag = false; if (mustTakeWriteLock && !_parser.Connection.ThreadHasParserLockForClose) { flag = true; _parser.Connection._parserLock.Wait(canReleaseFromAnyThread: false); _parser.Connection.ThreadHasParserLockForClose = true; } try { if (_parser.State == TdsParserState.Closed || _parser.State == TdsParserState.Broken) { return; } _parser._asyncWrite = false; SNIWritePacket(packet, out var _, canAccumulate: false, callerHasConnectionLock: false); } finally { if (flag) { _parser.Connection.ThreadHasParserLockForClose = false; _parser.Connection._parserLock.Release(); } } SetTimeoutSeconds(5); _attentionSent = true; } finally { _attentionSending = false; } } internal abstract object CreateAndSetAttentionPacket(); internal abstract void SetPacketData(object packet, byte[] buffer, int bytesUsed); private Task WriteSni(bool canAccumulate) { object resetWritePacket = GetResetWritePacket(); SetPacketData(resetWritePacket, _outBuff, _outBytesUsed); uint sniError; Task result = SNIWritePacket(resetWritePacket, out sniError, canAccumulate, callerHasConnectionLock: true); if (_bulkCopyOpperationInProgress && GetTimeoutRemaining() == 0) { _parser.Connection.ThreadHasParserLockForClose = true; try { AddError(new SqlError(-2, 0, 11, _parser.Server, _parser.Connection.TimeoutErrorInternal.GetErrorMessage(), "", 0, 258u)); _bulkCopyWriteTimeout = true; SendAttention(); _parser.ProcessPendingAck(this); ThrowExceptionAndWarning(); } finally { _parser.Connection.ThreadHasParserLockForClose = false; } } if (_parser.State == TdsParserState.OpenNotLoggedIn && _parser.EncryptionOptions == EncryptionOptions.LOGIN) { _parser.RemoveEncryption(); _parser.EncryptionOptions = EncryptionOptions.OFF; ClearAllWritePackets(); } SniWriteStatisticsAndTracing(); ResetBuffer(); return result; } private void SniReadStatisticsAndTracing() { SqlStatistics statistics = Parser.Statistics; if (statistics != null) { if (statistics.WaitForReply) { statistics.SafeIncrement(ref statistics._serverRoundtrips); statistics.ReleaseAndUpdateNetworkServerTimer(); } statistics.SafeAdd(ref statistics._bytesReceived, _inBytesRead); statistics.SafeIncrement(ref statistics._buffersReceived); } } private void SniWriteStatisticsAndTracing() { SqlStatistics statistics = _parser.Statistics; if (statistics != null) { statistics.SafeIncrement(ref statistics._buffersSent); statistics.SafeAdd(ref statistics._bytesSent, _outBytesUsed); statistics.RequestNetworkServerTimer(); } } [Conditional("DEBUG")] private void AssertValidState() { string text = null; if (_inBytesUsed < 0 || _inBytesRead < 0) { text = string.Format(CultureInfo.InvariantCulture, "either _inBytesUsed or _inBytesRead is negative: {0}, {1}", _inBytesUsed, _inBytesRead); } else if (_inBytesUsed > _inBytesRead) { text = string.Format(CultureInfo.InvariantCulture, "_inBytesUsed > _inBytesRead: {0} > {1}", _inBytesUsed, _inBytesRead); } } internal void AddError(SqlError error) { _syncOverAsync = true; lock (_errorAndWarningsLock) { _hasErrorOrWarning = true; if (_errors == null) { _errors = new SqlErrorCollection(); } _errors.Add(error); } } internal void AddWarning(SqlError error) { _syncOverAsync = true; lock (_errorAndWarningsLock) { _hasErrorOrWarning = true; if (_warnings == null) { _warnings = new SqlErrorCollection(); } _warnings.Add(error); } } internal SqlErrorCollection GetFullErrorAndWarningCollection(out bool broken) { SqlErrorCollection collectionToAddTo = new SqlErrorCollection(); broken = false; lock (_errorAndWarningsLock) { _hasErrorOrWarning = false; AddErrorsToCollection(_errors, ref collectionToAddTo, ref broken); AddErrorsToCollection(_warnings, ref collectionToAddTo, ref broken); _errors = null; _warnings = null; AddErrorsToCollection(_preAttentionErrors, ref collectionToAddTo, ref broken); AddErrorsToCollection(_preAttentionWarnings, ref collectionToAddTo, ref broken); _preAttentionErrors = null; _preAttentionWarnings = null; return collectionToAddTo; } } private void AddErrorsToCollection(SqlErrorCollection inCollection, ref SqlErrorCollection collectionToAddTo, ref bool broken) { if (inCollection == null) { return; } foreach (SqlError item in inCollection) { collectionToAddTo.Add(item); broken |= item.Class >= 20; } } internal void StoreErrorAndWarningForAttention() { lock (_errorAndWarningsLock) { _hasErrorOrWarning = false; _preAttentionErrors = _errors; _preAttentionWarnings = _warnings; _errors = null; _warnings = null; } } internal void RestoreErrorAndWarningAfterAttention() { lock (_errorAndWarningsLock) { _hasErrorOrWarning = (_preAttentionErrors != null && _preAttentionErrors.Count > 0) || (_preAttentionWarnings != null && _preAttentionWarnings.Count > 0); _errors = _preAttentionErrors; _warnings = _preAttentionWarnings; _preAttentionErrors = null; _preAttentionWarnings = null; } } internal void CheckThrowSNIException() { if (HasErrorOrWarning) { ThrowExceptionAndWarning(); } } [Conditional("DEBUG")] internal void AssertStateIsClean() { TdsParser parser = _parser; if (parser != null && parser.State != 0) { _ = parser.State; _ = 3; } } internal void CloneCleanupAltMetaDataSetArray() { if (_snapshot != null) { _snapshot.CloneCleanupAltMetaDataSetArray(); } } } internal sealed class TdsParserStateObjectFactory { public static readonly TdsParserStateObjectFactory Singleton = new TdsParserStateObjectFactory(); public static bool UseManagedSNI => true; public EncryptionOptions EncryptionOptions => SNILoadHandle.SingletonInstance.Options; public uint SNIStatus => SNILoadHandle.SingletonInstance.Status; public TdsParserStateObject CreateTdsParserStateObject(TdsParser parser) { return new TdsParserStateObjectManaged(parser); } internal TdsParserStateObject CreateSessionObject(TdsParser tdsParser, TdsParserStateObject _pMarsPhysicalConObj, bool v) { return new TdsParserStateObjectManaged(tdsParser, _pMarsPhysicalConObj, async: true); } } internal sealed class TdsParserStaticMethods { private const int NoProcessId = -1; private static int s_currentProcessId = -1; private static byte[] s_nicAddress = null; internal static byte[] ObfuscatePassword(string password) { byte[] array = new byte[password.Length << 1]; for (int i = 0; i < password.Length; i++) { char num = password[i]; byte b = (byte)(num & 0xFFu); byte b2 = (byte)((uint)((int)num >> 8) & 0xFFu); array[i << 1] = (byte)((uint)(((b & 0xF) << 4) | (b >> 4)) ^ 0xA5u); array[(i << 1) + 1] = (byte)((uint)(((b2 & 0xF) << 4) | (b2 >> 4)) ^ 0xA5u); } return array; } internal static int GetCurrentProcessIdForTdsLoginOnly() { if (s_currentProcessId == -1) { int value = new Random().Next(); Interlocked.CompareExchange(ref s_currentProcessId, value, -1); } return s_currentProcessId; } internal static int GetCurrentThreadIdForTdsLoginOnly() { return Environment.CurrentManagedThreadId; } internal static byte[] GetNetworkPhysicalAddressForTdsLoginOnly() { if (s_nicAddress == null) { byte[] array = new byte[6]; new Random().NextBytes(array); Interlocked.CompareExchange(ref s_nicAddress, array, null); } return s_nicAddress; } internal static int GetTimeoutMilliseconds(long timeoutTime) { if (long.MaxValue == timeoutTime) { return -1; } long num = ADP.TimerRemainingMilliseconds(timeoutTime); if (num < 0) { return 0; } if (num > int.MaxValue) { return int.MaxValue; } return (int)num; } internal static long GetTimeout(long timeoutMilliseconds) { if (timeoutMilliseconds <= 0) { return long.MaxValue; } try { return checked(ADP.TimerCurrent() + ADP.TimerFromMilliseconds(timeoutMilliseconds)); } catch (OverflowException) { return long.MaxValue; } } internal static bool TimeoutHasExpired(long timeoutTime) { bool result = false; if (timeoutTime != 0L && long.MaxValue != timeoutTime) { result = ADP.TimerHasExpired(timeoutTime); } return result; } internal static int NullAwareStringLength(string str) { return str?.Length ?? 0; } internal static int GetRemainingTimeout(int timeout, long start) { if (timeout <= 0) { return timeout; } long num = ADP.TimerRemainingSeconds(start + ADP.TimerFromSeconds(timeout)); if (num <= 0) { return 1; } return checked((int)num); } } internal class TdsRecordBufferSetter : SmiRecordBuffer { private TdsValueSetter[] _fieldSetters; private TdsParserStateObject _stateObj; private SmiMetaData _metaData; internal override bool CanGet => false; internal override bool CanSet => true; internal TdsRecordBufferSetter(TdsParserStateObject stateObj, SmiMetaData md) { _fieldSetters = new TdsValueSetter[md.FieldMetaData.Count]; for (int i = 0; i < md.FieldMetaData.Count; i++) { _fieldSetters[i] = new TdsValueSetter(stateObj, md.FieldMetaData[i]); } _stateObj = stateObj; _metaData = md; } public override void SetDBNull(SmiEventSink sink, int ordinal) { _fieldSetters[ordinal].SetDBNull(); } public override void SetBoolean(SmiEventSink sink, int ordinal, bool value) { _fieldSetters[ordinal].SetBoolean(value); } public override void SetByte(SmiEventSink sink, int ordinal, byte value) { _fieldSetters[ordinal].SetByte(value); } public override int SetBytes(SmiEventSink sink, int ordinal, long fieldOffset, byte[] buffer, int bufferOffset, int length) { return _fieldSetters[ordinal].SetBytes(fieldOffset, buffer, bufferOffset, length); } public override void SetBytesLength(SmiEventSink sink, int ordinal, long length) { _fieldSetters[ordinal].SetBytesLength(length); } public override int SetChars(SmiEventSink sink, int ordinal, long fieldOffset, char[] buffer, int bufferOffset, int length) { return _fieldSetters[ordinal].SetChars(fieldOffset, buffer, bufferOffset, length); } public override void SetCharsLength(SmiEventSink sink, int ordinal, long length) { _fieldSetters[ordinal].SetCharsLength(length); } public override void SetString(SmiEventSink sink, int ordinal, string value, int offset, int length) { _fieldSetters[ordinal].SetString(value, offset, length); } public override void SetInt16(SmiEventSink sink, int ordinal, short value) { _fieldSetters[ordinal].SetInt16(value); } public override void SetInt32(SmiEventSink sink, int ordinal, int value) { _fieldSetters[ordinal].SetInt32(value); } public override void SetInt64(SmiEventSink sink, int ordinal, long value) { _fieldSetters[ordinal].SetInt64(value); } public override void SetSingle(SmiEventSink sink, int ordinal, float value) { _fieldSetters[ordinal].SetSingle(value); } public override void SetDouble(SmiEventSink sink, int ordinal, double value) { _fieldSetters[ordinal].SetDouble(value); } public override void SetSqlDecimal(SmiEventSink sink, int ordinal, SqlDecimal value) { _fieldSetters[ordinal].SetSqlDecimal(value); } public override void SetDateTime(SmiEventSink sink, int ordinal, DateTime value) { _fieldSetters[ordinal].SetDateTime(value); } public override void SetGuid(SmiEventSink sink, int ordinal, Guid value) { _fieldSetters[ordinal].SetGuid(value); } public override void SetTimeSpan(SmiEventSink sink, int ordinal, TimeSpan value) { _fieldSetters[ordinal].SetTimeSpan(value); } public override void SetDateTimeOffset(SmiEventSink sink, int ordinal, DateTimeOffset value) { _fieldSetters[ordinal].SetDateTimeOffset(value); } public override void SetVariantMetaData(SmiEventSink sink, int ordinal, SmiMetaData metaData) { _fieldSetters[ordinal].SetVariantType(metaData); } internal override void NewElement(SmiEventSink sink) { _stateObj.WriteByte(1); } internal override void EndElements(SmiEventSink sink) { _stateObj.WriteByte(0); } [Conditional("DEBUG")] private void CheckWritingToColumn(int ordinal) { } [Conditional("DEBUG")] private void SkipPossibleDefaultedColumns(int targetColumn) { } [Conditional("DEBUG")] internal void CheckSettingColumn(int ordinal) { } } internal class TdsValueSetter { private TdsParserStateObject _stateObj; private SmiMetaData _metaData; private bool _isPlp; private bool _plpUnknownSent; private Encoder _encoder; private SmiMetaData _variantType; internal TdsValueSetter(TdsParserStateObject stateObj, SmiMetaData md) { _stateObj = stateObj; _metaData = md; _isPlp = MetaDataUtilsSmi.IsPlpFormat(md); _plpUnknownSent = false; _encoder = null; } internal void SetDBNull() { if (_isPlp) { _stateObj.Parser.WriteUnsignedLong(ulong.MaxValue, _stateObj); return; } switch (_metaData.SqlDbType) { case SqlDbType.BigInt: case SqlDbType.Bit: case SqlDbType.DateTime: case SqlDbType.Decimal: case SqlDbType.Float: case SqlDbType.Int: case SqlDbType.Money: case SqlDbType.Real: case SqlDbType.UniqueIdentifier: case SqlDbType.SmallDateTime: case SqlDbType.SmallInt: case SqlDbType.SmallMoney: case SqlDbType.TinyInt: case SqlDbType.Date: case SqlDbType.Time: case SqlDbType.DateTime2: case SqlDbType.DateTimeOffset: _stateObj.WriteByte(0); break; case SqlDbType.Binary: case SqlDbType.Char: case SqlDbType.Image: case SqlDbType.NChar: case SqlDbType.NText: case SqlDbType.NVarChar: case SqlDbType.Text: case SqlDbType.Timestamp: case SqlDbType.VarBinary: case SqlDbType.VarChar: _stateObj.Parser.WriteShort(65535, _stateObj); break; case SqlDbType.Variant: _stateObj.Parser.WriteInt(0, _stateObj); break; case (SqlDbType)24: case SqlDbType.Xml: case (SqlDbType)26: case (SqlDbType)27: case (SqlDbType)28: case SqlDbType.Udt: case SqlDbType.Structured: break; } } internal void SetBoolean(bool value) { if (SqlDbType.Variant == _metaData.SqlDbType) { _stateObj.Parser.WriteSqlVariantHeader(3, 50, 0, _stateObj); } else { _stateObj.WriteByte((byte)_metaData.MaxLength); } if (value) { _stateObj.WriteByte(1); } else { _stateObj.WriteByte(0); } } internal void SetByte(byte value) { if (SqlDbType.Variant == _metaData.SqlDbType) { _stateObj.Parser.WriteSqlVariantHeader(3, 48, 0, _stateObj); } else { _stateObj.WriteByte((byte)_metaData.MaxLength); } _stateObj.WriteByte(value); } internal int SetBytes(long fieldOffset, byte[] buffer, int bufferOffset, int length) { SetBytesNoOffsetHandling(fieldOffset, buffer, bufferOffset, length); return length; } private void SetBytesNoOffsetHandling(long fieldOffset, byte[] buffer, int bufferOffset, int length) { if (_isPlp) { if (!_plpUnknownSent) { _stateObj.Parser.WriteUnsignedLong(18446744073709551614uL, _stateObj); _plpUnknownSent = true; } _stateObj.Parser.WriteInt(length, _stateObj); _stateObj.WriteByteArray(buffer, length, bufferOffset); } else { if (SqlDbType.Variant == _metaData.SqlDbType) { _stateObj.Parser.WriteSqlVariantHeader(4 + length, 165, 2, _stateObj); } _stateObj.Parser.WriteShort(length, _stateObj); _stateObj.WriteByteArray(buffer, length, bufferOffset); } } internal void SetBytesLength(long length) { if (length == 0L) { if (_isPlp) { _stateObj.Parser.WriteLong(0L, _stateObj); _plpUnknownSent = true; } else { if (SqlDbType.Variant == _metaData.SqlDbType) { _stateObj.Parser.WriteSqlVariantHeader(4, 165, 2, _stateObj); } _stateObj.Parser.WriteShort(0, _stateObj); } } if (_plpUnknownSent) { _stateObj.Parser.WriteInt(0, _stateObj); _plpUnknownSent = false; } } internal int SetChars(long fieldOffset, char[] buffer, int bufferOffset, int length) { if (MetaDataUtilsSmi.IsAnsiType(_metaData.SqlDbType)) { if (_encoder == null) { _encoder = _stateObj.Parser._defaultEncoding.GetEncoder(); } byte[] array = new byte[_encoder.GetByteCount(buffer, bufferOffset, length, flush: false)]; _encoder.GetBytes(buffer, bufferOffset, length, array, 0, flush: false); SetBytesNoOffsetHandling(fieldOffset, array, 0, array.Length); } else if (_isPlp) { if (!_plpUnknownSent) { _stateObj.Parser.WriteUnsignedLong(18446744073709551614uL, _stateObj); _plpUnknownSent = true; } _stateObj.Parser.WriteInt(length * 2, _stateObj); _stateObj.Parser.WriteCharArray(buffer, length, bufferOffset, _stateObj); } else if (SqlDbType.Variant == _metaData.SqlDbType) { _stateObj.Parser.WriteSqlVariantValue(new string(buffer, bufferOffset, length), length, 0, _stateObj); } else { _stateObj.Parser.WriteShort(length * 2, _stateObj); _stateObj.Parser.WriteCharArray(buffer, length, bufferOffset, _stateObj); } return length; } internal void SetCharsLength(long length) { if (length == 0L) { if (_isPlp) { _stateObj.Parser.WriteLong(0L, _stateObj); _plpUnknownSent = true; } else { _stateObj.Parser.WriteShort(0, _stateObj); } } if (_plpUnknownSent) { _stateObj.Parser.WriteInt(0, _stateObj); _plpUnknownSent = false; } _encoder = null; } internal void SetString(string value, int offset, int length) { if (MetaDataUtilsSmi.IsAnsiType(_metaData.SqlDbType)) { byte[] bytes; if (offset == 0 && value.Length <= length) { bytes = _stateObj.Parser._defaultEncoding.GetBytes(value); } else { char[] chars = value.ToCharArray(offset, length); bytes = _stateObj.Parser._defaultEncoding.GetBytes(chars); } SetBytes(0L, bytes, 0, bytes.Length); SetBytesLength(bytes.Length); } else if (SqlDbType.Variant == _metaData.SqlDbType) { SqlCollation sqlCollation = new SqlCollation(); sqlCollation.LCID = checked((int)_variantType.LocaleId); sqlCollation.SqlCompareOptions = _variantType.CompareOptions; if (length * 2 > 8000) { byte[] array = ((offset != 0 || value.Length > length) ? _stateObj.Parser._defaultEncoding.GetBytes(value.ToCharArray(offset, length)) : _stateObj.Parser._defaultEncoding.GetBytes(value)); _stateObj.Parser.WriteSqlVariantHeader(9 + array.Length, 167, 7, _stateObj); _stateObj.Parser.WriteUnsignedInt(sqlCollation.info, _stateObj); _stateObj.WriteByte(sqlCollation.sortId); _stateObj.Parser.WriteShort(array.Length, _stateObj); _stateObj.WriteByteArray(array, array.Length, 0); } else { _stateObj.Parser.WriteSqlVariantHeader(9 + length * 2, 231, 7, _stateObj); _stateObj.Parser.WriteUnsignedInt(sqlCollation.info, _stateObj); _stateObj.WriteByte(sqlCollation.sortId); _stateObj.Parser.WriteShort(length * 2, _stateObj); _stateObj.Parser.WriteString(value, length, offset, _stateObj); } _variantType = null; } else if (_isPlp) { _stateObj.Parser.WriteLong(length * 2, _stateObj); _stateObj.Parser.WriteInt(length * 2, _stateObj); _stateObj.Parser.WriteString(value, length, offset, _stateObj); if (length != 0) { _stateObj.Parser.WriteInt(0, _stateObj); } } else { _stateObj.Parser.WriteShort(length * 2, _stateObj); _stateObj.Parser.WriteString(value, length, offset, _stateObj); } } internal void SetInt16(short value) { if (SqlDbType.Variant == _metaData.SqlDbType) { _stateObj.Parser.WriteSqlVariantHeader(4, 52, 0, _stateObj); } else { _stateObj.WriteByte((byte)_metaData.MaxLength); } _stateObj.Parser.WriteShort(value, _stateObj); } internal void SetInt32(int value) { if (SqlDbType.Variant == _metaData.SqlDbType) { _stateObj.Parser.WriteSqlVariantHeader(6, 56, 0, _stateObj); } else { _stateObj.WriteByte((byte)_metaData.MaxLength); } _stateObj.Parser.WriteInt(value, _stateObj); } internal void SetInt64(long value) { if (SqlDbType.Variant == _metaData.SqlDbType) { if (_variantType == null) { _stateObj.Parser.WriteSqlVariantHeader(10, 127, 0, _stateObj); _stateObj.Parser.WriteLong(value, _stateObj); return; } _stateObj.Parser.WriteSqlVariantHeader(10, 60, 0, _stateObj); _stateObj.Parser.WriteInt((int)(value >> 32), _stateObj); _stateObj.Parser.WriteInt((int)value, _stateObj); _variantType = null; } else { _stateObj.WriteByte((byte)_metaData.MaxLength); if (SqlDbType.SmallMoney == _metaData.SqlDbType) { _stateObj.Parser.WriteInt((int)value, _stateObj); } else if (SqlDbType.Money == _metaData.SqlDbType) { _stateObj.Parser.WriteInt((int)(value >> 32), _stateObj); _stateObj.Parser.WriteInt((int)value, _stateObj); } else { _stateObj.Parser.WriteLong(value, _stateObj); } } } internal void SetSingle(float value) { if (SqlDbType.Variant == _metaData.SqlDbType) { _stateObj.Parser.WriteSqlVariantHeader(6, 59, 0, _stateObj); } else { _stateObj.WriteByte((byte)_metaData.MaxLength); } _stateObj.Parser.WriteFloat(value, _stateObj); } internal void SetDouble(double value) { if (SqlDbType.Variant == _metaData.SqlDbType) { _stateObj.Parser.WriteSqlVariantHeader(10, 62, 0, _stateObj); } else { _stateObj.WriteByte((byte)_metaData.MaxLength); } _stateObj.Parser.WriteDouble(value, _stateObj); } internal void SetSqlDecimal(SqlDecimal value) { if (SqlDbType.Variant == _metaData.SqlDbType) { _stateObj.Parser.WriteSqlVariantHeader(21, 108, 2, _stateObj); _stateObj.WriteByte(value.Precision); _stateObj.WriteByte(value.Scale); _stateObj.Parser.WriteSqlDecimal(value, _stateObj); } else { _stateObj.WriteByte(checked((byte)MetaType.MetaDecimal.FixedLength)); _stateObj.Parser.WriteSqlDecimal(SqlDecimal.ConvertToPrecScale(value, _metaData.Precision, _metaData.Scale), _stateObj); } } internal void SetDateTime(DateTime value) { if (SqlDbType.Variant == _metaData.SqlDbType) { if (_variantType != null && _variantType.SqlDbType == SqlDbType.DateTime2) { _stateObj.Parser.WriteSqlVariantDateTime2(value, _stateObj); } else if (_variantType != null && _variantType.SqlDbType == SqlDbType.Date) { _stateObj.Parser.WriteSqlVariantDate(value, _stateObj); } else { TdsDateTime tdsDateTime = MetaType.FromDateTime(value, 8); _stateObj.Parser.WriteSqlVariantHeader(10, 61, 0, _stateObj); _stateObj.Parser.WriteInt(tdsDateTime.days, _stateObj); _stateObj.Parser.WriteInt(tdsDateTime.time, _stateObj); } _variantType = null; return; } _stateObj.WriteByte((byte)_metaData.MaxLength); if (SqlDbType.SmallDateTime == _metaData.SqlDbType) { TdsDateTime tdsDateTime2 = MetaType.FromDateTime(value, (byte)_metaData.MaxLength); _stateObj.Parser.WriteShort(tdsDateTime2.days, _stateObj); _stateObj.Parser.WriteShort(tdsDateTime2.time, _stateObj); return; } if (SqlDbType.DateTime == _metaData.SqlDbType) { TdsDateTime tdsDateTime3 = MetaType.FromDateTime(value, (byte)_metaData.MaxLength); _stateObj.Parser.WriteInt(tdsDateTime3.days, _stateObj); _stateObj.Parser.WriteInt(tdsDateTime3.time, _stateObj); return; } int days = value.Subtract(DateTime.MinValue).Days; if (SqlDbType.DateTime2 == _metaData.SqlDbType) { long value2 = value.TimeOfDay.Ticks / TdsEnums.TICKS_FROM_SCALE[_metaData.Scale]; _stateObj.WriteByteArray(BitConverter.GetBytes(value2), (int)_metaData.MaxLength - 3, 0); } _stateObj.WriteByteArray(BitConverter.GetBytes(days), 3, 0); } internal void SetGuid(Guid value) { byte[] array = value.ToByteArray(); if (SqlDbType.Variant == _metaData.SqlDbType) { _stateObj.Parser.WriteSqlVariantHeader(18, 36, 0, _stateObj); } else { _stateObj.WriteByte((byte)_metaData.MaxLength); } _stateObj.WriteByteArray(array, array.Length, 0); } internal void SetTimeSpan(TimeSpan value) { byte scale; byte b; if (SqlDbType.Variant == _metaData.SqlDbType) { scale = SmiMetaData.DefaultTime.Scale; b = (byte)SmiMetaData.DefaultTime.MaxLength; _stateObj.Parser.WriteSqlVariantHeader(8, 41, 1, _stateObj); _stateObj.WriteByte(scale); } else { scale = _metaData.Scale; b = (byte)_metaData.MaxLength; _stateObj.WriteByte(b); } long value2 = value.Ticks / TdsEnums.TICKS_FROM_SCALE[scale]; _stateObj.WriteByteArray(BitConverter.GetBytes(value2), b, 0); } internal void SetDateTimeOffset(DateTimeOffset value) { byte scale; byte b; if (SqlDbType.Variant == _metaData.SqlDbType) { SmiMetaData defaultDateTimeOffset = SmiMetaData.DefaultDateTimeOffset; scale = MetaType.MetaDateTimeOffset.Scale; b = (byte)defaultDateTimeOffset.MaxLength; _stateObj.Parser.WriteSqlVariantHeader(13, 43, 1, _stateObj); _stateObj.WriteByte(scale); } else { scale = _metaData.Scale; b = (byte)_metaData.MaxLength; _stateObj.WriteByte(b); } DateTime utcDateTime = value.UtcDateTime; long value2 = utcDateTime.TimeOfDay.Ticks / TdsEnums.TICKS_FROM_SCALE[scale]; int days = utcDateTime.Subtract(DateTime.MinValue).Days; short num = (short)value.Offset.TotalMinutes; _stateObj.WriteByteArray(BitConverter.GetBytes(value2), b - 5, 0); _stateObj.WriteByteArray(BitConverter.GetBytes(days), 3, 0); _stateObj.WriteByte((byte)((uint)num & 0xFFu)); _stateObj.WriteByte((byte)((uint)(num >> 8) & 0xFFu)); } internal void SetVariantType(SmiMetaData value) { _variantType = value; } [Conditional("DEBUG")] private void CheckSettingOffset(long offset) { } } internal enum TransactionState { Pending, Active, Aborted, Committed, Unknown } internal enum TransactionType { LocalFromTSQL = 1, LocalFromAPI, Delegated, Distributed, Context } internal sealed class SqlInternalTransaction { internal const long NullTransactionId = 0L; private TransactionState _transactionState; private TransactionType _transactionType; private long _transactionId; private int _openResultCount; private SqlInternalConnection _innerConnection; private bool _disposing; private WeakReference _parent; internal bool RestoreBrokenConnection { get; set; } internal bool ConnectionHasBeenRestored { get; set; } internal bool HasParentTransaction { get { if (TransactionType.LocalFromAPI != _transactionType) { if (TransactionType.LocalFromTSQL == _transactionType) { return _parent != null; } return false; } return true; } } internal bool IsAborted => TransactionState.Aborted == _transactionState; internal bool IsActive => TransactionState.Active == _transactionState; internal bool IsCommitted => TransactionState.Committed == _transactionState; internal bool IsCompleted { get { if (TransactionState.Aborted != _transactionState && TransactionState.Committed != _transactionState) { return TransactionState.Unknown == _transactionState; } return true; } } internal bool IsDelegated => TransactionType.Delegated == _transactionType; internal bool IsDistributed => TransactionType.Distributed == _transactionType; internal bool IsLocal { get { if (TransactionType.LocalFromTSQL != _transactionType) { return TransactionType.LocalFromAPI == _transactionType; } return true; } } internal bool IsOrphaned { get { if (_parent == null) { return false; } if (_parent.Target == null) { return true; } return false; } } internal bool IsZombied => _innerConnection == null; internal int OpenResultsCount => _openResultCount; internal SqlTransaction Parent { get { SqlTransaction result = null; if (_parent != null) { result = (SqlTransaction)_parent.Target; } return result; } } internal long TransactionId { get { return _transactionId; } set { _transactionId = value; } } internal SqlInternalTransaction(SqlInternalConnection innerConnection, TransactionType type, SqlTransaction outerTransaction) : this(innerConnection, type, outerTransaction, 0L) { } internal SqlInternalTransaction(SqlInternalConnection innerConnection, TransactionType type, SqlTransaction outerTransaction, long transactionId) { _innerConnection = innerConnection; _transactionType = type; if (outerTransaction != null) { _parent = new WeakReference(outerTransaction); } _transactionId = transactionId; RestoreBrokenConnection = false; ConnectionHasBeenRestored = false; } internal void Activate() { _transactionState = TransactionState.Active; } private void CheckTransactionLevelAndZombie() { try { if (!IsZombied && GetServerTransactionLevel() == 0) { Zombie(); } } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } Zombie(); } } internal void CloseFromConnection() { SqlInternalConnection innerConnection = _innerConnection; bool flag = true; try { innerConnection.ExecuteTransaction(SqlInternalConnection.TransactionRequest.IfRollback, null, IsolationLevel.Unspecified, null, isDelegateControlRequest: false); } catch (Exception e) { flag = ADP.IsCatchableExceptionType(e); throw; } finally { if (flag) { Zombie(); } } } internal void Commit() { if (_innerConnection.IsLockedForBulkCopy) { throw SQL.ConnectionLockedForBcpEvent(); } _innerConnection.ValidateConnectionForExecute(null); try { _innerConnection.ExecuteTransaction(SqlInternalConnection.TransactionRequest.Commit, null, IsolationLevel.Unspecified, null, isDelegateControlRequest: false); ZombieParent(); } catch (Exception e) { if (ADP.IsCatchableExceptionType(e)) { CheckTransactionLevelAndZombie(); } throw; } } internal void Completed(TransactionState transactionState) { _transactionState = transactionState; Zombie(); } internal int DecrementAndObtainOpenResultCount() { int num = Interlocked.Decrement(ref _openResultCount); if (num < 0) { throw SQL.OpenResultCountExceeded(); } return num; } internal void Dispose() { Dispose(disposing: true); GC.SuppressFinalize(this); } private void Dispose(bool disposing) { if (disposing && _innerConnection != null) { _disposing = true; Rollback(); } } private int GetServerTransactionLevel() { using SqlCommand sqlCommand = new SqlCommand("set @out = @@trancount", (SqlConnection)_innerConnection.Owner); sqlCommand.Transaction = Parent; SqlParameter sqlParameter = new SqlParameter("@out", SqlDbType.Int); sqlParameter.Direction = ParameterDirection.Output; sqlCommand.Parameters.Add(sqlParameter); sqlCommand.RunExecuteReader(CommandBehavior.Default, RunBehavior.UntilDone, returnStream: false, "GetServerTransactionLevel"); return (int)sqlParameter.Value; } internal int IncrementAndObtainOpenResultCount() { int num = Interlocked.Increment(ref _openResultCount); if (num < 0) { throw SQL.OpenResultCountExceeded(); } return num; } internal void InitParent(SqlTransaction transaction) { _parent = new WeakReference(transaction); } internal void Rollback() { if (_innerConnection.IsLockedForBulkCopy) { throw SQL.ConnectionLockedForBcpEvent(); } _innerConnection.ValidateConnectionForExecute(null); try { _innerConnection.ExecuteTransaction(SqlInternalConnection.TransactionRequest.IfRollback, null, IsolationLevel.Unspecified, null, isDelegateControlRequest: false); Zombie(); } catch (Exception e) { if (ADP.IsCatchableExceptionType(e)) { CheckTransactionLevelAndZombie(); if (!_disposing) { throw; } return; } throw; } } internal void Rollback(string transactionName) { if (_innerConnection.IsLockedForBulkCopy) { throw SQL.ConnectionLockedForBcpEvent(); } _innerConnection.ValidateConnectionForExecute(null); if (string.IsNullOrEmpty(transactionName)) { throw SQL.NullEmptyTransactionName(); } try { _innerConnection.ExecuteTransaction(SqlInternalConnection.TransactionRequest.Rollback, transactionName, IsolationLevel.Unspecified, null, isDelegateControlRequest: false); } catch (Exception e) { if (ADP.IsCatchableExceptionType(e)) { CheckTransactionLevelAndZombie(); } throw; } } internal void Save(string savePointName) { _innerConnection.ValidateConnectionForExecute(null); if (string.IsNullOrEmpty(savePointName)) { throw SQL.NullEmptyTransactionName(); } try { _innerConnection.ExecuteTransaction(SqlInternalConnection.TransactionRequest.Save, savePointName, IsolationLevel.Unspecified, null, isDelegateControlRequest: false); } catch (Exception e) { if (ADP.IsCatchableExceptionType(e)) { CheckTransactionLevelAndZombie(); } throw; } } internal void Zombie() { ZombieParent(); SqlInternalConnection innerConnection = _innerConnection; _innerConnection = null; innerConnection?.DisconnectTransaction(this); } private void ZombieParent() { if (_parent != null) { ((SqlTransaction)_parent.Target)?.Zombie(); _parent = null; } } } internal sealed class SqlMetaDataFactory : DbMetaDataFactory { private const string _serverVersionNormalized90 = "09.00.0000"; private const string _serverVersionNormalized90782 = "09.00.0782"; private const string _serverVersionNormalized10 = "10.00.0000"; public SqlMetaDataFactory(Stream XMLStream, string serverVersion, string serverVersionNormalized) : base(XMLStream, serverVersion, serverVersionNormalized) { } private void addUDTsToDataTypesTable(DataTable dataTypesTable, SqlConnection connection, string ServerVersion) { if (0 > string.Compare(ServerVersion, "09.00.0000", StringComparison.OrdinalIgnoreCase)) { return; } SqlCommand sqlCommand = connection.CreateCommand(); sqlCommand.CommandText = "select assemblies.name, types.assembly_class, ASSEMBLYPROPERTY(assemblies.name, 'VersionMajor') as version_major, ASSEMBLYPROPERTY(assemblies.name, 'VersionMinor') as version_minor, ASSEMBLYPROPERTY(assemblies.name, 'VersionBuild') as version_build, ASSEMBLYPROPERTY(assemblies.name, 'VersionRevision') as version_revision, ASSEMBLYPROPERTY(assemblies.name, 'CultureInfo') as culture_info, ASSEMBLYPROPERTY(assemblies.name, 'PublicKey') as public_key, is_nullable, is_fixed_length, max_length from sys.assemblies as assemblies join sys.assembly_types as types on assemblies.assembly_id = types.assembly_id "; DataRow dataRow = null; DataColumn dataColumn = dataTypesTable.Columns[DbMetaDataColumnNames.ProviderDbType]; DataColumn dataColumn2 = dataTypesTable.Columns[DbMetaDataColumnNames.ColumnSize]; DataColumn dataColumn3 = dataTypesTable.Columns[DbMetaDataColumnNames.IsFixedLength]; DataColumn dataColumn4 = dataTypesTable.Columns[DbMetaDataColumnNames.IsSearchable]; DataColumn dataColumn5 = dataTypesTable.Columns[DbMetaDataColumnNames.IsLiteralSupported]; DataColumn dataColumn6 = dataTypesTable.Columns[DbMetaDataColumnNames.TypeName]; DataColumn dataColumn7 = dataTypesTable.Columns[DbMetaDataColumnNames.IsNullable]; if (dataColumn == null || dataColumn2 == null || dataColumn3 == null || dataColumn4 == null || dataColumn5 == null || dataColumn6 == null || dataColumn7 == null) { throw ADP.InvalidXml(); } using IDataReader dataReader = sqlCommand.ExecuteReader(); object[] array = new object[11]; while (dataReader.Read()) { dataReader.GetValues(array); dataRow = dataTypesTable.NewRow(); dataRow[dataColumn] = SqlDbType.Udt; if (array[10] != DBNull.Value) { dataRow[dataColumn2] = array[10]; } if (array[9] != DBNull.Value) { dataRow[dataColumn3] = array[9]; } dataRow[dataColumn4] = true; dataRow[dataColumn5] = false; if (array[8] != DBNull.Value) { dataRow[dataColumn7] = array[8]; } if (array[0] == DBNull.Value || array[1] == DBNull.Value || array[2] == DBNull.Value || array[3] == DBNull.Value || array[4] == DBNull.Value || array[5] == DBNull.Value) { continue; } StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(array[1].ToString()); stringBuilder.Append(", "); stringBuilder.Append(array[0].ToString()); stringBuilder.Append(", Version="); stringBuilder.Append(array[2].ToString()); stringBuilder.Append("."); stringBuilder.Append(array[3].ToString()); stringBuilder.Append("."); stringBuilder.Append(array[4].ToString()); stringBuilder.Append("."); stringBuilder.Append(array[5].ToString()); if (array[6] != DBNull.Value) { stringBuilder.Append(", Culture="); stringBuilder.Append(array[6].ToString()); } if (array[7] != DBNull.Value) { stringBuilder.Append(", PublicKeyToken="); StringBuilder stringBuilder2 = new StringBuilder(); byte[] array2 = (byte[])array[7]; foreach (byte b in array2) { stringBuilder2.Append(string.Format(null, "{0,-2:x2}", b)); } stringBuilder.Append(stringBuilder2.ToString()); } dataRow[dataColumn6] = stringBuilder.ToString(); dataTypesTable.Rows.Add(dataRow); dataRow.AcceptChanges(); } } private void AddTVPsToDataTypesTable(DataTable dataTypesTable, SqlConnection connection, string ServerVersion) { if (0 > string.Compare(ServerVersion, "10.00.0000", StringComparison.OrdinalIgnoreCase)) { return; } SqlCommand sqlCommand = connection.CreateCommand(); sqlCommand.CommandText = "select name, is_nullable, max_length from sys.types where is_table_type = 1"; DataRow dataRow = null; DataColumn dataColumn = dataTypesTable.Columns[DbMetaDataColumnNames.ProviderDbType]; DataColumn dataColumn2 = dataTypesTable.Columns[DbMetaDataColumnNames.ColumnSize]; DataColumn dataColumn3 = dataTypesTable.Columns[DbMetaDataColumnNames.IsSearchable]; DataColumn dataColumn4 = dataTypesTable.Columns[DbMetaDataColumnNames.IsLiteralSupported]; DataColumn dataColumn5 = dataTypesTable.Columns[DbMetaDataColumnNames.TypeName]; DataColumn dataColumn6 = dataTypesTable.Columns[DbMetaDataColumnNames.IsNullable]; if (dataColumn == null || dataColumn2 == null || dataColumn3 == null || dataColumn4 == null || dataColumn5 == null || dataColumn6 == null) { throw ADP.InvalidXml(); } using IDataReader dataReader = sqlCommand.ExecuteReader(); object[] array = new object[11]; while (dataReader.Read()) { dataReader.GetValues(array); dataRow = dataTypesTable.NewRow(); dataRow[dataColumn] = SqlDbType.Structured; if (array[2] != DBNull.Value) { dataRow[dataColumn2] = array[2]; } dataRow[dataColumn3] = false; dataRow[dataColumn4] = false; if (array[1] != DBNull.Value) { dataRow[dataColumn6] = array[1]; } if (array[0] != DBNull.Value) { dataRow[dataColumn5] = array[0]; dataTypesTable.Rows.Add(dataRow); dataRow.AcceptChanges(); } } } private DataTable GetDataTypesTable(SqlConnection connection) { DataTable dataTable = base.CollectionDataSet.Tables[DbMetaDataCollectionNames.DataTypes]; if (dataTable == null) { throw ADP.UnableToBuildCollection(DbMetaDataCollectionNames.DataTypes); } dataTable = CloneAndFilterCollection(DbMetaDataCollectionNames.DataTypes, null); addUDTsToDataTypesTable(dataTable, connection, base.ServerVersionNormalized); AddTVPsToDataTypesTable(dataTable, connection, base.ServerVersionNormalized); dataTable.AcceptChanges(); return dataTable; } protected override DataTable PrepareCollection(string collectionName, string[] restrictions, DbConnection connection) { SqlConnection connection2 = (SqlConnection)connection; DataTable dataTable = null; if (collectionName == DbMetaDataCollectionNames.DataTypes) { if (!ADP.IsEmptyArray(restrictions)) { throw ADP.TooManyRestrictions(DbMetaDataCollectionNames.DataTypes); } dataTable = GetDataTypesTable(connection2); } if (dataTable == null) { throw ADP.UnableToBuildCollection(collectionName); } return dataTable; } } [Serializable] public sealed class SqlClientPermission : DBDataPermission { [Obsolete("SqlClientPermission() has been deprecated. Use the SqlClientPermission(PermissionState.None) constructor. http://go.microsoft.com/fwlink/?linkid=14202", true)] public SqlClientPermission() : this(PermissionState.None) { } public SqlClientPermission(PermissionState state) : base(state) { } [Obsolete("SqlClientPermission(PermissionState state, Boolean allowBlankPassword) has been deprecated. Use the SqlClientPermission(PermissionState.None) constructor. http://go.microsoft.com/fwlink/?linkid=14202", true)] public SqlClientPermission(PermissionState state, bool allowBlankPassword) : this(state) { base.AllowBlankPassword = allowBlankPassword; } private SqlClientPermission(SqlClientPermission permission) : base(permission) { } internal SqlClientPermission(SqlClientPermissionAttribute permissionAttribute) : base(permissionAttribute) { } internal SqlClientPermission(SqlConnectionString constr) : base(constr) { if (constr == null || constr.IsEmpty) { base.Add(ADP.StrEmpty, ADP.StrEmpty, KeyRestrictionBehavior.AllowOnly); } } public override void Add(string connectionString, string restrictions, KeyRestrictionBehavior behavior) { DBConnectionString entry = new DBConnectionString(connectionString, restrictions, behavior, SqlConnectionString.GetParseSynonyms(), useOdbcRules: false); AddPermissionEntry(entry); } public override IPermission Copy() { return (IPermission)(object)new SqlClientPermission(this); } } [Serializable] [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Constructor | AttributeTargets.Method, AllowMultiple = true, Inherited = false)] public sealed class SqlClientPermissionAttribute : DBDataPermissionAttribute { public SqlClientPermissionAttribute(SecurityAction action) : base(action) { } public override IPermission CreatePermission() { return (IPermission)(object)new SqlClientPermission(this); } } [ClassInterface(ClassInterfaceType.None)] [Guid("afef65ad-4577-447a-a148-83acadd3d4b9")] [ComVisible(true)] public sealed class SQLDebugging { [MonoTODO] public SQLDebugging() { throw new NotImplementedException(); } } [Serializable] public sealed class SqlCredential { private string uid = ""; private SecureString pwd; public string UserId => uid; public SecureString Password => pwd; public SqlCredential(string userId, SecureString password) { if (userId == null) { throw new ArgumentNullException("userId"); } if (password == null) { throw new ArgumentNullException("password"); } uid = userId; pwd = password; } } public enum SqlConnectionColumnEncryptionSetting { Disabled, Enabled } public enum SqlAuthenticationMethod { NotSpecified, SqlPassword, ActiveDirectoryPassword, ActiveDirectoryIntegrated } public enum SqlCommandColumnEncryptionSetting { UseConnectionSetting, Enabled, ResultSetOnly, Disabled } public enum PoolBlockingPeriod { Auto, AlwaysBlock, NeverBlock } } namespace System.Data.SqlClient.SNI { internal class LocalDB { internal static string GetLocalDBConnectionString(string localDbInstance) { throw new PlatformNotSupportedException("LocalDB is not supported on this platform."); } } internal delegate void SNIAsyncCallback(SNIPacket packet, uint sniErrorCode); internal enum SNIProviders { HTTP_PROV, NP_PROV, SESSION_PROV, SIGN_PROV, SM_PROV, SMUX_PROV, SSL_PROV, TCP_PROV, MAX_PROVS, INVALID_PROV } internal class SNISMUXHeader { public const int HEADER_LENGTH = 16; public byte SMID; public byte flags; public ushort sessionId; public uint length; public uint sequenceNumber; public uint highwater; } [Flags] internal enum SNISMUXFlags { SMUX_SYN = 1, SMUX_ACK = 2, SMUX_FIN = 4, SMUX_DATA = 8 } internal class SNICommon { internal const int ConnTerminatedError = 2; internal const int InvalidParameterError = 5; internal const int ProtocolNotSupportedError = 8; internal const int ConnTimeoutError = 11; internal const int ConnNotUsableError = 19; internal const int InvalidConnStringError = 25; internal const int HandshakeFailureError = 31; internal const int InternalExceptionError = 35; internal const int ConnOpenFailedError = 40; internal const int ErrorSpnLookup = 44; internal const int LocalDBErrorCode = 50; internal const int MultiSubnetFailoverWithMoreThan64IPs = 47; internal const int MultiSubnetFailoverWithInstanceSpecified = 48; internal const int MultiSubnetFailoverWithNonTcpProtocol = 49; internal const int MaxErrorValue = 50157; internal const int LocalDBNoInstanceName = 51; internal const int LocalDBNoInstallation = 52; internal const int LocalDBInvalidConfig = 53; internal const int LocalDBNoSqlUserInstanceDllPath = 54; internal const int LocalDBInvalidSqlUserInstanceDllPath = 55; internal const int LocalDBFailedToLoadDll = 56; internal const int LocalDBBadRuntime = 57; internal static bool ValidateSslServerCertificate(string targetServerName, object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors) { if (policyErrors == SslPolicyErrors.None) { return true; } if ((policyErrors & SslPolicyErrors.RemoteCertificateNameMismatch) != 0) { string text = cert.Subject.Substring(cert.Subject.IndexOf('=') + 1); if (targetServerName.Length > text.Length) { return false; } if (targetServerName.Length == text.Length) { if (!targetServerName.Equals(text, StringComparison.OrdinalIgnoreCase)) { return false; } } else { if (string.Compare(targetServerName, 0, text, 0, targetServerName.Length, StringComparison.OrdinalIgnoreCase) != 0) { return false; } if (text[targetServerName.Length] != '.') { return false; } } return true; } return false; } internal static uint ReportSNIError(SNIProviders provider, uint nativeError, uint sniError, string errorMessage) { return ReportSNIError(new SNIError(provider, nativeError, sniError, errorMessage)); } internal static uint ReportSNIError(SNIProviders provider, uint sniError, Exception sniException) { return ReportSNIError(new SNIError(provider, sniError, sniException)); } internal static uint ReportSNIError(SNIError error) { SNILoadHandle.SingletonInstance.LastError = error; return 1u; } } internal class SNIError { public readonly SNIProviders provider; public readonly string errorMessage; public readonly uint nativeError; public readonly uint sniError; public readonly string function; public readonly uint lineNumber; public readonly Exception exception; public SNIError(SNIProviders provider, uint nativeError, uint sniErrorCode, string errorMessage) { lineNumber = 0u; function = string.Empty; this.provider = provider; this.nativeError = nativeError; sniError = sniErrorCode; this.errorMessage = errorMessage; exception = null; } public SNIError(SNIProviders provider, uint sniErrorCode, Exception sniException) { lineNumber = 0u; function = string.Empty; this.provider = provider; nativeError = 0u; sniError = sniErrorCode; errorMessage = string.Empty; exception = sniException; } } internal abstract class SNIHandle { public abstract uint Status { get; } public abstract Guid ConnectionId { get; } public abstract void Dispose(); public abstract void SetAsyncCallbacks(SNIAsyncCallback receiveCallback, SNIAsyncCallback sendCallback); public abstract void SetBufferSize(int bufferSize); public abstract uint Send(SNIPacket packet); public abstract uint SendAsync(SNIPacket packet, SNIAsyncCallback callback = null); public abstract uint Receive(out SNIPacket packet, int timeoutInMilliseconds); public abstract uint ReceiveAsync(ref SNIPacket packet); public abstract uint EnableSsl(uint options); public abstract void DisableSsl(); public abstract uint CheckConnection(); } internal class SNILoadHandle { public static readonly SNILoadHandle SingletonInstance = new SNILoadHandle(); public readonly EncryptionOptions _encryptionOption; public ThreadLocal _lastError = new ThreadLocal(() => new SNIError(SNIProviders.INVALID_PROV, 0u, 0u, string.Empty)); private readonly uint _status; public SNIError LastError { get { return _lastError.Value; } set { _lastError.Value = value; } } public uint Status => _status; public EncryptionOptions Options => _encryptionOption; } internal class SNIMarsConnection { private readonly Guid _connectionId = Guid.NewGuid(); private readonly Dictionary _sessions = new Dictionary(); private readonly byte[] _headerBytes = new byte[16]; private SNIHandle _lowerHandle; private ushort _nextSessionId; private int _currentHeaderByteCount; private int _dataBytesLeft; private SNISMUXHeader _currentHeader; private SNIPacket _currentPacket; public Guid ConnectionId => _connectionId; public SNIMarsConnection(SNIHandle lowerHandle) { _lowerHandle = lowerHandle; _lowerHandle.SetAsyncCallbacks(HandleReceiveComplete, HandleSendComplete); } public SNIMarsHandle CreateMarsSession(object callbackObject, bool async) { lock (this) { ushort num = _nextSessionId++; SNIMarsHandle sNIMarsHandle = new SNIMarsHandle(this, num, callbackObject, async); _sessions.Add(num, sNIMarsHandle); return sNIMarsHandle; } } public uint StartReceive() { SNIPacket packet = null; if (ReceiveAsync(ref packet) == 997) { return 997u; } return SNICommon.ReportSNIError(SNIProviders.SMUX_PROV, 0u, 19u, string.Empty); } public uint Send(SNIPacket packet) { lock (this) { return _lowerHandle.Send(packet); } } public uint SendAsync(SNIPacket packet, SNIAsyncCallback callback) { lock (this) { return _lowerHandle.SendAsync(packet, callback); } } public uint ReceiveAsync(ref SNIPacket packet) { lock (this) { return _lowerHandle.ReceiveAsync(ref packet); } } public uint CheckConnection() { lock (this) { return _lowerHandle.CheckConnection(); } } public void HandleReceiveError(SNIPacket packet) { foreach (SNIMarsHandle value in _sessions.Values) { value.HandleReceiveError(packet); } } public void HandleSendComplete(SNIPacket packet, uint sniErrorCode) { packet.InvokeCompletionCallback(sniErrorCode); } public void HandleReceiveComplete(SNIPacket packet, uint sniErrorCode) { SNISMUXHeader sNISMUXHeader = null; SNIPacket packet2 = null; SNIMarsHandle sNIMarsHandle = null; if (sniErrorCode != 0) { lock (this) { HandleReceiveError(packet); return; } } while (true) { lock (this) { if (_currentHeaderByteCount != 16) { sNISMUXHeader = null; packet2 = null; sNIMarsHandle = null; while (_currentHeaderByteCount != 16) { int num = packet.TakeData(_headerBytes, _currentHeaderByteCount, 16 - _currentHeaderByteCount); _currentHeaderByteCount += num; if (num == 0) { sniErrorCode = ReceiveAsync(ref packet); if (sniErrorCode != 997) { HandleReceiveError(packet); } return; } } _currentHeader = new SNISMUXHeader { SMID = _headerBytes[0], flags = _headerBytes[1], sessionId = BitConverter.ToUInt16(_headerBytes, 2), length = BitConverter.ToUInt32(_headerBytes, 4) - 16, sequenceNumber = BitConverter.ToUInt32(_headerBytes, 8), highwater = BitConverter.ToUInt32(_headerBytes, 12) }; _dataBytesLeft = (int)_currentHeader.length; _currentPacket = new SNIPacket(null); _currentPacket.Allocate((int)_currentHeader.length); } sNISMUXHeader = _currentHeader; packet2 = _currentPacket; if (_currentHeader.flags == 8 && _dataBytesLeft > 0) { int num2 = packet.TakeData(_currentPacket, _dataBytesLeft); _dataBytesLeft -= num2; if (_dataBytesLeft > 0) { sniErrorCode = ReceiveAsync(ref packet); if (sniErrorCode != 997) { HandleReceiveError(packet); } break; } } _currentHeaderByteCount = 0; if (!_sessions.ContainsKey(_currentHeader.sessionId)) { SNILoadHandle.SingletonInstance.LastError = new SNIError(SNIProviders.SMUX_PROV, 0u, 5u, string.Empty); HandleReceiveError(packet); _lowerHandle.Dispose(); _lowerHandle = null; break; } if (_currentHeader.flags == 4) { _sessions.Remove(_currentHeader.sessionId); } else { sNIMarsHandle = _sessions[_currentHeader.sessionId]; } } if (sNISMUXHeader.flags == 8) { sNIMarsHandle.HandleReceiveComplete(packet2, sNISMUXHeader); } if (_currentHeader.flags == 2) { try { sNIMarsHandle.HandleAck(sNISMUXHeader.highwater); } catch (Exception sniException) { SNICommon.ReportSNIError(SNIProviders.SMUX_PROV, 35u, sniException); } } lock (this) { if (packet.DataLeft == 0) { sniErrorCode = ReceiveAsync(ref packet); if (sniErrorCode != 997) { HandleReceiveError(packet); } break; } } } } public uint EnableSsl(uint options) { return _lowerHandle.EnableSsl(options); } public void DisableSsl() { _lowerHandle.DisableSsl(); } } internal class SNIMarsHandle : SNIHandle { private const uint ACK_THRESHOLD = 2u; private readonly SNIMarsConnection _connection; private readonly uint _status = uint.MaxValue; private readonly Queue _receivedPacketQueue = new Queue(); private readonly Queue _sendPacketQueue = new Queue(); private readonly object _callbackObject; private readonly Guid _connectionId = Guid.NewGuid(); private readonly ushort _sessionId; private readonly ManualResetEventSlim _packetEvent = new ManualResetEventSlim(initialState: false); private readonly ManualResetEventSlim _ackEvent = new ManualResetEventSlim(initialState: false); private readonly SNISMUXHeader _currentHeader = new SNISMUXHeader(); private uint _sendHighwater = 4u; private int _asyncReceives; private uint _receiveHighwater = 4u; private uint _receiveHighwaterLastAck = 4u; private uint _sequenceNumber; private SNIError _connectionError; public override Guid ConnectionId => _connectionId; public override uint Status => _status; public override void Dispose() { try { SendControlPacket(SNISMUXFlags.SMUX_FIN); } catch (Exception sniException) { SNICommon.ReportSNIError(SNIProviders.SMUX_PROV, 35u, sniException); throw; } } public SNIMarsHandle(SNIMarsConnection connection, ushort sessionId, object callbackObject, bool async) { _sessionId = sessionId; _connection = connection; _callbackObject = callbackObject; SendControlPacket(SNISMUXFlags.SMUX_SYN); _status = 0u; } private void SendControlPacket(SNISMUXFlags flags) { byte[] headerBytes = null; lock (this) { GetSMUXHeaderBytes(0, (byte)flags, ref headerBytes); } SNIPacket sNIPacket = new SNIPacket(null); sNIPacket.SetData(headerBytes, 16); _connection.Send(sNIPacket); } private void GetSMUXHeaderBytes(int length, byte flags, ref byte[] headerBytes) { headerBytes = new byte[16]; _currentHeader.SMID = 83; _currentHeader.flags = flags; _currentHeader.sessionId = _sessionId; _currentHeader.length = (uint)(16 + length); _currentHeader.sequenceNumber = ((flags == 4 || flags == 2) ? (_sequenceNumber - 1) : _sequenceNumber++); _currentHeader.highwater = _receiveHighwater; _receiveHighwaterLastAck = _currentHeader.highwater; BitConverter.GetBytes(_currentHeader.SMID).CopyTo(headerBytes, 0); BitConverter.GetBytes(_currentHeader.flags).CopyTo(headerBytes, 1); BitConverter.GetBytes(_currentHeader.sessionId).CopyTo(headerBytes, 2); BitConverter.GetBytes(_currentHeader.length).CopyTo(headerBytes, 4); BitConverter.GetBytes(_currentHeader.sequenceNumber).CopyTo(headerBytes, 8); BitConverter.GetBytes(_currentHeader.highwater).CopyTo(headerBytes, 12); } private SNIPacket GetSMUXEncapsulatedPacket(SNIPacket packet) { uint sequenceNumber = _sequenceNumber; byte[] headerBytes = null; GetSMUXHeaderBytes(packet.Length, 8, ref headerBytes); SNIPacket sNIPacket = new SNIPacket(null); sNIPacket.Description = string.Format("({0}) SMUX packet {1}", (packet.Description == null) ? "" : packet.Description, sequenceNumber); sNIPacket.Allocate(16 + packet.Length); sNIPacket.AppendData(headerBytes, 16); sNIPacket.AppendPacket(packet); return sNIPacket; } public override uint Send(SNIPacket packet) { while (true) { lock (this) { if (_sequenceNumber < _sendHighwater) { break; } } _ackEvent.Wait(); lock (this) { _ackEvent.Reset(); } } return _connection.Send(GetSMUXEncapsulatedPacket(packet)); } private uint InternalSendAsync(SNIPacket packet, SNIAsyncCallback callback) { SNIPacket sNIPacket = null; lock (this) { if (_sequenceNumber >= _sendHighwater) { return 1048576u; } sNIPacket = GetSMUXEncapsulatedPacket(packet); if (callback != null) { sNIPacket.SetCompletionCallback(callback); } else { sNIPacket.SetCompletionCallback(HandleSendComplete); } return _connection.SendAsync(sNIPacket, callback); } } private uint SendPendingPackets() { SNIMarsQueuedPacket sNIMarsQueuedPacket = null; while (true) { lock (this) { if (_sequenceNumber >= _sendHighwater) { break; } if (_sendPacketQueue.Count != 0) { sNIMarsQueuedPacket = _sendPacketQueue.Peek(); uint num = InternalSendAsync(sNIMarsQueuedPacket.Packet, sNIMarsQueuedPacket.Callback); if (num != 0 && num != 997) { return num; } _sendPacketQueue.Dequeue(); continue; } _ackEvent.Set(); } break; } return 0u; } public override uint SendAsync(SNIPacket packet, SNIAsyncCallback callback = null) { lock (this) { _sendPacketQueue.Enqueue(new SNIMarsQueuedPacket(packet, (callback != null) ? callback : new SNIAsyncCallback(HandleSendComplete))); } SendPendingPackets(); return 997u; } public override uint ReceiveAsync(ref SNIPacket packet) { lock (_receivedPacketQueue) { int count = _receivedPacketQueue.Count; if (_connectionError != null) { return SNICommon.ReportSNIError(_connectionError); } if (count == 0) { _asyncReceives++; return 997u; } packet = _receivedPacketQueue.Dequeue(); if (count == 1) { _packetEvent.Reset(); } } lock (this) { _receiveHighwater++; } SendAckIfNecessary(); return 0u; } public void HandleReceiveError(SNIPacket packet) { lock (_receivedPacketQueue) { _connectionError = SNILoadHandle.SingletonInstance.LastError; _packetEvent.Set(); } ((TdsParserStateObject)_callbackObject).ReadAsyncCallback(packet, 1u); } public void HandleSendComplete(SNIPacket packet, uint sniErrorCode) { lock (this) { ((TdsParserStateObject)_callbackObject).WriteAsyncCallback(packet, sniErrorCode); } } public void HandleAck(uint highwater) { lock (this) { if (_sendHighwater != highwater) { _sendHighwater = highwater; SendPendingPackets(); } } } public void HandleReceiveComplete(SNIPacket packet, SNISMUXHeader header) { lock (this) { if (_sendHighwater != header.highwater) { HandleAck(header.highwater); } lock (_receivedPacketQueue) { if (_asyncReceives == 0) { _receivedPacketQueue.Enqueue(packet); _packetEvent.Set(); return; } _asyncReceives--; ((TdsParserStateObject)_callbackObject).ReadAsyncCallback(packet, 0u); } } lock (this) { _receiveHighwater++; } SendAckIfNecessary(); } private void SendAckIfNecessary() { uint receiveHighwater; uint receiveHighwaterLastAck; lock (this) { receiveHighwater = _receiveHighwater; receiveHighwaterLastAck = _receiveHighwaterLastAck; } if (receiveHighwater - receiveHighwaterLastAck > 2) { SendControlPacket(SNISMUXFlags.SMUX_ACK); } } public override uint Receive(out SNIPacket packet, int timeoutInMilliseconds) { packet = null; uint num = 997u; do { lock (_receivedPacketQueue) { if (_connectionError != null) { return SNICommon.ReportSNIError(_connectionError); } int count = _receivedPacketQueue.Count; if (count > 0) { packet = _receivedPacketQueue.Dequeue(); if (count == 1) { _packetEvent.Reset(); } num = 0u; } } if (num == 0) { lock (this) { _receiveHighwater++; } SendAckIfNecessary(); return num; } } while (_packetEvent.Wait(timeoutInMilliseconds)); SNILoadHandle.SingletonInstance.LastError = new SNIError(SNIProviders.SMUX_PROV, 0u, 11u, string.Empty); return 258u; } public override uint CheckConnection() { return _connection.CheckConnection(); } public override void SetAsyncCallbacks(SNIAsyncCallback receiveCallback, SNIAsyncCallback sendCallback) { } public override void SetBufferSize(int bufferSize) { } public override uint EnableSsl(uint options) { return _connection.EnableSsl(options); } public override void DisableSsl() { _connection.DisableSsl(); } } internal class SNIMarsQueuedPacket { private SNIPacket _packet; private SNIAsyncCallback _callback; public SNIPacket Packet { get { return _packet; } set { _packet = value; } } public SNIAsyncCallback Callback { get { return _callback; } set { _callback = value; } } public SNIMarsQueuedPacket(SNIPacket packet, SNIAsyncCallback callback) { _packet = packet; _callback = callback; } } internal class SNINpHandle : SNIHandle { internal const string DefaultPipePath = "sql\\query"; private const int MAX_PIPE_INSTANCES = 255; private readonly string _targetServer; private readonly object _callbackObject; private readonly TaskScheduler _writeScheduler; private readonly TaskFactory _writeTaskFactory; private Stream _stream; private NamedPipeClientStream _pipeStream; private SslOverTdsStream _sslOverTdsStream; private SslStream _sslStream; private SNIAsyncCallback _receiveCallback; private SNIAsyncCallback _sendCallback; private bool _validateCert = true; private readonly uint _status = uint.MaxValue; private int _bufferSize = 4096; private readonly Guid _connectionId = Guid.NewGuid(); public override Guid ConnectionId => _connectionId; public override uint Status => _status; public SNINpHandle(string serverName, string pipeName, long timerExpire, object callbackObject) { _targetServer = serverName; _callbackObject = callbackObject; _writeScheduler = new ConcurrentExclusiveSchedulerPair().ExclusiveScheduler; _writeTaskFactory = new TaskFactory(_writeScheduler); try { _pipeStream = new NamedPipeClientStream(serverName, pipeName, PipeDirection.InOut, PipeOptions.WriteThrough | PipeOptions.Asynchronous); if (long.MaxValue == timerExpire) { _pipeStream.Connect(-1); } else { TimeSpan timeSpan = DateTime.FromFileTime(timerExpire) - DateTime.Now; timeSpan = ((timeSpan.Ticks < 0) ? TimeSpan.FromTicks(0L) : timeSpan); _pipeStream.Connect((int)timeSpan.TotalMilliseconds); } } catch (TimeoutException sniException) { SNICommon.ReportSNIError(SNIProviders.NP_PROV, 40u, sniException); _status = 1u; return; } catch (IOException sniException2) { SNICommon.ReportSNIError(SNIProviders.NP_PROV, 40u, sniException2); _status = 1u; return; } if (!_pipeStream.IsConnected || !_pipeStream.CanWrite || !_pipeStream.CanRead) { SNICommon.ReportSNIError(SNIProviders.NP_PROV, 0u, 40u, string.Empty); _status = 1u; return; } _sslOverTdsStream = new SslOverTdsStream(_pipeStream); _sslStream = new SslStream(_sslOverTdsStream, leaveInnerStreamOpen: true, ValidateServerCertificate, null); _stream = _pipeStream; _status = 0u; } public override uint CheckConnection() { if (!_stream.CanWrite || !_stream.CanRead) { return 1u; } return 0u; } public override void Dispose() { lock (this) { if (_sslOverTdsStream != null) { _sslOverTdsStream.Dispose(); _sslOverTdsStream = null; } if (_sslStream != null) { _sslStream.Dispose(); _sslStream = null; } if (_pipeStream != null) { _pipeStream.Dispose(); _pipeStream = null; } _stream = null; } } public override uint Receive(out SNIPacket packet, int timeout) { lock (this) { packet = null; try { packet = new SNIPacket(null); packet.Allocate(_bufferSize); packet.ReadFromStream(_stream); if (packet.Length == 0) { Win32Exception ex = new Win32Exception(); return ReportErrorAndReleasePacket(packet, (uint)ex.NativeErrorCode, 0u, ex.Message); } } catch (ObjectDisposedException sniException) { return ReportErrorAndReleasePacket(packet, sniException); } catch (IOException sniException2) { return ReportErrorAndReleasePacket(packet, sniException2); } return 0u; } } public override uint ReceiveAsync(ref SNIPacket packet) { lock (this) { packet = new SNIPacket(null); packet.Allocate(_bufferSize); try { packet.ReadFromStreamAsync(_stream, _receiveCallback); return 997u; } catch (ObjectDisposedException sniException) { return ReportErrorAndReleasePacket(packet, sniException); } catch (IOException sniException2) { return ReportErrorAndReleasePacket(packet, sniException2); } } } public override uint Send(SNIPacket packet) { lock (this) { try { packet.WriteToStream(_stream); return 0u; } catch (ObjectDisposedException sniException) { return ReportErrorAndReleasePacket(packet, sniException); } catch (IOException sniException2) { return ReportErrorAndReleasePacket(packet, sniException2); } } } public override uint SendAsync(SNIPacket packet, SNIAsyncCallback callback = null) { _ = packet; _writeTaskFactory.StartNew(delegate { try { lock (this) { packet.WriteToStream(_stream); } } catch (Exception sniException) { SNICommon.ReportSNIError(SNIProviders.NP_PROV, 35u, sniException); if (callback != null) { callback(packet, 1u); } else { _sendCallback(packet, 1u); } return; } if (callback != null) { callback(packet, 0u); } else { _sendCallback(packet, 0u); } }); return 997u; } public override void SetAsyncCallbacks(SNIAsyncCallback receiveCallback, SNIAsyncCallback sendCallback) { _receiveCallback = receiveCallback; _sendCallback = sendCallback; } public override uint EnableSsl(uint options) { _validateCert = (options & 1) != 0; try { _sslStream.AuthenticateAsClientAsync(_targetServer).GetAwaiter().GetResult(); _sslOverTdsStream.FinishHandshake(); } catch (AuthenticationException sniException) { return SNICommon.ReportSNIError(SNIProviders.NP_PROV, 35u, sniException); } catch (InvalidOperationException sniException2) { return SNICommon.ReportSNIError(SNIProviders.NP_PROV, 35u, sniException2); } _stream = _sslStream; return 0u; } public override void DisableSsl() { _sslStream.Dispose(); _sslStream = null; _sslOverTdsStream.Dispose(); _sslOverTdsStream = null; _stream = _pipeStream; } private bool ValidateServerCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors) { if (!_validateCert) { return true; } return SNICommon.ValidateSslServerCertificate(_targetServer, sender, cert, chain, policyErrors); } public override void SetBufferSize(int bufferSize) { _bufferSize = bufferSize; } private uint ReportErrorAndReleasePacket(SNIPacket packet, Exception sniException) { packet?.Release(); return SNICommon.ReportSNIError(SNIProviders.NP_PROV, 35u, sniException); } private uint ReportErrorAndReleasePacket(SNIPacket packet, uint nativeError, uint sniError, string errorMessage) { packet?.Release(); return SNICommon.ReportSNIError(SNIProviders.NP_PROV, nativeError, sniError, errorMessage); } } internal class SNIPacket : IDisposable, IEquatable { private byte[] _data; private int _length; private int _capacity; private int _offset; private string _description; private SNIAsyncCallback _completionCallback; public string Description { get { return _description; } set { _description = value; } } public int DataLeft => _length - _offset; public int Length => _length; public bool IsInvalid => _data == null; public SNIPacket(SNIHandle handle) { _offset = 0; } public void Dispose() { _data = null; _length = 0; _capacity = 0; } public void SetCompletionCallback(SNIAsyncCallback completionCallback) { _completionCallback = completionCallback; } public void InvokeCompletionCallback(uint sniErrorCode) { _completionCallback(this, sniErrorCode); } public void Allocate(int capacity) { _capacity = capacity; _data = new byte[capacity]; } public SNIPacket Clone() { SNIPacket sNIPacket = new SNIPacket(null); sNIPacket._data = new byte[_length]; Buffer.BlockCopy(_data, 0, sNIPacket._data, 0, _length); sNIPacket._length = _length; return sNIPacket; } public void GetData(byte[] buffer, ref int dataSize) { Buffer.BlockCopy(_data, 0, buffer, 0, _length); dataSize = _length; } public void SetData(byte[] data, int length) { _data = data; _length = length; _capacity = length; _offset = 0; } public int TakeData(SNIPacket packet, int size) { int num = TakeData(packet._data, packet._length, size); packet._length += num; return num; } public void AppendData(byte[] data, int size) { Buffer.BlockCopy(data, 0, _data, _length, size); _length += size; } public void AppendPacket(SNIPacket packet) { Buffer.BlockCopy(packet._data, 0, _data, _length, packet._length); _length += packet._length; } public int TakeData(byte[] buffer, int dataOffset, int size) { if (_offset >= _length) { return 0; } if (_offset + size > _length) { size = _length - _offset; } Buffer.BlockCopy(_data, _offset, buffer, dataOffset, size); _offset += size; return size; } public void Release() { _length = 0; _capacity = 0; _data = null; } public void Reset() { _length = 0; _data = new byte[_capacity]; } public void ReadFromStreamAsync(Stream stream, SNIAsyncCallback callback) { bool error = false; stream.ReadAsync(_data, 0, _capacity).ContinueWith(delegate(Task t) { Exception ex = ((t.Exception != null) ? t.Exception.InnerException : null); if (ex != null) { SNILoadHandle.SingletonInstance.LastError = new SNIError(SNIProviders.TCP_PROV, 35u, ex); error = true; } else { _length = t.Result; if (_length == 0) { SNILoadHandle.SingletonInstance.LastError = new SNIError(SNIProviders.TCP_PROV, 0u, 2u, string.Empty); error = true; } } if (error) { Release(); } callback(this, error ? 1u : 0u); }, CancellationToken.None, TaskContinuationOptions.LongRunning | TaskContinuationOptions.DenyChildAttach, TaskScheduler.Default); } public void ReadFromStream(Stream stream) { _length = stream.Read(_data, 0, _capacity); } public void WriteToStream(Stream stream) { stream.Write(_data, 0, _length); } public override int GetHashCode() { return base.GetHashCode(); } public override bool Equals(object obj) { if (obj is SNIPacket packet) { return Equals(packet); } return false; } public bool Equals(SNIPacket packet) { if (packet != null) { return packet == this; } return false; } } internal class SNIProxy { internal class SspiClientContextResult { internal const uint OK = 0u; internal const uint Failed = 1u; internal const uint KerberosTicketMissing = 2u; } private const int DefaultSqlServerPort = 1433; private const int DefaultSqlServerDacPort = 1434; private const string SqlServerSpnHeader = "MSSQLSvc"; public static readonly SNIProxy Singleton = new SNIProxy(); public void Terminate() { } public uint EnableSsl(SNIHandle handle, uint options) { try { return handle.EnableSsl(options); } catch (Exception sniException) { return SNICommon.ReportSNIError(SNIProviders.SSL_PROV, 31u, sniException); } } public uint DisableSsl(SNIHandle handle) { handle.DisableSsl(); return 0u; } public void GenSspiClientContext(SspiClientContextStatus sspiClientContextStatus, byte[] receivedBuff, ref byte[] sendBuff, byte[] serverName) { System.Net.Security.SafeDeleteContext securityContext = sspiClientContextStatus.SecurityContext; System.Net.ContextFlagsPal contextFlags = sspiClientContextStatus.ContextFlags; System.Net.Security.SafeFreeCredentials credentialsHandle = sspiClientContextStatus.CredentialsHandle; string package = "Negotiate"; if (securityContext == null) { credentialsHandle = System.Net.Security.NegotiateStreamPal.AcquireDefaultCredential(package, isServer: false); } SecurityBuffer[] array = null; array = ((receivedBuff == null) ? new SecurityBuffer[0] : new SecurityBuffer[1] { new SecurityBuffer(receivedBuff, SecurityBufferType.SECBUFFER_TOKEN) }); SecurityBuffer securityBuffer = new SecurityBuffer(System.Net.Security.NegotiateStreamPal.QueryMaxTokenSize(package), SecurityBufferType.SECBUFFER_TOKEN); System.Net.ContextFlagsPal requestedContextFlags = System.Net.ContextFlagsPal.MutualAuth | System.Net.ContextFlagsPal.Confidentiality | System.Net.ContextFlagsPal.Connection; string @string = Encoding.UTF8.GetString(serverName); System.Net.SecurityStatusPal securityStatusPal = System.Net.Security.NegotiateStreamPal.InitializeSecurityContext(credentialsHandle, ref securityContext, @string, requestedContextFlags, array, securityBuffer, ref contextFlags); if (securityStatusPal.ErrorCode == System.Net.SecurityStatusPalErrorCode.CompleteNeeded || securityStatusPal.ErrorCode == System.Net.SecurityStatusPalErrorCode.CompAndContinue) { array = new SecurityBuffer[1] { securityBuffer }; securityStatusPal = System.Net.Security.NegotiateStreamPal.CompleteAuthToken(ref securityContext, array); securityBuffer.token = null; } sendBuff = securityBuffer.token; if (sendBuff == null) { sendBuff = Array.Empty(); } sspiClientContextStatus.SecurityContext = securityContext; sspiClientContextStatus.ContextFlags = contextFlags; sspiClientContextStatus.CredentialsHandle = credentialsHandle; if (IsErrorStatus(securityStatusPal.ErrorCode)) { if (securityStatusPal.ErrorCode == System.Net.SecurityStatusPalErrorCode.InternalError) { throw new Exception(SQLMessage.KerberosTicketMissingError() + "\n" + securityStatusPal); } throw new Exception(SQLMessage.SSPIGenerateError() + "\n" + securityStatusPal); } } private static bool IsErrorStatus(System.Net.SecurityStatusPalErrorCode errorCode) { if (errorCode != 0 && errorCode != System.Net.SecurityStatusPalErrorCode.OK && errorCode != System.Net.SecurityStatusPalErrorCode.ContinueNeeded && errorCode != System.Net.SecurityStatusPalErrorCode.CompleteNeeded && errorCode != System.Net.SecurityStatusPalErrorCode.CompAndContinue && errorCode != System.Net.SecurityStatusPalErrorCode.ContextExpired && errorCode != System.Net.SecurityStatusPalErrorCode.CredentialsNeeded) { return errorCode != System.Net.SecurityStatusPalErrorCode.Renegotiate; } return false; } public uint InitializeSspiPackage(ref uint maxLength) { throw new PlatformNotSupportedException(); } public uint SetConnectionBufferSize(SNIHandle handle, uint bufferSize) { handle.SetBufferSize((int)bufferSize); return 0u; } public uint PacketGetData(SNIPacket packet, byte[] inBuff, ref uint dataSize) { int dataSize2 = 0; packet.GetData(inBuff, ref dataSize2); dataSize = (uint)dataSize2; return 0u; } public uint ReadSyncOverAsync(SNIHandle handle, out SNIPacket packet, int timeout) { return handle.Receive(out packet, timeout); } public uint GetConnectionId(SNIHandle handle, ref Guid clientConnectionId) { clientConnectionId = handle.ConnectionId; return 0u; } public uint WritePacket(SNIHandle handle, SNIPacket packet, bool sync) { if (sync) { return handle.Send(packet.Clone()); } return handle.SendAsync(packet.Clone()); } public SNIHandle CreateConnectionHandle(object callbackObject, string fullServerName, bool ignoreSniOpenTimeout, long timerExpire, out byte[] instanceName, ref byte[] spnBuffer, bool flushCache, bool async, bool parallel, bool isIntegratedSecurity) { instanceName = new byte[1]; bool error; string localDBDataSource = GetLocalDBDataSource(fullServerName, out error); if (error) { return null; } fullServerName = localDBDataSource ?? fullServerName; DataSource dataSource = DataSource.ParseServerName(fullServerName); if (dataSource == null) { return null; } SNIHandle result = null; switch (dataSource.ConnectionProtocol) { case DataSource.Protocol.TCP: case DataSource.Protocol.None: case DataSource.Protocol.Admin: result = CreateTcpHandle(dataSource, timerExpire, callbackObject, parallel); break; case DataSource.Protocol.NP: result = CreateNpHandle(dataSource, timerExpire, callbackObject, parallel); break; } if (isIntegratedSecurity) { try { spnBuffer = GetSqlServerSPN(dataSource); } catch (Exception sniException) { SNILoadHandle.SingletonInstance.LastError = new SNIError(SNIProviders.INVALID_PROV, 44u, sniException); } } return result; } private static byte[] GetSqlServerSPN(DataSource dataSource) { string serverName = dataSource.ServerName; string portOrInstanceName = null; if (dataSource.Port != -1) { portOrInstanceName = dataSource.Port.ToString(); } else if (!string.IsNullOrWhiteSpace(dataSource.InstanceName)) { portOrInstanceName = dataSource.InstanceName; } else if (dataSource.ConnectionProtocol == DataSource.Protocol.TCP) { portOrInstanceName = 1433.ToString(); } return GetSqlServerSPN(serverName, portOrInstanceName); } private static byte[] GetSqlServerSPN(string hostNameOrAddress, string portOrInstanceName) { string hostName = Dns.GetHostEntry(hostNameOrAddress).HostName; string text = "MSSQLSvc/" + hostName; if (!string.IsNullOrWhiteSpace(portOrInstanceName)) { text = text + ":" + portOrInstanceName; } return Encoding.UTF8.GetBytes(text); } private SNITCPHandle CreateTcpHandle(DataSource details, long timerExpire, object callbackObject, bool parallel) { string serverName = details.ServerName; if (string.IsNullOrWhiteSpace(serverName)) { SNILoadHandle.SingletonInstance.LastError = new SNIError(SNIProviders.TCP_PROV, 0u, 25u, string.Empty); return null; } int num = -1; bool flag = details.ConnectionProtocol == DataSource.Protocol.Admin; if (!details.IsSsrpRequired) { num = ((details.Port == -1) ? (flag ? 1434 : 1433) : details.Port); } else { try { num = (flag ? SSRP.GetDacPortByInstanceName(serverName, details.InstanceName) : SSRP.GetPortByInstanceName(serverName, details.InstanceName)); } catch (SocketException sniException) { SNILoadHandle.SingletonInstance.LastError = new SNIError(SNIProviders.TCP_PROV, 25u, sniException); return null; } } return new SNITCPHandle(serverName, num, timerExpire, callbackObject, parallel); } private SNINpHandle CreateNpHandle(DataSource details, long timerExpire, object callbackObject, bool parallel) { if (parallel) { SNICommon.ReportSNIError(SNIProviders.NP_PROV, 0u, 49u, string.Empty); return null; } return new SNINpHandle(details.PipeHostName, details.PipeName, timerExpire, callbackObject); } public uint ReadAsync(SNIHandle handle, out SNIPacket packet) { packet = new SNIPacket(null); return handle.ReceiveAsync(ref packet); } public void PacketSetData(SNIPacket packet, byte[] data, int length) { packet.SetData(data, length); } public void PacketRelease(SNIPacket packet) { packet.Release(); } public uint CheckConnection(SNIHandle handle) { return handle.CheckConnection(); } public SNIError GetLastError() { return SNILoadHandle.SingletonInstance.LastError; } private string GetLocalDBDataSource(string fullServerName, out bool error) { string result = null; bool error2; string localDBInstance = DataSource.GetLocalDBInstance(fullServerName, out error2); if (error2) { error = true; return null; } if (!string.IsNullOrEmpty(localDBInstance)) { result = LocalDB.GetLocalDBConnectionString(localDBInstance); if (fullServerName == null) { error = true; return null; } } error = false; return result; } } internal class DataSource { internal enum Protocol { TCP, NP, None, Admin } private const char CommaSeparator = ','; private const char BackSlashSeparator = '\\'; private const string DefaultHostName = "localhost"; private const string DefaultSqlServerInstanceName = "mssqlserver"; private const string PipeBeginning = "\\\\"; private const string PipeToken = "pipe"; private const string LocalDbHost = "(localdb)"; private const string NamedPipeInstanceNameHeader = "mssql$"; private const string DefaultPipeName = "sql\\query"; internal Protocol ConnectionProtocol = Protocol.None; private string _workingDataSource; private string _dataSourceAfterTrimmingProtocol; internal string ServerName { get; private set; } internal int Port { get; private set; } = -1; public string InstanceName { get; internal set; } public string PipeName { get; internal set; } public string PipeHostName { get; internal set; } internal bool IsBadDataSource { get; private set; } internal bool IsSsrpRequired { get; private set; } private DataSource(string dataSource) { _workingDataSource = dataSource.Trim().ToLowerInvariant(); int num = _workingDataSource.IndexOf(':'); PopulateProtocol(); _dataSourceAfterTrimmingProtocol = ((num > -1 && ConnectionProtocol != Protocol.None) ? _workingDataSource.Substring(num + 1).Trim() : _workingDataSource); if (_dataSourceAfterTrimmingProtocol.Contains("/")) { if (ConnectionProtocol == Protocol.None) { ReportSNIError(SNIProviders.INVALID_PROV); } else if (ConnectionProtocol == Protocol.NP) { ReportSNIError(SNIProviders.NP_PROV); } else if (ConnectionProtocol == Protocol.TCP) { ReportSNIError(SNIProviders.TCP_PROV); } } } private void PopulateProtocol() { string[] array = _workingDataSource.Split(new char[1] { ':' }); if (array.Length <= 1) { ConnectionProtocol = Protocol.None; return; } switch (array[0].Trim()) { case "tcp": ConnectionProtocol = Protocol.TCP; break; case "np": ConnectionProtocol = Protocol.NP; break; case "admin": ConnectionProtocol = Protocol.Admin; break; default: ConnectionProtocol = Protocol.None; break; } } public static string GetLocalDBInstance(string dataSource, out bool error) { string result = null; string[] array = dataSource.ToLowerInvariant().Split(new char[1] { '\\' }); error = false; if (array.Length == 2 && "(localdb)".Equals(array[0].TrimStart(Array.Empty()))) { if (string.IsNullOrWhiteSpace(array[1])) { SNILoadHandle.SingletonInstance.LastError = new SNIError(SNIProviders.INVALID_PROV, 0u, 51u, string.Empty); error = true; return null; } result = array[1].Trim(); } return result; } public static DataSource ParseServerName(string dataSource) { DataSource dataSource2 = new DataSource(dataSource); if (dataSource2.IsBadDataSource) { return null; } if (dataSource2.InferNamedPipesInformation()) { return dataSource2; } if (dataSource2.IsBadDataSource) { return null; } if (dataSource2.InferConnectionDetails()) { return dataSource2; } return null; } private void InferLocalServerName() { if (string.IsNullOrEmpty(ServerName) || IsLocalHost(ServerName)) { ServerName = ((ConnectionProtocol == Protocol.Admin) ? Environment.MachineName : "localhost"); } } private bool InferConnectionDetails() { string[] array = _dataSourceAfterTrimmingProtocol.Split('\\', ','); ServerName = array[0].Trim(); int num = _dataSourceAfterTrimmingProtocol.IndexOf(','); int num2 = _dataSourceAfterTrimmingProtocol.IndexOf('\\'); if (num > -1) { string text = ((num2 <= -1) ? array[1].Trim() : ((num > num2) ? array[2].Trim() : array[1].Trim())); if (string.IsNullOrEmpty(text)) { ReportSNIError(SNIProviders.INVALID_PROV); return false; } if (ConnectionProtocol == Protocol.None) { ConnectionProtocol = Protocol.TCP; } else if (ConnectionProtocol != 0) { ReportSNIError(SNIProviders.INVALID_PROV); return false; } if (!int.TryParse(text, out var result)) { ReportSNIError(SNIProviders.TCP_PROV); return false; } if (result < 1) { ReportSNIError(SNIProviders.TCP_PROV); return false; } Port = result; } else if (num2 > -1) { InstanceName = array[1].Trim(); if (string.IsNullOrWhiteSpace(InstanceName)) { ReportSNIError(SNIProviders.INVALID_PROV); return false; } if ("mssqlserver".Equals(InstanceName)) { ReportSNIError(SNIProviders.INVALID_PROV); return false; } IsSsrpRequired = true; } InferLocalServerName(); return true; } private void ReportSNIError(SNIProviders provider) { SNILoadHandle.SingletonInstance.LastError = new SNIError(provider, 0u, 25u, string.Empty); IsBadDataSource = true; } private bool InferNamedPipesInformation() { if (_dataSourceAfterTrimmingProtocol.StartsWith("\\\\") || ConnectionProtocol == Protocol.NP) { if (!Enumerable.Contains(_dataSourceAfterTrimmingProtocol, '\\')) { string pipeHostName = (ServerName = _dataSourceAfterTrimmingProtocol); PipeHostName = pipeHostName; InferLocalServerName(); PipeName = "sql\\query"; return true; } try { string[] array = _dataSourceAfterTrimmingProtocol.Split(new char[1] { '\\' }); if (array.Length < 6) { ReportSNIError(SNIProviders.NP_PROV); return false; } string text = array[2]; if (string.IsNullOrEmpty(text)) { ReportSNIError(SNIProviders.NP_PROV); return false; } if (!"pipe".Equals(array[3])) { ReportSNIError(SNIProviders.NP_PROV); return false; } if (array[4].StartsWith("mssql$")) { InstanceName = array[4].Substring("mssql$".Length); } StringBuilder stringBuilder = new StringBuilder(); for (int i = 4; i < array.Length - 1; i++) { stringBuilder.Append(array[i]); stringBuilder.Append(Path.DirectorySeparatorChar); } stringBuilder.Append(array[^1]); PipeName = stringBuilder.ToString(); if (string.IsNullOrWhiteSpace(InstanceName) && !"sql\\query".Equals(PipeName)) { InstanceName = "pipe" + PipeName; } ServerName = (IsLocalHost(text) ? Environment.MachineName : text); PipeHostName = text; } catch (UriFormatException) { ReportSNIError(SNIProviders.NP_PROV); return false; } if (ConnectionProtocol == Protocol.None) { ConnectionProtocol = Protocol.NP; } else if (ConnectionProtocol != Protocol.NP) { ReportSNIError(SNIProviders.NP_PROV); return false; } return true; } return false; } private static bool IsLocalHost(string serverName) { if (!".".Equals(serverName) && !"(local)".Equals(serverName)) { return "localhost".Equals(serverName); } return true; } } internal class SNITCPHandle : SNIHandle { private readonly string _targetServer; private readonly object _callbackObject; private readonly Socket _socket; private NetworkStream _tcpStream; private readonly TaskScheduler _writeScheduler; private readonly TaskFactory _writeTaskFactory; private Stream _stream; private SslStream _sslStream; private SslOverTdsStream _sslOverTdsStream; private SNIAsyncCallback _receiveCallback; private SNIAsyncCallback _sendCallback; private bool _validateCert = true; private int _bufferSize = 4096; private uint _status = uint.MaxValue; private Guid _connectionId = Guid.NewGuid(); private const int MaxParallelIpAddresses = 64; public override Guid ConnectionId => _connectionId; public override uint Status => _status; public override void Dispose() { lock (this) { if (_sslOverTdsStream != null) { _sslOverTdsStream.Dispose(); _sslOverTdsStream = null; } if (_sslStream != null) { _sslStream.Dispose(); _sslStream = null; } if (_tcpStream != null) { _tcpStream.Dispose(); _tcpStream = null; } _stream = null; } } public SNITCPHandle(string serverName, int port, long timerExpire, object callbackObject, bool parallel) { _writeScheduler = new ConcurrentExclusiveSchedulerPair().ExclusiveScheduler; _writeTaskFactory = new TaskFactory(_writeScheduler); _callbackObject = callbackObject; _targetServer = serverName; try { TimeSpan timeout = default(TimeSpan); bool flag = long.MaxValue == timerExpire; if (!flag) { timeout = DateTime.FromFileTime(timerExpire) - DateTime.Now; timeout = ((timeout.Ticks < 0) ? TimeSpan.FromTicks(0L) : timeout); } Task task; if (parallel) { Task hostAddressesAsync = Dns.GetHostAddressesAsync(serverName); hostAddressesAsync.Wait(timeout); IPAddress[] result = hostAddressesAsync.Result; if (result.Length > 64) { ReportTcpSNIError(0u, 47u, string.Empty); return; } task = ParallelConnectAsync(result, port); } else { task = ConnectAsync(serverName, port); } if (!(flag ? task.Wait(-1) : task.Wait(timeout))) { ReportTcpSNIError(0u, 40u, string.Empty); return; } _socket = task.Result; if (_socket == null || !_socket.Connected) { if (_socket != null) { _socket.Dispose(); _socket = null; } ReportTcpSNIError(0u, 40u, string.Empty); return; } _socket.NoDelay = true; _tcpStream = new NetworkStream(_socket, ownsSocket: true); _sslOverTdsStream = new SslOverTdsStream(_tcpStream); _sslStream = new SslStream(_sslOverTdsStream, leaveInnerStreamOpen: true, ValidateServerCertificate, null); } catch (SocketException sniException) { ReportTcpSNIError(sniException); return; } catch (Exception sniException2) { ReportTcpSNIError(sniException2); return; } _stream = _tcpStream; _status = 0u; } private static async Task ConnectAsync(string serverName, int port) { IPAddress[] array = await Dns.GetHostAddressesAsync(serverName).ConfigureAwait(continueOnCapturedContext: false); IPAddress targetAddrV4 = Array.Find(array, (IPAddress addr) => addr.AddressFamily == AddressFamily.InterNetwork); IPAddress targetAddrV5 = Array.Find(array, (IPAddress addr) => addr.AddressFamily == AddressFamily.InterNetworkV6); if (targetAddrV4 != null && targetAddrV5 != null) { return await ParallelConnectAsync(new IPAddress[2] { targetAddrV4, targetAddrV5 }, port).ConfigureAwait(continueOnCapturedContext: false); } IPAddress iPAddress = ((targetAddrV4 != null) ? targetAddrV4 : targetAddrV5); Socket socket = new Socket(iPAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); try { await SocketTaskExtensions.ConnectAsync(socket, iPAddress, port).ConfigureAwait(continueOnCapturedContext: false); } catch { socket.Dispose(); throw; } return socket; } private static Task ParallelConnectAsync(IPAddress[] serverAddresses, int port) { if (serverAddresses == null) { throw new ArgumentNullException("serverAddresses"); } if (serverAddresses.Length == 0) { throw new ArgumentOutOfRangeException("serverAddresses"); } List list = new List(serverAddresses.Length); List list2 = new List(serverAddresses.Length); TaskCompletionSource taskCompletionSource = new TaskCompletionSource(); StrongBox lastError = new StrongBox(); StrongBox pendingCompleteCount = new StrongBox(serverAddresses.Length); foreach (IPAddress iPAddress in serverAddresses) { Socket socket = new Socket(iPAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); list.Add(socket); try { list2.Add(SocketTaskExtensions.ConnectAsync(socket, iPAddress, port)); } catch (Exception exception) { list2.Add(Task.FromException(exception)); } } for (int j = 0; j < list.Count; j++) { ParallelConnectHelper(list[j], list2[j], taskCompletionSource, pendingCompleteCount, lastError, list); } return taskCompletionSource.Task; } private static async void ParallelConnectHelper(Socket socket, Task connectTask, TaskCompletionSource tcs, StrongBox pendingCompleteCount, StrongBox lastError, List sockets) { bool success = false; try { await connectTask.ConfigureAwait(continueOnCapturedContext: false); success = tcs.TrySetResult(socket); if (!success) { return; } foreach (Socket socket2 in sockets) { if (socket2 != socket) { socket2.Dispose(); } } } catch (Exception value) { Interlocked.Exchange(ref lastError.Value, value); } finally { if (!success && Interlocked.Decrement(ref pendingCompleteCount.Value) == 0) { if (lastError.Value != null) { tcs.TrySetException(lastError.Value); } else { tcs.TrySetCanceled(); } foreach (Socket socket3 in sockets) { socket3.Dispose(); } } } } public override uint EnableSsl(uint options) { _validateCert = (options & 1) != 0; try { _sslStream.AuthenticateAsClientAsync(_targetServer).GetAwaiter().GetResult(); _sslOverTdsStream.FinishHandshake(); } catch (AuthenticationException sniException) { return ReportTcpSNIError(sniException); } catch (InvalidOperationException sniException2) { return ReportTcpSNIError(sniException2); } _stream = _sslStream; return 0u; } public override void DisableSsl() { if (Environment.OSVersion.Platform != PlatformID.Win32NT) { _sslStream.Dispose(); } _sslStream = null; _sslOverTdsStream.Dispose(); _sslOverTdsStream = null; _stream = _tcpStream; } private bool ValidateServerCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors) { if (!_validateCert) { return true; } return SNICommon.ValidateSslServerCertificate(_targetServer, sender, cert, chain, policyErrors); } public override void SetBufferSize(int bufferSize) { _bufferSize = bufferSize; _socket.SendBufferSize = bufferSize; _socket.ReceiveBufferSize = bufferSize; } public override uint Send(SNIPacket packet) { lock (this) { try { packet.WriteToStream(_stream); return 0u; } catch (ObjectDisposedException sniException) { return ReportTcpSNIError(sniException); } catch (SocketException sniException2) { return ReportTcpSNIError(sniException2); } catch (IOException sniException3) { return ReportTcpSNIError(sniException3); } } } public override uint Receive(out SNIPacket packet, int timeoutInMilliseconds) { lock (this) { packet = null; try { if (timeoutInMilliseconds > 0) { _socket.ReceiveTimeout = timeoutInMilliseconds; } else { if (timeoutInMilliseconds != -1) { ReportTcpSNIError(0u, 11u, string.Empty); return 258u; } _socket.ReceiveTimeout = 0; } packet = new SNIPacket(null); packet.Allocate(_bufferSize); packet.ReadFromStream(_stream); if (packet.Length == 0) { Win32Exception ex = new Win32Exception(); return ReportErrorAndReleasePacket(packet, (uint)ex.NativeErrorCode, 0u, ex.Message); } return 0u; } catch (ObjectDisposedException sniException) { return ReportErrorAndReleasePacket(packet, sniException); } catch (SocketException sniException2) { return ReportErrorAndReleasePacket(packet, sniException2); } catch (IOException ex2) { uint result = ReportErrorAndReleasePacket(packet, ex2); if (ex2.InnerException is SocketException && ((SocketException)ex2.InnerException).SocketErrorCode == SocketError.TimedOut) { result = 258u; } return result; } finally { _socket.ReceiveTimeout = 0; } } } public override void SetAsyncCallbacks(SNIAsyncCallback receiveCallback, SNIAsyncCallback sendCallback) { _receiveCallback = receiveCallback; _sendCallback = sendCallback; } public override uint SendAsync(SNIPacket packet, SNIAsyncCallback callback = null) { _ = packet; _writeTaskFactory.StartNew(delegate { try { lock (this) { packet.WriteToStream(_stream); } } catch (Exception sniException) { SNILoadHandle.SingletonInstance.LastError = new SNIError(SNIProviders.TCP_PROV, 35u, sniException); if (callback != null) { callback(packet, 1u); } else { _sendCallback(packet, 1u); } return; } if (callback != null) { callback(packet, 0u); } else { _sendCallback(packet, 0u); } }); return 997u; } public override uint ReceiveAsync(ref SNIPacket packet) { lock (this) { packet = new SNIPacket(null); packet.Allocate(_bufferSize); try { packet.ReadFromStreamAsync(_stream, _receiveCallback); return 997u; } catch (ObjectDisposedException sniException) { return ReportErrorAndReleasePacket(packet, sniException); } catch (SocketException sniException2) { return ReportErrorAndReleasePacket(packet, sniException2); } catch (IOException sniException3) { return ReportErrorAndReleasePacket(packet, sniException3); } } } public override uint CheckConnection() { try { if (!_socket.Connected || _socket.Poll(0, SelectMode.SelectError)) { return 1u; } } catch (SocketException sniException) { return ReportTcpSNIError(sniException); } catch (ObjectDisposedException sniException2) { return ReportTcpSNIError(sniException2); } return 0u; } private uint ReportTcpSNIError(Exception sniException) { _status = 1u; return SNICommon.ReportSNIError(SNIProviders.TCP_PROV, 35u, sniException); } private uint ReportTcpSNIError(uint nativeError, uint sniError, string errorMessage) { _status = 1u; return SNICommon.ReportSNIError(SNIProviders.TCP_PROV, nativeError, sniError, errorMessage); } private uint ReportErrorAndReleasePacket(SNIPacket packet, Exception sniException) { packet?.Release(); return ReportTcpSNIError(sniException); } private uint ReportErrorAndReleasePacket(SNIPacket packet, uint nativeError, uint sniError, string errorMessage) { packet?.Release(); return ReportTcpSNIError(nativeError, sniError, errorMessage); } } internal class SSRP { private const char SemicolonSeparator = ';'; private const int SqlServerBrowserPort = 1434; internal static int GetPortByInstanceName(string browserHostName, string instanceName) { byte[] requestPacket = CreateInstanceInfoRequest(instanceName); byte[] array = null; try { array = SendUDPRequest(browserHostName, 1434, requestPacket); } catch (SocketException innerException) { throw new Exception(SQLMessage.SqlServerBrowserNotAccessible(), innerException); } if (array == null || array.Length <= 3 || array[0] != 5 || BitConverter.ToUInt16(array, 1) != array.Length - 3) { throw new SocketException(); } string[] array2 = Encoding.ASCII.GetString(array, 3, array.Length - 3).Split(new char[1] { ';' }); int num = Array.IndexOf(array2, "tcp"); if (num < 0 || num == array2.Length - 1) { throw new SocketException(); } return ushort.Parse(array2[num + 1]); } private static byte[] CreateInstanceInfoRequest(string instanceName) { instanceName += "\0"; byte[] array = new byte[Encoding.ASCII.GetByteCount(instanceName) + 1]; array[0] = 4; Encoding.ASCII.GetBytes(instanceName, 0, instanceName.Length, array, 1); return array; } internal static int GetDacPortByInstanceName(string browserHostName, string instanceName) { byte[] requestPacket = CreateDacPortInfoRequest(instanceName); byte[] array = SendUDPRequest(browserHostName, 1434, requestPacket); if (array == null || array.Length <= 4 || array[0] != 5 || BitConverter.ToUInt16(array, 1) != 6 || array[3] != 1) { throw new SocketException(); } return BitConverter.ToUInt16(array, 4); } private static byte[] CreateDacPortInfoRequest(string instanceName) { instanceName += "\0"; byte[] array = new byte[Encoding.ASCII.GetByteCount(instanceName) + 2]; array[0] = 15; array[1] = 1; Encoding.ASCII.GetBytes(instanceName, 0, instanceName.Length, array, 2); return array; } private static byte[] SendUDPRequest(string browserHostname, int port, byte[] requestPacket) { IPAddress address = null; bool num = IPAddress.TryParse(browserHostname, out address); byte[] result = null; using (UdpClient udpClient = new UdpClient((!num) ? AddressFamily.InterNetwork : address.AddressFamily)) { Task task = udpClient.SendAsync(requestPacket, requestPacket.Length, browserHostname, port); Task task2 = null; if (task.Wait(1000) && (task2 = udpClient.ReceiveAsync()).Wait(1000)) { result = task2.Result.Buffer; } } return result; } } internal sealed class SslOverTdsStream : Stream { private readonly Stream _stream; private int _packetBytes; private bool _encapsulate; private const int PACKET_SIZE_WITHOUT_HEADER = 4088; private const int PRELOGIN_PACKET_TYPE = 18; public override long Position { get { throw new NotSupportedException(); } set { throw new NotSupportedException(); } } public override bool CanRead => _stream.CanRead; public override bool CanWrite => _stream.CanWrite; public override bool CanSeek => false; public override long Length { get { throw new NotSupportedException(); } } public SslOverTdsStream(Stream stream) { _stream = stream; _encapsulate = true; } public void FinishHandshake() { _encapsulate = false; } public override int Read(byte[] buffer, int offset, int count) { int i = 0; byte[] array = new byte[(count < 8) ? 8 : count]; if (_encapsulate) { if (_packetBytes == 0) { for (; i < 8; i += _stream.Read(array, i, 8 - i)) { } _packetBytes = (array[2] << 8) | array[3]; _packetBytes -= 8; } if (count > _packetBytes) { count = _packetBytes; } } i = _stream.Read(array, 0, count); if (_encapsulate) { _packetBytes -= i; } Buffer.BlockCopy(array, 0, buffer, offset, i); return i; } public override void Write(byte[] buffer, int offset, int count) { int num = 0; int num2 = offset; while (count > 0) { if (_encapsulate) { num = ((count <= 4088) ? count : 4088); count -= num; byte[] array = new byte[8 + num]; array[0] = 18; array[1] = ((count <= 0) ? ((byte)1) : ((byte)0)); array[2] = (byte)((num + 8) / 256); array[3] = (byte)((num + 8) % 256); array[4] = 0; array[5] = 0; array[6] = 0; array[7] = 0; for (int i = 8; i < array.Length; i++) { array[i] = buffer[num2 + (i - 8)]; } _stream.Write(array, 0, array.Length); } else { num = count; count = 0; _stream.Write(buffer, num2, num); } _stream.Flush(); num2 += num; } } public override void SetLength(long value) { throw new NotSupportedException(); } public override void Flush() { if (!(_stream is PipeStream)) { _stream.Flush(); } } public override long Seek(long offset, SeekOrigin origin) { throw new NotSupportedException(); } } internal class SspiClientContextStatus { public System.Net.Security.SafeFreeCredentials CredentialsHandle { get; set; } public System.Net.Security.SafeDeleteContext SecurityContext { get; set; } public System.Net.ContextFlagsPal ContextFlags { get; set; } } internal class TdsParserStateObjectManaged : TdsParserStateObject { internal sealed class WritePacketCache : IDisposable { private bool _disposed; private Stack _packets; public WritePacketCache() { _disposed = false; _packets = new Stack(); } public SNIPacket Take(SNIHandle sniHandle) { SNIPacket sNIPacket; if (_packets.Count > 0) { sNIPacket = _packets.Pop(); sNIPacket.Reset(); } else { sNIPacket = new SNIPacket(sniHandle); } return sNIPacket; } public void Add(SNIPacket packet) { if (!_disposed) { _packets.Push(packet); } else { packet.Dispose(); } } public void Clear() { while (_packets.Count > 0) { _packets.Pop().Dispose(); } } public void Dispose() { if (!_disposed) { _disposed = true; Clear(); } } } private SNIMarsConnection _marsConnection; private SNIHandle _sessionHandle; private SNIPacket _sniPacket; internal SNIPacket _sniAsyncAttnPacket; private readonly Dictionary _pendingWritePackets = new Dictionary(); private readonly WritePacketCache _writePacketCache = new WritePacketCache(); internal SspiClientContextStatus sspiClientContextStatus = new SspiClientContextStatus(); internal SNIHandle Handle => _sessionHandle; internal override uint Status { get { if (_sessionHandle == null) { return uint.MaxValue; } return _sessionHandle.Status; } } internal override object SessionHandle => _sessionHandle; protected override object EmptyReadPacket => null; public TdsParserStateObjectManaged(TdsParser parser) : base(parser) { } internal TdsParserStateObjectManaged(TdsParser parser, TdsParserStateObject physicalConnection, bool async) : base(parser, physicalConnection, async) { } protected override bool CheckPacket(object packet, TaskCompletionSource source) { SNIPacket sNIPacket = packet as SNIPacket; if (!sNIPacket.IsInvalid) { if (!sNIPacket.IsInvalid) { return source != null; } return false; } return true; } protected override void CreateSessionHandle(TdsParserStateObject physicalConnection, bool async) { TdsParserStateObjectManaged tdsParserStateObjectManaged = physicalConnection as TdsParserStateObjectManaged; _sessionHandle = tdsParserStateObjectManaged.CreateMarsSession(this, async); } internal SNIMarsHandle CreateMarsSession(object callbackObject, bool async) { return _marsConnection.CreateMarsSession(callbackObject, async); } protected override uint SNIPacketGetData(object packet, byte[] _inBuff, ref uint dataSize) { return SNIProxy.Singleton.PacketGetData(packet as SNIPacket, _inBuff, ref dataSize); } internal override void CreatePhysicalSNIHandle(string serverName, bool ignoreSniOpenTimeout, long timerExpire, out byte[] instanceName, ref byte[] spnBuffer, bool flushCache, bool async, bool parallel, bool isIntegratedSecurity) { _sessionHandle = SNIProxy.Singleton.CreateConnectionHandle(this, serverName, ignoreSniOpenTimeout, timerExpire, out instanceName, ref spnBuffer, flushCache, async, parallel, isIntegratedSecurity); if (_sessionHandle == null) { _parser.ProcessSNIError(this); } else if (async) { SNIAsyncCallback receiveCallback = ReadAsyncCallback; SNIAsyncCallback sendCallback = WriteAsyncCallback; _sessionHandle.SetAsyncCallbacks(receiveCallback, sendCallback); } } internal void ReadAsyncCallback(SNIPacket packet, uint error) { ReadAsyncCallback(IntPtr.Zero, packet, error); } internal void WriteAsyncCallback(SNIPacket packet, uint sniError) { WriteAsyncCallback(IntPtr.Zero, packet, sniError); } protected override void RemovePacketFromPendingList(object packet) { } internal override void Dispose() { SNIPacket sniPacket = _sniPacket; SNIHandle sessionHandle = _sessionHandle; SNIPacket sniAsyncAttnPacket = _sniAsyncAttnPacket; _sniPacket = null; _sessionHandle = null; _sniAsyncAttnPacket = null; _marsConnection = null; DisposeCounters(); if (sessionHandle != null || sniPacket != null) { sniPacket?.Dispose(); sniAsyncAttnPacket?.Dispose(); if (sessionHandle != null) { sessionHandle.Dispose(); DecrementPendingCallbacks(release: true); } } DisposePacketCache(); } internal override void DisposePacketCache() { lock (_writePacketLockObject) { _writePacketCache.Dispose(); } } protected override void FreeGcHandle(int remaining, bool release) { } internal override bool IsFailedHandle() { return _sessionHandle.Status != 0; } internal override object ReadSyncOverAsync(int timeoutRemaining, bool isMarsOn, out uint error) { SNIHandle handle = Handle; if (handle == null) { throw ADP.ClosedConnectionError(); } if (isMarsOn) { IncrementPendingCallbacks(); } SNIPacket packet = null; error = SNIProxy.Singleton.ReadSyncOverAsync(handle, out packet, timeoutRemaining); return packet; } internal override bool IsPacketEmpty(object packet) { return packet == null; } internal override void ReleasePacket(object syncReadPacket) { ((SNIPacket)syncReadPacket).Dispose(); } internal override uint CheckConnection() { SNIHandle handle = Handle; if (handle != null) { return SNIProxy.Singleton.CheckConnection(handle); } return 0u; } internal override object ReadAsync(out uint error, ref object handle) { error = SNIProxy.Singleton.ReadAsync((SNIHandle)handle, out var packet); return packet; } internal override object CreateAndSetAttentionPacket() { SNIPacket sNIPacket = (_sniAsyncAttnPacket = new SNIPacket(Handle)); SetPacketData(sNIPacket, SQL.AttentionHeader, 8); return sNIPacket; } internal override uint WritePacket(object packet, bool sync) { return SNIProxy.Singleton.WritePacket(Handle, (SNIPacket)packet, sync); } internal override object AddPacketToPendingList(object packet) { return packet; } internal override bool IsValidPacket(object packetPointer) { if ((SNIPacket)packetPointer != null) { return !((SNIPacket)packetPointer).IsInvalid; } return false; } internal override object GetResetWritePacket() { if (_sniPacket != null) { _sniPacket.Reset(); } else { lock (_writePacketLockObject) { _sniPacket = _writePacketCache.Take(Handle); } } return _sniPacket; } internal override void ClearAllWritePackets() { if (_sniPacket != null) { _sniPacket.Dispose(); _sniPacket = null; } lock (_writePacketLockObject) { _writePacketCache.Clear(); } } internal override void SetPacketData(object packet, byte[] buffer, int bytesUsed) { SNIProxy.Singleton.PacketSetData((SNIPacket)packet, buffer, bytesUsed); } internal override uint SniGetConnectionId(ref Guid clientConnectionId) { return SNIProxy.Singleton.GetConnectionId(Handle, ref clientConnectionId); } internal override uint DisabeSsl() { return SNIProxy.Singleton.DisableSsl(Handle); } internal override uint EnableMars(ref uint info) { _marsConnection = new SNIMarsConnection(Handle); if (_marsConnection.StartReceive() == 997) { return 0u; } return 1u; } internal override uint EnableSsl(ref uint info) { return SNIProxy.Singleton.EnableSsl(Handle, info); } internal override uint SetConnectionBufferSize(ref uint unsignedPacketSize) { return SNIProxy.Singleton.SetConnectionBufferSize(Handle, unsignedPacketSize); } internal override uint GenerateSspiClientContext(byte[] receivedBuff, uint receivedLength, ref byte[] sendBuff, ref uint sendLength, byte[] _sniSpnBuffer) { SNIProxy.Singleton.GenSspiClientContext(sspiClientContextStatus, receivedBuff, ref sendBuff, _sniSpnBuffer); sendLength = ((sendBuff != null) ? ((uint)sendBuff.Length) : 0u); return 0u; } internal override uint WaitForSSLHandShakeToComplete() { return 0u; } } } namespace System.Data.SqlTypes { internal static class SQLResource { internal static string NullString => "Null"; internal static string MessageString => "Message"; internal static string ArithOverflowMessage => "Arithmetic Overflow."; internal static string DivideByZeroMessage => "Divide by zero error encountered."; internal static string NullValueMessage => "Data is Null. This method or property cannot be called on Null values."; internal static string TruncationMessage => "Numeric arithmetic causes truncation."; internal static string DateTimeOverflowMessage => "SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM."; internal static string ConcatDiffCollationMessage => "Two strings to be concatenated have different collation."; internal static string CompareDiffCollationMessage => "Two strings to be compared have different collation."; internal static string InvalidFlagMessage => "Invalid flag value."; internal static string NumeToDecOverflowMessage => "Conversion from SqlDecimal to Decimal overflows."; internal static string ConversionOverflowMessage => "Conversion overflows."; internal static string InvalidDateTimeMessage => "Invalid SqlDateTime."; internal static string TimeZoneSpecifiedMessage => "A time zone was specified. SqlDateTime does not support time zones."; internal static string InvalidArraySizeMessage => "Invalid array size."; internal static string InvalidPrecScaleMessage => "Invalid numeric precision/scale."; internal static string FormatMessage => "The input wasn't in a correct format."; internal static string NotFilledMessage => "SQL Type has not been loaded with data."; internal static string AlreadyFilledMessage => "SQL Type has already been loaded with data."; internal static string ClosedXmlReaderMessage => "Invalid attempt to access a closed XmlReader."; internal static string InvalidOpStreamClosed(string method) { return SR.Format("Invalid attempt to call {0} when the stream is closed.", method); } internal static string InvalidOpStreamNonWritable(string method) { return SR.Format("Invalid attempt to call {0} when the stream non-writable.", method); } internal static string InvalidOpStreamNonReadable(string method) { return SR.Format("Invalid attempt to call {0} when the stream non-readable.", method); } internal static string InvalidOpStreamNonSeekable(string method) { return SR.Format("Invalid attempt to call {0} when the stream is non-seekable.", method); } } public interface INullable { bool IsNull { get; } } [Serializable] [XmlSchemaProvider("GetXsdType")] public struct SqlBinary : INullable, IComparable, IXmlSerializable { private byte[] _value; public static readonly SqlBinary Null = new SqlBinary(fNull: true); public bool IsNull => _value == null; public byte[] Value { get { if (IsNull) { throw new SqlNullValueException(); } byte[] array = new byte[_value.Length]; _value.CopyTo(array, 0); return array; } } public byte this[int index] { get { if (IsNull) { throw new SqlNullValueException(); } return _value[index]; } } public int Length { get { if (!IsNull) { return _value.Length; } throw new SqlNullValueException(); } } private SqlBinary(bool fNull) { _value = null; } public SqlBinary(byte[] value) { if (value == null) { _value = null; return; } _value = new byte[value.Length]; value.CopyTo(_value, 0); } internal SqlBinary(byte[] value, bool ignored) { _value = value; } public static implicit operator SqlBinary(byte[] x) { return new SqlBinary(x); } public static explicit operator byte[](SqlBinary x) { return x.Value; } public override string ToString() { if (!IsNull) { return "SqlBinary(" + _value.Length.ToString(CultureInfo.InvariantCulture) + ")"; } return SQLResource.NullString; } public static SqlBinary operator +(SqlBinary x, SqlBinary y) { if (x.IsNull || y.IsNull) { return Null; } byte[] array = new byte[x.Value.Length + y.Value.Length]; x.Value.CopyTo(array, 0); y.Value.CopyTo(array, x.Value.Length); return new SqlBinary(array); } private static EComparison PerformCompareByte(byte[] x, byte[] y) { int num = ((x.Length < y.Length) ? x.Length : y.Length); for (int i = 0; i < num; i++) { if (x[i] != y[i]) { if (x[i] < y[i]) { return EComparison.LT; } return EComparison.GT; } } if (x.Length == y.Length) { return EComparison.EQ; } byte b = 0; if (x.Length < y.Length) { for (int i = num; i < y.Length; i++) { if (y[i] != b) { return EComparison.LT; } } } else { for (int i = num; i < x.Length; i++) { if (x[i] != b) { return EComparison.GT; } } } return EComparison.EQ; } public static explicit operator SqlBinary(SqlGuid x) { if (!x.IsNull) { return new SqlBinary(x.ToByteArray()); } return Null; } public static SqlBoolean operator ==(SqlBinary x, SqlBinary y) { if (x.IsNull || y.IsNull) { return SqlBoolean.Null; } return new SqlBoolean(PerformCompareByte(x.Value, y.Value) == EComparison.EQ); } public static SqlBoolean operator !=(SqlBinary x, SqlBinary y) { return !(x == y); } public static SqlBoolean operator <(SqlBinary x, SqlBinary y) { if (x.IsNull || y.IsNull) { return SqlBoolean.Null; } return new SqlBoolean(PerformCompareByte(x.Value, y.Value) == EComparison.LT); } public static SqlBoolean operator >(SqlBinary x, SqlBinary y) { if (x.IsNull || y.IsNull) { return SqlBoolean.Null; } return new SqlBoolean(PerformCompareByte(x.Value, y.Value) == EComparison.GT); } public static SqlBoolean operator <=(SqlBinary x, SqlBinary y) { if (x.IsNull || y.IsNull) { return SqlBoolean.Null; } EComparison eComparison = PerformCompareByte(x.Value, y.Value); return new SqlBoolean(eComparison == EComparison.LT || eComparison == EComparison.EQ); } public static SqlBoolean operator >=(SqlBinary x, SqlBinary y) { if (x.IsNull || y.IsNull) { return SqlBoolean.Null; } EComparison eComparison = PerformCompareByte(x.Value, y.Value); return new SqlBoolean(eComparison == EComparison.GT || eComparison == EComparison.EQ); } public static SqlBinary Add(SqlBinary x, SqlBinary y) { return x + y; } public static SqlBinary Concat(SqlBinary x, SqlBinary y) { return x + y; } public static SqlBoolean Equals(SqlBinary x, SqlBinary y) { return x == y; } public static SqlBoolean NotEquals(SqlBinary x, SqlBinary y) { return x != y; } public static SqlBoolean LessThan(SqlBinary x, SqlBinary y) { return x < y; } public static SqlBoolean GreaterThan(SqlBinary x, SqlBinary y) { return x > y; } public static SqlBoolean LessThanOrEqual(SqlBinary x, SqlBinary y) { return x <= y; } public static SqlBoolean GreaterThanOrEqual(SqlBinary x, SqlBinary y) { return x >= y; } public SqlGuid ToSqlGuid() { return (SqlGuid)this; } public int CompareTo(object value) { if (value is SqlBinary value2) { return CompareTo(value2); } throw ADP.WrongType(value.GetType(), typeof(SqlBinary)); } public int CompareTo(SqlBinary value) { if (IsNull) { if (!value.IsNull) { return -1; } return 0; } if (value.IsNull) { return 1; } if (this < value) { return -1; } if (this > value) { return 1; } return 0; } public override bool Equals(object value) { if (!(value is SqlBinary sqlBinary)) { return false; } if (sqlBinary.IsNull || IsNull) { if (sqlBinary.IsNull) { return IsNull; } return false; } return (this == sqlBinary).Value; } internal static int HashByteArray(byte[] rgbValue, int length) { if (length <= 0) { return 0; } int num = 0; for (int i = 0; i < length; i++) { int num2 = (num >> 28) & 0xFF; num <<= 4; num = num ^ rgbValue[i] ^ num2; } return num; } public override int GetHashCode() { if (IsNull) { return 0; } int num = _value.Length; while (num > 0 && _value[num - 1] == 0) { num--; } return HashByteArray(_value, num); } XmlSchema IXmlSerializable.GetSchema() { return null; } void IXmlSerializable.ReadXml(XmlReader reader) { string attribute = reader.GetAttribute("nil", "http://www.w3.org/2001/XMLSchema-instance"); if (attribute != null && XmlConvert.ToBoolean(attribute)) { reader.ReadElementString(); _value = null; return; } string text = reader.ReadElementString(); if (text == null) { _value = Array.Empty(); return; } text = text.Trim(); if (text.Length == 0) { _value = Array.Empty(); } else { _value = Convert.FromBase64String(text); } } void IXmlSerializable.WriteXml(XmlWriter writer) { if (IsNull) { writer.WriteAttributeString("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance", "true"); } else { writer.WriteString(Convert.ToBase64String(_value)); } } public static XmlQualifiedName GetXsdType(XmlSchemaSet schemaSet) { return new XmlQualifiedName("base64Binary", "http://www.w3.org/2001/XMLSchema"); } } [Serializable] [XmlSchemaProvider("GetXsdType")] public struct SqlBoolean : INullable, IComparable, IXmlSerializable { private byte m_value; private const byte x_Null = 0; private const byte x_False = 1; private const byte x_True = 2; public static readonly SqlBoolean True = new SqlBoolean(value: true); public static readonly SqlBoolean False = new SqlBoolean(value: false); public static readonly SqlBoolean Null = new SqlBoolean(0, fNull: true); public static readonly SqlBoolean Zero = new SqlBoolean(0); public static readonly SqlBoolean One = new SqlBoolean(1); public bool IsNull => m_value == 0; public bool Value => m_value switch { 2 => true, 1 => false, _ => throw new SqlNullValueException(), }; public bool IsTrue => m_value == 2; public bool IsFalse => m_value == 1; public byte ByteValue { get { if (!IsNull) { if (m_value != 2) { return 0; } return 1; } throw new SqlNullValueException(); } } public SqlBoolean(bool value) { m_value = (byte)((!value) ? 1 : 2); } public SqlBoolean(int value) : this(value, fNull: false) { } private SqlBoolean(int value, bool fNull) { if (fNull) { m_value = 0; } else { m_value = (byte)((value == 0) ? 1 : 2); } } public static implicit operator SqlBoolean(bool x) { return new SqlBoolean(x); } public static explicit operator bool(SqlBoolean x) { return x.Value; } public static SqlBoolean operator !(SqlBoolean x) { return x.m_value switch { 2 => False, 1 => True, _ => Null, }; } public static bool operator true(SqlBoolean x) { return x.IsTrue; } public static bool operator false(SqlBoolean x) { return x.IsFalse; } public static SqlBoolean operator &(SqlBoolean x, SqlBoolean y) { if (x.m_value == 1 || y.m_value == 1) { return False; } if (x.m_value == 2 && y.m_value == 2) { return True; } return Null; } public static SqlBoolean operator |(SqlBoolean x, SqlBoolean y) { if (x.m_value == 2 || y.m_value == 2) { return True; } if (x.m_value == 1 && y.m_value == 1) { return False; } return Null; } public override string ToString() { if (!IsNull) { return Value.ToString(); } return SQLResource.NullString; } public static SqlBoolean Parse(string s) { if (s == null) { return new SqlBoolean(bool.Parse(s)); } if (s == SQLResource.NullString) { return Null; } s = s.TrimStart(Array.Empty()); char c = s[0]; if (char.IsNumber(c) || '-' == c || '+' == c) { return new SqlBoolean(int.Parse(s, null)); } return new SqlBoolean(bool.Parse(s)); } public static SqlBoolean operator ~(SqlBoolean x) { return !x; } public static SqlBoolean operator ^(SqlBoolean x, SqlBoolean y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value != y.m_value); } return Null; } public static explicit operator SqlBoolean(SqlByte x) { if (!x.IsNull) { return new SqlBoolean(x.Value != 0); } return Null; } public static explicit operator SqlBoolean(SqlInt16 x) { if (!x.IsNull) { return new SqlBoolean(x.Value != 0); } return Null; } public static explicit operator SqlBoolean(SqlInt32 x) { if (!x.IsNull) { return new SqlBoolean(x.Value != 0); } return Null; } public static explicit operator SqlBoolean(SqlInt64 x) { if (!x.IsNull) { return new SqlBoolean(x.Value != 0); } return Null; } public static explicit operator SqlBoolean(SqlDouble x) { if (!x.IsNull) { return new SqlBoolean(x.Value != 0.0); } return Null; } public static explicit operator SqlBoolean(SqlSingle x) { if (!x.IsNull) { return new SqlBoolean((double)x.Value != 0.0); } return Null; } public static explicit operator SqlBoolean(SqlMoney x) { if (!x.IsNull) { return x != SqlMoney.Zero; } return Null; } public static explicit operator SqlBoolean(SqlDecimal x) { if (!x.IsNull) { return new SqlBoolean(x._data1 != 0 || x._data2 != 0 || x._data3 != 0 || x._data4 != 0); } return Null; } public static explicit operator SqlBoolean(SqlString x) { if (!x.IsNull) { return Parse(x.Value); } return Null; } public static SqlBoolean operator ==(SqlBoolean x, SqlBoolean y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value == y.m_value); } return Null; } public static SqlBoolean operator !=(SqlBoolean x, SqlBoolean y) { return !(x == y); } public static SqlBoolean operator <(SqlBoolean x, SqlBoolean y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value < y.m_value); } return Null; } public static SqlBoolean operator >(SqlBoolean x, SqlBoolean y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value > y.m_value); } return Null; } public static SqlBoolean operator <=(SqlBoolean x, SqlBoolean y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value <= y.m_value); } return Null; } public static SqlBoolean operator >=(SqlBoolean x, SqlBoolean y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value >= y.m_value); } return Null; } public static SqlBoolean OnesComplement(SqlBoolean x) { return ~x; } public static SqlBoolean And(SqlBoolean x, SqlBoolean y) { return x & y; } public static SqlBoolean Or(SqlBoolean x, SqlBoolean y) { return x | y; } public static SqlBoolean Xor(SqlBoolean x, SqlBoolean y) { return x ^ y; } public static SqlBoolean Equals(SqlBoolean x, SqlBoolean y) { return x == y; } public static SqlBoolean NotEquals(SqlBoolean x, SqlBoolean y) { return x != y; } public static SqlBoolean GreaterThan(SqlBoolean x, SqlBoolean y) { return x > y; } public static SqlBoolean LessThan(SqlBoolean x, SqlBoolean y) { return x < y; } public static SqlBoolean GreaterThanOrEquals(SqlBoolean x, SqlBoolean y) { return x >= y; } public static SqlBoolean LessThanOrEquals(SqlBoolean x, SqlBoolean y) { return x <= y; } public SqlByte ToSqlByte() { return (SqlByte)this; } public SqlDouble ToSqlDouble() { return (SqlDouble)this; } public SqlInt16 ToSqlInt16() { return (SqlInt16)this; } public SqlInt32 ToSqlInt32() { return (SqlInt32)this; } public SqlInt64 ToSqlInt64() { return (SqlInt64)this; } public SqlMoney ToSqlMoney() { return (SqlMoney)this; } public SqlDecimal ToSqlDecimal() { return (SqlDecimal)this; } public SqlSingle ToSqlSingle() { return (SqlSingle)this; } public SqlString ToSqlString() { return (SqlString)this; } public int CompareTo(object value) { if (value is SqlBoolean value2) { return CompareTo(value2); } throw ADP.WrongType(value.GetType(), typeof(SqlBoolean)); } public int CompareTo(SqlBoolean value) { if (IsNull) { if (!value.IsNull) { return -1; } return 0; } if (value.IsNull) { return 1; } if (ByteValue < value.ByteValue) { return -1; } if (ByteValue > value.ByteValue) { return 1; } return 0; } public override bool Equals(object value) { if (!(value is SqlBoolean sqlBoolean)) { return false; } if (sqlBoolean.IsNull || IsNull) { if (sqlBoolean.IsNull) { return IsNull; } return false; } return (this == sqlBoolean).Value; } public override int GetHashCode() { if (!IsNull) { return Value.GetHashCode(); } return 0; } XmlSchema IXmlSerializable.GetSchema() { return null; } void IXmlSerializable.ReadXml(XmlReader reader) { string attribute = reader.GetAttribute("nil", "http://www.w3.org/2001/XMLSchema-instance"); if (attribute != null && XmlConvert.ToBoolean(attribute)) { reader.ReadElementString(); m_value = 0; } else { m_value = (byte)((!XmlConvert.ToBoolean(reader.ReadElementString())) ? 1 : 2); } } void IXmlSerializable.WriteXml(XmlWriter writer) { if (IsNull) { writer.WriteAttributeString("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance", "true"); } else { writer.WriteString((m_value == 2) ? "true" : "false"); } } public static XmlQualifiedName GetXsdType(XmlSchemaSet schemaSet) { return new XmlQualifiedName("boolean", "http://www.w3.org/2001/XMLSchema"); } } [Serializable] [XmlSchemaProvider("GetXsdType")] public struct SqlByte : INullable, IComparable, IXmlSerializable { private bool m_fNotNull; private byte m_value; private static readonly int s_iBitNotByteMax = -256; public static readonly SqlByte Null = new SqlByte(fNull: true); public static readonly SqlByte Zero = new SqlByte(0); public static readonly SqlByte MinValue = new SqlByte(0); public static readonly SqlByte MaxValue = new SqlByte(byte.MaxValue); public bool IsNull => !m_fNotNull; public byte Value { get { if (m_fNotNull) { return m_value; } throw new SqlNullValueException(); } } private SqlByte(bool fNull) { m_fNotNull = false; m_value = 0; } public SqlByte(byte value) { m_value = value; m_fNotNull = true; } public static implicit operator SqlByte(byte x) { return new SqlByte(x); } public static explicit operator byte(SqlByte x) { return x.Value; } public override string ToString() { if (!IsNull) { return m_value.ToString((IFormatProvider?)null); } return SQLResource.NullString; } public static SqlByte Parse(string s) { if (s == SQLResource.NullString) { return Null; } return new SqlByte(byte.Parse(s, null)); } public static SqlByte operator ~(SqlByte x) { if (!x.IsNull) { return new SqlByte((byte)(~x.m_value)); } return Null; } public static SqlByte operator +(SqlByte x, SqlByte y) { if (x.IsNull || y.IsNull) { return Null; } int num = x.m_value + y.m_value; if ((num & s_iBitNotByteMax) != 0) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlByte((byte)num); } public static SqlByte operator -(SqlByte x, SqlByte y) { if (x.IsNull || y.IsNull) { return Null; } int num = x.m_value - y.m_value; if ((num & s_iBitNotByteMax) != 0) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlByte((byte)num); } public static SqlByte operator *(SqlByte x, SqlByte y) { if (x.IsNull || y.IsNull) { return Null; } int num = x.m_value * y.m_value; if ((num & s_iBitNotByteMax) != 0) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlByte((byte)num); } public static SqlByte operator /(SqlByte x, SqlByte y) { if (x.IsNull || y.IsNull) { return Null; } if (y.m_value != 0) { return new SqlByte((byte)(x.m_value / y.m_value)); } throw new DivideByZeroException(SQLResource.DivideByZeroMessage); } public static SqlByte operator %(SqlByte x, SqlByte y) { if (x.IsNull || y.IsNull) { return Null; } if (y.m_value != 0) { return new SqlByte((byte)(x.m_value % y.m_value)); } throw new DivideByZeroException(SQLResource.DivideByZeroMessage); } public static SqlByte operator &(SqlByte x, SqlByte y) { if (!x.IsNull && !y.IsNull) { return new SqlByte((byte)(x.m_value & y.m_value)); } return Null; } public static SqlByte operator |(SqlByte x, SqlByte y) { if (!x.IsNull && !y.IsNull) { return new SqlByte((byte)(x.m_value | y.m_value)); } return Null; } public static SqlByte operator ^(SqlByte x, SqlByte y) { if (!x.IsNull && !y.IsNull) { return new SqlByte((byte)(x.m_value ^ y.m_value)); } return Null; } public static explicit operator SqlByte(SqlBoolean x) { if (!x.IsNull) { return new SqlByte(x.ByteValue); } return Null; } public static explicit operator SqlByte(SqlMoney x) { if (!x.IsNull) { return new SqlByte(checked((byte)x.ToInt32())); } return Null; } public static explicit operator SqlByte(SqlInt16 x) { if (x.IsNull) { return Null; } if (x.Value > 255 || x.Value < 0) { throw new OverflowException(SQLResource.ArithOverflowMessage); } if (!x.IsNull) { return new SqlByte((byte)x.Value); } return Null; } public static explicit operator SqlByte(SqlInt32 x) { if (x.IsNull) { return Null; } if (x.Value > 255 || x.Value < 0) { throw new OverflowException(SQLResource.ArithOverflowMessage); } if (!x.IsNull) { return new SqlByte((byte)x.Value); } return Null; } public static explicit operator SqlByte(SqlInt64 x) { if (x.IsNull) { return Null; } if (x.Value > 255 || x.Value < 0) { throw new OverflowException(SQLResource.ArithOverflowMessage); } if (!x.IsNull) { return new SqlByte((byte)x.Value); } return Null; } public static explicit operator SqlByte(SqlSingle x) { if (x.IsNull) { return Null; } if (x.Value > 255f || x.Value < 0f) { throw new OverflowException(SQLResource.ArithOverflowMessage); } if (!x.IsNull) { return new SqlByte((byte)x.Value); } return Null; } public static explicit operator SqlByte(SqlDouble x) { if (x.IsNull) { return Null; } if (x.Value > 255.0 || x.Value < 0.0) { throw new OverflowException(SQLResource.ArithOverflowMessage); } if (!x.IsNull) { return new SqlByte((byte)x.Value); } return Null; } public static explicit operator SqlByte(SqlDecimal x) { return (SqlByte)(SqlInt32)x; } public static explicit operator SqlByte(SqlString x) { if (!x.IsNull) { return new SqlByte(byte.Parse(x.Value, null)); } return Null; } public static SqlBoolean operator ==(SqlByte x, SqlByte y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value == y.m_value); } return SqlBoolean.Null; } public static SqlBoolean operator !=(SqlByte x, SqlByte y) { return !(x == y); } public static SqlBoolean operator <(SqlByte x, SqlByte y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value < y.m_value); } return SqlBoolean.Null; } public static SqlBoolean operator >(SqlByte x, SqlByte y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value > y.m_value); } return SqlBoolean.Null; } public static SqlBoolean operator <=(SqlByte x, SqlByte y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value <= y.m_value); } return SqlBoolean.Null; } public static SqlBoolean operator >=(SqlByte x, SqlByte y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value >= y.m_value); } return SqlBoolean.Null; } public static SqlByte OnesComplement(SqlByte x) { return ~x; } public static SqlByte Add(SqlByte x, SqlByte y) { return x + y; } public static SqlByte Subtract(SqlByte x, SqlByte y) { return x - y; } public static SqlByte Multiply(SqlByte x, SqlByte y) { return x * y; } public static SqlByte Divide(SqlByte x, SqlByte y) { return x / y; } public static SqlByte Mod(SqlByte x, SqlByte y) { return x % y; } public static SqlByte Modulus(SqlByte x, SqlByte y) { return x % y; } public static SqlByte BitwiseAnd(SqlByte x, SqlByte y) { return x & y; } public static SqlByte BitwiseOr(SqlByte x, SqlByte y) { return x | y; } public static SqlByte Xor(SqlByte x, SqlByte y) { return x ^ y; } public static SqlBoolean Equals(SqlByte x, SqlByte y) { return x == y; } public static SqlBoolean NotEquals(SqlByte x, SqlByte y) { return x != y; } public static SqlBoolean LessThan(SqlByte x, SqlByte y) { return x < y; } public static SqlBoolean GreaterThan(SqlByte x, SqlByte y) { return x > y; } public static SqlBoolean LessThanOrEqual(SqlByte x, SqlByte y) { return x <= y; } public static SqlBoolean GreaterThanOrEqual(SqlByte x, SqlByte y) { return x >= y; } public SqlBoolean ToSqlBoolean() { return (SqlBoolean)this; } public SqlDouble ToSqlDouble() { return this; } public SqlInt16 ToSqlInt16() { return this; } public SqlInt32 ToSqlInt32() { return this; } public SqlInt64 ToSqlInt64() { return this; } public SqlMoney ToSqlMoney() { return this; } public SqlDecimal ToSqlDecimal() { return this; } public SqlSingle ToSqlSingle() { return this; } public SqlString ToSqlString() { return (SqlString)this; } public int CompareTo(object value) { if (value is SqlByte value2) { return CompareTo(value2); } throw ADP.WrongType(value.GetType(), typeof(SqlByte)); } public int CompareTo(SqlByte value) { if (IsNull) { if (!value.IsNull) { return -1; } return 0; } if (value.IsNull) { return 1; } if (this < value) { return -1; } if (this > value) { return 1; } return 0; } public override bool Equals(object value) { if (!(value is SqlByte sqlByte)) { return false; } if (sqlByte.IsNull || IsNull) { if (sqlByte.IsNull) { return IsNull; } return false; } return (this == sqlByte).Value; } public override int GetHashCode() { if (!IsNull) { return Value.GetHashCode(); } return 0; } XmlSchema IXmlSerializable.GetSchema() { return null; } void IXmlSerializable.ReadXml(XmlReader reader) { string attribute = reader.GetAttribute("nil", "http://www.w3.org/2001/XMLSchema-instance"); if (attribute != null && XmlConvert.ToBoolean(attribute)) { reader.ReadElementString(); m_fNotNull = false; } else { m_value = XmlConvert.ToByte(reader.ReadElementString()); m_fNotNull = true; } } void IXmlSerializable.WriteXml(XmlWriter writer) { if (IsNull) { writer.WriteAttributeString("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance", "true"); } else { writer.WriteString(XmlConvert.ToString(m_value)); } } public static XmlQualifiedName GetXsdType(XmlSchemaSet schemaSet) { return new XmlQualifiedName("unsignedByte", "http://www.w3.org/2001/XMLSchema"); } } internal enum SqlBytesCharsState { Null = 0, Buffer = 1, Stream = 3 } [Serializable] [XmlSchemaProvider("GetXsdType")] public sealed class SqlBytes : INullable, IXmlSerializable, ISerializable { internal byte[] _rgbBuf; private long _lCurLen; internal Stream _stream; private SqlBytesCharsState _state; private byte[] _rgbWorkBuf; private const long x_lMaxLen = 2147483647L; private const long x_lNull = -1L; public bool IsNull => _state == SqlBytesCharsState.Null; public byte[] Buffer { get { if (FStream()) { CopyStreamToBuffer(); } return _rgbBuf; } } public long Length => _state switch { SqlBytesCharsState.Null => throw new SqlNullValueException(), SqlBytesCharsState.Stream => _stream.Length, _ => _lCurLen, }; public long MaxLength { get { SqlBytesCharsState state = _state; if (state == SqlBytesCharsState.Stream) { return -1L; } if (_rgbBuf != null) { return _rgbBuf.Length; } return -1L; } } public byte[] Value { get { byte[] array; switch (_state) { case SqlBytesCharsState.Null: throw new SqlNullValueException(); case SqlBytesCharsState.Stream: if (_stream.Length > int.MaxValue) { throw new SqlTypeException("The buffer is insufficient. Read or write operation failed."); } array = new byte[_stream.Length]; if (_stream.Position != 0L) { _stream.Seek(0L, SeekOrigin.Begin); } _stream.Read(array, 0, checked((int)_stream.Length)); break; default: array = new byte[_lCurLen]; Array.Copy(_rgbBuf, 0, array, 0, (int)_lCurLen); break; } return array; } } public byte this[long offset] { get { if (offset < 0 || offset >= Length) { throw new ArgumentOutOfRangeException("offset"); } if (_rgbWorkBuf == null) { _rgbWorkBuf = new byte[1]; } Read(offset, _rgbWorkBuf, 0, 1); return _rgbWorkBuf[0]; } set { if (_rgbWorkBuf == null) { _rgbWorkBuf = new byte[1]; } _rgbWorkBuf[0] = value; Write(offset, _rgbWorkBuf, 0, 1); } } public StorageState Storage => _state switch { SqlBytesCharsState.Null => throw new SqlNullValueException(), SqlBytesCharsState.Stream => StorageState.Stream, SqlBytesCharsState.Buffer => StorageState.Buffer, _ => StorageState.UnmanagedBuffer, }; public Stream Stream { get { if (!FStream()) { return new StreamOnSqlBytes(this); } return _stream; } set { _lCurLen = -1L; _stream = value; _state = ((value != null) ? SqlBytesCharsState.Stream : SqlBytesCharsState.Null); } } public static SqlBytes Null => new SqlBytes((byte[])null); public SqlBytes() { SetNull(); } public SqlBytes(byte[] buffer) { _rgbBuf = buffer; _stream = null; if (_rgbBuf == null) { _state = SqlBytesCharsState.Null; _lCurLen = -1L; } else { _state = SqlBytesCharsState.Buffer; _lCurLen = _rgbBuf.Length; } _rgbWorkBuf = null; } public SqlBytes(SqlBinary value) : this(value.IsNull ? null : value.Value) { } public SqlBytes(Stream s) { _rgbBuf = null; _lCurLen = -1L; _stream = s; _state = ((s != null) ? SqlBytesCharsState.Stream : SqlBytesCharsState.Null); _rgbWorkBuf = null; } public void SetNull() { _lCurLen = -1L; _stream = null; _state = SqlBytesCharsState.Null; } public void SetLength(long value) { if (value < 0) { throw new ArgumentOutOfRangeException("value"); } if (FStream()) { _stream.SetLength(value); return; } if (_rgbBuf == null) { throw new SqlTypeException("There is no buffer. Read or write operation failed."); } if (value > _rgbBuf.Length) { throw new ArgumentOutOfRangeException("value"); } if (IsNull) { _state = SqlBytesCharsState.Buffer; } _lCurLen = value; } public long Read(long offset, byte[] buffer, int offsetInBuffer, int count) { if (IsNull) { throw new SqlNullValueException(); } if (buffer == null) { throw new ArgumentNullException("buffer"); } if (offset > Length || offset < 0) { throw new ArgumentOutOfRangeException("offset"); } if (offsetInBuffer > buffer.Length || offsetInBuffer < 0) { throw new ArgumentOutOfRangeException("offsetInBuffer"); } if (count < 0 || count > buffer.Length - offsetInBuffer) { throw new ArgumentOutOfRangeException("count"); } if (count > Length - offset) { count = (int)(Length - offset); } if (count != 0) { SqlBytesCharsState state = _state; if (state == SqlBytesCharsState.Stream) { if (_stream.Position != offset) { _stream.Seek(offset, SeekOrigin.Begin); } _stream.Read(buffer, offsetInBuffer, count); } else { Array.Copy(_rgbBuf, offset, buffer, offsetInBuffer, count); } } return count; } public void Write(long offset, byte[] buffer, int offsetInBuffer, int count) { if (FStream()) { if (_stream.Position != offset) { _stream.Seek(offset, SeekOrigin.Begin); } _stream.Write(buffer, offsetInBuffer, count); return; } if (buffer == null) { throw new ArgumentNullException("buffer"); } if (_rgbBuf == null) { throw new SqlTypeException("There is no buffer. Read or write operation failed."); } if (offset < 0) { throw new ArgumentOutOfRangeException("offset"); } if (offset > _rgbBuf.Length) { throw new SqlTypeException("The buffer is insufficient. Read or write operation failed."); } if (offsetInBuffer < 0 || offsetInBuffer > buffer.Length) { throw new ArgumentOutOfRangeException("offsetInBuffer"); } if (count < 0 || count > buffer.Length - offsetInBuffer) { throw new ArgumentOutOfRangeException("count"); } if (count > _rgbBuf.Length - offset) { throw new SqlTypeException("The buffer is insufficient. Read or write operation failed."); } if (IsNull) { if (offset != 0L) { throw new SqlTypeException("Cannot write to non-zero offset, because current value is Null."); } _lCurLen = 0L; _state = SqlBytesCharsState.Buffer; } else if (offset > _lCurLen) { throw new SqlTypeException("Cannot write from an offset that is larger than current length. It would leave uninitialized data in the buffer."); } if (count != 0) { Array.Copy(buffer, offsetInBuffer, _rgbBuf, offset, count); if (_lCurLen < offset + count) { _lCurLen = offset + count; } } } public SqlBinary ToSqlBinary() { if (!IsNull) { return new SqlBinary(Value); } return SqlBinary.Null; } public static explicit operator SqlBinary(SqlBytes value) { return value.ToSqlBinary(); } public static explicit operator SqlBytes(SqlBinary value) { return new SqlBytes(value); } [Conditional("DEBUG")] private void AssertValid() { _ = IsNull; } private void CopyStreamToBuffer() { long length = _stream.Length; if (length >= int.MaxValue) { throw new SqlTypeException("Cannot write from an offset that is larger than current length. It would leave uninitialized data in the buffer."); } if (_rgbBuf == null || _rgbBuf.Length < length) { _rgbBuf = new byte[length]; } if (_stream.Position != 0L) { _stream.Seek(0L, SeekOrigin.Begin); } _stream.Read(_rgbBuf, 0, (int)length); _stream = null; _lCurLen = length; _state = SqlBytesCharsState.Buffer; } internal bool FStream() { return _state == SqlBytesCharsState.Stream; } private void SetBuffer(byte[] buffer) { _rgbBuf = buffer; _lCurLen = ((_rgbBuf == null) ? (-1) : _rgbBuf.Length); _stream = null; _state = ((_rgbBuf != null) ? SqlBytesCharsState.Buffer : SqlBytesCharsState.Null); } XmlSchema IXmlSerializable.GetSchema() { return null; } void IXmlSerializable.ReadXml(XmlReader r) { byte[] buffer = null; string attribute = r.GetAttribute("nil", "http://www.w3.org/2001/XMLSchema-instance"); if (attribute != null && XmlConvert.ToBoolean(attribute)) { r.ReadElementString(); SetNull(); } else { string text = r.ReadElementString(); if (text == null) { buffer = Array.Empty(); } else { text = text.Trim(); buffer = ((text.Length != 0) ? Convert.FromBase64String(text) : Array.Empty()); } } SetBuffer(buffer); } void IXmlSerializable.WriteXml(XmlWriter writer) { if (IsNull) { writer.WriteAttributeString("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance", "true"); return; } byte[] buffer = Buffer; writer.WriteString(Convert.ToBase64String(buffer, 0, (int)Length)); } public static XmlQualifiedName GetXsdType(XmlSchemaSet schemaSet) { return new XmlQualifiedName("base64Binary", "http://www.w3.org/2001/XMLSchema"); } void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { throw new PlatformNotSupportedException(); } } internal sealed class StreamOnSqlBytes : Stream { private SqlBytes _sb; private long _lPosition; public override bool CanRead { get { if (_sb != null) { return !_sb.IsNull; } return false; } } public override bool CanSeek => _sb != null; public override bool CanWrite { get { if (_sb != null) { if (_sb.IsNull) { return _sb._rgbBuf != null; } return true; } return false; } } public override long Length { get { CheckIfStreamClosed("get_Length"); return _sb.Length; } } public override long Position { get { CheckIfStreamClosed("get_Position"); return _lPosition; } set { CheckIfStreamClosed("set_Position"); if (value < 0 || value > _sb.Length) { throw new ArgumentOutOfRangeException("value"); } _lPosition = value; } } internal StreamOnSqlBytes(SqlBytes sb) { _sb = sb; _lPosition = 0L; } public override long Seek(long offset, SeekOrigin origin) { CheckIfStreamClosed("Seek"); long num = 0L; switch (origin) { case SeekOrigin.Begin: if (offset < 0 || offset > _sb.Length) { throw new ArgumentOutOfRangeException("offset"); } _lPosition = offset; break; case SeekOrigin.Current: num = _lPosition + offset; if (num < 0 || num > _sb.Length) { throw new ArgumentOutOfRangeException("offset"); } _lPosition = num; break; case SeekOrigin.End: num = _sb.Length + offset; if (num < 0 || num > _sb.Length) { throw new ArgumentOutOfRangeException("offset"); } _lPosition = num; break; default: throw ADP.InvalidSeekOrigin("offset"); } return _lPosition; } public override int Read(byte[] buffer, int offset, int count) { CheckIfStreamClosed("Read"); if (buffer == null) { throw new ArgumentNullException("buffer"); } if (offset < 0 || offset > buffer.Length) { throw new ArgumentOutOfRangeException("offset"); } if (count < 0 || count > buffer.Length - offset) { throw new ArgumentOutOfRangeException("count"); } int num = (int)_sb.Read(_lPosition, buffer, offset, count); _lPosition += num; return num; } public override void Write(byte[] buffer, int offset, int count) { CheckIfStreamClosed("Write"); if (buffer == null) { throw new ArgumentNullException("buffer"); } if (offset < 0 || offset > buffer.Length) { throw new ArgumentOutOfRangeException("offset"); } if (count < 0 || count > buffer.Length - offset) { throw new ArgumentOutOfRangeException("count"); } _sb.Write(_lPosition, buffer, offset, count); _lPosition += count; } public override int ReadByte() { CheckIfStreamClosed("ReadByte"); if (_lPosition >= _sb.Length) { return -1; } byte result = _sb[_lPosition]; _lPosition++; return result; } public override void WriteByte(byte value) { CheckIfStreamClosed("WriteByte"); _sb[_lPosition] = value; _lPosition++; } public override void SetLength(long value) { CheckIfStreamClosed("SetLength"); _sb.SetLength(value); if (_lPosition > value) { _lPosition = value; } } public override void Flush() { if (_sb.FStream()) { _sb._stream.Flush(); } } protected override void Dispose(bool disposing) { try { _sb = null; } finally { base.Dispose(disposing); } } private bool FClosed() { return _sb == null; } private void CheckIfStreamClosed([CallerMemberName] string methodname = "") { if (FClosed()) { throw ADP.StreamClosed(methodname); } } } [Serializable] [XmlSchemaProvider("GetXsdType")] public sealed class SqlChars : INullable, IXmlSerializable, ISerializable { internal char[] _rgchBuf; private long _lCurLen; internal SqlStreamChars _stream; private SqlBytesCharsState _state; private char[] _rgchWorkBuf; private const long x_lMaxLen = 2147483647L; private const long x_lNull = -1L; public bool IsNull => _state == SqlBytesCharsState.Null; public char[] Buffer { get { if (FStream()) { CopyStreamToBuffer(); } return _rgchBuf; } } public long Length => _state switch { SqlBytesCharsState.Null => throw new SqlNullValueException(), SqlBytesCharsState.Stream => _stream.Length, _ => _lCurLen, }; public long MaxLength { get { SqlBytesCharsState state = _state; if (state == SqlBytesCharsState.Stream) { return -1L; } if (_rgchBuf != null) { return _rgchBuf.Length; } return -1L; } } public char[] Value { get { char[] array; switch (_state) { case SqlBytesCharsState.Null: throw new SqlNullValueException(); case SqlBytesCharsState.Stream: if (_stream.Length > int.MaxValue) { throw new SqlTypeException("The buffer is insufficient. Read or write operation failed."); } array = new char[_stream.Length]; if (_stream.Position != 0L) { _stream.Seek(0L, SeekOrigin.Begin); } _stream.Read(array, 0, checked((int)_stream.Length)); break; default: array = new char[_lCurLen]; Array.Copy(_rgchBuf, 0, array, 0, (int)_lCurLen); break; } return array; } } public char this[long offset] { get { if (offset < 0 || offset >= Length) { throw new ArgumentOutOfRangeException("offset"); } if (_rgchWorkBuf == null) { _rgchWorkBuf = new char[1]; } Read(offset, _rgchWorkBuf, 0, 1); return _rgchWorkBuf[0]; } set { if (_rgchWorkBuf == null) { _rgchWorkBuf = new char[1]; } _rgchWorkBuf[0] = value; Write(offset, _rgchWorkBuf, 0, 1); } } internal SqlStreamChars Stream { get { if (!FStream()) { return new StreamOnSqlChars(this); } return _stream; } set { _lCurLen = -1L; _stream = value; _state = ((value != null) ? SqlBytesCharsState.Stream : SqlBytesCharsState.Null); } } public StorageState Storage => _state switch { SqlBytesCharsState.Null => throw new SqlNullValueException(), SqlBytesCharsState.Stream => StorageState.Stream, SqlBytesCharsState.Buffer => StorageState.Buffer, _ => StorageState.UnmanagedBuffer, }; public static SqlChars Null => new SqlChars((char[])null); public SqlChars() { SetNull(); } public SqlChars(char[] buffer) { _rgchBuf = buffer; _stream = null; if (_rgchBuf == null) { _state = SqlBytesCharsState.Null; _lCurLen = -1L; } else { _state = SqlBytesCharsState.Buffer; _lCurLen = _rgchBuf.Length; } _rgchWorkBuf = null; } public SqlChars(SqlString value) : this(value.IsNull ? null : value.Value.ToCharArray()) { } internal SqlChars(SqlStreamChars s) { _rgchBuf = null; _lCurLen = -1L; _stream = s; _state = ((s != null) ? SqlBytesCharsState.Stream : SqlBytesCharsState.Null); _rgchWorkBuf = null; } public void SetNull() { _lCurLen = -1L; _stream = null; _state = SqlBytesCharsState.Null; } public void SetLength(long value) { if (value < 0) { throw new ArgumentOutOfRangeException("value"); } if (FStream()) { _stream.SetLength(value); return; } if (_rgchBuf == null) { throw new SqlTypeException("There is no buffer. Read or write operation failed."); } if (value > _rgchBuf.Length) { throw new ArgumentOutOfRangeException("value"); } if (IsNull) { _state = SqlBytesCharsState.Buffer; } _lCurLen = value; } public long Read(long offset, char[] buffer, int offsetInBuffer, int count) { if (IsNull) { throw new SqlNullValueException(); } if (buffer == null) { throw new ArgumentNullException("buffer"); } if (offset > Length || offset < 0) { throw new ArgumentOutOfRangeException("offset"); } if (offsetInBuffer > buffer.Length || offsetInBuffer < 0) { throw new ArgumentOutOfRangeException("offsetInBuffer"); } if (count < 0 || count > buffer.Length - offsetInBuffer) { throw new ArgumentOutOfRangeException("count"); } if (count > Length - offset) { count = (int)(Length - offset); } if (count != 0) { SqlBytesCharsState state = _state; if (state == SqlBytesCharsState.Stream) { if (_stream.Position != offset) { _stream.Seek(offset, SeekOrigin.Begin); } _stream.Read(buffer, offsetInBuffer, count); } else { Array.Copy(_rgchBuf, offset, buffer, offsetInBuffer, count); } } return count; } public void Write(long offset, char[] buffer, int offsetInBuffer, int count) { if (FStream()) { if (_stream.Position != offset) { _stream.Seek(offset, SeekOrigin.Begin); } _stream.Write(buffer, offsetInBuffer, count); return; } if (buffer == null) { throw new ArgumentNullException("buffer"); } if (_rgchBuf == null) { throw new SqlTypeException("There is no buffer. Read or write operation failed."); } if (offset < 0) { throw new ArgumentOutOfRangeException("offset"); } if (offset > _rgchBuf.Length) { throw new SqlTypeException("The buffer is insufficient. Read or write operation failed."); } if (offsetInBuffer < 0 || offsetInBuffer > buffer.Length) { throw new ArgumentOutOfRangeException("offsetInBuffer"); } if (count < 0 || count > buffer.Length - offsetInBuffer) { throw new ArgumentOutOfRangeException("count"); } if (count > _rgchBuf.Length - offset) { throw new SqlTypeException("The buffer is insufficient. Read or write operation failed."); } if (IsNull) { if (offset != 0L) { throw new SqlTypeException("Cannot write to non-zero offset, because current value is Null."); } _lCurLen = 0L; _state = SqlBytesCharsState.Buffer; } else if (offset > _lCurLen) { throw new SqlTypeException("Cannot write from an offset that is larger than current length. It would leave uninitialized data in the buffer."); } if (count != 0) { Array.Copy(buffer, offsetInBuffer, _rgchBuf, offset, count); if (_lCurLen < offset + count) { _lCurLen = offset + count; } } } public SqlString ToSqlString() { if (!IsNull) { return new string(Value); } return SqlString.Null; } public static explicit operator SqlString(SqlChars value) { return value.ToSqlString(); } public static explicit operator SqlChars(SqlString value) { return new SqlChars(value); } [Conditional("DEBUG")] private void AssertValid() { _ = IsNull; } internal bool FStream() { return _state == SqlBytesCharsState.Stream; } private void CopyStreamToBuffer() { long length = _stream.Length; if (length >= int.MaxValue) { throw new SqlTypeException("The buffer is insufficient. Read or write operation failed."); } if (_rgchBuf == null || _rgchBuf.Length < length) { _rgchBuf = new char[length]; } if (_stream.Position != 0L) { _stream.Seek(0L, SeekOrigin.Begin); } _stream.Read(_rgchBuf, 0, (int)length); _stream = null; _lCurLen = length; _state = SqlBytesCharsState.Buffer; } private void SetBuffer(char[] buffer) { _rgchBuf = buffer; _lCurLen = ((_rgchBuf == null) ? (-1) : _rgchBuf.Length); _stream = null; _state = ((_rgchBuf != null) ? SqlBytesCharsState.Buffer : SqlBytesCharsState.Null); } XmlSchema IXmlSerializable.GetSchema() { return null; } void IXmlSerializable.ReadXml(XmlReader r) { char[] array = null; string attribute = r.GetAttribute("nil", "http://www.w3.org/2001/XMLSchema-instance"); if (attribute != null && XmlConvert.ToBoolean(attribute)) { r.ReadElementString(); SetNull(); } else { array = r.ReadElementString().ToCharArray(); SetBuffer(array); } } void IXmlSerializable.WriteXml(XmlWriter writer) { if (IsNull) { writer.WriteAttributeString("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance", "true"); return; } char[] buffer = Buffer; writer.WriteString(new string(buffer, 0, (int)Length)); } public static XmlQualifiedName GetXsdType(XmlSchemaSet schemaSet) { return new XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema"); } void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { throw new PlatformNotSupportedException(); } } internal sealed class StreamOnSqlChars : SqlStreamChars { private SqlChars _sqlchars; private long _lPosition; public override bool IsNull { get { if (_sqlchars != null) { return _sqlchars.IsNull; } return true; } } public override long Length { get { CheckIfStreamClosed("get_Length"); return _sqlchars.Length; } } public override long Position { get { CheckIfStreamClosed("get_Position"); return _lPosition; } set { CheckIfStreamClosed("set_Position"); if (value < 0 || value > _sqlchars.Length) { throw new ArgumentOutOfRangeException("value"); } _lPosition = value; } } internal StreamOnSqlChars(SqlChars s) { _sqlchars = s; _lPosition = 0L; } public override long Seek(long offset, SeekOrigin origin) { CheckIfStreamClosed("Seek"); long num = 0L; switch (origin) { case SeekOrigin.Begin: if (offset < 0 || offset > _sqlchars.Length) { throw ADP.ArgumentOutOfRange("offset"); } _lPosition = offset; break; case SeekOrigin.Current: num = _lPosition + offset; if (num < 0 || num > _sqlchars.Length) { throw ADP.ArgumentOutOfRange("offset"); } _lPosition = num; break; case SeekOrigin.End: num = _sqlchars.Length + offset; if (num < 0 || num > _sqlchars.Length) { throw ADP.ArgumentOutOfRange("offset"); } _lPosition = num; break; default: throw ADP.ArgumentOutOfRange("offset"); } return _lPosition; } public override int Read(char[] buffer, int offset, int count) { CheckIfStreamClosed("Read"); if (buffer == null) { throw new ArgumentNullException("buffer"); } if (offset < 0 || offset > buffer.Length) { throw new ArgumentOutOfRangeException("offset"); } if (count < 0 || count > buffer.Length - offset) { throw new ArgumentOutOfRangeException("count"); } int num = (int)_sqlchars.Read(_lPosition, buffer, offset, count); _lPosition += num; return num; } public override void Write(char[] buffer, int offset, int count) { CheckIfStreamClosed("Write"); if (buffer == null) { throw new ArgumentNullException("buffer"); } if (offset < 0 || offset > buffer.Length) { throw new ArgumentOutOfRangeException("offset"); } if (count < 0 || count > buffer.Length - offset) { throw new ArgumentOutOfRangeException("count"); } _sqlchars.Write(_lPosition, buffer, offset, count); _lPosition += count; } public override void SetLength(long value) { CheckIfStreamClosed("SetLength"); _sqlchars.SetLength(value); if (_lPosition > value) { _lPosition = value; } } protected override void Dispose(bool disposing) { _sqlchars = null; } private bool FClosed() { return _sqlchars == null; } private void CheckIfStreamClosed([CallerMemberName] string methodname = "") { if (FClosed()) { throw ADP.StreamClosed(methodname); } } } [Serializable] [XmlSchemaProvider("GetXsdType")] public struct SqlDateTime : INullable, IComparable, IXmlSerializable { private bool m_fNotNull; private int m_day; private int m_time; private static readonly double s_SQLTicksPerMillisecond = 0.3; public static readonly int SQLTicksPerSecond = 300; public static readonly int SQLTicksPerMinute = SQLTicksPerSecond * 60; public static readonly int SQLTicksPerHour = SQLTicksPerMinute * 60; private static readonly int s_SQLTicksPerDay = SQLTicksPerHour * 24; private static readonly long s_ticksPerSecond = 10000000L; private static readonly DateTime s_SQLBaseDate = new DateTime(1900, 1, 1); private static readonly long s_SQLBaseDateTicks = s_SQLBaseDate.Ticks; private static readonly int s_minYear = 1753; private static readonly int s_maxYear = 9999; private static readonly int s_minDay = -53690; private static readonly int s_maxDay = 2958463; private static readonly int s_minTime = 0; private static readonly int s_maxTime = s_SQLTicksPerDay - 1; private static readonly int s_dayBase = 693595; private static readonly int[] s_daysToMonth365 = new int[13] { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }; private static readonly int[] s_daysToMonth366 = new int[13] { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }; private static readonly DateTime s_minDateTime = new DateTime(1753, 1, 1); private static readonly DateTime s_maxDateTime = DateTime.MaxValue; private static readonly TimeSpan s_minTimeSpan = s_minDateTime.Subtract(s_SQLBaseDate); private static readonly TimeSpan s_maxTimeSpan = s_maxDateTime.Subtract(s_SQLBaseDate); private static readonly string s_ISO8601_DateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fff"; private static readonly string[] s_dateTimeFormats = new string[8] { "MMM d yyyy hh:mm:ss:ffftt", "MMM d yyyy hh:mm:ss:fff", "d MMM yyyy hh:mm:ss:ffftt", "d MMM yyyy hh:mm:ss:fff", "hh:mm:ss:ffftt", "hh:mm:ss:fff", "yyMMdd", "yyyyMMdd" }; private const DateTimeStyles x_DateTimeStyle = DateTimeStyles.AllowWhiteSpaces; public static readonly SqlDateTime MinValue = new SqlDateTime(s_minDay, 0); public static readonly SqlDateTime MaxValue = new SqlDateTime(s_maxDay, s_maxTime); public static readonly SqlDateTime Null = new SqlDateTime(fNull: true); public bool IsNull => !m_fNotNull; public DateTime Value { get { if (m_fNotNull) { return ToDateTime(this); } throw new SqlNullValueException(); } } public int DayTicks { get { if (m_fNotNull) { return m_day; } throw new SqlNullValueException(); } } public int TimeTicks { get { if (m_fNotNull) { return m_time; } throw new SqlNullValueException(); } } private SqlDateTime(bool fNull) { m_fNotNull = false; m_day = 0; m_time = 0; } public SqlDateTime(DateTime value) { this = FromDateTime(value); } public SqlDateTime(int year, int month, int day) : this(year, month, day, 0, 0, 0, 0.0) { } public SqlDateTime(int year, int month, int day, int hour, int minute, int second) : this(year, month, day, hour, minute, second, 0.0) { } public SqlDateTime(int year, int month, int day, int hour, int minute, int second, double millisecond) { if (year >= s_minYear && year <= s_maxYear && month >= 1 && month <= 12) { int[] array = (IsLeapYear(year) ? s_daysToMonth366 : s_daysToMonth365); if (day >= 1 && day <= array[month] - array[month - 1]) { int num = year - 1; int num2 = num * 365 + num / 4 - num / 100 + num / 400 + array[month - 1] + day - 1; num2 -= s_dayBase; if (num2 >= s_minDay && num2 <= s_maxDay && hour >= 0 && hour < 24 && minute >= 0 && minute < 60 && second >= 0 && second < 60 && millisecond >= 0.0 && millisecond < 1000.0) { double num3 = millisecond * s_SQLTicksPerMillisecond + 0.5; int num4 = hour * SQLTicksPerHour + minute * SQLTicksPerMinute + second * SQLTicksPerSecond + (int)num3; if (num4 > s_maxTime) { num4 = 0; num2++; } this = new SqlDateTime(num2, num4); return; } } } throw new SqlTypeException(SQLResource.InvalidDateTimeMessage); } public SqlDateTime(int year, int month, int day, int hour, int minute, int second, int bilisecond) : this(year, month, day, hour, minute, second, (double)bilisecond / 1000.0) { } public SqlDateTime(int dayTicks, int timeTicks) { if (dayTicks < s_minDay || dayTicks > s_maxDay || timeTicks < s_minTime || timeTicks > s_maxTime) { m_fNotNull = false; throw new OverflowException(SQLResource.DateTimeOverflowMessage); } m_day = dayTicks; m_time = timeTicks; m_fNotNull = true; } internal SqlDateTime(double dblVal) { if (dblVal < (double)s_minDay || dblVal >= (double)(s_maxDay + 1)) { throw new OverflowException(SQLResource.DateTimeOverflowMessage); } int num = (int)dblVal; int num2 = (int)((dblVal - (double)num) * (double)s_SQLTicksPerDay); if (num2 < 0) { num--; num2 += s_SQLTicksPerDay; } else if (num2 >= s_SQLTicksPerDay) { num++; num2 -= s_SQLTicksPerDay; } this = new SqlDateTime(num, num2); } private static TimeSpan ToTimeSpan(SqlDateTime value) { long num = (long)((double)value.m_time / s_SQLTicksPerMillisecond + 0.5); return new TimeSpan(value.m_day * 864000000000L + num * 10000); } private static DateTime ToDateTime(SqlDateTime value) { DateTime dateTime = s_SQLBaseDate; return dateTime.Add(ToTimeSpan(value)); } internal static DateTime ToDateTime(int daypart, int timepart) { if (daypart < s_minDay || daypart > s_maxDay || timepart < s_minTime || timepart > s_maxTime) { throw new OverflowException(SQLResource.DateTimeOverflowMessage); } long num = daypart * 864000000000L; long num2 = (long)((double)timepart / s_SQLTicksPerMillisecond + 0.5) * 10000; return new DateTime(s_SQLBaseDateTicks + num + num2); } private static SqlDateTime FromTimeSpan(TimeSpan value) { if (value < s_minTimeSpan || value > s_maxTimeSpan) { throw new SqlTypeException(SQLResource.DateTimeOverflowMessage); } int num = value.Days; long num2 = value.Ticks - num * 864000000000L; if (num2 < 0) { num--; num2 += 864000000000L; } int num3 = (int)((double)num2 / 10000.0 * s_SQLTicksPerMillisecond + 0.5); if (num3 > s_maxTime) { num3 = 0; num++; } return new SqlDateTime(num, num3); } private static SqlDateTime FromDateTime(DateTime value) { if (value == DateTime.MaxValue) { return MaxValue; } return FromTimeSpan(value.Subtract(s_SQLBaseDate)); } public static implicit operator SqlDateTime(DateTime value) { return new SqlDateTime(value); } public static explicit operator DateTime(SqlDateTime x) { return ToDateTime(x); } public override string ToString() { if (IsNull) { return SQLResource.NullString; } return ToDateTime(this).ToString((IFormatProvider?)null); } public static SqlDateTime Parse(string s) { if (s == SQLResource.NullString) { return Null; } DateTime value; try { value = DateTime.Parse(s, CultureInfo.InvariantCulture); } catch (FormatException) { DateTimeFormatInfo provider = (DateTimeFormatInfo)CultureInfo.CurrentCulture.GetFormat(typeof(DateTimeFormatInfo)); value = DateTime.ParseExact(s, s_dateTimeFormats, provider, DateTimeStyles.AllowWhiteSpaces); } return new SqlDateTime(value); } public static SqlDateTime operator +(SqlDateTime x, TimeSpan t) { if (!x.IsNull) { return FromDateTime(ToDateTime(x) + t); } return Null; } public static SqlDateTime operator -(SqlDateTime x, TimeSpan t) { if (!x.IsNull) { return FromDateTime(ToDateTime(x) - t); } return Null; } public static SqlDateTime Add(SqlDateTime x, TimeSpan t) { return x + t; } public static SqlDateTime Subtract(SqlDateTime x, TimeSpan t) { return x - t; } public static explicit operator SqlDateTime(SqlString x) { if (!x.IsNull) { return Parse(x.Value); } return Null; } private static bool IsLeapYear(int year) { if (year % 4 == 0) { if (year % 100 == 0) { return year % 400 == 0; } return true; } return false; } public static SqlBoolean operator ==(SqlDateTime x, SqlDateTime y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_day == y.m_day && x.m_time == y.m_time); } return SqlBoolean.Null; } public static SqlBoolean operator !=(SqlDateTime x, SqlDateTime y) { return !(x == y); } public static SqlBoolean operator <(SqlDateTime x, SqlDateTime y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_day < y.m_day || (x.m_day == y.m_day && x.m_time < y.m_time)); } return SqlBoolean.Null; } public static SqlBoolean operator >(SqlDateTime x, SqlDateTime y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_day > y.m_day || (x.m_day == y.m_day && x.m_time > y.m_time)); } return SqlBoolean.Null; } public static SqlBoolean operator <=(SqlDateTime x, SqlDateTime y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_day < y.m_day || (x.m_day == y.m_day && x.m_time <= y.m_time)); } return SqlBoolean.Null; } public static SqlBoolean operator >=(SqlDateTime x, SqlDateTime y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_day > y.m_day || (x.m_day == y.m_day && x.m_time >= y.m_time)); } return SqlBoolean.Null; } public static SqlBoolean Equals(SqlDateTime x, SqlDateTime y) { return x == y; } public static SqlBoolean NotEquals(SqlDateTime x, SqlDateTime y) { return x != y; } public static SqlBoolean LessThan(SqlDateTime x, SqlDateTime y) { return x < y; } public static SqlBoolean GreaterThan(SqlDateTime x, SqlDateTime y) { return x > y; } public static SqlBoolean LessThanOrEqual(SqlDateTime x, SqlDateTime y) { return x <= y; } public static SqlBoolean GreaterThanOrEqual(SqlDateTime x, SqlDateTime y) { return x >= y; } public SqlString ToSqlString() { return (SqlString)this; } public int CompareTo(object value) { if (value is SqlDateTime value2) { return CompareTo(value2); } throw ADP.WrongType(value.GetType(), typeof(SqlDateTime)); } public int CompareTo(SqlDateTime value) { if (IsNull) { if (!value.IsNull) { return -1; } return 0; } if (value.IsNull) { return 1; } if (this < value) { return -1; } if (this > value) { return 1; } return 0; } public override bool Equals(object value) { if (!(value is SqlDateTime sqlDateTime)) { return false; } if (sqlDateTime.IsNull || IsNull) { if (sqlDateTime.IsNull) { return IsNull; } return false; } return (this == sqlDateTime).Value; } public override int GetHashCode() { if (!IsNull) { return Value.GetHashCode(); } return 0; } XmlSchema IXmlSerializable.GetSchema() { return null; } void IXmlSerializable.ReadXml(XmlReader reader) { string attribute = reader.GetAttribute("nil", "http://www.w3.org/2001/XMLSchema-instance"); if (attribute != null && XmlConvert.ToBoolean(attribute)) { reader.ReadElementString(); m_fNotNull = false; return; } DateTime value = XmlConvert.ToDateTime(reader.ReadElementString(), XmlDateTimeSerializationMode.RoundtripKind); if (value.Kind != 0) { throw new SqlTypeException(SQLResource.TimeZoneSpecifiedMessage); } SqlDateTime sqlDateTime = FromDateTime(value); m_day = sqlDateTime.DayTicks; m_time = sqlDateTime.TimeTicks; m_fNotNull = true; } void IXmlSerializable.WriteXml(XmlWriter writer) { if (IsNull) { writer.WriteAttributeString("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance", "true"); } else { writer.WriteString(XmlConvert.ToString(Value, s_ISO8601_DateTimeFormat)); } } public static XmlQualifiedName GetXsdType(XmlSchemaSet schemaSet) { return new XmlQualifiedName("dateTime", "http://www.w3.org/2001/XMLSchema"); } } [Serializable] [XmlSchemaProvider("GetXsdType")] public struct SqlDecimal : INullable, IComparable, IXmlSerializable { internal byte _bStatus; internal byte _bLen; internal byte _bPrec; internal byte _bScale; internal uint _data1; internal uint _data2; internal uint _data3; internal uint _data4; private static readonly byte s_NUMERIC_MAX_PRECISION = 38; public static readonly byte MaxPrecision = s_NUMERIC_MAX_PRECISION; public static readonly byte MaxScale = s_NUMERIC_MAX_PRECISION; private static readonly byte s_bNullMask = 1; private static readonly byte s_bIsNull = 0; private static readonly byte s_bNotNull = 1; private static readonly byte s_bReverseNullMask = (byte)(~s_bNullMask); private static readonly byte s_bSignMask = 2; private static readonly byte s_bPositive = 0; private static readonly byte s_bNegative = 2; private static readonly byte s_bReverseSignMask = (byte)(~s_bSignMask); private static readonly uint s_uiZero = 0u; private static readonly int s_cNumeMax = 4; private static readonly long s_lInt32Base = 4294967296L; private static readonly ulong s_ulInt32Base = 4294967296uL; private static readonly ulong s_ulInt32BaseForMod = s_ulInt32Base - 1; internal static readonly ulong s_llMax = 9223372036854775807uL; private static readonly uint s_ulBase10 = 10u; private static readonly double s_DUINT_BASE = s_lInt32Base; private static readonly double s_DUINT_BASE2 = s_DUINT_BASE * s_DUINT_BASE; private static readonly double s_DUINT_BASE3 = s_DUINT_BASE2 * s_DUINT_BASE; private static readonly double s_DMAX_NUME = 1E+38; private static readonly uint s_DBL_DIG = 17u; private static readonly byte s_cNumeDivScaleMin = 6; private static readonly uint[] s_rgulShiftBase = new uint[9] { 10u, 100u, 1000u, 10000u, 100000u, 1000000u, 10000000u, 100000000u, 1000000000u }; private static readonly uint[] s_decimalHelpersLo = new uint[38] { 10u, 100u, 1000u, 10000u, 100000u, 1000000u, 10000000u, 100000000u, 1000000000u, 1410065408u, 1215752192u, 3567587328u, 1316134912u, 276447232u, 2764472320u, 1874919424u, 1569325056u, 2808348672u, 2313682944u, 1661992960u, 3735027712u, 2990538752u, 4135583744u, 2701131776u, 1241513984u, 3825205248u, 3892314112u, 268435456u, 2684354560u, 1073741824u, 2147483648u, 0u, 0u, 0u, 0u, 0u, 0u, 0u }; private static readonly uint[] s_decimalHelpersMid = new uint[38] { 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 2u, 23u, 232u, 2328u, 23283u, 232830u, 2328306u, 23283064u, 232830643u, 2328306436u, 1808227885u, 902409669u, 434162106u, 46653770u, 466537709u, 370409800u, 3704098002u, 2681241660u, 1042612833u, 1836193738u, 1182068202u, 3230747430u, 2242703233u, 952195850u, 932023908u, 730304488u, 3008077584u, 16004768u, 160047680u }; private static readonly uint[] s_decimalHelpersHi = new uint[38] { 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 5u, 54u, 542u, 5421u, 54210u, 542101u, 5421010u, 54210108u, 542101086u, 1126043566u, 2670501072u, 935206946u, 762134875u, 3326381459u, 3199043520u, 1925664130u, 2076772117u, 3587851993u, 1518781562u }; private static readonly uint[] s_decimalHelpersHiHi = new uint[38] { 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 1u, 12u, 126u, 1262u, 12621u, 126217u, 1262177u, 12621774u, 126217744u, 1262177448u }; private const int HelperTableStartIndexLo = 5; private const int HelperTableStartIndexMid = 15; private const int HelperTableStartIndexHi = 24; private const int HelperTableStartIndexHiHi = 33; private static readonly byte[] s_rgCLenFromPrec = new byte[38] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 }; private static readonly uint s_ulT1 = 10u; private static readonly uint s_ulT2 = 100u; private static readonly uint s_ulT3 = 1000u; private static readonly uint s_ulT4 = 10000u; private static readonly uint s_ulT5 = 100000u; private static readonly uint s_ulT6 = 1000000u; private static readonly uint s_ulT7 = 10000000u; private static readonly uint s_ulT8 = 100000000u; private static readonly uint s_ulT9 = 1000000000u; private static readonly ulong s_dwlT10 = 10000000000uL; private static readonly ulong s_dwlT11 = 100000000000uL; private static readonly ulong s_dwlT12 = 1000000000000uL; private static readonly ulong s_dwlT13 = 10000000000000uL; private static readonly ulong s_dwlT14 = 100000000000000uL; private static readonly ulong s_dwlT15 = 1000000000000000uL; private static readonly ulong s_dwlT16 = 10000000000000000uL; private static readonly ulong s_dwlT17 = 100000000000000000uL; private static readonly ulong s_dwlT18 = 1000000000000000000uL; private static readonly ulong s_dwlT19 = 10000000000000000000uL; public static readonly SqlDecimal Null = new SqlDecimal(fNull: true); public static readonly SqlDecimal MinValue = Parse("-99999999999999999999999999999999999999"); public static readonly SqlDecimal MaxValue = Parse("99999999999999999999999999999999999999"); public bool IsNull => (_bStatus & s_bNullMask) == s_bIsNull; public decimal Value => ToDecimal(); public bool IsPositive { get { if (IsNull) { throw new SqlNullValueException(); } return (_bStatus & s_bSignMask) == s_bPositive; } } public byte Precision { get { if (IsNull) { throw new SqlNullValueException(); } return _bPrec; } } public byte Scale { get { if (IsNull) { throw new SqlNullValueException(); } return _bScale; } } public int[] Data { get { if (IsNull) { throw new SqlNullValueException(); } return new int[4] { (int)_data1, (int)_data2, (int)_data3, (int)_data4 }; } } public byte[] BinData { get { if (IsNull) { throw new SqlNullValueException(); } int data = (int)_data1; int data2 = (int)_data2; int data3 = (int)_data3; int data4 = (int)_data4; byte[] obj = new byte[16] { (byte)((uint)data & 0xFFu), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; data >>= 8; obj[1] = (byte)((uint)data & 0xFFu); data >>= 8; obj[2] = (byte)((uint)data & 0xFFu); data >>= 8; obj[3] = (byte)((uint)data & 0xFFu); obj[4] = (byte)((uint)data2 & 0xFFu); data2 >>= 8; obj[5] = (byte)((uint)data2 & 0xFFu); data2 >>= 8; obj[6] = (byte)((uint)data2 & 0xFFu); data2 >>= 8; obj[7] = (byte)((uint)data2 & 0xFFu); obj[8] = (byte)((uint)data3 & 0xFFu); data3 >>= 8; obj[9] = (byte)((uint)data3 & 0xFFu); data3 >>= 8; obj[10] = (byte)((uint)data3 & 0xFFu); data3 >>= 8; obj[11] = (byte)((uint)data3 & 0xFFu); obj[12] = (byte)((uint)data4 & 0xFFu); data4 >>= 8; obj[13] = (byte)((uint)data4 & 0xFFu); data4 >>= 8; obj[14] = (byte)((uint)data4 & 0xFFu); data4 >>= 8; obj[15] = (byte)((uint)data4 & 0xFFu); return obj; } } private byte CalculatePrecision() { uint[] array; uint num2; int num; if (_data4 != 0) { num = 33; array = s_decimalHelpersHiHi; num2 = _data4; } else if (_data3 != 0) { num = 24; array = s_decimalHelpersHi; num2 = _data3; } else if (_data2 != 0) { num = 15; array = s_decimalHelpersMid; num2 = _data2; } else { num = 5; array = s_decimalHelpersLo; num2 = _data1; } if (num2 < array[num]) { num -= 2; if (num2 < array[num]) { num -= 2; num = ((num2 >= array[num]) ? (num + 1) : (num - 1)); } else { num++; } } else { num += 2; num = ((num2 >= array[num]) ? (num + 1) : (num - 1)); } if (num2 >= array[num]) { num++; if (num == 37 && num2 >= array[num]) { num++; } } byte b = (byte)(num + 1); if (b > 1 && VerifyPrecision((byte)(b - 1))) { b--; } return Math.Max(b, _bScale); } private bool VerifyPrecision(byte precision) { int num = checked(precision - 1); if (_data4 < s_decimalHelpersHiHi[num]) { return true; } if (_data4 == s_decimalHelpersHiHi[num]) { if (_data3 < s_decimalHelpersHi[num]) { return true; } if (_data3 == s_decimalHelpersHi[num]) { if (_data2 < s_decimalHelpersMid[num]) { return true; } if (_data2 == s_decimalHelpersMid[num] && _data1 < s_decimalHelpersLo[num]) { return true; } } } return false; } private SqlDecimal(bool fNull) { _bLen = (_bPrec = (_bScale = 0)); _bStatus = 0; _data1 = (_data2 = (_data3 = (_data4 = s_uiZero))); } public SqlDecimal(decimal value) { _bStatus = s_bNotNull; int[] bits = decimal.GetBits(value); uint num = (uint)bits[3]; _data1 = (uint)bits[0]; _data2 = (uint)bits[1]; _data3 = (uint)bits[2]; _data4 = s_uiZero; _bStatus |= (byte)(((num & 0x80000000u) == 2147483648u) ? s_bNegative : 0); if (_data3 != 0) { _bLen = 3; } else if (_data2 != 0) { _bLen = 2; } else { _bLen = 1; } _bScale = (byte)((int)(num & 0xFF0000) >> 16); _bPrec = 0; _bPrec = CalculatePrecision(); } public SqlDecimal(int value) { _bStatus = s_bNotNull; uint data = (uint)value; if (value < 0) { _bStatus |= s_bNegative; if (value != int.MinValue) { data = (uint)(-value); } } _data1 = data; _data2 = (_data3 = (_data4 = s_uiZero)); _bLen = 1; _bPrec = BGetPrecUI4(_data1); _bScale = 0; } public SqlDecimal(long value) { _bStatus = s_bNotNull; ulong num = (ulong)value; if (value < 0) { _bStatus |= s_bNegative; if (value != long.MinValue) { num = (ulong)(-value); } } _data1 = (uint)num; _data2 = (uint)(num >> 32); _data3 = (_data4 = 0u); _bLen = (byte)((_data2 == 0) ? 1u : 2u); _bPrec = BGetPrecUI8(num); _bScale = 0; } public SqlDecimal(byte bPrecision, byte bScale, bool fPositive, int[] bits) { CheckValidPrecScale(bPrecision, bScale); if (bits == null) { throw new ArgumentNullException("bits"); } if (bits.Length != 4) { throw new ArgumentException(SQLResource.InvalidArraySizeMessage, "bits"); } _bPrec = bPrecision; _bScale = bScale; _data1 = (uint)bits[0]; _data2 = (uint)bits[1]; _data3 = (uint)bits[2]; _data4 = (uint)bits[3]; _bLen = 1; for (int num = 3; num >= 0; num--) { if (bits[num] != 0) { _bLen = (byte)(num + 1); break; } } _bStatus = s_bNotNull; if (!fPositive) { _bStatus |= s_bNegative; } if (FZero()) { SetPositive(); } if (bPrecision < CalculatePrecision()) { throw new OverflowException(SQLResource.ArithOverflowMessage); } } public SqlDecimal(byte bPrecision, byte bScale, bool fPositive, int data1, int data2, int data3, int data4) { CheckValidPrecScale(bPrecision, bScale); _bPrec = bPrecision; _bScale = bScale; _data1 = (uint)data1; _data2 = (uint)data2; _data3 = (uint)data3; _data4 = (uint)data4; _bLen = 1; if (data4 == 0) { if (data3 == 0) { if (data2 == 0) { _bLen = 1; } else { _bLen = 2; } } else { _bLen = 3; } } else { _bLen = 4; } _bStatus = s_bNotNull; if (!fPositive) { _bStatus |= s_bNegative; } if (FZero()) { SetPositive(); } if (bPrecision < CalculatePrecision()) { throw new OverflowException(SQLResource.ArithOverflowMessage); } } public SqlDecimal(double dVal) : this(fNull: false) { _bStatus = s_bNotNull; if (dVal < 0.0) { dVal = 0.0 - dVal; _bStatus |= s_bNegative; } if (dVal >= s_DMAX_NUME) { throw new OverflowException(SQLResource.ArithOverflowMessage); } double num = Math.Floor(dVal); double num2 = dVal - num; _bPrec = s_NUMERIC_MAX_PRECISION; _bLen = 1; if (num > 0.0) { dVal = Math.Floor(num / s_DUINT_BASE); _data1 = (uint)(num - dVal * s_DUINT_BASE); num = dVal; if (num > 0.0) { dVal = Math.Floor(num / s_DUINT_BASE); _data2 = (uint)(num - dVal * s_DUINT_BASE); num = dVal; _bLen++; if (num > 0.0) { dVal = Math.Floor(num / s_DUINT_BASE); _data3 = (uint)(num - dVal * s_DUINT_BASE); num = dVal; _bLen++; if (num > 0.0) { dVal = Math.Floor(num / s_DUINT_BASE); _data4 = (uint)(num - dVal * s_DUINT_BASE); num = dVal; _bLen++; } } } } uint num3 = (uint)((!FZero()) ? CalculatePrecision() : 0); if (num3 > s_DBL_DIG) { uint num4 = num3 - s_DBL_DIG; uint num5; do { num5 = DivByULong(10u); num4--; } while (num4 != 0); num4 = num3 - s_DBL_DIG; if (num5 >= 5) { AddULong(1u); num3 = CalculatePrecision() + num4; } do { MultByULong(10u); num4--; } while (num4 != 0); } _bScale = (byte)((num3 < s_DBL_DIG) ? (s_DBL_DIG - num3) : 0u); _bPrec = (byte)(num3 + _bScale); if (_bScale > 0) { num3 = _bScale; do { uint num6 = ((num3 >= 9) ? 9u : num3); num2 *= (double)s_rgulShiftBase[num6 - 1]; num3 -= num6; MultByULong(s_rgulShiftBase[num6 - 1]); AddULong((uint)num2); num2 -= Math.Floor(num2); } while (num3 != 0); } if (num2 >= 0.5) { AddULong(1u); } if (FZero()) { SetPositive(); } } private SqlDecimal(uint[] rglData, byte bLen, byte bPrec, byte bScale, bool fPositive) { CheckValidPrecScale(bPrec, bScale); _bLen = bLen; _bPrec = bPrec; _bScale = bScale; _data1 = rglData[0]; _data2 = rglData[1]; _data3 = rglData[2]; _data4 = rglData[3]; _bStatus = s_bNotNull; if (!fPositive) { _bStatus |= s_bNegative; } if (FZero()) { SetPositive(); } } private void SetPositive() { _bStatus &= s_bReverseSignMask; } private void SetSignBit(bool fPositive) { _bStatus = (byte)(fPositive ? (_bStatus & s_bReverseSignMask) : (_bStatus | s_bNegative)); } public override string ToString() { if (IsNull) { return SQLResource.NullString; } uint[] array = new uint[4] { _data1, _data2, _data3, _data4 }; int ciulU = _bLen; char[] array2 = new char[s_NUMERIC_MAX_PRECISION + 1]; int num = 0; while (ciulU > 1 || array[0] != 0) { MpDiv1(array, ref ciulU, s_ulBase10, out var iulR); array2[num++] = ChFromDigit(iulR); } while (num <= _bScale) { array2[num++] = ChFromDigit(0u); } int num2 = 0; int num3 = 0; if (_bScale > 0) { num2 = 1; } char[] array3; if (IsPositive) { array3 = new char[num2 + num]; } else { array3 = new char[num2 + num + 1]; array3[num3++] = '-'; } while (num > 0) { if (num-- == _bScale) { array3[num3++] = '.'; } array3[num3++] = array2[num]; } return new string(array3); } public static SqlDecimal Parse(string s) { if (s == null) { throw new ArgumentNullException("s"); } if (s == SQLResource.NullString) { return Null; } SqlDecimal @null = Null; char[] array = s.ToCharArray(); int num = array.Length; int num2 = -1; int num3 = 0; @null._bPrec = 1; @null._bScale = 0; @null.SetToZero(); while (num != 0 && array[num - 1] == ' ') { num--; } if (num == 0) { throw new FormatException(SQLResource.FormatMessage); } while (array[num3] == ' ') { num3++; num--; } if (array[num3] == '-') { @null.SetSignBit(fPositive: false); num3++; num--; } else { @null.SetSignBit(fPositive: true); if (array[num3] == '+') { num3++; num--; } } while (num > 2 && array[num3] == '0') { num3++; num--; } if (2 == num && '0' == array[num3] && '.' == array[num3 + 1]) { array[num3] = '.'; array[num3 + 1] = '0'; } if (num == 0 || num > s_NUMERIC_MAX_PRECISION + 1) { throw new FormatException(SQLResource.FormatMessage); } while (num > 1 && array[num3] == '0') { num3++; num--; } int i; for (i = 0; i < num; i++) { char c = array[num3]; num3++; if (c >= '0' && c <= '9') { c = (char)(c - 48); @null.MultByULong(s_ulBase10); @null.AddULong(c); continue; } if (c == '.' && num2 < 0) { num2 = i; continue; } throw new FormatException(SQLResource.FormatMessage); } if (num2 < 0) { @null._bPrec = (byte)i; @null._bScale = 0; } else { @null._bPrec = (byte)(i - 1); @null._bScale = (byte)(@null._bPrec - num2); } if (@null._bPrec > s_NUMERIC_MAX_PRECISION) { throw new FormatException(SQLResource.FormatMessage); } if (@null._bPrec == 0) { throw new FormatException(SQLResource.FormatMessage); } if (@null.FZero()) { @null.SetPositive(); } return @null; } public double ToDouble() { if (IsNull) { throw new SqlNullValueException(); } double num = 0.0; num = _data4; num = num * (double)s_lInt32Base + (double)_data3; num = num * (double)s_lInt32Base + (double)_data2; num = num * (double)s_lInt32Base + (double)_data1; num /= Math.Pow(10.0, (int)_bScale); if (!IsPositive) { return 0.0 - num; } return num; } private decimal ToDecimal() { if (IsNull) { throw new SqlNullValueException(); } if (_data4 != 0 || _bScale > 28) { throw new OverflowException(SQLResource.ConversionOverflowMessage); } return new decimal((int)_data1, (int)_data2, (int)_data3, !IsPositive, _bScale); } public static implicit operator SqlDecimal(decimal x) { return new SqlDecimal(x); } public static explicit operator SqlDecimal(double x) { return new SqlDecimal(x); } public static implicit operator SqlDecimal(long x) { return new SqlDecimal(new decimal(x)); } public static explicit operator decimal(SqlDecimal x) { return x.Value; } public static SqlDecimal operator -(SqlDecimal x) { if (x.IsNull) { return Null; } SqlDecimal result = x; if (result.FZero()) { result.SetPositive(); } else { result.SetSignBit(!result.IsPositive); } return result; } public static SqlDecimal operator +(SqlDecimal x, SqlDecimal y) { if (x.IsNull || y.IsNull) { return Null; } bool flag = true; bool isPositive = x.IsPositive; bool flag2 = y.IsPositive; int bScale = x._bScale; int bScale2 = y._bScale; int num = Math.Max(x._bPrec - bScale, y._bPrec - bScale2); int num2 = Math.Max(bScale, bScale2); int val = num + num2 + 1; val = Math.Min(MaxPrecision, val); if (val - num < num2) { num2 = val - num; } if (bScale != num2) { x.AdjustScale(num2 - bScale, fRound: true); } if (bScale2 != num2) { y.AdjustScale(num2 - bScale2, fRound: true); } if (!isPositive) { isPositive = !isPositive; flag2 = !flag2; flag = !flag; } int num3 = x._bLen; int bLen = y._bLen; uint[] array = new uint[4] { x._data1, x._data2, x._data3, x._data4 }; uint[] array2 = new uint[4] { y._data1, y._data2, y._data3, y._data4 }; byte bLen2; if (flag2) { ulong num4 = 0uL; int i; for (i = 0; i < num3 || i < bLen; i++) { if (i < num3) { num4 += array[i]; } if (i < bLen) { num4 += array2[i]; } array[i] = (uint)num4; num4 >>= 32; } if (num4 != 0L) { if (i == s_cNumeMax) { throw new OverflowException(SQLResource.ArithOverflowMessage); } array[i] = (uint)num4; i++; } bLen2 = (byte)i; } else { int num5 = 0; if (x.LAbsCmp(y) < 0) { flag = !flag; uint[] array3 = array2; array2 = array; array = array3; num3 = bLen; bLen = x._bLen; } ulong num4 = s_ulInt32Base; for (int i = 0; i < num3 || i < bLen; i++) { if (i < num3) { num4 += array[i]; } if (i < bLen) { num4 -= array2[i]; } array[i] = (uint)num4; if (array[i] != 0) { num5 = i; } num4 >>= 32; num4 += s_ulInt32BaseForMod; } bLen2 = (byte)(num5 + 1); } SqlDecimal result = new SqlDecimal(array, bLen2, (byte)val, (byte)num2, flag); if (result.FGt10_38() || result.CalculatePrecision() > s_NUMERIC_MAX_PRECISION) { throw new OverflowException(SQLResource.ArithOverflowMessage); } if (result.FZero()) { result.SetPositive(); } return result; } public static SqlDecimal operator -(SqlDecimal x, SqlDecimal y) { return x + -y; } public static SqlDecimal operator *(SqlDecimal x, SqlDecimal y) { if (x.IsNull || y.IsNull) { return Null; } int bLen = y._bLen; int num = x._bScale + y._bScale; int num2 = num; int num3 = x._bPrec - x._bScale + (y._bPrec - y._bScale) + 1; int num4 = num2 + num3; if (num4 > s_NUMERIC_MAX_PRECISION) { num4 = s_NUMERIC_MAX_PRECISION; } if (num2 > s_NUMERIC_MAX_PRECISION) { num2 = s_NUMERIC_MAX_PRECISION; } num2 = Math.Min(num4 - num3, num2); num2 = Math.Max(num2, Math.Min(num, s_cNumeDivScaleMin)); int num5 = num2 - num; bool fPositive = x.IsPositive == y.IsPositive; uint[] array = new uint[4] { x._data1, x._data2, x._data3, x._data4 }; uint[] array2 = new uint[4] { y._data1, y._data2, y._data3, y._data4 }; uint[] array3 = new uint[9]; int num6 = 0; for (int i = 0; i < x._bLen; i++) { uint num7 = array[i]; ulong num8 = 0uL; num6 = i; for (int j = 0; j < bLen; j++) { ulong num9 = num8 + array3[num6]; ulong num10 = array2[j]; num8 = num7 * num10; num8 += num9; num9 = ((num8 >= num9) ? 0 : s_ulInt32Base); array3[num6++] = (uint)num8; num8 = (num8 >> 32) + num9; } if (num8 != 0L) { array3[num6++] = (uint)num8; } } while (array3[num6] == 0 && num6 > 0) { num6--; } int ciulU = num6 + 1; SqlDecimal result; if (num5 != 0) { if (num5 < 0) { uint num11; uint iulR; do { if (num5 <= -9) { num11 = s_rgulShiftBase[8]; num5 += 9; } else { num11 = s_rgulShiftBase[-num5 - 1]; num5 = 0; } MpDiv1(array3, ref ciulU, num11, out iulR); } while (num5 != 0); if (ciulU > s_cNumeMax) { throw new OverflowException(SQLResource.ArithOverflowMessage); } for (num6 = ciulU; num6 < s_cNumeMax; num6++) { array3[num6] = 0u; } result = new SqlDecimal(array3, (byte)ciulU, (byte)num4, (byte)num2, fPositive); if (result.FGt10_38()) { throw new OverflowException(SQLResource.ArithOverflowMessage); } if (iulR >= num11 / 2) { result.AddULong(1u); } if (result.FZero()) { result.SetPositive(); } return result; } if (ciulU > s_cNumeMax) { throw new OverflowException(SQLResource.ArithOverflowMessage); } for (num6 = ciulU; num6 < s_cNumeMax; num6++) { array3[num6] = 0u; } result = new SqlDecimal(array3, (byte)ciulU, (byte)num4, (byte)num, fPositive); if (result.FZero()) { result.SetPositive(); } result.AdjustScale(num5, fRound: true); return result; } if (ciulU > s_cNumeMax) { throw new OverflowException(SQLResource.ArithOverflowMessage); } for (num6 = ciulU; num6 < s_cNumeMax; num6++) { array3[num6] = 0u; } result = new SqlDecimal(array3, (byte)ciulU, (byte)num4, (byte)num2, fPositive); if (result.FGt10_38()) { throw new OverflowException(SQLResource.ArithOverflowMessage); } if (result.FZero()) { result.SetPositive(); } return result; } public static SqlDecimal operator /(SqlDecimal x, SqlDecimal y) { if (x.IsNull || y.IsNull) { return Null; } if (y.FZero()) { throw new DivideByZeroException(SQLResource.DivideByZeroMessage); } bool fPositive = x.IsPositive == y.IsPositive; int num = Math.Max(x._bScale + y._bPrec + 1, s_cNumeDivScaleMin); int val = x._bPrec - x._bScale + y._bScale; int num2 = num + x._bPrec + y._bPrec + 1; int val2 = Math.Min(num, s_cNumeDivScaleMin); val = Math.Min(val, s_NUMERIC_MAX_PRECISION); num2 = val + num; if (num2 > s_NUMERIC_MAX_PRECISION) { num2 = s_NUMERIC_MAX_PRECISION; } num = Math.Min(num2 - val, num); num = Math.Max(num, val2); int digits = num - x._bScale + y._bScale; x.AdjustScale(digits, fRound: true); uint[] rgulU = new uint[4] { x._data1, x._data2, x._data3, x._data4 }; uint[] rgulD = new uint[4] { y._data1, y._data2, y._data3, y._data4 }; uint[] rgulR = new uint[s_cNumeMax + 1]; uint[] array = new uint[s_cNumeMax]; MpDiv(rgulU, x._bLen, rgulD, y._bLen, array, out var ciulQ, rgulR, out var _); ZeroToMaxLen(array, ciulQ); SqlDecimal result = new SqlDecimal(array, (byte)ciulQ, (byte)num2, (byte)num, fPositive); if (result.FZero()) { result.SetPositive(); } return result; } public static explicit operator SqlDecimal(SqlBoolean x) { if (!x.IsNull) { return new SqlDecimal(x.ByteValue); } return Null; } public static implicit operator SqlDecimal(SqlByte x) { if (!x.IsNull) { return new SqlDecimal(x.Value); } return Null; } public static implicit operator SqlDecimal(SqlInt16 x) { if (!x.IsNull) { return new SqlDecimal(x.Value); } return Null; } public static implicit operator SqlDecimal(SqlInt32 x) { if (!x.IsNull) { return new SqlDecimal(x.Value); } return Null; } public static implicit operator SqlDecimal(SqlInt64 x) { if (!x.IsNull) { return new SqlDecimal(x.Value); } return Null; } public static implicit operator SqlDecimal(SqlMoney x) { if (!x.IsNull) { return new SqlDecimal(x.ToDecimal()); } return Null; } public static explicit operator SqlDecimal(SqlSingle x) { if (!x.IsNull) { return new SqlDecimal(x.Value); } return Null; } public static explicit operator SqlDecimal(SqlDouble x) { if (!x.IsNull) { return new SqlDecimal(x.Value); } return Null; } public static explicit operator SqlDecimal(SqlString x) { if (!x.IsNull) { return Parse(x.Value); } return Null; } [Conditional("DEBUG")] private void AssertValid() { if (!IsNull) { _ = (new uint[4] { _data1, _data2, _data3, _data4 })[_bLen - 1]; for (int i = _bLen; i < s_cNumeMax; i++) { } } } private static void ZeroToMaxLen(uint[] rgulData, int cUI4sCur) { switch (cUI4sCur) { case 1: rgulData[1] = (rgulData[2] = (rgulData[3] = 0u)); break; case 2: rgulData[2] = (rgulData[3] = 0u); break; case 3: rgulData[3] = 0u; break; } } private static byte CLenFromPrec(byte bPrec) { return s_rgCLenFromPrec[bPrec - 1]; } private bool FZero() { if (_data1 == 0) { return _bLen <= 1; } return false; } private bool FGt10_38() { if ((long)_data4 >= 1262177448L && _bLen == 4) { if ((long)_data4 <= 1262177448L && (long)_data3 <= 1518781562L) { if ((ulong)_data3 == 1518781562) { return (long)_data2 >= 160047680L; } return false; } return true; } return false; } private bool FGt10_38(uint[] rglData) { if ((long)rglData[3] >= 1262177448L) { if ((long)rglData[3] <= 1262177448L && (long)rglData[2] <= 1518781562L) { if ((ulong)rglData[2] == 1518781562) { return (long)rglData[1] >= 160047680L; } return false; } return true; } return false; } private static byte BGetPrecUI4(uint value) { int num = ((value < s_ulT4) ? ((value >= s_ulT2) ? ((value >= s_ulT3) ? 4 : 3) : ((value < s_ulT1) ? 1 : 2)) : ((value >= s_ulT8) ? ((value >= s_ulT9) ? 10 : 9) : ((value >= s_ulT6) ? ((value >= s_ulT7) ? 8 : 7) : ((value >= s_ulT5) ? 6 : 5)))); return (byte)num; } private static byte BGetPrecUI8(uint ulU0, uint ulU1) { return BGetPrecUI8(ulU0 + ((ulong)ulU1 << 32)); } private static byte BGetPrecUI8(ulong dwlVal) { int num; if (dwlVal >= s_ulT8) { num = ((dwlVal < s_dwlT16) ? ((dwlVal < s_dwlT12) ? ((dwlVal >= s_dwlT10) ? ((dwlVal >= s_dwlT11) ? 12 : 11) : ((dwlVal >= s_ulT9) ? 10 : 9)) : ((dwlVal >= s_dwlT14) ? ((dwlVal >= s_dwlT15) ? 16 : 15) : ((dwlVal >= s_dwlT13) ? 14 : 13))) : ((dwlVal >= s_dwlT18) ? ((dwlVal >= s_dwlT19) ? 20 : 19) : ((dwlVal >= s_dwlT17) ? 18 : 17))); } else { uint num2 = (uint)dwlVal; num = ((num2 < s_ulT4) ? ((num2 >= s_ulT2) ? ((num2 >= s_ulT3) ? 4 : 3) : ((num2 < s_ulT1) ? 1 : 2)) : ((num2 >= s_ulT6) ? ((num2 >= s_ulT7) ? 8 : 7) : ((num2 >= s_ulT5) ? 6 : 5))); } return (byte)num; } private void AddULong(uint ulAdd) { ulong num = ulAdd; int bLen = _bLen; uint[] array = new uint[4] { _data1, _data2, _data3, _data4 }; int num2 = 0; do { num += array[num2]; array[num2] = (uint)num; num >>= 32; if (num == 0L) { StoreFromWorkingArray(array); return; } num2++; } while (num2 < bLen); if (num2 == s_cNumeMax) { throw new OverflowException(SQLResource.ArithOverflowMessage); } array[num2] = (uint)num; _bLen++; if (FGt10_38(array)) { throw new OverflowException(SQLResource.ArithOverflowMessage); } StoreFromWorkingArray(array); } private void MultByULong(uint uiMultiplier) { int bLen = _bLen; ulong num = 0uL; ulong num2 = 0uL; uint[] array = new uint[4] { _data1, _data2, _data3, _data4 }; for (int i = 0; i < bLen; i++) { num2 = (ulong)array[i] * (ulong)uiMultiplier; num += num2; num2 = ((num >= num2) ? 0 : s_ulInt32Base); array[i] = (uint)num; num = (num >> 32) + num2; } if (num != 0L) { if (bLen == s_cNumeMax) { throw new OverflowException(SQLResource.ArithOverflowMessage); } array[bLen] = (uint)num; _bLen++; } if (FGt10_38(array)) { throw new OverflowException(SQLResource.ArithOverflowMessage); } StoreFromWorkingArray(array); } private uint DivByULong(uint iDivisor) { ulong num = iDivisor; ulong num2 = 0uL; uint num3 = 0u; bool flag = true; if (num == 0L) { throw new DivideByZeroException(SQLResource.DivideByZeroMessage); } uint[] array = new uint[4] { _data1, _data2, _data3, _data4 }; for (int num4 = _bLen; num4 > 0; num4--) { num2 = (num2 << 32) + array[num4 - 1]; num3 = (array[num4 - 1] = (uint)(num2 / num)); num2 %= num; if (flag && num3 == 0) { _bLen--; } else { flag = false; } } StoreFromWorkingArray(array); if (flag) { _bLen = 1; } return (uint)num2; } internal void AdjustScale(int digits, bool fRound) { bool flag = false; int num = digits; if (num + _bScale < 0) { throw new SqlTruncateException(); } if (num + _bScale > s_NUMERIC_MAX_PRECISION) { throw new OverflowException(SQLResource.ArithOverflowMessage); } byte bScale = (byte)(num + _bScale); byte bPrec = (byte)Math.Min(s_NUMERIC_MAX_PRECISION, Math.Max(1, num + _bPrec)); if (num > 0) { _bScale = bScale; _bPrec = bPrec; while (num > 0) { uint uiMultiplier; if (num >= 9) { uiMultiplier = s_rgulShiftBase[8]; num -= 9; } else { uiMultiplier = s_rgulShiftBase[num - 1]; num = 0; } MultByULong(uiMultiplier); } } else if (num < 0) { uint uiMultiplier; uint num2; do { if (num <= -9) { uiMultiplier = s_rgulShiftBase[8]; num += 9; } else { uiMultiplier = s_rgulShiftBase[-num - 1]; num = 0; } num2 = DivByULong(uiMultiplier); } while (num < 0); flag = num2 >= uiMultiplier / 2; _bScale = bScale; _bPrec = bPrec; } if (flag && fRound) { AddULong(1u); } else if (FZero()) { SetPositive(); } } public static SqlDecimal AdjustScale(SqlDecimal n, int digits, bool fRound) { if (n.IsNull) { return Null; } SqlDecimal result = n; result.AdjustScale(digits, fRound); return result; } public static SqlDecimal ConvertToPrecScale(SqlDecimal n, int precision, int scale) { CheckValidPrecScale(precision, scale); if (n.IsNull) { return Null; } SqlDecimal result = n; int digits = scale - result._bScale; result.AdjustScale(digits, fRound: true); byte b = CLenFromPrec((byte)precision); if (b < result._bLen) { throw new SqlTruncateException(); } if (b == result._bLen && precision < result.CalculatePrecision()) { throw new SqlTruncateException(); } result._bPrec = (byte)precision; return result; } private int LAbsCmp(SqlDecimal snumOp) { int bLen = snumOp._bLen; int bLen2 = _bLen; if (bLen != bLen2) { if (bLen2 <= bLen) { return -1; } return 1; } uint[] array = new uint[4] { _data1, _data2, _data3, _data4 }; uint[] array2 = new uint[4] { snumOp._data1, snumOp._data2, snumOp._data3, snumOp._data4 }; int num = bLen - 1; do { if (array[num] != array2[num]) { if (array[num] <= array2[num]) { return -1; } return 1; } num--; } while (num >= 0); return 0; } private static void MpMove(uint[] rgulS, int ciulS, uint[] rgulD, out int ciulD) { ciulD = ciulS; for (int i = 0; i < ciulS; i++) { rgulD[i] = rgulS[i]; } } private static void MpSet(uint[] rgulD, out int ciulD, uint iulN) { ciulD = 1; rgulD[0] = iulN; } private static void MpNormalize(uint[] rgulU, ref int ciulU) { while (ciulU > 1 && rgulU[ciulU - 1] == 0) { ciulU--; } } private static void MpMul1(uint[] piulD, ref int ciulD, uint iulX) { uint num = 0u; int i; for (i = 0; i < ciulD; i++) { ulong num2 = piulD[i]; ulong x = num + num2 * iulX; num = HI(x); piulD[i] = LO(x); } if (num != 0) { piulD[i] = num; ciulD++; } } private static void MpDiv1(uint[] rgulU, ref int ciulU, uint iulD, out uint iulR) { uint num = 0u; ulong num2 = iulD; int num3 = ciulU; while (num3 > 0) { num3--; ulong num4 = ((ulong)num << 32) + rgulU[num3]; rgulU[num3] = (uint)(num4 / num2); num = (uint)(num4 - rgulU[num3] * num2); } iulR = num; MpNormalize(rgulU, ref ciulU); } internal static ulong DWL(uint lo, uint hi) { return lo + ((ulong)hi << 32); } private static uint HI(ulong x) { return (uint)(x >> 32); } private static uint LO(ulong x) { return (uint)x; } private static void MpDiv(uint[] rgulU, int ciulU, uint[] rgulD, int ciulD, uint[] rgulQ, out int ciulQ, uint[] rgulR, out int ciulR) { if (ciulD == 1 && rgulD[0] == 0) { ciulQ = (ciulR = 0); return; } if (ciulU == 1 && ciulD == 1) { MpSet(rgulQ, out ciulQ, rgulU[0] / rgulD[0]); MpSet(rgulR, out ciulR, rgulU[0] % rgulD[0]); return; } if (ciulD > ciulU) { MpMove(rgulU, ciulU, rgulR, out ciulR); MpSet(rgulQ, out ciulQ, 0u); return; } if (ciulU <= 2) { ulong num = DWL(rgulU[0], rgulU[1]); ulong num2 = rgulD[0]; if (ciulD > 1) { num2 += (ulong)rgulD[1] << 32; } ulong x = num / num2; rgulQ[0] = LO(x); rgulQ[1] = HI(x); ciulQ = ((HI(x) == 0) ? 1 : 2); x = num % num2; rgulR[0] = LO(x); rgulR[1] = HI(x); ciulR = ((HI(x) == 0) ? 1 : 2); return; } if (ciulD == 1) { MpMove(rgulU, ciulU, rgulQ, out ciulQ); MpDiv1(rgulQ, ref ciulQ, rgulD[0], out var iulR); rgulR[0] = iulR; ciulR = 1; return; } ciulQ = (ciulR = 0); if (rgulU != rgulR) { MpMove(rgulU, ciulU, rgulR, out ciulR); } ciulQ = ciulU - ciulD + 1; uint num3 = rgulD[ciulD - 1]; rgulR[ciulU] = 0u; int num4 = ciulU; uint num5 = (uint)(s_ulInt32Base / (ulong)((long)num3 + 1L)); if (num5 > 1) { MpMul1(rgulD, ref ciulD, num5); num3 = rgulD[ciulD - 1]; MpMul1(rgulR, ref ciulR, num5); } uint num6 = rgulD[ciulD - 2]; do { ulong num7 = DWL(rgulR[num4 - 1], rgulR[num4]); uint num8 = (uint)((num3 != rgulR[num4]) ? (num7 / num3) : (s_ulInt32Base - 1)); ulong num9 = num8; uint num10 = (uint)(num7 - num9 * num3); while (num6 * num9 > DWL(rgulR[num4 - 2], num10)) { num8--; if (num10 >= 0 - num3) { break; } num10 += num3; num9 = num8; } num7 = s_ulInt32Base; ulong num11 = 0uL; int num12 = 0; int num13 = num4 - ciulD; while (num12 < ciulD) { ulong num14 = rgulD[num12]; num11 += num8 * num14; num7 += (ulong)((long)rgulR[num13] - (long)LO(num11)); num11 = HI(num11); rgulR[num13] = LO(num7); num7 = HI(num7) + s_ulInt32Base - 1; num12++; num13++; } num7 += rgulR[num13] - num11; rgulR[num13] = LO(num7); rgulQ[num4 - ciulD] = num8; if (HI(num7) == 0) { rgulQ[num4 - ciulD] = num8 - 1; uint num15 = 0u; num12 = 0; num13 = num4 - ciulD; while (num12 < ciulD) { num7 = (ulong)((long)rgulD[num12] + (long)rgulR[num13] + num15); num15 = HI(num7); rgulR[num13] = LO(num7); num12++; num13++; } rgulR[num13] += num15; } num4--; } while (num4 >= ciulD); MpNormalize(rgulQ, ref ciulQ); ciulR = ciulD; MpNormalize(rgulR, ref ciulR); if (num5 > 1) { MpDiv1(rgulD, ref ciulD, num5, out var iulR2); MpDiv1(rgulR, ref ciulR, num5, out iulR2); } } private EComparison CompareNm(SqlDecimal snumOp) { int num = (IsPositive ? 1 : (-1)); int num2 = (snumOp.IsPositive ? 1 : (-1)); if (num != num2) { if (num != 1) { return EComparison.LT; } return EComparison.GT; } SqlDecimal sqlDecimal = this; SqlDecimal snumOp2 = snumOp; int num3 = _bScale - snumOp._bScale; if (num3 < 0) { try { sqlDecimal.AdjustScale(-num3, fRound: true); } catch (OverflowException) { return (num > 0) ? EComparison.GT : EComparison.LT; } } else if (num3 > 0) { try { snumOp2.AdjustScale(num3, fRound: true); } catch (OverflowException) { return (num <= 0) ? EComparison.GT : EComparison.LT; } } int num4 = sqlDecimal.LAbsCmp(snumOp2); if (num4 == 0) { return EComparison.EQ; } if (num * num4 < 0) { return EComparison.LT; } return EComparison.GT; } private static void CheckValidPrecScale(byte bPrec, byte bScale) { if (bPrec < 1 || bPrec > MaxPrecision || bScale < 0 || bScale > MaxScale || bScale > bPrec) { throw new SqlTypeException(SQLResource.InvalidPrecScaleMessage); } } private static void CheckValidPrecScale(int iPrec, int iScale) { if (iPrec < 1 || iPrec > MaxPrecision || iScale < 0 || iScale > MaxScale || iScale > iPrec) { throw new SqlTypeException(SQLResource.InvalidPrecScaleMessage); } } public static SqlBoolean operator ==(SqlDecimal x, SqlDecimal y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.CompareNm(y) == EComparison.EQ); } return SqlBoolean.Null; } public static SqlBoolean operator !=(SqlDecimal x, SqlDecimal y) { return !(x == y); } public static SqlBoolean operator <(SqlDecimal x, SqlDecimal y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.CompareNm(y) == EComparison.LT); } return SqlBoolean.Null; } public static SqlBoolean operator >(SqlDecimal x, SqlDecimal y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.CompareNm(y) == EComparison.GT); } return SqlBoolean.Null; } public static SqlBoolean operator <=(SqlDecimal x, SqlDecimal y) { if (x.IsNull || y.IsNull) { return SqlBoolean.Null; } EComparison eComparison = x.CompareNm(y); return new SqlBoolean(eComparison == EComparison.LT || eComparison == EComparison.EQ); } public static SqlBoolean operator >=(SqlDecimal x, SqlDecimal y) { if (x.IsNull || y.IsNull) { return SqlBoolean.Null; } EComparison eComparison = x.CompareNm(y); return new SqlBoolean(eComparison == EComparison.GT || eComparison == EComparison.EQ); } public static SqlDecimal Add(SqlDecimal x, SqlDecimal y) { return x + y; } public static SqlDecimal Subtract(SqlDecimal x, SqlDecimal y) { return x - y; } public static SqlDecimal Multiply(SqlDecimal x, SqlDecimal y) { return x * y; } public static SqlDecimal Divide(SqlDecimal x, SqlDecimal y) { return x / y; } public static SqlBoolean Equals(SqlDecimal x, SqlDecimal y) { return x == y; } public static SqlBoolean NotEquals(SqlDecimal x, SqlDecimal y) { return x != y; } public static SqlBoolean LessThan(SqlDecimal x, SqlDecimal y) { return x < y; } public static SqlBoolean GreaterThan(SqlDecimal x, SqlDecimal y) { return x > y; } public static SqlBoolean LessThanOrEqual(SqlDecimal x, SqlDecimal y) { return x <= y; } public static SqlBoolean GreaterThanOrEqual(SqlDecimal x, SqlDecimal y) { return x >= y; } public SqlBoolean ToSqlBoolean() { return (SqlBoolean)this; } public SqlByte ToSqlByte() { return (SqlByte)this; } public SqlDouble ToSqlDouble() { return this; } public SqlInt16 ToSqlInt16() { return (SqlInt16)this; } public SqlInt32 ToSqlInt32() { return (SqlInt32)this; } public SqlInt64 ToSqlInt64() { return (SqlInt64)this; } public SqlMoney ToSqlMoney() { return (SqlMoney)this; } public SqlSingle ToSqlSingle() { return this; } public SqlString ToSqlString() { return (SqlString)this; } private static char ChFromDigit(uint uiDigit) { return (char)(uiDigit + 48); } private void StoreFromWorkingArray(uint[] rguiData) { _data1 = rguiData[0]; _data2 = rguiData[1]; _data3 = rguiData[2]; _data4 = rguiData[3]; } private void SetToZero() { _bLen = 1; _data1 = (_data2 = (_data3 = (_data4 = 0u))); _bStatus = (byte)(s_bNotNull | s_bPositive); } private void MakeInteger(out bool fFraction) { int num = _bScale; fFraction = false; while (num > 0) { uint num2; if (num >= 9) { num2 = DivByULong(s_rgulShiftBase[8]); num -= 9; } else { num2 = DivByULong(s_rgulShiftBase[num - 1]); num = 0; } if (num2 != 0) { fFraction = true; } } _bScale = 0; } public static SqlDecimal Abs(SqlDecimal n) { if (n.IsNull) { return Null; } n.SetPositive(); return n; } public static SqlDecimal Ceiling(SqlDecimal n) { if (n.IsNull) { return Null; } if (n._bScale == 0) { return n; } n.MakeInteger(out var fFraction); if (fFraction && n.IsPositive) { n.AddULong(1u); } if (n.FZero()) { n.SetPositive(); } return n; } public static SqlDecimal Floor(SqlDecimal n) { if (n.IsNull) { return Null; } if (n._bScale == 0) { return n; } n.MakeInteger(out var fFraction); if (fFraction && !n.IsPositive) { n.AddULong(1u); } if (n.FZero()) { n.SetPositive(); } return n; } public static SqlInt32 Sign(SqlDecimal n) { if (n.IsNull) { return SqlInt32.Null; } if (n == new SqlDecimal(0)) { return SqlInt32.Zero; } if (!n.IsNull) { if (!n.IsPositive) { return new SqlInt32(-1); } return new SqlInt32(1); } return SqlInt32.Null; } private static SqlDecimal Round(SqlDecimal n, int lPosition, bool fTruncate) { if (n.IsNull) { return Null; } if (lPosition >= 0) { lPosition = Math.Min(s_NUMERIC_MAX_PRECISION, lPosition); if (lPosition >= n._bScale) { return n; } } else { lPosition = Math.Max(-s_NUMERIC_MAX_PRECISION, lPosition); if (lPosition < n._bScale - n._bPrec) { n.SetToZero(); return n; } } uint num = 0u; int num2 = Math.Abs(lPosition - n._bScale); uint num3 = 1u; while (num2 > 0) { if (num2 >= 9) { num = n.DivByULong(s_rgulShiftBase[8]); num3 = s_rgulShiftBase[8]; num2 -= 9; } else { num = n.DivByULong(s_rgulShiftBase[num2 - 1]); num3 = s_rgulShiftBase[num2 - 1]; num2 = 0; } } if (num3 > 1) { num /= num3 / 10; } if (n.FZero() && (fTruncate || num < 5)) { n.SetPositive(); return n; } if (num >= 5 && !fTruncate) { n.AddULong(1u); } num2 = Math.Abs(lPosition - n._bScale); while (num2-- > 0) { n.MultByULong(s_ulBase10); } return n; } public static SqlDecimal Round(SqlDecimal n, int position) { return Round(n, position, fTruncate: false); } public static SqlDecimal Truncate(SqlDecimal n, int position) { return Round(n, position, fTruncate: true); } public static SqlDecimal Power(SqlDecimal n, double exp) { if (n.IsNull) { return Null; } _ = n.Precision; int scale = n.Scale; double x = n.ToDouble(); n = new SqlDecimal(Math.Pow(x, exp)); n.AdjustScale(scale - n.Scale, fRound: true); n._bPrec = MaxPrecision; return n; } public int CompareTo(object value) { if (value is SqlDecimal value2) { return CompareTo(value2); } throw ADP.WrongType(value.GetType(), typeof(SqlDecimal)); } public int CompareTo(SqlDecimal value) { if (IsNull) { if (!value.IsNull) { return -1; } return 0; } if (value.IsNull) { return 1; } if (this < value) { return -1; } if (this > value) { return 1; } return 0; } public override bool Equals(object value) { if (!(value is SqlDecimal sqlDecimal)) { return false; } if (sqlDecimal.IsNull || IsNull) { if (sqlDecimal.IsNull) { return IsNull; } return false; } return (this == sqlDecimal).Value; } public override int GetHashCode() { if (IsNull) { return 0; } SqlDecimal sqlDecimal = this; int num = sqlDecimal.CalculatePrecision(); sqlDecimal.AdjustScale(s_NUMERIC_MAX_PRECISION - num, fRound: true); int bLen = sqlDecimal._bLen; int num2 = 0; int[] data = sqlDecimal.Data; for (int i = 0; i < bLen; i++) { int num3 = (num2 >> 28) & 0xFF; num2 <<= 4; num2 = num2 ^ data[i] ^ num3; } return num2; } XmlSchema IXmlSerializable.GetSchema() { return null; } void IXmlSerializable.ReadXml(XmlReader reader) { string attribute = reader.GetAttribute("nil", "http://www.w3.org/2001/XMLSchema-instance"); if (attribute != null && XmlConvert.ToBoolean(attribute)) { reader.ReadElementString(); _bStatus = (byte)(s_bReverseNullMask & _bStatus); return; } SqlDecimal sqlDecimal = Parse(reader.ReadElementString()); _bStatus = sqlDecimal._bStatus; _bLen = sqlDecimal._bLen; _bPrec = sqlDecimal._bPrec; _bScale = sqlDecimal._bScale; _data1 = sqlDecimal._data1; _data2 = sqlDecimal._data2; _data3 = sqlDecimal._data3; _data4 = sqlDecimal._data4; } void IXmlSerializable.WriteXml(XmlWriter writer) { if (IsNull) { writer.WriteAttributeString("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance", "true"); } else { writer.WriteString(ToString()); } } public static XmlQualifiedName GetXsdType(XmlSchemaSet schemaSet) { return new XmlQualifiedName("decimal", "http://www.w3.org/2001/XMLSchema"); } } [Serializable] [XmlSchemaProvider("GetXsdType")] public struct SqlDouble : INullable, IComparable, IXmlSerializable { private bool m_fNotNull; private double m_value; public static readonly SqlDouble Null = new SqlDouble(fNull: true); public static readonly SqlDouble Zero = new SqlDouble(0.0); public static readonly SqlDouble MinValue = new SqlDouble(double.MinValue); public static readonly SqlDouble MaxValue = new SqlDouble(double.MaxValue); public bool IsNull => !m_fNotNull; public double Value { get { if (m_fNotNull) { return m_value; } throw new SqlNullValueException(); } } private SqlDouble(bool fNull) { m_fNotNull = false; m_value = 0.0; } public SqlDouble(double value) { if (!double.IsFinite(value)) { throw new OverflowException(SQLResource.ArithOverflowMessage); } m_value = value; m_fNotNull = true; } public static implicit operator SqlDouble(double x) { return new SqlDouble(x); } public static explicit operator double(SqlDouble x) { return x.Value; } public override string ToString() { if (!IsNull) { return m_value.ToString((IFormatProvider?)null); } return SQLResource.NullString; } public static SqlDouble Parse(string s) { if (s == SQLResource.NullString) { return Null; } return new SqlDouble(double.Parse(s, CultureInfo.InvariantCulture)); } public static SqlDouble operator -(SqlDouble x) { if (!x.IsNull) { return new SqlDouble(0.0 - x.m_value); } return Null; } public static SqlDouble operator +(SqlDouble x, SqlDouble y) { if (x.IsNull || y.IsNull) { return Null; } double num = x.m_value + y.m_value; if (double.IsInfinity(num)) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlDouble(num); } public static SqlDouble operator -(SqlDouble x, SqlDouble y) { if (x.IsNull || y.IsNull) { return Null; } double num = x.m_value - y.m_value; if (double.IsInfinity(num)) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlDouble(num); } public static SqlDouble operator *(SqlDouble x, SqlDouble y) { if (x.IsNull || y.IsNull) { return Null; } double num = x.m_value * y.m_value; if (double.IsInfinity(num)) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlDouble(num); } public static SqlDouble operator /(SqlDouble x, SqlDouble y) { if (x.IsNull || y.IsNull) { return Null; } if (y.m_value == 0.0) { throw new DivideByZeroException(SQLResource.DivideByZeroMessage); } double num = x.m_value / y.m_value; if (double.IsInfinity(num)) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlDouble(num); } public static explicit operator SqlDouble(SqlBoolean x) { if (!x.IsNull) { return new SqlDouble((int)x.ByteValue); } return Null; } public static implicit operator SqlDouble(SqlByte x) { if (!x.IsNull) { return new SqlDouble((int)x.Value); } return Null; } public static implicit operator SqlDouble(SqlInt16 x) { if (!x.IsNull) { return new SqlDouble(x.Value); } return Null; } public static implicit operator SqlDouble(SqlInt32 x) { if (!x.IsNull) { return new SqlDouble(x.Value); } return Null; } public static implicit operator SqlDouble(SqlInt64 x) { if (!x.IsNull) { return new SqlDouble(x.Value); } return Null; } public static implicit operator SqlDouble(SqlSingle x) { if (!x.IsNull) { return new SqlDouble(x.Value); } return Null; } public static implicit operator SqlDouble(SqlMoney x) { if (!x.IsNull) { return new SqlDouble(x.ToDouble()); } return Null; } public static implicit operator SqlDouble(SqlDecimal x) { if (!x.IsNull) { return new SqlDouble(x.ToDouble()); } return Null; } public static explicit operator SqlDouble(SqlString x) { if (x.IsNull) { return Null; } return Parse(x.Value); } public static SqlBoolean operator ==(SqlDouble x, SqlDouble y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value == y.m_value); } return SqlBoolean.Null; } public static SqlBoolean operator !=(SqlDouble x, SqlDouble y) { return !(x == y); } public static SqlBoolean operator <(SqlDouble x, SqlDouble y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value < y.m_value); } return SqlBoolean.Null; } public static SqlBoolean operator >(SqlDouble x, SqlDouble y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value > y.m_value); } return SqlBoolean.Null; } public static SqlBoolean operator <=(SqlDouble x, SqlDouble y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value <= y.m_value); } return SqlBoolean.Null; } public static SqlBoolean operator >=(SqlDouble x, SqlDouble y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value >= y.m_value); } return SqlBoolean.Null; } public static SqlDouble Add(SqlDouble x, SqlDouble y) { return x + y; } public static SqlDouble Subtract(SqlDouble x, SqlDouble y) { return x - y; } public static SqlDouble Multiply(SqlDouble x, SqlDouble y) { return x * y; } public static SqlDouble Divide(SqlDouble x, SqlDouble y) { return x / y; } public static SqlBoolean Equals(SqlDouble x, SqlDouble y) { return x == y; } public static SqlBoolean NotEquals(SqlDouble x, SqlDouble y) { return x != y; } public static SqlBoolean LessThan(SqlDouble x, SqlDouble y) { return x < y; } public static SqlBoolean GreaterThan(SqlDouble x, SqlDouble y) { return x > y; } public static SqlBoolean LessThanOrEqual(SqlDouble x, SqlDouble y) { return x <= y; } public static SqlBoolean GreaterThanOrEqual(SqlDouble x, SqlDouble y) { return x >= y; } public SqlBoolean ToSqlBoolean() { return (SqlBoolean)this; } public SqlByte ToSqlByte() { return (SqlByte)this; } public SqlInt16 ToSqlInt16() { return (SqlInt16)this; } public SqlInt32 ToSqlInt32() { return (SqlInt32)this; } public SqlInt64 ToSqlInt64() { return (SqlInt64)this; } public SqlMoney ToSqlMoney() { return (SqlMoney)this; } public SqlDecimal ToSqlDecimal() { return (SqlDecimal)this; } public SqlSingle ToSqlSingle() { return (SqlSingle)this; } public SqlString ToSqlString() { return (SqlString)this; } public int CompareTo(object value) { if (value is SqlDouble value2) { return CompareTo(value2); } throw ADP.WrongType(value.GetType(), typeof(SqlDouble)); } public int CompareTo(SqlDouble value) { if (IsNull) { if (!value.IsNull) { return -1; } return 0; } if (value.IsNull) { return 1; } if (this < value) { return -1; } if (this > value) { return 1; } return 0; } public override bool Equals(object value) { if (!(value is SqlDouble sqlDouble)) { return false; } if (sqlDouble.IsNull || IsNull) { if (sqlDouble.IsNull) { return IsNull; } return false; } return (this == sqlDouble).Value; } public override int GetHashCode() { if (!IsNull) { return Value.GetHashCode(); } return 0; } XmlSchema IXmlSerializable.GetSchema() { return null; } void IXmlSerializable.ReadXml(XmlReader reader) { string attribute = reader.GetAttribute("nil", "http://www.w3.org/2001/XMLSchema-instance"); if (attribute != null && XmlConvert.ToBoolean(attribute)) { reader.ReadElementString(); m_fNotNull = false; } else { m_value = XmlConvert.ToDouble(reader.ReadElementString()); m_fNotNull = true; } } void IXmlSerializable.WriteXml(XmlWriter writer) { if (IsNull) { writer.WriteAttributeString("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance", "true"); } else { writer.WriteString(XmlConvert.ToString(m_value)); } } public static XmlQualifiedName GetXsdType(XmlSchemaSet schemaSet) { return new XmlQualifiedName("double", "http://www.w3.org/2001/XMLSchema"); } } [Serializable] [XmlSchemaProvider("GetXsdType")] public struct SqlGuid : INullable, IComparable, IXmlSerializable { private static readonly int s_sizeOfGuid = 16; private static readonly int[] s_rgiGuidOrder = new int[16] { 10, 11, 12, 13, 14, 15, 8, 9, 6, 7, 4, 5, 0, 1, 2, 3 }; private byte[] m_value; public static readonly SqlGuid Null = new SqlGuid(fNull: true); public bool IsNull => m_value == null; public Guid Value { get { if (IsNull) { throw new SqlNullValueException(); } return new Guid(m_value); } } private SqlGuid(bool fNull) { m_value = null; } public SqlGuid(byte[] value) { if (value == null || value.Length != s_sizeOfGuid) { throw new ArgumentException(SQLResource.InvalidArraySizeMessage); } m_value = new byte[s_sizeOfGuid]; value.CopyTo(m_value, 0); } internal SqlGuid(byte[] value, bool ignored) { if (value == null || value.Length != s_sizeOfGuid) { throw new ArgumentException(SQLResource.InvalidArraySizeMessage); } m_value = value; } public SqlGuid(string s) { m_value = new Guid(s).ToByteArray(); } public SqlGuid(Guid g) { m_value = g.ToByteArray(); } public SqlGuid(int a, short b, short c, byte d, byte e, byte f, byte g, byte h, byte i, byte j, byte k) : this(new Guid(a, b, c, d, e, f, g, h, i, j, k)) { } public static implicit operator SqlGuid(Guid x) { return new SqlGuid(x); } public static explicit operator Guid(SqlGuid x) { return x.Value; } public byte[] ToByteArray() { byte[] array = new byte[s_sizeOfGuid]; m_value.CopyTo(array, 0); return array; } public override string ToString() { if (IsNull) { return SQLResource.NullString; } return new Guid(m_value).ToString(); } public static SqlGuid Parse(string s) { if (s == SQLResource.NullString) { return Null; } return new SqlGuid(s); } private static EComparison Compare(SqlGuid x, SqlGuid y) { for (int i = 0; i < s_sizeOfGuid; i++) { byte b = x.m_value[s_rgiGuidOrder[i]]; byte b2 = y.m_value[s_rgiGuidOrder[i]]; if (b != b2) { if (b >= b2) { return EComparison.GT; } return EComparison.LT; } } return EComparison.EQ; } public static explicit operator SqlGuid(SqlString x) { if (!x.IsNull) { return new SqlGuid(x.Value); } return Null; } public static explicit operator SqlGuid(SqlBinary x) { if (!x.IsNull) { return new SqlGuid(x.Value); } return Null; } public static SqlBoolean operator ==(SqlGuid x, SqlGuid y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(Compare(x, y) == EComparison.EQ); } return SqlBoolean.Null; } public static SqlBoolean operator !=(SqlGuid x, SqlGuid y) { return !(x == y); } public static SqlBoolean operator <(SqlGuid x, SqlGuid y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(Compare(x, y) == EComparison.LT); } return SqlBoolean.Null; } public static SqlBoolean operator >(SqlGuid x, SqlGuid y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(Compare(x, y) == EComparison.GT); } return SqlBoolean.Null; } public static SqlBoolean operator <=(SqlGuid x, SqlGuid y) { if (x.IsNull || y.IsNull) { return SqlBoolean.Null; } EComparison eComparison = Compare(x, y); return new SqlBoolean(eComparison == EComparison.LT || eComparison == EComparison.EQ); } public static SqlBoolean operator >=(SqlGuid x, SqlGuid y) { if (x.IsNull || y.IsNull) { return SqlBoolean.Null; } EComparison eComparison = Compare(x, y); return new SqlBoolean(eComparison == EComparison.GT || eComparison == EComparison.EQ); } public static SqlBoolean Equals(SqlGuid x, SqlGuid y) { return x == y; } public static SqlBoolean NotEquals(SqlGuid x, SqlGuid y) { return x != y; } public static SqlBoolean LessThan(SqlGuid x, SqlGuid y) { return x < y; } public static SqlBoolean GreaterThan(SqlGuid x, SqlGuid y) { return x > y; } public static SqlBoolean LessThanOrEqual(SqlGuid x, SqlGuid y) { return x <= y; } public static SqlBoolean GreaterThanOrEqual(SqlGuid x, SqlGuid y) { return x >= y; } public SqlString ToSqlString() { return (SqlString)this; } public SqlBinary ToSqlBinary() { return (SqlBinary)this; } public int CompareTo(object value) { if (value is SqlGuid value2) { return CompareTo(value2); } throw ADP.WrongType(value.GetType(), typeof(SqlGuid)); } public int CompareTo(SqlGuid value) { if (IsNull) { if (!value.IsNull) { return -1; } return 0; } if (value.IsNull) { return 1; } if (this < value) { return -1; } if (this > value) { return 1; } return 0; } public override bool Equals(object value) { if (!(value is SqlGuid sqlGuid)) { return false; } if (sqlGuid.IsNull || IsNull) { if (sqlGuid.IsNull) { return IsNull; } return false; } return (this == sqlGuid).Value; } public override int GetHashCode() { if (!IsNull) { return Value.GetHashCode(); } return 0; } XmlSchema IXmlSerializable.GetSchema() { return null; } void IXmlSerializable.ReadXml(XmlReader reader) { string attribute = reader.GetAttribute("nil", "http://www.w3.org/2001/XMLSchema-instance"); if (attribute != null && XmlConvert.ToBoolean(attribute)) { reader.ReadElementString(); m_value = null; } else { m_value = new Guid(reader.ReadElementString()).ToByteArray(); } } void IXmlSerializable.WriteXml(XmlWriter writer) { if (IsNull) { writer.WriteAttributeString("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance", "true"); } else { writer.WriteString(XmlConvert.ToString(new Guid(m_value))); } } public static XmlQualifiedName GetXsdType(XmlSchemaSet schemaSet) { return new XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema"); } } [Serializable] [XmlSchemaProvider("GetXsdType")] public struct SqlInt16 : INullable, IComparable, IXmlSerializable { private bool m_fNotNull; private short m_value; private static readonly int s_MASKI2 = -32768; public static readonly SqlInt16 Null = new SqlInt16(fNull: true); public static readonly SqlInt16 Zero = new SqlInt16(0); public static readonly SqlInt16 MinValue = new SqlInt16(short.MinValue); public static readonly SqlInt16 MaxValue = new SqlInt16(short.MaxValue); public bool IsNull => !m_fNotNull; public short Value { get { if (m_fNotNull) { return m_value; } throw new SqlNullValueException(); } } private SqlInt16(bool fNull) { m_fNotNull = false; m_value = 0; } public SqlInt16(short value) { m_value = value; m_fNotNull = true; } public static implicit operator SqlInt16(short x) { return new SqlInt16(x); } public static explicit operator short(SqlInt16 x) { return x.Value; } public override string ToString() { if (!IsNull) { return m_value.ToString((IFormatProvider?)null); } return SQLResource.NullString; } public static SqlInt16 Parse(string s) { if (s == SQLResource.NullString) { return Null; } return new SqlInt16(short.Parse(s, null)); } public static SqlInt16 operator -(SqlInt16 x) { if (!x.IsNull) { return new SqlInt16((short)(-x.m_value)); } return Null; } public static SqlInt16 operator ~(SqlInt16 x) { if (!x.IsNull) { return new SqlInt16((short)(~x.m_value)); } return Null; } public static SqlInt16 operator +(SqlInt16 x, SqlInt16 y) { if (x.IsNull || y.IsNull) { return Null; } int num = x.m_value + y.m_value; if (((uint)((num >> 15) ^ (num >> 16)) & (true ? 1u : 0u)) != 0) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlInt16((short)num); } public static SqlInt16 operator -(SqlInt16 x, SqlInt16 y) { if (x.IsNull || y.IsNull) { return Null; } int num = x.m_value - y.m_value; if (((uint)((num >> 15) ^ (num >> 16)) & (true ? 1u : 0u)) != 0) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlInt16((short)num); } public static SqlInt16 operator *(SqlInt16 x, SqlInt16 y) { if (x.IsNull || y.IsNull) { return Null; } int num = x.m_value * y.m_value; int num2 = num & s_MASKI2; if (num2 != 0 && num2 != s_MASKI2) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlInt16((short)num); } public static SqlInt16 operator /(SqlInt16 x, SqlInt16 y) { if (x.IsNull || y.IsNull) { return Null; } if (y.m_value != 0) { if (x.m_value == short.MinValue && y.m_value == -1) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlInt16((short)(x.m_value / y.m_value)); } throw new DivideByZeroException(SQLResource.DivideByZeroMessage); } public static SqlInt16 operator %(SqlInt16 x, SqlInt16 y) { if (x.IsNull || y.IsNull) { return Null; } if (y.m_value != 0) { if (x.m_value == short.MinValue && y.m_value == -1) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlInt16((short)(x.m_value % y.m_value)); } throw new DivideByZeroException(SQLResource.DivideByZeroMessage); } public static SqlInt16 operator &(SqlInt16 x, SqlInt16 y) { if (!x.IsNull && !y.IsNull) { return new SqlInt16((short)(x.m_value & y.m_value)); } return Null; } public static SqlInt16 operator |(SqlInt16 x, SqlInt16 y) { if (!x.IsNull && !y.IsNull) { return new SqlInt16((short)((ushort)x.m_value | (ushort)y.m_value)); } return Null; } public static SqlInt16 operator ^(SqlInt16 x, SqlInt16 y) { if (!x.IsNull && !y.IsNull) { return new SqlInt16((short)(x.m_value ^ y.m_value)); } return Null; } public static explicit operator SqlInt16(SqlBoolean x) { if (!x.IsNull) { return new SqlInt16(x.ByteValue); } return Null; } public static implicit operator SqlInt16(SqlByte x) { if (!x.IsNull) { return new SqlInt16(x.Value); } return Null; } public static explicit operator SqlInt16(SqlInt32 x) { if (x.IsNull) { return Null; } int value = x.Value; if (value > 32767 || value < -32768) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlInt16((short)value); } public static explicit operator SqlInt16(SqlInt64 x) { if (x.IsNull) { return Null; } long value = x.Value; if (value > 32767 || value < -32768) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlInt16((short)value); } public static explicit operator SqlInt16(SqlSingle x) { if (x.IsNull) { return Null; } float value = x.Value; if (value < -32768f || value > 32767f) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlInt16((short)value); } public static explicit operator SqlInt16(SqlDouble x) { if (x.IsNull) { return Null; } double value = x.Value; if (value < -32768.0 || value > 32767.0) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlInt16((short)value); } public static explicit operator SqlInt16(SqlMoney x) { if (!x.IsNull) { return new SqlInt16(checked((short)x.ToInt32())); } return Null; } public static explicit operator SqlInt16(SqlDecimal x) { return (SqlInt16)(SqlInt32)x; } public static explicit operator SqlInt16(SqlString x) { if (!x.IsNull) { return new SqlInt16(short.Parse(x.Value, null)); } return Null; } public static SqlBoolean operator ==(SqlInt16 x, SqlInt16 y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value == y.m_value); } return SqlBoolean.Null; } public static SqlBoolean operator !=(SqlInt16 x, SqlInt16 y) { return !(x == y); } public static SqlBoolean operator <(SqlInt16 x, SqlInt16 y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value < y.m_value); } return SqlBoolean.Null; } public static SqlBoolean operator >(SqlInt16 x, SqlInt16 y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value > y.m_value); } return SqlBoolean.Null; } public static SqlBoolean operator <=(SqlInt16 x, SqlInt16 y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value <= y.m_value); } return SqlBoolean.Null; } public static SqlBoolean operator >=(SqlInt16 x, SqlInt16 y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value >= y.m_value); } return SqlBoolean.Null; } public static SqlInt16 OnesComplement(SqlInt16 x) { return ~x; } public static SqlInt16 Add(SqlInt16 x, SqlInt16 y) { return x + y; } public static SqlInt16 Subtract(SqlInt16 x, SqlInt16 y) { return x - y; } public static SqlInt16 Multiply(SqlInt16 x, SqlInt16 y) { return x * y; } public static SqlInt16 Divide(SqlInt16 x, SqlInt16 y) { return x / y; } public static SqlInt16 Mod(SqlInt16 x, SqlInt16 y) { return x % y; } public static SqlInt16 Modulus(SqlInt16 x, SqlInt16 y) { return x % y; } public static SqlInt16 BitwiseAnd(SqlInt16 x, SqlInt16 y) { return x & y; } public static SqlInt16 BitwiseOr(SqlInt16 x, SqlInt16 y) { return x | y; } public static SqlInt16 Xor(SqlInt16 x, SqlInt16 y) { return x ^ y; } public static SqlBoolean Equals(SqlInt16 x, SqlInt16 y) { return x == y; } public static SqlBoolean NotEquals(SqlInt16 x, SqlInt16 y) { return x != y; } public static SqlBoolean LessThan(SqlInt16 x, SqlInt16 y) { return x < y; } public static SqlBoolean GreaterThan(SqlInt16 x, SqlInt16 y) { return x > y; } public static SqlBoolean LessThanOrEqual(SqlInt16 x, SqlInt16 y) { return x <= y; } public static SqlBoolean GreaterThanOrEqual(SqlInt16 x, SqlInt16 y) { return x >= y; } public SqlBoolean ToSqlBoolean() { return (SqlBoolean)this; } public SqlByte ToSqlByte() { return (SqlByte)this; } public SqlDouble ToSqlDouble() { return this; } public SqlInt32 ToSqlInt32() { return this; } public SqlInt64 ToSqlInt64() { return this; } public SqlMoney ToSqlMoney() { return this; } public SqlDecimal ToSqlDecimal() { return this; } public SqlSingle ToSqlSingle() { return this; } public SqlString ToSqlString() { return (SqlString)this; } public int CompareTo(object value) { if (value is SqlInt16 value2) { return CompareTo(value2); } throw ADP.WrongType(value.GetType(), typeof(SqlInt16)); } public int CompareTo(SqlInt16 value) { if (IsNull) { if (!value.IsNull) { return -1; } return 0; } if (value.IsNull) { return 1; } if (this < value) { return -1; } if (this > value) { return 1; } return 0; } public override bool Equals(object value) { if (!(value is SqlInt16 sqlInt)) { return false; } if (sqlInt.IsNull || IsNull) { if (sqlInt.IsNull) { return IsNull; } return false; } return (this == sqlInt).Value; } public override int GetHashCode() { if (!IsNull) { return Value.GetHashCode(); } return 0; } XmlSchema IXmlSerializable.GetSchema() { return null; } void IXmlSerializable.ReadXml(XmlReader reader) { string attribute = reader.GetAttribute("nil", "http://www.w3.org/2001/XMLSchema-instance"); if (attribute != null && XmlConvert.ToBoolean(attribute)) { reader.ReadElementString(); m_fNotNull = false; } else { m_value = XmlConvert.ToInt16(reader.ReadElementString()); m_fNotNull = true; } } void IXmlSerializable.WriteXml(XmlWriter writer) { if (IsNull) { writer.WriteAttributeString("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance", "true"); } else { writer.WriteString(XmlConvert.ToString(m_value)); } } public static XmlQualifiedName GetXsdType(XmlSchemaSet schemaSet) { return new XmlQualifiedName("short", "http://www.w3.org/2001/XMLSchema"); } } [Serializable] [XmlSchemaProvider("GetXsdType")] public struct SqlInt32 : INullable, IComparable, IXmlSerializable { private bool m_fNotNull; private int m_value; private static readonly long s_iIntMin = -2147483648L; private static readonly long s_lBitNotIntMax = -2147483648L; public static readonly SqlInt32 Null = new SqlInt32(fNull: true); public static readonly SqlInt32 Zero = new SqlInt32(0); public static readonly SqlInt32 MinValue = new SqlInt32(int.MinValue); public static readonly SqlInt32 MaxValue = new SqlInt32(int.MaxValue); public bool IsNull => !m_fNotNull; public int Value { get { if (IsNull) { throw new SqlNullValueException(); } return m_value; } } private SqlInt32(bool fNull) { m_fNotNull = false; m_value = 0; } public SqlInt32(int value) { m_value = value; m_fNotNull = true; } public static implicit operator SqlInt32(int x) { return new SqlInt32(x); } public static explicit operator int(SqlInt32 x) { return x.Value; } public override string ToString() { if (!IsNull) { return m_value.ToString((IFormatProvider?)null); } return SQLResource.NullString; } public static SqlInt32 Parse(string s) { if (s == SQLResource.NullString) { return Null; } return new SqlInt32(int.Parse(s, null)); } public static SqlInt32 operator -(SqlInt32 x) { if (!x.IsNull) { return new SqlInt32(-x.m_value); } return Null; } public static SqlInt32 operator ~(SqlInt32 x) { if (!x.IsNull) { return new SqlInt32(~x.m_value); } return Null; } public static SqlInt32 operator +(SqlInt32 x, SqlInt32 y) { if (x.IsNull || y.IsNull) { return Null; } int num = x.m_value + y.m_value; if (SameSignInt(x.m_value, y.m_value) && !SameSignInt(x.m_value, num)) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlInt32(num); } public static SqlInt32 operator -(SqlInt32 x, SqlInt32 y) { if (x.IsNull || y.IsNull) { return Null; } int num = x.m_value - y.m_value; if (!SameSignInt(x.m_value, y.m_value) && SameSignInt(y.m_value, num)) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlInt32(num); } public static SqlInt32 operator *(SqlInt32 x, SqlInt32 y) { if (x.IsNull || y.IsNull) { return Null; } long num = (long)x.m_value * (long)y.m_value; long num2 = num & s_lBitNotIntMax; if (num2 != 0L && num2 != s_lBitNotIntMax) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlInt32((int)num); } public static SqlInt32 operator /(SqlInt32 x, SqlInt32 y) { if (x.IsNull || y.IsNull) { return Null; } if (y.m_value != 0) { if (x.m_value == s_iIntMin && y.m_value == -1) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlInt32(x.m_value / y.m_value); } throw new DivideByZeroException(SQLResource.DivideByZeroMessage); } public static SqlInt32 operator %(SqlInt32 x, SqlInt32 y) { if (x.IsNull || y.IsNull) { return Null; } if (y.m_value != 0) { if (x.m_value == s_iIntMin && y.m_value == -1) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlInt32(x.m_value % y.m_value); } throw new DivideByZeroException(SQLResource.DivideByZeroMessage); } public static SqlInt32 operator &(SqlInt32 x, SqlInt32 y) { if (!x.IsNull && !y.IsNull) { return new SqlInt32(x.m_value & y.m_value); } return Null; } public static SqlInt32 operator |(SqlInt32 x, SqlInt32 y) { if (!x.IsNull && !y.IsNull) { return new SqlInt32(x.m_value | y.m_value); } return Null; } public static SqlInt32 operator ^(SqlInt32 x, SqlInt32 y) { if (!x.IsNull && !y.IsNull) { return new SqlInt32(x.m_value ^ y.m_value); } return Null; } public static explicit operator SqlInt32(SqlBoolean x) { if (!x.IsNull) { return new SqlInt32(x.ByteValue); } return Null; } public static implicit operator SqlInt32(SqlByte x) { if (!x.IsNull) { return new SqlInt32(x.Value); } return Null; } public static implicit operator SqlInt32(SqlInt16 x) { if (!x.IsNull) { return new SqlInt32(x.Value); } return Null; } public static explicit operator SqlInt32(SqlInt64 x) { if (x.IsNull) { return Null; } long value = x.Value; if (value > int.MaxValue || value < int.MinValue) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlInt32((int)value); } public static explicit operator SqlInt32(SqlSingle x) { if (x.IsNull) { return Null; } float value = x.Value; if (value > 2.1474836E+09f || value < -2.1474836E+09f) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlInt32((int)value); } public static explicit operator SqlInt32(SqlDouble x) { if (x.IsNull) { return Null; } double value = x.Value; if (value > 2147483647.0 || value < -2147483648.0) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlInt32((int)value); } public static explicit operator SqlInt32(SqlMoney x) { if (!x.IsNull) { return new SqlInt32(x.ToInt32()); } return Null; } public static explicit operator SqlInt32(SqlDecimal x) { if (x.IsNull) { return Null; } x.AdjustScale(-x.Scale, fRound: true); long num = x._data1; if (!x.IsPositive) { num = -num; } if (x._bLen > 1 || num > int.MaxValue || num < int.MinValue) { throw new OverflowException(SQLResource.ConversionOverflowMessage); } return new SqlInt32((int)num); } public static explicit operator SqlInt32(SqlString x) { if (!x.IsNull) { return new SqlInt32(int.Parse(x.Value, null)); } return Null; } private static bool SameSignInt(int x, int y) { return ((x ^ y) & 0x80000000u) == 0; } public static SqlBoolean operator ==(SqlInt32 x, SqlInt32 y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value == y.m_value); } return SqlBoolean.Null; } public static SqlBoolean operator !=(SqlInt32 x, SqlInt32 y) { return !(x == y); } public static SqlBoolean operator <(SqlInt32 x, SqlInt32 y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value < y.m_value); } return SqlBoolean.Null; } public static SqlBoolean operator >(SqlInt32 x, SqlInt32 y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value > y.m_value); } return SqlBoolean.Null; } public static SqlBoolean operator <=(SqlInt32 x, SqlInt32 y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value <= y.m_value); } return SqlBoolean.Null; } public static SqlBoolean operator >=(SqlInt32 x, SqlInt32 y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value >= y.m_value); } return SqlBoolean.Null; } public static SqlInt32 OnesComplement(SqlInt32 x) { return ~x; } public static SqlInt32 Add(SqlInt32 x, SqlInt32 y) { return x + y; } public static SqlInt32 Subtract(SqlInt32 x, SqlInt32 y) { return x - y; } public static SqlInt32 Multiply(SqlInt32 x, SqlInt32 y) { return x * y; } public static SqlInt32 Divide(SqlInt32 x, SqlInt32 y) { return x / y; } public static SqlInt32 Mod(SqlInt32 x, SqlInt32 y) { return x % y; } public static SqlInt32 Modulus(SqlInt32 x, SqlInt32 y) { return x % y; } public static SqlInt32 BitwiseAnd(SqlInt32 x, SqlInt32 y) { return x & y; } public static SqlInt32 BitwiseOr(SqlInt32 x, SqlInt32 y) { return x | y; } public static SqlInt32 Xor(SqlInt32 x, SqlInt32 y) { return x ^ y; } public static SqlBoolean Equals(SqlInt32 x, SqlInt32 y) { return x == y; } public static SqlBoolean NotEquals(SqlInt32 x, SqlInt32 y) { return x != y; } public static SqlBoolean LessThan(SqlInt32 x, SqlInt32 y) { return x < y; } public static SqlBoolean GreaterThan(SqlInt32 x, SqlInt32 y) { return x > y; } public static SqlBoolean LessThanOrEqual(SqlInt32 x, SqlInt32 y) { return x <= y; } public static SqlBoolean GreaterThanOrEqual(SqlInt32 x, SqlInt32 y) { return x >= y; } public SqlBoolean ToSqlBoolean() { return (SqlBoolean)this; } public SqlByte ToSqlByte() { return (SqlByte)this; } public SqlDouble ToSqlDouble() { return this; } public SqlInt16 ToSqlInt16() { return (SqlInt16)this; } public SqlInt64 ToSqlInt64() { return this; } public SqlMoney ToSqlMoney() { return this; } public SqlDecimal ToSqlDecimal() { return this; } public SqlSingle ToSqlSingle() { return this; } public SqlString ToSqlString() { return (SqlString)this; } public int CompareTo(object value) { if (value is SqlInt32 value2) { return CompareTo(value2); } throw ADP.WrongType(value.GetType(), typeof(SqlInt32)); } public int CompareTo(SqlInt32 value) { if (IsNull) { if (!value.IsNull) { return -1; } return 0; } if (value.IsNull) { return 1; } if (this < value) { return -1; } if (this > value) { return 1; } return 0; } public override bool Equals(object value) { if (!(value is SqlInt32 sqlInt)) { return false; } if (sqlInt.IsNull || IsNull) { if (sqlInt.IsNull) { return IsNull; } return false; } return (this == sqlInt).Value; } public override int GetHashCode() { if (!IsNull) { return Value.GetHashCode(); } return 0; } XmlSchema IXmlSerializable.GetSchema() { return null; } void IXmlSerializable.ReadXml(XmlReader reader) { string attribute = reader.GetAttribute("nil", "http://www.w3.org/2001/XMLSchema-instance"); if (attribute != null && XmlConvert.ToBoolean(attribute)) { reader.ReadElementString(); m_fNotNull = false; } else { m_value = XmlConvert.ToInt32(reader.ReadElementString()); m_fNotNull = true; } } void IXmlSerializable.WriteXml(XmlWriter writer) { if (IsNull) { writer.WriteAttributeString("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance", "true"); } else { writer.WriteString(XmlConvert.ToString(m_value)); } } public static XmlQualifiedName GetXsdType(XmlSchemaSet schemaSet) { return new XmlQualifiedName("int", "http://www.w3.org/2001/XMLSchema"); } } [Serializable] [XmlSchemaProvider("GetXsdType")] public struct SqlInt64 : INullable, IComparable, IXmlSerializable { private bool m_fNotNull; private long m_value; private static readonly long s_lLowIntMask = 4294967295L; private static readonly long s_lHighIntMask = -4294967296L; public static readonly SqlInt64 Null = new SqlInt64(fNull: true); public static readonly SqlInt64 Zero = new SqlInt64(0L); public static readonly SqlInt64 MinValue = new SqlInt64(long.MinValue); public static readonly SqlInt64 MaxValue = new SqlInt64(long.MaxValue); public bool IsNull => !m_fNotNull; public long Value { get { if (m_fNotNull) { return m_value; } throw new SqlNullValueException(); } } private SqlInt64(bool fNull) { m_fNotNull = false; m_value = 0L; } public SqlInt64(long value) { m_value = value; m_fNotNull = true; } public static implicit operator SqlInt64(long x) { return new SqlInt64(x); } public static explicit operator long(SqlInt64 x) { return x.Value; } public override string ToString() { if (!IsNull) { return m_value.ToString((IFormatProvider?)null); } return SQLResource.NullString; } public static SqlInt64 Parse(string s) { if (s == SQLResource.NullString) { return Null; } return new SqlInt64(long.Parse(s, null)); } public static SqlInt64 operator -(SqlInt64 x) { if (!x.IsNull) { return new SqlInt64(-x.m_value); } return Null; } public static SqlInt64 operator ~(SqlInt64 x) { if (!x.IsNull) { return new SqlInt64(~x.m_value); } return Null; } public static SqlInt64 operator +(SqlInt64 x, SqlInt64 y) { if (x.IsNull || y.IsNull) { return Null; } long num = x.m_value + y.m_value; if (SameSignLong(x.m_value, y.m_value) && !SameSignLong(x.m_value, num)) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlInt64(num); } public static SqlInt64 operator -(SqlInt64 x, SqlInt64 y) { if (x.IsNull || y.IsNull) { return Null; } long num = x.m_value - y.m_value; if (!SameSignLong(x.m_value, y.m_value) && SameSignLong(y.m_value, num)) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlInt64(num); } public static SqlInt64 operator *(SqlInt64 x, SqlInt64 y) { if (x.IsNull || y.IsNull) { return Null; } bool flag = false; long num = x.m_value; long num2 = y.m_value; long num3 = 0L; if (num < 0) { flag = true; num = -num; } if (num2 < 0) { flag = !flag; num2 = -num2; } long num4 = num & s_lLowIntMask; long num5 = (num >> 32) & s_lLowIntMask; long num6 = num2 & s_lLowIntMask; long num7 = (num2 >> 32) & s_lLowIntMask; if (num5 != 0L && num7 != 0L) { throw new OverflowException(SQLResource.ArithOverflowMessage); } long num8 = num4 * num6; if (num8 < 0) { throw new OverflowException(SQLResource.ArithOverflowMessage); } if (num5 != 0L) { num3 = num5 * num6; if (num3 < 0 || num3 > long.MaxValue) { throw new OverflowException(SQLResource.ArithOverflowMessage); } } else if (num7 != 0L) { num3 = num4 * num7; if (num3 < 0 || num3 > long.MaxValue) { throw new OverflowException(SQLResource.ArithOverflowMessage); } } num8 += num3 << 32; if (num8 < 0) { throw new OverflowException(SQLResource.ArithOverflowMessage); } if (flag) { num8 = -num8; } return new SqlInt64(num8); } public static SqlInt64 operator /(SqlInt64 x, SqlInt64 y) { if (x.IsNull || y.IsNull) { return Null; } if (y.m_value != 0L) { if (x.m_value == long.MinValue && y.m_value == -1) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlInt64(x.m_value / y.m_value); } throw new DivideByZeroException(SQLResource.DivideByZeroMessage); } public static SqlInt64 operator %(SqlInt64 x, SqlInt64 y) { if (x.IsNull || y.IsNull) { return Null; } if (y.m_value != 0L) { if (x.m_value == long.MinValue && y.m_value == -1) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlInt64(x.m_value % y.m_value); } throw new DivideByZeroException(SQLResource.DivideByZeroMessage); } public static SqlInt64 operator &(SqlInt64 x, SqlInt64 y) { if (!x.IsNull && !y.IsNull) { return new SqlInt64(x.m_value & y.m_value); } return Null; } public static SqlInt64 operator |(SqlInt64 x, SqlInt64 y) { if (!x.IsNull && !y.IsNull) { return new SqlInt64(x.m_value | y.m_value); } return Null; } public static SqlInt64 operator ^(SqlInt64 x, SqlInt64 y) { if (!x.IsNull && !y.IsNull) { return new SqlInt64(x.m_value ^ y.m_value); } return Null; } public static explicit operator SqlInt64(SqlBoolean x) { if (!x.IsNull) { return new SqlInt64(x.ByteValue); } return Null; } public static implicit operator SqlInt64(SqlByte x) { if (!x.IsNull) { return new SqlInt64(x.Value); } return Null; } public static implicit operator SqlInt64(SqlInt16 x) { if (!x.IsNull) { return new SqlInt64(x.Value); } return Null; } public static implicit operator SqlInt64(SqlInt32 x) { if (!x.IsNull) { return new SqlInt64(x.Value); } return Null; } public static explicit operator SqlInt64(SqlSingle x) { if (x.IsNull) { return Null; } float value = x.Value; if (value > 9.223372E+18f || value < -9.223372E+18f) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlInt64((long)value); } public static explicit operator SqlInt64(SqlDouble x) { if (x.IsNull) { return Null; } double value = x.Value; if (value > 9.223372036854776E+18 || value < -9.223372036854776E+18) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlInt64((long)value); } public static explicit operator SqlInt64(SqlMoney x) { if (!x.IsNull) { return new SqlInt64(x.ToInt64()); } return Null; } public static explicit operator SqlInt64(SqlDecimal x) { if (x.IsNull) { return Null; } SqlDecimal sqlDecimal = x; sqlDecimal.AdjustScale(-sqlDecimal._bScale, fRound: false); if (sqlDecimal._bLen > 2) { throw new OverflowException(SQLResource.ConversionOverflowMessage); } long num2; if (sqlDecimal._bLen == 2) { ulong num = SqlDecimal.DWL(sqlDecimal._data1, sqlDecimal._data2); if (num > SqlDecimal.s_llMax && (sqlDecimal.IsPositive || num != 1 + SqlDecimal.s_llMax)) { throw new OverflowException(SQLResource.ConversionOverflowMessage); } num2 = (long)num; } else { num2 = sqlDecimal._data1; } if (!sqlDecimal.IsPositive) { num2 = -num2; } return new SqlInt64(num2); } public static explicit operator SqlInt64(SqlString x) { if (!x.IsNull) { return new SqlInt64(long.Parse(x.Value, null)); } return Null; } private static bool SameSignLong(long x, long y) { return ((x ^ y) & long.MinValue) == 0; } public static SqlBoolean operator ==(SqlInt64 x, SqlInt64 y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value == y.m_value); } return SqlBoolean.Null; } public static SqlBoolean operator !=(SqlInt64 x, SqlInt64 y) { return !(x == y); } public static SqlBoolean operator <(SqlInt64 x, SqlInt64 y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value < y.m_value); } return SqlBoolean.Null; } public static SqlBoolean operator >(SqlInt64 x, SqlInt64 y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value > y.m_value); } return SqlBoolean.Null; } public static SqlBoolean operator <=(SqlInt64 x, SqlInt64 y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value <= y.m_value); } return SqlBoolean.Null; } public static SqlBoolean operator >=(SqlInt64 x, SqlInt64 y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x.m_value >= y.m_value); } return SqlBoolean.Null; } public static SqlInt64 OnesComplement(SqlInt64 x) { return ~x; } public static SqlInt64 Add(SqlInt64 x, SqlInt64 y) { return x + y; } public static SqlInt64 Subtract(SqlInt64 x, SqlInt64 y) { return x - y; } public static SqlInt64 Multiply(SqlInt64 x, SqlInt64 y) { return x * y; } public static SqlInt64 Divide(SqlInt64 x, SqlInt64 y) { return x / y; } public static SqlInt64 Mod(SqlInt64 x, SqlInt64 y) { return x % y; } public static SqlInt64 Modulus(SqlInt64 x, SqlInt64 y) { return x % y; } public static SqlInt64 BitwiseAnd(SqlInt64 x, SqlInt64 y) { return x & y; } public static SqlInt64 BitwiseOr(SqlInt64 x, SqlInt64 y) { return x | y; } public static SqlInt64 Xor(SqlInt64 x, SqlInt64 y) { return x ^ y; } public static SqlBoolean Equals(SqlInt64 x, SqlInt64 y) { return x == y; } public static SqlBoolean NotEquals(SqlInt64 x, SqlInt64 y) { return x != y; } public static SqlBoolean LessThan(SqlInt64 x, SqlInt64 y) { return x < y; } public static SqlBoolean GreaterThan(SqlInt64 x, SqlInt64 y) { return x > y; } public static SqlBoolean LessThanOrEqual(SqlInt64 x, SqlInt64 y) { return x <= y; } public static SqlBoolean GreaterThanOrEqual(SqlInt64 x, SqlInt64 y) { return x >= y; } public SqlBoolean ToSqlBoolean() { return (SqlBoolean)this; } public SqlByte ToSqlByte() { return (SqlByte)this; } public SqlDouble ToSqlDouble() { return this; } public SqlInt16 ToSqlInt16() { return (SqlInt16)this; } public SqlInt32 ToSqlInt32() { return (SqlInt32)this; } public SqlMoney ToSqlMoney() { return this; } public SqlDecimal ToSqlDecimal() { return this; } public SqlSingle ToSqlSingle() { return this; } public SqlString ToSqlString() { return (SqlString)this; } public int CompareTo(object value) { if (value is SqlInt64 value2) { return CompareTo(value2); } throw ADP.WrongType(value.GetType(), typeof(SqlInt64)); } public int CompareTo(SqlInt64 value) { if (IsNull) { if (!value.IsNull) { return -1; } return 0; } if (value.IsNull) { return 1; } if (this < value) { return -1; } if (this > value) { return 1; } return 0; } public override bool Equals(object value) { if (!(value is SqlInt64 sqlInt)) { return false; } if (sqlInt.IsNull || IsNull) { if (sqlInt.IsNull) { return IsNull; } return false; } return (this == sqlInt).Value; } public override int GetHashCode() { if (!IsNull) { return Value.GetHashCode(); } return 0; } XmlSchema IXmlSerializable.GetSchema() { return null; } void IXmlSerializable.ReadXml(XmlReader reader) { string attribute = reader.GetAttribute("nil", "http://www.w3.org/2001/XMLSchema-instance"); if (attribute != null && XmlConvert.ToBoolean(attribute)) { reader.ReadElementString(); m_fNotNull = false; } else { m_value = XmlConvert.ToInt64(reader.ReadElementString()); m_fNotNull = true; } } void IXmlSerializable.WriteXml(XmlWriter writer) { if (IsNull) { writer.WriteAttributeString("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance", "true"); } else { writer.WriteString(XmlConvert.ToString(m_value)); } } public static XmlQualifiedName GetXsdType(XmlSchemaSet schemaSet) { return new XmlQualifiedName("long", "http://www.w3.org/2001/XMLSchema"); } } [Serializable] [XmlSchemaProvider("GetXsdType")] public struct SqlMoney : INullable, IComparable, IXmlSerializable { private bool _fNotNull; private long _value; internal static readonly int s_iMoneyScale = 4; private static readonly long s_lTickBase = 10000L; private static readonly double s_dTickBase = s_lTickBase; private static readonly long s_minLong = long.MinValue / s_lTickBase; private static readonly long s_maxLong = long.MaxValue / s_lTickBase; public static readonly SqlMoney Null = new SqlMoney(fNull: true); public static readonly SqlMoney Zero = new SqlMoney(0); public static readonly SqlMoney MinValue = new SqlMoney(long.MinValue, 0); public static readonly SqlMoney MaxValue = new SqlMoney(long.MaxValue, 0); public bool IsNull => !_fNotNull; public decimal Value { get { if (_fNotNull) { return ToDecimal(); } throw new SqlNullValueException(); } } private SqlMoney(bool fNull) { _fNotNull = false; _value = 0L; } internal SqlMoney(long value, int ignored) { _value = value; _fNotNull = true; } public SqlMoney(int value) { _value = value * s_lTickBase; _fNotNull = true; } public SqlMoney(long value) { if (value < s_minLong || value > s_maxLong) { throw new OverflowException(SQLResource.ArithOverflowMessage); } _value = value * s_lTickBase; _fNotNull = true; } public SqlMoney(decimal value) { SqlDecimal sqlDecimal = new SqlDecimal(value); sqlDecimal.AdjustScale(s_iMoneyScale - sqlDecimal.Scale, fRound: true); if (sqlDecimal._data3 != 0 || sqlDecimal._data4 != 0) { throw new OverflowException(SQLResource.ArithOverflowMessage); } bool isPositive = sqlDecimal.IsPositive; ulong num = sqlDecimal._data1 + ((ulong)sqlDecimal._data2 << 32); if ((isPositive && num > long.MaxValue) || (!isPositive && num > 9223372036854775808uL)) { throw new OverflowException(SQLResource.ArithOverflowMessage); } _value = (long)(isPositive ? num : (0L - num)); _fNotNull = true; } public SqlMoney(double value) : this(new decimal(value)) { } public decimal ToDecimal() { if (IsNull) { throw new SqlNullValueException(); } bool isNegative = false; long num = _value; if (_value < 0) { isNegative = true; num = -_value; } return new decimal((int)num, (int)(num >> 32), 0, isNegative, (byte)s_iMoneyScale); } public long ToInt64() { if (IsNull) { throw new SqlNullValueException(); } long num = _value / (s_lTickBase / 10); bool flag = num >= 0; long num2 = num % 10; num /= 10; if (num2 >= 5) { num = ((!flag) ? (num - 1) : (num + 1)); } return num; } internal long ToSqlInternalRepresentation() { if (IsNull) { throw new SqlNullValueException(); } return _value; } public int ToInt32() { return checked((int)ToInt64()); } public double ToDouble() { return decimal.ToDouble(ToDecimal()); } public static implicit operator SqlMoney(decimal x) { return new SqlMoney(x); } public static explicit operator SqlMoney(double x) { return new SqlMoney(x); } public static implicit operator SqlMoney(long x) { return new SqlMoney(new decimal(x)); } public static explicit operator decimal(SqlMoney x) { return x.Value; } public override string ToString() { if (IsNull) { return SQLResource.NullString; } return ToDecimal().ToString("#0.00##", null); } public static SqlMoney Parse(string s) { if (s == SQLResource.NullString) { return Null; } decimal result; return (!decimal.TryParse(s, NumberStyles.Integer | NumberStyles.AllowTrailingSign | NumberStyles.AllowParentheses | NumberStyles.AllowDecimalPoint | NumberStyles.AllowCurrencySymbol, NumberFormatInfo.InvariantInfo, out result)) ? new SqlMoney(decimal.Parse(s, NumberStyles.Currency, NumberFormatInfo.CurrentInfo)) : new SqlMoney(result); } public static SqlMoney operator -(SqlMoney x) { if (x.IsNull) { return Null; } if (x._value == s_minLong) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlMoney(-x._value, 0); } public static SqlMoney operator +(SqlMoney x, SqlMoney y) { try { return (x.IsNull || y.IsNull) ? Null : new SqlMoney(checked(x._value + y._value), 0); } catch (OverflowException) { throw new OverflowException(SQLResource.ArithOverflowMessage); } } public static SqlMoney operator -(SqlMoney x, SqlMoney y) { try { return (x.IsNull || y.IsNull) ? Null : new SqlMoney(checked(x._value - y._value), 0); } catch (OverflowException) { throw new OverflowException(SQLResource.ArithOverflowMessage); } } public static SqlMoney operator *(SqlMoney x, SqlMoney y) { if (!x.IsNull && !y.IsNull) { return new SqlMoney(decimal.Multiply(x.ToDecimal(), y.ToDecimal())); } return Null; } public static SqlMoney operator /(SqlMoney x, SqlMoney y) { if (!x.IsNull && !y.IsNull) { return new SqlMoney(decimal.Divide(x.ToDecimal(), y.ToDecimal())); } return Null; } public static explicit operator SqlMoney(SqlBoolean x) { if (!x.IsNull) { return new SqlMoney(x.ByteValue); } return Null; } public static implicit operator SqlMoney(SqlByte x) { if (!x.IsNull) { return new SqlMoney(x.Value); } return Null; } public static implicit operator SqlMoney(SqlInt16 x) { if (!x.IsNull) { return new SqlMoney(x.Value); } return Null; } public static implicit operator SqlMoney(SqlInt32 x) { if (!x.IsNull) { return new SqlMoney(x.Value); } return Null; } public static implicit operator SqlMoney(SqlInt64 x) { if (!x.IsNull) { return new SqlMoney(x.Value); } return Null; } public static explicit operator SqlMoney(SqlSingle x) { if (!x.IsNull) { return new SqlMoney(x.Value); } return Null; } public static explicit operator SqlMoney(SqlDouble x) { if (!x.IsNull) { return new SqlMoney(x.Value); } return Null; } public static explicit operator SqlMoney(SqlDecimal x) { if (!x.IsNull) { return new SqlMoney(x.Value); } return Null; } public static explicit operator SqlMoney(SqlString x) { if (!x.IsNull) { return new SqlMoney(decimal.Parse(x.Value, NumberStyles.Currency, null)); } return Null; } public static SqlBoolean operator ==(SqlMoney x, SqlMoney y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x._value == y._value); } return SqlBoolean.Null; } public static SqlBoolean operator !=(SqlMoney x, SqlMoney y) { return !(x == y); } public static SqlBoolean operator <(SqlMoney x, SqlMoney y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x._value < y._value); } return SqlBoolean.Null; } public static SqlBoolean operator >(SqlMoney x, SqlMoney y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x._value > y._value); } return SqlBoolean.Null; } public static SqlBoolean operator <=(SqlMoney x, SqlMoney y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x._value <= y._value); } return SqlBoolean.Null; } public static SqlBoolean operator >=(SqlMoney x, SqlMoney y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x._value >= y._value); } return SqlBoolean.Null; } public static SqlMoney Add(SqlMoney x, SqlMoney y) { return x + y; } public static SqlMoney Subtract(SqlMoney x, SqlMoney y) { return x - y; } public static SqlMoney Multiply(SqlMoney x, SqlMoney y) { return x * y; } public static SqlMoney Divide(SqlMoney x, SqlMoney y) { return x / y; } public static SqlBoolean Equals(SqlMoney x, SqlMoney y) { return x == y; } public static SqlBoolean NotEquals(SqlMoney x, SqlMoney y) { return x != y; } public static SqlBoolean LessThan(SqlMoney x, SqlMoney y) { return x < y; } public static SqlBoolean GreaterThan(SqlMoney x, SqlMoney y) { return x > y; } public static SqlBoolean LessThanOrEqual(SqlMoney x, SqlMoney y) { return x <= y; } public static SqlBoolean GreaterThanOrEqual(SqlMoney x, SqlMoney y) { return x >= y; } public SqlBoolean ToSqlBoolean() { return (SqlBoolean)this; } public SqlByte ToSqlByte() { return (SqlByte)this; } public SqlDouble ToSqlDouble() { return this; } public SqlInt16 ToSqlInt16() { return (SqlInt16)this; } public SqlInt32 ToSqlInt32() { return (SqlInt32)this; } public SqlInt64 ToSqlInt64() { return (SqlInt64)this; } public SqlDecimal ToSqlDecimal() { return this; } public SqlSingle ToSqlSingle() { return this; } public SqlString ToSqlString() { return (SqlString)this; } public int CompareTo(object value) { if (value is SqlMoney value2) { return CompareTo(value2); } throw ADP.WrongType(value.GetType(), typeof(SqlMoney)); } public int CompareTo(SqlMoney value) { if (IsNull) { if (!value.IsNull) { return -1; } return 0; } if (value.IsNull) { return 1; } if (this < value) { return -1; } if (this > value) { return 1; } return 0; } public override bool Equals(object value) { if (!(value is SqlMoney sqlMoney)) { return false; } if (sqlMoney.IsNull || IsNull) { if (sqlMoney.IsNull) { return IsNull; } return false; } return (this == sqlMoney).Value; } public override int GetHashCode() { if (!IsNull) { return _value.GetHashCode(); } return 0; } XmlSchema IXmlSerializable.GetSchema() { return null; } void IXmlSerializable.ReadXml(XmlReader reader) { string attribute = reader.GetAttribute("nil", "http://www.w3.org/2001/XMLSchema-instance"); if (attribute != null && XmlConvert.ToBoolean(attribute)) { reader.ReadElementString(); _fNotNull = false; } else { SqlMoney sqlMoney = new SqlMoney(XmlConvert.ToDecimal(reader.ReadElementString())); _fNotNull = sqlMoney._fNotNull; _value = sqlMoney._value; } } void IXmlSerializable.WriteXml(XmlWriter writer) { if (IsNull) { writer.WriteAttributeString("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance", "true"); } else { writer.WriteString(XmlConvert.ToString(ToDecimal())); } } public static XmlQualifiedName GetXsdType(XmlSchemaSet schemaSet) { return new XmlQualifiedName("decimal", "http://www.w3.org/2001/XMLSchema"); } } [Serializable] [XmlSchemaProvider("GetXsdType")] public struct SqlSingle : INullable, IComparable, IXmlSerializable { private bool _fNotNull; private float _value; public static readonly SqlSingle Null = new SqlSingle(fNull: true); public static readonly SqlSingle Zero = new SqlSingle(0f); public static readonly SqlSingle MinValue = new SqlSingle(float.MinValue); public static readonly SqlSingle MaxValue = new SqlSingle(float.MaxValue); public bool IsNull => !_fNotNull; public float Value { get { if (_fNotNull) { return _value; } throw new SqlNullValueException(); } } private SqlSingle(bool fNull) { _fNotNull = false; _value = 0f; } public SqlSingle(float value) { if (!float.IsFinite(value)) { throw new OverflowException(SQLResource.ArithOverflowMessage); } _fNotNull = true; _value = value; } public SqlSingle(double value) : this((float)value) { } public static implicit operator SqlSingle(float x) { return new SqlSingle(x); } public static explicit operator float(SqlSingle x) { return x.Value; } public override string ToString() { if (!IsNull) { return _value.ToString((IFormatProvider?)null); } return SQLResource.NullString; } public static SqlSingle Parse(string s) { if (s == SQLResource.NullString) { return Null; } return new SqlSingle(float.Parse(s, CultureInfo.InvariantCulture)); } public static SqlSingle operator -(SqlSingle x) { if (!x.IsNull) { return new SqlSingle(0f - x._value); } return Null; } public static SqlSingle operator +(SqlSingle x, SqlSingle y) { if (x.IsNull || y.IsNull) { return Null; } float num = x._value + y._value; if (float.IsInfinity(num)) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlSingle(num); } public static SqlSingle operator -(SqlSingle x, SqlSingle y) { if (x.IsNull || y.IsNull) { return Null; } float num = x._value - y._value; if (float.IsInfinity(num)) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlSingle(num); } public static SqlSingle operator *(SqlSingle x, SqlSingle y) { if (x.IsNull || y.IsNull) { return Null; } float num = x._value * y._value; if (float.IsInfinity(num)) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlSingle(num); } public static SqlSingle operator /(SqlSingle x, SqlSingle y) { if (x.IsNull || y.IsNull) { return Null; } if (y._value == 0f) { throw new DivideByZeroException(SQLResource.DivideByZeroMessage); } float num = x._value / y._value; if (float.IsInfinity(num)) { throw new OverflowException(SQLResource.ArithOverflowMessage); } return new SqlSingle(num); } public static explicit operator SqlSingle(SqlBoolean x) { if (!x.IsNull) { return new SqlSingle((int)x.ByteValue); } return Null; } public static implicit operator SqlSingle(SqlByte x) { if (!x.IsNull) { return new SqlSingle((int)x.Value); } return Null; } public static implicit operator SqlSingle(SqlInt16 x) { if (!x.IsNull) { return new SqlSingle(x.Value); } return Null; } public static implicit operator SqlSingle(SqlInt32 x) { if (!x.IsNull) { return new SqlSingle(x.Value); } return Null; } public static implicit operator SqlSingle(SqlInt64 x) { if (!x.IsNull) { return new SqlSingle(x.Value); } return Null; } public static implicit operator SqlSingle(SqlMoney x) { if (!x.IsNull) { return new SqlSingle(x.ToDouble()); } return Null; } public static implicit operator SqlSingle(SqlDecimal x) { if (!x.IsNull) { return new SqlSingle(x.ToDouble()); } return Null; } public static explicit operator SqlSingle(SqlDouble x) { if (!x.IsNull) { return new SqlSingle(x.Value); } return Null; } public static explicit operator SqlSingle(SqlString x) { if (x.IsNull) { return Null; } return Parse(x.Value); } public static SqlBoolean operator ==(SqlSingle x, SqlSingle y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x._value == y._value); } return SqlBoolean.Null; } public static SqlBoolean operator !=(SqlSingle x, SqlSingle y) { return !(x == y); } public static SqlBoolean operator <(SqlSingle x, SqlSingle y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x._value < y._value); } return SqlBoolean.Null; } public static SqlBoolean operator >(SqlSingle x, SqlSingle y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x._value > y._value); } return SqlBoolean.Null; } public static SqlBoolean operator <=(SqlSingle x, SqlSingle y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x._value <= y._value); } return SqlBoolean.Null; } public static SqlBoolean operator >=(SqlSingle x, SqlSingle y) { if (!x.IsNull && !y.IsNull) { return new SqlBoolean(x._value >= y._value); } return SqlBoolean.Null; } public static SqlSingle Add(SqlSingle x, SqlSingle y) { return x + y; } public static SqlSingle Subtract(SqlSingle x, SqlSingle y) { return x - y; } public static SqlSingle Multiply(SqlSingle x, SqlSingle y) { return x * y; } public static SqlSingle Divide(SqlSingle x, SqlSingle y) { return x / y; } public static SqlBoolean Equals(SqlSingle x, SqlSingle y) { return x == y; } public static SqlBoolean NotEquals(SqlSingle x, SqlSingle y) { return x != y; } public static SqlBoolean LessThan(SqlSingle x, SqlSingle y) { return x < y; } public static SqlBoolean GreaterThan(SqlSingle x, SqlSingle y) { return x > y; } public static SqlBoolean LessThanOrEqual(SqlSingle x, SqlSingle y) { return x <= y; } public static SqlBoolean GreaterThanOrEqual(SqlSingle x, SqlSingle y) { return x >= y; } public SqlBoolean ToSqlBoolean() { return (SqlBoolean)this; } public SqlByte ToSqlByte() { return (SqlByte)this; } public SqlDouble ToSqlDouble() { return this; } public SqlInt16 ToSqlInt16() { return (SqlInt16)this; } public SqlInt32 ToSqlInt32() { return (SqlInt32)this; } public SqlInt64 ToSqlInt64() { return (SqlInt64)this; } public SqlMoney ToSqlMoney() { return (SqlMoney)this; } public SqlDecimal ToSqlDecimal() { return (SqlDecimal)this; } public SqlString ToSqlString() { return (SqlString)this; } public int CompareTo(object value) { if (value is SqlSingle value2) { return CompareTo(value2); } throw ADP.WrongType(value.GetType(), typeof(SqlSingle)); } public int CompareTo(SqlSingle value) { if (IsNull) { if (!value.IsNull) { return -1; } return 0; } if (value.IsNull) { return 1; } if (this < value) { return -1; } if (this > value) { return 1; } return 0; } public override bool Equals(object value) { if (!(value is SqlSingle sqlSingle)) { return false; } if (sqlSingle.IsNull || IsNull) { if (sqlSingle.IsNull) { return IsNull; } return false; } return (this == sqlSingle).Value; } public override int GetHashCode() { if (!IsNull) { return Value.GetHashCode(); } return 0; } XmlSchema IXmlSerializable.GetSchema() { return null; } void IXmlSerializable.ReadXml(XmlReader reader) { string attribute = reader.GetAttribute("nil", "http://www.w3.org/2001/XMLSchema-instance"); if (attribute != null && XmlConvert.ToBoolean(attribute)) { reader.ReadElementString(); _fNotNull = false; } else { _value = XmlConvert.ToSingle(reader.ReadElementString()); _fNotNull = true; } } void IXmlSerializable.WriteXml(XmlWriter writer) { if (IsNull) { writer.WriteAttributeString("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance", "true"); } else { writer.WriteString(XmlConvert.ToString(_value)); } } public static XmlQualifiedName GetXsdType(XmlSchemaSet schemaSet) { return new XmlQualifiedName("float", "http://www.w3.org/2001/XMLSchema"); } } [Flags] public enum SqlCompareOptions { None = 0, IgnoreCase = 1, IgnoreNonSpace = 2, IgnoreKanaType = 8, IgnoreWidth = 0x10, BinarySort = 0x8000, BinarySort2 = 0x4000 } [Serializable] [XmlSchemaProvider("GetXsdType")] public struct SqlString : INullable, IComparable, IXmlSerializable { private string m_value; private CompareInfo m_cmpInfo; private int m_lcid; private SqlCompareOptions m_flag; private bool m_fNotNull; public static readonly SqlString Null = new SqlString(fNull: true); internal static readonly UnicodeEncoding s_unicodeEncoding = new UnicodeEncoding(); public static readonly int IgnoreCase = 1; public static readonly int IgnoreWidth = 16; public static readonly int IgnoreNonSpace = 2; public static readonly int IgnoreKanaType = 8; public static readonly int BinarySort = 32768; public static readonly int BinarySort2 = 16384; private static readonly SqlCompareOptions s_iDefaultFlag = SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth; private static readonly CompareOptions s_iValidCompareOptionMask = CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth; internal static readonly SqlCompareOptions s_iValidSqlCompareOptionMask = SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreNonSpace | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth | SqlCompareOptions.BinarySort | SqlCompareOptions.BinarySort2; internal static readonly int s_lcidUSEnglish = 1033; private static readonly int s_lcidBinary = 33280; public bool IsNull => !m_fNotNull; public string Value { get { if (!IsNull) { return m_value; } throw new SqlNullValueException(); } } public int LCID { get { if (!IsNull) { return m_lcid; } throw new SqlNullValueException(); } } public CultureInfo CultureInfo { get { if (!IsNull) { return CultureInfo.GetCultureInfo(m_lcid); } throw new SqlNullValueException(); } } public CompareInfo CompareInfo { get { if (!IsNull) { SetCompareInfo(); return m_cmpInfo; } throw new SqlNullValueException(); } } public SqlCompareOptions SqlCompareOptions { get { if (!IsNull) { return m_flag; } throw new SqlNullValueException(); } } private SqlString(bool fNull) { m_value = null; m_cmpInfo = null; m_lcid = 0; m_flag = SqlCompareOptions.None; m_fNotNull = false; } public SqlString(int lcid, SqlCompareOptions compareOptions, byte[] data, int index, int count, bool fUnicode) { m_lcid = lcid; ValidateSqlCompareOptions(compareOptions); m_flag = compareOptions; if (data == null) { m_fNotNull = false; m_value = null; m_cmpInfo = null; return; } m_fNotNull = true; m_cmpInfo = null; if (fUnicode) { m_value = s_unicodeEncoding.GetString(data, index, count); return; } Encoding encoding = Encoding.GetEncoding(new CultureInfo(m_lcid).TextInfo.ANSICodePage); m_value = encoding.GetString(data, index, count); } public SqlString(int lcid, SqlCompareOptions compareOptions, byte[] data, bool fUnicode) : this(lcid, compareOptions, data, 0, data.Length, fUnicode) { } public SqlString(int lcid, SqlCompareOptions compareOptions, byte[] data, int index, int count) : this(lcid, compareOptions, data, index, count, fUnicode: true) { } public SqlString(int lcid, SqlCompareOptions compareOptions, byte[] data) : this(lcid, compareOptions, data, 0, data.Length, fUnicode: true) { } public SqlString(string data, int lcid, SqlCompareOptions compareOptions) { m_lcid = lcid; ValidateSqlCompareOptions(compareOptions); m_flag = compareOptions; m_cmpInfo = null; if (data == null) { m_fNotNull = false; m_value = null; } else { m_fNotNull = true; m_value = data; } } public SqlString(string data, int lcid) : this(data, lcid, s_iDefaultFlag) { } public SqlString(string data) : this(data, CultureInfo.CurrentCulture.LCID, s_iDefaultFlag) { } private SqlString(int lcid, SqlCompareOptions compareOptions, string data, CompareInfo cmpInfo) { m_lcid = lcid; ValidateSqlCompareOptions(compareOptions); m_flag = compareOptions; if (data == null) { m_fNotNull = false; m_value = null; m_cmpInfo = null; } else { m_value = data; m_cmpInfo = cmpInfo; m_fNotNull = true; } } private void SetCompareInfo() { if (m_cmpInfo == null) { m_cmpInfo = CultureInfo.GetCultureInfo(m_lcid).CompareInfo; } } public static implicit operator SqlString(string x) { return new SqlString(x); } public static explicit operator string(SqlString x) { return x.Value; } public override string ToString() { if (!IsNull) { return m_value; } return SQLResource.NullString; } public byte[] GetUnicodeBytes() { if (IsNull) { return null; } return s_unicodeEncoding.GetBytes(m_value); } public byte[] GetNonUnicodeBytes() { if (IsNull) { return null; } return Encoding.GetEncoding(new CultureInfo(m_lcid).TextInfo.ANSICodePage).GetBytes(m_value); } public static SqlString operator +(SqlString x, SqlString y) { if (x.IsNull || y.IsNull) { return Null; } if (x.m_lcid != y.m_lcid || x.m_flag != y.m_flag) { throw new SqlTypeException(SQLResource.ConcatDiffCollationMessage); } return new SqlString(x.m_lcid, x.m_flag, x.m_value + y.m_value, (x.m_cmpInfo == null) ? y.m_cmpInfo : x.m_cmpInfo); } private static int StringCompare(SqlString x, SqlString y) { if (x.m_lcid != y.m_lcid || x.m_flag != y.m_flag) { throw new SqlTypeException(SQLResource.CompareDiffCollationMessage); } x.SetCompareInfo(); y.SetCompareInfo(); if ((x.m_flag & SqlCompareOptions.BinarySort) != 0) { return CompareBinary(x, y); } if ((x.m_flag & SqlCompareOptions.BinarySort2) != 0) { return CompareBinary2(x, y); } string value = x.m_value; string value2 = y.m_value; int num = value.Length; int num2 = value2.Length; while (num > 0 && value[num - 1] == ' ') { num--; } while (num2 > 0 && value2[num2 - 1] == ' ') { num2--; } CompareOptions options = CompareOptionsFromSqlCompareOptions(x.m_flag); return x.m_cmpInfo.Compare(x.m_value, 0, num, y.m_value, 0, num2, options); } private static SqlBoolean Compare(SqlString x, SqlString y, EComparison ecExpectedResult) { if (x.IsNull || y.IsNull) { return SqlBoolean.Null; } int num = StringCompare(x, y); bool flag = false; switch (ecExpectedResult) { case EComparison.EQ: flag = num == 0; break; case EComparison.LT: flag = num < 0; break; case EComparison.LE: flag = num <= 0; break; case EComparison.GT: flag = num > 0; break; case EComparison.GE: flag = num >= 0; break; default: return SqlBoolean.Null; } return new SqlBoolean(flag); } public static explicit operator SqlString(SqlBoolean x) { if (!x.IsNull) { return new SqlString(x.Value.ToString()); } return Null; } public static explicit operator SqlString(SqlByte x) { if (!x.IsNull) { return new SqlString(x.Value.ToString((IFormatProvider?)null)); } return Null; } public static explicit operator SqlString(SqlInt16 x) { if (!x.IsNull) { return new SqlString(x.Value.ToString((IFormatProvider?)null)); } return Null; } public static explicit operator SqlString(SqlInt32 x) { if (!x.IsNull) { return new SqlString(x.Value.ToString((IFormatProvider?)null)); } return Null; } public static explicit operator SqlString(SqlInt64 x) { if (!x.IsNull) { return new SqlString(x.Value.ToString((IFormatProvider?)null)); } return Null; } public static explicit operator SqlString(SqlSingle x) { if (!x.IsNull) { return new SqlString(x.Value.ToString((IFormatProvider?)null)); } return Null; } public static explicit operator SqlString(SqlDouble x) { if (!x.IsNull) { return new SqlString(x.Value.ToString((IFormatProvider?)null)); } return Null; } public static explicit operator SqlString(SqlDecimal x) { if (!x.IsNull) { return new SqlString(x.ToString()); } return Null; } public static explicit operator SqlString(SqlMoney x) { if (!x.IsNull) { return new SqlString(x.ToString()); } return Null; } public static explicit operator SqlString(SqlDateTime x) { if (!x.IsNull) { return new SqlString(x.ToString()); } return Null; } public static explicit operator SqlString(SqlGuid x) { if (!x.IsNull) { return new SqlString(x.ToString()); } return Null; } public SqlString Clone() { if (IsNull) { return new SqlString(fNull: true); } return new SqlString(m_value, m_lcid, m_flag); } public static SqlBoolean operator ==(SqlString x, SqlString y) { return Compare(x, y, EComparison.EQ); } public static SqlBoolean operator !=(SqlString x, SqlString y) { return !(x == y); } public static SqlBoolean operator <(SqlString x, SqlString y) { return Compare(x, y, EComparison.LT); } public static SqlBoolean operator >(SqlString x, SqlString y) { return Compare(x, y, EComparison.GT); } public static SqlBoolean operator <=(SqlString x, SqlString y) { return Compare(x, y, EComparison.LE); } public static SqlBoolean operator >=(SqlString x, SqlString y) { return Compare(x, y, EComparison.GE); } public static SqlString Concat(SqlString x, SqlString y) { return x + y; } public static SqlString Add(SqlString x, SqlString y) { return x + y; } public static SqlBoolean Equals(SqlString x, SqlString y) { return x == y; } public static SqlBoolean NotEquals(SqlString x, SqlString y) { return x != y; } public static SqlBoolean LessThan(SqlString x, SqlString y) { return x < y; } public static SqlBoolean GreaterThan(SqlString x, SqlString y) { return x > y; } public static SqlBoolean LessThanOrEqual(SqlString x, SqlString y) { return x <= y; } public static SqlBoolean GreaterThanOrEqual(SqlString x, SqlString y) { return x >= y; } public SqlBoolean ToSqlBoolean() { return (SqlBoolean)this; } public SqlByte ToSqlByte() { return (SqlByte)this; } public SqlDateTime ToSqlDateTime() { return (SqlDateTime)this; } public SqlDouble ToSqlDouble() { return (SqlDouble)this; } public SqlInt16 ToSqlInt16() { return (SqlInt16)this; } public SqlInt32 ToSqlInt32() { return (SqlInt32)this; } public SqlInt64 ToSqlInt64() { return (SqlInt64)this; } public SqlMoney ToSqlMoney() { return (SqlMoney)this; } public SqlDecimal ToSqlDecimal() { return (SqlDecimal)this; } public SqlSingle ToSqlSingle() { return (SqlSingle)this; } public SqlGuid ToSqlGuid() { return (SqlGuid)this; } private static void ValidateSqlCompareOptions(SqlCompareOptions compareOptions) { if ((compareOptions & s_iValidSqlCompareOptionMask) != compareOptions) { throw new ArgumentOutOfRangeException("compareOptions"); } } public static CompareOptions CompareOptionsFromSqlCompareOptions(SqlCompareOptions compareOptions) { CompareOptions compareOptions2 = CompareOptions.None; ValidateSqlCompareOptions(compareOptions); if ((compareOptions & (SqlCompareOptions.BinarySort | SqlCompareOptions.BinarySort2)) != 0) { throw ADP.ArgumentOutOfRange("compareOptions"); } if ((compareOptions & SqlCompareOptions.IgnoreCase) != 0) { compareOptions2 |= CompareOptions.IgnoreCase; } if ((compareOptions & SqlCompareOptions.IgnoreNonSpace) != 0) { compareOptions2 |= CompareOptions.IgnoreNonSpace; } if ((compareOptions & SqlCompareOptions.IgnoreKanaType) != 0) { compareOptions2 |= CompareOptions.IgnoreKanaType; } if ((compareOptions & SqlCompareOptions.IgnoreWidth) != 0) { compareOptions2 |= CompareOptions.IgnoreWidth; } return compareOptions2; } private bool FBinarySort() { if (!IsNull) { return (m_flag & (SqlCompareOptions.BinarySort | SqlCompareOptions.BinarySort2)) != 0; } return false; } private static int CompareBinary(SqlString x, SqlString y) { byte[] bytes = s_unicodeEncoding.GetBytes(x.m_value); byte[] bytes2 = s_unicodeEncoding.GetBytes(y.m_value); int num = bytes.Length; int num2 = bytes2.Length; int num3 = ((num < num2) ? num : num2); int i; for (i = 0; i < num3; i++) { if (bytes[i] < bytes2[i]) { return -1; } if (bytes[i] > bytes2[i]) { return 1; } } i = num3; int num4 = 32; if (num < num2) { for (; i < num2; i += 2) { int num5 = bytes2[i + 1] << 8 + bytes2[i]; if (num5 != num4) { if (num4 <= num5) { return -1; } return 1; } } } else { for (; i < num; i += 2) { int num5 = bytes[i + 1] << 8 + bytes[i]; if (num5 != num4) { if (num5 <= num4) { return -1; } return 1; } } } return 0; } private static int CompareBinary2(SqlString x, SqlString y) { string value = x.m_value; string value2 = y.m_value; int length = value.Length; int length2 = value2.Length; int num = ((length < length2) ? length : length2); for (int i = 0; i < num; i++) { if (value[i] < value2[i]) { return -1; } if (value[i] > value2[i]) { return 1; } } char c = ' '; if (length < length2) { for (int i = num; i < length2; i++) { if (value2[i] != c) { if (c <= value2[i]) { return -1; } return 1; } } } else { for (int i = num; i < length; i++) { if (value[i] != c) { if (value[i] <= c) { return -1; } return 1; } } } return 0; } public int CompareTo(object value) { if (value is SqlString value2) { return CompareTo(value2); } throw ADP.WrongType(value.GetType(), typeof(SqlString)); } public int CompareTo(SqlString value) { if (IsNull) { if (!value.IsNull) { return -1; } return 0; } if (value.IsNull) { return 1; } int num = StringCompare(this, value); if (num < 0) { return -1; } if (num > 0) { return 1; } return 0; } public override bool Equals(object value) { if (!(value is SqlString sqlString)) { return false; } if (sqlString.IsNull || IsNull) { if (sqlString.IsNull) { return IsNull; } return false; } return (this == sqlString).Value; } public override int GetHashCode() { if (IsNull) { return 0; } byte[] array; if (FBinarySort()) { array = s_unicodeEncoding.GetBytes(m_value.TrimEnd(Array.Empty())); } else { CompareInfo compareInfo; CompareOptions options; try { SetCompareInfo(); compareInfo = m_cmpInfo; options = CompareOptionsFromSqlCompareOptions(m_flag); } catch (ArgumentException) { compareInfo = CultureInfo.InvariantCulture.CompareInfo; options = CompareOptions.None; } array = compareInfo.GetSortKey(m_value.TrimEnd(Array.Empty()), options).KeyData; } return SqlBinary.HashByteArray(array, array.Length); } XmlSchema IXmlSerializable.GetSchema() { return null; } void IXmlSerializable.ReadXml(XmlReader reader) { string attribute = reader.GetAttribute("nil", "http://www.w3.org/2001/XMLSchema-instance"); if (attribute != null && XmlConvert.ToBoolean(attribute)) { reader.ReadElementString(); m_fNotNull = false; } else { m_value = reader.ReadElementString(); m_fNotNull = true; } } void IXmlSerializable.WriteXml(XmlWriter writer) { if (IsNull) { writer.WriteAttributeString("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance", "true"); } else { writer.WriteString(m_value); } } public static XmlQualifiedName GetXsdType(XmlSchemaSet schemaSet) { return new XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema"); } } internal enum EComparison { LT, LE, EQ, GE, GT, NE } public enum StorageState { Buffer, Stream, UnmanagedBuffer } [Serializable] public class SqlTypeException : SystemException { public SqlTypeException() : this("SqlType error.", null) { } public SqlTypeException(string message) : this(message, null) { } public SqlTypeException(string message, Exception e) : base(message, e) { base.HResult = -2146232016; } protected SqlTypeException(SerializationInfo si, StreamingContext sc) : base(SqlTypeExceptionSerialization(si, sc), sc) { throw new PlatformNotSupportedException(); } private static SerializationInfo SqlTypeExceptionSerialization(SerializationInfo si, StreamingContext sc) { if (si != null && 1 == si.MemberCount) { new SqlTypeException(si.GetString("SqlTypeExceptionMessage")).GetObjectData(si, sc); } return si; } } [Serializable] public sealed class SqlNullValueException : SqlTypeException { public SqlNullValueException() : this(SQLResource.NullValueMessage, null) { } public SqlNullValueException(string message) : this(message, null) { } public SqlNullValueException(string message, Exception e) : base(message, e) { base.HResult = -2146232015; } private static SerializationInfo SqlNullValueExceptionSerialization(SerializationInfo si, StreamingContext sc) { if (si != null && 1 == si.MemberCount) { new SqlNullValueException(si.GetString("SqlNullValueExceptionMessage")).GetObjectData(si, sc); } return si; } } [Serializable] public sealed class SqlTruncateException : SqlTypeException { public SqlTruncateException() : this(SQLResource.TruncationMessage, null) { } public SqlTruncateException(string message) : this(message, null) { } public SqlTruncateException(string message, Exception e) : base(message, e) { base.HResult = -2146232014; } private static SerializationInfo SqlTruncateExceptionSerialization(SerializationInfo si, StreamingContext sc) { if (si != null && 1 == si.MemberCount) { new SqlTruncateException(si.GetString("SqlTruncateExceptionMessage")).GetObjectData(si, sc); } return si; } } [Serializable] public sealed class SqlNotFilledException : SqlTypeException { public SqlNotFilledException() : this(SQLResource.NotFilledMessage, null) { } public SqlNotFilledException(string message) : this(message, null) { } public SqlNotFilledException(string message, Exception e) : base(message, e) { base.HResult = -2146232015; } } [Serializable] public sealed class SqlAlreadyFilledException : SqlTypeException { public SqlAlreadyFilledException() : this(SQLResource.AlreadyFilledMessage, null) { } public SqlAlreadyFilledException(string message) : this(message, null) { } public SqlAlreadyFilledException(string message, Exception e) : base(message, e) { base.HResult = -2146232015; } } internal abstract class SqlStreamChars : INullable, IDisposable { public abstract bool IsNull { get; } public abstract long Length { get; } public abstract long Position { get; set; } public abstract int Read(char[] buffer, int offset, int count); public abstract void Write(char[] buffer, int offset, int count); public abstract long Seek(long offset, SeekOrigin origin); public abstract void SetLength(long value); void IDisposable.Dispose() { Dispose(disposing: true); } protected virtual void Dispose(bool disposing) { } } [Serializable] [XmlSchemaProvider("GetXsdType")] public sealed class SqlXml : INullable, IXmlSerializable { private static readonly Func s_sqlReaderDelegate = CreateSqlReaderDelegate(); private static readonly XmlReaderSettings s_defaultXmlReaderSettings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment }; private static readonly XmlReaderSettings s_defaultXmlReaderSettingsCloseInput = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment, CloseInput = true }; private static MethodInfo s_createSqlReaderMethodInfo; private MethodInfo _createSqlReaderMethodInfo; private bool _fNotNull; private Stream _stream; private bool _firstCreateReader; private static MethodInfo CreateSqlReaderMethodInfo { get { if (s_createSqlReaderMethodInfo == null) { s_createSqlReaderMethodInfo = typeof(XmlReader).GetMethod("CreateSqlReader", BindingFlags.Static | BindingFlags.NonPublic); } return s_createSqlReaderMethodInfo; } } public bool IsNull => !_fNotNull; public string Value { get { if (IsNull) { throw new SqlNullValueException(); } StringWriter stringWriter = new StringWriter((IFormatProvider?)null); XmlWriterSettings xmlWriterSettings = new XmlWriterSettings(); xmlWriterSettings.CloseOutput = false; xmlWriterSettings.ConformanceLevel = ConformanceLevel.Fragment; XmlWriter xmlWriter = XmlWriter.Create(stringWriter, xmlWriterSettings); XmlReader xmlReader = CreateReader(); if (xmlReader.ReadState == ReadState.Initial) { xmlReader.Read(); } while (!xmlReader.EOF) { xmlWriter.WriteNode(xmlReader, defattr: true); } xmlWriter.Flush(); return stringWriter.ToString(); } } public static SqlXml Null => new SqlXml(fNull: true); public SqlXml() { SetNull(); } private SqlXml(bool fNull) { SetNull(); } public SqlXml(XmlReader value) { if (value == null) { SetNull(); return; } _fNotNull = true; _firstCreateReader = true; _stream = CreateMemoryStreamFromXmlReader(value); } public SqlXml(Stream value) { if (value == null) { SetNull(); return; } _firstCreateReader = true; _fNotNull = true; _stream = value; } public XmlReader CreateReader() { if (IsNull) { throw new SqlNullValueException(); } SqlXmlStreamWrapper sqlXmlStreamWrapper = new SqlXmlStreamWrapper(_stream); if ((!_firstCreateReader || sqlXmlStreamWrapper.CanSeek) && sqlXmlStreamWrapper.Position != 0L) { sqlXmlStreamWrapper.Seek(0L, SeekOrigin.Begin); } if (_createSqlReaderMethodInfo == null) { _createSqlReaderMethodInfo = CreateSqlReaderMethodInfo; } XmlReader result = CreateSqlXmlReader(sqlXmlStreamWrapper); _firstCreateReader = false; return result; } internal static XmlReader CreateSqlXmlReader(Stream stream, bool closeInput = false, bool throwTargetInvocationExceptions = false) { XmlReaderSettings arg = (closeInput ? s_defaultXmlReaderSettingsCloseInput : s_defaultXmlReaderSettings); try { return s_sqlReaderDelegate(stream, arg, null); } catch (Exception ex) { if (!throwTargetInvocationExceptions || !ADP.IsCatchableExceptionType(ex)) { throw; } throw new TargetInvocationException(ex); } } private static Func CreateSqlReaderDelegate() { return (Func)CreateSqlReaderMethodInfo.CreateDelegate(typeof(Func)); } private void SetNull() { _fNotNull = false; _stream = null; _firstCreateReader = true; } private Stream CreateMemoryStreamFromXmlReader(XmlReader reader) { XmlWriterSettings xmlWriterSettings = new XmlWriterSettings(); xmlWriterSettings.CloseOutput = false; xmlWriterSettings.ConformanceLevel = ConformanceLevel.Fragment; xmlWriterSettings.Encoding = Encoding.GetEncoding("utf-16"); xmlWriterSettings.OmitXmlDeclaration = true; MemoryStream memoryStream = new MemoryStream(); XmlWriter xmlWriter = XmlWriter.Create(memoryStream, xmlWriterSettings); if (reader.ReadState == ReadState.Closed) { throw new InvalidOperationException(SQLResource.ClosedXmlReaderMessage); } if (reader.ReadState == ReadState.Initial) { reader.Read(); } while (!reader.EOF) { xmlWriter.WriteNode(reader, defattr: true); } xmlWriter.Flush(); memoryStream.Seek(0L, SeekOrigin.Begin); return memoryStream; } XmlSchema IXmlSerializable.GetSchema() { return null; } void IXmlSerializable.ReadXml(XmlReader r) { string attribute = r.GetAttribute("nil", "http://www.w3.org/2001/XMLSchema-instance"); if (attribute != null && XmlConvert.ToBoolean(attribute)) { r.ReadInnerXml(); SetNull(); return; } _fNotNull = true; _firstCreateReader = true; _stream = new MemoryStream(); StreamWriter streamWriter = new StreamWriter(_stream); streamWriter.Write(r.ReadInnerXml()); streamWriter.Flush(); if (_stream.CanSeek) { _stream.Seek(0L, SeekOrigin.Begin); } } void IXmlSerializable.WriteXml(XmlWriter writer) { if (IsNull) { writer.WriteAttributeString("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance", "true"); } else { XmlReader xmlReader = CreateReader(); if (xmlReader.ReadState == ReadState.Initial) { xmlReader.Read(); } while (!xmlReader.EOF) { writer.WriteNode(xmlReader, defattr: true); } } writer.Flush(); } public static XmlQualifiedName GetXsdType(XmlSchemaSet schemaSet) { return new XmlQualifiedName("anyType", "http://www.w3.org/2001/XMLSchema"); } } internal sealed class SqlXmlStreamWrapper : Stream { private Stream _stream; private long _lPosition; private bool _isClosed; public override bool CanRead { get { if (IsStreamClosed()) { return false; } return _stream.CanRead; } } public override bool CanSeek { get { if (IsStreamClosed()) { return false; } return _stream.CanSeek; } } public override bool CanWrite { get { if (IsStreamClosed()) { return false; } return _stream.CanWrite; } } public override long Length { get { ThrowIfStreamClosed("get_Length"); ThrowIfStreamCannotSeek("get_Length"); return _stream.Length; } } public override long Position { get { ThrowIfStreamClosed("get_Position"); ThrowIfStreamCannotSeek("get_Position"); return _lPosition; } set { ThrowIfStreamClosed("set_Position"); ThrowIfStreamCannotSeek("set_Position"); if (value < 0 || value > _stream.Length) { throw new ArgumentOutOfRangeException("value"); } _lPosition = value; } } internal SqlXmlStreamWrapper(Stream stream) { _stream = stream; _lPosition = 0L; _isClosed = false; } public override long Seek(long offset, SeekOrigin origin) { long num = 0L; ThrowIfStreamClosed("Seek"); ThrowIfStreamCannotSeek("Seek"); switch (origin) { case SeekOrigin.Begin: if (offset < 0 || offset > _stream.Length) { throw new ArgumentOutOfRangeException("offset"); } _lPosition = offset; break; case SeekOrigin.Current: num = _lPosition + offset; if (num < 0 || num > _stream.Length) { throw new ArgumentOutOfRangeException("offset"); } _lPosition = num; break; case SeekOrigin.End: num = _stream.Length + offset; if (num < 0 || num > _stream.Length) { throw new ArgumentOutOfRangeException("offset"); } _lPosition = num; break; default: throw ADP.InvalidSeekOrigin("offset"); } return _lPosition; } public override int Read(byte[] buffer, int offset, int count) { ThrowIfStreamClosed("Read"); ThrowIfStreamCannotRead("Read"); if (buffer == null) { throw new ArgumentNullException("buffer"); } if (offset < 0 || offset > buffer.Length) { throw new ArgumentOutOfRangeException("offset"); } if (count < 0 || count > buffer.Length - offset) { throw new ArgumentOutOfRangeException("count"); } if (_stream.CanSeek && _stream.Position != _lPosition) { _stream.Seek(_lPosition, SeekOrigin.Begin); } int num = _stream.Read(buffer, offset, count); _lPosition += num; return num; } public override void Write(byte[] buffer, int offset, int count) { ThrowIfStreamClosed("Write"); ThrowIfStreamCannotWrite("Write"); if (buffer == null) { throw new ArgumentNullException("buffer"); } if (offset < 0 || offset > buffer.Length) { throw new ArgumentOutOfRangeException("offset"); } if (count < 0 || count > buffer.Length - offset) { throw new ArgumentOutOfRangeException("count"); } if (_stream.CanSeek && _stream.Position != _lPosition) { _stream.Seek(_lPosition, SeekOrigin.Begin); } _stream.Write(buffer, offset, count); _lPosition += count; } public override int ReadByte() { ThrowIfStreamClosed("ReadByte"); ThrowIfStreamCannotRead("ReadByte"); if (_stream.CanSeek && _lPosition >= _stream.Length) { return -1; } if (_stream.CanSeek && _stream.Position != _lPosition) { _stream.Seek(_lPosition, SeekOrigin.Begin); } int result = _stream.ReadByte(); _lPosition++; return result; } public override void WriteByte(byte value) { ThrowIfStreamClosed("WriteByte"); ThrowIfStreamCannotWrite("WriteByte"); if (_stream.CanSeek && _stream.Position != _lPosition) { _stream.Seek(_lPosition, SeekOrigin.Begin); } _stream.WriteByte(value); _lPosition++; } public override void SetLength(long value) { ThrowIfStreamClosed("SetLength"); ThrowIfStreamCannotSeek("SetLength"); _stream.SetLength(value); if (_lPosition > value) { _lPosition = value; } } public override void Flush() { if (_stream != null) { _stream.Flush(); } } protected override void Dispose(bool disposing) { try { _isClosed = true; } finally { base.Dispose(disposing); } } private void ThrowIfStreamCannotSeek(string method) { if (!_stream.CanSeek) { throw new NotSupportedException(SQLResource.InvalidOpStreamNonSeekable(method)); } } private void ThrowIfStreamCannotRead(string method) { if (!_stream.CanRead) { throw new NotSupportedException(SQLResource.InvalidOpStreamNonReadable(method)); } } private void ThrowIfStreamCannotWrite(string method) { if (!_stream.CanWrite) { throw new NotSupportedException(SQLResource.InvalidOpStreamNonWritable(method)); } } private void ThrowIfStreamClosed(string method) { if (IsStreamClosed()) { throw new ObjectDisposedException(SQLResource.InvalidOpStreamClosed(method)); } } private bool IsStreamClosed() { if (_isClosed || _stream == null || (!_stream.CanRead && !_stream.CanWrite && !_stream.CanSeek)) { return true; } return false; } } internal static class SqlTypeWorkarounds { private struct SqlMoneyLookalike { internal bool _fNotNull; internal long _value; } [StructLayout(LayoutKind.Explicit)] private struct SqlMoneyCaster { [FieldOffset(0)] internal SqlMoney Real; [FieldOffset(0)] internal SqlMoneyLookalike Fake; } private struct SqlDecimalLookalike { internal byte _bStatus; internal byte _bLen; internal byte _bPrec; internal byte _bScale; internal uint _data1; internal uint _data2; internal uint _data3; internal uint _data4; } [StructLayout(LayoutKind.Explicit)] private struct SqlDecimalCaster { [FieldOffset(0)] internal SqlDecimal Real; [FieldOffset(0)] internal SqlDecimalLookalike Fake; } private struct SqlBinaryLookalike { internal byte[] _value; } [StructLayout(LayoutKind.Explicit)] private struct SqlBinaryCaster { [FieldOffset(0)] internal SqlBinary Real; [FieldOffset(0)] internal SqlBinaryLookalike Fake; } private struct SqlGuidLookalike { internal byte[] _value; } [StructLayout(LayoutKind.Explicit)] private struct SqlGuidCaster { [FieldOffset(0)] internal SqlGuid Real; [FieldOffset(0)] internal SqlGuidLookalike Fake; } private static readonly XmlReaderSettings s_defaultXmlReaderSettings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment }; private static readonly XmlReaderSettings s_defaultXmlReaderSettingsCloseInput = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment, CloseInput = true }; private static readonly XmlReaderSettings s_defaultXmlReaderSettingsAsyncCloseInput = new XmlReaderSettings { Async = true, ConformanceLevel = ConformanceLevel.Fragment, CloseInput = true }; internal const SqlCompareOptions SqlStringValidSqlCompareOptionMask = SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreNonSpace | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth | SqlCompareOptions.BinarySort | SqlCompareOptions.BinarySort2; internal static XmlReader SqlXmlCreateSqlXmlReader(Stream stream, bool closeInput = false, bool async = false) { XmlReaderSettings settings = ((!closeInput) ? s_defaultXmlReaderSettings : (async ? s_defaultXmlReaderSettingsAsyncCloseInput : s_defaultXmlReaderSettingsCloseInput)); return XmlReader.Create(stream, settings); } internal static DateTime SqlDateTimeToDateTime(int daypart, int timepart) { if (daypart < -53690 || daypart > 2958463 || timepart < 0 || timepart > 25919999) { throw new OverflowException(SQLResource.DateTimeOverflowMessage); } long ticks = new DateTime(1900, 1, 1).Ticks; long num = daypart * 864000000000L; long num2 = (long)((double)timepart / 0.3 + 0.5) * 10000; return new DateTime(ticks + num + num2); } internal static SqlMoney SqlMoneyCtor(long value, int ignored) { SqlMoneyCaster sqlMoneyCaster = default(SqlMoneyCaster); sqlMoneyCaster.Fake._fNotNull = true; sqlMoneyCaster.Fake._value = value; return sqlMoneyCaster.Real; } internal static long SqlMoneyToSqlInternalRepresentation(SqlMoney money) { SqlMoneyCaster sqlMoneyCaster = default(SqlMoneyCaster); sqlMoneyCaster.Real = money; if (money.IsNull) { throw new SqlNullValueException(); } return sqlMoneyCaster.Fake._value; } internal static void SqlDecimalExtractData(SqlDecimal d, out uint data1, out uint data2, out uint data3, out uint data4) { SqlDecimalCaster sqlDecimalCaster = default(SqlDecimalCaster); sqlDecimalCaster.Real = d; data1 = sqlDecimalCaster.Fake._data1; data2 = sqlDecimalCaster.Fake._data2; data3 = sqlDecimalCaster.Fake._data3; data4 = sqlDecimalCaster.Fake._data4; } internal static SqlBinary SqlBinaryCtor(byte[] value, bool ignored) { SqlBinaryCaster sqlBinaryCaster = default(SqlBinaryCaster); sqlBinaryCaster.Fake._value = value; return sqlBinaryCaster.Real; } internal static SqlGuid SqlGuidCtor(byte[] value, bool ignored) { SqlGuidCaster sqlGuidCaster = default(SqlGuidCaster); sqlGuidCaster.Fake._value = value; return sqlGuidCaster.Real; } } } namespace System.Data.ProviderBase { internal class BasicFieldNameLookup { private Dictionary _fieldNameLookup; private readonly string[] _fieldNames; private CompareInfo _compareInfo; public BasicFieldNameLookup(string[] fieldNames) { if (fieldNames == null) { throw ADP.ArgumentNull("fieldNames"); } _fieldNames = fieldNames; } public BasicFieldNameLookup(ReadOnlyCollection columnNames) { int count = columnNames.Count; string[] array = new string[count]; for (int i = 0; i < count; i++) { array[i] = columnNames[i]; } _fieldNames = array; GenerateLookup(); } public BasicFieldNameLookup(IDataReader reader) { int fieldCount = reader.FieldCount; string[] array = new string[fieldCount]; for (int i = 0; i < fieldCount; i++) { array[i] = reader.GetName(i); } _fieldNames = array; } public int GetOrdinal(string fieldName) { if (fieldName == null) { throw ADP.ArgumentNull("fieldName"); } int num = IndexOf(fieldName); if (-1 == num) { throw ADP.IndexOutOfRange(fieldName); } return num; } public int IndexOfName(string fieldName) { if (_fieldNameLookup == null) { GenerateLookup(); } if (!_fieldNameLookup.TryGetValue(fieldName, out var value)) { return -1; } return value; } public int IndexOf(string fieldName) { if (_fieldNameLookup == null) { GenerateLookup(); } if (!_fieldNameLookup.TryGetValue(fieldName, out var value)) { value = LinearIndexOf(fieldName, CompareOptions.IgnoreCase); if (-1 == value) { value = LinearIndexOf(fieldName, CompareOptions.IgnoreCase | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth); } } return value; } protected virtual CompareInfo GetCompareInfo() { return CultureInfo.InvariantCulture.CompareInfo; } private int LinearIndexOf(string fieldName, CompareOptions compareOptions) { if (_compareInfo == null) { _compareInfo = GetCompareInfo(); } int num = _fieldNames.Length; for (int i = 0; i < num; i++) { if (_compareInfo.Compare(fieldName, _fieldNames[i], compareOptions) == 0) { _fieldNameLookup[fieldName] = i; return i; } } return -1; } private void GenerateLookup() { int num = _fieldNames.Length; Dictionary dictionary = new Dictionary(num); int num2 = num - 1; while (0 <= num2) { string key = _fieldNames[num2]; dictionary[key] = num2; num2--; } _fieldNameLookup = dictionary; } } internal sealed class FieldNameLookup : BasicFieldNameLookup { private readonly int _defaultLocaleID; public FieldNameLookup(string[] fieldNames, int defaultLocaleID) : base(fieldNames) { _defaultLocaleID = defaultLocaleID; } public FieldNameLookup(ReadOnlyCollection columnNames, int defaultLocaleID) : base(columnNames) { _defaultLocaleID = defaultLocaleID; } public FieldNameLookup(IDataReader reader, int defaultLocaleID) : base(reader) { _defaultLocaleID = defaultLocaleID; } protected override CompareInfo GetCompareInfo() { CompareInfo compareInfo = null; if (-1 != _defaultLocaleID) { compareInfo = CompareInfo.GetCompareInfo(_defaultLocaleID); } if (compareInfo == null) { compareInfo = base.GetCompareInfo(); } return compareInfo; } } internal abstract class DataReaderContainer { private sealed class ProviderSpecificDataReader : DataReaderContainer { private DbDataReader _providerSpecificDataReader; internal override bool ReturnProviderSpecificTypes => true; protected override int VisibleFieldCount { get { int visibleFieldCount = _providerSpecificDataReader.VisibleFieldCount; if (0 > visibleFieldCount) { return 0; } return visibleFieldCount; } } internal ProviderSpecificDataReader(IDataReader dataReader, DbDataReader dbDataReader) : base(dataReader) { _providerSpecificDataReader = dbDataReader; _fieldCount = VisibleFieldCount; } internal override Type GetFieldType(int ordinal) { return _providerSpecificDataReader.GetProviderSpecificFieldType(ordinal); } internal override object GetValue(int ordinal) { return _providerSpecificDataReader.GetProviderSpecificValue(ordinal); } internal override int GetValues(object[] values) { return _providerSpecificDataReader.GetProviderSpecificValues(values); } } private sealed class CommonLanguageSubsetDataReader : DataReaderContainer { internal override bool ReturnProviderSpecificTypes => false; protected override int VisibleFieldCount { get { int fieldCount = _dataReader.FieldCount; if (0 > fieldCount) { return 0; } return fieldCount; } } internal CommonLanguageSubsetDataReader(IDataReader dataReader) : base(dataReader) { _fieldCount = VisibleFieldCount; } internal override Type GetFieldType(int ordinal) { return _dataReader.GetFieldType(ordinal); } internal override object GetValue(int ordinal) { return _dataReader.GetValue(ordinal); } internal override int GetValues(object[] values) { return _dataReader.GetValues(values); } } protected readonly IDataReader _dataReader; protected int _fieldCount; internal int FieldCount => _fieldCount; internal abstract bool ReturnProviderSpecificTypes { get; } protected abstract int VisibleFieldCount { get; } internal static DataReaderContainer Create(IDataReader dataReader, bool returnProviderSpecificTypes) { if (returnProviderSpecificTypes && dataReader is DbDataReader dbDataReader) { return new ProviderSpecificDataReader(dataReader, dbDataReader); } return new CommonLanguageSubsetDataReader(dataReader); } protected DataReaderContainer(IDataReader dataReader) { _dataReader = dataReader; } internal abstract Type GetFieldType(int ordinal); internal abstract object GetValue(int ordinal); internal abstract int GetValues(object[] values); internal string GetName(int ordinal) { string name = _dataReader.GetName(ordinal); if (name == null) { return ""; } return name; } internal DataTable GetSchemaTable() { return _dataReader.GetSchemaTable(); } internal bool NextResult() { _fieldCount = 0; if (_dataReader.NextResult()) { _fieldCount = VisibleFieldCount; return true; } return false; } internal bool Read() { return _dataReader.Read(); } } internal sealed class SchemaMapping { private const int MapExactMatch = 0; private const int MapDifferentSize = 1; private const int MapReorderedValues = 2; private const int MapChapters = 3; private const int MapChaptersReordered = 4; private const int SqlXml = 1; private const int XmlDocument = 2; private readonly DataSet _dataSet; private DataTable _dataTable; private readonly DataAdapter _adapter; private readonly DataReaderContainer _dataReader; private readonly DataTable _schemaTable; private readonly DataTableMapping _tableMapping; private readonly string[] _fieldNames; private readonly object[] _readerDataValues; private object[] _mappedDataValues; private int[] _indexMap; private bool[] _chapterMap; private int[] _xmlMap; private int _mappedMode; private int _mappedLength; private readonly LoadOption _loadOption; internal DataReaderContainer DataReader => _dataReader; internal DataTable DataTable => _dataTable; internal object[] DataValues => _readerDataValues; internal SchemaMapping(DataAdapter adapter, DataSet dataset, DataTable datatable, DataReaderContainer dataReader, bool keyInfo, SchemaType schemaType, string sourceTableName, bool gettingData, DataColumn parentChapterColumn, object parentChapterValue) { _dataSet = dataset; _dataTable = datatable; _adapter = adapter; _dataReader = dataReader; if (keyInfo) { _schemaTable = dataReader.GetSchemaTable(); } if (adapter.ShouldSerializeFillLoadOption()) { _loadOption = adapter.FillLoadOption; } else if (adapter.AcceptChangesDuringFill) { _loadOption = (LoadOption)4; } else { _loadOption = (LoadOption)5; } MissingMappingAction missingMappingAction; MissingSchemaAction schemaAction; if (SchemaType.Mapped == schemaType) { missingMappingAction = _adapter.MissingMappingAction; schemaAction = _adapter.MissingSchemaAction; if (!string.IsNullOrEmpty(sourceTableName)) { _tableMapping = _adapter.GetTableMappingBySchemaAction(sourceTableName, sourceTableName, missingMappingAction); } else if (_dataTable != null) { int num = _adapter.IndexOfDataSetTable(_dataTable.TableName); if (-1 != num) { _tableMapping = _adapter.TableMappings[num]; } else { switch (missingMappingAction) { case MissingMappingAction.Passthrough: _tableMapping = new DataTableMapping(_dataTable.TableName, _dataTable.TableName); break; case MissingMappingAction.Ignore: _tableMapping = null; break; case MissingMappingAction.Error: throw ADP.MissingTableMappingDestination(_dataTable.TableName); default: throw ADP.InvalidMissingMappingAction(missingMappingAction); } } } } else { if (SchemaType.Source != schemaType) { throw ADP.InvalidSchemaType(schemaType); } missingMappingAction = MissingMappingAction.Passthrough; schemaAction = MissingSchemaAction.Add; if (!string.IsNullOrEmpty(sourceTableName)) { _tableMapping = DataTableMappingCollection.GetTableMappingBySchemaAction(null, sourceTableName, sourceTableName, missingMappingAction); } else if (_dataTable != null) { int num2 = _adapter.IndexOfDataSetTable(_dataTable.TableName); if (-1 != num2) { _tableMapping = _adapter.TableMappings[num2]; } else { _tableMapping = new DataTableMapping(_dataTable.TableName, _dataTable.TableName); } } } if (_tableMapping == null) { return; } if (_dataTable == null) { _dataTable = _tableMapping.GetDataTableBySchemaAction(_dataSet, schemaAction); } if (_dataTable != null) { _fieldNames = GenerateFieldNames(dataReader); if (_schemaTable == null) { _readerDataValues = SetupSchemaWithoutKeyInfo(missingMappingAction, schemaAction, gettingData, parentChapterColumn, parentChapterValue); } else { _readerDataValues = SetupSchemaWithKeyInfo(missingMappingAction, schemaAction, gettingData, parentChapterColumn, parentChapterValue); } } } internal void ApplyToDataRow(DataRow dataRow) { DataColumnCollection columns = dataRow.Table.Columns; _dataReader.GetValues(_readerDataValues); object[] mappedValues = GetMappedValues(); bool[] array = new bool[mappedValues.Length]; for (int i = 0; i < array.Length; i++) { array[i] = columns[i].ReadOnly; } try { try { for (int j = 0; j < array.Length; j++) { if (columns[j].Expression.Length == 0) { columns[j].ReadOnly = false; } } for (int k = 0; k < mappedValues.Length; k++) { if (mappedValues[k] != null) { dataRow[k] = mappedValues[k]; } } } finally { for (int l = 0; l < array.Length; l++) { if (columns[l].Expression.Length == 0) { columns[l].ReadOnly = array[l]; } } } } finally { if (_chapterMap != null) { FreeDataRowChapters(); } } } private void MappedChapterIndex() { int mappedLength = _mappedLength; for (int i = 0; i < mappedLength; i++) { int num = _indexMap[i]; if (0 <= num) { _mappedDataValues[num] = _readerDataValues[i]; if (_chapterMap[i]) { _mappedDataValues[num] = null; } } } } private void MappedChapter() { int mappedLength = _mappedLength; for (int i = 0; i < mappedLength; i++) { _mappedDataValues[i] = _readerDataValues[i]; if (_chapterMap[i]) { _mappedDataValues[i] = null; } } } private void MappedIndex() { int mappedLength = _mappedLength; for (int i = 0; i < mappedLength; i++) { int num = _indexMap[i]; if (0 <= num) { _mappedDataValues[num] = _readerDataValues[i]; } } } private void MappedValues() { int mappedLength = _mappedLength; for (int i = 0; i < mappedLength; i++) { _mappedDataValues[i] = _readerDataValues[i]; } } private object[] GetMappedValues() { if (_xmlMap != null) { for (int i = 0; i < _xmlMap.Length; i++) { if (_xmlMap[i] == 0) { continue; } string text = _readerDataValues[i] as string; if (text == null && _readerDataValues[i] is SqlString) { SqlString sqlString = (SqlString)_readerDataValues[i]; if (!sqlString.IsNull) { text = sqlString.Value; } else { int num = _xmlMap[i]; if (num == 1) { _readerDataValues[i] = System.Data.SqlTypes.SqlXml.Null; } else { _readerDataValues[i] = DBNull.Value; } } } if (text != null) { switch (_xmlMap[i]) { case 1: { XmlReaderSettings xmlReaderSettings = new XmlReaderSettings(); xmlReaderSettings.ConformanceLevel = ConformanceLevel.Fragment; XmlReader value = XmlReader.Create((TextReader)new StringReader(text), xmlReaderSettings, (string?)null); _readerDataValues[i] = new SqlXml(value); break; } case 2: { XmlDocument xmlDocument = new XmlDocument(); xmlDocument.LoadXml(text); _readerDataValues[i] = xmlDocument; break; } } } } } switch (_mappedMode) { default: return _readerDataValues; case 1: MappedValues(); break; case 2: MappedIndex(); break; case 3: MappedChapter(); break; case 4: MappedChapterIndex(); break; } return _mappedDataValues; } internal void LoadDataRowWithClear() { for (int i = 0; i < _readerDataValues.Length; i++) { _readerDataValues[i] = null; } LoadDataRow(); } internal void LoadDataRow() { try { _dataReader.GetValues(_readerDataValues); object[] mappedValues = GetMappedValues(); DataRow dataRow; switch (_loadOption) { case LoadOption.OverwriteChanges: case LoadOption.PreserveChanges: case LoadOption.Upsert: dataRow = _dataTable.LoadDataRow(mappedValues, _loadOption); break; case (LoadOption)4: dataRow = _dataTable.LoadDataRow(mappedValues, fAcceptChanges: true); break; case (LoadOption)5: dataRow = _dataTable.LoadDataRow(mappedValues, fAcceptChanges: false); break; default: throw ADP.InvalidLoadOption(_loadOption); } if (_chapterMap != null && _dataSet != null) { LoadDataRowChapters(dataRow); } } finally { if (_chapterMap != null) { FreeDataRowChapters(); } } } private void FreeDataRowChapters() { for (int i = 0; i < _chapterMap.Length; i++) { if (_chapterMap[i] && _readerDataValues[i] is IDisposable disposable) { _readerDataValues[i] = null; disposable.Dispose(); } } } internal int LoadDataRowChapters(DataRow dataRow) { int num = 0; int num2 = _chapterMap.Length; for (int i = 0; i < num2; i++) { if (!_chapterMap[i]) { continue; } object obj = _readerDataValues[i]; if (obj == null || Convert.IsDBNull(obj)) { continue; } _readerDataValues[i] = null; using IDataReader dataReader = (IDataReader)obj; if (!dataReader.IsClosed) { DataColumn dataColumn; object parentChapterValue; if (_indexMap == null) { dataColumn = _dataTable.Columns[i]; parentChapterValue = dataRow[dataColumn]; } else { dataColumn = _dataTable.Columns[_indexMap[i]]; parentChapterValue = dataRow[dataColumn]; } string srcTable = _tableMapping.SourceTable + _fieldNames[i]; DataReaderContainer dataReader2 = DataReaderContainer.Create(dataReader, _dataReader.ReturnProviderSpecificTypes); num += _adapter.FillFromReader(_dataSet, null, srcTable, dataReader2, 0, 0, dataColumn, parentChapterValue); } } return num; } private int[] CreateIndexMap(int count, int index) { int[] array = new int[count]; for (int i = 0; i < index; i++) { array[i] = i; } return array; } private static string[] GenerateFieldNames(DataReaderContainer dataReader) { string[] array = new string[dataReader.FieldCount]; for (int i = 0; i < array.Length; i++) { array[i] = dataReader.GetName(i); } ADP.BuildSchemaTableInfoTableNames(array); return array; } private DataColumn[] ResizeColumnArray(DataColumn[] rgcol, int len) { DataColumn[] array = new DataColumn[len]; Array.Copy(rgcol, 0, array, 0, len); return array; } private void AddItemToAllowRollback(ref List items, object value) { if (items == null) { items = new List(); } items.Add(value); } private void RollbackAddedItems(List items) { if (items == null) { return; } int num = items.Count - 1; while (0 <= num) { if (items[num] != null) { if (items[num] is DataColumn dataColumn) { if (dataColumn.Table != null) { dataColumn.Table.Columns.Remove(dataColumn); } } else if (items[num] is DataTable dataTable && dataTable.DataSet != null) { dataTable.DataSet.Tables.Remove(dataTable); } } num--; } } private object[] SetupSchemaWithoutKeyInfo(MissingMappingAction mappingAction, MissingSchemaAction schemaAction, bool gettingData, DataColumn parentChapterColumn, object chapterValue) { int[] array = null; bool[] array2 = null; int num = 0; int fieldCount = _dataReader.FieldCount; object[] result = null; List items = null; try { DataColumnCollection columns = _dataTable.Columns; columns.EnsureAdditionalCapacity(fieldCount + ((chapterValue != null) ? 1 : 0)); bool flag = _dataTable.Columns.Count == 0 && (_tableMapping.ColumnMappings == null || _tableMapping.ColumnMappings.Count == 0) && mappingAction == MissingMappingAction.Passthrough; for (int i = 0; i < fieldCount; i++) { bool flag2 = false; Type type = _dataReader.GetFieldType(i); if (null == type) { throw ADP.MissingDataReaderFieldType(i); } if (typeof(IDataReader).IsAssignableFrom(type)) { if (array2 == null) { array2 = new bool[fieldCount]; } flag2 = (array2[i] = true); type = typeof(int); } else if (typeof(SqlXml).IsAssignableFrom(type)) { if (_xmlMap == null) { _xmlMap = new int[fieldCount]; } _xmlMap[i] = 1; } else if (typeof(XmlReader).IsAssignableFrom(type)) { type = typeof(string); if (_xmlMap == null) { _xmlMap = new int[fieldCount]; } _xmlMap[i] = 2; } DataColumn dataColumn = ((!flag) ? _tableMapping.GetDataColumn(_fieldNames[i], type, _dataTable, mappingAction, schemaAction) : DataColumnMapping.CreateDataColumnBySchemaAction(_fieldNames[i], _fieldNames[i], _dataTable, type, schemaAction)); if (dataColumn == null) { if (array == null) { array = CreateIndexMap(fieldCount, i); } array[i] = -1; continue; } if (_xmlMap != null && _xmlMap[i] != 0) { if (typeof(SqlXml) == dataColumn.DataType) { _xmlMap[i] = 1; } else if (typeof(XmlDocument) == dataColumn.DataType) { _xmlMap[i] = 2; } else { _xmlMap[i] = 0; int num2 = 0; for (int j = 0; j < _xmlMap.Length; j++) { num2 += _xmlMap[j]; } if (num2 == 0) { _xmlMap = null; } } } if (dataColumn.Table == null) { if (flag2) { dataColumn.AllowDBNull = false; dataColumn.AutoIncrement = true; dataColumn.ReadOnly = true; } AddItemToAllowRollback(ref items, dataColumn); columns.Add(dataColumn); } else if (flag2 && !dataColumn.AutoIncrement) { throw ADP.FillChapterAutoIncrement(); } if (array != null) { array[i] = dataColumn.Ordinal; } else if (i != dataColumn.Ordinal) { array = CreateIndexMap(fieldCount, i); array[i] = dataColumn.Ordinal; } num++; } bool flag3 = false; DataColumn dataColumn2 = null; if (chapterValue != null) { Type type2 = chapterValue.GetType(); dataColumn2 = _tableMapping.GetDataColumn(_tableMapping.SourceTable, type2, _dataTable, mappingAction, schemaAction); if (dataColumn2 != null) { if (dataColumn2.Table == null) { AddItemToAllowRollback(ref items, dataColumn2); columns.Add(dataColumn2); flag3 = parentChapterColumn != null; } num++; } } if (0 < num) { if (_dataSet != null && _dataTable.DataSet == null) { AddItemToAllowRollback(ref items, _dataTable); _dataSet.Tables.Add(_dataTable); } if (gettingData) { if (columns == null) { columns = _dataTable.Columns; } _indexMap = array; _chapterMap = array2; result = SetupMapping(fieldCount, columns, dataColumn2, chapterValue); } else { _mappedMode = -1; } } else { _dataTable = null; } if (flag3) { AddRelation(parentChapterColumn, dataColumn2); } } catch (Exception e) when (ADP.IsCatchableOrSecurityExceptionType(e)) { RollbackAddedItems(items); throw; } return result; } private object[] SetupSchemaWithKeyInfo(MissingMappingAction mappingAction, MissingSchemaAction schemaAction, bool gettingData, DataColumn parentChapterColumn, object chapterValue) { DbSchemaRow[] sortedSchemaRows = DbSchemaRow.GetSortedSchemaRows(_schemaTable, _dataReader.ReturnProviderSpecificTypes); if (sortedSchemaRows.Length == 0) { _dataTable = null; return null; } bool flag = (_dataTable.PrimaryKey.Length == 0 && ((LoadOption)4 <= _loadOption || _dataTable.Rows.Count == 0)) || _dataTable.Columns.Count == 0; DataColumn[] array = null; int num = 0; bool flag2 = true; string text = null; string text2 = null; bool flag3 = false; bool flag4 = false; int[] array2 = null; bool[] array3 = null; int num2 = 0; object[] result = null; List items = null; DataColumnCollection columns = _dataTable.Columns; try { for (int i = 0; i < sortedSchemaRows.Length; i++) { DbSchemaRow dbSchemaRow = sortedSchemaRows[i]; int unsortedIndex = dbSchemaRow.UnsortedIndex; bool flag5 = false; Type type = dbSchemaRow.DataType; if (null == type) { type = _dataReader.GetFieldType(i); } if (null == type) { throw ADP.MissingDataReaderFieldType(i); } if (typeof(IDataReader).IsAssignableFrom(type)) { if (array3 == null) { array3 = new bool[sortedSchemaRows.Length]; } flag5 = (array3[unsortedIndex] = true); type = typeof(int); } else if (typeof(SqlXml).IsAssignableFrom(type)) { if (_xmlMap == null) { _xmlMap = new int[sortedSchemaRows.Length]; } _xmlMap[i] = 1; } else if (typeof(XmlReader).IsAssignableFrom(type)) { type = typeof(string); if (_xmlMap == null) { _xmlMap = new int[sortedSchemaRows.Length]; } _xmlMap[i] = 2; } DataColumn dataColumn = null; if (!dbSchemaRow.IsHidden) { dataColumn = _tableMapping.GetDataColumn(_fieldNames[i], type, _dataTable, mappingAction, schemaAction); } string baseTableName = dbSchemaRow.BaseTableName; if (dataColumn == null) { if (array2 == null) { array2 = CreateIndexMap(sortedSchemaRows.Length, unsortedIndex); } array2[unsortedIndex] = -1; if (dbSchemaRow.IsKey && (flag3 || dbSchemaRow.BaseTableName == text)) { flag = false; array = null; } continue; } if (_xmlMap != null && _xmlMap[i] != 0) { if (typeof(SqlXml) == dataColumn.DataType) { _xmlMap[i] = 1; } else if (typeof(XmlDocument) == dataColumn.DataType) { _xmlMap[i] = 2; } else { _xmlMap[i] = 0; int num3 = 0; for (int j = 0; j < _xmlMap.Length; j++) { num3 += _xmlMap[j]; } if (num3 == 0) { _xmlMap = null; } } } if (dbSchemaRow.IsKey && baseTableName != text) { if (text == null) { text = baseTableName; } else { flag3 = true; } } if (flag5) { if (dataColumn.Table == null) { dataColumn.AllowDBNull = false; dataColumn.AutoIncrement = true; dataColumn.ReadOnly = true; } else if (!dataColumn.AutoIncrement) { throw ADP.FillChapterAutoIncrement(); } } else { if (!flag4 && baseTableName != text2 && !string.IsNullOrEmpty(baseTableName)) { if (text2 == null) { text2 = baseTableName; } else { flag4 = true; } } if ((LoadOption)4 <= _loadOption) { if (dbSchemaRow.IsAutoIncrement && DataColumn.IsAutoIncrementType(type)) { dataColumn.AutoIncrement = true; if (!dbSchemaRow.AllowDBNull) { dataColumn.AllowDBNull = false; } } if (type == typeof(string)) { dataColumn.MaxLength = ((dbSchemaRow.Size > 0) ? dbSchemaRow.Size : (-1)); } if (dbSchemaRow.IsReadOnly) { dataColumn.ReadOnly = true; } if (!dbSchemaRow.AllowDBNull && (!dbSchemaRow.IsReadOnly || dbSchemaRow.IsKey)) { dataColumn.AllowDBNull = false; } if (dbSchemaRow.IsUnique && !dbSchemaRow.IsKey && !type.IsArray) { dataColumn.Unique = true; if (!dbSchemaRow.AllowDBNull) { dataColumn.AllowDBNull = false; } } } else if (dataColumn.Table == null) { dataColumn.AutoIncrement = dbSchemaRow.IsAutoIncrement; dataColumn.AllowDBNull = dbSchemaRow.AllowDBNull; dataColumn.ReadOnly = dbSchemaRow.IsReadOnly; dataColumn.Unique = dbSchemaRow.IsUnique; if (type == typeof(string) || type == typeof(SqlString)) { dataColumn.MaxLength = dbSchemaRow.Size; } } } if (dataColumn.Table == null) { if ((LoadOption)4 > _loadOption) { AddAdditionalProperties(dataColumn, dbSchemaRow.DataRow); } AddItemToAllowRollback(ref items, dataColumn); columns.Add(dataColumn); } if (flag && dbSchemaRow.IsKey) { if (array == null) { array = new DataColumn[sortedSchemaRows.Length]; } array[num++] = dataColumn; if (flag2 && dataColumn.AllowDBNull) { flag2 = false; } } if (array2 != null) { array2[unsortedIndex] = dataColumn.Ordinal; } else if (unsortedIndex != dataColumn.Ordinal) { array2 = CreateIndexMap(sortedSchemaRows.Length, unsortedIndex); array2[unsortedIndex] = dataColumn.Ordinal; } num2++; } bool flag6 = false; DataColumn dataColumn2 = null; if (chapterValue != null) { Type type2 = chapterValue.GetType(); dataColumn2 = _tableMapping.GetDataColumn(_tableMapping.SourceTable, type2, _dataTable, mappingAction, schemaAction); if (dataColumn2 != null) { if (dataColumn2.Table == null) { dataColumn2.ReadOnly = true; dataColumn2.AllowDBNull = false; AddItemToAllowRollback(ref items, dataColumn2); columns.Add(dataColumn2); flag6 = parentChapterColumn != null; } num2++; } } if (0 < num2) { if (_dataSet != null && _dataTable.DataSet == null) { AddItemToAllowRollback(ref items, _dataTable); _dataSet.Tables.Add(_dataTable); } if (flag && array != null) { if (num < array.Length) { array = ResizeColumnArray(array, num); } if (flag2) { _dataTable.PrimaryKey = array; } else { UniqueConstraint uniqueConstraint = new UniqueConstraint("", array); ConstraintCollection constraints = _dataTable.Constraints; int count = constraints.Count; for (int k = 0; k < count; k++) { if (uniqueConstraint.Equals(constraints[k])) { uniqueConstraint = null; break; } } if (uniqueConstraint != null) { constraints.Add(uniqueConstraint); } } } if (!flag4 && !string.IsNullOrEmpty(text2) && string.IsNullOrEmpty(_dataTable.TableName)) { _dataTable.TableName = text2; } if (gettingData) { _indexMap = array2; _chapterMap = array3; result = SetupMapping(sortedSchemaRows.Length, columns, dataColumn2, chapterValue); } else { _mappedMode = -1; } } else { _dataTable = null; } if (flag6) { AddRelation(parentChapterColumn, dataColumn2); } } catch (Exception e) when (ADP.IsCatchableOrSecurityExceptionType(e)) { RollbackAddedItems(items); throw; } return result; } private void AddAdditionalProperties(DataColumn targetColumn, DataRow schemaRow) { DataColumnCollection columns = schemaRow.Table.Columns; DataColumn dataColumn = columns[SchemaTableOptionalColumn.DefaultValue]; if (dataColumn != null) { targetColumn.DefaultValue = schemaRow[dataColumn]; } dataColumn = columns[SchemaTableOptionalColumn.AutoIncrementSeed]; if (dataColumn != null) { object obj = schemaRow[dataColumn]; if (DBNull.Value != obj) { targetColumn.AutoIncrementSeed = ((IConvertible)obj).ToInt64(CultureInfo.InvariantCulture); } } dataColumn = columns[SchemaTableOptionalColumn.AutoIncrementStep]; if (dataColumn != null) { object obj2 = schemaRow[dataColumn]; if (DBNull.Value != obj2) { targetColumn.AutoIncrementStep = ((IConvertible)obj2).ToInt64(CultureInfo.InvariantCulture); } } dataColumn = columns[SchemaTableOptionalColumn.ColumnMapping]; if (dataColumn != null) { object obj3 = schemaRow[dataColumn]; if (DBNull.Value != obj3) { targetColumn.ColumnMapping = (MappingType)((IConvertible)obj3).ToInt32(CultureInfo.InvariantCulture); } } dataColumn = columns[SchemaTableOptionalColumn.BaseColumnNamespace]; if (dataColumn != null) { object obj4 = schemaRow[dataColumn]; if (DBNull.Value != obj4) { targetColumn.Namespace = ((IConvertible)obj4).ToString(CultureInfo.InvariantCulture); } } dataColumn = columns[SchemaTableOptionalColumn.Expression]; if (dataColumn != null) { object obj5 = schemaRow[dataColumn]; if (DBNull.Value != obj5) { targetColumn.Expression = ((IConvertible)obj5).ToString(CultureInfo.InvariantCulture); } } } private void AddRelation(DataColumn parentChapterColumn, DataColumn chapterColumn) { if (_dataSet != null) { string columnName = chapterColumn.ColumnName; DataRelation dataRelation = new DataRelation(columnName, new DataColumn[1] { parentChapterColumn }, new DataColumn[1] { chapterColumn }, createConstraints: false); int num = 1; string relationName = columnName; DataRelationCollection relations = _dataSet.Relations; while (-1 != relations.IndexOf(relationName)) { relationName = columnName + num; num++; } dataRelation.RelationName = relationName; relations.Add(dataRelation); } } private object[] SetupMapping(int count, DataColumnCollection columnCollection, DataColumn chapterColumn, object chapterValue) { object[] result = new object[count]; if (_indexMap == null) { int count2 = columnCollection.Count; bool flag = _chapterMap != null; if (count != count2 || flag) { _mappedDataValues = new object[count2]; if (flag) { _mappedMode = 3; _mappedLength = count; } else { _mappedMode = 1; _mappedLength = Math.Min(count, count2); } } else { _mappedMode = 0; } } else { _mappedDataValues = new object[columnCollection.Count]; _mappedMode = ((_chapterMap == null) ? 2 : 4); _mappedLength = count; } if (chapterColumn != null) { _mappedDataValues[chapterColumn.Ordinal] = chapterValue; } return result; } } internal abstract class DbBuffer : SafeHandle { private readonly int _bufferLength; private int BaseOffset => 0; public override bool IsInvalid => IntPtr.Zero == handle; internal int Length => _bufferLength; protected DbBuffer(int initialSize) : base(IntPtr.Zero, ownsHandle: true) { if (0 < initialSize) { _bufferLength = initialSize; RuntimeHelpers.PrepareConstrainedRegions(); try { } finally { handle = SafeNativeMethods.LocalAlloc((IntPtr)initialSize); } if (IntPtr.Zero == handle) { throw new OutOfMemoryException(); } } } protected DbBuffer(IntPtr invalidHandleValue, bool ownsHandle) : base(invalidHandleValue, ownsHandle) { } internal string PtrToStringUni(int offset) { offset += BaseOffset; Validate(offset, 2); string text = null; bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { DangerousAddRef(ref success); text = Marshal.PtrToStringUni(ADP.IntPtrOffset(DangerousGetHandle(), offset)); Validate(offset, 2 * (text.Length + 1)); return text; } finally { if (success) { DangerousRelease(); } } } internal string PtrToStringUni(int offset, int length) { offset += BaseOffset; Validate(offset, 2 * length); string text = null; bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { DangerousAddRef(ref success); return Marshal.PtrToStringUni(ADP.IntPtrOffset(DangerousGetHandle(), offset), length); } finally { if (success) { DangerousRelease(); } } } internal byte ReadByte(int offset) { offset += BaseOffset; bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { DangerousAddRef(ref success); return Marshal.ReadByte(DangerousGetHandle(), offset); } finally { if (success) { DangerousRelease(); } } } internal byte[] ReadBytes(int offset, int length) { byte[] destination = new byte[length]; return ReadBytes(offset, destination, 0, length); } internal byte[] ReadBytes(int offset, byte[] destination, int startIndex, int length) { offset += BaseOffset; Validate(offset, length); bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { DangerousAddRef(ref success); Marshal.Copy(ADP.IntPtrOffset(DangerousGetHandle(), offset), destination, startIndex, length); return destination; } finally { if (success) { DangerousRelease(); } } } internal char ReadChar(int offset) { return (char)ReadInt16(offset); } internal char[] ReadChars(int offset, char[] destination, int startIndex, int length) { offset += BaseOffset; Validate(offset, 2 * length); bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { DangerousAddRef(ref success); Marshal.Copy(ADP.IntPtrOffset(DangerousGetHandle(), offset), destination, startIndex, length); return destination; } finally { if (success) { DangerousRelease(); } } } internal double ReadDouble(int offset) { return BitConverter.Int64BitsToDouble(ReadInt64(offset)); } internal short ReadInt16(int offset) { offset += BaseOffset; bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { DangerousAddRef(ref success); return Marshal.ReadInt16(DangerousGetHandle(), offset); } finally { if (success) { DangerousRelease(); } } } internal void ReadInt16Array(int offset, short[] destination, int startIndex, int length) { offset += BaseOffset; Validate(offset, 2 * length); bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { DangerousAddRef(ref success); Marshal.Copy(ADP.IntPtrOffset(DangerousGetHandle(), offset), destination, startIndex, length); } finally { if (success) { DangerousRelease(); } } } internal int ReadInt32(int offset) { offset += BaseOffset; bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { DangerousAddRef(ref success); return Marshal.ReadInt32(DangerousGetHandle(), offset); } finally { if (success) { DangerousRelease(); } } } internal void ReadInt32Array(int offset, int[] destination, int startIndex, int length) { offset += BaseOffset; Validate(offset, 4 * length); bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { DangerousAddRef(ref success); Marshal.Copy(ADP.IntPtrOffset(DangerousGetHandle(), offset), destination, startIndex, length); } finally { if (success) { DangerousRelease(); } } } internal long ReadInt64(int offset) { offset += BaseOffset; bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { DangerousAddRef(ref success); return Marshal.ReadInt64(DangerousGetHandle(), offset); } finally { if (success) { DangerousRelease(); } } } internal IntPtr ReadIntPtr(int offset) { offset += BaseOffset; bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { DangerousAddRef(ref success); return Marshal.ReadIntPtr(DangerousGetHandle(), offset); } finally { if (success) { DangerousRelease(); } } } internal unsafe float ReadSingle(int offset) { int num = ReadInt32(offset); return *(float*)(&num); } protected override bool ReleaseHandle() { IntPtr intPtr = handle; handle = IntPtr.Zero; if (IntPtr.Zero != intPtr) { SafeNativeMethods.LocalFree(intPtr); } return true; } private void StructureToPtr(int offset, object structure) { offset += BaseOffset; bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { DangerousAddRef(ref success); IntPtr ptr = ADP.IntPtrOffset(DangerousGetHandle(), offset); Marshal.StructureToPtr(structure, ptr, fDeleteOld: false); } finally { if (success) { DangerousRelease(); } } } internal void WriteByte(int offset, byte value) { offset += BaseOffset; bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { DangerousAddRef(ref success); Marshal.WriteByte(DangerousGetHandle(), offset, value); } finally { if (success) { DangerousRelease(); } } } internal void WriteBytes(int offset, byte[] source, int startIndex, int length) { offset += BaseOffset; Validate(offset, length); bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { DangerousAddRef(ref success); IntPtr destination = ADP.IntPtrOffset(DangerousGetHandle(), offset); Marshal.Copy(source, startIndex, destination, length); } finally { if (success) { DangerousRelease(); } } } internal void WriteCharArray(int offset, char[] source, int startIndex, int length) { offset += BaseOffset; Validate(offset, 2 * length); bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { DangerousAddRef(ref success); IntPtr destination = ADP.IntPtrOffset(DangerousGetHandle(), offset); Marshal.Copy(source, startIndex, destination, length); } finally { if (success) { DangerousRelease(); } } } internal void WriteDouble(int offset, double value) { WriteInt64(offset, BitConverter.DoubleToInt64Bits(value)); } internal void WriteInt16(int offset, short value) { offset += BaseOffset; bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { DangerousAddRef(ref success); Marshal.WriteInt16(DangerousGetHandle(), offset, value); } finally { if (success) { DangerousRelease(); } } } internal void WriteInt16Array(int offset, short[] source, int startIndex, int length) { offset += BaseOffset; Validate(offset, 2 * length); bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { DangerousAddRef(ref success); IntPtr destination = ADP.IntPtrOffset(DangerousGetHandle(), offset); Marshal.Copy(source, startIndex, destination, length); } finally { if (success) { DangerousRelease(); } } } internal void WriteInt32(int offset, int value) { offset += BaseOffset; bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { DangerousAddRef(ref success); Marshal.WriteInt32(DangerousGetHandle(), offset, value); } finally { if (success) { DangerousRelease(); } } } internal void WriteInt32Array(int offset, int[] source, int startIndex, int length) { offset += BaseOffset; Validate(offset, 4 * length); bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { DangerousAddRef(ref success); IntPtr destination = ADP.IntPtrOffset(DangerousGetHandle(), offset); Marshal.Copy(source, startIndex, destination, length); } finally { if (success) { DangerousRelease(); } } } internal void WriteInt64(int offset, long value) { offset += BaseOffset; bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { DangerousAddRef(ref success); Marshal.WriteInt64(DangerousGetHandle(), offset, value); } finally { if (success) { DangerousRelease(); } } } internal void WriteIntPtr(int offset, IntPtr value) { offset += BaseOffset; bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { DangerousAddRef(ref success); Marshal.WriteIntPtr(DangerousGetHandle(), offset, value); } finally { if (success) { DangerousRelease(); } } } internal unsafe void WriteSingle(int offset, float value) { WriteInt32(offset, *(int*)(&value)); } internal void ZeroMemory() { bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { DangerousAddRef(ref success); SafeNativeMethods.ZeroMemory(DangerousGetHandle(), Length); } finally { if (success) { DangerousRelease(); } } } internal Guid ReadGuid(int offset) { byte[] array = new byte[16]; ReadBytes(offset, array, 0, 16); return new Guid(array); } internal void WriteGuid(int offset, Guid value) { StructureToPtr(offset, value); } internal DateTime ReadDate(int offset) { short[] array = new short[3]; ReadInt16Array(offset, array, 0, 3); return new DateTime((ushort)array[0], (ushort)array[1], (ushort)array[2]); } internal void WriteDate(int offset, DateTime value) { short[] source = new short[3] { (short)value.Year, (short)value.Month, (short)value.Day }; WriteInt16Array(offset, source, 0, 3); } internal TimeSpan ReadTime(int offset) { short[] array = new short[3]; ReadInt16Array(offset, array, 0, 3); return new TimeSpan((ushort)array[0], (ushort)array[1], (ushort)array[2]); } internal void WriteTime(int offset, TimeSpan value) { short[] source = new short[3] { (short)value.Hours, (short)value.Minutes, (short)value.Seconds }; WriteInt16Array(offset, source, 0, 3); } internal DateTime ReadDateTime(int offset) { short[] array = new short[6]; ReadInt16Array(offset, array, 0, 6); int num = ReadInt32(offset + 12); return new DateTime((ushort)array[0], (ushort)array[1], (ushort)array[2], (ushort)array[3], (ushort)array[4], (ushort)array[5]).AddTicks(num / 100); } internal void WriteDateTime(int offset, DateTime value) { int value2 = (int)(value.Ticks % 10000000) * 100; short[] source = new short[6] { (short)value.Year, (short)value.Month, (short)value.Day, (short)value.Hour, (short)value.Minute, (short)value.Second }; WriteInt16Array(offset, source, 0, 6); WriteInt32(offset + 12, value2); } internal decimal ReadNumeric(int offset) { byte[] array = new byte[20]; ReadBytes(offset, array, 1, 19); int[] array2 = new int[4] { 0, 0, 0, array[2] << 16 }; if (array[3] == 0) { array2[3] |= int.MinValue; } array2[0] = BitConverter.ToInt32(array, 4); array2[1] = BitConverter.ToInt32(array, 8); array2[2] = BitConverter.ToInt32(array, 12); if (BitConverter.ToInt32(array, 16) != 0) { throw ADP.NumericToDecimalOverflow(); } return new decimal(array2); } internal void WriteNumeric(int offset, decimal value, byte precision) { int[] bits = decimal.GetBits(value); byte[] array = new byte[20] { 0, precision, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; Buffer.BlockCopy(bits, 14, array, 2, 2); array[3] = (byte)((array[3] == 0) ? 1u : 0u); Buffer.BlockCopy(bits, 0, array, 4, 12); array[16] = 0; array[17] = 0; array[18] = 0; array[19] = 0; WriteBytes(offset, array, 1, 19); } [Conditional("DEBUG")] protected void ValidateCheck(int offset, int count) { Validate(offset, count); } protected void Validate(int offset, int count) { if (offset < 0 || count < 0 || Length < checked(offset + count)) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidBuffer); } } } internal abstract class DbConnectionClosed : DbConnectionInternal { public override string ServerVersion { get { throw ADP.ClosedConnectionError(); } } protected DbConnectionClosed(ConnectionState state, bool hidePassword, bool allowSetConnectionString) : base(state, hidePassword, allowSetConnectionString) { } protected override void Activate(Transaction transaction) { throw ADP.ClosedConnectionError(); } public override DbTransaction BeginTransaction(IsolationLevel il) { throw ADP.ClosedConnectionError(); } public override void ChangeDatabase(string database) { throw ADP.ClosedConnectionError(); } internal override void CloseConnection(DbConnection owningObject, DbConnectionFactory connectionFactory) { } protected override void Deactivate() { throw ADP.ClosedConnectionError(); } public override void EnlistTransaction(Transaction transaction) { throw ADP.ClosedConnectionError(); } protected override DbReferenceCollection CreateReferenceCollection() { throw ADP.ClosedConnectionError(); } internal override bool TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource retry, DbConnectionOptions userOptions) { return TryOpenConnectionInternal(outerConnection, connectionFactory, retry, userOptions); } } internal abstract class DbConnectionBusy : DbConnectionClosed { protected DbConnectionBusy(ConnectionState state) : base(state, hidePassword: true, allowSetConnectionString: false) { } internal override bool TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource retry, DbConnectionOptions userOptions) { throw ADP.ConnectionAlreadyOpen(base.State); } } internal sealed class DbConnectionClosedBusy : DbConnectionBusy { internal static readonly DbConnectionInternal SingletonInstance = new DbConnectionClosedBusy(); private DbConnectionClosedBusy() : base(ConnectionState.Closed) { } } internal sealed class DbConnectionOpenBusy : DbConnectionBusy { internal static readonly DbConnectionInternal SingletonInstance = new DbConnectionOpenBusy(); private DbConnectionOpenBusy() : base(ConnectionState.Open) { } } internal sealed class DbConnectionClosedConnecting : DbConnectionBusy { internal static readonly DbConnectionInternal SingletonInstance = new DbConnectionClosedConnecting(); private DbConnectionClosedConnecting() : base(ConnectionState.Connecting) { } internal override void CloseConnection(DbConnection owningObject, DbConnectionFactory connectionFactory) { connectionFactory.SetInnerConnectionTo(owningObject, DbConnectionClosedPreviouslyOpened.SingletonInstance); } internal override bool TryReplaceConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource retry, DbConnectionOptions userOptions) { return TryOpenConnection(outerConnection, connectionFactory, retry, userOptions); } internal override bool TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource retry, DbConnectionOptions userOptions) { if (retry == null || !retry.Task.IsCompleted) { throw ADP.ConnectionAlreadyOpen(base.State); } DbConnectionInternal result = retry.Task.Result; if (result == null) { connectionFactory.SetInnerConnectionTo(outerConnection, this); throw ADP.InternalConnectionError(ADP.ConnectionError.GetConnectionReturnsNull); } connectionFactory.SetInnerConnectionEvent(outerConnection, result); return true; } } internal sealed class DbConnectionClosedNeverOpened : DbConnectionClosed { internal static readonly DbConnectionInternal SingletonInstance = new DbConnectionClosedNeverOpened(); private DbConnectionClosedNeverOpened() : base(ConnectionState.Closed, hidePassword: false, allowSetConnectionString: true) { } } internal sealed class DbConnectionClosedPreviouslyOpened : DbConnectionClosed { internal static readonly DbConnectionInternal SingletonInstance = new DbConnectionClosedPreviouslyOpened(); private DbConnectionClosedPreviouslyOpened() : base(ConnectionState.Closed, hidePassword: true, allowSetConnectionString: true) { } internal override bool TryReplaceConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource retry, DbConnectionOptions userOptions) { return TryOpenConnection(outerConnection, connectionFactory, retry, userOptions); } } internal abstract class DbConnectionFactory { private Dictionary _connectionPoolGroups; private readonly List _poolsToRelease; private readonly List _poolGroupsToRelease; private readonly Timer _pruningTimer; private const int PruningDueTime = 240000; private const int PruningPeriod = 30000; private static uint s_pendingOpenNonPooledNext = 0u; private static Task[] s_pendingOpenNonPooled = new Task[Environment.ProcessorCount]; private static Task s_completedTask; public abstract DbProviderFactory ProviderFactory { get; } protected DbConnectionFactory() { _connectionPoolGroups = new Dictionary(); _poolsToRelease = new List(); _poolGroupsToRelease = new List(); _pruningTimer = CreatePruningTimer(); } public void ClearAllPools() { foreach (KeyValuePair connectionPoolGroup in _connectionPoolGroups) { connectionPoolGroup.Value?.Clear(); } } public void ClearPool(DbConnection connection) { ADP.CheckArgumentNull(connection, "connection"); GetConnectionPoolGroup(connection)?.Clear(); } public void ClearPool(DbConnectionPoolKey key) { ADP.CheckArgumentNull(key.ConnectionString, "key.ConnectionString"); if (_connectionPoolGroups.TryGetValue(key, out var value)) { value.Clear(); } } internal virtual DbConnectionPoolProviderInfo CreateConnectionPoolProviderInfo(DbConnectionOptions connectionOptions) { return null; } internal DbConnectionInternal CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions) { DbConnectionOptions connectionOptions = poolGroup.ConnectionOptions; DbConnectionPoolGroupProviderInfo providerInfo = poolGroup.ProviderInfo; DbConnectionPoolKey poolKey = poolGroup.PoolKey; DbConnectionInternal dbConnectionInternal = CreateConnection(connectionOptions, poolKey, providerInfo, null, owningConnection, userOptions); dbConnectionInternal?.MakeNonPooledObject(owningConnection); return dbConnectionInternal; } internal DbConnectionInternal CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) { DbConnectionPoolGroupProviderInfo providerInfo = pool.PoolGroup.ProviderInfo; DbConnectionInternal dbConnectionInternal = CreateConnection(options, poolKey, providerInfo, pool, owningObject, userOptions); dbConnectionInternal?.MakePooledConnection(pool); return dbConnectionInternal; } internal virtual DbConnectionPoolGroupProviderInfo CreateConnectionPoolGroupProviderInfo(DbConnectionOptions connectionOptions) { return null; } private Timer CreatePruningTimer() { return new Timer(PruneConnectionPoolGroups, null, 240000, 30000); } protected DbConnectionOptions FindConnectionOptions(DbConnectionPoolKey key) { if (!string.IsNullOrEmpty(key.ConnectionString) && _connectionPoolGroups.TryGetValue(key, out var value)) { return value.ConnectionOptions; } return null; } private static Task GetCompletedTask() { return s_completedTask ?? (s_completedTask = Task.FromResult(null)); } internal bool TryGetConnection(DbConnection owningConnection, TaskCompletionSource retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, out DbConnectionInternal connection) { connection = null; int num = 10; int num2 = 1; do { DbConnectionPoolGroup poolGroup = GetConnectionPoolGroup(owningConnection); DbConnectionPool connectionPool = GetConnectionPool(owningConnection, poolGroup); if (connectionPool == null) { poolGroup = GetConnectionPoolGroup(owningConnection); if (retry != null) { CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); Task task3; lock (s_pendingOpenNonPooled) { int i; for (i = 0; i < s_pendingOpenNonPooled.Length; i++) { Task task2 = s_pendingOpenNonPooled[i]; if (task2 == null) { s_pendingOpenNonPooled[i] = GetCompletedTask(); break; } if (task2.IsCompleted) { break; } } if (i == s_pendingOpenNonPooled.Length) { i = (int)(s_pendingOpenNonPooledNext % s_pendingOpenNonPooled.Length); s_pendingOpenNonPooledNext++; } task3 = s_pendingOpenNonPooled[i].ContinueWith(delegate { Transaction currentTransaction = ADP.GetCurrentTransaction(); try { ADP.SetCurrentTransaction(retry.Task.AsyncState as Transaction); DbConnectionInternal result = CreateNonPooledConnection(owningConnection, poolGroup, userOptions); if (oldConnection != null && oldConnection.State == ConnectionState.Open) { oldConnection.PrepareForReplaceConnection(); oldConnection.Dispose(); } return result; } finally { ADP.SetCurrentTransaction(currentTransaction); } }, cancellationTokenSource.Token, TaskContinuationOptions.LongRunning, TaskScheduler.Default); s_pendingOpenNonPooled[i] = task3; } if (owningConnection.ConnectionTimeout > 0) { int millisecondsDelay = owningConnection.ConnectionTimeout * 1000; cancellationTokenSource.CancelAfter(millisecondsDelay); } task3.ContinueWith(delegate(Task task) { cancellationTokenSource.Dispose(); if (task.IsCanceled) { retry.TrySetException(ADP.ExceptionWithStackTrace(ADP.NonPooledOpenTimeout())); } else if (task.IsFaulted) { retry.TrySetException(task.Exception.InnerException); } else if (!retry.TrySetResult(task.Result)) { task.Result.DoomThisConnection(); task.Result.Dispose(); } }, TaskScheduler.Default); return false; } connection = CreateNonPooledConnection(owningConnection, poolGroup, userOptions); continue; } if (((SqlConnection)owningConnection).ForceNewConnection) { connection = connectionPool.ReplaceConnection(owningConnection, userOptions, oldConnection); } else if (!connectionPool.TryGetConnection(owningConnection, retry, userOptions, out connection)) { return false; } if (connection == null) { if (connectionPool.IsRunning) { throw ADP.PooledOpenTimeout(); } Thread.Sleep(num2); num2 *= 2; } } while (connection == null && num-- > 0); if (connection == null) { throw ADP.PooledOpenTimeout(); } return true; } private DbConnectionPool GetConnectionPool(DbConnection owningObject, DbConnectionPoolGroup connectionPoolGroup) { if (connectionPoolGroup.IsDisabled && connectionPoolGroup.PoolGroupOptions != null) { DbConnectionPoolGroupOptions poolGroupOptions = connectionPoolGroup.PoolGroupOptions; DbConnectionOptions userConnectionOptions = connectionPoolGroup.ConnectionOptions; connectionPoolGroup = GetConnectionPoolGroup(connectionPoolGroup.PoolKey, poolGroupOptions, ref userConnectionOptions); SetConnectionPoolGroup(owningObject, connectionPoolGroup); } return connectionPoolGroup.GetConnectionPool(this); } internal DbConnectionPoolGroup GetConnectionPoolGroup(DbConnectionPoolKey key, DbConnectionPoolGroupOptions poolOptions, ref DbConnectionOptions userConnectionOptions) { if (string.IsNullOrEmpty(key.ConnectionString)) { return null; } Dictionary connectionPoolGroups = _connectionPoolGroups; if (!connectionPoolGroups.TryGetValue(key, out var value) || (value.IsDisabled && value.PoolGroupOptions != null)) { DbConnectionOptions dbConnectionOptions = CreateConnectionOptions(key.ConnectionString, userConnectionOptions); if (dbConnectionOptions == null) { throw ADP.InternalConnectionError(ADP.ConnectionError.ConnectionOptionsMissing); } if (userConnectionOptions == null) { userConnectionOptions = dbConnectionOptions; } if (poolOptions == null) { poolOptions = ((value == null) ? CreateConnectionPoolGroupOptions(dbConnectionOptions) : value.PoolGroupOptions); } lock (this) { connectionPoolGroups = _connectionPoolGroups; if (!connectionPoolGroups.TryGetValue(key, out value)) { DbConnectionPoolGroup dbConnectionPoolGroup = new DbConnectionPoolGroup(dbConnectionOptions, key, poolOptions); dbConnectionPoolGroup.ProviderInfo = CreateConnectionPoolGroupProviderInfo(dbConnectionOptions); Dictionary dictionary = new Dictionary(1 + connectionPoolGroups.Count); foreach (KeyValuePair item in connectionPoolGroups) { dictionary.Add(item.Key, item.Value); } dictionary.Add(key, dbConnectionPoolGroup); value = dbConnectionPoolGroup; _connectionPoolGroups = dictionary; } } } else if (userConnectionOptions == null) { userConnectionOptions = value.ConnectionOptions; } return value; } private void PruneConnectionPoolGroups(object state) { lock (_poolsToRelease) { if (_poolsToRelease.Count != 0) { DbConnectionPool[] array = _poolsToRelease.ToArray(); foreach (DbConnectionPool dbConnectionPool in array) { if (dbConnectionPool != null) { dbConnectionPool.Clear(); if (dbConnectionPool.Count == 0) { _poolsToRelease.Remove(dbConnectionPool); } } } } } lock (_poolGroupsToRelease) { if (_poolGroupsToRelease.Count != 0) { DbConnectionPoolGroup[] array2 = _poolGroupsToRelease.ToArray(); foreach (DbConnectionPoolGroup dbConnectionPoolGroup in array2) { if (dbConnectionPoolGroup != null && dbConnectionPoolGroup.Clear() == 0) { _poolGroupsToRelease.Remove(dbConnectionPoolGroup); } } } } lock (this) { Dictionary connectionPoolGroups = _connectionPoolGroups; Dictionary dictionary = new Dictionary(connectionPoolGroups.Count); foreach (KeyValuePair item in connectionPoolGroups) { if (item.Value != null) { if (item.Value.Prune()) { QueuePoolGroupForRelease(item.Value); } else { dictionary.Add(item.Key, item.Value); } } } _connectionPoolGroups = dictionary; } } internal void QueuePoolForRelease(DbConnectionPool pool, bool clearing) { pool.Shutdown(); lock (_poolsToRelease) { if (clearing) { pool.Clear(); } _poolsToRelease.Add(pool); } } internal void QueuePoolGroupForRelease(DbConnectionPoolGroup poolGroup) { lock (_poolGroupsToRelease) { _poolGroupsToRelease.Add(poolGroup); } } protected virtual DbConnectionInternal CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) { return CreateConnection(options, poolKey, poolGroupProviderInfo, pool, owningConnection); } internal DbMetaDataFactory GetMetaDataFactory(DbConnectionPoolGroup connectionPoolGroup, DbConnectionInternal internalConnection) { DbMetaDataFactory dbMetaDataFactory = connectionPoolGroup.MetaDataFactory; if (dbMetaDataFactory == null) { bool cacheMetaDataFactory = false; dbMetaDataFactory = CreateMetaDataFactory(internalConnection, out cacheMetaDataFactory); if (cacheMetaDataFactory) { connectionPoolGroup.MetaDataFactory = dbMetaDataFactory; } } return dbMetaDataFactory; } protected virtual DbMetaDataFactory CreateMetaDataFactory(DbConnectionInternal internalConnection, out bool cacheMetaDataFactory) { cacheMetaDataFactory = false; throw ADP.NotSupported(); } protected abstract DbConnectionInternal CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection); protected abstract DbConnectionOptions CreateConnectionOptions(string connectionString, DbConnectionOptions previous); protected abstract DbConnectionPoolGroupOptions CreateConnectionPoolGroupOptions(DbConnectionOptions options); internal abstract DbConnectionPoolGroup GetConnectionPoolGroup(DbConnection connection); internal abstract DbConnectionInternal GetInnerConnection(DbConnection connection); internal abstract void PermissionDemand(DbConnection outerConnection); internal abstract void SetConnectionPoolGroup(DbConnection outerConnection, DbConnectionPoolGroup poolGroup); internal abstract void SetInnerConnectionEvent(DbConnection owningObject, DbConnectionInternal to); internal abstract bool SetInnerConnectionFrom(DbConnection owningObject, DbConnectionInternal to, DbConnectionInternal from); internal abstract void SetInnerConnectionTo(DbConnection owningObject, DbConnectionInternal to); } internal abstract class DbConnectionInternal { internal static readonly StateChangeEventArgs StateChangeClosed = new StateChangeEventArgs(ConnectionState.Open, ConnectionState.Closed); internal static readonly StateChangeEventArgs StateChangeOpen = new StateChangeEventArgs(ConnectionState.Closed, ConnectionState.Open); private readonly bool _allowSetConnectionString; private readonly bool _hidePassword; private readonly ConnectionState _state; private readonly WeakReference _owningObject = new WeakReference(null, trackResurrection: false); private DbConnectionPool _connectionPool; private DbReferenceCollection _referenceCollection; private int _pooledCount; private bool _connectionIsDoomed; private bool _cannotBePooled; private bool _isInStasis; private DateTime _createTime; private Transaction _enlistedTransaction; private Transaction _enlistedTransactionOriginal; internal bool AllowSetConnectionString => _allowSetConnectionString; internal bool CanBePooled { get { if (!_connectionIsDoomed && !_cannotBePooled) { return !_owningObject.IsAlive; } return false; } } protected internal Transaction EnlistedTransaction { get { return _enlistedTransaction; } set { Transaction enlistedTransaction = _enlistedTransaction; if ((!(null == enlistedTransaction) || !(null != value)) && (!(null != enlistedTransaction) || enlistedTransaction.Equals(value))) { return; } Transaction transaction = null; Transaction transaction2 = null; try { if (null != value) { transaction = value.Clone(); } lock (this) { transaction2 = Interlocked.Exchange(ref _enlistedTransaction, transaction); _enlistedTransactionOriginal = value; value = transaction; transaction = null; } } finally { if (null != transaction2 && (object)transaction2 != _enlistedTransaction) { transaction2.Dispose(); } if (null != transaction && (object)transaction != _enlistedTransaction) { transaction.Dispose(); } } if (null != value) { TransactionOutcomeEnlist(value); } } } protected bool EnlistedTransactionDisposed { get { try { Transaction enlistedTransactionOriginal = _enlistedTransactionOriginal; return enlistedTransactionOriginal != null && enlistedTransactionOriginal.TransactionInformation == null; } catch (ObjectDisposedException) { return true; } } } internal bool IsTxRootWaitingForTxEnd => _isInStasis; protected virtual bool UnbindOnTransactionCompletion => true; protected internal virtual bool IsNonPoolableTransactionRoot => false; internal virtual bool IsTransactionRoot => false; protected internal bool IsConnectionDoomed => _connectionIsDoomed; internal bool IsEmancipated { get { if (_pooledCount < 1) { return !_owningObject.IsAlive; } return false; } } internal bool IsInPool => _pooledCount == 1; protected internal object Owner => _owningObject.Target; internal DbConnectionPool Pool => _connectionPool; protected virtual bool ReadyToPrepareTransaction => true; protected internal DbReferenceCollection ReferenceCollection => _referenceCollection; public abstract string ServerVersion { get; } public virtual string ServerVersionNormalized { get { throw ADP.NotSupported(); } } public bool ShouldHidePassword => _hidePassword; public ConnectionState State => _state; protected DbConnectionInternal() : this(ConnectionState.Open, hidePassword: true, allowSetConnectionString: false) { } internal DbConnectionInternal(ConnectionState state, bool hidePassword, bool allowSetConnectionString) { _allowSetConnectionString = allowSetConnectionString; _hidePassword = hidePassword; _state = state; } protected abstract void Activate(Transaction transaction); internal void ActivateConnection(Transaction transaction) { Activate(transaction); } internal void AddWeakReference(object value, int tag) { if (_referenceCollection == null) { _referenceCollection = CreateReferenceCollection(); if (_referenceCollection == null) { throw ADP.InternalError(ADP.InternalErrorCode.CreateReferenceCollectionReturnedNull); } } _referenceCollection.Add(value, tag); } public abstract DbTransaction BeginTransaction(IsolationLevel il); public virtual void ChangeDatabase(string value) { throw ADP.MethodNotImplemented("ChangeDatabase"); } internal virtual void CloseConnection(DbConnection owningObject, DbConnectionFactory connectionFactory) { if (!connectionFactory.SetInnerConnectionFrom(owningObject, DbConnectionOpenBusy.SingletonInstance, this)) { return; } lock (this) { object lockToken = ObtainAdditionalLocksForClose(); try { PrepareForCloseConnection(); DbConnectionPool pool = Pool; DetachCurrentTransactionIfEnded(); if (pool != null) { pool.PutObject(this, owningObject); return; } Deactivate(); _owningObject.Target = null; if (IsTransactionRoot) { SetInStasis(); } else { Dispose(); } } finally { ReleaseAdditionalLocksForClose(lockToken); connectionFactory.SetInnerConnectionEvent(owningObject, DbConnectionClosedPreviouslyOpened.SingletonInstance); } } } internal virtual void PrepareForReplaceConnection() { } protected virtual void PrepareForCloseConnection() { } protected virtual object ObtainAdditionalLocksForClose() { return null; } protected virtual void ReleaseAdditionalLocksForClose(object lockToken) { } protected virtual DbReferenceCollection CreateReferenceCollection() { throw ADP.InternalError(ADP.InternalErrorCode.AttemptingToConstructReferenceCollectionOnStaticObject); } protected abstract void Deactivate(); internal void DeactivateConnection() { if (!_connectionIsDoomed && Pool.UseLoadBalancing && DateTime.UtcNow.Ticks - _createTime.Ticks > Pool.LoadBalanceTimeout.Ticks) { DoNotPoolThisConnection(); } Deactivate(); } internal virtual void DelegatedTransactionEnded() { if (1 == _pooledCount) { TerminateStasis(returningToPool: true); Deactivate(); DbConnectionPool pool = Pool; if (pool == null) { throw ADP.InternalError(ADP.InternalErrorCode.PooledObjectWithoutPool); } pool.PutObjectFromTransactedPool(this); } else if (-1 == _pooledCount && !_owningObject.IsAlive) { TerminateStasis(returningToPool: false); Deactivate(); Dispose(); } } public virtual void Dispose() { _connectionPool = null; _connectionIsDoomed = true; _enlistedTransactionOriginal = null; Transaction transaction = Interlocked.Exchange(ref _enlistedTransaction, null); if (transaction != null) { transaction.Dispose(); } } protected internal void DoNotPoolThisConnection() { _cannotBePooled = true; } protected internal void DoomThisConnection() { _connectionIsDoomed = true; } public abstract void EnlistTransaction(Transaction transaction); protected internal virtual DataTable GetSchema(DbConnectionFactory factory, DbConnectionPoolGroup poolGroup, DbConnection outerConnection, string collectionName, string[] restrictions) { return factory.GetMetaDataFactory(poolGroup, this).GetSchema(outerConnection, collectionName, restrictions); } internal void MakeNonPooledObject(object owningObject) { _connectionPool = null; _owningObject.Target = owningObject; _pooledCount = -1; } internal void MakePooledConnection(DbConnectionPool connectionPool) { _createTime = DateTime.UtcNow; _connectionPool = connectionPool; } internal void NotifyWeakReference(int message) { ReferenceCollection?.Notify(message); } internal virtual void OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) { if (!TryOpenConnection(outerConnection, connectionFactory, null, null)) { throw ADP.InternalError(ADP.InternalErrorCode.SynchronousConnectReturnedPending); } } internal virtual bool TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource retry, DbConnectionOptions userOptions) { throw ADP.ConnectionAlreadyOpen(State); } internal virtual bool TryReplaceConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource retry, DbConnectionOptions userOptions) { throw ADP.MethodNotImplemented("TryReplaceConnection"); } protected bool TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource retry, DbConnectionOptions userOptions) { if (connectionFactory.SetInnerConnectionFrom(outerConnection, DbConnectionClosedConnecting.SingletonInstance, this)) { DbConnectionInternal connection = null; try { connectionFactory.PermissionDemand(outerConnection); if (!connectionFactory.TryGetConnection(outerConnection, retry, userOptions, this, out connection)) { return false; } } catch { connectionFactory.SetInnerConnectionTo(outerConnection, this); throw; } if (connection == null) { connectionFactory.SetInnerConnectionTo(outerConnection, this); throw ADP.InternalConnectionError(ADP.ConnectionError.GetConnectionReturnsNull); } connectionFactory.SetInnerConnectionEvent(outerConnection, connection); } return true; } internal void PrePush(object expectedOwner) { if (expectedOwner == null) { if (_owningObject.Target != null) { throw ADP.InternalError(ADP.InternalErrorCode.UnpooledObjectHasOwner); } } else if (_owningObject.Target != expectedOwner) { throw ADP.InternalError(ADP.InternalErrorCode.UnpooledObjectHasWrongOwner); } if (_pooledCount != 0) { throw ADP.InternalError(ADP.InternalErrorCode.PushingObjectSecondTime); } _pooledCount++; _owningObject.Target = null; } internal void PostPop(object newOwner) { if (_owningObject.Target != null) { throw ADP.InternalError(ADP.InternalErrorCode.PooledObjectHasOwner); } _owningObject.Target = newOwner; _pooledCount--; if (Pool != null) { if (_pooledCount != 0) { throw ADP.InternalError(ADP.InternalErrorCode.PooledObjectInPoolMoreThanOnce); } } else if (-1 != _pooledCount) { throw ADP.InternalError(ADP.InternalErrorCode.NonPooledObjectUsedMoreThanOnce); } } internal void RemoveWeakReference(object value) { ReferenceCollection?.Remove(value); } protected virtual void CleanupTransactionOnCompletion(Transaction transaction) { } internal void DetachCurrentTransactionIfEnded() { Transaction enlistedTransaction = EnlistedTransaction; if (enlistedTransaction != null) { bool flag; try { flag = enlistedTransaction.TransactionInformation.Status != TransactionStatus.Active; } catch (TransactionException) { flag = true; } if (flag) { DetachTransaction(enlistedTransaction, isExplicitlyReleasing: true); } } } internal void DetachTransaction(Transaction transaction, bool isExplicitlyReleasing) { lock (this) { DbConnection dbConnection = (DbConnection)Owner; if (!isExplicitlyReleasing && !UnbindOnTransactionCompletion && dbConnection != null) { return; } Transaction enlistedTransaction = _enlistedTransaction; if (enlistedTransaction != null && transaction.Equals(enlistedTransaction)) { EnlistedTransaction = null; if (IsTxRootWaitingForTxEnd) { DelegatedTransactionEnded(); } } } } internal void CleanupConnectionOnTransactionCompletion(Transaction transaction) { DetachTransaction(transaction, isExplicitlyReleasing: false); Pool?.TransactionEnded(transaction, this); } private void TransactionCompletedEvent(object sender, TransactionEventArgs e) { Transaction transaction = e.Transaction; CleanupTransactionOnCompletion(transaction); CleanupConnectionOnTransactionCompletion(transaction); } private void TransactionOutcomeEnlist(Transaction transaction) { transaction.TransactionCompleted += TransactionCompletedEvent; } internal void SetInStasis() { _isInStasis = true; } private void TerminateStasis(bool returningToPool) { _isInStasis = false; } internal virtual bool IsConnectionAlive(bool throwOnException = false) { return true; } } internal sealed class DbConnectionPool { private enum State { Initializing, Running, ShuttingDown } private sealed class TransactedConnectionList : List { private Transaction _transaction; internal TransactedConnectionList(int initialAllocation, Transaction tx) : base(initialAllocation) { _transaction = tx; } internal void Dispose() { if (null != _transaction) { _transaction.Dispose(); } } } private sealed class PendingGetConnection { public long DueTime { get; private set; } public DbConnection Owner { get; private set; } public TaskCompletionSource Completion { get; private set; } public DbConnectionOptions UserOptions { get; private set; } public PendingGetConnection(long dueTime, DbConnection owner, TaskCompletionSource completion, DbConnectionOptions userOptions) { DueTime = dueTime; Owner = owner; Completion = completion; } } private sealed class TransactedConnectionPool { private Dictionary _transactedCxns; private DbConnectionPool _pool; private static int _objectTypeCount; internal readonly int _objectID = Interlocked.Increment(ref _objectTypeCount); internal int ObjectID => _objectID; internal DbConnectionPool Pool => _pool; internal TransactedConnectionPool(DbConnectionPool pool) { _pool = pool; _transactedCxns = new Dictionary(); } internal DbConnectionInternal GetTransactedObject(Transaction transaction) { DbConnectionInternal result = null; bool flag = false; TransactedConnectionList value; lock (_transactedCxns) { flag = _transactedCxns.TryGetValue(transaction, out value); } if (flag) { lock (value) { int num = value.Count - 1; if (0 <= num) { result = value[num]; value.RemoveAt(num); } } } return result; } internal void PutTransactedObject(Transaction transaction, DbConnectionInternal transactedObject) { bool flag = false; TransactedConnectionList value; lock (_transactedCxns) { if (flag = _transactedCxns.TryGetValue(transaction, out value)) { lock (value) { value.Add(transactedObject); } } } if (flag) { return; } Transaction transaction2 = null; TransactedConnectionList transactedConnectionList = null; try { transaction2 = transaction.Clone(); transactedConnectionList = new TransactedConnectionList(2, transaction2); lock (_transactedCxns) { if (flag = _transactedCxns.TryGetValue(transaction, out value)) { lock (value) { value.Add(transactedObject); return; } } transactedConnectionList.Add(transactedObject); _transactedCxns.Add(transaction2, transactedConnectionList); transaction2 = null; } } finally { if (null != transaction2) { if (transactedConnectionList != null) { transactedConnectionList.Dispose(); } else { transaction2.Dispose(); } } } } internal void TransactionEnded(Transaction transaction, DbConnectionInternal transactedObject) { int num = -1; lock (_transactedCxns) { if (_transactedCxns.TryGetValue(transaction, out var value)) { bool flag = false; lock (value) { num = value.IndexOf(transactedObject); if (num >= 0) { value.RemoveAt(num); } if (0 >= value.Count) { _transactedCxns.Remove(transaction); flag = true; } } if (flag) { value.Dispose(); } } } if (0 <= num) { Pool.PutObjectFromTransactedPool(transactedObject); } } } private sealed class PoolWaitHandles { private readonly Semaphore _poolSemaphore; private readonly ManualResetEvent _errorEvent; private readonly Semaphore _creationSemaphore; private readonly WaitHandle[] _handlesWithCreate; private readonly WaitHandle[] _handlesWithoutCreate; internal Semaphore CreationSemaphore => _creationSemaphore; internal ManualResetEvent ErrorEvent => _errorEvent; internal Semaphore PoolSemaphore => _poolSemaphore; internal PoolWaitHandles() { _poolSemaphore = new Semaphore(0, 1048576); _errorEvent = new ManualResetEvent(initialState: false); _creationSemaphore = new Semaphore(1, 1); _handlesWithCreate = new WaitHandle[3] { _poolSemaphore, _errorEvent, _creationSemaphore }; _handlesWithoutCreate = new WaitHandle[2] { _poolSemaphore, _errorEvent }; } internal WaitHandle[] GetHandles(bool withCreate) { if (!withCreate) { return _handlesWithoutCreate; } return _handlesWithCreate; } } private const int MAX_Q_SIZE = 1048576; private const int SEMAPHORE_HANDLE = 0; private const int ERROR_HANDLE = 1; private const int CREATION_HANDLE = 2; private const int BOGUS_HANDLE = 3; private const int ERROR_WAIT_DEFAULT = 5000; private static readonly Random s_random = new Random(5101977); private readonly int _cleanupWait; private readonly DbConnectionPoolIdentity _identity; private readonly DbConnectionFactory _connectionFactory; private readonly DbConnectionPoolGroup _connectionPoolGroup; private readonly DbConnectionPoolGroupOptions _connectionPoolGroupOptions; private DbConnectionPoolProviderInfo _connectionPoolProviderInfo; private State _state; private readonly ConcurrentStack _stackOld = new ConcurrentStack(); private readonly ConcurrentStack _stackNew = new ConcurrentStack(); private readonly ConcurrentQueue _pendingOpens = new ConcurrentQueue(); private int _pendingOpensWaiting; private readonly WaitCallback _poolCreateRequest; private int _waitCount; private readonly PoolWaitHandles _waitHandles; private Exception _resError; private volatile bool _errorOccurred; private int _errorWait; private Timer _errorTimer; private Timer _cleanupTimer; private readonly TransactedConnectionPool _transactedConnectionPool; private readonly List _objectList; private int _totalObjects; private int CreationTimeout => PoolGroupOptions.CreationTimeout; internal int Count => _totalObjects; internal DbConnectionFactory ConnectionFactory => _connectionFactory; internal bool ErrorOccurred => _errorOccurred; private bool HasTransactionAffinity => PoolGroupOptions.HasTransactionAffinity; internal TimeSpan LoadBalanceTimeout => PoolGroupOptions.LoadBalanceTimeout; private bool NeedToReplenish { get { if (State.Running != _state) { return false; } int count = Count; if (count >= MaxPoolSize) { return false; } if (count < MinPoolSize) { return true; } int num = _stackNew.Count + _stackOld.Count; int waitCount = _waitCount; if (num >= waitCount) { if (num == waitCount) { return count > 1; } return false; } return true; } } internal DbConnectionPoolIdentity Identity => _identity; internal bool IsRunning => State.Running == _state; private int MaxPoolSize => PoolGroupOptions.MaxPoolSize; private int MinPoolSize => PoolGroupOptions.MinPoolSize; internal DbConnectionPoolGroup PoolGroup => _connectionPoolGroup; internal DbConnectionPoolGroupOptions PoolGroupOptions => _connectionPoolGroupOptions; internal DbConnectionPoolProviderInfo ProviderInfo => _connectionPoolProviderInfo; internal bool UseLoadBalancing => PoolGroupOptions.UseLoadBalancing; private bool UsingIntegrateSecurity { get { if (_identity != null) { return DbConnectionPoolIdentity.NoIdentity != _identity; } return false; } } internal DbConnectionPool(DbConnectionFactory connectionFactory, DbConnectionPoolGroup connectionPoolGroup, DbConnectionPoolIdentity identity, DbConnectionPoolProviderInfo connectionPoolProviderInfo) { if (identity != null && identity.IsRestricted) { throw ADP.InternalError(ADP.InternalErrorCode.AttemptingToPoolOnRestrictedToken); } _state = State.Initializing; lock (s_random) { _cleanupWait = s_random.Next(12, 24) * 10 * 1000; } _connectionFactory = connectionFactory; _connectionPoolGroup = connectionPoolGroup; _connectionPoolGroupOptions = connectionPoolGroup.PoolGroupOptions; _connectionPoolProviderInfo = connectionPoolProviderInfo; _identity = identity; _waitHandles = new PoolWaitHandles(); _errorWait = 5000; _errorTimer = null; _objectList = new List(MaxPoolSize); if (ADP.IsPlatformNT5) { _transactedConnectionPool = new TransactedConnectionPool(this); } _poolCreateRequest = PoolCreateRequest; _state = State.Running; } private void CleanupCallback(object state) { while (Count > MinPoolSize && _waitHandles.PoolSemaphore.WaitOne(0)) { if (_stackOld.TryPop(out var result)) { bool flag = true; lock (result) { if (result.IsTransactionRoot) { flag = false; } } if (flag) { DestroyObject(result); } else { result.SetInStasis(); } continue; } _waitHandles.PoolSemaphore.Release(1); break; } if (_waitHandles.PoolSemaphore.WaitOne(0)) { DbConnectionInternal result2; while (_stackNew.TryPop(out result2)) { _stackOld.Push(result2); } _waitHandles.PoolSemaphore.Release(1); } QueuePoolCreateRequest(); } internal void Clear() { DbConnectionInternal result; lock (_objectList) { int count = _objectList.Count; for (int i = 0; i < count; i++) { result = _objectList[i]; result?.DoNotPoolThisConnection(); } } while (_stackNew.TryPop(out result)) { DestroyObject(result); } while (_stackOld.TryPop(out result)) { DestroyObject(result); } ReclaimEmancipatedObjects(); } private Timer CreateCleanupTimer() { return new Timer(CleanupCallback, null, _cleanupWait, _cleanupWait); } private DbConnectionInternal CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) { DbConnectionInternal dbConnectionInternal = null; try { dbConnectionInternal = _connectionFactory.CreatePooledConnection(this, owningObject, _connectionPoolGroup.ConnectionOptions, _connectionPoolGroup.PoolKey, userOptions); if (dbConnectionInternal == null) { throw ADP.InternalError(ADP.InternalErrorCode.CreateObjectReturnedNull); } if (!dbConnectionInternal.CanBePooled) { throw ADP.InternalError(ADP.InternalErrorCode.NewObjectCannotBePooled); } dbConnectionInternal.PrePush(null); lock (_objectList) { if (oldConnection != null && oldConnection.Pool == this) { _objectList.Remove(oldConnection); } _objectList.Add(dbConnectionInternal); _totalObjects = _objectList.Count; } if (oldConnection != null) { DbConnectionPool pool = oldConnection.Pool; if (pool != null && pool != this) { lock (pool._objectList) { pool._objectList.Remove(oldConnection); pool._totalObjects = pool._objectList.Count; } } } _errorWait = 5000; return dbConnectionInternal; } catch (Exception ex) { if (!ADP.IsCatchableExceptionType(ex)) { throw; } dbConnectionInternal = null; _resError = ex; Timer timer = new Timer(ErrorCallback, null, -1, -1); try { } finally { _waitHandles.ErrorEvent.Set(); _errorOccurred = true; _errorTimer = timer; timer.Change(_errorWait, _errorWait); } if (30000 < _errorWait) { _errorWait = 60000; } else { _errorWait *= 2; } throw; } } private void DeactivateObject(DbConnectionInternal obj) { obj.DeactivateConnection(); bool flag = false; bool flag2 = false; if (obj.IsConnectionDoomed) { flag2 = true; } else { lock (obj) { if (_state == State.ShuttingDown) { if (obj.IsTransactionRoot) { obj.SetInStasis(); } else { flag2 = true; } } else if (obj.IsNonPoolableTransactionRoot) { obj.SetInStasis(); } else if (obj.CanBePooled) { Transaction enlistedTransaction = obj.EnlistedTransaction; if (null != enlistedTransaction) { _transactedConnectionPool.PutTransactedObject(enlistedTransaction, obj); } else { flag = true; } } else if (obj.IsTransactionRoot && !obj.IsConnectionDoomed) { obj.SetInStasis(); } else { flag2 = true; } } } if (flag) { PutNewObject(obj); } else if (flag2) { DestroyObject(obj); QueuePoolCreateRequest(); } } internal void DestroyObject(DbConnectionInternal obj) { if (!obj.IsTxRootWaitingForTxEnd) { lock (_objectList) { _objectList.Remove(obj); _totalObjects = _objectList.Count; } obj.Dispose(); } } private void ErrorCallback(object state) { _errorOccurred = false; _waitHandles.ErrorEvent.Reset(); Timer errorTimer = _errorTimer; _errorTimer = null; errorTimer?.Dispose(); } private Exception TryCloneCachedException() { if (_resError == null) { return null; } if (_resError is SqlException ex) { return ex.InternalClone(); } return _resError; } private void WaitForPendingOpen() { PendingGetConnection result; do { bool flag = false; try { try { } finally { flag = Interlocked.CompareExchange(ref _pendingOpensWaiting, 1, 0) == 0; } if (!flag) { break; } while (_pendingOpens.TryDequeue(out result)) { if (!result.Completion.Task.IsCompleted) { uint waitForMultipleObjectsTimeout = (uint)((result.DueTime != -1) ? Math.Max(ADP.TimerRemainingMilliseconds(result.DueTime), 0L) : uint.MaxValue); DbConnectionInternal connection = null; bool flag2 = false; Exception ex = null; try { bool allowCreate = true; bool onlyOneCheckConnection = false; ADP.SetCurrentTransaction(result.Completion.Task.AsyncState as Transaction); flag2 = !TryGetConnection(result.Owner, waitForMultipleObjectsTimeout, allowCreate, onlyOneCheckConnection, result.UserOptions, out connection); } catch (Exception ex2) { ex = ex2; } if (ex != null) { result.Completion.TrySetException(ex); } else if (flag2) { result.Completion.TrySetException(ADP.ExceptionWithStackTrace(ADP.PooledOpenTimeout())); } else if (!result.Completion.TrySetResult(connection)) { PutObject(connection, result.Owner); } } } } finally { if (flag) { Interlocked.Exchange(ref _pendingOpensWaiting, 0); } } } while (_pendingOpens.TryPeek(out result)); } internal bool TryGetConnection(DbConnection owningObject, TaskCompletionSource retry, DbConnectionOptions userOptions, out DbConnectionInternal connection) { uint num = 0u; bool allowCreate = false; if (retry == null) { num = (uint)CreationTimeout; if (num == 0) { num = uint.MaxValue; } allowCreate = true; } if (_state != State.Running) { connection = null; return true; } bool onlyOneCheckConnection = true; if (TryGetConnection(owningObject, num, allowCreate, onlyOneCheckConnection, userOptions, out connection)) { return true; } if (retry == null) { return true; } PendingGetConnection item = new PendingGetConnection((CreationTimeout == 0) ? (-1) : (ADP.TimerCurrent() + ADP.TimerFromSeconds(CreationTimeout / 1000)), owningObject, retry, userOptions); _pendingOpens.Enqueue(item); if (_pendingOpensWaiting == 0) { Thread thread = new Thread(WaitForPendingOpen); thread.IsBackground = true; thread.Start(); } connection = null; return false; } private bool TryGetConnection(DbConnection owningObject, uint waitForMultipleObjectsTimeout, bool allowCreate, bool onlyOneCheckConnection, DbConnectionOptions userOptions, out DbConnectionInternal connection) { DbConnectionInternal dbConnectionInternal = null; Transaction transaction = null; if (HasTransactionAffinity) { dbConnectionInternal = GetFromTransactedPool(out transaction); } if (dbConnectionInternal == null) { Interlocked.Increment(ref _waitCount); do { int num = 3; try { try { } finally { num = WaitHandle.WaitAny(_waitHandles.GetHandles(allowCreate), (int)waitForMultipleObjectsTimeout); } switch (num) { case 258: Interlocked.Decrement(ref _waitCount); connection = null; return false; case 1: Interlocked.Decrement(ref _waitCount); throw TryCloneCachedException(); case 2: try { dbConnectionInternal = UserCreateRequest(owningObject, userOptions); } catch { if (dbConnectionInternal == null) { Interlocked.Decrement(ref _waitCount); } throw; } finally { if (dbConnectionInternal != null) { Interlocked.Decrement(ref _waitCount); } } if (dbConnectionInternal == null && Count >= MaxPoolSize && MaxPoolSize != 0 && !ReclaimEmancipatedObjects()) { allowCreate = false; } break; case 0: Interlocked.Decrement(ref _waitCount); dbConnectionInternal = GetFromGeneralPool(); if (dbConnectionInternal == null || dbConnectionInternal.IsConnectionAlive()) { break; } DestroyObject(dbConnectionInternal); dbConnectionInternal = null; if (onlyOneCheckConnection) { if (!_waitHandles.CreationSemaphore.WaitOne((int)waitForMultipleObjectsTimeout)) { connection = null; return false; } try { dbConnectionInternal = UserCreateRequest(owningObject, userOptions); } finally { _waitHandles.CreationSemaphore.Release(1); } } break; default: Interlocked.Decrement(ref _waitCount); throw ADP.InternalError(ADP.InternalErrorCode.UnexpectedWaitAnyResult); } } finally { if (2 == num) { _waitHandles.CreationSemaphore.Release(1); } } } while (dbConnectionInternal == null); } if (dbConnectionInternal != null) { PrepareConnection(owningObject, dbConnectionInternal, transaction); } connection = dbConnectionInternal; return true; } private void PrepareConnection(DbConnection owningObject, DbConnectionInternal obj, Transaction transaction) { lock (obj) { obj.PostPop(owningObject); } try { obj.ActivateConnection(transaction); } catch { PutObject(obj, owningObject); throw; } } internal DbConnectionInternal ReplaceConnection(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) { DbConnectionInternal dbConnectionInternal = UserCreateRequest(owningObject, userOptions, oldConnection); if (dbConnectionInternal != null) { PrepareConnection(owningObject, dbConnectionInternal, oldConnection.EnlistedTransaction); oldConnection.PrepareForReplaceConnection(); oldConnection.DeactivateConnection(); oldConnection.Dispose(); } return dbConnectionInternal; } private DbConnectionInternal GetFromGeneralPool() { DbConnectionInternal result = null; if (!_stackNew.TryPop(out result) && !_stackOld.TryPop(out result)) { result = null; } return result; } private DbConnectionInternal GetFromTransactedPool(out Transaction transaction) { transaction = ADP.GetCurrentTransaction(); DbConnectionInternal dbConnectionInternal = null; if (null != transaction && _transactedConnectionPool != null) { dbConnectionInternal = _transactedConnectionPool.GetTransactedObject(transaction); if (dbConnectionInternal != null) { if (dbConnectionInternal.IsTransactionRoot) { try { dbConnectionInternal.IsConnectionAlive(throwOnException: true); } catch { DestroyObject(dbConnectionInternal); throw; } } else if (!dbConnectionInternal.IsConnectionAlive()) { DestroyObject(dbConnectionInternal); dbConnectionInternal = null; } } } return dbConnectionInternal; } private void PoolCreateRequest(object state) { if (State.Running != _state) { return; } if (!_pendingOpens.IsEmpty && _pendingOpensWaiting == 0) { Thread thread = new Thread(WaitForPendingOpen); thread.IsBackground = true; thread.Start(); } ReclaimEmancipatedObjects(); if (ErrorOccurred || !NeedToReplenish || (UsingIntegrateSecurity && !_identity.Equals(DbConnectionPoolIdentity.GetCurrent()))) { return; } int num = 3; try { try { } finally { num = WaitHandle.WaitAny(_waitHandles.GetHandles(withCreate: true), CreationTimeout); } if (2 == num) { if (ErrorOccurred) { return; } while (NeedToReplenish) { DbConnectionInternal dbConnectionInternal = CreateObject(null, null, null); if (dbConnectionInternal != null) { PutNewObject(dbConnectionInternal); continue; } break; } } else if (258 == num) { QueuePoolCreateRequest(); } } finally { if (2 == num) { _waitHandles.CreationSemaphore.Release(1); } } } internal void PutNewObject(DbConnectionInternal obj) { _stackNew.Push(obj); _waitHandles.PoolSemaphore.Release(1); } internal void PutObject(DbConnectionInternal obj, object owningObject) { lock (obj) { obj.PrePush(owningObject); } DeactivateObject(obj); } internal void PutObjectFromTransactedPool(DbConnectionInternal obj) { if (_state == State.Running && obj.CanBePooled) { PutNewObject(obj); return; } DestroyObject(obj); QueuePoolCreateRequest(); } private void QueuePoolCreateRequest() { if (State.Running == _state) { ThreadPool.QueueUserWorkItem(_poolCreateRequest); } } private bool ReclaimEmancipatedObjects() { bool result = false; List list = new List(); int count; lock (_objectList) { count = _objectList.Count; for (int i = 0; i < count; i++) { DbConnectionInternal dbConnectionInternal = _objectList[i]; if (dbConnectionInternal == null) { continue; } bool lockTaken = false; try { Monitor.TryEnter(dbConnectionInternal, ref lockTaken); if (lockTaken && dbConnectionInternal.IsEmancipated) { dbConnectionInternal.PrePush(null); list.Add(dbConnectionInternal); } } finally { if (lockTaken) { Monitor.Exit(dbConnectionInternal); } } } } count = list.Count; for (int j = 0; j < count; j++) { DbConnectionInternal dbConnectionInternal2 = list[j]; result = true; dbConnectionInternal2.DetachCurrentTransactionIfEnded(); DeactivateObject(dbConnectionInternal2); } return result; } internal void Startup() { _cleanupTimer = CreateCleanupTimer(); if (NeedToReplenish) { QueuePoolCreateRequest(); } } internal void Shutdown() { _state = State.ShuttingDown; Timer cleanupTimer = _cleanupTimer; _cleanupTimer = null; cleanupTimer?.Dispose(); } internal void TransactionEnded(Transaction transaction, DbConnectionInternal transactedObject) { _transactedConnectionPool?.TransactionEnded(transaction, transactedObject); } private DbConnectionInternal UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection = null) { DbConnectionInternal result = null; if (ErrorOccurred) { throw TryCloneCachedException(); } if ((oldConnection != null || Count < MaxPoolSize || MaxPoolSize == 0) && (oldConnection != null || (Count & 1) == 1 || !ReclaimEmancipatedObjects())) { result = CreateObject(owningObject, userOptions, oldConnection); } return result; } } internal sealed class DbConnectionPoolGroup { private readonly DbConnectionOptions _connectionOptions; private readonly DbConnectionPoolKey _poolKey; private readonly DbConnectionPoolGroupOptions _poolGroupOptions; private ConcurrentDictionary _poolCollection; private int _state; private DbConnectionPoolGroupProviderInfo _providerInfo; private DbMetaDataFactory _metaDataFactory; private const int PoolGroupStateActive = 1; private const int PoolGroupStateIdle = 2; private const int PoolGroupStateDisabled = 4; internal DbConnectionOptions ConnectionOptions => _connectionOptions; internal DbConnectionPoolKey PoolKey => _poolKey; internal DbConnectionPoolGroupProviderInfo ProviderInfo { get { return _providerInfo; } set { _providerInfo = value; if (value != null) { _providerInfo.PoolGroup = this; } } } internal bool IsDisabled => 4 == _state; internal DbConnectionPoolGroupOptions PoolGroupOptions => _poolGroupOptions; internal DbMetaDataFactory MetaDataFactory { get { return _metaDataFactory; } set { _metaDataFactory = value; } } internal DbConnectionPoolGroup(DbConnectionOptions connectionOptions, DbConnectionPoolKey key, DbConnectionPoolGroupOptions poolGroupOptions) { _connectionOptions = connectionOptions; _poolKey = key; _poolGroupOptions = poolGroupOptions; _poolCollection = new ConcurrentDictionary(); _state = 1; } internal int Clear() { ConcurrentDictionary concurrentDictionary = null; lock (this) { if (_poolCollection.Count > 0) { concurrentDictionary = _poolCollection; _poolCollection = new ConcurrentDictionary(); } } if (concurrentDictionary != null) { foreach (KeyValuePair item in concurrentDictionary) { DbConnectionPool value = item.Value; value?.ConnectionFactory.QueuePoolForRelease(value, clearing: true); } } return _poolCollection.Count; } internal DbConnectionPool GetConnectionPool(DbConnectionFactory connectionFactory) { DbConnectionPool value = null; if (_poolGroupOptions != null) { DbConnectionPoolIdentity dbConnectionPoolIdentity = DbConnectionPoolIdentity.NoIdentity; if (_poolGroupOptions.PoolByIdentity) { dbConnectionPoolIdentity = DbConnectionPoolIdentity.GetCurrent(); if (dbConnectionPoolIdentity.IsRestricted) { dbConnectionPoolIdentity = null; } } if (dbConnectionPoolIdentity != null && !_poolCollection.TryGetValue(dbConnectionPoolIdentity, out value)) { lock (this) { if (!_poolCollection.TryGetValue(dbConnectionPoolIdentity, out value)) { DbConnectionPoolProviderInfo connectionPoolProviderInfo = connectionFactory.CreateConnectionPoolProviderInfo(ConnectionOptions); DbConnectionPool dbConnectionPool = new DbConnectionPool(connectionFactory, this, dbConnectionPoolIdentity, connectionPoolProviderInfo); if (MarkPoolGroupAsActive()) { dbConnectionPool.Startup(); _poolCollection.TryAdd(dbConnectionPoolIdentity, dbConnectionPool); value = dbConnectionPool; } else { dbConnectionPool.Shutdown(); } } } } } if (value == null) { lock (this) { MarkPoolGroupAsActive(); } } return value; } private bool MarkPoolGroupAsActive() { if (2 == _state) { _state = 1; } return 1 == _state; } internal bool Prune() { lock (this) { if (_poolCollection.Count > 0) { ConcurrentDictionary concurrentDictionary = new ConcurrentDictionary(); foreach (KeyValuePair item in _poolCollection) { DbConnectionPool value = item.Value; if (value != null) { if (!value.ErrorOccurred && value.Count == 0) { value.ConnectionFactory.QueuePoolForRelease(value, clearing: false); } else { concurrentDictionary.TryAdd(item.Key, item.Value); } } } _poolCollection = concurrentDictionary; } if (_poolCollection.Count == 0) { if (1 == _state) { _state = 2; } else if (2 == _state) { _state = 4; } } return 4 == _state; } } } internal class DbConnectionPoolGroupProviderInfo { private DbConnectionPoolGroup _poolGroup; internal DbConnectionPoolGroup PoolGroup { get { return _poolGroup; } set { _poolGroup = value; } } } [Serializable] internal sealed class DbConnectionPoolIdentity { public static readonly DbConnectionPoolIdentity NoIdentity = new DbConnectionPoolIdentity(string.Empty, isRestricted: false, isNetwork: true); private readonly string _sidString; private readonly bool _isRestricted; private readonly bool _isNetwork; private readonly int _hashCode; internal bool IsRestricted => _isRestricted; internal static DbConnectionPoolIdentity GetCurrent() { return GetCurrentManaged(); } private DbConnectionPoolIdentity(string sidString, bool isRestricted, bool isNetwork) { _sidString = sidString; _isRestricted = isRestricted; _isNetwork = isNetwork; _hashCode = sidString?.GetHashCode() ?? 0; } public override bool Equals(object value) { bool flag = this == NoIdentity || this == value; if (!flag && value != null) { DbConnectionPoolIdentity dbConnectionPoolIdentity = (DbConnectionPoolIdentity)value; flag = _sidString == dbConnectionPoolIdentity._sidString && _isRestricted == dbConnectionPoolIdentity._isRestricted && _isNetwork == dbConnectionPoolIdentity._isNetwork; } return flag; } public override int GetHashCode() { return _hashCode; } internal static DbConnectionPoolIdentity GetCurrentManaged() { string sidString = ((!string.IsNullOrWhiteSpace(Environment.UserDomainName)) ? (Environment.UserDomainName + "\\") : "") + Environment.UserName; bool isNetwork = false; bool isRestricted = false; return new DbConnectionPoolIdentity(sidString, isRestricted, isNetwork); } } internal sealed class DbConnectionPoolGroupOptions { private readonly bool _poolByIdentity; private readonly int _minPoolSize; private readonly int _maxPoolSize; private readonly int _creationTimeout; private readonly TimeSpan _loadBalanceTimeout; private readonly bool _hasTransactionAffinity; private readonly bool _useLoadBalancing; public int CreationTimeout => _creationTimeout; public bool HasTransactionAffinity => _hasTransactionAffinity; public TimeSpan LoadBalanceTimeout => _loadBalanceTimeout; public int MaxPoolSize => _maxPoolSize; public int MinPoolSize => _minPoolSize; public bool PoolByIdentity => _poolByIdentity; public bool UseLoadBalancing => _useLoadBalancing; public DbConnectionPoolGroupOptions(bool poolByIdentity, int minPoolSize, int maxPoolSize, int creationTimeout, int loadBalanceTimeout, bool hasTransactionAffinity) { _poolByIdentity = poolByIdentity; _minPoolSize = minPoolSize; _maxPoolSize = maxPoolSize; _creationTimeout = creationTimeout; if (loadBalanceTimeout != 0) { _loadBalanceTimeout = new TimeSpan(0, 0, loadBalanceTimeout); _useLoadBalancing = true; } _hasTransactionAffinity = hasTransactionAffinity; } } internal class DbConnectionPoolProviderInfo { } internal class DbMetaDataFactory { private DataSet _metaDataCollectionsDataSet; private string _normalizedServerVersion; private string _serverVersionString; private const string _collectionName = "CollectionName"; private const string _populationMechanism = "PopulationMechanism"; private const string _populationString = "PopulationString"; private const string _maximumVersion = "MaximumVersion"; private const string _minimumVersion = "MinimumVersion"; private const string _dataSourceProductVersionNormalized = "DataSourceProductVersionNormalized"; private const string _dataSourceProductVersion = "DataSourceProductVersion"; private const string _restrictionDefault = "RestrictionDefault"; private const string _restrictionNumber = "RestrictionNumber"; private const string _numberOfRestrictions = "NumberOfRestrictions"; private const string _restrictionName = "RestrictionName"; private const string _parameterName = "ParameterName"; private const string _dataTable = "DataTable"; private const string _sqlCommand = "SQLCommand"; private const string _prepareCollection = "PrepareCollection"; protected DataSet CollectionDataSet => _metaDataCollectionsDataSet; protected string ServerVersion => _serverVersionString; protected string ServerVersionNormalized => _normalizedServerVersion; public DbMetaDataFactory(Stream xmlStream, string serverVersion, string normalizedServerVersion) { ADP.CheckArgumentNull(xmlStream, "xmlStream"); ADP.CheckArgumentNull(serverVersion, "serverVersion"); ADP.CheckArgumentNull(normalizedServerVersion, "normalizedServerVersion"); LoadDataSetFromXml(xmlStream); _serverVersionString = serverVersion; _normalizedServerVersion = normalizedServerVersion; } protected DataTable CloneAndFilterCollection(string collectionName, string[] hiddenColumnNames) { DataTable dataTable = _metaDataCollectionsDataSet.Tables[collectionName]; if (dataTable == null || collectionName != dataTable.TableName) { throw ADP.DataTableDoesNotExist(collectionName); } DataTable dataTable2 = new DataTable(collectionName) { Locale = CultureInfo.InvariantCulture }; DataColumnCollection columns = dataTable2.Columns; DataColumn[] array = FilterColumns(dataTable, hiddenColumnNames, columns); foreach (DataRow row in dataTable.Rows) { if (SupportedByCurrentVersion(row)) { DataRow dataRow2 = dataTable2.NewRow(); for (int i = 0; i < columns.Count; i++) { dataRow2[columns[i]] = row[array[i], DataRowVersion.Current]; } dataTable2.Rows.Add(dataRow2); dataRow2.AcceptChanges(); } } return dataTable2; } public void Dispose() { Dispose(disposing: true); } protected virtual void Dispose(bool disposing) { if (disposing) { _normalizedServerVersion = null; _serverVersionString = null; _metaDataCollectionsDataSet.Dispose(); } } private DataTable ExecuteCommand(DataRow requestedCollectionRow, string[] restrictions, DbConnection connection) { DataTable dataTable = _metaDataCollectionsDataSet.Tables[DbMetaDataCollectionNames.MetaDataCollections]; DataColumn column = dataTable.Columns["PopulationString"]; DataColumn column2 = dataTable.Columns["NumberOfRestrictions"]; DataColumn column3 = dataTable.Columns["CollectionName"]; DataTable dataTable2 = null; DbCommand dbCommand = null; string commandText = requestedCollectionRow[column, DataRowVersion.Current] as string; int num = (int)requestedCollectionRow[column2, DataRowVersion.Current]; string text = requestedCollectionRow[column3, DataRowVersion.Current] as string; if (restrictions != null && restrictions.Length > num) { throw ADP.TooManyRestrictions(text); } dbCommand = connection.CreateCommand(); dbCommand.CommandText = commandText; dbCommand.CommandTimeout = Math.Max(dbCommand.CommandTimeout, 180); for (int i = 0; i < num; i++) { DbParameter dbParameter = dbCommand.CreateParameter(); if (restrictions != null && restrictions.Length > i && restrictions[i] != null) { dbParameter.Value = restrictions[i]; } else { dbParameter.Value = DBNull.Value; } dbParameter.ParameterName = GetParameterName(text, i + 1); dbParameter.Direction = ParameterDirection.Input; dbCommand.Parameters.Add(dbParameter); } DbDataReader dbDataReader = null; try { try { dbDataReader = dbCommand.ExecuteReader(); } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } throw ADP.QueryFailed(text, e); } dataTable2 = new DataTable(text) { Locale = CultureInfo.InvariantCulture }; foreach (DataRow row in dbDataReader.GetSchemaTable().Rows) { dataTable2.Columns.Add(row["ColumnName"] as string, (Type)row["DataType"]); } object[] values = new object[dataTable2.Columns.Count]; while (dbDataReader.Read()) { dbDataReader.GetValues(values); dataTable2.Rows.Add(values); } return dataTable2; } finally { if (dbDataReader != null) { dbDataReader.Dispose(); dbDataReader = null; } } } private DataColumn[] FilterColumns(DataTable sourceTable, string[] hiddenColumnNames, DataColumnCollection destinationColumns) { DataColumn[] array = null; int num = 0; foreach (DataColumn column2 in sourceTable.Columns) { if (IncludeThisColumn(column2, hiddenColumnNames)) { num++; } } if (num == 0) { throw ADP.NoColumns(); } int num2 = 0; array = new DataColumn[num]; foreach (DataColumn column3 in sourceTable.Columns) { if (IncludeThisColumn(column3, hiddenColumnNames)) { DataColumn column = new DataColumn(column3.ColumnName, column3.DataType); destinationColumns.Add(column); array[num2] = column3; num2++; } } return array; } internal DataRow FindMetaDataCollectionRow(string collectionName) { DataTable obj = _metaDataCollectionsDataSet.Tables[DbMetaDataCollectionNames.MetaDataCollections] ?? throw ADP.InvalidXml(); DataColumn dataColumn = obj.Columns[DbMetaDataColumnNames.CollectionName]; if (dataColumn == null || typeof(string) != dataColumn.DataType) { throw ADP.InvalidXmlMissingColumn(DbMetaDataCollectionNames.MetaDataCollections, DbMetaDataColumnNames.CollectionName); } DataRow dataRow = null; string text = null; bool flag = false; bool flag2 = false; bool flag3 = false; foreach (DataRow row in obj.Rows) { string text2 = row[dataColumn, DataRowVersion.Current] as string; if (string.IsNullOrEmpty(text2)) { throw ADP.InvalidXmlInvalidValue(DbMetaDataCollectionNames.MetaDataCollections, DbMetaDataColumnNames.CollectionName); } if (!ADP.CompareInsensitiveInvariant(text2, collectionName)) { continue; } if (!SupportedByCurrentVersion(row)) { flag = true; } else if (collectionName == text2) { if (flag2) { throw ADP.CollectionNameIsNotUnique(collectionName); } dataRow = row; text = text2; flag2 = true; } else { if (text != null) { flag3 = true; } dataRow = row; text = text2; } } if (dataRow == null) { if (!flag) { throw ADP.UndefinedCollection(collectionName); } throw ADP.UnsupportedVersion(collectionName); } if (!flag2 && flag3) { throw ADP.AmbigousCollectionName(collectionName); } return dataRow; } private void FixUpVersion(DataTable dataSourceInfoTable) { DataColumn dataColumn = dataSourceInfoTable.Columns["DataSourceProductVersion"]; DataColumn dataColumn2 = dataSourceInfoTable.Columns["DataSourceProductVersionNormalized"]; if (dataColumn == null || dataColumn2 == null) { throw ADP.MissingDataSourceInformationColumn(); } if (dataSourceInfoTable.Rows.Count != 1) { throw ADP.IncorrectNumberOfDataSourceInformationRows(); } DataRow dataRow = dataSourceInfoTable.Rows[0]; dataRow[dataColumn] = _serverVersionString; dataRow[dataColumn2] = _normalizedServerVersion; dataRow.AcceptChanges(); } private string GetParameterName(string neededCollectionName, int neededRestrictionNumber) { DataTable dataTable = null; DataColumnCollection dataColumnCollection = null; DataColumn dataColumn = null; DataColumn dataColumn2 = null; DataColumn dataColumn3 = null; DataColumn dataColumn4 = null; string text = null; dataTable = _metaDataCollectionsDataSet.Tables[DbMetaDataCollectionNames.Restrictions]; if (dataTable != null) { dataColumnCollection = dataTable.Columns; if (dataColumnCollection != null) { dataColumn = dataColumnCollection["CollectionName"]; dataColumn2 = dataColumnCollection["ParameterName"]; dataColumn3 = dataColumnCollection["RestrictionName"]; dataColumn4 = dataColumnCollection["RestrictionNumber"]; } } if (dataColumn2 == null || dataColumn == null || dataColumn3 == null || dataColumn4 == null) { throw ADP.MissingRestrictionColumn(); } foreach (DataRow row in dataTable.Rows) { if ((string)row[dataColumn] == neededCollectionName && (int)row[dataColumn4] == neededRestrictionNumber && SupportedByCurrentVersion(row)) { text = (string)row[dataColumn2]; break; } } if (text == null) { throw ADP.MissingRestrictionRow(); } return text; } public virtual DataTable GetSchema(DbConnection connection, string collectionName, string[] restrictions) { DataTable dataTable = _metaDataCollectionsDataSet.Tables[DbMetaDataCollectionNames.MetaDataCollections]; DataColumn column = dataTable.Columns["PopulationMechanism"]; DataColumn column2 = dataTable.Columns[DbMetaDataColumnNames.CollectionName]; DataRow dataRow = null; DataTable dataTable2 = null; string text = null; dataRow = FindMetaDataCollectionRow(collectionName); text = dataRow[column2, DataRowVersion.Current] as string; if (!ADP.IsEmptyArray(restrictions)) { for (int i = 0; i < restrictions.Length; i++) { if (restrictions[i] != null && restrictions[i].Length > 4096) { throw ADP.NotSupported(); } } } string text2 = dataRow[column, DataRowVersion.Current] as string; switch (text2) { case "DataTable": { string[] hiddenColumnNames = ((!(text == DbMetaDataCollectionNames.MetaDataCollections)) ? null : new string[2] { "PopulationMechanism", "PopulationString" }); if (!ADP.IsEmptyArray(restrictions)) { throw ADP.TooManyRestrictions(text); } dataTable2 = CloneAndFilterCollection(text, hiddenColumnNames); if (text == DbMetaDataCollectionNames.DataSourceInformation) { FixUpVersion(dataTable2); } break; } case "SQLCommand": dataTable2 = ExecuteCommand(dataRow, restrictions, connection); break; case "PrepareCollection": dataTable2 = PrepareCollection(text, restrictions, connection); break; default: throw ADP.UndefinedPopulationMechanism(text2); } return dataTable2; } private bool IncludeThisColumn(DataColumn sourceColumn, string[] hiddenColumnNames) { bool result = true; string columnName = sourceColumn.ColumnName; if (columnName == "MinimumVersion" || columnName == "MaximumVersion") { result = false; } else if (hiddenColumnNames != null) { for (int i = 0; i < hiddenColumnNames.Length; i++) { if (hiddenColumnNames[i] == columnName) { result = false; break; } } } return result; } private void LoadDataSetFromXml(Stream XmlStream) { _metaDataCollectionsDataSet = new DataSet(); _metaDataCollectionsDataSet.Locale = CultureInfo.InvariantCulture; _metaDataCollectionsDataSet.ReadXml(XmlStream); } protected virtual DataTable PrepareCollection(string collectionName, string[] restrictions, DbConnection connection) { throw ADP.NotSupported(); } private bool SupportedByCurrentVersion(DataRow requestedCollectionRow) { bool flag = true; DataColumnCollection columns = requestedCollectionRow.Table.Columns; DataColumn dataColumn = columns["MinimumVersion"]; if (dataColumn != null) { object obj = requestedCollectionRow[dataColumn]; if (obj != null && obj != DBNull.Value && 0 > string.Compare(_normalizedServerVersion, (string)obj, StringComparison.OrdinalIgnoreCase)) { flag = false; } } if (flag) { dataColumn = columns["MaximumVersion"]; if (dataColumn != null) { object obj = requestedCollectionRow[dataColumn]; if (obj != null && obj != DBNull.Value && 0 < string.Compare(_normalizedServerVersion, (string)obj, StringComparison.OrdinalIgnoreCase)) { flag = false; } } } return flag; } } internal abstract class DbReferenceCollection { private struct CollectionEntry { private int _tag; private WeakReference _weak; public bool HasTarget { get { if (_tag != 0) { return _weak.IsAlive; } return false; } } public int Tag => _tag; public object Target { get { if (_tag != 0) { return _weak.Target; } return null; } } public void NewTarget(int tag, object target) { if (_weak == null) { _weak = new WeakReference(target, trackResurrection: false); } else { _weak.Target = target; } _tag = tag; } public void RemoveTarget() { _tag = 0; } } private const int LockPollTime = 100; private const int DefaultCollectionSize = 20; private CollectionEntry[] _items; private readonly object _itemLock; private int _optimisticCount; private int _lastItemIndex; private volatile bool _isNotifying; protected DbReferenceCollection() { _items = new CollectionEntry[20]; _itemLock = new object(); _optimisticCount = 0; _lastItemIndex = 0; } public abstract void Add(object value, int tag); protected void AddItem(object value, int tag) { bool flag = false; lock (_itemLock) { for (int i = 0; i <= _lastItemIndex; i++) { if (_items[i].Tag == 0) { _items[i].NewTarget(tag, value); flag = true; break; } } if (!flag && _lastItemIndex + 1 < _items.Length) { _lastItemIndex++; _items[_lastItemIndex].NewTarget(tag, value); flag = true; } if (!flag) { for (int j = 0; j <= _lastItemIndex; j++) { if (!_items[j].HasTarget) { _items[j].NewTarget(tag, value); flag = true; break; } } } if (!flag) { Array.Resize(ref _items, _items.Length * 2); _lastItemIndex++; _items[_lastItemIndex].NewTarget(tag, value); } _optimisticCount++; } } internal T FindItem(int tag, Func filterMethod) where T : class { bool lockObtained = false; try { TryEnterItemLock(ref lockObtained); if (lockObtained && _optimisticCount > 0) { for (int i = 0; i <= _lastItemIndex; i++) { if (_items[i].Tag == tag) { object target = _items[i].Target; if (target != null && target is T val && filterMethod(val)) { return val; } } } } } finally { ExitItemLockIfNeeded(lockObtained); } return null; } public void Notify(int message) { bool lockObtained = false; try { TryEnterItemLock(ref lockObtained); if (!lockObtained) { return; } try { _isNotifying = true; if (_optimisticCount > 0) { for (int i = 0; i <= _lastItemIndex; i++) { object target = _items[i].Target; if (target != null) { NotifyItem(message, _items[i].Tag, target); _items[i].RemoveTarget(); } } _optimisticCount = 0; } if (_items.Length > 100) { _lastItemIndex = 0; _items = new CollectionEntry[20]; } } finally { _isNotifying = false; } } finally { ExitItemLockIfNeeded(lockObtained); } } protected abstract void NotifyItem(int message, int tag, object value); public abstract void Remove(object value); protected void RemoveItem(object value) { bool lockObtained = false; try { TryEnterItemLock(ref lockObtained); if (!lockObtained || _optimisticCount <= 0) { return; } for (int i = 0; i <= _lastItemIndex; i++) { if (value == _items[i].Target) { _items[i].RemoveTarget(); _optimisticCount--; break; } } } finally { ExitItemLockIfNeeded(lockObtained); } } private void TryEnterItemLock(ref bool lockObtained) { lockObtained = false; while (!_isNotifying && !lockObtained) { Monitor.TryEnter(_itemLock, 100, ref lockObtained); } } private void ExitItemLockIfNeeded(bool lockObtained) { if (lockObtained) { Monitor.Exit(_itemLock); } } } internal class TimeoutTimer { private long _timerExpire; private bool _isInfiniteTimeout; internal static readonly long InfiniteTimeout; internal bool IsExpired { get { if (!IsInfinite) { return ADP.TimerHasExpired(_timerExpire); } return false; } } internal bool IsInfinite => _isInfiniteTimeout; internal long LegacyTimerExpire { get { if (!_isInfiniteTimeout) { return _timerExpire; } return long.MaxValue; } } internal long MillisecondsRemaining { get { long num; if (_isInfiniteTimeout) { num = long.MaxValue; } else { num = ADP.TimerRemainingMilliseconds(_timerExpire); if (0 > num) { num = 0L; } } return num; } } internal static TimeoutTimer StartSecondsTimeout(int seconds) { TimeoutTimer timeoutTimer = new TimeoutTimer(); timeoutTimer.SetTimeoutSeconds(seconds); return timeoutTimer; } internal static TimeoutTimer StartMillisecondsTimeout(long milliseconds) { return new TimeoutTimer { _timerExpire = checked(ADP.TimerCurrent() + milliseconds * 10000), _isInfiniteTimeout = false }; } internal void SetTimeoutSeconds(int seconds) { if (InfiniteTimeout == seconds) { _isInfiniteTimeout = true; return; } _timerExpire = checked(ADP.TimerCurrent() + ADP.TimerFromSeconds(seconds)); _isInfiniteTimeout = false; } } } namespace System.Data.Common { internal static class ADP { internal enum InternalErrorCode { UnpooledObjectHasOwner = 0, UnpooledObjectHasWrongOwner = 1, PushingObjectSecondTime = 2, PooledObjectHasOwner = 3, PooledObjectInPoolMoreThanOnce = 4, CreateObjectReturnedNull = 5, NewObjectCannotBePooled = 6, NonPooledObjectUsedMoreThanOnce = 7, AttemptingToPoolOnRestrictedToken = 8, ConvertSidToStringSidWReturnedNull = 10, AttemptingToConstructReferenceCollectionOnStaticObject = 12, AttemptingToEnlistTwice = 13, CreateReferenceCollectionReturnedNull = 14, PooledObjectWithoutPool = 15, UnexpectedWaitAnyResult = 16, SynchronousConnectReturnedPending = 17, CompletedConnectReturnedPending = 18, NameValuePairNext = 20, InvalidParserState1 = 21, InvalidParserState2 = 22, InvalidParserState3 = 23, InvalidBuffer = 30, UnimplementedSMIMethod = 40, InvalidSmiCall = 41, SqlDependencyObtainProcessDispatcherFailureObjectHandle = 50, SqlDependencyProcessDispatcherFailureCreateInstance = 51, SqlDependencyProcessDispatcherFailureAppDomain = 52, SqlDependencyCommandHashIsNotAssociatedWithNotification = 53, UnknownTransactionFailure = 60 } internal enum ConnectionError { BeginGetConnectionReturnsNull, GetConnectionReturnsNull, ConnectionOptionsMissing, CouldNotSwitchToClosedPreviouslyOpenedState } private static Task _trueTask; private static Task _falseTask; internal const CompareOptions DefaultCompareOptions = CompareOptions.IgnoreCase | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth; internal const int DefaultConnectionTimeout = 15; private static readonly Type s_stackOverflowType = typeof(StackOverflowException); private static readonly Type s_outOfMemoryType = typeof(OutOfMemoryException); private static readonly Type s_threadAbortType = typeof(ThreadAbortException); private static readonly Type s_nullReferenceType = typeof(NullReferenceException); private static readonly Type s_accessViolationType = typeof(AccessViolationException); private static readonly Type s_securityType = typeof(SecurityException); internal static readonly bool IsWindowsNT = PlatformID.Win32NT == Environment.OSVersion.Platform; internal static readonly bool IsPlatformNT5 = IsWindowsNT && Environment.OSVersion.Version.Major >= 5; internal const string ConnectionString = "ConnectionString"; internal const string DataSetColumn = "DataSetColumn"; internal const string DataSetTable = "DataSetTable"; internal const string Fill = "Fill"; internal const string FillSchema = "FillSchema"; internal const string SourceColumn = "SourceColumn"; internal const string SourceTable = "SourceTable"; internal const string Parameter = "Parameter"; internal const string ParameterName = "ParameterName"; internal const string ParameterSetPosition = "set_Position"; internal const int DefaultCommandTimeout = 30; internal const float FailoverTimeoutStep = 0.08f; internal static readonly string StrEmpty = ""; internal const int CharSize = 2; private static Version s_systemDataVersion; internal static readonly string[] AzureSqlServerEndpoints = new string[4] { SR.GetString(".database.windows.net"), SR.GetString(".database.cloudapi.de"), SR.GetString(".database.usgovcloudapi.net"), SR.GetString(".database.chinacloudapi.cn") }; internal const int DecimalMaxPrecision = 29; internal const int DecimalMaxPrecision28 = 28; internal static readonly IntPtr PtrZero = new IntPtr(0); internal static readonly int PtrSize = IntPtr.Size; internal const string BeginTransaction = "BeginTransaction"; internal const string ChangeDatabase = "ChangeDatabase"; internal const string CommitTransaction = "CommitTransaction"; internal const string CommandTimeout = "CommandTimeout"; internal const string DeriveParameters = "DeriveParameters"; internal const string ExecuteReader = "ExecuteReader"; internal const string ExecuteNonQuery = "ExecuteNonQuery"; internal const string ExecuteScalar = "ExecuteScalar"; internal const string GetSchema = "GetSchema"; internal const string GetSchemaTable = "GetSchemaTable"; internal const string Prepare = "Prepare"; internal const string RollbackTransaction = "RollbackTransaction"; internal const string QuoteIdentifier = "QuoteIdentifier"; internal const string UnquoteIdentifier = "UnquoteIdentifier"; internal static Task TrueTask => _trueTask ?? (_trueTask = Task.FromResult(result: true)); internal static Task FalseTask => _falseTask ?? (_falseTask = Task.FromResult(result: false)); private static void TraceException(string trace, Exception e) { if (e != null) { DataCommonEventSource.Log.Trace(trace, e); } } internal static void TraceExceptionAsReturnValue(Exception e) { TraceException(" '{0}'", e); } internal static void TraceExceptionWithoutRethrow(Exception e) { TraceException(" '%ls'\n", e); } internal static ArgumentException Argument(string error) { ArgumentException ex = new ArgumentException(error); TraceExceptionAsReturnValue(ex); return ex; } internal static ArgumentException Argument(string error, Exception inner) { ArgumentException ex = new ArgumentException(error, inner); TraceExceptionAsReturnValue(ex); return ex; } internal static ArgumentException Argument(string error, string parameter) { ArgumentException ex = new ArgumentException(error, parameter); TraceExceptionAsReturnValue(ex); return ex; } internal static ArgumentNullException ArgumentNull(string parameter) { ArgumentNullException ex = new ArgumentNullException(parameter); TraceExceptionAsReturnValue(ex); return ex; } internal static ArgumentNullException ArgumentNull(string parameter, string error) { ArgumentNullException ex = new ArgumentNullException(parameter, error); TraceExceptionAsReturnValue(ex); return ex; } internal static ArgumentOutOfRangeException ArgumentOutOfRange(string parameterName) { ArgumentOutOfRangeException ex = new ArgumentOutOfRangeException(parameterName); TraceExceptionAsReturnValue(ex); return ex; } internal static ArgumentOutOfRangeException ArgumentOutOfRange(string message, string parameterName) { ArgumentOutOfRangeException ex = new ArgumentOutOfRangeException(parameterName, message); TraceExceptionAsReturnValue(ex); return ex; } internal static IndexOutOfRangeException IndexOutOfRange(string error) { IndexOutOfRangeException ex = new IndexOutOfRangeException(error); TraceExceptionAsReturnValue(ex); return ex; } internal static InvalidCastException InvalidCast(string error) { return InvalidCast(error, null); } internal static InvalidCastException InvalidCast(string error, Exception inner) { InvalidCastException ex = new InvalidCastException(error, inner); TraceExceptionAsReturnValue(ex); return ex; } internal static InvalidOperationException InvalidOperation(string error) { InvalidOperationException ex = new InvalidOperationException(error); TraceExceptionAsReturnValue(ex); return ex; } internal static NotSupportedException NotSupported() { NotSupportedException ex = new NotSupportedException(); TraceExceptionAsReturnValue(ex); return ex; } internal static NotSupportedException NotSupported(string error) { NotSupportedException ex = new NotSupportedException(error); TraceExceptionAsReturnValue(ex); return ex; } internal static bool RemoveStringQuotes(string quotePrefix, string quoteSuffix, string quotedString, out string unquotedString) { int num = quotePrefix?.Length ?? 0; int num2 = quoteSuffix?.Length ?? 0; if (num2 + num == 0) { unquotedString = quotedString; return true; } if (quotedString == null) { unquotedString = quotedString; return false; } int length = quotedString.Length; if (length < num + num2) { unquotedString = quotedString; return false; } if (num > 0 && !quotedString.StartsWith(quotePrefix, StringComparison.Ordinal)) { unquotedString = quotedString; return false; } if (num2 > 0) { if (!quotedString.EndsWith(quoteSuffix, StringComparison.Ordinal)) { unquotedString = quotedString; return false; } unquotedString = quotedString.Substring(num, length - (num + num2)).Replace(quoteSuffix + quoteSuffix, quoteSuffix); } else { unquotedString = quotedString.Substring(num, length - num); } return true; } internal static ArgumentOutOfRangeException NotSupportedEnumerationValue(Type type, string value, string method) { return ArgumentOutOfRange(SR.Format("The {0} enumeration value, {1}, is not supported by the {2} method.", type.Name, value, method), type.Name); } internal static InvalidOperationException DataAdapter(string error) { return InvalidOperation(error); } private static InvalidOperationException Provider(string error) { return InvalidOperation(error); } internal static ArgumentException InvalidMultipartName(string property, string value) { ArgumentException ex = new ArgumentException(SR.Format("{0} \"{1}\".", property, value)); TraceExceptionAsReturnValue(ex); return ex; } internal static ArgumentException InvalidMultipartNameIncorrectUsageOfQuotes(string property, string value) { ArgumentException ex = new ArgumentException(SR.Format("{0} \"{1}\", incorrect usage of quotes.", property, value)); TraceExceptionAsReturnValue(ex); return ex; } internal static ArgumentException InvalidMultipartNameToManyParts(string property, string value, int limit) { ArgumentException ex = new ArgumentException(SR.Format("{0} \"{1}\", the current limit of \"{2}\" is insufficient.", property, value, limit)); TraceExceptionAsReturnValue(ex); return ex; } internal static void CheckArgumentNull(object value, string parameterName) { if (value == null) { throw ArgumentNull(parameterName); } } internal static bool IsCatchableExceptionType(Exception e) { Type type = e.GetType(); if (type != s_stackOverflowType && type != s_outOfMemoryType && type != s_threadAbortType && type != s_nullReferenceType && type != s_accessViolationType) { return !s_securityType.IsAssignableFrom(type); } return false; } internal static bool IsCatchableOrSecurityExceptionType(Exception e) { Type type = e.GetType(); if (type != s_stackOverflowType && type != s_outOfMemoryType && type != s_threadAbortType && type != s_nullReferenceType) { return type != s_accessViolationType; } return false; } internal static ArgumentOutOfRangeException InvalidEnumerationValue(Type type, int value) { return ArgumentOutOfRange(SR.Format("The {0} enumeration value, {1}, is invalid.", type.Name, value.ToString(CultureInfo.InvariantCulture)), type.Name); } internal static ArgumentException ConnectionStringSyntax(int index) { return Argument(SR.Format("Format of the initialization string does not conform to specification starting at index {0}.", index)); } internal static ArgumentException KeywordNotSupported(string keyword) { return Argument(SR.Format("Keyword not supported: '{0}'.", keyword)); } internal static ArgumentException ConvertFailed(Type fromType, Type toType, Exception innerException) { return Argument(SR.Format(" Cannot convert object of type '{0}' to object of type '{1}'.", fromType.FullName, toType.FullName), innerException); } internal static Exception InvalidConnectionOptionValue(string key) { return InvalidConnectionOptionValue(key, null); } internal static Exception InvalidConnectionOptionValue(string key, Exception inner) { return Argument(SR.Format("Invalid value for key '{0}'.", key), inner); } internal static ArgumentException CollectionRemoveInvalidObject(Type itemType, ICollection collection) { return Argument(SR.Format("Attempted to remove an {0} that is not contained by this {1}.", itemType.Name, collection.GetType().Name)); } internal static ArgumentNullException CollectionNullValue(string parameter, Type collection, Type itemType) { return ArgumentNull(parameter, SR.Format("The {0} only accepts non-null {1} type objects.", collection.Name, itemType.Name)); } internal static IndexOutOfRangeException CollectionIndexInt32(int index, Type collection, int count) { return IndexOutOfRange(SR.Format("Invalid index {0} for this {1} with Count={2}.", index.ToString(CultureInfo.InvariantCulture), collection.Name, count.ToString(CultureInfo.InvariantCulture))); } internal static IndexOutOfRangeException CollectionIndexString(Type itemType, string propertyName, string propertyValue, Type collection) { return IndexOutOfRange(SR.Format("An {0} with {1} '{2}' is not contained by this {3}.", itemType.Name, propertyName, propertyValue, collection.Name)); } internal static InvalidCastException CollectionInvalidType(Type collection, Type itemType, object invalidValue) { return InvalidCast(SR.Format("The {0} only accepts non-null {1} type objects, not {2} objects.", collection.Name, itemType.Name, invalidValue.GetType().Name)); } private static string ConnectionStateMsg(ConnectionState state) { switch (state) { case ConnectionState.Closed: case ConnectionState.Connecting | ConnectionState.Broken: return "The connection's current state is closed."; case ConnectionState.Connecting: return "The connection's current state is connecting."; case ConnectionState.Open: return "The connection's current state is open."; case ConnectionState.Open | ConnectionState.Executing: return "The connection's current state is executing."; case ConnectionState.Open | ConnectionState.Fetching: return "The connection's current state is fetching."; default: return SR.Format("The connection's current state: {0}.", state.ToString()); } } internal static Exception StreamClosed([CallerMemberName] string method = "") { return InvalidOperation(SR.Format("Invalid attempt to {0} when stream is closed.", method)); } internal static string BuildQuotedString(string quotePrefix, string quoteSuffix, string unQuotedString) { StringBuilder stringBuilder = new StringBuilder(); if (!string.IsNullOrEmpty(quotePrefix)) { stringBuilder.Append(quotePrefix); } if (!string.IsNullOrEmpty(quoteSuffix)) { stringBuilder.Append(unQuotedString.Replace(quoteSuffix, quoteSuffix + quoteSuffix)); stringBuilder.Append(quoteSuffix); } else { stringBuilder.Append(unQuotedString); } return stringBuilder.ToString(); } internal static ArgumentException ParametersIsNotParent(Type parameterType, ICollection collection) { return Argument(SR.Format("The {0} is already contained by another {1}.", parameterType.Name, collection.GetType().Name)); } internal static ArgumentException ParametersIsParent(Type parameterType, ICollection collection) { return Argument(SR.Format("The {0} is already contained by another {1}.", parameterType.Name, collection.GetType().Name)); } internal static Exception InternalError(InternalErrorCode internalError) { return InvalidOperation(SR.Format("Internal .Net Framework Data Provider error {0}.", (int)internalError)); } internal static Exception DataReaderClosed([CallerMemberName] string method = "") { return InvalidOperation(SR.Format("Invalid attempt to call {0} when reader is closed.", method)); } internal static ArgumentOutOfRangeException InvalidSourceBufferIndex(int maxLen, long srcOffset, string parameterName) { return ArgumentOutOfRange(SR.Format("Invalid source buffer (size of {0}) offset: {1}", maxLen.ToString(CultureInfo.InvariantCulture), srcOffset.ToString(CultureInfo.InvariantCulture)), parameterName); } internal static ArgumentOutOfRangeException InvalidDestinationBufferIndex(int maxLen, int dstOffset, string parameterName) { return ArgumentOutOfRange(SR.Format("Invalid destination buffer (size of {0}) offset: {1}", maxLen.ToString(CultureInfo.InvariantCulture), dstOffset.ToString(CultureInfo.InvariantCulture)), parameterName); } internal static IndexOutOfRangeException InvalidBufferSizeOrIndex(int numBytes, int bufferIndex) { return IndexOutOfRange(SR.Format("Buffer offset '{1}' plus the bytes available '{0}' is greater than the length of the passed in buffer.", numBytes.ToString(CultureInfo.InvariantCulture), bufferIndex.ToString(CultureInfo.InvariantCulture))); } internal static Exception InvalidDataLength(long length) { return IndexOutOfRange(SR.Format("Data length '{0}' is less than 0.", length.ToString(CultureInfo.InvariantCulture))); } internal static bool CompareInsensitiveInvariant(string strvalue, string strconst) { return CultureInfo.InvariantCulture.CompareInfo.Compare(strvalue, strconst, CompareOptions.IgnoreCase) == 0; } internal static int DstCompare(string strA, string strB) { return CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.IgnoreCase | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth); } internal static bool IsEmptyArray(string[] array) { if (array != null) { return array.Length == 0; } return true; } internal static bool IsNull(object value) { if (value == null || DBNull.Value == value) { return true; } if (value is INullable nullable) { return nullable.IsNull; } return false; } internal static Exception InvalidSeekOrigin(string parameterName) { return ArgumentOutOfRange("Specified SeekOrigin value is invalid.", parameterName); } internal static void SetCurrentTransaction(Transaction transaction) { Transaction.Current = transaction; } internal static Task CreatedTaskWithCancellation() { return Task.FromCanceled(new CancellationToken(canceled: true)); } internal static void TraceExceptionForCapture(Exception e) { TraceException(" '{0}'", e); } internal static DataException Data(string message) { DataException ex = new DataException(message); TraceExceptionAsReturnValue(ex); return ex; } internal static void CheckArgumentLength(string value, string parameterName) { CheckArgumentNull(value, parameterName); if (value.Length == 0) { throw Argument(SR.Format("Expecting non-empty string for '{0}' parameter.", parameterName)); } } internal static void CheckArgumentLength(Array value, string parameterName) { CheckArgumentNull(value, parameterName); if (value.Length == 0) { throw Argument(SR.Format("Expecting non-empty array for '{0}' parameter.", parameterName)); } } internal static ArgumentOutOfRangeException InvalidAcceptRejectRule(AcceptRejectRule value) { return InvalidEnumerationValue(typeof(AcceptRejectRule), (int)value); } internal static ArgumentOutOfRangeException InvalidCatalogLocation(CatalogLocation value) { return InvalidEnumerationValue(typeof(CatalogLocation), (int)value); } internal static ArgumentOutOfRangeException InvalidConflictOptions(ConflictOption value) { return InvalidEnumerationValue(typeof(ConflictOption), (int)value); } internal static ArgumentOutOfRangeException InvalidDataRowState(DataRowState value) { return InvalidEnumerationValue(typeof(DataRowState), (int)value); } internal static ArgumentOutOfRangeException InvalidKeyRestrictionBehavior(KeyRestrictionBehavior value) { return InvalidEnumerationValue(typeof(KeyRestrictionBehavior), (int)value); } internal static ArgumentOutOfRangeException InvalidLoadOption(LoadOption value) { return InvalidEnumerationValue(typeof(LoadOption), (int)value); } internal static ArgumentOutOfRangeException InvalidMissingMappingAction(MissingMappingAction value) { return InvalidEnumerationValue(typeof(MissingMappingAction), (int)value); } internal static ArgumentOutOfRangeException InvalidMissingSchemaAction(MissingSchemaAction value) { return InvalidEnumerationValue(typeof(MissingSchemaAction), (int)value); } internal static ArgumentOutOfRangeException InvalidRule(Rule value) { return InvalidEnumerationValue(typeof(Rule), (int)value); } internal static ArgumentOutOfRangeException InvalidSchemaType(SchemaType value) { return InvalidEnumerationValue(typeof(SchemaType), (int)value); } internal static ArgumentOutOfRangeException InvalidStatementType(StatementType value) { return InvalidEnumerationValue(typeof(StatementType), (int)value); } internal static ArgumentOutOfRangeException InvalidUpdateStatus(UpdateStatus value) { return InvalidEnumerationValue(typeof(UpdateStatus), (int)value); } internal static ArgumentOutOfRangeException NotSupportedStatementType(StatementType value, string method) { return NotSupportedEnumerationValue(typeof(StatementType), value.ToString(), method); } internal static ArgumentException InvalidKeyname(string parameterName) { return Argument("Invalid keyword, contain one or more of 'no characters', 'control characters', 'leading or trailing whitespace' or 'leading semicolons'.", parameterName); } internal static ArgumentException InvalidValue(string parameterName) { return Argument("The value contains embedded nulls (\\\\u0000).", parameterName); } internal static Exception WrongType(Type got, Type expected) { return Argument(SR.Format("Expecting argument of type {1}, but received type {0}.", got.ToString(), expected.ToString())); } internal static Exception CollectionUniqueValue(Type itemType, string propertyName, string propertyValue) { return Argument(SR.Format("The {0}.{1} is required to be unique, '{2}' already exists in the collection.", itemType.Name, propertyName, propertyValue)); } internal static InvalidOperationException MissingSelectCommand(string method) { return Provider(SR.Format("The SelectCommand property has not been initialized before calling '{0}'.", method)); } private static InvalidOperationException DataMapping(string error) { return InvalidOperation(error); } internal static InvalidOperationException ColumnSchemaExpression(string srcColumn, string cacheColumn) { return DataMapping(SR.Format("The column mapping from SourceColumn '{0}' failed because the DataColumn '{1}' is a computed column.", srcColumn, cacheColumn)); } internal static InvalidOperationException ColumnSchemaMismatch(string srcColumn, Type srcType, DataColumn column) { return DataMapping(SR.Format("Inconvertible type mismatch between SourceColumn '{0}' of {1} and the DataColumn '{2}' of {3}.", srcColumn, srcType.Name, column.ColumnName, column.DataType.Name)); } internal static InvalidOperationException ColumnSchemaMissing(string cacheColumn, string tableName, string srcColumn) { if (string.IsNullOrEmpty(tableName)) { return InvalidOperation(SR.Format("Missing the DataColumn '{0}' for the SourceColumn '{2}'.", cacheColumn, tableName, srcColumn)); } return DataMapping(SR.Format("Missing the DataColumn '{0}' in the DataTable '{1}' for the SourceColumn '{2}'.", cacheColumn, tableName, srcColumn)); } internal static InvalidOperationException MissingColumnMapping(string srcColumn) { return DataMapping(SR.Format("Missing SourceColumn mapping for '{0}'.", srcColumn)); } internal static InvalidOperationException MissingTableSchema(string cacheTable, string srcTable) { return DataMapping(SR.Format("Missing the '{0}' DataTable for the '{1}' SourceTable.", cacheTable, srcTable)); } internal static InvalidOperationException MissingTableMapping(string srcTable) { return DataMapping(SR.Format("Missing SourceTable mapping: '{0}'", srcTable)); } internal static InvalidOperationException MissingTableMappingDestination(string dstTable) { return DataMapping(SR.Format("Missing TableMapping when TableMapping.DataSetTable='{0}'.", dstTable)); } internal static Exception InvalidSourceColumn(string parameter) { return Argument("SourceColumn is required to be a non-empty string.", parameter); } internal static Exception ColumnsAddNullAttempt(string parameter) { return CollectionNullValue(parameter, typeof(DataColumnMappingCollection), typeof(DataColumnMapping)); } internal static Exception ColumnsDataSetColumn(string cacheColumn) { return CollectionIndexString(typeof(DataColumnMapping), "DataSetColumn", cacheColumn, typeof(DataColumnMappingCollection)); } internal static Exception ColumnsIndexInt32(int index, IColumnMappingCollection collection) { return CollectionIndexInt32(index, collection.GetType(), collection.Count); } internal static Exception ColumnsIndexSource(string srcColumn) { return CollectionIndexString(typeof(DataColumnMapping), "SourceColumn", srcColumn, typeof(DataColumnMappingCollection)); } internal static Exception ColumnsIsNotParent(ICollection collection) { return ParametersIsNotParent(typeof(DataColumnMapping), collection); } internal static Exception ColumnsIsParent(ICollection collection) { return ParametersIsParent(typeof(DataColumnMapping), collection); } internal static Exception ColumnsUniqueSourceColumn(string srcColumn) { return CollectionUniqueValue(typeof(DataColumnMapping), "SourceColumn", srcColumn); } internal static Exception NotADataColumnMapping(object value) { return CollectionInvalidType(typeof(DataColumnMappingCollection), typeof(DataColumnMapping), value); } internal static Exception InvalidSourceTable(string parameter) { return Argument("SourceTable is required to be a non-empty string", parameter); } internal static Exception TablesAddNullAttempt(string parameter) { return CollectionNullValue(parameter, typeof(DataTableMappingCollection), typeof(DataTableMapping)); } internal static Exception TablesDataSetTable(string cacheTable) { return CollectionIndexString(typeof(DataTableMapping), "DataSetTable", cacheTable, typeof(DataTableMappingCollection)); } internal static Exception TablesIndexInt32(int index, ITableMappingCollection collection) { return CollectionIndexInt32(index, collection.GetType(), collection.Count); } internal static Exception TablesIsNotParent(ICollection collection) { return ParametersIsNotParent(typeof(DataTableMapping), collection); } internal static Exception TablesIsParent(ICollection collection) { return ParametersIsParent(typeof(DataTableMapping), collection); } internal static Exception TablesSourceIndex(string srcTable) { return CollectionIndexString(typeof(DataTableMapping), "SourceTable", srcTable, typeof(DataTableMappingCollection)); } internal static Exception TablesUniqueSourceTable(string srcTable) { return CollectionUniqueValue(typeof(DataTableMapping), "SourceTable", srcTable); } internal static Exception NotADataTableMapping(object value) { return CollectionInvalidType(typeof(DataTableMappingCollection), typeof(DataTableMapping), value); } internal static InvalidOperationException UpdateConnectionRequired(StatementType statementType, bool isRowUpdatingCommand) { string error; if (isRowUpdatingCommand) { error = "Update requires the command clone to have a connection object. The Connection property of the command clone has not been initialized."; } else { switch (statementType) { case StatementType.Insert: error = "Update requires the InsertCommand to have a connection object. The Connection property of the InsertCommand has not been initialized."; break; case StatementType.Update: error = "Update requires the UpdateCommand to have a connection object. The Connection property of the UpdateCommand has not been initialized."; break; case StatementType.Delete: error = "Update requires the DeleteCommand to have a connection object. The Connection property of the DeleteCommand has not been initialized."; break; case StatementType.Batch: error = "Update requires a connection object. The Connection property has not been initialized."; goto default; default: throw InvalidStatementType(statementType); } } return InvalidOperation(error); } internal static InvalidOperationException ConnectionRequired_Res(string method) { return InvalidOperation("ADP_ConnectionRequired_" + method); } internal static InvalidOperationException UpdateOpenConnectionRequired(StatementType statementType, bool isRowUpdatingCommand, ConnectionState state) { string resourceFormat = (isRowUpdatingCommand ? "Update requires the updating command to have an open connection object. {1}" : (statementType switch { StatementType.Insert => "Update requires the {0}Command to have an open connection object. {1}", StatementType.Update => "Update requires the {0}Command to have an open connection object. {1}", StatementType.Delete => "Update requires the {0}Command to have an open connection object. {1}", _ => throw InvalidStatementType(statementType), })); return InvalidOperation(SR.Format(resourceFormat, ConnectionStateMsg(state))); } internal static ArgumentException UnwantedStatementType(StatementType statementType) { return Argument(SR.Format("The StatementType {0} is not expected here.", statementType.ToString())); } internal static Exception FillSchemaRequiresSourceTableName(string parameter) { return Argument("FillSchema: expected a non-empty string for the SourceTable name.", parameter); } internal static Exception InvalidMaxRecords(string parameter, int max) { return Argument(SR.Format("The MaxRecords value of {0} is invalid; the value must be >= 0.", max.ToString(CultureInfo.InvariantCulture)), parameter); } internal static Exception InvalidStartRecord(string parameter, int start) { return Argument(SR.Format("The StartRecord value of {0} is invalid; the value must be >= 0.", start.ToString(CultureInfo.InvariantCulture)), parameter); } internal static Exception FillRequires(string parameter) { return ArgumentNull(parameter); } internal static Exception FillRequiresSourceTableName(string parameter) { return Argument("Fill: expected a non-empty string for the SourceTable name.", parameter); } internal static Exception FillChapterAutoIncrement() { return InvalidOperation("Hierarchical chapter columns must map to an AutoIncrement DataColumn."); } internal static InvalidOperationException MissingDataReaderFieldType(int index) { return DataAdapter(SR.Format("DataReader.GetFieldType({0}) returned null.", index)); } internal static InvalidOperationException OnlyOneTableForStartRecordOrMaxRecords() { return DataAdapter("Only specify one item in the dataTables array when using non-zero values for startRecords or maxRecords."); } internal static ArgumentNullException UpdateRequiresNonNullDataSet(string parameter) { return ArgumentNull(parameter); } internal static InvalidOperationException UpdateRequiresSourceTable(string defaultSrcTableName) { return InvalidOperation(SR.Format("Update unable to find TableMapping['{0}'] or DataTable '{0}'.", defaultSrcTableName)); } internal static InvalidOperationException UpdateRequiresSourceTableName(string srcTable) { return InvalidOperation(SR.Format("Update: expected a non-empty SourceTable name.", srcTable)); } internal static ArgumentNullException UpdateRequiresDataTable(string parameter) { return ArgumentNull(parameter); } internal static Exception UpdateConcurrencyViolation(StatementType statementType, int affected, int expected, DataRow[] dataRows) { DBConcurrencyException ex = new DBConcurrencyException(SR.Format(statementType switch { StatementType.Update => "Concurrency violation: the UpdateCommand affected {0} of the expected {1} records.", StatementType.Delete => "Concurrency violation: the DeleteCommand affected {0} of the expected {1} records.", StatementType.Batch => "Concurrency violation: the batched command affected {0} of the expected {1} records.", _ => throw InvalidStatementType(statementType), }, affected.ToString(CultureInfo.InvariantCulture), expected.ToString(CultureInfo.InvariantCulture)), null, dataRows); TraceExceptionAsReturnValue(ex); return ex; } internal static InvalidOperationException UpdateRequiresCommand(StatementType statementType, bool isRowUpdatingCommand) { string error = (isRowUpdatingCommand ? "Update requires the command clone to be valid." : (statementType switch { StatementType.Select => "Auto SQL generation during Update requires a valid SelectCommand.", StatementType.Insert => "Update requires a valid InsertCommand when passed DataRow collection with new rows.", StatementType.Update => "Update requires a valid UpdateCommand when passed DataRow collection with modified rows.", StatementType.Delete => "Update requires a valid DeleteCommand when passed DataRow collection with deleted rows.", _ => throw InvalidStatementType(statementType), })); return InvalidOperation(error); } internal static ArgumentException UpdateMismatchRowTable(int i) { return Argument(SR.Format("DataRow[{0}] is from a different DataTable than DataRow[0].", i.ToString(CultureInfo.InvariantCulture))); } internal static DataException RowUpdatedErrors() { return Data("RowUpdatedEvent: Errors occurred; no additional is information available."); } internal static DataException RowUpdatingErrors() { return Data("RowUpdatingEvent: Errors occurred; no additional is information available."); } internal static InvalidOperationException ResultsNotAllowedDuringBatch() { return DataAdapter("When batching, the command's UpdatedRowSource property value of UpdateRowSource.FirstReturnedRecord or UpdateRowSource.Both is invalid."); } internal static InvalidOperationException DynamicSQLJoinUnsupported() { return InvalidOperation("Dynamic SQL generation is not supported against multiple base tables."); } internal static InvalidOperationException DynamicSQLNoTableInfo() { return InvalidOperation("Dynamic SQL generation is not supported against a SelectCommand that does not return any base table information."); } internal static InvalidOperationException DynamicSQLNoKeyInfoDelete() { return InvalidOperation("Dynamic SQL generation for the DeleteCommand is not supported against a SelectCommand that does not return any key column information."); } internal static InvalidOperationException DynamicSQLNoKeyInfoUpdate() { return InvalidOperation("Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not return any key column information."); } internal static InvalidOperationException DynamicSQLNoKeyInfoRowVersionDelete() { return InvalidOperation("Dynamic SQL generation for the DeleteCommand is not supported against a SelectCommand that does not contain a row version column."); } internal static InvalidOperationException DynamicSQLNoKeyInfoRowVersionUpdate() { return InvalidOperation("Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not contain a row version column."); } internal static InvalidOperationException DynamicSQLNestedQuote(string name, string quote) { return InvalidOperation(SR.Format("Dynamic SQL generation not supported against table names '{0}' that contain the QuotePrefix or QuoteSuffix character '{1}'.", name, quote)); } internal static InvalidOperationException NoQuoteChange() { return InvalidOperation("The QuotePrefix and QuoteSuffix properties cannot be changed once an Insert, Update, or Delete command has been generated."); } internal static InvalidOperationException MissingSourceCommand() { return InvalidOperation("The DataAdapter.SelectCommand property needs to be initialized."); } internal static InvalidOperationException MissingSourceCommandConnection() { return InvalidOperation("The DataAdapter.SelectCommand.Connection property needs to be initialized;"); } internal static DataRow[] SelectAdapterRows(DataTable dataTable, bool sorted) { int num = 0; int num2 = 0; int num3 = 0; DataRowCollection rows = dataTable.Rows; IEnumerator enumerator = rows.GetEnumerator(); try { while (enumerator.MoveNext()) { switch (((DataRow)enumerator.Current).RowState) { case DataRowState.Added: num++; break; case DataRowState.Deleted: num2++; break; case DataRowState.Modified: num3++; break; } } } finally { IDisposable disposable = enumerator as IDisposable; if (disposable != null) { disposable.Dispose(); } } DataRow[] array = new DataRow[num + num2 + num3]; if (sorted) { num3 = num + num2; num2 = num; num = 0; foreach (DataRow item in rows) { switch (item.RowState) { case DataRowState.Added: array[num++] = item; break; case DataRowState.Deleted: array[num2++] = item; break; case DataRowState.Modified: array[num3++] = item; break; } } } else { int num4 = 0; foreach (DataRow item2 in rows) { if ((item2.RowState & (DataRowState.Added | DataRowState.Deleted | DataRowState.Modified)) != 0) { array[num4++] = item2; if (num4 == array.Length) { break; } } } } return array; } internal static void BuildSchemaTableInfoTableNames(string[] columnNameArray) { Dictionary dictionary = new Dictionary(columnNameArray.Length); int num = columnNameArray.Length; int num2 = columnNameArray.Length - 1; while (0 <= num2) { string text = columnNameArray[num2]; if (text != null && 0 < text.Length) { text = text.ToLower(CultureInfo.InvariantCulture); if (dictionary.TryGetValue(text, out var value)) { num = Math.Min(num, value); } dictionary[text] = num2; } else { columnNameArray[num2] = string.Empty; num = num2; } num2--; } int uniqueIndex = 1; for (int i = num; i < columnNameArray.Length; i++) { string text2 = columnNameArray[i]; if (text2.Length == 0) { columnNameArray[i] = "Column"; uniqueIndex = GenerateUniqueName(dictionary, ref columnNameArray[i], i, uniqueIndex); continue; } text2 = text2.ToLower(CultureInfo.InvariantCulture); if (i != dictionary[text2]) { GenerateUniqueName(dictionary, ref columnNameArray[i], i, 1); } } } private static int GenerateUniqueName(Dictionary hash, ref string columnName, int index, int uniqueIndex) { string text; while (true) { text = columnName + uniqueIndex.ToString(CultureInfo.InvariantCulture); string key = text.ToLower(CultureInfo.InvariantCulture); if (hash.TryAdd(key, index)) { break; } uniqueIndex++; } columnName = text; return uniqueIndex; } internal static int SrcCompare(string strA, string strB) { if (!(strA == strB)) { return 1; } return 0; } internal static Exception ExceptionWithStackTrace(Exception e) { try { throw e; } catch (Exception result) { return result; } } internal static IndexOutOfRangeException IndexOutOfRange(int value) { return new IndexOutOfRangeException(value.ToString(CultureInfo.InvariantCulture)); } internal static IndexOutOfRangeException IndexOutOfRange() { return new IndexOutOfRangeException(); } internal static TimeoutException TimeoutException(string error) { return new TimeoutException(error); } internal static InvalidOperationException InvalidOperation(string error, Exception inner) { return new InvalidOperationException(error, inner); } internal static OverflowException Overflow(string error) { return Overflow(error, null); } internal static OverflowException Overflow(string error, Exception inner) { return new OverflowException(error, inner); } internal static PlatformNotSupportedException DbTypeNotSupported(string dbType) { return new PlatformNotSupportedException(SR.GetString("Type {0} is not supported on this platform.", dbType)); } internal static InvalidCastException InvalidCast() { return new InvalidCastException(); } internal static IOException IO(string error) { return new IOException(error); } internal static IOException IO(string error, Exception inner) { return new IOException(error, inner); } internal static ObjectDisposedException ObjectDisposed(object instance) { return new ObjectDisposedException(instance.GetType().Name); } internal static Exception DataTableDoesNotExist(string collectionName) { return Argument(SR.GetString("The collection '{0}' is missing from the metadata XML.", collectionName)); } internal static InvalidOperationException MethodCalledTwice(string method) { return new InvalidOperationException(SR.GetString("The method '{0}' cannot be called more than once for the same execution.", method)); } internal static ArgumentOutOfRangeException InvalidCommandType(CommandType value) { return InvalidEnumerationValue(typeof(CommandType), (int)value); } internal static ArgumentOutOfRangeException InvalidIsolationLevel(IsolationLevel value) { return InvalidEnumerationValue(typeof(IsolationLevel), (int)value); } internal static ArgumentOutOfRangeException InvalidParameterDirection(ParameterDirection value) { return InvalidEnumerationValue(typeof(ParameterDirection), (int)value); } internal static Exception TooManyRestrictions(string collectionName) { return Argument(SR.GetString("More restrictions were provided than the requested schema ('{0}') supports.", collectionName)); } internal static ArgumentOutOfRangeException InvalidUpdateRowSource(UpdateRowSource value) { return InvalidEnumerationValue(typeof(UpdateRowSource), (int)value); } internal static ArgumentException InvalidMinMaxPoolSizeValues() { return Argument(SR.GetString("Invalid min or max pool size values, min pool size cannot be greater than the max pool size.")); } internal static InvalidOperationException NoConnectionString() { return InvalidOperation(SR.GetString("The ConnectionString property has not been initialized.")); } internal static Exception MethodNotImplemented([CallerMemberName] string methodName = "") { return System.NotImplemented.ByDesignWithMessage(methodName); } internal static Exception QueryFailed(string collectionName, Exception e) { return InvalidOperation(SR.GetString("Unable to build the '{0}' collection because execution of the SQL query failed. See the inner exception for details.", collectionName), e); } internal static Exception InvalidConnectionOptionValueLength(string key, int limit) { return Argument(SR.GetString("The value's length for key '{0}' exceeds it's limit of '{1}'.", key, limit)); } internal static Exception MissingConnectionOptionValue(string key, string requiredAdditionalKey) { return Argument(SR.GetString("Use of key '{0}' requires the key '{1}' to be present.", key, requiredAdditionalKey)); } internal static Exception PooledOpenTimeout() { return InvalidOperation(SR.GetString("Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.")); } internal static Exception NonPooledOpenTimeout() { return TimeoutException(SR.GetString("Timeout attempting to open the connection. The time period elapsed prior to attempting to open the connection has been exceeded. This may have occurred because of too many simultaneous non-pooled connection attempts.")); } internal static InvalidOperationException TransactionConnectionMismatch() { return Provider(SR.GetString("The transaction is either not associated with the current connection or has been completed.")); } internal static InvalidOperationException TransactionRequired(string method) { return Provider(SR.GetString("{0} requires the command to have a transaction when the connection assigned to the command is in a pending local transaction. The Transaction property of the command has not been initialized.", method)); } internal static Exception CommandTextRequired(string method) { return InvalidOperation(SR.GetString("{0}: CommandText property has not been initialized", method)); } internal static Exception NoColumns() { return Argument(SR.GetString("The schema table contains no columns.")); } internal static InvalidOperationException ConnectionRequired(string method) { return InvalidOperation(SR.GetString("{0}: Connection property has not been initialized.", method)); } internal static InvalidOperationException OpenConnectionRequired(string method, ConnectionState state) { return InvalidOperation(SR.GetString("{0} requires an open and available Connection. {1}", method, ConnectionStateMsg(state))); } internal static Exception OpenReaderExists() { return OpenReaderExists(null); } internal static Exception OpenReaderExists(Exception e) { return InvalidOperation(SR.GetString("There is already an open DataReader associated with this Command which must be closed first."), e); } internal static Exception NonSeqByteAccess(long badIndex, long currIndex, string method) { return InvalidOperation(SR.GetString("Invalid {2} attempt at dataIndex '{0}'. With CommandBehavior.SequentialAccess, you may only read from dataIndex '{1}' or greater.", badIndex.ToString(CultureInfo.InvariantCulture), currIndex.ToString(CultureInfo.InvariantCulture), method)); } internal static Exception InvalidXml() { return Argument(SR.GetString("The metadata XML is invalid.")); } internal static Exception NegativeParameter(string parameterName) { return InvalidOperation(SR.GetString("Invalid value for argument '{0}'. The value must be greater than or equal to 0.", parameterName)); } internal static Exception InvalidXmlMissingColumn(string collectionName, string columnName) { return Argument(SR.GetString("The metadata XML is invalid. The {0} collection must contain a {1} column and it must be a string column.", collectionName, columnName)); } internal static Exception InvalidMetaDataValue() { return Argument(SR.GetString("Invalid value for this metadata.")); } internal static InvalidOperationException NonSequentialColumnAccess(int badCol, int currCol) { return InvalidOperation(SR.GetString("Invalid attempt to read from column ordinal '{0}'. With CommandBehavior.SequentialAccess, you may only read from column ordinal '{1}' or greater.", badCol.ToString(CultureInfo.InvariantCulture), currCol.ToString(CultureInfo.InvariantCulture))); } internal static Exception InvalidXmlInvalidValue(string collectionName, string columnName) { return Argument(SR.GetString("The metadata XML is invalid. The {1} column of the {0} collection must contain a non-empty string.", collectionName, columnName)); } internal static Exception CollectionNameIsNotUnique(string collectionName) { return Argument(SR.GetString("There are multiple collections named '{0}'.", collectionName)); } internal static Exception InvalidCommandTimeout(int value, [CallerMemberName] string property = "") { return Argument(SR.GetString("Invalid CommandTimeout value {0}; the value must be >= 0.", value.ToString(CultureInfo.InvariantCulture)), property); } internal static Exception UninitializedParameterSize(int index, Type dataType) { return InvalidOperation(SR.GetString("{1}[{0}]: the Size property has an invalid size of 0.", index.ToString(CultureInfo.InvariantCulture), dataType.Name)); } internal static Exception UnableToBuildCollection(string collectionName) { return Argument(SR.GetString("Unable to build schema collection '{0}';", collectionName)); } internal static Exception PrepareParameterType(DbCommand cmd) { return InvalidOperation(SR.GetString("{0}.Prepare method requires all parameters to have an explicitly set type.", cmd.GetType().Name)); } internal static Exception UndefinedCollection(string collectionName) { return Argument(SR.GetString("The requested collection ({0}) is not defined.", collectionName)); } internal static Exception UnsupportedVersion(string collectionName) { return Argument(SR.GetString(" requested collection ({0}) is not supported by this version of the provider.", collectionName)); } internal static Exception AmbigousCollectionName(string collectionName) { return Argument(SR.GetString("The collection name '{0}' matches at least two collections with the same name but with different case, but does not match any of them exactly.", collectionName)); } internal static Exception PrepareParameterSize(DbCommand cmd) { return InvalidOperation(SR.GetString("{0}.Prepare method requires all variable length parameters to have an explicitly set non-zero Size.", cmd.GetType().Name)); } internal static Exception PrepareParameterScale(DbCommand cmd, string type) { return InvalidOperation(SR.GetString("{0}.Prepare method requires parameters of type '{1}' have an explicitly set Precision and Scale.", cmd.GetType().Name, type)); } internal static Exception MissingDataSourceInformationColumn() { return Argument(SR.GetString("One of the required DataSourceInformation tables columns is missing.")); } internal static Exception IncorrectNumberOfDataSourceInformationRows() { return Argument(SR.GetString("The DataSourceInformation table must contain exactly one row.")); } internal static Exception MismatchedAsyncResult(string expectedMethod, string gotMethod) { return InvalidOperation(SR.GetString("Mismatched end method call for asyncResult. Expected call to {0} but {1} was called instead.", expectedMethod, gotMethod)); } internal static Exception ClosedConnectionError() { return InvalidOperation(SR.GetString("Invalid operation. The connection is closed.")); } internal static Exception ConnectionAlreadyOpen(ConnectionState state) { return InvalidOperation(SR.GetString("The connection was not closed. {0}", ConnectionStateMsg(state))); } internal static Exception TransactionPresent() { return InvalidOperation(SR.GetString("Connection currently has transaction enlisted. Finish current transaction and retry.")); } internal static Exception LocalTransactionPresent() { return InvalidOperation(SR.GetString("Cannot enlist in the transaction because a local transaction is in progress on the connection. Finish local transaction and retry.")); } internal static Exception OpenConnectionPropertySet(string property, ConnectionState state) { return InvalidOperation(SR.GetString("Not allowed to change the '{0}' property. {1}", property, ConnectionStateMsg(state))); } internal static Exception EmptyDatabaseName() { return Argument(SR.GetString("Database cannot be null, the empty string, or string of only whitespace.")); } internal static Exception MissingRestrictionColumn() { return Argument(SR.GetString("One or more of the required columns of the restrictions collection is missing.")); } internal static Exception InternalConnectionError(ConnectionError internalError) { return InvalidOperation(SR.GetString("Internal DbConnection Error: {0}", (int)internalError)); } internal static Exception InvalidConnectRetryCountValue() { return Argument(SR.GetString("Invalid ConnectRetryCount value (should be 0-255).")); } internal static Exception MissingRestrictionRow() { return Argument(SR.GetString("A restriction exists for which there is no matching row in the restrictions collection.")); } internal static Exception InvalidConnectRetryIntervalValue() { return Argument(SR.GetString("Invalid ConnectRetryInterval value (should be 1-60).")); } internal static InvalidOperationException AsyncOperationPending() { return InvalidOperation(SR.GetString("Can not start another operation while there is an asynchronous operation pending.")); } internal static IOException ErrorReadingFromStream(Exception internalException) { return IO(SR.GetString("An error occurred while reading."), internalException); } internal static ArgumentException InvalidDataType(string typeName) { return Argument(SR.GetString("The parameter data type of {0} is invalid.", typeName)); } internal static ArgumentException UnknownDataType(Type dataType) { return Argument(SR.GetString("No mapping exists from object type {0} to a known managed provider native type.", dataType.FullName)); } internal static ArgumentException DbTypeNotSupported(DbType type, Type enumtype) { return Argument(SR.GetString("No mapping exists from DbType {0} to a known {1}.", type.ToString(), enumtype.Name)); } internal static ArgumentException InvalidOffsetValue(int value) { return Argument(SR.GetString("Invalid parameter Offset value '{0}'. The value must be greater than or equal to 0.", value.ToString(CultureInfo.InvariantCulture))); } internal static ArgumentException InvalidSizeValue(int value) { return Argument(SR.GetString("Invalid parameter Size value '{0}'. The value must be greater than or equal to 0.", value.ToString(CultureInfo.InvariantCulture))); } internal static ArgumentException ParameterValueOutOfRange(decimal value) { return Argument(SR.GetString("Parameter value '{0}' is out of range.", value.ToString((IFormatProvider?)null))); } internal static ArgumentException ParameterValueOutOfRange(SqlDecimal value) { return Argument(SR.GetString("Parameter value '{0}' is out of range.", value.ToString())); } internal static ArgumentException VersionDoesNotSupportDataType(string typeName) { return Argument(SR.GetString("The version of SQL Server in use does not support datatype '{0}'.", typeName)); } internal static Exception ParameterConversionFailed(object value, Type destType, Exception inner) { string @string = SR.GetString("Failed to convert parameter value from a {0} to a {1}.", value.GetType().Name, destType.Name); if (inner is ArgumentException) { return new ArgumentException(@string, inner); } if (inner is FormatException) { return new FormatException(@string, inner); } if (inner is InvalidCastException) { return new InvalidCastException(@string, inner); } if (inner is OverflowException) { return new OverflowException(@string, inner); } return inner; } internal static Exception ParametersMappingIndex(int index, DbParameterCollection collection) { return CollectionIndexInt32(index, collection.GetType(), collection.Count); } internal static Exception ParametersSourceIndex(string parameterName, DbParameterCollection collection, Type parameterType) { return CollectionIndexString(parameterType, "ParameterName", parameterName, collection.GetType()); } internal static Exception ParameterNull(string parameter, DbParameterCollection collection, Type parameterType) { return CollectionNullValue(parameter, collection.GetType(), parameterType); } internal static Exception UndefinedPopulationMechanism(string populationMechanism) { throw new NotImplementedException(); } internal static Exception InvalidParameterType(DbParameterCollection collection, Type parameterType, object invalidValue) { return CollectionInvalidType(collection.GetType(), parameterType, invalidValue); } internal static Exception ParallelTransactionsNotSupported(DbConnection obj) { return InvalidOperation(SR.GetString("{0} does not support parallel transactions.", obj.GetType().Name)); } internal static Exception TransactionZombied(DbTransaction obj) { return InvalidOperation(SR.GetString("This {0} has completed; it is no longer usable.", obj.GetType().Name)); } internal static Delegate FindBuilder(MulticastDelegate mcd) { if ((object)mcd != null) { Delegate[] invocationList = mcd.GetInvocationList(); foreach (Delegate @delegate in invocationList) { if (@delegate.Target is DbCommandBuilder) { return @delegate; } } } return null; } internal static void TimerCurrent(out long ticks) { ticks = DateTime.UtcNow.ToFileTimeUtc(); } internal static long TimerCurrent() { return DateTime.UtcNow.ToFileTimeUtc(); } internal static long TimerFromSeconds(int seconds) { checked { return unchecked((long)seconds) * 10000000L; } } internal static long TimerFromMilliseconds(long milliseconds) { return checked(milliseconds * 10000); } internal static bool TimerHasExpired(long timerExpire) { return TimerCurrent() > timerExpire; } internal static long TimerRemaining(long timerExpire) { long num = TimerCurrent(); return checked(timerExpire - num); } internal static long TimerRemainingMilliseconds(long timerExpire) { return TimerToMilliseconds(TimerRemaining(timerExpire)); } internal static long TimerRemainingSeconds(long timerExpire) { return TimerToSeconds(TimerRemaining(timerExpire)); } internal static long TimerToMilliseconds(long timerValue) { return timerValue / 10000; } private static long TimerToSeconds(long timerValue) { return timerValue / 10000000; } internal static string MachineName() { return Environment.MachineName; } internal static Transaction GetCurrentTransaction() { return Transaction.Current; } internal static bool IsDirection(DbParameter value, ParameterDirection condition) { return condition == (condition & value.Direction); } internal static void IsNullOrSqlType(object value, out bool isNull, out bool isSqlType) { if (value == null || value == DBNull.Value) { isNull = true; isSqlType = false; } else if (value is INullable nullable) { isNull = nullable.IsNull; isSqlType = value is SqlBinary || value is SqlBoolean || value is SqlByte || value is SqlBytes || value is SqlChars || value is SqlDateTime || value is SqlDecimal || value is SqlDouble || value is SqlGuid || value is SqlInt16 || value is SqlInt32 || value is SqlInt64 || value is SqlMoney || value is SqlSingle || value is SqlString; } else { isNull = false; isSqlType = false; } } internal static Version GetAssemblyVersion() { if (s_systemDataVersion == null) { s_systemDataVersion = new Version("4.0.30319.17020"); } return s_systemDataVersion; } internal static bool IsAzureSqlServerEndpoint(string dataSource) { int num = dataSource.LastIndexOf(','); if (num >= 0) { dataSource = dataSource.Substring(0, num); } num = dataSource.LastIndexOf('\\'); if (num >= 0) { dataSource = dataSource.Substring(0, num); } dataSource = dataSource.Trim(); for (num = 0; num < AzureSqlServerEndpoints.Length; num++) { if (dataSource.EndsWith(AzureSqlServerEndpoints[num], StringComparison.OrdinalIgnoreCase)) { return true; } } return false; } internal static ArgumentOutOfRangeException InvalidDataRowVersion(DataRowVersion value) { return InvalidEnumerationValue(typeof(DataRowVersion), (int)value); } internal static ArgumentException SingleValuedProperty(string propertyName, string value) { ArgumentException ex = new ArgumentException(SR.GetString("The only acceptable value for the property '{0}' is '{1}'.", propertyName, value)); TraceExceptionAsReturnValue(ex); return ex; } internal static ArgumentException DoubleValuedProperty(string propertyName, string value1, string value2) { ArgumentException ex = new ArgumentException(SR.GetString("The acceptable values for the property '{0}' are '{1}' or '{2}'.", propertyName, value1, value2)); TraceExceptionAsReturnValue(ex); return ex; } internal static ArgumentException InvalidPrefixSuffix() { ArgumentException ex = new ArgumentException(SR.GetString("Specified QuotePrefix and QuoteSuffix values do not match.")); TraceExceptionAsReturnValue(ex); return ex; } internal static ArgumentOutOfRangeException InvalidCommandBehavior(CommandBehavior value) { return InvalidEnumerationValue(typeof(CommandBehavior), (int)value); } internal static void ValidateCommandBehavior(CommandBehavior value) { if (value < CommandBehavior.Default || (CommandBehavior.SingleResult | CommandBehavior.SchemaOnly | CommandBehavior.KeyInfo | CommandBehavior.SingleRow | CommandBehavior.SequentialAccess | CommandBehavior.CloseConnection) < value) { throw InvalidCommandBehavior(value); } } internal static ArgumentOutOfRangeException NotSupportedCommandBehavior(CommandBehavior value, string method) { return NotSupportedEnumerationValue(typeof(CommandBehavior), value.ToString(), method); } internal static ArgumentException BadParameterName(string parameterName) { ArgumentException ex = new ArgumentException(SR.GetString("Specified parameter name '{0}' is not valid.", parameterName)); TraceExceptionAsReturnValue(ex); return ex; } internal static Exception DeriveParametersNotSupported(IDbCommand value) { return DataAdapter(SR.GetString("{0} DeriveParameters only supports CommandType.StoredProcedure, not CommandType.{1}.", value.GetType().Name, value.CommandType.ToString())); } internal static Exception NoStoredProcedureExists(string sproc) { return InvalidOperation(SR.GetString("The stored procedure '{0}' doesn't exist.", sproc)); } internal static InvalidOperationException TransactionCompletedButNotDisposed() { return Provider(SR.GetString("The transaction associated with the current connection has completed but has not been disposed. The transaction must be disposed before the connection can be used to execute SQL statements.")); } internal static bool NeedManualEnlistment() { return false; } internal static bool IsEmpty(string str) { return string.IsNullOrEmpty(str); } internal static Exception DatabaseNameTooLong() { return Argument(SR.GetString("The argument is too long.")); } internal static int StringLength(string inputString) { return inputString?.Length ?? 0; } internal static Exception NumericToDecimalOverflow() { return InvalidCast(SR.GetString("The numerical value is too large to fit into a 96 bit decimal.")); } internal static Exception OdbcNoTypesFromProvider() { return InvalidOperation(SR.GetString("The ODBC provider did not return results from SQLGETTYPEINFO.")); } internal static ArgumentException InvalidRestrictionValue(string collectionName, string restrictionName, string restrictionValue) { return Argument(SR.GetString("'{2}' is not a valid value for the '{1}' restriction of the '{0}' schema collection.", collectionName, restrictionName, restrictionValue)); } internal static Exception DataReaderNoData() { return InvalidOperation(SR.GetString("No data exists for the row/column.")); } internal static Exception ConnectionIsDisabled(Exception InnerException) { return InvalidOperation(SR.GetString("The connection has been disabled."), InnerException); } internal static Exception OffsetOutOfRangeException() { return InvalidOperation(SR.GetString("Offset must refer to a location within the value.")); } internal static ArgumentException InvalidDataType(TypeCode typecode) { return Argument(SR.GetString("The parameter data type of {0} is invalid.", typecode.ToString())); } internal static InvalidOperationException QuotePrefixNotSet(string method) { return InvalidOperation(Res.GetString("{0} requires open connection when the quote prefix has not been set.", method)); } internal static string GetFullPath(string filename) { return Path.GetFullPath(filename); } internal static InvalidOperationException InvalidDataDirectory() { return InvalidOperation(SR.GetString("The DataDirectory substitute is not a string.")); } internal static ArgumentException UnknownDataTypeCode(Type dataType, TypeCode typeCode) { object[] array = new object[2]; int num = (int)typeCode; array[0] = num.ToString(CultureInfo.InvariantCulture); array[1] = dataType.FullName; return Argument(SR.GetString("Unable to handle an unknown TypeCode {0} returned by Type {1}.", array)); } internal static void EscapeSpecialCharacters(string unescapedString, StringBuilder escapedString) { foreach (char value in unescapedString) { if (".$^{[(|)*+?\\]".IndexOf(value) >= 0) { escapedString.Append("\\"); } escapedString.Append(value); } } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static IntPtr IntPtrOffset(IntPtr pbase, int offset) { checked { if (4 == PtrSize) { return (IntPtr)(pbase.ToInt32() + offset); } return (IntPtr)(pbase.ToInt64() + offset); } } internal static ArgumentOutOfRangeException NotSupportedUserDefinedTypeSerializationFormat(Format value, string method) { return NotSupportedEnumerationValue(typeof(Format), value.ToString(), method); } internal static ArgumentOutOfRangeException InvalidUserDefinedTypeSerializationFormat(Format value) { return InvalidEnumerationValue(typeof(Format), (int)value); } internal static ArgumentOutOfRangeException ArgumentOutOfRange(string message, string parameterName, object value) { ArgumentOutOfRangeException ex = new ArgumentOutOfRangeException(parameterName, value, message); TraceExceptionAsReturnValue(ex); return ex; } internal static Exception InvalidXMLBadVersion() { return Argument(Res.GetString("Invalid Xml; can only parse elements of version one.")); } internal static Exception NotAPermissionElement() { return Argument(Res.GetString("Given security element is not a permission element.")); } internal static Exception PermissionTypeMismatch() { return Argument(Res.GetString("Type mismatch.")); } internal static ArgumentOutOfRangeException InvalidPermissionState(PermissionState value) { return InvalidEnumerationValue(typeof(PermissionState), (int)value); } internal static ArgumentException ConfigProviderNotFound() { return Argument(Res.GetString("Unable to find the requested .Net Framework Data Provider. It may not be installed.")); } internal static InvalidOperationException ConfigProviderInvalid() { return InvalidOperation(Res.GetString("The requested .Net Framework Data Provider's implementation does not have an Instance field of a System.Data.Common.DbProviderFactory derived type.")); } internal static Exception OleDb() { return new NotImplementedException("OleDb is not implemented."); } } internal class DbConnectionOptions { private static class KEY { internal const string Integrated_Security = "integrated security"; internal const string Password = "password"; internal const string Persist_Security_Info = "persist security info"; internal const string User_ID = "user id"; } private static class SYNONYM { internal const string Pwd = "pwd"; internal const string UID = "uid"; } private enum ParserState { NothingYet = 1, Key, KeyEqual, KeyEnd, UnquotedValue, DoubleQuoteValue, DoubleQuoteValueQuote, SingleQuoteValue, SingleQuoteValueQuote, BraceQuoteValue, BraceQuoteValueQuote, QuotedValueEnd, NullTermination } private const string ConnectionStringValidKeyPattern = "^(?![;\\s])[^\\p{Cc}]+(? _parsetable; internal readonly NameValuePair _keyChain; internal readonly bool _hasPasswordKeyword; internal readonly bool _useOdbcRules; internal readonly bool _hasUserIdKeyword; internal bool HasPersistablePassword { get { if (!_hasPasswordKeyword) { return true; } return ConvertValueToBoolean("persist security info", defaultValue: false); } } internal Dictionary Parsetable => _parsetable; public string this[string keyword] => _parsetable[keyword]; public bool IsEmpty => _keyChain == null; internal bool HasBlankPassword { get { if (!ConvertValueToIntegratedSecurity()) { if (_parsetable.ContainsKey("password")) { return ADP.IsEmpty(_parsetable["password"]); } if (_parsetable.ContainsKey("pwd")) { return ADP.IsEmpty(_parsetable["pwd"]); } if (!_parsetable.ContainsKey("user id") || ADP.IsEmpty(_parsetable["user id"])) { if (_parsetable.ContainsKey("uid")) { return !ADP.IsEmpty(_parsetable["uid"]); } return false; } return true; } return false; } } public string UsersConnectionString(bool hidePassword) { return UsersConnectionString(hidePassword, forceHidePassword: false); } private string UsersConnectionString(bool hidePassword, bool forceHidePassword) { string constr = _usersConnectionString; if (_hasPasswordKeyword && (forceHidePassword || (hidePassword && !HasPersistablePassword))) { ReplacePasswordPwd(out constr, fakePassword: false); } return constr ?? string.Empty; } public bool ConvertValueToBoolean(string keyName, bool defaultValue) { if (!_parsetable.TryGetValue(keyName, out var value)) { return defaultValue; } return ConvertValueToBooleanInternal(keyName, value); } internal static bool ConvertValueToBooleanInternal(string keyName, string stringValue) { if (CompareInsensitiveInvariant(stringValue, "true") || CompareInsensitiveInvariant(stringValue, "yes")) { return true; } if (CompareInsensitiveInvariant(stringValue, "false") || CompareInsensitiveInvariant(stringValue, "no")) { return false; } string strvalue = stringValue.Trim(); if (CompareInsensitiveInvariant(strvalue, "true") || CompareInsensitiveInvariant(strvalue, "yes")) { return true; } if (CompareInsensitiveInvariant(strvalue, "false") || CompareInsensitiveInvariant(strvalue, "no")) { return false; } throw ADP.InvalidConnectionOptionValue(keyName); } private static bool CompareInsensitiveInvariant(string strvalue, string strconst) { return StringComparer.OrdinalIgnoreCase.Compare(strvalue, strconst) == 0; } [Conditional("DEBUG")] [Conditional("DEBUG")] private static void DebugTraceKeyValuePair(string keyname, string keyvalue, Dictionary synonyms) { string text = ((synonyms != null) ? synonyms[keyname] : keyname); if ("password" != text && "pwd" != text) { if (keyvalue != null) { DataCommonEventSource.Log.Trace(" KeyName='{0}', KeyValue='{1}'", keyname, keyvalue); } else { DataCommonEventSource.Log.Trace(" KeyName='{0}'", keyname); } } } private static string GetKeyName(StringBuilder buffer) { int num = buffer.Length; while (0 < num && char.IsWhiteSpace(buffer[num - 1])) { num--; } return buffer.ToString(0, num).ToLower(CultureInfo.InvariantCulture); } private static string GetKeyValue(StringBuilder buffer, bool trimWhitespace) { int num = buffer.Length; int i = 0; if (trimWhitespace) { for (; i < num && char.IsWhiteSpace(buffer[i]); i++) { } while (0 < num && char.IsWhiteSpace(buffer[num - 1])) { num--; } } return buffer.ToString(i, num - i); } internal static int GetKeyValuePair(string connectionString, int currentPosition, StringBuilder buffer, bool useOdbcRules, out string keyname, out string keyvalue) { int index = currentPosition; buffer.Length = 0; keyname = null; keyvalue = null; char c = '\0'; ParserState parserState = ParserState.NothingYet; for (int length = connectionString.Length; currentPosition < length; currentPosition++) { c = connectionString[currentPosition]; switch (parserState) { case ParserState.NothingYet: if (';' == c || char.IsWhiteSpace(c)) { continue; } if (c == '\0') { parserState = ParserState.NullTermination; continue; } if (char.IsControl(c)) { throw ADP.ConnectionStringSyntax(index); } index = currentPosition; if ('=' != c) { parserState = ParserState.Key; goto IL_0248; } parserState = ParserState.KeyEqual; continue; case ParserState.Key: if ('=' == c) { parserState = ParserState.KeyEqual; continue; } if (!char.IsWhiteSpace(c) && char.IsControl(c)) { throw ADP.ConnectionStringSyntax(index); } goto IL_0248; case ParserState.KeyEqual: if (!useOdbcRules && '=' == c) { parserState = ParserState.Key; goto IL_0248; } keyname = GetKeyName(buffer); if (string.IsNullOrEmpty(keyname)) { throw ADP.ConnectionStringSyntax(index); } buffer.Length = 0; parserState = ParserState.KeyEnd; goto case ParserState.KeyEnd; case ParserState.KeyEnd: if (char.IsWhiteSpace(c)) { continue; } if (useOdbcRules) { if ('{' == c) { parserState = ParserState.BraceQuoteValue; goto IL_0248; } } else { if ('\'' == c) { parserState = ParserState.SingleQuoteValue; continue; } if ('"' == c) { parserState = ParserState.DoubleQuoteValue; continue; } } if (';' == c || c == '\0') { break; } if (char.IsControl(c)) { throw ADP.ConnectionStringSyntax(index); } parserState = ParserState.UnquotedValue; goto IL_0248; case ParserState.UnquotedValue: if (!char.IsWhiteSpace(c) && (char.IsControl(c) || ';' == c)) { break; } goto IL_0248; case ParserState.DoubleQuoteValue: if ('"' == c) { parserState = ParserState.DoubleQuoteValueQuote; continue; } if (c == '\0') { throw ADP.ConnectionStringSyntax(index); } goto IL_0248; case ParserState.DoubleQuoteValueQuote: if ('"' == c) { parserState = ParserState.DoubleQuoteValue; goto IL_0248; } keyvalue = GetKeyValue(buffer, trimWhitespace: false); parserState = ParserState.QuotedValueEnd; goto case ParserState.QuotedValueEnd; case ParserState.SingleQuoteValue: if ('\'' == c) { parserState = ParserState.SingleQuoteValueQuote; continue; } if (c == '\0') { throw ADP.ConnectionStringSyntax(index); } goto IL_0248; case ParserState.SingleQuoteValueQuote: if ('\'' == c) { parserState = ParserState.SingleQuoteValue; goto IL_0248; } keyvalue = GetKeyValue(buffer, trimWhitespace: false); parserState = ParserState.QuotedValueEnd; goto case ParserState.QuotedValueEnd; case ParserState.BraceQuoteValue: if ('}' == c) { parserState = ParserState.BraceQuoteValueQuote; } else if (c == '\0') { throw ADP.ConnectionStringSyntax(index); } goto IL_0248; case ParserState.BraceQuoteValueQuote: if ('}' == c) { parserState = ParserState.BraceQuoteValue; goto IL_0248; } keyvalue = GetKeyValue(buffer, trimWhitespace: false); parserState = ParserState.QuotedValueEnd; goto case ParserState.QuotedValueEnd; case ParserState.QuotedValueEnd: if (char.IsWhiteSpace(c)) { continue; } if (';' != c) { if (c == '\0') { parserState = ParserState.NullTermination; continue; } throw ADP.ConnectionStringSyntax(index); } break; case ParserState.NullTermination: if (c == '\0' || char.IsWhiteSpace(c)) { continue; } throw ADP.ConnectionStringSyntax(currentPosition); default: { throw ADP.InternalError(ADP.InternalErrorCode.InvalidParserState1); } IL_0248: buffer.Append(c); continue; } break; } switch (parserState) { case ParserState.Key: case ParserState.DoubleQuoteValue: case ParserState.SingleQuoteValue: case ParserState.BraceQuoteValue: throw ADP.ConnectionStringSyntax(index); case ParserState.KeyEqual: keyname = GetKeyName(buffer); if (string.IsNullOrEmpty(keyname)) { throw ADP.ConnectionStringSyntax(index); } break; case ParserState.UnquotedValue: { keyvalue = GetKeyValue(buffer, trimWhitespace: true); char c2 = keyvalue[keyvalue.Length - 1]; if (!useOdbcRules && ('\'' == c2 || '"' == c2)) { throw ADP.ConnectionStringSyntax(index); } break; } case ParserState.DoubleQuoteValueQuote: case ParserState.SingleQuoteValueQuote: case ParserState.BraceQuoteValueQuote: case ParserState.QuotedValueEnd: keyvalue = GetKeyValue(buffer, trimWhitespace: false); break; default: throw ADP.InternalError(ADP.InternalErrorCode.InvalidParserState2); case ParserState.NothingYet: case ParserState.KeyEnd: case ParserState.NullTermination: break; } if (';' == c && currentPosition < connectionString.Length) { currentPosition++; } return currentPosition; } private static bool IsValueValidInternal(string keyvalue) { if (keyvalue != null) { return -1 == keyvalue.IndexOf('\0'); } return true; } private static bool IsKeyNameValid(string keyname) { if (keyname != null) { if (0 < keyname.Length && ';' != keyname[0] && !char.IsWhiteSpace(keyname[0])) { return -1 == keyname.IndexOf('\0'); } return false; } return false; } private static NameValuePair ParseInternal(Dictionary parsetable, string connectionString, bool buildChain, Dictionary synonyms, bool firstKey) { StringBuilder buffer = new StringBuilder(); NameValuePair nameValuePair = null; NameValuePair result = null; int num = 0; int length = connectionString.Length; while (num < length) { int num2 = num; num = GetKeyValuePair(connectionString, num2, buffer, firstKey, out var keyname, out var keyvalue); if (string.IsNullOrEmpty(keyname)) { break; } string value; string text = ((synonyms == null) ? keyname : (synonyms.TryGetValue(keyname, out value) ? value : null)); if (!IsKeyNameValid(text)) { throw ADP.KeywordNotSupported(keyname); } if (!firstKey || !parsetable.ContainsKey(text)) { parsetable[text] = keyvalue; } if (nameValuePair != null) { NameValuePair nameValuePair3 = (nameValuePair.Next = new NameValuePair(text, keyvalue, num - num2)); nameValuePair = nameValuePair3; } else if (buildChain) { result = (nameValuePair = new NameValuePair(text, keyvalue, num - num2)); } } return result; } internal NameValuePair ReplacePasswordPwd(out string constr, bool fakePassword) { int num = 0; NameValuePair result = null; NameValuePair nameValuePair = null; NameValuePair nameValuePair2 = null; StringBuilder stringBuilder = new StringBuilder(_usersConnectionString.Length); for (NameValuePair nameValuePair3 = _keyChain; nameValuePair3 != null; nameValuePair3 = nameValuePair3.Next) { if ("password" != nameValuePair3.Name && "pwd" != nameValuePair3.Name) { stringBuilder.Append(_usersConnectionString, num, nameValuePair3.Length); if (fakePassword) { nameValuePair2 = new NameValuePair(nameValuePair3.Name, nameValuePair3.Value, nameValuePair3.Length); } } else if (fakePassword) { stringBuilder.Append(nameValuePair3.Name).Append("=*;"); nameValuePair2 = new NameValuePair(nameValuePair3.Name, "*", nameValuePair3.Name.Length + "=*;".Length); } if (fakePassword) { if (nameValuePair != null) { NameValuePair nameValuePair5 = (nameValuePair.Next = nameValuePair2); nameValuePair = nameValuePair5; } else { nameValuePair = (result = nameValuePair2); } } num += nameValuePair3.Length; } constr = stringBuilder.ToString(); return result; } public DbConnectionOptions(string connectionString, Dictionary synonyms, bool useOdbcRules) { _useOdbcRules = useOdbcRules; _parsetable = new Dictionary(); _usersConnectionString = ((connectionString != null) ? connectionString : ""); if (0 < _usersConnectionString.Length) { _keyChain = ParseInternal(_parsetable, _usersConnectionString, buildChain: true, synonyms, _useOdbcRules); _hasPasswordKeyword = _parsetable.ContainsKey("password") || _parsetable.ContainsKey("pwd"); _hasUserIdKeyword = _parsetable.ContainsKey("user id") || _parsetable.ContainsKey("uid"); } } internal static void AppendKeyValuePairBuilder(StringBuilder builder, string keyName, string keyValue, bool useOdbcRules) { ADP.CheckArgumentNull(builder, "builder"); ADP.CheckArgumentLength(keyName, "keyName"); if (keyName == null || !s_connectionStringValidKeyRegex.IsMatch(keyName)) { throw ADP.InvalidKeyname(keyName); } if (keyValue != null && !IsValueValidInternal(keyValue)) { throw ADP.InvalidValue(keyName); } if (0 < builder.Length && ';' != builder[builder.Length - 1]) { builder.Append(';'); } if (useOdbcRules) { builder.Append(keyName); } else { builder.Append(keyName.Replace("=", "==")); } builder.Append('='); if (keyValue == null) { return; } if (useOdbcRules) { if (0 < keyValue.Length && ('{' == keyValue[0] || 0 <= keyValue.IndexOf(';') || string.Compare("Driver", keyName, StringComparison.OrdinalIgnoreCase) == 0) && !s_connectionStringQuoteOdbcValueRegex.IsMatch(keyValue)) { builder.Append('{').Append(keyValue.Replace("}", "}}")).Append('}'); } else { builder.Append(keyValue); } } else if (s_connectionStringQuoteValueRegex.IsMatch(keyValue)) { builder.Append(keyValue); } else if (-1 != keyValue.IndexOf('"') && -1 == keyValue.IndexOf('\'')) { builder.Append('\''); builder.Append(keyValue); builder.Append('\''); } else { builder.Append('"'); builder.Append(keyValue.Replace("\"", "\"\"")); builder.Append('"'); } } protected internal virtual string Expand() { return _usersConnectionString; } internal string ExpandKeyword(string keyword, string replacementValue) { bool flag = false; int num = 0; StringBuilder stringBuilder = new StringBuilder(_usersConnectionString.Length); for (NameValuePair nameValuePair = _keyChain; nameValuePair != null; nameValuePair = nameValuePair.Next) { if (nameValuePair.Name == keyword && nameValuePair.Value == this[keyword]) { AppendKeyValuePairBuilder(stringBuilder, nameValuePair.Name, replacementValue, _useOdbcRules); stringBuilder.Append(';'); flag = true; } else { stringBuilder.Append(_usersConnectionString, num, nameValuePair.Length); } num += nameValuePair.Length; } if (!flag) { AppendKeyValuePairBuilder(stringBuilder, keyword, replacementValue, _useOdbcRules); } return stringBuilder.ToString(); } internal static void ValidateKeyValuePair(string keyword, string value) { if (keyword == null || !s_connectionStringValidKeyRegex.IsMatch(keyword)) { throw ADP.InvalidKeyname(keyword); } if (value != null && !s_connectionStringValidValueRegex.IsMatch(value)) { throw ADP.InvalidValue(keyword); } } public DbConnectionOptions(string connectionString, Dictionary synonyms) { _parsetable = new Dictionary(); _usersConnectionString = ((connectionString != null) ? connectionString : ""); if (0 < _usersConnectionString.Length) { _keyChain = ParseInternal(_parsetable, _usersConnectionString, buildChain: true, synonyms, firstKey: false); _hasPasswordKeyword = _parsetable.ContainsKey("password") || _parsetable.ContainsKey("pwd"); } } protected DbConnectionOptions(DbConnectionOptions connectionOptions) { _usersConnectionString = connectionOptions._usersConnectionString; _hasPasswordKeyword = connectionOptions._hasPasswordKeyword; _parsetable = connectionOptions._parsetable; _keyChain = connectionOptions._keyChain; } internal bool TryGetParsetableValue(string key, out string value) { return _parsetable.TryGetValue(key, out value); } public bool ConvertValueToIntegratedSecurity() { if (!_parsetable.TryGetValue("integrated security", out var value) || value == null) { return false; } return ConvertValueToIntegratedSecurityInternal(value); } internal bool ConvertValueToIntegratedSecurityInternal(string stringValue) { if (CompareInsensitiveInvariant(stringValue, "sspi") || CompareInsensitiveInvariant(stringValue, "true") || CompareInsensitiveInvariant(stringValue, "yes")) { return true; } if (CompareInsensitiveInvariant(stringValue, "false") || CompareInsensitiveInvariant(stringValue, "no")) { return false; } string strvalue = stringValue.Trim(); if (CompareInsensitiveInvariant(strvalue, "sspi") || CompareInsensitiveInvariant(strvalue, "true") || CompareInsensitiveInvariant(strvalue, "yes")) { return true; } if (CompareInsensitiveInvariant(strvalue, "false") || CompareInsensitiveInvariant(strvalue, "no")) { return false; } throw ADP.InvalidConnectionOptionValue("integrated security"); } public int ConvertValueToInt32(string keyName, int defaultValue) { if (!_parsetable.TryGetValue(keyName, out var value) || value == null) { return defaultValue; } return ConvertToInt32Internal(keyName, value); } internal static int ConvertToInt32Internal(string keyname, string stringValue) { try { return int.Parse(stringValue, NumberStyles.Integer, CultureInfo.InvariantCulture); } catch (FormatException inner) { throw ADP.InvalidConnectionOptionValue(keyname, inner); } catch (OverflowException inner2) { throw ADP.InvalidConnectionOptionValue(keyname, inner2); } } public string ConvertValueToString(string keyName, string defaultValue) { if (!_parsetable.TryGetValue(keyName, out var value) || value == null) { return defaultValue; } return value; } public bool ContainsKey(string keyword) { return _parsetable.ContainsKey(keyword); } internal static string ExpandDataDirectory(string keyword, string value, ref string datadir) { string text = null; if (value != null && value.StartsWith("|datadirectory|", StringComparison.OrdinalIgnoreCase)) { string text2 = datadir; if (text2 == null) { object data = AppDomain.CurrentDomain.GetData("DataDirectory"); text2 = data as string; if (data != null && text2 == null) { throw ADP.InvalidDataDirectory(); } if (string.IsNullOrEmpty(text2)) { text2 = AppDomain.CurrentDomain.BaseDirectory; } if (text2 == null) { text2 = ""; } datadir = text2; } int length = "|datadirectory|".Length; bool flag = 0 < text2.Length && text2[text2.Length - 1] == '\\'; bool flag2 = length < value.Length && value[length] == '\\'; text = ((!flag && !flag2) ? (text2 + "\\" + value.Substring(length)) : ((!(flag && flag2)) ? (text2 + value.Substring(length)) : (text2 + value.Substring(length + 1)))); if (!ADP.GetFullPath(text).StartsWith(text2, StringComparison.Ordinal)) { throw ADP.InvalidConnectionOptionValue(keyword); } } return text; } internal string ExpandDataDirectories(ref string filename, ref int position) { string text = null; StringBuilder stringBuilder = new StringBuilder(_usersConnectionString.Length); string datadir = null; int num = 0; bool flag = false; for (NameValuePair nameValuePair = _keyChain; nameValuePair != null; nameValuePair = nameValuePair.Next) { text = nameValuePair.Value; if (_useOdbcRules) { switch (nameValuePair.Name) { default: text = ExpandDataDirectory(nameValuePair.Name, text, ref datadir); break; case "driver": case "pwd": case "uid": break; } } else { switch (nameValuePair.Name) { default: text = ExpandDataDirectory(nameValuePair.Name, text, ref datadir); break; case "provider": case "data provider": case "remote provider": case "extended properties": case "user id": case "password": case "uid": case "pwd": break; } } if (text == null) { text = nameValuePair.Value; } if (_useOdbcRules || "file name" != nameValuePair.Name) { if (text != nameValuePair.Value) { flag = true; AppendKeyValuePairBuilder(stringBuilder, nameValuePair.Name, text, _useOdbcRules); stringBuilder.Append(';'); } else { stringBuilder.Append(_usersConnectionString, num, nameValuePair.Length); } } else { flag = true; filename = text; position = stringBuilder.Length; } num += nameValuePair.Length; } if (flag) { return stringBuilder.ToString(); } return null; } } internal class DbConnectionPoolKey : ICloneable { private string _connectionString; internal virtual string ConnectionString { get { return _connectionString; } set { _connectionString = value; } } internal DbConnectionPoolKey(string connectionString) { _connectionString = connectionString; } protected DbConnectionPoolKey(DbConnectionPoolKey key) { _connectionString = key.ConnectionString; } public virtual object Clone() { return new DbConnectionPoolKey(this); } public override bool Equals(object obj) { if (obj == null || obj.GetType() != typeof(DbConnectionPoolKey)) { return false; } if (obj is DbConnectionPoolKey dbConnectionPoolKey) { return _connectionString == dbConnectionPoolKey._connectionString; } return false; } public override int GetHashCode() { if (_connectionString != null) { return _connectionString.GetHashCode(); } return 0; } } internal class MultipartIdentifier { private enum MPIState { MPI_Value, MPI_ParseNonQuote, MPI_LookForSeparator, MPI_LookForNextCharOrSeparator, MPI_ParseQuote, MPI_RightQuote } private const int MaxParts = 4; internal const int ServerIndex = 0; internal const int CatalogIndex = 1; internal const int SchemaIndex = 2; internal const int TableIndex = 3; internal static string[] ParseMultipartIdentifier(string name, string leftQuote, string rightQuote, string property, bool ThrowOnEmptyMultipartName) { return ParseMultipartIdentifier(name, leftQuote, rightQuote, '.', 4, removequotes: true, property, ThrowOnEmptyMultipartName); } private static void IncrementStringCount(string name, string[] ary, ref int position, string property) { position++; int num = ary.Length; if (position >= num) { throw ADP.InvalidMultipartNameToManyParts(property, name, num); } ary[position] = string.Empty; } private static bool IsWhitespace(char ch) { return char.IsWhiteSpace(ch); } internal static string[] ParseMultipartIdentifier(string name, string leftQuote, string rightQuote, char separator, int limit, bool removequotes, string property, bool ThrowOnEmptyMultipartName) { if (limit <= 0) { throw ADP.InvalidMultipartNameToManyParts(property, name, limit); } if (-1 != leftQuote.IndexOf(separator) || -1 != rightQuote.IndexOf(separator) || leftQuote.Length != rightQuote.Length) { throw ADP.InvalidMultipartNameIncorrectUsageOfQuotes(property, name); } string[] array = new string[limit]; int position = 0; MPIState mPIState = MPIState.MPI_Value; StringBuilder stringBuilder = new StringBuilder(name.Length); StringBuilder stringBuilder2 = null; char c = ' '; foreach (char c2 in name) { switch (mPIState) { case MPIState.MPI_Value: { if (IsWhitespace(c2)) { break; } int index; if (c2 == separator) { array[position] = string.Empty; IncrementStringCount(name, array, ref position, property); } else if (-1 != (index = leftQuote.IndexOf(c2))) { c = rightQuote[index]; stringBuilder.Length = 0; if (!removequotes) { stringBuilder.Append(c2); } mPIState = MPIState.MPI_ParseQuote; } else { if (-1 != rightQuote.IndexOf(c2)) { throw ADP.InvalidMultipartNameIncorrectUsageOfQuotes(property, name); } stringBuilder.Length = 0; stringBuilder.Append(c2); mPIState = MPIState.MPI_ParseNonQuote; } break; } case MPIState.MPI_ParseNonQuote: if (c2 == separator) { array[position] = stringBuilder.ToString(); IncrementStringCount(name, array, ref position, property); mPIState = MPIState.MPI_Value; break; } if (-1 != rightQuote.IndexOf(c2)) { throw ADP.InvalidMultipartNameIncorrectUsageOfQuotes(property, name); } if (-1 != leftQuote.IndexOf(c2)) { throw ADP.InvalidMultipartNameIncorrectUsageOfQuotes(property, name); } if (IsWhitespace(c2)) { array[position] = stringBuilder.ToString(); if (stringBuilder2 == null) { stringBuilder2 = new StringBuilder(); } stringBuilder2.Length = 0; stringBuilder2.Append(c2); mPIState = MPIState.MPI_LookForNextCharOrSeparator; } else { stringBuilder.Append(c2); } break; case MPIState.MPI_LookForNextCharOrSeparator: if (!IsWhitespace(c2)) { if (c2 == separator) { IncrementStringCount(name, array, ref position, property); mPIState = MPIState.MPI_Value; break; } stringBuilder.Append((object?)stringBuilder2); stringBuilder.Append(c2); array[position] = stringBuilder.ToString(); mPIState = MPIState.MPI_ParseNonQuote; } else { stringBuilder2.Append(c2); } break; case MPIState.MPI_ParseQuote: if (c2 == c) { if (!removequotes) { stringBuilder.Append(c2); } mPIState = MPIState.MPI_RightQuote; } else { stringBuilder.Append(c2); } break; case MPIState.MPI_RightQuote: if (c2 == c) { stringBuilder.Append(c2); mPIState = MPIState.MPI_ParseQuote; break; } if (c2 == separator) { array[position] = stringBuilder.ToString(); IncrementStringCount(name, array, ref position, property); mPIState = MPIState.MPI_Value; break; } if (!IsWhitespace(c2)) { throw ADP.InvalidMultipartNameIncorrectUsageOfQuotes(property, name); } array[position] = stringBuilder.ToString(); mPIState = MPIState.MPI_LookForSeparator; break; case MPIState.MPI_LookForSeparator: if (!IsWhitespace(c2)) { if (c2 != separator) { throw ADP.InvalidMultipartNameIncorrectUsageOfQuotes(property, name); } IncrementStringCount(name, array, ref position, property); mPIState = MPIState.MPI_Value; } break; } } switch (mPIState) { case MPIState.MPI_ParseNonQuote: case MPIState.MPI_RightQuote: array[position] = stringBuilder.ToString(); break; default: throw ADP.InvalidMultipartNameIncorrectUsageOfQuotes(property, name); case MPIState.MPI_Value: case MPIState.MPI_LookForSeparator: case MPIState.MPI_LookForNextCharOrSeparator: break; } if (array[0] == null) { if (ThrowOnEmptyMultipartName) { throw ADP.InvalidMultipartName(property, name); } } else { int num = limit - position - 1; if (num > 0) { for (int num2 = limit - 1; num2 >= num; num2--) { array[num2] = array[num2 - num]; array[num2 - num] = null; } } } return array; } } [Serializable] internal sealed class NameValuePair { private readonly string _name; private readonly string _value; private readonly int _length; private NameValuePair _next; internal int Length => _length; internal string Name => _name; internal string Value => _value; internal NameValuePair Next { get { return _next; } set { if (_next != null || value == null) { throw ADP.InternalError(ADP.InternalErrorCode.NameValuePairNext); } _next = value; } } internal NameValuePair(string name, string value, int length) { _name = name; _value = value; _length = length; } } public enum CatalogLocation { Start = 1, End } internal sealed class BigIntegerStorage : DataStorage { private BigInteger[] _values; internal BigIntegerStorage(DataColumn column) : base(column, typeof(BigInteger), BigInteger.Zero, StorageType.BigInteger) { } public override object Aggregate(int[] records, AggregateType kind) { throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { BigInteger bigInteger = _values[recordNo1]; BigInteger other = _values[recordNo2]; if (bigInteger.IsZero || other.IsZero) { int num = CompareBits(recordNo1, recordNo2); if (num != 0) { return num; } } return bigInteger.CompareTo(other); } public override int CompareValueTo(int recordNo, object value) { if (_nullValue == value) { if (!HasValue(recordNo)) { return 0; } return 1; } BigInteger bigInteger = _values[recordNo]; if (bigInteger.IsZero && !HasValue(recordNo)) { return -1; } return bigInteger.CompareTo((BigInteger)value); } internal static BigInteger ConvertToBigInteger(object value, IFormatProvider formatProvider) { if (value.GetType() == typeof(BigInteger)) { return (BigInteger)value; } if (value.GetType() == typeof(string)) { return BigInteger.Parse((string)value, formatProvider); } if (value.GetType() == typeof(long)) { return (long)value; } if (value.GetType() == typeof(int)) { return (int)value; } if (value.GetType() == typeof(short)) { return (short)value; } if (value.GetType() == typeof(sbyte)) { return (sbyte)value; } if (value.GetType() == typeof(ulong)) { return (ulong)value; } if (value.GetType() == typeof(uint)) { return (uint)value; } if (value.GetType() == typeof(ushort)) { return (ushort)value; } if (value.GetType() == typeof(byte)) { return (byte)value; } throw ExceptionBuilder.ConvertFailed(value.GetType(), typeof(BigInteger)); } internal static object ConvertFromBigInteger(BigInteger value, Type type, IFormatProvider formatProvider) { if (type == typeof(string)) { return value.ToString("D", formatProvider); } if (type == typeof(sbyte)) { return (sbyte)value; } if (type == typeof(short)) { return (short)value; } if (type == typeof(int)) { return (int)value; } if (type == typeof(long)) { return (long)value; } if (type == typeof(byte)) { return (byte)value; } if (type == typeof(ushort)) { return (ushort)value; } if (type == typeof(uint)) { return (uint)value; } if (type == typeof(ulong)) { return (ulong)value; } if (type == typeof(float)) { return (float)value; } if (type == typeof(double)) { return (double)value; } if (type == typeof(decimal)) { return (decimal)value; } if (type == typeof(BigInteger)) { return value; } throw ExceptionBuilder.ConvertFailed(typeof(BigInteger), type); } public override object ConvertValue(object value) { if (_nullValue != value) { value = ((value == null) ? _nullValue : ((object)ConvertToBigInteger(value, base.FormatProvider))); } return value; } public override void Copy(int recordNo1, int recordNo2) { CopyBits(recordNo1, recordNo2); _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { BigInteger bigInteger = _values[record]; if (!bigInteger.IsZero) { return bigInteger; } return GetBits(record); } public override void Set(int record, object value) { if (_nullValue == value) { _values[record] = BigInteger.Zero; SetNullBit(record, flag: true); } else { _values[record] = ConvertToBigInteger(value, base.FormatProvider); SetNullBit(record, flag: false); } } public override void SetCapacity(int capacity) { BigInteger[] array = new BigInteger[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; base.SetCapacity(capacity); } public override object ConvertXmlToObject(string s) { return BigInteger.Parse(s, CultureInfo.InvariantCulture); } public override string ConvertObjectToXml(object value) { return ((BigInteger)value).ToString("D", CultureInfo.InvariantCulture); } protected override object GetEmptyStorage(int recordCount) { return new BigInteger[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((BigInteger[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, !HasValue(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (BigInteger[])store; SetNullStorage(nullbits); } } internal sealed class BooleanStorage : DataStorage { private const bool defaultValue = false; private bool[] _values; internal BooleanStorage(DataColumn column) : base(column, typeof(bool), false, StorageType.Boolean) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Min: { bool flag3 = true; foreach (int num2 in records) { if (!IsNull(num2)) { flag3 = _values[num2] && flag3; flag = true; } } if (flag) { return flag3; } return _nullValue; } case AggregateType.Max: { bool flag2 = false; foreach (int num in records) { if (!IsNull(num)) { flag2 = _values[num] || flag2; flag = true; } } if (flag) { return flag2; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: return base.Aggregate(records, kind); } } catch (OverflowException) { throw ExprException.Overflow(typeof(bool)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { bool flag = _values[recordNo1]; bool flag2 = _values[recordNo2]; if (!flag || !flag2) { int num = CompareBits(recordNo1, recordNo2); if (num != 0) { return num; } } return flag.CompareTo(flag2); } public override int CompareValueTo(int recordNo, object value) { if (_nullValue == value) { if (IsNull(recordNo)) { return 0; } return 1; } bool flag = _values[recordNo]; if (!flag && IsNull(recordNo)) { return -1; } return flag.CompareTo((bool)value); } public override object ConvertValue(object value) { if (_nullValue != value) { value = ((value == null) ? _nullValue : ((object)((IConvertible)value).ToBoolean(base.FormatProvider))); } return value; } public override void Copy(int recordNo1, int recordNo2) { CopyBits(recordNo1, recordNo2); _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { bool flag = _values[record]; if (flag) { return flag; } return GetBits(record); } public override void Set(int record, object value) { if (_nullValue == value) { _values[record] = false; SetNullBit(record, flag: true); } else { _values[record] = ((IConvertible)value).ToBoolean(base.FormatProvider); SetNullBit(record, flag: false); } } public override void SetCapacity(int capacity) { bool[] array = new bool[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; base.SetCapacity(capacity); } public override object ConvertXmlToObject(string s) { return XmlConvert.ToBoolean(s); } public override string ConvertObjectToXml(object value) { return XmlConvert.ToString((bool)value); } protected override object GetEmptyStorage(int recordCount) { return new bool[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((bool[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (bool[])store; SetNullStorage(nullbits); } } internal sealed class ByteStorage : DataStorage { private const byte defaultValue = 0; private byte[] _values; internal ByteStorage(DataColumn column) : base(column, typeof(byte), (byte)0, StorageType.Byte) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Sum: { ulong num11 = 0uL; int[] array = records; foreach (int num12 in array) { if (!IsNull(num12)) { num11 = checked(num11 + _values[num12]); flag = true; } } if (flag) { return num11; } return _nullValue; } case AggregateType.Mean: { long num6 = 0L; int num7 = 0; int[] array = records; foreach (int num8 in array) { if (!IsNull(num8)) { num6 = checked(num6 + _values[num8]); num7++; flag = true; } } checked { if (flag) { return (byte)unchecked(num6 / num7); } return _nullValue; } } case AggregateType.Var: case AggregateType.StDev: { int num = 0; double num2 = 0.0; double num3 = 0.0; double num4 = 0.0; int[] array = records; foreach (int num5 in array) { if (!IsNull(num5)) { num3 += (double)(int)_values[num5]; num4 += (double)(int)_values[num5] * (double)(int)_values[num5]; num++; } } if (num > 1) { num2 = (double)num * num4 - num3 * num3; num2 = ((!(num2 / (num3 * num3) < 1E-15) && !(num2 < 0.0)) ? (num2 / (double)(num * (num - 1))) : 0.0); if (kind == AggregateType.StDev) { return Math.Sqrt(num2); } return num2; } return _nullValue; } case AggregateType.Min: { byte b2 = byte.MaxValue; foreach (int num10 in records) { if (!IsNull(num10)) { b2 = Math.Min(_values[num10], b2); flag = true; } } if (flag) { return b2; } return _nullValue; } case AggregateType.Max: { byte b = 0; foreach (int num9 in records) { if (!IsNull(num9)) { b = Math.Max(_values[num9], b); flag = true; } } if (flag) { return b; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: return base.Aggregate(records, kind); } } catch (OverflowException) { throw ExprException.Overflow(typeof(byte)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { byte b = _values[recordNo1]; byte b2 = _values[recordNo2]; if (b == 0 || b2 == 0) { int num = CompareBits(recordNo1, recordNo2); if (num != 0) { return num; } } return b.CompareTo(b2); } public override int CompareValueTo(int recordNo, object value) { if (_nullValue == value) { if (IsNull(recordNo)) { return 0; } return 1; } byte b = _values[recordNo]; if (b == 0 && IsNull(recordNo)) { return -1; } return b.CompareTo((byte)value); } public override object ConvertValue(object value) { if (_nullValue != value) { value = ((value == null) ? _nullValue : ((object)((IConvertible)value).ToByte(base.FormatProvider))); } return value; } public override void Copy(int recordNo1, int recordNo2) { CopyBits(recordNo1, recordNo2); _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { byte b = _values[record]; if (b != 0) { return b; } return GetBits(record); } public override void Set(int record, object value) { if (_nullValue == value) { _values[record] = 0; SetNullBit(record, flag: true); } else { _values[record] = ((IConvertible)value).ToByte(base.FormatProvider); SetNullBit(record, flag: false); } } public override void SetCapacity(int capacity) { byte[] array = new byte[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; base.SetCapacity(capacity); } public override object ConvertXmlToObject(string s) { return XmlConvert.ToByte(s); } public override string ConvertObjectToXml(object value) { return XmlConvert.ToString((byte)value); } protected override object GetEmptyStorage(int recordCount) { return new byte[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((byte[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (byte[])store; SetNullStorage(nullbits); } } internal sealed class CharStorage : DataStorage { private const char defaultValue = '\0'; private char[] _values; internal CharStorage(DataColumn column) : base(column, typeof(char), '\0', StorageType.Char) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Min: { char c2 = '\uffff'; foreach (int num2 in records) { if (!IsNull(num2)) { c2 = ((_values[num2] < c2) ? _values[num2] : c2); flag = true; } } if (flag) { return c2; } return _nullValue; } case AggregateType.Max: { char c = '\0'; foreach (int num in records) { if (!IsNull(num)) { c = ((_values[num] > c) ? _values[num] : c); flag = true; } } if (flag) { return c; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: return base.Aggregate(records, kind); } } catch (OverflowException) { throw ExprException.Overflow(typeof(char)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { char c = _values[recordNo1]; char c2 = _values[recordNo2]; if (c == '\0' || c2 == '\0') { int num = CompareBits(recordNo1, recordNo2); if (num != 0) { return num; } } return c.CompareTo(c2); } public override int CompareValueTo(int recordNo, object value) { if (_nullValue == value) { if (IsNull(recordNo)) { return 0; } return 1; } char c = _values[recordNo]; if (c == '\0' && IsNull(recordNo)) { return -1; } return c.CompareTo((char)value); } public override object ConvertValue(object value) { if (_nullValue != value) { value = ((value == null) ? _nullValue : ((object)((IConvertible)value).ToChar(base.FormatProvider))); } return value; } public override void Copy(int recordNo1, int recordNo2) { CopyBits(recordNo1, recordNo2); _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { char c = _values[record]; if (c != 0) { return c; } return GetBits(record); } public override void Set(int record, object value) { if (_nullValue == value) { _values[record] = '\0'; SetNullBit(record, flag: true); return; } char c = ((IConvertible)value).ToChar(base.FormatProvider); if (c < '\ud800' || c > '\udfff') { switch (c) { case '\t': case '\n': case '\r': break; default: _values[record] = c; SetNullBit(record, flag: false); return; } } throw ExceptionBuilder.ProblematicChars(c); } public override void SetCapacity(int capacity) { char[] array = new char[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; base.SetCapacity(capacity); } public override object ConvertXmlToObject(string s) { return XmlConvert.ToChar(s); } public override string ConvertObjectToXml(object value) { return XmlConvert.ToString((char)value); } protected override object GetEmptyStorage(int recordCount) { return new char[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((char[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (char[])store; SetNullStorage(nullbits); } } public abstract class DbCommandBuilder : Component { private class ParameterNames { private const string DefaultOriginalPrefix = "Original_"; private const string DefaultIsNullPrefix = "IsNull_"; private const string AlternativeOriginalPrefix = "original"; private const string AlternativeIsNullPrefix = "isnull"; private const string AlternativeOriginalPrefix2 = "ORIGINAL"; private const string AlternativeIsNullPrefix2 = "ISNULL"; private string _originalPrefix; private string _isNullPrefix; private Regex _parameterNameParser; private DbCommandBuilder _dbCommandBuilder; private string[] _baseParameterNames; private string[] _originalParameterNames; private string[] _nullParameterNames; private bool[] _isMutatedName; private int _count; private int _genericParameterCount; private int _adjustedParameterNameMaxLength; internal ParameterNames(DbCommandBuilder dbCommandBuilder, DbSchemaRow[] schemaRows) { _dbCommandBuilder = dbCommandBuilder; _baseParameterNames = new string[schemaRows.Length]; _originalParameterNames = new string[schemaRows.Length]; _nullParameterNames = new string[schemaRows.Length]; _isMutatedName = new bool[schemaRows.Length]; _count = schemaRows.Length; _parameterNameParser = new Regex(_dbCommandBuilder.ParameterNamePattern, RegexOptions.ExplicitCapture | RegexOptions.Singleline); SetAndValidateNamePrefixes(); _adjustedParameterNameMaxLength = GetAdjustedParameterNameMaxLength(); for (int i = 0; i < schemaRows.Length; i++) { if (schemaRows[i] == null) { continue; } bool flag = false; string text = schemaRows[i].ColumnName; if ((_originalPrefix == null || !text.StartsWith(_originalPrefix, StringComparison.OrdinalIgnoreCase)) && (_isNullPrefix == null || !text.StartsWith(_isNullPrefix, StringComparison.OrdinalIgnoreCase))) { if (text.IndexOf(' ') >= 0) { text = text.Replace(' ', '_'); flag = true; } if (_parameterNameParser.IsMatch(text) && text.Length <= _adjustedParameterNameMaxLength) { _baseParameterNames[i] = text; _isMutatedName[i] = flag; } } } EliminateConflictingNames(); for (int j = 0; j < schemaRows.Length; j++) { if (_baseParameterNames[j] != null) { if (_originalPrefix != null) { _originalParameterNames[j] = _originalPrefix + _baseParameterNames[j]; } if (_isNullPrefix != null && schemaRows[j].AllowDBNull) { _nullParameterNames[j] = _isNullPrefix + _baseParameterNames[j]; } } } ApplyProviderSpecificFormat(); GenerateMissingNames(schemaRows); } private void SetAndValidateNamePrefixes() { if (_parameterNameParser.IsMatch("IsNull_")) { _isNullPrefix = "IsNull_"; } else if (_parameterNameParser.IsMatch("isnull")) { _isNullPrefix = "isnull"; } else if (_parameterNameParser.IsMatch("ISNULL")) { _isNullPrefix = "ISNULL"; } else { _isNullPrefix = null; } if (_parameterNameParser.IsMatch("Original_")) { _originalPrefix = "Original_"; } else if (_parameterNameParser.IsMatch("original")) { _originalPrefix = "original"; } else if (_parameterNameParser.IsMatch("ORIGINAL")) { _originalPrefix = "ORIGINAL"; } else { _originalPrefix = null; } } private void ApplyProviderSpecificFormat() { for (int i = 0; i < _baseParameterNames.Length; i++) { if (_baseParameterNames[i] != null) { _baseParameterNames[i] = _dbCommandBuilder.GetParameterName(_baseParameterNames[i]); } if (_originalParameterNames[i] != null) { _originalParameterNames[i] = _dbCommandBuilder.GetParameterName(_originalParameterNames[i]); } if (_nullParameterNames[i] != null) { _nullParameterNames[i] = _dbCommandBuilder.GetParameterName(_nullParameterNames[i]); } } } private void EliminateConflictingNames() { for (int i = 0; i < _count - 1; i++) { string text = _baseParameterNames[i]; if (text == null) { continue; } for (int j = i + 1; j < _count; j++) { if (ADP.CompareInsensitiveInvariant(text, _baseParameterNames[j])) { int num = (_isMutatedName[j] ? j : i); _baseParameterNames[num] = null; } } } } internal void GenerateMissingNames(DbSchemaRow[] schemaRows) { for (int i = 0; i < _baseParameterNames.Length; i++) { string text = _baseParameterNames[i]; if (text == null) { _baseParameterNames[i] = GetNextGenericParameterName(); _originalParameterNames[i] = GetNextGenericParameterName(); if (schemaRows[i] != null && schemaRows[i].AllowDBNull) { _nullParameterNames[i] = GetNextGenericParameterName(); } } } } private int GetAdjustedParameterNameMaxLength() { int num = Math.Max((_isNullPrefix != null) ? _isNullPrefix.Length : 0, (_originalPrefix != null) ? _originalPrefix.Length : 0) + _dbCommandBuilder.GetParameterName("").Length; return _dbCommandBuilder.ParameterNameMaxLength - num; } private string GetNextGenericParameterName() { bool flag; string parameterName; do { flag = false; _genericParameterCount++; parameterName = _dbCommandBuilder.GetParameterName(_genericParameterCount); for (int i = 0; i < _baseParameterNames.Length; i++) { if (ADP.CompareInsensitiveInvariant(_baseParameterNames[i], parameterName)) { flag = true; break; } } } while (flag); return parameterName; } internal string GetBaseParameterName(int index) { return _baseParameterNames[index]; } internal string GetOriginalParameterName(int index) { return _originalParameterNames[index]; } internal string GetNullParameterName(int index) { return _nullParameterNames[index]; } } private const string DeleteFrom = "DELETE FROM "; private const string InsertInto = "INSERT INTO "; private const string DefaultValues = " DEFAULT VALUES"; private const string Values = " VALUES "; private const string Update = "UPDATE "; private const string Set = " SET "; private const string Where = " WHERE "; private const string SpaceLeftParenthesis = " ("; private const string Comma = ", "; private const string Equal = " = "; private const string LeftParenthesis = "("; private const string RightParenthesis = ")"; private const string NameSeparator = "."; private const string IsNull = " IS NULL"; private const string EqualOne = " = 1"; private const string And = " AND "; private const string Or = " OR "; private DbDataAdapter _dataAdapter; private DbCommand _insertCommand; private DbCommand _updateCommand; private DbCommand _deleteCommand; private MissingMappingAction _missingMappingAction; private ConflictOption _conflictDetection = ConflictOption.CompareAllSearchableValues; private bool _setAllValues; private bool _hasPartialPrimaryKey; private DataTable _dbSchemaTable; private DbSchemaRow[] _dbSchemaRows; private string[] _sourceColumnNames; private ParameterNames _parameterNames; private string _quotedBaseTableName; private CatalogLocation _catalogLocation = CatalogLocation.Start; private string _catalogSeparator = "."; private string _schemaSeparator = "."; private string _quotePrefix = string.Empty; private string _quoteSuffix = string.Empty; private string _parameterNamePattern; private string _parameterMarkerFormat; private int _parameterNameMaxLength; [DefaultValue(ConflictOption.CompareAllSearchableValues)] public virtual ConflictOption ConflictOption { get { return _conflictDetection; } set { if ((uint)(value - 1) <= 2u) { _conflictDetection = value; return; } throw ADP.InvalidConflictOptions(value); } } [DefaultValue(CatalogLocation.Start)] public virtual CatalogLocation CatalogLocation { get { return _catalogLocation; } set { if (_dbSchemaTable != null) { throw ADP.NoQuoteChange(); } if ((uint)(value - 1) <= 1u) { _catalogLocation = value; return; } throw ADP.InvalidCatalogLocation(value); } } [DefaultValue(".")] public virtual string CatalogSeparator { get { string catalogSeparator = _catalogSeparator; if (catalogSeparator == null || 0 >= catalogSeparator.Length) { return "."; } return catalogSeparator; } set { if (_dbSchemaTable != null) { throw ADP.NoQuoteChange(); } _catalogSeparator = value; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public DbDataAdapter DataAdapter { get { return _dataAdapter; } set { if (_dataAdapter != value) { RefreshSchema(); if (_dataAdapter != null) { SetRowUpdatingHandler(_dataAdapter); _dataAdapter = null; } if (value != null) { SetRowUpdatingHandler(value); _dataAdapter = value; } } } } internal int ParameterNameMaxLength => _parameterNameMaxLength; internal string ParameterNamePattern => _parameterNamePattern; private string QuotedBaseTableName => _quotedBaseTableName; [DefaultValue("")] public virtual string QuotePrefix { get { return _quotePrefix ?? string.Empty; } set { if (_dbSchemaTable != null) { throw ADP.NoQuoteChange(); } _quotePrefix = value; } } [DefaultValue("")] public virtual string QuoteSuffix { get { string quoteSuffix = _quoteSuffix; if (quoteSuffix == null) { return string.Empty; } return quoteSuffix; } set { if (_dbSchemaTable != null) { throw ADP.NoQuoteChange(); } _quoteSuffix = value; } } [DefaultValue(".")] public virtual string SchemaSeparator { get { string schemaSeparator = _schemaSeparator; if (schemaSeparator == null || 0 >= schemaSeparator.Length) { return "."; } return schemaSeparator; } set { if (_dbSchemaTable != null) { throw ADP.NoQuoteChange(); } _schemaSeparator = value; } } [DefaultValue(false)] public bool SetAllValues { get { return _setAllValues; } set { _setAllValues = value; } } private DbCommand InsertCommand { get { return _insertCommand; } set { _insertCommand = value; } } private DbCommand UpdateCommand { get { return _updateCommand; } set { _updateCommand = value; } } private DbCommand DeleteCommand { get { return _deleteCommand; } set { _deleteCommand = value; } } private void BuildCache(bool closeConnection, DataRow dataRow, bool useColumnsForParameterNames) { if (_dbSchemaTable != null && (!useColumnsForParameterNames || _parameterNames != null)) { return; } DataTable dataTable = null; DbCommand selectCommand = GetSelectCommand(); DbConnection connection = selectCommand.Connection; if (connection == null) { throw ADP.MissingSourceCommandConnection(); } try { if ((ConnectionState.Open & connection.State) == 0) { connection.Open(); } else { closeConnection = false; } if (useColumnsForParameterNames) { DataTable schema = connection.GetSchema(DbMetaDataCollectionNames.DataSourceInformation); if (schema.Rows.Count == 1) { _parameterNamePattern = schema.Rows[0][DbMetaDataColumnNames.ParameterNamePattern] as string; _parameterMarkerFormat = schema.Rows[0][DbMetaDataColumnNames.ParameterMarkerFormat] as string; object obj = schema.Rows[0][DbMetaDataColumnNames.ParameterNameMaxLength]; _parameterNameMaxLength = ((obj is int) ? ((int)obj) : 0); if (_parameterNameMaxLength == 0 || _parameterNamePattern == null || _parameterMarkerFormat == null) { useColumnsForParameterNames = false; } } else { useColumnsForParameterNames = false; } } dataTable = GetSchemaTable(selectCommand); } finally { if (closeConnection) { connection.Close(); } } if (dataTable == null) { throw ADP.DynamicSQLNoTableInfo(); } BuildInformation(dataTable); _dbSchemaTable = dataTable; DbSchemaRow[] dbSchemaRows = _dbSchemaRows; string[] array = new string[dbSchemaRows.Length]; for (int i = 0; i < dbSchemaRows.Length; i++) { if (dbSchemaRows[i] != null) { array[i] = dbSchemaRows[i].ColumnName; } } _sourceColumnNames = array; if (useColumnsForParameterNames) { _parameterNames = new ParameterNames(this, dbSchemaRows); } ADP.BuildSchemaTableInfoTableNames(array); } protected virtual DataTable GetSchemaTable(DbCommand sourceCommand) { using IDataReader dataReader = sourceCommand.ExecuteReader(CommandBehavior.SchemaOnly | CommandBehavior.KeyInfo); return dataReader.GetSchemaTable(); } private void BuildInformation(DataTable schemaTable) { DbSchemaRow[] sortedSchemaRows = DbSchemaRow.GetSortedSchemaRows(schemaTable, returnProviderSpecificTypes: false); if (sortedSchemaRows == null || sortedSchemaRows.Length == 0) { throw ADP.DynamicSQLNoTableInfo(); } string text = string.Empty; string text2 = string.Empty; string text3 = string.Empty; string text4 = null; for (int i = 0; i < sortedSchemaRows.Length; i++) { DbSchemaRow dbSchemaRow = sortedSchemaRows[i]; string baseTableName = dbSchemaRow.BaseTableName; if (baseTableName == null || baseTableName.Length == 0) { sortedSchemaRows[i] = null; continue; } string text5 = dbSchemaRow.BaseServerName; string text6 = dbSchemaRow.BaseCatalogName; string text7 = dbSchemaRow.BaseSchemaName; if (text5 == null) { text5 = string.Empty; } if (text6 == null) { text6 = string.Empty; } if (text7 == null) { text7 = string.Empty; } if (text4 == null) { text = text5; text2 = text6; text3 = text7; text4 = baseTableName; } else if (ADP.SrcCompare(text4, baseTableName) != 0 || ADP.SrcCompare(text3, text7) != 0 || ADP.SrcCompare(text2, text6) != 0 || ADP.SrcCompare(text, text5) != 0) { throw ADP.DynamicSQLJoinUnsupported(); } } if (text.Length == 0) { text = null; } if (text2.Length == 0) { text = null; text2 = null; } if (text3.Length == 0) { text = null; text2 = null; text3 = null; } if (text4 == null || text4.Length == 0) { throw ADP.DynamicSQLNoTableInfo(); } CatalogLocation catalogLocation = CatalogLocation; string catalogSeparator = CatalogSeparator; string schemaSeparator = SchemaSeparator; string quotePrefix = QuotePrefix; string quoteSuffix = QuoteSuffix; if (!string.IsNullOrEmpty(quotePrefix) && -1 != text4.IndexOf(quotePrefix, StringComparison.Ordinal)) { throw ADP.DynamicSQLNestedQuote(text4, quotePrefix); } if (!string.IsNullOrEmpty(quoteSuffix) && -1 != text4.IndexOf(quoteSuffix, StringComparison.Ordinal)) { throw ADP.DynamicSQLNestedQuote(text4, quoteSuffix); } StringBuilder stringBuilder = new StringBuilder(); if (CatalogLocation.Start == catalogLocation) { if (text != null) { stringBuilder.Append(ADP.BuildQuotedString(quotePrefix, quoteSuffix, text)); stringBuilder.Append(catalogSeparator); } if (text2 != null) { stringBuilder.Append(ADP.BuildQuotedString(quotePrefix, quoteSuffix, text2)); stringBuilder.Append(catalogSeparator); } } if (text3 != null) { stringBuilder.Append(ADP.BuildQuotedString(quotePrefix, quoteSuffix, text3)); stringBuilder.Append(schemaSeparator); } stringBuilder.Append(ADP.BuildQuotedString(quotePrefix, quoteSuffix, text4)); if (CatalogLocation.End == catalogLocation) { if (text != null) { stringBuilder.Append(catalogSeparator); stringBuilder.Append(ADP.BuildQuotedString(quotePrefix, quoteSuffix, text)); } if (text2 != null) { stringBuilder.Append(catalogSeparator); stringBuilder.Append(ADP.BuildQuotedString(quotePrefix, quoteSuffix, text2)); } } _quotedBaseTableName = stringBuilder.ToString(); _hasPartialPrimaryKey = false; DbSchemaRow[] array = sortedSchemaRows; foreach (DbSchemaRow dbSchemaRow2 in array) { if (dbSchemaRow2 != null && (dbSchemaRow2.IsKey || dbSchemaRow2.IsUnique) && !dbSchemaRow2.IsLong && !dbSchemaRow2.IsRowVersion && dbSchemaRow2.IsHidden) { _hasPartialPrimaryKey = true; break; } } _dbSchemaRows = sortedSchemaRows; } private DbCommand BuildDeleteCommand(DataTableMapping mappings, DataRow dataRow) { DbCommand dbCommand = InitializeCommand(DeleteCommand); StringBuilder stringBuilder = new StringBuilder(); int parameterCount = 0; stringBuilder.Append("DELETE FROM "); stringBuilder.Append(QuotedBaseTableName); parameterCount = BuildWhereClause(mappings, dataRow, stringBuilder, dbCommand, parameterCount, isUpdate: false); dbCommand.CommandText = stringBuilder.ToString(); RemoveExtraParameters(dbCommand, parameterCount); DeleteCommand = dbCommand; return dbCommand; } private DbCommand BuildInsertCommand(DataTableMapping mappings, DataRow dataRow) { DbCommand dbCommand = InitializeCommand(InsertCommand); StringBuilder stringBuilder = new StringBuilder(); int num = 0; string value = " ("; stringBuilder.Append("INSERT INTO "); stringBuilder.Append(QuotedBaseTableName); DbSchemaRow[] dbSchemaRows = _dbSchemaRows; string[] array = new string[dbSchemaRows.Length]; for (int i = 0; i < dbSchemaRows.Length; i++) { DbSchemaRow dbSchemaRow = dbSchemaRows[i]; if (dbSchemaRow == null || dbSchemaRow.BaseColumnName.Length == 0 || !IncludeInInsertValues(dbSchemaRow)) { continue; } object obj = null; string text = _sourceColumnNames[i]; if (mappings != null && dataRow != null) { DataColumn dataColumn = GetDataColumn(text, mappings, dataRow); if (dataColumn == null || (dbSchemaRow.IsReadOnly && dataColumn.ReadOnly)) { continue; } obj = GetColumnValue(dataRow, dataColumn, DataRowVersion.Current); if (!dbSchemaRow.AllowDBNull && (obj == null || Convert.IsDBNull(obj))) { continue; } } stringBuilder.Append(value); value = ", "; stringBuilder.Append(QuotedColumn(dbSchemaRow.BaseColumnName)); array[num] = CreateParameterForValue(dbCommand, GetBaseParameterName(i), text, DataRowVersion.Current, num, obj, dbSchemaRow, StatementType.Insert, whereClause: false); num++; } if (num == 0) { stringBuilder.Append(" DEFAULT VALUES"); } else { stringBuilder.Append(")"); stringBuilder.Append(" VALUES "); stringBuilder.Append("("); stringBuilder.Append(array[0]); for (int j = 1; j < num; j++) { stringBuilder.Append(", "); stringBuilder.Append(array[j]); } stringBuilder.Append(")"); } dbCommand.CommandText = stringBuilder.ToString(); RemoveExtraParameters(dbCommand, num); InsertCommand = dbCommand; return dbCommand; } private DbCommand BuildUpdateCommand(DataTableMapping mappings, DataRow dataRow) { DbCommand dbCommand = InitializeCommand(UpdateCommand); StringBuilder stringBuilder = new StringBuilder(); string value = " SET "; int num = 0; stringBuilder.Append("UPDATE "); stringBuilder.Append(QuotedBaseTableName); DbSchemaRow[] dbSchemaRows = _dbSchemaRows; for (int i = 0; i < dbSchemaRows.Length; i++) { DbSchemaRow dbSchemaRow = dbSchemaRows[i]; if (dbSchemaRow == null || dbSchemaRow.BaseColumnName.Length == 0 || !IncludeInUpdateSet(dbSchemaRow)) { continue; } object obj = null; string text = _sourceColumnNames[i]; if (mappings != null && dataRow != null) { DataColumn dataColumn = GetDataColumn(text, mappings, dataRow); if (dataColumn == null || (dbSchemaRow.IsReadOnly && dataColumn.ReadOnly)) { continue; } obj = GetColumnValue(dataRow, dataColumn, DataRowVersion.Current); if (!SetAllValues) { object columnValue = GetColumnValue(dataRow, dataColumn, DataRowVersion.Original); if (columnValue == obj || (columnValue != null && columnValue.Equals(obj))) { continue; } } } stringBuilder.Append(value); value = ", "; stringBuilder.Append(QuotedColumn(dbSchemaRow.BaseColumnName)); stringBuilder.Append(" = "); stringBuilder.Append(CreateParameterForValue(dbCommand, GetBaseParameterName(i), text, DataRowVersion.Current, num, obj, dbSchemaRow, StatementType.Update, whereClause: false)); num++; } bool num2 = num == 0; num = BuildWhereClause(mappings, dataRow, stringBuilder, dbCommand, num, isUpdate: true); dbCommand.CommandText = stringBuilder.ToString(); RemoveExtraParameters(dbCommand, num); UpdateCommand = dbCommand; if (!num2) { return dbCommand; } return null; } private int BuildWhereClause(DataTableMapping mappings, DataRow dataRow, StringBuilder builder, DbCommand command, int parameterCount, bool isUpdate) { string value = string.Empty; int num = 0; builder.Append(" WHERE "); builder.Append("("); DbSchemaRow[] dbSchemaRows = _dbSchemaRows; for (int i = 0; i < dbSchemaRows.Length; i++) { DbSchemaRow dbSchemaRow = dbSchemaRows[i]; if (dbSchemaRow != null && dbSchemaRow.BaseColumnName.Length != 0 && IncludeInWhereClause(dbSchemaRow, isUpdate)) { builder.Append(value); value = " AND "; object value2 = null; string text = _sourceColumnNames[i]; string value3 = QuotedColumn(dbSchemaRow.BaseColumnName); if (mappings != null && dataRow != null) { value2 = GetColumnValue(dataRow, text, mappings, DataRowVersion.Original); } if (!dbSchemaRow.AllowDBNull) { builder.Append("("); builder.Append(value3); builder.Append(" = "); builder.Append(CreateParameterForValue(command, GetOriginalParameterName(i), text, DataRowVersion.Original, parameterCount, value2, dbSchemaRow, isUpdate ? StatementType.Update : StatementType.Delete, whereClause: true)); parameterCount++; builder.Append(")"); } else { builder.Append("("); builder.Append("("); builder.Append(CreateParameterForNullTest(command, GetNullParameterName(i), text, DataRowVersion.Original, parameterCount, value2, dbSchemaRow, isUpdate ? StatementType.Update : StatementType.Delete, whereClause: true)); parameterCount++; builder.Append(" = 1"); builder.Append(" AND "); builder.Append(value3); builder.Append(" IS NULL"); builder.Append(")"); builder.Append(" OR "); builder.Append("("); builder.Append(value3); builder.Append(" = "); builder.Append(CreateParameterForValue(command, GetOriginalParameterName(i), text, DataRowVersion.Original, parameterCount, value2, dbSchemaRow, isUpdate ? StatementType.Update : StatementType.Delete, whereClause: true)); parameterCount++; builder.Append(")"); builder.Append(")"); } if (IncrementWhereCount(dbSchemaRow)) { num++; } } } builder.Append(")"); if (num == 0) { if (isUpdate) { if (ConflictOption.CompareRowVersion == ConflictOption) { throw ADP.DynamicSQLNoKeyInfoRowVersionUpdate(); } throw ADP.DynamicSQLNoKeyInfoUpdate(); } if (ConflictOption.CompareRowVersion == ConflictOption) { throw ADP.DynamicSQLNoKeyInfoRowVersionDelete(); } throw ADP.DynamicSQLNoKeyInfoDelete(); } return parameterCount; } private string CreateParameterForNullTest(DbCommand command, string parameterName, string sourceColumn, DataRowVersion version, int parameterCount, object value, DbSchemaRow row, StatementType statementType, bool whereClause) { DbParameter nextParameter = GetNextParameter(command, parameterCount); if (parameterName == null) { nextParameter.ParameterName = GetParameterName(1 + parameterCount); } else { nextParameter.ParameterName = parameterName; } nextParameter.Direction = ParameterDirection.Input; nextParameter.SourceColumn = sourceColumn; nextParameter.SourceVersion = version; nextParameter.SourceColumnNullMapping = true; nextParameter.Value = value; nextParameter.Size = 0; ApplyParameterInfo(nextParameter, row.DataRow, statementType, whereClause); nextParameter.DbType = DbType.Int32; nextParameter.Value = (ADP.IsNull(value) ? DbDataAdapter.s_parameterValueNullValue : DbDataAdapter.s_parameterValueNonNullValue); if (!command.Parameters.Contains(nextParameter)) { command.Parameters.Add(nextParameter); } if (parameterName == null) { return GetParameterPlaceholder(1 + parameterCount); } return string.Format(CultureInfo.InvariantCulture, _parameterMarkerFormat, parameterName); } private string CreateParameterForValue(DbCommand command, string parameterName, string sourceColumn, DataRowVersion version, int parameterCount, object value, DbSchemaRow row, StatementType statementType, bool whereClause) { DbParameter nextParameter = GetNextParameter(command, parameterCount); if (parameterName == null) { nextParameter.ParameterName = GetParameterName(1 + parameterCount); } else { nextParameter.ParameterName = parameterName; } nextParameter.Direction = ParameterDirection.Input; nextParameter.SourceColumn = sourceColumn; nextParameter.SourceVersion = version; nextParameter.SourceColumnNullMapping = false; nextParameter.Value = value; nextParameter.Size = 0; ApplyParameterInfo(nextParameter, row.DataRow, statementType, whereClause); if (!command.Parameters.Contains(nextParameter)) { command.Parameters.Add(nextParameter); } if (parameterName == null) { return GetParameterPlaceholder(1 + parameterCount); } return string.Format(CultureInfo.InvariantCulture, _parameterMarkerFormat, parameterName); } protected override void Dispose(bool disposing) { if (disposing) { DataAdapter = null; } base.Dispose(disposing); } private DataTableMapping GetTableMapping(DataRow dataRow) { DataTableMapping result = null; if (dataRow != null) { DataTable table = dataRow.Table; if (table != null) { DbDataAdapter dataAdapter = DataAdapter; if (dataAdapter != null) { result = dataAdapter.GetTableMapping(table); } else { string tableName = table.TableName; result = new DataTableMapping(tableName, tableName); } } } return result; } private string GetBaseParameterName(int index) { if (_parameterNames != null) { return _parameterNames.GetBaseParameterName(index); } return null; } private string GetOriginalParameterName(int index) { if (_parameterNames != null) { return _parameterNames.GetOriginalParameterName(index); } return null; } private string GetNullParameterName(int index) { if (_parameterNames != null) { return _parameterNames.GetNullParameterName(index); } return null; } private DbCommand GetSelectCommand() { DbCommand dbCommand = null; DbDataAdapter dataAdapter = DataAdapter; if (dataAdapter != null) { if (_missingMappingAction == (MissingMappingAction)0) { _missingMappingAction = dataAdapter.MissingMappingAction; } dbCommand = dataAdapter.SelectCommand; } if (dbCommand == null) { throw ADP.MissingSourceCommand(); } return dbCommand; } public DbCommand GetInsertCommand() { return GetInsertCommand(null, useColumnsForParameterNames: false); } public DbCommand GetInsertCommand(bool useColumnsForParameterNames) { return GetInsertCommand(null, useColumnsForParameterNames); } internal DbCommand GetInsertCommand(DataRow dataRow, bool useColumnsForParameterNames) { BuildCache(closeConnection: true, dataRow, useColumnsForParameterNames); BuildInsertCommand(GetTableMapping(dataRow), dataRow); return InsertCommand; } public DbCommand GetUpdateCommand() { return GetUpdateCommand(null, useColumnsForParameterNames: false); } public DbCommand GetUpdateCommand(bool useColumnsForParameterNames) { return GetUpdateCommand(null, useColumnsForParameterNames); } internal DbCommand GetUpdateCommand(DataRow dataRow, bool useColumnsForParameterNames) { BuildCache(closeConnection: true, dataRow, useColumnsForParameterNames); BuildUpdateCommand(GetTableMapping(dataRow), dataRow); return UpdateCommand; } public DbCommand GetDeleteCommand() { return GetDeleteCommand(null, useColumnsForParameterNames: false); } public DbCommand GetDeleteCommand(bool useColumnsForParameterNames) { return GetDeleteCommand(null, useColumnsForParameterNames); } internal DbCommand GetDeleteCommand(DataRow dataRow, bool useColumnsForParameterNames) { BuildCache(closeConnection: true, dataRow, useColumnsForParameterNames); BuildDeleteCommand(GetTableMapping(dataRow), dataRow); return DeleteCommand; } private object GetColumnValue(DataRow row, string columnName, DataTableMapping mappings, DataRowVersion version) { return GetColumnValue(row, GetDataColumn(columnName, mappings, row), version); } private object GetColumnValue(DataRow row, DataColumn column, DataRowVersion version) { object result = null; if (column != null) { result = row[column, version]; } return result; } private DataColumn GetDataColumn(string columnName, DataTableMapping tablemapping, DataRow row) { DataColumn result = null; if (!string.IsNullOrEmpty(columnName)) { result = tablemapping.GetDataColumn(columnName, null, row.Table, _missingMappingAction, MissingSchemaAction.Error); } return result; } private static DbParameter GetNextParameter(DbCommand command, int pcount) { if (pcount < command.Parameters.Count) { return command.Parameters[pcount]; } return command.CreateParameter(); } private bool IncludeInInsertValues(DbSchemaRow row) { if (!row.IsAutoIncrement && !row.IsHidden && !row.IsExpression && !row.IsRowVersion) { return !row.IsReadOnly; } return false; } private bool IncludeInUpdateSet(DbSchemaRow row) { if (!row.IsAutoIncrement && !row.IsRowVersion && !row.IsHidden) { return !row.IsReadOnly; } return false; } private bool IncludeInWhereClause(DbSchemaRow row, bool isUpdate) { bool flag = IncrementWhereCount(row); if (flag && row.IsHidden) { if (ConflictOption.CompareRowVersion == ConflictOption) { throw ADP.DynamicSQLNoKeyInfoRowVersionUpdate(); } throw ADP.DynamicSQLNoKeyInfoUpdate(); } if (!flag && ConflictOption.CompareAllSearchableValues == ConflictOption) { flag = !row.IsLong && !row.IsRowVersion && !row.IsHidden; } return flag; } private bool IncrementWhereCount(DbSchemaRow row) { ConflictOption conflictOption = ConflictOption; switch (conflictOption) { case ConflictOption.CompareAllSearchableValues: case ConflictOption.OverwriteChanges: if ((row.IsKey || row.IsUnique) && !row.IsLong) { return !row.IsRowVersion; } return false; case ConflictOption.CompareRowVersion: if (((row.IsKey || row.IsUnique) && !_hasPartialPrimaryKey) || row.IsRowVersion) { return !row.IsLong; } return false; default: throw ADP.InvalidConflictOptions(conflictOption); } } protected virtual DbCommand InitializeCommand(DbCommand command) { if (command == null) { DbCommand selectCommand = GetSelectCommand(); command = selectCommand.Connection.CreateCommand(); command.CommandTimeout = selectCommand.CommandTimeout; command.Transaction = selectCommand.Transaction; } command.CommandType = CommandType.Text; command.UpdatedRowSource = UpdateRowSource.None; return command; } private string QuotedColumn(string column) { return ADP.BuildQuotedString(QuotePrefix, QuoteSuffix, column); } public virtual string QuoteIdentifier(string unquotedIdentifier) { throw ADP.NotSupported(); } public virtual void RefreshSchema() { _dbSchemaTable = null; _dbSchemaRows = null; _sourceColumnNames = null; _quotedBaseTableName = null; DbDataAdapter dataAdapter = DataAdapter; if (dataAdapter != null) { if (InsertCommand == dataAdapter.InsertCommand) { dataAdapter.InsertCommand = null; } if (UpdateCommand == dataAdapter.UpdateCommand) { dataAdapter.UpdateCommand = null; } if (DeleteCommand == dataAdapter.DeleteCommand) { dataAdapter.DeleteCommand = null; } } DbCommand insertCommand; if ((insertCommand = InsertCommand) != null) { insertCommand.Dispose(); } if ((insertCommand = UpdateCommand) != null) { insertCommand.Dispose(); } if ((insertCommand = DeleteCommand) != null) { insertCommand.Dispose(); } InsertCommand = null; UpdateCommand = null; DeleteCommand = null; } private static void RemoveExtraParameters(DbCommand command, int usedParameterCount) { for (int num = command.Parameters.Count - 1; num >= usedParameterCount; num--) { command.Parameters.RemoveAt(num); } } protected void RowUpdatingHandler(RowUpdatingEventArgs rowUpdatingEvent) { if (rowUpdatingEvent == null) { throw ADP.ArgumentNull("rowUpdatingEvent"); } try { if (rowUpdatingEvent.Status != 0) { return; } StatementType statementType = rowUpdatingEvent.StatementType; DbCommand dbCommand = (DbCommand)rowUpdatingEvent.Command; if (dbCommand != null) { switch (statementType) { case StatementType.Select: return; case StatementType.Insert: dbCommand = InsertCommand; break; case StatementType.Update: dbCommand = UpdateCommand; break; case StatementType.Delete: dbCommand = DeleteCommand; break; default: throw ADP.InvalidStatementType(statementType); } if (dbCommand != rowUpdatingEvent.Command) { dbCommand = (DbCommand)rowUpdatingEvent.Command; if (dbCommand != null && dbCommand.Connection == null) { DbCommand dbCommand2 = DataAdapter?.SelectCommand; if (dbCommand2 != null) { dbCommand.Connection = dbCommand2.Connection; } } } else { dbCommand = null; } } if (dbCommand == null) { RowUpdatingHandlerBuilder(rowUpdatingEvent); } } catch (Exception ex) when (ADP.IsCatchableExceptionType(ex)) { ADP.TraceExceptionForCapture(ex); rowUpdatingEvent.Status = UpdateStatus.ErrorsOccurred; rowUpdatingEvent.Errors = ex; } } private void RowUpdatingHandlerBuilder(RowUpdatingEventArgs rowUpdatingEvent) { DataRow row = rowUpdatingEvent.Row; BuildCache(closeConnection: false, row, useColumnsForParameterNames: false); DbCommand dbCommand = rowUpdatingEvent.StatementType switch { StatementType.Insert => BuildInsertCommand(rowUpdatingEvent.TableMapping, row), StatementType.Update => BuildUpdateCommand(rowUpdatingEvent.TableMapping, row), StatementType.Delete => BuildDeleteCommand(rowUpdatingEvent.TableMapping, row), _ => throw ADP.InvalidStatementType(rowUpdatingEvent.StatementType), }; if (dbCommand == null) { row?.AcceptChanges(); rowUpdatingEvent.Status = UpdateStatus.SkipCurrentRow; } rowUpdatingEvent.Command = dbCommand; } public virtual string UnquoteIdentifier(string quotedIdentifier) { throw ADP.NotSupported(); } protected abstract void ApplyParameterInfo(DbParameter parameter, DataRow row, StatementType statementType, bool whereClause); protected abstract string GetParameterName(int parameterOrdinal); protected abstract string GetParameterName(string parameterName); protected abstract string GetParameterPlaceholder(int parameterOrdinal); protected abstract void SetRowUpdatingHandler(DbDataAdapter adapter); } internal sealed class DbSchemaRow { internal const string SchemaMappingUnsortedIndex = "SchemaMapping Unsorted Index"; private DbSchemaTable _schemaTable; private DataRow _dataRow; internal DataRow DataRow => _dataRow; internal string ColumnName { get { object obj = _dataRow[_schemaTable.ColumnName, DataRowVersion.Default]; if (!Convert.IsDBNull(obj)) { return Convert.ToString(obj, CultureInfo.InvariantCulture); } return string.Empty; } } internal int Size { get { object value = _dataRow[_schemaTable.Size, DataRowVersion.Default]; if (!Convert.IsDBNull(value)) { return Convert.ToInt32(value, CultureInfo.InvariantCulture); } return 0; } } internal string BaseColumnName { get { if (_schemaTable.BaseColumnName != null) { object obj = _dataRow[_schemaTable.BaseColumnName, DataRowVersion.Default]; if (!Convert.IsDBNull(obj)) { return Convert.ToString(obj, CultureInfo.InvariantCulture); } } return string.Empty; } } internal string BaseServerName { get { if (_schemaTable.BaseServerName != null) { object obj = _dataRow[_schemaTable.BaseServerName, DataRowVersion.Default]; if (!Convert.IsDBNull(obj)) { return Convert.ToString(obj, CultureInfo.InvariantCulture); } } return string.Empty; } } internal string BaseCatalogName { get { if (_schemaTable.BaseCatalogName != null) { object obj = _dataRow[_schemaTable.BaseCatalogName, DataRowVersion.Default]; if (!Convert.IsDBNull(obj)) { return Convert.ToString(obj, CultureInfo.InvariantCulture); } } return string.Empty; } } internal string BaseSchemaName { get { if (_schemaTable.BaseSchemaName != null) { object obj = _dataRow[_schemaTable.BaseSchemaName, DataRowVersion.Default]; if (!Convert.IsDBNull(obj)) { return Convert.ToString(obj, CultureInfo.InvariantCulture); } } return string.Empty; } } internal string BaseTableName { get { if (_schemaTable.BaseTableName != null) { object obj = _dataRow[_schemaTable.BaseTableName, DataRowVersion.Default]; if (!Convert.IsDBNull(obj)) { return Convert.ToString(obj, CultureInfo.InvariantCulture); } } return string.Empty; } } internal bool IsAutoIncrement { get { if (_schemaTable.IsAutoIncrement != null) { object value = _dataRow[_schemaTable.IsAutoIncrement, DataRowVersion.Default]; if (!Convert.IsDBNull(value)) { return Convert.ToBoolean(value, CultureInfo.InvariantCulture); } } return false; } } internal bool IsUnique { get { if (_schemaTable.IsUnique != null) { object value = _dataRow[_schemaTable.IsUnique, DataRowVersion.Default]; if (!Convert.IsDBNull(value)) { return Convert.ToBoolean(value, CultureInfo.InvariantCulture); } } return false; } } internal bool IsRowVersion { get { if (_schemaTable.IsRowVersion != null) { object value = _dataRow[_schemaTable.IsRowVersion, DataRowVersion.Default]; if (!Convert.IsDBNull(value)) { return Convert.ToBoolean(value, CultureInfo.InvariantCulture); } } return false; } } internal bool IsKey { get { if (_schemaTable.IsKey != null) { object value = _dataRow[_schemaTable.IsKey, DataRowVersion.Default]; if (!Convert.IsDBNull(value)) { return Convert.ToBoolean(value, CultureInfo.InvariantCulture); } } return false; } } internal bool IsExpression { get { if (_schemaTable.IsExpression != null) { object value = _dataRow[_schemaTable.IsExpression, DataRowVersion.Default]; if (!Convert.IsDBNull(value)) { return Convert.ToBoolean(value, CultureInfo.InvariantCulture); } } return false; } } internal bool IsHidden { get { if (_schemaTable.IsHidden != null) { object value = _dataRow[_schemaTable.IsHidden, DataRowVersion.Default]; if (!Convert.IsDBNull(value)) { return Convert.ToBoolean(value, CultureInfo.InvariantCulture); } } return false; } } internal bool IsLong { get { if (_schemaTable.IsLong != null) { object value = _dataRow[_schemaTable.IsLong, DataRowVersion.Default]; if (!Convert.IsDBNull(value)) { return Convert.ToBoolean(value, CultureInfo.InvariantCulture); } } return false; } } internal bool IsReadOnly { get { if (_schemaTable.IsReadOnly != null) { object value = _dataRow[_schemaTable.IsReadOnly, DataRowVersion.Default]; if (!Convert.IsDBNull(value)) { return Convert.ToBoolean(value, CultureInfo.InvariantCulture); } } return false; } } internal Type DataType { get { if (_schemaTable.DataType != null) { object obj = _dataRow[_schemaTable.DataType, DataRowVersion.Default]; if (!Convert.IsDBNull(obj)) { return (Type)obj; } } return null; } } internal bool AllowDBNull { get { if (_schemaTable.AllowDBNull != null) { object value = _dataRow[_schemaTable.AllowDBNull, DataRowVersion.Default]; if (!Convert.IsDBNull(value)) { return Convert.ToBoolean(value, CultureInfo.InvariantCulture); } } return true; } } internal int UnsortedIndex => (int)_dataRow[_schemaTable.UnsortedIndex, DataRowVersion.Default]; internal static DbSchemaRow[] GetSortedSchemaRows(DataTable dataTable, bool returnProviderSpecificTypes) { DataColumn dataColumn = dataTable.Columns["SchemaMapping Unsorted Index"]; if (dataColumn == null) { dataColumn = new DataColumn("SchemaMapping Unsorted Index", typeof(int)); dataTable.Columns.Add(dataColumn); } int count = dataTable.Rows.Count; for (int i = 0; i < count; i++) { dataTable.Rows[i][dataColumn] = i; } DbSchemaTable schemaTable = new DbSchemaTable(dataTable, returnProviderSpecificTypes); DataRow[] array = dataTable.Select(null, "ColumnOrdinal ASC", DataViewRowState.CurrentRows); DbSchemaRow[] array2 = new DbSchemaRow[array.Length]; for (int j = 0; j < array.Length; j++) { array2[j] = new DbSchemaRow(schemaTable, array[j]); } return array2; } internal DbSchemaRow(DbSchemaTable schemaTable, DataRow dataRow) { _schemaTable = schemaTable; _dataRow = dataRow; } } internal sealed class DbSchemaTable { private enum ColumnEnum { ColumnName, ColumnOrdinal, ColumnSize, BaseServerName, BaseCatalogName, BaseColumnName, BaseSchemaName, BaseTableName, IsAutoIncrement, IsUnique, IsKey, IsRowVersion, DataType, ProviderSpecificDataType, AllowDBNull, ProviderType, IsExpression, IsHidden, IsLong, IsReadOnly, SchemaMappingUnsortedIndex } private static readonly string[] s_DBCOLUMN_NAME = new string[21] { SchemaTableColumn.ColumnName, SchemaTableColumn.ColumnOrdinal, SchemaTableColumn.ColumnSize, SchemaTableOptionalColumn.BaseServerName, SchemaTableOptionalColumn.BaseCatalogName, SchemaTableColumn.BaseColumnName, SchemaTableColumn.BaseSchemaName, SchemaTableColumn.BaseTableName, SchemaTableOptionalColumn.IsAutoIncrement, SchemaTableColumn.IsUnique, SchemaTableColumn.IsKey, SchemaTableOptionalColumn.IsRowVersion, SchemaTableColumn.DataType, SchemaTableOptionalColumn.ProviderSpecificDataType, SchemaTableColumn.AllowDBNull, SchemaTableColumn.ProviderType, SchemaTableColumn.IsExpression, SchemaTableOptionalColumn.IsHidden, SchemaTableColumn.IsLong, SchemaTableOptionalColumn.IsReadOnly, "SchemaMapping Unsorted Index" }; internal DataTable _dataTable; private DataColumnCollection _columns; private DataColumn[] _columnCache = new DataColumn[s_DBCOLUMN_NAME.Length]; private bool _returnProviderSpecificTypes; internal DataColumn ColumnName => CachedDataColumn(ColumnEnum.ColumnName); internal DataColumn Size => CachedDataColumn(ColumnEnum.ColumnSize); internal DataColumn BaseServerName => CachedDataColumn(ColumnEnum.BaseServerName); internal DataColumn BaseColumnName => CachedDataColumn(ColumnEnum.BaseColumnName); internal DataColumn BaseTableName => CachedDataColumn(ColumnEnum.BaseTableName); internal DataColumn BaseCatalogName => CachedDataColumn(ColumnEnum.BaseCatalogName); internal DataColumn BaseSchemaName => CachedDataColumn(ColumnEnum.BaseSchemaName); internal DataColumn IsAutoIncrement => CachedDataColumn(ColumnEnum.IsAutoIncrement); internal DataColumn IsUnique => CachedDataColumn(ColumnEnum.IsUnique); internal DataColumn IsKey => CachedDataColumn(ColumnEnum.IsKey); internal DataColumn IsRowVersion => CachedDataColumn(ColumnEnum.IsRowVersion); internal DataColumn AllowDBNull => CachedDataColumn(ColumnEnum.AllowDBNull); internal DataColumn IsExpression => CachedDataColumn(ColumnEnum.IsExpression); internal DataColumn IsHidden => CachedDataColumn(ColumnEnum.IsHidden); internal DataColumn IsLong => CachedDataColumn(ColumnEnum.IsLong); internal DataColumn IsReadOnly => CachedDataColumn(ColumnEnum.IsReadOnly); internal DataColumn UnsortedIndex => CachedDataColumn(ColumnEnum.SchemaMappingUnsortedIndex); internal DataColumn DataType { get { if (_returnProviderSpecificTypes) { return CachedDataColumn(ColumnEnum.ProviderSpecificDataType, ColumnEnum.DataType); } return CachedDataColumn(ColumnEnum.DataType); } } internal DbSchemaTable(DataTable dataTable, bool returnProviderSpecificTypes) { _dataTable = dataTable; _columns = dataTable.Columns; _returnProviderSpecificTypes = returnProviderSpecificTypes; } private DataColumn CachedDataColumn(ColumnEnum column) { return CachedDataColumn(column, column); } private DataColumn CachedDataColumn(ColumnEnum column, ColumnEnum column2) { DataColumn dataColumn = _columnCache[(int)column]; if (dataColumn == null) { int num = _columns.IndexOf(s_DBCOLUMN_NAME[(int)column]); if (-1 == num && column != column2) { num = _columns.IndexOf(s_DBCOLUMN_NAME[(int)column2]); } if (-1 != num) { dataColumn = _columns[num]; _columnCache[(int)column] = dataColumn; } } return dataColumn; } } public class DataAdapter : Component, IDataAdapter { private static readonly object s_eventFillError = new object(); private bool _acceptChangesDuringUpdate = true; private bool _acceptChangesDuringUpdateAfterInsert = true; private bool _continueUpdateOnError; private bool _hasFillErrorHandler; private bool _returnProviderSpecificTypes; private bool _acceptChangesDuringFill = true; private LoadOption _fillLoadOption; private MissingMappingAction _missingMappingAction = MissingMappingAction.Passthrough; private MissingSchemaAction _missingSchemaAction = MissingSchemaAction.Add; private DataTableMappingCollection _tableMappings; private static int s_objectTypeCount; internal readonly int _objectID = Interlocked.Increment(ref s_objectTypeCount); [DefaultValue(true)] public bool AcceptChangesDuringFill { get { return _acceptChangesDuringFill; } set { _acceptChangesDuringFill = value; } } [DefaultValue(true)] public bool AcceptChangesDuringUpdate { get { return _acceptChangesDuringUpdate; } set { _acceptChangesDuringUpdate = value; } } [DefaultValue(false)] public bool ContinueUpdateOnError { get { return _continueUpdateOnError; } set { _continueUpdateOnError = value; } } [RefreshProperties(RefreshProperties.All)] public LoadOption FillLoadOption { get { if (_fillLoadOption == (LoadOption)0) { return LoadOption.OverwriteChanges; } return _fillLoadOption; } set { if ((uint)value <= 3u) { _fillLoadOption = value; return; } throw ADP.InvalidLoadOption(value); } } [DefaultValue(MissingMappingAction.Passthrough)] public MissingMappingAction MissingMappingAction { get { return _missingMappingAction; } set { if ((uint)(value - 1) <= 2u) { _missingMappingAction = value; return; } throw ADP.InvalidMissingMappingAction(value); } } [DefaultValue(MissingSchemaAction.Add)] public MissingSchemaAction MissingSchemaAction { get { return _missingSchemaAction; } set { if ((uint)(value - 1) <= 3u) { _missingSchemaAction = value; return; } throw ADP.InvalidMissingSchemaAction(value); } } internal int ObjectID => _objectID; [DefaultValue(false)] public virtual bool ReturnProviderSpecificTypes { get { return _returnProviderSpecificTypes; } set { _returnProviderSpecificTypes = value; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public DataTableMappingCollection TableMappings { get { DataTableMappingCollection dataTableMappingCollection = _tableMappings; if (dataTableMappingCollection == null) { dataTableMappingCollection = CreateTableMappings(); if (dataTableMappingCollection == null) { dataTableMappingCollection = new DataTableMappingCollection(); } _tableMappings = dataTableMappingCollection; } return dataTableMappingCollection; } } ITableMappingCollection IDataAdapter.TableMappings => TableMappings; public event FillErrorEventHandler FillError { add { _hasFillErrorHandler = true; base.Events.AddHandler(s_eventFillError, value); } remove { base.Events.RemoveHandler(s_eventFillError, value); } } [Conditional("DEBUG")] private void AssertReaderHandleFieldCount(DataReaderContainer readerHandler) { } [Conditional("DEBUG")] private void AssertSchemaMapping(SchemaMapping mapping) { } protected DataAdapter() { GC.SuppressFinalize(this); } protected DataAdapter(DataAdapter from) { CloneFrom(from); } [EditorBrowsable(EditorBrowsableState.Never)] public virtual bool ShouldSerializeAcceptChangesDuringFill() { return _fillLoadOption == (LoadOption)0; } [EditorBrowsable(EditorBrowsableState.Never)] public void ResetFillLoadOption() { _fillLoadOption = (LoadOption)0; } [EditorBrowsable(EditorBrowsableState.Never)] public virtual bool ShouldSerializeFillLoadOption() { return _fillLoadOption != (LoadOption)0; } protected virtual bool ShouldSerializeTableMappings() { return true; } protected bool HasTableMappings() { if (_tableMappings != null) { return 0 < TableMappings.Count; } return false; } [Obsolete("CloneInternals() has been deprecated. Use the DataAdapter(DataAdapter from) constructor. http://go.microsoft.com/fwlink/?linkid=14202")] protected virtual DataAdapter CloneInternals() { DataAdapter obj = (DataAdapter)Activator.CreateInstance(GetType(), BindingFlags.Instance | BindingFlags.Public, null, null, CultureInfo.InvariantCulture, null); obj.CloneFrom(this); return obj; } private void CloneFrom(DataAdapter from) { _acceptChangesDuringUpdate = from._acceptChangesDuringUpdate; _acceptChangesDuringUpdateAfterInsert = from._acceptChangesDuringUpdateAfterInsert; _continueUpdateOnError = from._continueUpdateOnError; _returnProviderSpecificTypes = from._returnProviderSpecificTypes; _acceptChangesDuringFill = from._acceptChangesDuringFill; _fillLoadOption = from._fillLoadOption; _missingMappingAction = from._missingMappingAction; _missingSchemaAction = from._missingSchemaAction; if (from._tableMappings == null || 0 >= from.TableMappings.Count) { return; } DataTableMappingCollection tableMappings = TableMappings; foreach (object tableMapping in from.TableMappings) { tableMappings.Add((tableMapping is ICloneable) ? ((ICloneable)tableMapping).Clone() : tableMapping); } } protected virtual DataTableMappingCollection CreateTableMappings() { DataCommonEventSource.Log.Trace(" {0}", ObjectID); return new DataTableMappingCollection(); } protected override void Dispose(bool disposing) { if (disposing) { _tableMappings = null; } base.Dispose(disposing); } public virtual DataTable[] FillSchema(DataSet dataSet, SchemaType schemaType) { throw ADP.NotSupported(); } protected virtual DataTable[] FillSchema(DataSet dataSet, SchemaType schemaType, string srcTable, IDataReader dataReader) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, dataSet, schemaType={1}, srcTable, dataReader", ObjectID, schemaType); try { if (dataSet == null) { throw ADP.ArgumentNull("dataSet"); } if (SchemaType.Source != schemaType && SchemaType.Mapped != schemaType) { throw ADP.InvalidSchemaType(schemaType); } if (string.IsNullOrEmpty(srcTable)) { throw ADP.FillSchemaRequiresSourceTableName("srcTable"); } if (dataReader == null || dataReader.IsClosed) { throw ADP.FillRequires("dataReader"); } return (DataTable[])FillSchemaFromReader(dataSet, null, schemaType, srcTable, dataReader); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } protected virtual DataTable FillSchema(DataTable dataTable, SchemaType schemaType, IDataReader dataReader) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, dataTable, schemaType, dataReader", ObjectID); try { if (dataTable == null) { throw ADP.ArgumentNull("dataTable"); } if (SchemaType.Source != schemaType && SchemaType.Mapped != schemaType) { throw ADP.InvalidSchemaType(schemaType); } if (dataReader == null || dataReader.IsClosed) { throw ADP.FillRequires("dataReader"); } return (DataTable)FillSchemaFromReader(null, dataTable, schemaType, null, dataReader); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } internal object FillSchemaFromReader(DataSet dataset, DataTable datatable, SchemaType schemaType, string srcTable, IDataReader dataReader) { DataTable[] array = null; int num = 0; do { DataReaderContainer dataReaderContainer = DataReaderContainer.Create(dataReader, ReturnProviderSpecificTypes); if (0 < dataReaderContainer.FieldCount) { string sourceTableName = null; if (dataset != null) { sourceTableName = GetSourceTableName(srcTable, num); num++; } SchemaMapping schemaMapping = new SchemaMapping(this, dataset, datatable, dataReaderContainer, keyInfo: true, schemaType, sourceTableName, gettingData: false, null, null); if (datatable != null) { return schemaMapping.DataTable; } if (schemaMapping.DataTable != null) { array = ((array != null) ? AddDataTableToArray(array, schemaMapping.DataTable) : new DataTable[1] { schemaMapping.DataTable }); } } } while (dataReader.NextResult()); object obj = array; if (obj == null && datatable == null) { obj = Array.Empty(); } return obj; } public virtual int Fill(DataSet dataSet) { throw ADP.NotSupported(); } protected virtual int Fill(DataSet dataSet, string srcTable, IDataReader dataReader, int startRecord, int maxRecords) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, dataSet, srcTable, dataReader, startRecord, maxRecords", ObjectID); try { if (dataSet == null) { throw ADP.FillRequires("dataSet"); } if (string.IsNullOrEmpty(srcTable)) { throw ADP.FillRequiresSourceTableName("srcTable"); } if (dataReader == null) { throw ADP.FillRequires("dataReader"); } if (startRecord < 0) { throw ADP.InvalidStartRecord("startRecord", startRecord); } if (maxRecords < 0) { throw ADP.InvalidMaxRecords("maxRecords", maxRecords); } if (dataReader.IsClosed) { return 0; } DataReaderContainer dataReader2 = DataReaderContainer.Create(dataReader, ReturnProviderSpecificTypes); return FillFromReader(dataSet, null, srcTable, dataReader2, startRecord, maxRecords, null, null); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } protected virtual int Fill(DataTable dataTable, IDataReader dataReader) { DataTable[] dataTables = new DataTable[1] { dataTable }; return Fill(dataTables, dataReader, 0, 0); } protected virtual int Fill(DataTable[] dataTables, IDataReader dataReader, int startRecord, int maxRecords) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, dataTables[], dataReader, startRecord, maxRecords", ObjectID); try { ADP.CheckArgumentLength(dataTables, "dataTables"); if (dataTables == null || dataTables.Length == 0 || dataTables[0] == null) { throw ADP.FillRequires("dataTable"); } if (dataReader == null) { throw ADP.FillRequires("dataReader"); } if (1 < dataTables.Length && (startRecord != 0 || maxRecords != 0)) { throw ADP.NotSupported(); } int result = 0; bool flag = false; DataSet dataSet = dataTables[0].DataSet; try { if (dataSet != null) { flag = dataSet.EnforceConstraints; dataSet.EnforceConstraints = false; } for (int i = 0; i < dataTables.Length && !dataReader.IsClosed; i++) { DataReaderContainer dataReaderContainer = DataReaderContainer.Create(dataReader, ReturnProviderSpecificTypes); if (dataReaderContainer.FieldCount <= 0) { if (i != 0) { continue; } bool flag2; do { flag2 = FillNextResult(dataReaderContainer); } while (flag2 && dataReaderContainer.FieldCount <= 0); if (!flag2) { break; } } if (0 >= i || FillNextResult(dataReaderContainer)) { int num = FillFromReader(null, dataTables[i], null, dataReaderContainer, startRecord, maxRecords, null, null); if (i == 0) { result = num; } continue; } break; } } catch (ConstraintException) { flag = false; throw; } finally { if (flag) { dataSet.EnforceConstraints = true; } } return result; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } internal int FillFromReader(DataSet dataset, DataTable datatable, string srcTable, DataReaderContainer dataReader, int startRecord, int maxRecords, DataColumn parentChapterColumn, object parentChapterValue) { int result = 0; int num = 0; do { if (0 >= dataReader.FieldCount) { continue; } SchemaMapping schemaMapping = FillMapping(dataset, datatable, srcTable, dataReader, num, parentChapterColumn, parentChapterValue); num++; if (schemaMapping == null || schemaMapping.DataValues == null || schemaMapping.DataTable == null) { continue; } schemaMapping.DataTable.BeginLoadData(); try { if (1 == num && (0 < startRecord || 0 < maxRecords)) { result = FillLoadDataRowChunk(schemaMapping, startRecord, maxRecords); } else { int num2 = FillLoadDataRow(schemaMapping); if (1 == num) { result = num2; } } } finally { schemaMapping.DataTable.EndLoadData(); } if (datatable != null) { break; } } while (FillNextResult(dataReader)); return result; } private int FillLoadDataRowChunk(SchemaMapping mapping, int startRecord, int maxRecords) { DataReaderContainer dataReader = mapping.DataReader; while (0 < startRecord) { if (!dataReader.Read()) { return 0; } startRecord--; } int num = 0; if (0 < maxRecords) { while (num < maxRecords && dataReader.Read()) { if (_hasFillErrorHandler) { try { mapping.LoadDataRowWithClear(); num++; } catch (Exception e) when (ADP.IsCatchableExceptionType(e)) { ADP.TraceExceptionForCapture(e); OnFillErrorHandler(e, mapping.DataTable, mapping.DataValues); } } else { mapping.LoadDataRow(); num++; } } } else { num = FillLoadDataRow(mapping); } return num; } private int FillLoadDataRow(SchemaMapping mapping) { int num = 0; DataReaderContainer dataReader = mapping.DataReader; if (_hasFillErrorHandler) { while (dataReader.Read()) { try { mapping.LoadDataRowWithClear(); num++; } catch (Exception e) when (ADP.IsCatchableExceptionType(e)) { ADP.TraceExceptionForCapture(e); OnFillErrorHandler(e, mapping.DataTable, mapping.DataValues); } } } else { while (dataReader.Read()) { mapping.LoadDataRow(); num++; } } return num; } private SchemaMapping FillMappingInternal(DataSet dataset, DataTable datatable, string srcTable, DataReaderContainer dataReader, int schemaCount, DataColumn parentChapterColumn, object parentChapterValue) { bool keyInfo = MissingSchemaAction.AddWithKey == MissingSchemaAction; string sourceTableName = null; if (dataset != null) { sourceTableName = GetSourceTableName(srcTable, schemaCount); } return new SchemaMapping(this, dataset, datatable, dataReader, keyInfo, SchemaType.Mapped, sourceTableName, gettingData: true, parentChapterColumn, parentChapterValue); } private SchemaMapping FillMapping(DataSet dataset, DataTable datatable, string srcTable, DataReaderContainer dataReader, int schemaCount, DataColumn parentChapterColumn, object parentChapterValue) { SchemaMapping result = null; if (_hasFillErrorHandler) { try { result = FillMappingInternal(dataset, datatable, srcTable, dataReader, schemaCount, parentChapterColumn, parentChapterValue); } catch (Exception e) when (ADP.IsCatchableExceptionType(e)) { ADP.TraceExceptionForCapture(e); OnFillErrorHandler(e, null, null); } } else { result = FillMappingInternal(dataset, datatable, srcTable, dataReader, schemaCount, parentChapterColumn, parentChapterValue); } return result; } private bool FillNextResult(DataReaderContainer dataReader) { bool result = true; if (_hasFillErrorHandler) { try { result = dataReader.NextResult(); } catch (Exception e) when (ADP.IsCatchableExceptionType(e)) { ADP.TraceExceptionForCapture(e); OnFillErrorHandler(e, null, null); } } else { result = dataReader.NextResult(); } return result; } [EditorBrowsable(EditorBrowsableState.Advanced)] public virtual IDataParameter[] GetFillParameters() { return Array.Empty(); } internal DataTableMapping GetTableMappingBySchemaAction(string sourceTableName, string dataSetTableName, MissingMappingAction mappingAction) { return DataTableMappingCollection.GetTableMappingBySchemaAction(_tableMappings, sourceTableName, dataSetTableName, mappingAction); } internal int IndexOfDataSetTable(string dataSetTable) { if (_tableMappings != null) { return TableMappings.IndexOfDataSetTable(dataSetTable); } return -1; } protected virtual void OnFillError(FillErrorEventArgs value) { ((FillErrorEventHandler)base.Events[s_eventFillError])?.Invoke(this, value); } private void OnFillErrorHandler(Exception e, DataTable dataTable, object[] dataValues) { FillErrorEventArgs fillErrorEventArgs = new FillErrorEventArgs(dataTable, dataValues); fillErrorEventArgs.Errors = e; OnFillError(fillErrorEventArgs); if (!fillErrorEventArgs.Continue) { if (fillErrorEventArgs.Errors != null) { throw fillErrorEventArgs.Errors; } throw e; } } public virtual int Update(DataSet dataSet) { throw ADP.NotSupported(); } private static DataTable[] AddDataTableToArray(DataTable[] tables, DataTable newTable) { for (int i = 0; i < tables.Length; i++) { if (tables[i] == newTable) { return tables; } } DataTable[] array = new DataTable[tables.Length + 1]; for (int j = 0; j < tables.Length; j++) { array[j] = tables[j]; } array[tables.Length] = newTable; return array; } private static string GetSourceTableName(string srcTable, int index) { if (index == 0) { return srcTable; } return srcTable + index.ToString(CultureInfo.InvariantCulture); } } internal sealed class LoadAdapter : DataAdapter { internal LoadAdapter() { } internal int FillFromReader(DataTable[] dataTables, IDataReader dataReader, int startRecord, int maxRecords) { return Fill(dataTables, dataReader, startRecord, maxRecords); } } [TypeConverter(typeof(DataColumnMappingConverter))] public sealed class DataColumnMapping : MarshalByRefObject, IColumnMapping, ICloneable { internal sealed class DataColumnMappingConverter : ExpandableObjectConverter { public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { if (typeof(InstanceDescriptor) == destinationType) { return true; } return base.CanConvertTo(context, destinationType); } public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (null == destinationType) { throw ADP.ArgumentNull("destinationType"); } if (typeof(InstanceDescriptor) == destinationType && value is DataColumnMapping) { DataColumnMapping dataColumnMapping = (DataColumnMapping)value; object[] arguments = new object[2] { dataColumnMapping.SourceColumn, dataColumnMapping.DataSetColumn }; Type[] types = new Type[2] { typeof(string), typeof(string) }; return new InstanceDescriptor(typeof(DataColumnMapping).GetConstructor(types), arguments); } return base.ConvertTo(context, culture, value, destinationType); } } private DataColumnMappingCollection _parent; private string _dataSetColumnName; private string _sourceColumnName; [DefaultValue("")] public string DataSetColumn { get { return _dataSetColumnName ?? string.Empty; } set { _dataSetColumnName = value; } } internal DataColumnMappingCollection Parent { get { return _parent; } set { _parent = value; } } [DefaultValue("")] public string SourceColumn { get { return _sourceColumnName ?? string.Empty; } set { if (Parent != null && ADP.SrcCompare(_sourceColumnName, value) != 0) { Parent.ValidateSourceColumn(-1, value); } _sourceColumnName = value; } } public DataColumnMapping() { } public DataColumnMapping(string sourceColumn, string dataSetColumn) { SourceColumn = sourceColumn; DataSetColumn = dataSetColumn; } object ICloneable.Clone() { return new DataColumnMapping { _sourceColumnName = _sourceColumnName, _dataSetColumnName = _dataSetColumnName }; } [EditorBrowsable(EditorBrowsableState.Advanced)] public DataColumn GetDataColumnBySchemaAction(DataTable dataTable, Type dataType, MissingSchemaAction schemaAction) { return GetDataColumnBySchemaAction(SourceColumn, DataSetColumn, dataTable, dataType, schemaAction); } [EditorBrowsable(EditorBrowsableState.Advanced)] public static DataColumn GetDataColumnBySchemaAction(string sourceColumn, string dataSetColumn, DataTable dataTable, Type dataType, MissingSchemaAction schemaAction) { if (dataTable == null) { throw ADP.ArgumentNull("dataTable"); } if (string.IsNullOrEmpty(dataSetColumn)) { return null; } DataColumnCollection columns = dataTable.Columns; int num = columns.IndexOf(dataSetColumn); if (0 <= num && num < columns.Count) { DataColumn dataColumn = columns[num]; if (!string.IsNullOrEmpty(dataColumn.Expression)) { throw ADP.ColumnSchemaExpression(sourceColumn, dataSetColumn); } if (null == dataType || dataType.IsArray == dataColumn.DataType.IsArray) { return dataColumn; } throw ADP.ColumnSchemaMismatch(sourceColumn, dataType, dataColumn); } return CreateDataColumnBySchemaAction(sourceColumn, dataSetColumn, dataTable, dataType, schemaAction); } internal static DataColumn CreateDataColumnBySchemaAction(string sourceColumn, string dataSetColumn, DataTable dataTable, Type dataType, MissingSchemaAction schemaAction) { if (string.IsNullOrEmpty(dataSetColumn)) { return null; } switch (schemaAction) { case MissingSchemaAction.Add: case MissingSchemaAction.AddWithKey: return new DataColumn(dataSetColumn, dataType); case MissingSchemaAction.Ignore: return null; case MissingSchemaAction.Error: throw ADP.ColumnSchemaMissing(dataSetColumn, dataTable.TableName, sourceColumn); default: throw ADP.InvalidMissingSchemaAction(schemaAction); } } public override string ToString() { return SourceColumn; } } public sealed class DataColumnMappingCollection : MarshalByRefObject, IColumnMappingCollection, IList, ICollection, IEnumerable { private List _items; bool ICollection.IsSynchronized => false; object ICollection.SyncRoot => this; bool IList.IsReadOnly => false; bool IList.IsFixedSize => false; object IList.this[int index] { get { return this[index]; } set { ValidateType(value); this[index] = (DataColumnMapping)value; } } object IColumnMappingCollection.this[string index] { get { return this[index]; } set { ValidateType(value); this[index] = (DataColumnMapping)value; } } [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public int Count { get { if (_items == null) { return 0; } return _items.Count; } } private Type ItemType => typeof(DataColumnMapping); [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public DataColumnMapping this[int index] { get { RangeCheck(index); return _items[index]; } set { RangeCheck(index); Replace(index, value); } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public DataColumnMapping this[string sourceColumn] { get { int index = RangeCheck(sourceColumn); return _items[index]; } set { int index = RangeCheck(sourceColumn); Replace(index, value); } } IColumnMapping IColumnMappingCollection.Add(string sourceColumnName, string dataSetColumnName) { return Add(sourceColumnName, dataSetColumnName); } IColumnMapping IColumnMappingCollection.GetByDataSetColumn(string dataSetColumnName) { return GetByDataSetColumn(dataSetColumnName); } public int Add(object value) { ValidateType(value); Add((DataColumnMapping)value); return Count - 1; } private DataColumnMapping Add(DataColumnMapping value) { AddWithoutEvents(value); return value; } public DataColumnMapping Add(string sourceColumn, string dataSetColumn) { return Add(new DataColumnMapping(sourceColumn, dataSetColumn)); } public void AddRange(DataColumnMapping[] values) { AddEnumerableRange(values, doClone: false); } public void AddRange(Array values) { AddEnumerableRange(values, doClone: false); } private void AddEnumerableRange(IEnumerable values, bool doClone) { if (values == null) { throw ADP.ArgumentNull("values"); } foreach (object value2 in values) { ValidateType(value2); } if (doClone) { foreach (ICloneable value3 in values) { AddWithoutEvents(value3.Clone() as DataColumnMapping); } return; } foreach (DataColumnMapping value4 in values) { AddWithoutEvents(value4); } } private void AddWithoutEvents(DataColumnMapping value) { Validate(-1, value); value.Parent = this; ArrayList().Add(value); } private List ArrayList() { if (_items == null) { _items = new List(); } return _items; } public void Clear() { if (0 < Count) { ClearWithoutEvents(); } } private void ClearWithoutEvents() { if (_items == null) { return; } foreach (DataColumnMapping item in _items) { item.Parent = null; } _items.Clear(); } public bool Contains(string value) { return -1 != IndexOf(value); } public bool Contains(object value) { return -1 != IndexOf(value); } public void CopyTo(Array array, int index) { ((ICollection)ArrayList()).CopyTo(array, index); } public void CopyTo(DataColumnMapping[] array, int index) { ArrayList().CopyTo(array, index); } public DataColumnMapping GetByDataSetColumn(string value) { int num = IndexOfDataSetColumn(value); if (0 > num) { throw ADP.ColumnsDataSetColumn(value); } return _items[num]; } public IEnumerator GetEnumerator() { return ArrayList().GetEnumerator(); } public int IndexOf(object value) { if (value != null) { ValidateType(value); for (int i = 0; i < Count; i++) { if (_items[i] == value) { return i; } } } return -1; } public int IndexOf(string sourceColumn) { if (!string.IsNullOrEmpty(sourceColumn)) { int count = Count; for (int i = 0; i < count; i++) { if (ADP.SrcCompare(sourceColumn, _items[i].SourceColumn) == 0) { return i; } } } return -1; } public int IndexOfDataSetColumn(string dataSetColumn) { if (!string.IsNullOrEmpty(dataSetColumn)) { int count = Count; for (int i = 0; i < count; i++) { if (ADP.DstCompare(dataSetColumn, _items[i].DataSetColumn) == 0) { return i; } } } return -1; } public void Insert(int index, object value) { ValidateType(value); Insert(index, (DataColumnMapping)value); } public void Insert(int index, DataColumnMapping value) { if (value == null) { throw ADP.ColumnsAddNullAttempt("value"); } Validate(-1, value); value.Parent = this; ArrayList().Insert(index, value); } private void RangeCheck(int index) { if (index < 0 || Count <= index) { throw ADP.ColumnsIndexInt32(index, this); } } private int RangeCheck(string sourceColumn) { int num = IndexOf(sourceColumn); if (num < 0) { throw ADP.ColumnsIndexSource(sourceColumn); } return num; } public void RemoveAt(int index) { RangeCheck(index); RemoveIndex(index); } public void RemoveAt(string sourceColumn) { int index = RangeCheck(sourceColumn); RemoveIndex(index); } private void RemoveIndex(int index) { _items[index].Parent = null; _items.RemoveAt(index); } public void Remove(object value) { ValidateType(value); Remove((DataColumnMapping)value); } public void Remove(DataColumnMapping value) { if (value == null) { throw ADP.ColumnsAddNullAttempt("value"); } int num = IndexOf(value); if (-1 != num) { RemoveIndex(num); return; } throw ADP.CollectionRemoveInvalidObject(ItemType, this); } private void Replace(int index, DataColumnMapping newValue) { Validate(index, newValue); _items[index].Parent = null; newValue.Parent = this; _items[index] = newValue; } private void ValidateType(object value) { if (value == null) { throw ADP.ColumnsAddNullAttempt("value"); } if (!ItemType.IsInstanceOfType(value)) { throw ADP.NotADataColumnMapping(value); } } private void Validate(int index, DataColumnMapping value) { if (value == null) { throw ADP.ColumnsAddNullAttempt("value"); } if (value.Parent != null) { if (this != value.Parent) { throw ADP.ColumnsIsNotParent(this); } if (index != IndexOf(value)) { throw ADP.ColumnsIsParent(this); } } string sourceColumn = value.SourceColumn; if (string.IsNullOrEmpty(sourceColumn)) { index = 1; do { sourceColumn = "SourceColumn" + index.ToString(CultureInfo.InvariantCulture); index++; } while (-1 != IndexOf(sourceColumn)); value.SourceColumn = sourceColumn; } else { ValidateSourceColumn(index, sourceColumn); } } internal void ValidateSourceColumn(int index, string value) { int num = IndexOf(value); if (-1 != num && index != num) { throw ADP.ColumnsUniqueSourceColumn(value); } } [EditorBrowsable(EditorBrowsableState.Advanced)] public static DataColumn GetDataColumn(DataColumnMappingCollection columnMappings, string sourceColumn, Type dataType, DataTable dataTable, MissingMappingAction mappingAction, MissingSchemaAction schemaAction) { if (columnMappings != null) { int num = columnMappings.IndexOf(sourceColumn); if (-1 != num) { return columnMappings._items[num].GetDataColumnBySchemaAction(dataTable, dataType, schemaAction); } } if (string.IsNullOrEmpty(sourceColumn)) { throw ADP.InvalidSourceColumn("sourceColumn"); } return mappingAction switch { MissingMappingAction.Passthrough => DataColumnMapping.GetDataColumnBySchemaAction(sourceColumn, sourceColumn, dataTable, dataType, schemaAction), MissingMappingAction.Ignore => null, MissingMappingAction.Error => throw ADP.MissingColumnMapping(sourceColumn), _ => throw ADP.InvalidMissingMappingAction(mappingAction), }; } [EditorBrowsable(EditorBrowsableState.Advanced)] public static DataColumnMapping GetColumnMappingBySchemaAction(DataColumnMappingCollection columnMappings, string sourceColumn, MissingMappingAction mappingAction) { if (columnMappings != null) { int num = columnMappings.IndexOf(sourceColumn); if (-1 != num) { return columnMappings._items[num]; } } if (string.IsNullOrEmpty(sourceColumn)) { throw ADP.InvalidSourceColumn("sourceColumn"); } return mappingAction switch { MissingMappingAction.Passthrough => new DataColumnMapping(sourceColumn, sourceColumn), MissingMappingAction.Ignore => null, MissingMappingAction.Error => throw ADP.MissingColumnMapping(sourceColumn), _ => throw ADP.InvalidMissingMappingAction(mappingAction), }; } } internal sealed class DataRecordInternal : DbDataRecord, ICustomTypeDescriptor { private SchemaInfo[] _schemaInfo; private object[] _values; private PropertyDescriptorCollection _propertyDescriptors; private FieldNameLookup _fieldNameLookup; public override int FieldCount => _schemaInfo.Length; public override object this[int i] => GetValue(i); public override object this[string name] => GetValue(GetOrdinal(name)); internal DataRecordInternal(SchemaInfo[] schemaInfo, object[] values, PropertyDescriptorCollection descriptors, FieldNameLookup fieldNameLookup) { _schemaInfo = schemaInfo; _values = values; _propertyDescriptors = descriptors; _fieldNameLookup = fieldNameLookup; } public override int GetValues(object[] values) { if (values == null) { throw ADP.ArgumentNull("values"); } int num = ((values.Length < _schemaInfo.Length) ? values.Length : _schemaInfo.Length); for (int i = 0; i < num; i++) { values[i] = _values[i]; } return num; } public override string GetName(int i) { return _schemaInfo[i].name; } public override object GetValue(int i) { return _values[i]; } public override string GetDataTypeName(int i) { return _schemaInfo[i].typeName; } public override Type GetFieldType(int i) { return _schemaInfo[i].type; } public override int GetOrdinal(string name) { return _fieldNameLookup.GetOrdinal(name); } public override bool GetBoolean(int i) { return (bool)_values[i]; } public override byte GetByte(int i) { return (byte)_values[i]; } public override long GetBytes(int i, long dataIndex, byte[] buffer, int bufferIndex, int length) { int num = 0; byte[] array = (byte[])_values[i]; num = array.Length; if (dataIndex > int.MaxValue) { throw ADP.InvalidSourceBufferIndex(num, dataIndex, "dataIndex"); } int num2 = (int)dataIndex; if (buffer == null) { return num; } try { if (num2 < num) { num = ((num2 + length <= num) ? length : (num - num2)); } Array.Copy(array, num2, buffer, bufferIndex, num); } catch (Exception e) when (ADP.IsCatchableExceptionType(e)) { num = array.Length; if (length < 0) { throw ADP.InvalidDataLength(length); } if (bufferIndex < 0 || bufferIndex >= buffer.Length) { throw ADP.InvalidDestinationBufferIndex(length, bufferIndex, "bufferIndex"); } if (dataIndex < 0 || dataIndex >= num) { throw ADP.InvalidSourceBufferIndex(length, dataIndex, "dataIndex"); } if (num + bufferIndex > buffer.Length) { throw ADP.InvalidBufferSizeOrIndex(num, bufferIndex); } } return num; } public override char GetChar(int i) { return ((string)_values[i])[0]; } public override long GetChars(int i, long dataIndex, char[] buffer, int bufferIndex, int length) { char[] array = ((string)_values[i]).ToCharArray(); int num = array.Length; if (dataIndex > int.MaxValue) { throw ADP.InvalidSourceBufferIndex(num, dataIndex, "dataIndex"); } int num2 = (int)dataIndex; if (buffer == null) { return num; } try { if (num2 < num) { num = ((num2 + length <= num) ? length : (num - num2)); } Array.Copy(array, num2, buffer, bufferIndex, num); } catch (Exception e) when (ADP.IsCatchableExceptionType(e)) { num = array.Length; if (length < 0) { throw ADP.InvalidDataLength(length); } if (bufferIndex < 0 || bufferIndex >= buffer.Length) { throw ADP.InvalidDestinationBufferIndex(buffer.Length, bufferIndex, "bufferIndex"); } if (num2 < 0 || num2 >= num) { throw ADP.InvalidSourceBufferIndex(num, dataIndex, "dataIndex"); } if (num + bufferIndex > buffer.Length) { throw ADP.InvalidBufferSizeOrIndex(num, bufferIndex); } } return num; } public override Guid GetGuid(int i) { return (Guid)_values[i]; } public override short GetInt16(int i) { return (short)_values[i]; } public override int GetInt32(int i) { return (int)_values[i]; } public override long GetInt64(int i) { return (long)_values[i]; } public override float GetFloat(int i) { return (float)_values[i]; } public override double GetDouble(int i) { return (double)_values[i]; } public override string GetString(int i) { return (string)_values[i]; } public override decimal GetDecimal(int i) { return (decimal)_values[i]; } public override DateTime GetDateTime(int i) { return (DateTime)_values[i]; } public override bool IsDBNull(int i) { object obj = _values[i]; if (obj != null) { return Convert.IsDBNull(obj); } return true; } AttributeCollection ICustomTypeDescriptor.GetAttributes() { return new AttributeCollection((Attribute[]?)null); } string ICustomTypeDescriptor.GetClassName() { return null; } string ICustomTypeDescriptor.GetComponentName() { return null; } TypeConverter ICustomTypeDescriptor.GetConverter() { return null; } EventDescriptor ICustomTypeDescriptor.GetDefaultEvent() { return null; } PropertyDescriptor ICustomTypeDescriptor.GetDefaultProperty() { return null; } object ICustomTypeDescriptor.GetEditor(Type editorBaseType) { return null; } EventDescriptorCollection ICustomTypeDescriptor.GetEvents() { return new EventDescriptorCollection(null); } EventDescriptorCollection ICustomTypeDescriptor.GetEvents(Attribute[] attributes) { return new EventDescriptorCollection(null); } PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties() { return ((ICustomTypeDescriptor)this).GetProperties((Attribute[]?)null); } PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes) { if (_propertyDescriptors == null) { _propertyDescriptors = new PropertyDescriptorCollection(null); } return _propertyDescriptors; } object ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor pd) { return this; } } internal struct SchemaInfo { public string name; public string typeName; public Type type; } internal enum StorageType { Empty, Object, DBNull, Boolean, Char, SByte, Byte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Decimal, DateTime, TimeSpan, String, Guid, ByteArray, CharArray, Type, DateTimeOffset, BigInteger, Uri, SqlBinary, SqlBoolean, SqlByte, SqlBytes, SqlChars, SqlDateTime, SqlDecimal, SqlDouble, SqlGuid, SqlInt16, SqlInt32, SqlInt64, SqlMoney, SqlSingle, SqlString } internal abstract class DataStorage { private static readonly Type[] s_storageClassType = new Type[41] { null, typeof(object), typeof(DBNull), typeof(bool), typeof(char), typeof(sbyte), typeof(byte), typeof(short), typeof(ushort), typeof(int), typeof(uint), typeof(long), typeof(ulong), typeof(float), typeof(double), typeof(decimal), typeof(DateTime), typeof(TimeSpan), typeof(string), typeof(Guid), typeof(byte[]), typeof(char[]), typeof(Type), typeof(DateTimeOffset), typeof(BigInteger), typeof(Uri), typeof(SqlBinary), typeof(SqlBoolean), typeof(SqlByte), typeof(SqlBytes), typeof(SqlChars), typeof(SqlDateTime), typeof(SqlDecimal), typeof(SqlDouble), typeof(SqlGuid), typeof(SqlInt16), typeof(SqlInt32), typeof(SqlInt64), typeof(SqlMoney), typeof(SqlSingle), typeof(SqlString) }; internal readonly DataColumn _column; internal readonly DataTable _table; internal readonly Type _dataType; internal readonly StorageType _storageTypeCode; private BitArray _dbNullBits; private readonly object _defaultValue; internal readonly object _nullValue; internal readonly bool _isCloneable; internal readonly bool _isCustomDefinedType; internal readonly bool _isStringType; internal readonly bool _isValueType; private static readonly Func> s_inspectTypeForInterfaces = InspectTypeForInterfaces; private static readonly ConcurrentDictionary> s_typeImplementsInterface = new ConcurrentDictionary>(); internal DataSetDateTime DateTimeMode => _column.DateTimeMode; internal IFormatProvider FormatProvider => _table.FormatProvider; protected DataStorage(DataColumn column, Type type, object defaultValue, StorageType storageType) : this(column, type, defaultValue, DBNull.Value, isICloneable: false, storageType) { } protected DataStorage(DataColumn column, Type type, object defaultValue, object nullValue, StorageType storageType) : this(column, type, defaultValue, nullValue, isICloneable: false, storageType) { } protected DataStorage(DataColumn column, Type type, object defaultValue, object nullValue, bool isICloneable, StorageType storageType) { _column = column; _table = column.Table; _dataType = type; _storageTypeCode = storageType; _defaultValue = defaultValue; _nullValue = nullValue; _isCloneable = isICloneable; _isCustomDefinedType = IsTypeCustomType(_storageTypeCode); _isStringType = StorageType.String == _storageTypeCode || StorageType.SqlString == _storageTypeCode; _isValueType = DetermineIfValueType(_storageTypeCode, type); } public virtual object Aggregate(int[] recordNos, AggregateType kind) { if (AggregateType.Count == kind) { return AggregateCount(recordNos); } return null; } public object AggregateCount(int[] recordNos) { int num = 0; for (int i = 0; i < recordNos.Length; i++) { if (!_dbNullBits.Get(recordNos[i])) { num++; } } return num; } protected int CompareBits(int recordNo1, int recordNo2) { bool flag = _dbNullBits.Get(recordNo1); bool flag2 = _dbNullBits.Get(recordNo2); if (flag ^ flag2) { if (flag) { return -1; } return 1; } return 0; } public abstract int Compare(int recordNo1, int recordNo2); public abstract int CompareValueTo(int recordNo1, object value); public virtual object ConvertValue(object value) { return value; } protected void CopyBits(int srcRecordNo, int dstRecordNo) { _dbNullBits.Set(dstRecordNo, _dbNullBits.Get(srcRecordNo)); } public abstract void Copy(int recordNo1, int recordNo2); public abstract object Get(int recordNo); protected object GetBits(int recordNo) { if (_dbNullBits.Get(recordNo)) { return _nullValue; } return _defaultValue; } public virtual int GetStringLength(int record) { return int.MaxValue; } protected bool HasValue(int recordNo) { return !_dbNullBits.Get(recordNo); } public virtual bool IsNull(int recordNo) { return _dbNullBits.Get(recordNo); } public abstract void Set(int recordNo, object value); protected void SetNullBit(int recordNo, bool flag) { _dbNullBits.Set(recordNo, flag); } public virtual void SetCapacity(int capacity) { if (_dbNullBits == null) { _dbNullBits = new BitArray(capacity); } else { _dbNullBits.Length = capacity; } } public abstract object ConvertXmlToObject(string s); public virtual object ConvertXmlToObject(XmlReader xmlReader, XmlRootAttribute xmlAttrib) { return ConvertXmlToObject(xmlReader.Value); } public abstract string ConvertObjectToXml(object value); public virtual void ConvertObjectToXml(object value, XmlWriter xmlWriter, XmlRootAttribute xmlAttrib) { xmlWriter.WriteString(ConvertObjectToXml(value)); } public static DataStorage CreateStorage(DataColumn column, Type dataType, StorageType typeCode) { if (typeCode == StorageType.Empty && null != dataType) { if (typeof(INullable).IsAssignableFrom(dataType)) { return new SqlUdtStorage(column, dataType); } return new ObjectStorage(column, dataType); } return typeCode switch { StorageType.Empty => throw ExceptionBuilder.InvalidStorageType(TypeCode.Empty), StorageType.DBNull => throw ExceptionBuilder.InvalidStorageType(TypeCode.DBNull), StorageType.Boolean => new BooleanStorage(column), StorageType.Char => new CharStorage(column), StorageType.SByte => new SByteStorage(column), StorageType.Byte => new ByteStorage(column), StorageType.Int16 => new Int16Storage(column), StorageType.UInt16 => new UInt16Storage(column), StorageType.Int32 => new Int32Storage(column), StorageType.UInt32 => new UInt32Storage(column), StorageType.Int64 => new Int64Storage(column), StorageType.UInt64 => new UInt64Storage(column), StorageType.Single => new SingleStorage(column), StorageType.Double => new DoubleStorage(column), StorageType.Decimal => new DecimalStorage(column), StorageType.DateTime => new DateTimeStorage(column), StorageType.TimeSpan => new TimeSpanStorage(column), StorageType.String => new StringStorage(column), StorageType.Guid => new ObjectStorage(column, dataType), StorageType.ByteArray => new ObjectStorage(column, dataType), StorageType.CharArray => new ObjectStorage(column, dataType), StorageType.Type => new ObjectStorage(column, dataType), StorageType.DateTimeOffset => new DateTimeOffsetStorage(column), StorageType.BigInteger => new BigIntegerStorage(column), StorageType.Uri => new ObjectStorage(column, dataType), StorageType.SqlBinary => new SqlBinaryStorage(column), StorageType.SqlBoolean => new SqlBooleanStorage(column), StorageType.SqlByte => new SqlByteStorage(column), StorageType.SqlBytes => new SqlBytesStorage(column), StorageType.SqlChars => new SqlCharsStorage(column), StorageType.SqlDateTime => new SqlDateTimeStorage(column), StorageType.SqlDecimal => new SqlDecimalStorage(column), StorageType.SqlDouble => new SqlDoubleStorage(column), StorageType.SqlGuid => new SqlGuidStorage(column), StorageType.SqlInt16 => new SqlInt16Storage(column), StorageType.SqlInt32 => new SqlInt32Storage(column), StorageType.SqlInt64 => new SqlInt64Storage(column), StorageType.SqlMoney => new SqlMoneyStorage(column), StorageType.SqlSingle => new SqlSingleStorage(column), StorageType.SqlString => new SqlStringStorage(column), _ => new ObjectStorage(column, dataType), }; } internal static StorageType GetStorageType(Type dataType) { for (int i = 0; i < s_storageClassType.Length; i++) { if (dataType == s_storageClassType[i]) { return (StorageType)i; } } TypeCode typeCode = Type.GetTypeCode(dataType); if (TypeCode.Object != typeCode) { return (StorageType)typeCode; } return StorageType.Empty; } internal static Type GetTypeStorage(StorageType storageType) { return s_storageClassType[(int)storageType]; } internal static bool IsTypeCustomType(Type type) { return IsTypeCustomType(GetStorageType(type)); } internal static bool IsTypeCustomType(StorageType typeCode) { if (StorageType.Object != typeCode && typeCode != 0) { return StorageType.CharArray == typeCode; } return true; } internal static bool IsSqlType(StorageType storageType) { return StorageType.SqlBinary <= storageType; } public static bool IsSqlType(Type dataType) { for (int i = 26; i < s_storageClassType.Length; i++) { if (dataType == s_storageClassType[i]) { return true; } } return false; } private static bool DetermineIfValueType(StorageType typeCode, Type dataType) { switch (typeCode) { case StorageType.Boolean: case StorageType.Char: case StorageType.SByte: case StorageType.Byte: case StorageType.Int16: case StorageType.UInt16: case StorageType.Int32: case StorageType.UInt32: case StorageType.Int64: case StorageType.UInt64: case StorageType.Single: case StorageType.Double: case StorageType.Decimal: case StorageType.DateTime: case StorageType.TimeSpan: case StorageType.Guid: case StorageType.DateTimeOffset: case StorageType.BigInteger: case StorageType.SqlBinary: case StorageType.SqlBoolean: case StorageType.SqlByte: case StorageType.SqlDateTime: case StorageType.SqlDecimal: case StorageType.SqlDouble: case StorageType.SqlGuid: case StorageType.SqlInt16: case StorageType.SqlInt32: case StorageType.SqlInt64: case StorageType.SqlMoney: case StorageType.SqlSingle: case StorageType.SqlString: return true; case StorageType.String: case StorageType.ByteArray: case StorageType.CharArray: case StorageType.Type: case StorageType.Uri: case StorageType.SqlBytes: case StorageType.SqlChars: return false; default: return dataType.IsValueType; } } internal static void ImplementsInterfaces(StorageType typeCode, Type dataType, out bool sqlType, out bool nullable, out bool xmlSerializable, out bool changeTracking, out bool revertibleChangeTracking) { if (IsSqlType(typeCode)) { sqlType = true; nullable = true; changeTracking = false; revertibleChangeTracking = false; xmlSerializable = true; } else if (typeCode != 0) { sqlType = false; nullable = false; changeTracking = false; revertibleChangeTracking = false; xmlSerializable = false; } else { Tuple orAdd = s_typeImplementsInterface.GetOrAdd(dataType, s_inspectTypeForInterfaces); sqlType = false; nullable = orAdd.Item1; changeTracking = orAdd.Item2; revertibleChangeTracking = orAdd.Item3; xmlSerializable = orAdd.Item4; } } private static Tuple InspectTypeForInterfaces(Type dataType) { return new Tuple(typeof(INullable).IsAssignableFrom(dataType), typeof(IChangeTracking).IsAssignableFrom(dataType), typeof(IRevertibleChangeTracking).IsAssignableFrom(dataType), typeof(IXmlSerializable).IsAssignableFrom(dataType)); } internal static bool ImplementsINullableValue(StorageType typeCode, Type dataType) { if (typeCode == StorageType.Empty && dataType.IsGenericType) { return dataType.GetGenericTypeDefinition() == typeof(Nullable<>); } return false; } public static bool IsObjectNull(object value) { if (value != null && DBNull.Value != value) { return IsObjectSqlNull(value); } return true; } public static bool IsObjectSqlNull(object value) { if (value is INullable nullable) { return nullable.IsNull; } return false; } internal object GetEmptyStorageInternal(int recordCount) { return GetEmptyStorage(recordCount); } internal void CopyValueInternal(int record, object store, BitArray nullbits, int storeIndex) { CopyValue(record, store, nullbits, storeIndex); } internal void SetStorageInternal(object store, BitArray nullbits) { SetStorage(store, nullbits); } protected abstract object GetEmptyStorage(int recordCount); protected abstract void CopyValue(int record, object store, BitArray nullbits, int storeIndex); protected abstract void SetStorage(object store, BitArray nullbits); protected void SetNullStorage(BitArray nullbits) { _dbNullBits = nullbits; } internal static Type GetType(string value) { Type type = Type.GetType(value); if (null == type && "System.Numerics.BigInteger" == value) { type = typeof(BigInteger); } ObjectStorage.VerifyIDynamicMetaObjectProvider(type); return type; } internal static string GetQualifiedName(Type type) { ObjectStorage.VerifyIDynamicMetaObjectProvider(type); return type.AssemblyQualifiedName; } } [TypeConverter(typeof(DataTableMappingConverter))] public sealed class DataTableMapping : MarshalByRefObject, ITableMapping, ICloneable { internal sealed class DataTableMappingConverter : ExpandableObjectConverter { public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { if (typeof(InstanceDescriptor) == destinationType) { return true; } return base.CanConvertTo(context, destinationType); } public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (null == destinationType) { throw ADP.ArgumentNull("destinationType"); } if (typeof(InstanceDescriptor) == destinationType && value is DataTableMapping) { DataTableMapping dataTableMapping = (DataTableMapping)value; DataColumnMapping[] array = new DataColumnMapping[dataTableMapping.ColumnMappings.Count]; dataTableMapping.ColumnMappings.CopyTo(array, 0); object[] arguments = new object[3] { dataTableMapping.SourceTable, dataTableMapping.DataSetTable, array }; Type[] types = new Type[3] { typeof(string), typeof(string), typeof(DataColumnMapping[]) }; return new InstanceDescriptor(typeof(DataTableMapping).GetConstructor(types), arguments); } return base.ConvertTo(context, culture, value, destinationType); } } private DataTableMappingCollection _parent; private DataColumnMappingCollection _columnMappings; private string _dataSetTableName; private string _sourceTableName; IColumnMappingCollection ITableMapping.ColumnMappings => ColumnMappings; [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public DataColumnMappingCollection ColumnMappings { get { DataColumnMappingCollection dataColumnMappingCollection = _columnMappings; if (dataColumnMappingCollection == null) { dataColumnMappingCollection = (_columnMappings = new DataColumnMappingCollection()); } return dataColumnMappingCollection; } } [DefaultValue("")] public string DataSetTable { get { return _dataSetTableName ?? string.Empty; } set { _dataSetTableName = value; } } internal DataTableMappingCollection Parent { get { return _parent; } set { _parent = value; } } [DefaultValue("")] public string SourceTable { get { return _sourceTableName ?? string.Empty; } set { if (Parent != null && ADP.SrcCompare(_sourceTableName, value) != 0) { Parent.ValidateSourceTable(-1, value); } _sourceTableName = value; } } public DataTableMapping() { } public DataTableMapping(string sourceTable, string dataSetTable) { SourceTable = sourceTable; DataSetTable = dataSetTable; } public DataTableMapping(string sourceTable, string dataSetTable, DataColumnMapping[] columnMappings) { SourceTable = sourceTable; DataSetTable = dataSetTable; if (columnMappings != null && columnMappings.Length != 0) { ColumnMappings.AddRange(columnMappings); } } object ICloneable.Clone() { DataTableMapping dataTableMapping = new DataTableMapping(); dataTableMapping._dataSetTableName = _dataSetTableName; dataTableMapping._sourceTableName = _sourceTableName; if (_columnMappings != null && 0 < ColumnMappings.Count) { DataColumnMappingCollection columnMappings = dataTableMapping.ColumnMappings; foreach (ICloneable columnMapping in ColumnMappings) { columnMappings.Add(columnMapping.Clone()); } } return dataTableMapping; } [EditorBrowsable(EditorBrowsableState.Advanced)] public DataColumn GetDataColumn(string sourceColumn, Type dataType, DataTable dataTable, MissingMappingAction mappingAction, MissingSchemaAction schemaAction) { return DataColumnMappingCollection.GetDataColumn(_columnMappings, sourceColumn, dataType, dataTable, mappingAction, schemaAction); } [EditorBrowsable(EditorBrowsableState.Advanced)] public DataColumnMapping GetColumnMappingBySchemaAction(string sourceColumn, MissingMappingAction mappingAction) { return DataColumnMappingCollection.GetColumnMappingBySchemaAction(_columnMappings, sourceColumn, mappingAction); } [EditorBrowsable(EditorBrowsableState.Advanced)] public DataTable GetDataTableBySchemaAction(DataSet dataSet, MissingSchemaAction schemaAction) { if (dataSet == null) { throw ADP.ArgumentNull("dataSet"); } string dataSetTable = DataSetTable; if (string.IsNullOrEmpty(dataSetTable)) { return null; } DataTableCollection tables = dataSet.Tables; int num = tables.IndexOf(dataSetTable); if (0 <= num && num < tables.Count) { return tables[num]; } switch (schemaAction) { case MissingSchemaAction.Add: case MissingSchemaAction.AddWithKey: return new DataTable(dataSetTable); case MissingSchemaAction.Ignore: return null; case MissingSchemaAction.Error: throw ADP.MissingTableSchema(dataSetTable, SourceTable); default: throw ADP.InvalidMissingSchemaAction(schemaAction); } } public override string ToString() { return SourceTable; } } [ListBindable(false)] public sealed class DataTableMappingCollection : MarshalByRefObject, ITableMappingCollection, IList, ICollection, IEnumerable { private List _items; bool ICollection.IsSynchronized => false; object ICollection.SyncRoot => this; bool IList.IsReadOnly => false; bool IList.IsFixedSize => false; object IList.this[int index] { get { return this[index]; } set { ValidateType(value); this[index] = (DataTableMapping)value; } } object ITableMappingCollection.this[string index] { get { return this[index]; } set { ValidateType(value); this[index] = (DataTableMapping)value; } } [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public int Count { get { if (_items == null) { return 0; } return _items.Count; } } private Type ItemType => typeof(DataTableMapping); [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public DataTableMapping this[int index] { get { RangeCheck(index); return _items[index]; } set { RangeCheck(index); Replace(index, value); } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public DataTableMapping this[string sourceTable] { get { int index = RangeCheck(sourceTable); return _items[index]; } set { int index = RangeCheck(sourceTable); Replace(index, value); } } ITableMapping ITableMappingCollection.Add(string sourceTableName, string dataSetTableName) { return Add(sourceTableName, dataSetTableName); } ITableMapping ITableMappingCollection.GetByDataSetTable(string dataSetTableName) { return GetByDataSetTable(dataSetTableName); } public int Add(object value) { ValidateType(value); Add((DataTableMapping)value); return Count - 1; } private DataTableMapping Add(DataTableMapping value) { AddWithoutEvents(value); return value; } public void AddRange(DataTableMapping[] values) { AddEnumerableRange(values, doClone: false); } public void AddRange(Array values) { AddEnumerableRange(values, doClone: false); } private void AddEnumerableRange(IEnumerable values, bool doClone) { if (values == null) { throw ADP.ArgumentNull("values"); } foreach (object value2 in values) { ValidateType(value2); } if (doClone) { foreach (ICloneable value3 in values) { AddWithoutEvents(value3.Clone() as DataTableMapping); } return; } foreach (DataTableMapping value4 in values) { AddWithoutEvents(value4); } } public DataTableMapping Add(string sourceTable, string dataSetTable) { return Add(new DataTableMapping(sourceTable, dataSetTable)); } private void AddWithoutEvents(DataTableMapping value) { Validate(-1, value); value.Parent = this; ArrayList().Add(value); } private List ArrayList() { return _items ?? (_items = new List()); } public void Clear() { if (0 < Count) { ClearWithoutEvents(); } } private void ClearWithoutEvents() { if (_items == null) { return; } foreach (DataTableMapping item in _items) { item.Parent = null; } _items.Clear(); } public bool Contains(string value) { return -1 != IndexOf(value); } public bool Contains(object value) { return -1 != IndexOf(value); } public void CopyTo(Array array, int index) { ((ICollection)ArrayList()).CopyTo(array, index); } public void CopyTo(DataTableMapping[] array, int index) { ArrayList().CopyTo(array, index); } public DataTableMapping GetByDataSetTable(string dataSetTable) { int num = IndexOfDataSetTable(dataSetTable); if (0 > num) { throw ADP.TablesDataSetTable(dataSetTable); } return _items[num]; } public IEnumerator GetEnumerator() { return ArrayList().GetEnumerator(); } public int IndexOf(object value) { if (value != null) { ValidateType(value); for (int i = 0; i < Count; i++) { if (_items[i] == value) { return i; } } } return -1; } public int IndexOf(string sourceTable) { if (!string.IsNullOrEmpty(sourceTable)) { for (int i = 0; i < Count; i++) { string sourceTable2 = _items[i].SourceTable; if (sourceTable2 != null && ADP.SrcCompare(sourceTable, sourceTable2) == 0) { return i; } } } return -1; } public int IndexOfDataSetTable(string dataSetTable) { if (!string.IsNullOrEmpty(dataSetTable)) { for (int i = 0; i < Count; i++) { string dataSetTable2 = _items[i].DataSetTable; if (dataSetTable2 != null && ADP.DstCompare(dataSetTable, dataSetTable2) == 0) { return i; } } } return -1; } public void Insert(int index, object value) { ValidateType(value); Insert(index, (DataTableMapping)value); } public void Insert(int index, DataTableMapping value) { if (value == null) { throw ADP.TablesAddNullAttempt("value"); } Validate(-1, value); value.Parent = this; ArrayList().Insert(index, value); } private void RangeCheck(int index) { if (index < 0 || Count <= index) { throw ADP.TablesIndexInt32(index, this); } } private int RangeCheck(string sourceTable) { int num = IndexOf(sourceTable); if (num < 0) { throw ADP.TablesSourceIndex(sourceTable); } return num; } public void RemoveAt(int index) { RangeCheck(index); RemoveIndex(index); } public void RemoveAt(string sourceTable) { int index = RangeCheck(sourceTable); RemoveIndex(index); } private void RemoveIndex(int index) { _items[index].Parent = null; _items.RemoveAt(index); } public void Remove(object value) { ValidateType(value); Remove((DataTableMapping)value); } public void Remove(DataTableMapping value) { if (value == null) { throw ADP.TablesAddNullAttempt("value"); } int num = IndexOf(value); if (-1 != num) { RemoveIndex(num); return; } throw ADP.CollectionRemoveInvalidObject(ItemType, this); } private void Replace(int index, DataTableMapping newValue) { Validate(index, newValue); _items[index].Parent = null; newValue.Parent = this; _items[index] = newValue; } private void ValidateType(object value) { if (value == null) { throw ADP.TablesAddNullAttempt("value"); } if (!ItemType.IsInstanceOfType(value)) { throw ADP.NotADataTableMapping(value); } } private void Validate(int index, DataTableMapping value) { if (value == null) { throw ADP.TablesAddNullAttempt("value"); } if (value.Parent != null) { if (this != value.Parent) { throw ADP.TablesIsNotParent(this); } if (index != IndexOf(value)) { throw ADP.TablesIsParent(this); } } string sourceTable = value.SourceTable; if (string.IsNullOrEmpty(sourceTable)) { index = 1; do { sourceTable = "SourceTable" + index.ToString(CultureInfo.InvariantCulture); index++; } while (-1 != IndexOf(sourceTable)); value.SourceTable = sourceTable; } else { ValidateSourceTable(index, sourceTable); } } internal void ValidateSourceTable(int index, string value) { int num = IndexOf(value); if (-1 != num && index != num) { throw ADP.TablesUniqueSourceTable(value); } } [EditorBrowsable(EditorBrowsableState.Advanced)] public static DataTableMapping GetTableMappingBySchemaAction(DataTableMappingCollection tableMappings, string sourceTable, string dataSetTable, MissingMappingAction mappingAction) { if (tableMappings != null) { int num = tableMappings.IndexOf(sourceTable); if (-1 != num) { return tableMappings._items[num]; } } if (string.IsNullOrEmpty(sourceTable)) { throw ADP.InvalidSourceTable("sourceTable"); } return mappingAction switch { MissingMappingAction.Passthrough => new DataTableMapping(sourceTable, dataSetTable), MissingMappingAction.Ignore => null, MissingMappingAction.Error => throw ADP.MissingTableMapping(sourceTable), _ => throw ADP.InvalidMissingMappingAction(mappingAction), }; } } internal sealed class DateTimeOffsetStorage : DataStorage { private static readonly DateTimeOffset s_defaultValue = DateTimeOffset.MinValue; private DateTimeOffset[] _values; internal DateTimeOffsetStorage(DataColumn column) : base(column, typeof(DateTimeOffset), s_defaultValue, StorageType.DateTimeOffset) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Min: { DateTimeOffset dateTimeOffset2 = DateTimeOffset.MaxValue; foreach (int num3 in records) { if (HasValue(num3)) { dateTimeOffset2 = ((DateTimeOffset.Compare(_values[num3], dateTimeOffset2) < 0) ? _values[num3] : dateTimeOffset2); flag = true; } } if (flag) { return dateTimeOffset2; } return _nullValue; } case AggregateType.Max: { DateTimeOffset dateTimeOffset = DateTimeOffset.MinValue; foreach (int num2 in records) { if (HasValue(num2)) { dateTimeOffset = ((DateTimeOffset.Compare(_values[num2], dateTimeOffset) >= 0) ? _values[num2] : dateTimeOffset); flag = true; } } if (flag) { return dateTimeOffset; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: { int num = 0; for (int i = 0; i < records.Length; i++) { if (HasValue(records[i])) { num++; } } return num; } } } catch (OverflowException) { throw ExprException.Overflow(typeof(DateTimeOffset)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { DateTimeOffset dateTimeOffset = _values[recordNo1]; DateTimeOffset dateTimeOffset2 = _values[recordNo2]; if (dateTimeOffset == s_defaultValue || dateTimeOffset2 == s_defaultValue) { int num = CompareBits(recordNo1, recordNo2); if (num != 0) { return num; } } return DateTimeOffset.Compare(dateTimeOffset, dateTimeOffset2); } public override int CompareValueTo(int recordNo, object value) { if (_nullValue == value) { if (!HasValue(recordNo)) { return 0; } return 1; } DateTimeOffset dateTimeOffset = _values[recordNo]; if (s_defaultValue == dateTimeOffset && !HasValue(recordNo)) { return -1; } return DateTimeOffset.Compare(dateTimeOffset, (DateTimeOffset)value); } public override object ConvertValue(object value) { if (_nullValue != value) { value = ((value == null) ? _nullValue : ((object)(DateTimeOffset)value)); } return value; } public override void Copy(int recordNo1, int recordNo2) { CopyBits(recordNo1, recordNo2); _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { DateTimeOffset dateTimeOffset = _values[record]; if (dateTimeOffset != s_defaultValue || HasValue(record)) { return dateTimeOffset; } return _nullValue; } public override void Set(int record, object value) { if (_nullValue == value) { _values[record] = s_defaultValue; SetNullBit(record, flag: true); } else { _values[record] = (DateTimeOffset)value; SetNullBit(record, flag: false); } } public override void SetCapacity(int capacity) { DateTimeOffset[] array = new DateTimeOffset[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; base.SetCapacity(capacity); } public override object ConvertXmlToObject(string s) { return XmlConvert.ToDateTimeOffset(s); } public override string ConvertObjectToXml(object value) { return XmlConvert.ToString((DateTimeOffset)value); } protected override object GetEmptyStorage(int recordCount) { return new DateTimeOffset[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((DateTimeOffset[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, !HasValue(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (DateTimeOffset[])store; SetNullStorage(nullbits); } } internal sealed class DateTimeStorage : DataStorage { private static readonly DateTime s_defaultValue = DateTime.MinValue; private DateTime[] _values; internal DateTimeStorage(DataColumn column) : base(column, typeof(DateTime), s_defaultValue, StorageType.DateTime) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Min: { DateTime dateTime2 = DateTime.MaxValue; foreach (int num3 in records) { if (HasValue(num3)) { dateTime2 = ((DateTime.Compare(_values[num3], dateTime2) < 0) ? _values[num3] : dateTime2); flag = true; } } if (flag) { return dateTime2; } return _nullValue; } case AggregateType.Max: { DateTime dateTime = DateTime.MinValue; foreach (int num2 in records) { if (HasValue(num2)) { dateTime = ((DateTime.Compare(_values[num2], dateTime) >= 0) ? _values[num2] : dateTime); flag = true; } } if (flag) { return dateTime; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: { int num = 0; for (int i = 0; i < records.Length; i++) { if (HasValue(records[i])) { num++; } } return num; } } } catch (OverflowException) { throw ExprException.Overflow(typeof(DateTime)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { DateTime dateTime = _values[recordNo1]; DateTime dateTime2 = _values[recordNo2]; if (dateTime == s_defaultValue || dateTime2 == s_defaultValue) { int num = CompareBits(recordNo1, recordNo2); if (num != 0) { return num; } } return DateTime.Compare(dateTime, dateTime2); } public override int CompareValueTo(int recordNo, object value) { if (_nullValue == value) { if (!HasValue(recordNo)) { return 0; } return 1; } DateTime dateTime = _values[recordNo]; if (s_defaultValue == dateTime && !HasValue(recordNo)) { return -1; } return DateTime.Compare(dateTime, (DateTime)value); } public override object ConvertValue(object value) { if (_nullValue != value) { value = ((value == null) ? _nullValue : ((object)((IConvertible)value).ToDateTime(base.FormatProvider))); } return value; } public override void Copy(int recordNo1, int recordNo2) { CopyBits(recordNo1, recordNo2); _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { DateTime dateTime = _values[record]; if (dateTime != s_defaultValue || HasValue(record)) { return dateTime; } return _nullValue; } public override void Set(int record, object value) { if (_nullValue == value) { _values[record] = s_defaultValue; SetNullBit(record, flag: true); return; } DateTime dateTime = ((IConvertible)value).ToDateTime(base.FormatProvider); DateTime dateTime2; switch (base.DateTimeMode) { case DataSetDateTime.Utc: dateTime2 = ((dateTime.Kind != DateTimeKind.Utc) ? ((dateTime.Kind != DateTimeKind.Local) ? DateTime.SpecifyKind(dateTime, DateTimeKind.Utc) : dateTime.ToUniversalTime()) : dateTime); break; case DataSetDateTime.Local: dateTime2 = ((dateTime.Kind != DateTimeKind.Local) ? ((dateTime.Kind != DateTimeKind.Utc) ? DateTime.SpecifyKind(dateTime, DateTimeKind.Local) : dateTime.ToLocalTime()) : dateTime); break; case DataSetDateTime.Unspecified: case DataSetDateTime.UnspecifiedLocal: dateTime2 = DateTime.SpecifyKind(dateTime, DateTimeKind.Unspecified); break; default: throw ExceptionBuilder.InvalidDateTimeMode(base.DateTimeMode); } _values[record] = dateTime2; SetNullBit(record, flag: false); } public override void SetCapacity(int capacity) { DateTime[] array = new DateTime[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; base.SetCapacity(capacity); } public override object ConvertXmlToObject(string s) { if (base.DateTimeMode == DataSetDateTime.UnspecifiedLocal) { return XmlConvert.ToDateTime(s, XmlDateTimeSerializationMode.Unspecified); } return XmlConvert.ToDateTime(s, XmlDateTimeSerializationMode.RoundtripKind); } public override string ConvertObjectToXml(object value) { if (base.DateTimeMode == DataSetDateTime.UnspecifiedLocal) { return XmlConvert.ToString((DateTime)value, XmlDateTimeSerializationMode.Local); } return XmlConvert.ToString((DateTime)value, XmlDateTimeSerializationMode.RoundtripKind); } protected override object GetEmptyStorage(int recordCount) { return new DateTime[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { DateTime[] array = (DateTime[])store; bool flag = !HasValue(record); if (flag || (base.DateTimeMode & DataSetDateTime.Local) == 0) { array[storeIndex] = _values[record]; } else { array[storeIndex] = _values[record].ToUniversalTime(); } nullbits.Set(storeIndex, flag); } protected override void SetStorage(object store, BitArray nullbits) { _values = (DateTime[])store; SetNullStorage(nullbits); if (base.DateTimeMode == DataSetDateTime.UnspecifiedLocal) { for (int i = 0; i < _values.Length; i++) { if (HasValue(i)) { _values[i] = DateTime.SpecifyKind(_values[i].ToLocalTime(), DateTimeKind.Unspecified); } } } else { if (base.DateTimeMode != DataSetDateTime.Local) { return; } for (int j = 0; j < _values.Length; j++) { if (HasValue(j)) { _values[j] = _values[j].ToLocalTime(); } } } } } public abstract class DbColumn { public bool? AllowDBNull { get; protected set; } public string BaseCatalogName { get; protected set; } public string BaseColumnName { get; protected set; } public string BaseSchemaName { get; protected set; } public string BaseServerName { get; protected set; } public string BaseTableName { get; protected set; } public string ColumnName { get; protected set; } public int? ColumnOrdinal { get; protected set; } public int? ColumnSize { get; protected set; } public bool? IsAliased { get; protected set; } public bool? IsAutoIncrement { get; protected set; } public bool? IsExpression { get; protected set; } public bool? IsHidden { get; protected set; } public bool? IsIdentity { get; protected set; } public bool? IsKey { get; protected set; } public bool? IsLong { get; protected set; } public bool? IsReadOnly { get; protected set; } public bool? IsUnique { get; protected set; } public int? NumericPrecision { get; protected set; } public int? NumericScale { get; protected set; } public string UdtAssemblyQualifiedName { get; protected set; } public Type DataType { get; protected set; } public string DataTypeName { get; protected set; } public virtual object this[string property] => property switch { "AllowDBNull" => AllowDBNull, "BaseCatalogName" => BaseCatalogName, "BaseColumnName" => BaseColumnName, "BaseSchemaName" => BaseSchemaName, "BaseServerName" => BaseServerName, "BaseTableName" => BaseTableName, "ColumnName" => ColumnName, "ColumnOrdinal" => ColumnOrdinal, "ColumnSize" => ColumnSize, "IsAliased" => IsAliased, "IsAutoIncrement" => IsAutoIncrement, "IsExpression" => IsExpression, "IsHidden" => IsHidden, "IsIdentity" => IsIdentity, "IsKey" => IsKey, "IsLong" => IsLong, "IsReadOnly" => IsReadOnly, "IsUnique" => IsUnique, "NumericPrecision" => NumericPrecision, "NumericScale" => NumericScale, "UdtAssemblyQualifiedName" => UdtAssemblyQualifiedName, "DataType" => DataType, "DataTypeName" => DataTypeName, _ => null, }; } public abstract class DbCommand : Component, IDbCommand, IDisposable { [RefreshProperties(RefreshProperties.All)] [DefaultValue("")] public abstract string CommandText { get; set; } public abstract int CommandTimeout { get; set; } [DefaultValue(CommandType.Text)] [RefreshProperties(RefreshProperties.All)] public abstract CommandType CommandType { get; set; } [Browsable(false)] [DefaultValue(null)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public DbConnection Connection { get { return DbConnection; } set { DbConnection = value; } } IDbConnection IDbCommand.Connection { get { return DbConnection; } set { DbConnection = (DbConnection)value; } } protected abstract DbConnection DbConnection { get; set; } protected abstract DbParameterCollection DbParameterCollection { get; } protected abstract DbTransaction DbTransaction { get; set; } [EditorBrowsable(EditorBrowsableState.Never)] [Browsable(false)] [DefaultValue(true)] [DesignOnly(true)] public abstract bool DesignTimeVisible { get; set; } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public DbParameterCollection Parameters => DbParameterCollection; IDataParameterCollection IDbCommand.Parameters => DbParameterCollection; [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [DefaultValue(null)] public DbTransaction Transaction { get { return DbTransaction; } set { DbTransaction = value; } } IDbTransaction IDbCommand.Transaction { get { return DbTransaction; } set { DbTransaction = (DbTransaction)value; } } [DefaultValue(UpdateRowSource.Both)] public abstract UpdateRowSource UpdatedRowSource { get; set; } internal void CancelIgnoreFailure() { try { Cancel(); } catch (Exception) { } } public abstract void Cancel(); public DbParameter CreateParameter() { return CreateDbParameter(); } IDbDataParameter IDbCommand.CreateParameter() { return CreateDbParameter(); } protected abstract DbParameter CreateDbParameter(); protected abstract DbDataReader ExecuteDbDataReader(CommandBehavior behavior); public abstract int ExecuteNonQuery(); public DbDataReader ExecuteReader() { return ExecuteDbDataReader(CommandBehavior.Default); } IDataReader IDbCommand.ExecuteReader() { return ExecuteDbDataReader(CommandBehavior.Default); } public DbDataReader ExecuteReader(CommandBehavior behavior) { return ExecuteDbDataReader(behavior); } IDataReader IDbCommand.ExecuteReader(CommandBehavior behavior) { return ExecuteDbDataReader(behavior); } public Task ExecuteNonQueryAsync() { return ExecuteNonQueryAsync(CancellationToken.None); } public virtual Task ExecuteNonQueryAsync(CancellationToken cancellationToken) { if (cancellationToken.IsCancellationRequested) { return ADP.CreatedTaskWithCancellation(); } CancellationTokenRegistration cancellationTokenRegistration = default(CancellationTokenRegistration); if (cancellationToken.CanBeCanceled) { cancellationTokenRegistration = cancellationToken.Register(delegate(object s) { ((DbCommand)s).CancelIgnoreFailure(); }, this); } try { return Task.FromResult(ExecuteNonQuery()); } catch (Exception exception) { return Task.FromException(exception); } finally { cancellationTokenRegistration.Dispose(); } } public Task ExecuteReaderAsync() { return ExecuteReaderAsync(CommandBehavior.Default, CancellationToken.None); } public Task ExecuteReaderAsync(CancellationToken cancellationToken) { return ExecuteReaderAsync(CommandBehavior.Default, cancellationToken); } public Task ExecuteReaderAsync(CommandBehavior behavior) { return ExecuteReaderAsync(behavior, CancellationToken.None); } public Task ExecuteReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken) { return ExecuteDbDataReaderAsync(behavior, cancellationToken); } protected virtual Task ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken) { if (cancellationToken.IsCancellationRequested) { return ADP.CreatedTaskWithCancellation(); } CancellationTokenRegistration cancellationTokenRegistration = default(CancellationTokenRegistration); if (cancellationToken.CanBeCanceled) { cancellationTokenRegistration = cancellationToken.Register(delegate(object s) { ((DbCommand)s).CancelIgnoreFailure(); }, this); } try { return Task.FromResult(ExecuteReader(behavior)); } catch (Exception exception) { return Task.FromException(exception); } finally { cancellationTokenRegistration.Dispose(); } } public Task ExecuteScalarAsync() { return ExecuteScalarAsync(CancellationToken.None); } public virtual Task ExecuteScalarAsync(CancellationToken cancellationToken) { if (cancellationToken.IsCancellationRequested) { return ADP.CreatedTaskWithCancellation(); } CancellationTokenRegistration cancellationTokenRegistration = default(CancellationTokenRegistration); if (cancellationToken.CanBeCanceled) { cancellationTokenRegistration = cancellationToken.Register(delegate(object s) { ((DbCommand)s).CancelIgnoreFailure(); }, this); } try { return Task.FromResult(ExecuteScalar()); } catch (Exception exception) { return Task.FromException(exception); } finally { cancellationTokenRegistration.Dispose(); } } public abstract object ExecuteScalar(); public abstract void Prepare(); } public abstract class DbConnection : Component, IDbConnection, IDisposable { internal bool _suppressStateChangeForReconnection; [RecommendedAsConfigurable(true)] [RefreshProperties(RefreshProperties.All)] [SettingsBindable(true)] [DefaultValue("")] public abstract string ConnectionString { get; set; } public virtual int ConnectionTimeout => 15; public abstract string Database { get; } public abstract string DataSource { get; } protected virtual DbProviderFactory DbProviderFactory => null; [Browsable(false)] public abstract string ServerVersion { get; } [Browsable(false)] public abstract ConnectionState State { get; } internal DbProviderFactory ProviderFactory => DbProviderFactory; public virtual event StateChangeEventHandler StateChange; protected abstract DbTransaction BeginDbTransaction(IsolationLevel isolationLevel); public DbTransaction BeginTransaction() { return BeginDbTransaction(IsolationLevel.Unspecified); } public DbTransaction BeginTransaction(IsolationLevel isolationLevel) { return BeginDbTransaction(isolationLevel); } IDbTransaction IDbConnection.BeginTransaction() { return BeginDbTransaction(IsolationLevel.Unspecified); } IDbTransaction IDbConnection.BeginTransaction(IsolationLevel isolationLevel) { return BeginDbTransaction(isolationLevel); } public abstract void Close(); public abstract void ChangeDatabase(string databaseName); public DbCommand CreateCommand() { return CreateDbCommand(); } IDbCommand IDbConnection.CreateCommand() { return CreateDbCommand(); } protected abstract DbCommand CreateDbCommand(); public virtual void EnlistTransaction(Transaction transaction) { throw ADP.NotSupported(); } public virtual DataTable GetSchema() { throw ADP.NotSupported(); } public virtual DataTable GetSchema(string collectionName) { throw ADP.NotSupported(); } public virtual DataTable GetSchema(string collectionName, string[] restrictionValues) { throw ADP.NotSupported(); } protected virtual void OnStateChange(StateChangeEventArgs stateChange) { if (!_suppressStateChangeForReconnection) { this.StateChange?.Invoke(this, stateChange); } } public abstract void Open(); public Task OpenAsync() { return OpenAsync(CancellationToken.None); } public virtual Task OpenAsync(CancellationToken cancellationToken) { if (cancellationToken.IsCancellationRequested) { return Task.FromCanceled(cancellationToken); } try { Open(); return Task.CompletedTask; } catch (Exception exception) { return Task.FromException(exception); } } } public class DbConnectionStringBuilder : IDictionary, ICollection, IEnumerable, ICustomTypeDescriptor { private Dictionary _currentValues; private string _connectionString = string.Empty; private PropertyDescriptorCollection _propertyDescriptors; private bool _browsableConnectionString = true; private readonly bool _useOdbcRules; private static int s_objectTypeCount; internal readonly int _objectID = Interlocked.Increment(ref s_objectTypeCount); private ICollection Collection => CurrentValues; private IDictionary Dictionary => CurrentValues; private Dictionary CurrentValues { get { Dictionary dictionary = _currentValues; if (dictionary == null) { dictionary = (_currentValues = new Dictionary(StringComparer.OrdinalIgnoreCase)); } return dictionary; } } object IDictionary.this[object keyword] { get { return this[ObjectToString(keyword)]; } set { this[ObjectToString(keyword)] = value; } } [Browsable(false)] public virtual object this[string keyword] { get { DataCommonEventSource.Log.Trace(" {0}, keyword='{1}'", ObjectID, keyword); ADP.CheckArgumentNull(keyword, "keyword"); if (CurrentValues.TryGetValue(keyword, out var value)) { return value; } throw ADP.KeywordNotSupported(keyword); } set { ADP.CheckArgumentNull(keyword, "keyword"); bool flag = false; if (value != null) { string value2 = DbConnectionStringBuilderUtil.ConvertToString(value); DbConnectionOptions.ValidateKeyValuePair(keyword, value2); flag = CurrentValues.ContainsKey(keyword); CurrentValues[keyword] = value2; } else { flag = Remove(keyword); } _connectionString = null; if (flag) { _propertyDescriptors = null; } } } [DesignOnly(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [EditorBrowsable(EditorBrowsableState.Never)] [Browsable(false)] public bool BrowsableConnectionString { get { return _browsableConnectionString; } set { _browsableConnectionString = value; _propertyDescriptors = null; } } [RefreshProperties(RefreshProperties.All)] public string ConnectionString { get { DataCommonEventSource.Log.Trace(" {0}", ObjectID); string text = _connectionString; if (text == null) { StringBuilder stringBuilder = new StringBuilder(); foreach (string key in Keys) { if (ShouldSerialize(key) && TryGetValue(key, out var value)) { string value2 = ConvertValueToString(value); AppendKeyValuePair(stringBuilder, key, value2, _useOdbcRules); } } text = (_connectionString = stringBuilder.ToString()); } return text; } set { DataCommonEventSource.Log.Trace(" {0}", ObjectID); DbConnectionOptions dbConnectionOptions = new DbConnectionOptions(value, null, _useOdbcRules); string connectionString = ConnectionString; Clear(); try { for (NameValuePair nameValuePair = dbConnectionOptions._keyChain; nameValuePair != null; nameValuePair = nameValuePair.Next) { if (nameValuePair.Value != null) { this[nameValuePair.Name] = nameValuePair.Value; } else { Remove(nameValuePair.Name); } } _connectionString = null; } catch (ArgumentException) { ConnectionString = connectionString; _connectionString = connectionString; throw; } } } [Browsable(false)] public virtual int Count => CurrentValues.Count; [Browsable(false)] public bool IsReadOnly => false; [Browsable(false)] public virtual bool IsFixedSize => false; bool ICollection.IsSynchronized => Collection.IsSynchronized; [Browsable(false)] public virtual ICollection Keys { get { DataCommonEventSource.Log.Trace(" {0}", ObjectID); return Dictionary.Keys; } } internal int ObjectID => _objectID; object ICollection.SyncRoot => Collection.SyncRoot; [Browsable(false)] public virtual ICollection Values { get { DataCommonEventSource.Log.Trace(" {0}", ObjectID); ICollection obj = (ICollection)Keys; IEnumerator enumerator = obj.GetEnumerator(); object[] array = new object[obj.Count]; for (int i = 0; i < array.Length; i++) { enumerator.MoveNext(); array[i] = this[enumerator.Current]; } return new ReadOnlyCollection(array); } } public DbConnectionStringBuilder() { } public DbConnectionStringBuilder(bool useOdbcRules) { _useOdbcRules = useOdbcRules; } internal virtual string ConvertValueToString(object value) { if (value != null) { return Convert.ToString(value, CultureInfo.InvariantCulture); } return null; } void IDictionary.Add(object keyword, object value) { Add(ObjectToString(keyword), value); } public void Add(string keyword, object value) { this[keyword] = value; } public static void AppendKeyValuePair(StringBuilder builder, string keyword, string value) { DbConnectionOptions.AppendKeyValuePairBuilder(builder, keyword, value, useOdbcRules: false); } public static void AppendKeyValuePair(StringBuilder builder, string keyword, string value, bool useOdbcRules) { DbConnectionOptions.AppendKeyValuePairBuilder(builder, keyword, value, useOdbcRules); } public virtual void Clear() { DataCommonEventSource.Log.Trace(""); _connectionString = string.Empty; _propertyDescriptors = null; CurrentValues.Clear(); } protected internal void ClearPropertyDescriptors() { _propertyDescriptors = null; } bool IDictionary.Contains(object keyword) { return ContainsKey(ObjectToString(keyword)); } public virtual bool ContainsKey(string keyword) { ADP.CheckArgumentNull(keyword, "keyword"); return CurrentValues.ContainsKey(keyword); } void ICollection.CopyTo(Array array, int index) { DataCommonEventSource.Log.Trace(" {0}", ObjectID); Collection.CopyTo(array, index); } public virtual bool EquivalentTo(DbConnectionStringBuilder connectionStringBuilder) { ADP.CheckArgumentNull(connectionStringBuilder, "connectionStringBuilder"); DataCommonEventSource.Log.Trace(" {0}, connectionStringBuilder={1}", ObjectID, connectionStringBuilder.ObjectID); if (GetType() != connectionStringBuilder.GetType() || CurrentValues.Count != connectionStringBuilder.CurrentValues.Count) { return false; } foreach (KeyValuePair currentValue in CurrentValues) { if (!connectionStringBuilder.CurrentValues.TryGetValue(currentValue.Key, out var value) || !currentValue.Value.Equals(value)) { return false; } } return true; } IEnumerator IEnumerable.GetEnumerator() { DataCommonEventSource.Log.Trace(" {0}", ObjectID); return Collection.GetEnumerator(); } IDictionaryEnumerator IDictionary.GetEnumerator() { DataCommonEventSource.Log.Trace(" {0}", ObjectID); return Dictionary.GetEnumerator(); } private string ObjectToString(object keyword) { try { return (string)keyword; } catch (InvalidCastException) { throw new ArgumentException("not a string", "keyword"); } } void IDictionary.Remove(object keyword) { Remove(ObjectToString(keyword)); } public virtual bool Remove(string keyword) { DataCommonEventSource.Log.Trace(" {0}, keyword='{1}'", ObjectID, keyword); ADP.CheckArgumentNull(keyword, "keyword"); if (CurrentValues.Remove(keyword)) { _connectionString = null; _propertyDescriptors = null; return true; } return false; } public virtual bool ShouldSerialize(string keyword) { ADP.CheckArgumentNull(keyword, "keyword"); return CurrentValues.ContainsKey(keyword); } public override string ToString() { return ConnectionString; } public virtual bool TryGetValue(string keyword, out object value) { ADP.CheckArgumentNull(keyword, "keyword"); return CurrentValues.TryGetValue(keyword, out value); } internal Attribute[] GetAttributesFromCollection(AttributeCollection collection) { Attribute[] array = new Attribute[collection.Count]; collection.CopyTo(array, 0); return array; } private PropertyDescriptorCollection GetProperties() { PropertyDescriptorCollection propertyDescriptorCollection = _propertyDescriptors; if (propertyDescriptorCollection == null) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { Hashtable hashtable = new Hashtable(StringComparer.OrdinalIgnoreCase); GetProperties(hashtable); PropertyDescriptor[] array = new PropertyDescriptor[hashtable.Count]; hashtable.Values.CopyTo(array, 0); propertyDescriptorCollection = (_propertyDescriptors = new PropertyDescriptorCollection(array)); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } return propertyDescriptorCollection; } protected virtual void GetProperties(Hashtable propertyDescriptors) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}", ObjectID); try { Attribute[] attributesFromCollection; foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(this, noCustomTypeDesc: true)) { if ("ConnectionString" != property.Name) { string displayName = property.DisplayName; if (!propertyDescriptors.ContainsKey(displayName)) { attributesFromCollection = GetAttributesFromCollection(property.Attributes); PropertyDescriptor value = new DbConnectionStringBuilderDescriptor(property.Name, property.ComponentType, property.PropertyType, property.IsReadOnly, attributesFromCollection); propertyDescriptors[displayName] = value; } } else if (BrowsableConnectionString) { propertyDescriptors["ConnectionString"] = property; } else { propertyDescriptors.Remove("ConnectionString"); } } if (IsFixedSize) { return; } attributesFromCollection = null; foreach (string key in Keys) { if (propertyDescriptors.ContainsKey(key)) { continue; } object obj = this[key]; Type type; if (obj != null) { type = obj.GetType(); if (typeof(string) == type) { bool result2; if (int.TryParse((string)obj, out var _)) { type = typeof(int); } else if (bool.TryParse((string)obj, out result2)) { type = typeof(bool); } } } else { type = typeof(string); } Attribute[] attributes = attributesFromCollection; if (StringComparer.OrdinalIgnoreCase.Equals("Password", key) || StringComparer.OrdinalIgnoreCase.Equals("pwd", key)) { attributes = new Attribute[3] { BrowsableAttribute.Yes, PasswordPropertyTextAttribute.Yes, RefreshPropertiesAttribute.All }; } else if (attributesFromCollection == null) { attributesFromCollection = new Attribute[2] { BrowsableAttribute.Yes, RefreshPropertiesAttribute.All }; attributes = attributesFromCollection; } PropertyDescriptor value2 = new DbConnectionStringBuilderDescriptor(key, GetType(), type, isReadOnly: false, attributes); propertyDescriptors[key] = value2; } } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } private PropertyDescriptorCollection GetProperties(Attribute[] attributes) { PropertyDescriptorCollection properties = GetProperties(); if (attributes == null || attributes.Length == 0) { return properties; } PropertyDescriptor[] array = new PropertyDescriptor[properties.Count]; int num = 0; foreach (PropertyDescriptor item in properties) { bool flag = true; foreach (Attribute attribute in attributes) { Attribute attribute2 = item.Attributes[attribute.GetType()]; if ((attribute2 == null && !attribute.IsDefaultAttribute()) || !attribute2.Match(attribute)) { flag = false; break; } } if (flag) { array[num] = item; num++; } } PropertyDescriptor[] array2 = new PropertyDescriptor[num]; Array.Copy(array, array2, num); return new PropertyDescriptorCollection(array2); } string ICustomTypeDescriptor.GetClassName() { return TypeDescriptor.GetClassName(this, noCustomTypeDesc: true); } string ICustomTypeDescriptor.GetComponentName() { return TypeDescriptor.GetComponentName(this, noCustomTypeDesc: true); } AttributeCollection ICustomTypeDescriptor.GetAttributes() { return TypeDescriptor.GetAttributes(this, noCustomTypeDesc: true); } object ICustomTypeDescriptor.GetEditor(Type editorBaseType) { return TypeDescriptor.GetEditor(this, editorBaseType, noCustomTypeDesc: true); } TypeConverter ICustomTypeDescriptor.GetConverter() { return TypeDescriptor.GetConverter(this, noCustomTypeDesc: true); } PropertyDescriptor ICustomTypeDescriptor.GetDefaultProperty() { return TypeDescriptor.GetDefaultProperty(this, noCustomTypeDesc: true); } PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties() { return GetProperties(); } PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes) { return GetProperties(attributes); } EventDescriptor ICustomTypeDescriptor.GetDefaultEvent() { return TypeDescriptor.GetDefaultEvent(this, noCustomTypeDesc: true); } EventDescriptorCollection ICustomTypeDescriptor.GetEvents() { return TypeDescriptor.GetEvents(this, noCustomTypeDesc: true); } EventDescriptorCollection ICustomTypeDescriptor.GetEvents(Attribute[] attributes) { return TypeDescriptor.GetEvents(this, attributes, noCustomTypeDesc: true); } object ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor pd) { return this; } } internal class DbConnectionStringBuilderDescriptor : PropertyDescriptor { internal bool RefreshOnChange { get; set; } public override Type ComponentType { get; } public override bool IsReadOnly { get; } public override Type PropertyType { get; } internal DbConnectionStringBuilderDescriptor(string propertyName, Type componentType, Type propertyType, bool isReadOnly, Attribute[] attributes) : base(propertyName, attributes) { ComponentType = componentType; PropertyType = propertyType; IsReadOnly = isReadOnly; } public override bool CanResetValue(object component) { if (component is DbConnectionStringBuilder dbConnectionStringBuilder) { return dbConnectionStringBuilder.ShouldSerialize(DisplayName); } return false; } public override object GetValue(object component) { if (component is DbConnectionStringBuilder dbConnectionStringBuilder && dbConnectionStringBuilder.TryGetValue(DisplayName, out var value)) { return value; } return null; } public override void ResetValue(object component) { if (component is DbConnectionStringBuilder dbConnectionStringBuilder) { dbConnectionStringBuilder.Remove(DisplayName); if (RefreshOnChange) { dbConnectionStringBuilder.ClearPropertyDescriptors(); } } } public override void SetValue(object component, object value) { if (component is DbConnectionStringBuilder dbConnectionStringBuilder) { if (typeof(string) == PropertyType && string.Empty.Equals(value)) { value = null; } dbConnectionStringBuilder[DisplayName] = value; if (RefreshOnChange) { dbConnectionStringBuilder.ClearPropertyDescriptors(); } } } public override bool ShouldSerializeValue(object component) { if (component is DbConnectionStringBuilder dbConnectionStringBuilder) { return dbConnectionStringBuilder.ShouldSerialize(DisplayName); } return false; } } public abstract class DbDataAdapter : DataAdapter, IDbDataAdapter, IDataAdapter, ICloneable { private struct BatchCommandInfo { internal int _commandIdentifier; internal int _parameterCount; internal DataRow _row; internal StatementType _statementType; internal UpdateRowSource _updatedRowSource; internal int? _recordsAffected; internal Exception _errors; } public const string DefaultSourceTableName = "Table"; internal static readonly object s_parameterValueNonNullValue = 0; internal static readonly object s_parameterValueNullValue = 1; private IDbCommand _deleteCommand; private IDbCommand _insertCommand; private IDbCommand _selectCommand; private IDbCommand _updateCommand; private CommandBehavior _fillCommandBehavior; private IDbDataAdapter _IDbDataAdapter => this; [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public DbCommand DeleteCommand { get { return (DbCommand)_IDbDataAdapter.DeleteCommand; } set { _IDbDataAdapter.DeleteCommand = value; } } IDbCommand IDbDataAdapter.DeleteCommand { get { return _deleteCommand; } set { _deleteCommand = value; } } protected internal CommandBehavior FillCommandBehavior { get { return _fillCommandBehavior | CommandBehavior.SequentialAccess; } set { _fillCommandBehavior = value | CommandBehavior.SequentialAccess; } } [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public DbCommand InsertCommand { get { return (DbCommand)_IDbDataAdapter.InsertCommand; } set { _IDbDataAdapter.InsertCommand = value; } } IDbCommand IDbDataAdapter.InsertCommand { get { return _insertCommand; } set { _insertCommand = value; } } [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public DbCommand SelectCommand { get { return (DbCommand)_IDbDataAdapter.SelectCommand; } set { _IDbDataAdapter.SelectCommand = value; } } IDbCommand IDbDataAdapter.SelectCommand { get { return _selectCommand; } set { _selectCommand = value; } } [DefaultValue(1)] public virtual int UpdateBatchSize { get { return 1; } set { if (1 != value) { throw ADP.NotSupported(); } } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public DbCommand UpdateCommand { get { return (DbCommand)_IDbDataAdapter.UpdateCommand; } set { _IDbDataAdapter.UpdateCommand = value; } } IDbCommand IDbDataAdapter.UpdateCommand { get { return _updateCommand; } set { _updateCommand = value; } } private MissingMappingAction UpdateMappingAction { get { if (MissingMappingAction.Passthrough == base.MissingMappingAction) { return MissingMappingAction.Passthrough; } return MissingMappingAction.Error; } } private MissingSchemaAction UpdateSchemaAction { get { MissingSchemaAction missingSchemaAction = base.MissingSchemaAction; if (MissingSchemaAction.Add == missingSchemaAction || MissingSchemaAction.AddWithKey == missingSchemaAction) { return MissingSchemaAction.Ignore; } return MissingSchemaAction.Error; } } protected DbDataAdapter() { } protected DbDataAdapter(DbDataAdapter adapter) : base(adapter) { CloneFrom(adapter); } protected virtual int AddToBatch(IDbCommand command) { throw ADP.NotSupported(); } protected virtual void ClearBatch() { throw ADP.NotSupported(); } object ICloneable.Clone() { DbDataAdapter obj = (DbDataAdapter)CloneInternals(); obj.CloneFrom(this); return obj; } private void CloneFrom(DbDataAdapter from) { IDbDataAdapter iDbDataAdapter = from._IDbDataAdapter; _IDbDataAdapter.SelectCommand = CloneCommand(iDbDataAdapter.SelectCommand); _IDbDataAdapter.InsertCommand = CloneCommand(iDbDataAdapter.InsertCommand); _IDbDataAdapter.UpdateCommand = CloneCommand(iDbDataAdapter.UpdateCommand); _IDbDataAdapter.DeleteCommand = CloneCommand(iDbDataAdapter.DeleteCommand); } private IDbCommand CloneCommand(IDbCommand command) { return (IDbCommand)((command is ICloneable) ? ((ICloneable)command).Clone() : null); } protected virtual RowUpdatedEventArgs CreateRowUpdatedEvent(DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) { return new RowUpdatedEventArgs(dataRow, command, statementType, tableMapping); } protected virtual RowUpdatingEventArgs CreateRowUpdatingEvent(DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) { return new RowUpdatingEventArgs(dataRow, command, statementType, tableMapping); } protected override void Dispose(bool disposing) { if (disposing) { ((IDbDataAdapter)this).SelectCommand = null; ((IDbDataAdapter)this).InsertCommand = null; ((IDbDataAdapter)this).UpdateCommand = null; ((IDbDataAdapter)this).DeleteCommand = null; } base.Dispose(disposing); } protected virtual int ExecuteBatch() { throw ADP.NotSupported(); } public DataTable FillSchema(DataTable dataTable, SchemaType schemaType) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, dataTable, schemaType={1}", base.ObjectID, schemaType); try { IDbCommand selectCommand = _IDbDataAdapter.SelectCommand; CommandBehavior fillCommandBehavior = FillCommandBehavior; return FillSchema(dataTable, schemaType, selectCommand, fillCommandBehavior); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public override DataTable[] FillSchema(DataSet dataSet, SchemaType schemaType) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, dataSet, schemaType={1}", base.ObjectID, schemaType); try { IDbCommand selectCommand = _IDbDataAdapter.SelectCommand; if (base.DesignMode && (selectCommand == null || selectCommand.Connection == null || string.IsNullOrEmpty(selectCommand.CommandText))) { return Array.Empty(); } CommandBehavior fillCommandBehavior = FillCommandBehavior; return FillSchema(dataSet, schemaType, selectCommand, "Table", fillCommandBehavior); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public DataTable[] FillSchema(DataSet dataSet, SchemaType schemaType, string srcTable) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, dataSet, schemaType={1}, srcTable={2}", base.ObjectID, (int)schemaType, srcTable); try { IDbCommand selectCommand = _IDbDataAdapter.SelectCommand; CommandBehavior fillCommandBehavior = FillCommandBehavior; return FillSchema(dataSet, schemaType, selectCommand, srcTable, fillCommandBehavior); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } protected virtual DataTable[] FillSchema(DataSet dataSet, SchemaType schemaType, IDbCommand command, string srcTable, CommandBehavior behavior) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, dataSet, schemaType, command, srcTable, behavior={1}", base.ObjectID, behavior); try { if (dataSet == null) { throw ADP.ArgumentNull("dataSet"); } if (SchemaType.Source != schemaType && SchemaType.Mapped != schemaType) { throw ADP.InvalidSchemaType(schemaType); } if (string.IsNullOrEmpty(srcTable)) { throw ADP.FillSchemaRequiresSourceTableName("srcTable"); } if (command == null) { throw ADP.MissingSelectCommand("FillSchema"); } return (DataTable[])FillSchemaInternal(dataSet, null, schemaType, command, srcTable, behavior); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } protected virtual DataTable FillSchema(DataTable dataTable, SchemaType schemaType, IDbCommand command, CommandBehavior behavior) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, dataTable, schemaType, command, behavior={1}", base.ObjectID, behavior); try { if (dataTable == null) { throw ADP.ArgumentNull("dataTable"); } if (SchemaType.Source != schemaType && SchemaType.Mapped != schemaType) { throw ADP.InvalidSchemaType(schemaType); } if (command == null) { throw ADP.MissingSelectCommand("FillSchema"); } string text = dataTable.TableName; int num = IndexOfDataSetTable(text); if (-1 != num) { text = base.TableMappings[num].SourceTable; } return (DataTable)FillSchemaInternal(null, dataTable, schemaType, command, text, behavior | CommandBehavior.SingleResult); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } private object FillSchemaInternal(DataSet dataset, DataTable datatable, SchemaType schemaType, IDbCommand command, string srcTable, CommandBehavior behavior) { object result = null; bool flag = command.Connection == null; try { IDbConnection connection = GetConnection3(this, command, "FillSchema"); ConnectionState originalState = ConnectionState.Open; try { QuietOpen(connection, out originalState); using IDataReader dataReader = command.ExecuteReader(behavior | CommandBehavior.SchemaOnly | CommandBehavior.KeyInfo); result = ((datatable == null) ? ((object)FillSchema(dataset, schemaType, srcTable, dataReader)) : ((object)FillSchema(datatable, schemaType, dataReader))); } finally { QuietClose(connection, originalState); } } finally { if (flag) { command.Transaction = null; command.Connection = null; } } return result; } public override int Fill(DataSet dataSet) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, dataSet", base.ObjectID); try { IDbCommand selectCommand = _IDbDataAdapter.SelectCommand; CommandBehavior fillCommandBehavior = FillCommandBehavior; return Fill(dataSet, 0, 0, "Table", selectCommand, fillCommandBehavior); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public int Fill(DataSet dataSet, string srcTable) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, dataSet, srcTable='{1}'", base.ObjectID, srcTable); try { IDbCommand selectCommand = _IDbDataAdapter.SelectCommand; CommandBehavior fillCommandBehavior = FillCommandBehavior; return Fill(dataSet, 0, 0, srcTable, selectCommand, fillCommandBehavior); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public int Fill(DataSet dataSet, int startRecord, int maxRecords, string srcTable) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, dataSet, startRecord={1}, maxRecords={2}, srcTable='{3}'", base.ObjectID, startRecord, maxRecords, srcTable); try { IDbCommand selectCommand = _IDbDataAdapter.SelectCommand; CommandBehavior fillCommandBehavior = FillCommandBehavior; return Fill(dataSet, startRecord, maxRecords, srcTable, selectCommand, fillCommandBehavior); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } protected virtual int Fill(DataSet dataSet, int startRecord, int maxRecords, string srcTable, IDbCommand command, CommandBehavior behavior) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, dataSet, startRecord, maxRecords, srcTable, command, behavior={1}", base.ObjectID, behavior); try { if (dataSet == null) { throw ADP.FillRequires("dataSet"); } if (startRecord < 0) { throw ADP.InvalidStartRecord("startRecord", startRecord); } if (maxRecords < 0) { throw ADP.InvalidMaxRecords("maxRecords", maxRecords); } if (string.IsNullOrEmpty(srcTable)) { throw ADP.FillRequiresSourceTableName("srcTable"); } if (command == null) { throw ADP.MissingSelectCommand("Fill"); } return FillInternal(dataSet, null, startRecord, maxRecords, srcTable, command, behavior); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public int Fill(DataTable dataTable) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, dataTable", base.ObjectID); try { DataTable[] dataTables = new DataTable[1] { dataTable }; IDbCommand selectCommand = _IDbDataAdapter.SelectCommand; CommandBehavior fillCommandBehavior = FillCommandBehavior; return Fill(dataTables, 0, 0, selectCommand, fillCommandBehavior); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public int Fill(int startRecord, int maxRecords, params DataTable[] dataTables) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, startRecord={1}, maxRecords={2}, dataTable[]", base.ObjectID, startRecord, maxRecords); try { IDbCommand selectCommand = _IDbDataAdapter.SelectCommand; CommandBehavior fillCommandBehavior = FillCommandBehavior; return Fill(dataTables, startRecord, maxRecords, selectCommand, fillCommandBehavior); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } protected virtual int Fill(DataTable dataTable, IDbCommand command, CommandBehavior behavior) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, dataTable, command, behavior={1}", base.ObjectID, behavior); try { DataTable[] dataTables = new DataTable[1] { dataTable }; return Fill(dataTables, 0, 0, command, behavior); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } protected virtual int Fill(DataTable[] dataTables, int startRecord, int maxRecords, IDbCommand command, CommandBehavior behavior) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, dataTables[], startRecord, maxRecords, command, behavior={1}", base.ObjectID, behavior); try { if (dataTables == null || dataTables.Length == 0 || dataTables[0] == null) { throw ADP.FillRequires("dataTable"); } if (startRecord < 0) { throw ADP.InvalidStartRecord("startRecord", startRecord); } if (maxRecords < 0) { throw ADP.InvalidMaxRecords("maxRecords", maxRecords); } if (1 < dataTables.Length && (startRecord != 0 || maxRecords != 0)) { throw ADP.OnlyOneTableForStartRecordOrMaxRecords(); } if (command == null) { throw ADP.MissingSelectCommand("Fill"); } if (1 == dataTables.Length) { behavior |= CommandBehavior.SingleResult; } return FillInternal(null, dataTables, startRecord, maxRecords, null, command, behavior); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } private int FillInternal(DataSet dataset, DataTable[] datatables, int startRecord, int maxRecords, string srcTable, IDbCommand command, CommandBehavior behavior) { int result = 0; bool flag = command.Connection == null; try { IDbConnection connection = GetConnection3(this, command, "Fill"); ConnectionState originalState = ConnectionState.Open; if (MissingSchemaAction.AddWithKey == base.MissingSchemaAction) { behavior |= CommandBehavior.KeyInfo; } try { QuietOpen(connection, out originalState); behavior |= CommandBehavior.SequentialAccess; IDataReader dataReader = null; try { dataReader = command.ExecuteReader(behavior); result = ((datatables == null) ? Fill(dataset, srcTable, dataReader, startRecord, maxRecords) : Fill(datatables, dataReader, startRecord, maxRecords)); } finally { dataReader?.Dispose(); } } finally { QuietClose(connection, originalState); } } finally { if (flag) { command.Transaction = null; command.Connection = null; } } return result; } protected virtual IDataParameter GetBatchedParameter(int commandIdentifier, int parameterIndex) { throw ADP.NotSupported(); } protected virtual bool GetBatchedRecordsAffected(int commandIdentifier, out int recordsAffected, out Exception error) { recordsAffected = 1; error = null; return true; } [EditorBrowsable(EditorBrowsableState.Advanced)] public override IDataParameter[] GetFillParameters() { IDataParameter[] array = null; IDbCommand selectCommand = _IDbDataAdapter.SelectCommand; if (selectCommand != null) { IDataParameterCollection parameters = selectCommand.Parameters; if (parameters != null) { array = new IDataParameter[parameters.Count]; parameters.CopyTo(array, 0); } } if (array == null) { array = Array.Empty(); } return array; } internal DataTableMapping GetTableMapping(DataTable dataTable) { DataTableMapping dataTableMapping = null; int num = IndexOfDataSetTable(dataTable.TableName); if (-1 != num) { dataTableMapping = base.TableMappings[num]; } if (dataTableMapping == null) { if (MissingMappingAction.Error == base.MissingMappingAction) { throw ADP.MissingTableMappingDestination(dataTable.TableName); } dataTableMapping = new DataTableMapping(dataTable.TableName, dataTable.TableName); } return dataTableMapping; } protected virtual void InitializeBatching() { throw ADP.NotSupported(); } protected virtual void OnRowUpdated(RowUpdatedEventArgs value) { } protected virtual void OnRowUpdating(RowUpdatingEventArgs value) { } private void ParameterInput(IDataParameterCollection parameters, StatementType typeIndex, DataRow row, DataTableMapping mappings) { MissingMappingAction updateMappingAction = UpdateMappingAction; MissingSchemaAction updateSchemaAction = UpdateSchemaAction; foreach (IDataParameter parameter in parameters) { if (parameter == null || (ParameterDirection.Input & parameter.Direction) == 0) { continue; } string sourceColumn = parameter.SourceColumn; if (!string.IsNullOrEmpty(sourceColumn)) { DataColumn dataColumn = mappings.GetDataColumn(sourceColumn, null, row.Table, updateMappingAction, updateSchemaAction); if (dataColumn != null) { DataRowVersion parameterSourceVersion = GetParameterSourceVersion(typeIndex, parameter); parameter.Value = row[dataColumn, parameterSourceVersion]; } else { parameter.Value = null; } if (parameter is DbParameter dbParameter && dbParameter.SourceColumnNullMapping) { parameter.Value = (ADP.IsNull(parameter.Value) ? s_parameterValueNullValue : s_parameterValueNonNullValue); } } } } private void ParameterOutput(IDataParameter parameter, DataRow row, DataTableMapping mappings, MissingMappingAction missingMapping, MissingSchemaAction missingSchema) { if ((ParameterDirection.Output & parameter.Direction) == 0) { return; } object value = parameter.Value; if (value == null) { return; } string sourceColumn = parameter.SourceColumn; if (string.IsNullOrEmpty(sourceColumn)) { return; } DataColumn dataColumn = mappings.GetDataColumn(sourceColumn, null, row.Table, missingMapping, missingSchema); if (dataColumn == null) { return; } if (dataColumn.ReadOnly) { try { dataColumn.ReadOnly = false; row[dataColumn] = value; return; } finally { dataColumn.ReadOnly = true; } } row[dataColumn] = value; } private void ParameterOutput(IDataParameterCollection parameters, DataRow row, DataTableMapping mappings) { MissingMappingAction updateMappingAction = UpdateMappingAction; MissingSchemaAction updateSchemaAction = UpdateSchemaAction; foreach (IDataParameter parameter in parameters) { if (parameter != null) { ParameterOutput(parameter, row, mappings, updateMappingAction, updateSchemaAction); } } } protected virtual void TerminateBatching() { throw ADP.NotSupported(); } public override int Update(DataSet dataSet) { return Update(dataSet, "Table"); } public int Update(DataRow[] dataRows) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, dataRows[]", base.ObjectID); try { int result = 0; if (dataRows == null) { throw ADP.ArgumentNull("dataRows"); } if (dataRows.Length != 0) { DataTable dataTable = null; for (int i = 0; i < dataRows.Length; i++) { if (dataRows[i] != null && dataTable != dataRows[i].Table) { if (dataTable != null) { throw ADP.UpdateMismatchRowTable(i); } dataTable = dataRows[i].Table; } } if (dataTable != null) { DataTableMapping tableMapping = GetTableMapping(dataTable); result = Update(dataRows, tableMapping); } } return result; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public int Update(DataTable dataTable) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, dataTable", base.ObjectID); try { if (dataTable == null) { throw ADP.UpdateRequiresDataTable("dataTable"); } DataTableMapping dataTableMapping = null; int num = IndexOfDataSetTable(dataTable.TableName); if (-1 != num) { dataTableMapping = base.TableMappings[num]; } if (dataTableMapping == null) { if (MissingMappingAction.Error == base.MissingMappingAction) { throw ADP.MissingTableMappingDestination(dataTable.TableName); } dataTableMapping = new DataTableMapping("Table", dataTable.TableName); } return UpdateFromDataTable(dataTable, dataTableMapping); } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } public int Update(DataSet dataSet, string srcTable) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, dataSet, srcTable='{1}'", base.ObjectID, srcTable); try { if (dataSet == null) { throw ADP.UpdateRequiresNonNullDataSet("dataSet"); } if (string.IsNullOrEmpty(srcTable)) { throw ADP.UpdateRequiresSourceTableName("srcTable"); } int result = 0; _ = UpdateMappingAction; DataTableMapping tableMappingBySchemaAction = GetTableMappingBySchemaAction(srcTable, srcTable, UpdateMappingAction); MissingSchemaAction updateSchemaAction = UpdateSchemaAction; DataTable dataTableBySchemaAction = tableMappingBySchemaAction.GetDataTableBySchemaAction(dataSet, updateSchemaAction); if (dataTableBySchemaAction != null) { result = UpdateFromDataTable(dataTableBySchemaAction, tableMappingBySchemaAction); } else if (!HasTableMappings() || -1 == base.TableMappings.IndexOf(tableMappingBySchemaAction)) { throw ADP.UpdateRequiresSourceTable(srcTable); } return result; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } protected virtual int Update(DataRow[] dataRows, DataTableMapping tableMapping) { long scopeId = DataCommonEventSource.Log.EnterScope(" {0}, dataRows[], tableMapping", base.ObjectID); try { int num = 0; IDbConnection[] array = new IDbConnection[5]; ConnectionState[] array2 = new ConnectionState[5]; bool useSelectConnectionState = false; IDbCommand selectCommand = _IDbDataAdapter.SelectCommand; if (selectCommand != null) { array[0] = selectCommand.Connection; if (array[0] != null) { array2[0] = array[0].State; useSelectConnectionState = true; } } int num2 = Math.Min(UpdateBatchSize, dataRows.Length); if (num2 < 1) { num2 = dataRows.Length; } BatchCommandInfo[] array3 = new BatchCommandInfo[num2]; DataRow[] array4 = new DataRow[num2]; int num3 = 0; try { try { if (1 != num2) { InitializeBatching(); } StatementType statementType = StatementType.Select; IDbCommand dbCommand = null; foreach (DataRow dataRow in dataRows) { if (dataRow == null) { continue; } bool flag = false; DataRowState rowState = dataRow.RowState; if (rowState <= DataRowState.Added) { if ((uint)(rowState - 1) <= 1u) { continue; } if (rowState != DataRowState.Added) { goto IL_0115; } statementType = StatementType.Insert; dbCommand = _IDbDataAdapter.InsertCommand; } else if (rowState != DataRowState.Deleted) { if (rowState != DataRowState.Modified) { goto IL_0115; } statementType = StatementType.Update; dbCommand = _IDbDataAdapter.UpdateCommand; } else { statementType = StatementType.Delete; dbCommand = _IDbDataAdapter.DeleteCommand; } RowUpdatingEventArgs rowUpdatingEventArgs = CreateRowUpdatingEvent(dataRow, dbCommand, statementType, tableMapping); try { dataRow.RowError = null; if (dbCommand != null) { ParameterInput(dbCommand.Parameters, statementType, dataRow, tableMapping); } } catch (Exception ex) when (ADP.IsCatchableExceptionType(ex)) { ADP.TraceExceptionForCapture(ex); rowUpdatingEventArgs.Errors = ex; rowUpdatingEventArgs.Status = UpdateStatus.ErrorsOccurred; } OnRowUpdating(rowUpdatingEventArgs); IDbCommand command = rowUpdatingEventArgs.Command; flag = dbCommand != command; dbCommand = command; command = null; UpdateStatus status = rowUpdatingEventArgs.Status; if (status != 0) { if (UpdateStatus.ErrorsOccurred == status) { UpdatingRowStatusErrors(rowUpdatingEventArgs, dataRow); continue; } if (UpdateStatus.SkipCurrentRow == status) { if (DataRowState.Unchanged == dataRow.RowState) { num++; } continue; } if (UpdateStatus.SkipAllRemainingRows == status) { if (DataRowState.Unchanged == dataRow.RowState) { num++; } break; } throw ADP.InvalidUpdateStatus(status); } rowUpdatingEventArgs = null; RowUpdatedEventArgs rowUpdatedEventArgs = null; if (1 == num2) { if (dbCommand != null) { array3[0]._commandIdentifier = 0; array3[0]._parameterCount = dbCommand.Parameters.Count; array3[0]._statementType = statementType; array3[0]._updatedRowSource = dbCommand.UpdatedRowSource; } array3[0]._row = dataRow; array4[0] = dataRow; num3 = 1; } else { Exception ex2 = null; try { if (dbCommand != null) { if ((UpdateRowSource.FirstReturnedRecord & dbCommand.UpdatedRowSource) == 0) { array3[num3]._commandIdentifier = AddToBatch(dbCommand); array3[num3]._parameterCount = dbCommand.Parameters.Count; array3[num3]._row = dataRow; array3[num3]._statementType = statementType; array3[num3]._updatedRowSource = dbCommand.UpdatedRowSource; array4[num3] = dataRow; num3++; if (num3 < num2) { continue; } } else { ex2 = ADP.ResultsNotAllowedDuringBatch(); } } else { ex2 = ADP.UpdateRequiresCommand(statementType, flag); } } catch (Exception ex3) when (ADP.IsCatchableExceptionType(ex3)) { ADP.TraceExceptionForCapture(ex3); ex2 = ex3; } if (ex2 != null) { rowUpdatedEventArgs = CreateRowUpdatedEvent(dataRow, dbCommand, StatementType.Batch, tableMapping); rowUpdatedEventArgs.Errors = ex2; rowUpdatedEventArgs.Status = UpdateStatus.ErrorsOccurred; OnRowUpdated(rowUpdatedEventArgs); if (ex2 != rowUpdatedEventArgs.Errors) { for (int j = 0; j < array3.Length; j++) { array3[j]._errors = null; } } num += UpdatedRowStatus(rowUpdatedEventArgs, array3, num3); if (UpdateStatus.SkipAllRemainingRows == rowUpdatedEventArgs.Status) { break; } continue; } } rowUpdatedEventArgs = CreateRowUpdatedEvent(dataRow, dbCommand, statementType, tableMapping); try { if (1 != num2) { IDbConnection connection = GetConnection1(this); ConnectionState connectionState = UpdateConnectionOpen(connection, StatementType.Batch, array, array2, useSelectConnectionState); rowUpdatedEventArgs.AdapterInit(array4); if (ConnectionState.Open == connectionState) { UpdateBatchExecute(array3, num3, rowUpdatedEventArgs); } else { rowUpdatedEventArgs.Errors = ADP.UpdateOpenConnectionRequired(StatementType.Batch, isRowUpdatingCommand: false, connectionState); rowUpdatedEventArgs.Status = UpdateStatus.ErrorsOccurred; } } else if (dbCommand != null) { IDbConnection connection2 = GetConnection4(this, dbCommand, statementType, flag); ConnectionState connectionState2 = UpdateConnectionOpen(connection2, statementType, array, array2, useSelectConnectionState); if (ConnectionState.Open == connectionState2) { UpdateRowExecute(rowUpdatedEventArgs, dbCommand, statementType); array3[0]._recordsAffected = rowUpdatedEventArgs.RecordsAffected; array3[0]._errors = null; } else { rowUpdatedEventArgs.Errors = ADP.UpdateOpenConnectionRequired(statementType, flag, connectionState2); rowUpdatedEventArgs.Status = UpdateStatus.ErrorsOccurred; } } else { rowUpdatedEventArgs.Errors = ADP.UpdateRequiresCommand(statementType, flag); rowUpdatedEventArgs.Status = UpdateStatus.ErrorsOccurred; } } catch (Exception ex4) when (ADP.IsCatchableExceptionType(ex4)) { ADP.TraceExceptionForCapture(ex4); rowUpdatedEventArgs.Errors = ex4; rowUpdatedEventArgs.Status = UpdateStatus.ErrorsOccurred; } bool flag2 = UpdateStatus.ErrorsOccurred == rowUpdatedEventArgs.Status; Exception errors = rowUpdatedEventArgs.Errors; OnRowUpdated(rowUpdatedEventArgs); if (errors != rowUpdatedEventArgs.Errors) { for (int k = 0; k < array3.Length; k++) { array3[k]._errors = null; } } num += UpdatedRowStatus(rowUpdatedEventArgs, array3, num3); if (UpdateStatus.SkipAllRemainingRows == rowUpdatedEventArgs.Status) { if (flag2 && 1 != num2) { ClearBatch(); num3 = 0; } break; } if (1 != num2) { ClearBatch(); num3 = 0; } for (int l = 0; l < array3.Length; l++) { array3[l] = default(BatchCommandInfo); } num3 = 0; continue; IL_0115: throw ADP.InvalidDataRowState(dataRow.RowState); } if (1 != num2 && 0 < num3) { RowUpdatedEventArgs rowUpdatedEventArgs2 = CreateRowUpdatedEvent(null, dbCommand, statementType, tableMapping); try { IDbConnection connection3 = GetConnection1(this); ConnectionState connectionState3 = UpdateConnectionOpen(connection3, StatementType.Batch, array, array2, useSelectConnectionState); DataRow[] array5 = array4; if (num3 < array4.Length) { array5 = new DataRow[num3]; Array.Copy(array4, 0, array5, 0, num3); } rowUpdatedEventArgs2.AdapterInit(array5); if (ConnectionState.Open == connectionState3) { UpdateBatchExecute(array3, num3, rowUpdatedEventArgs2); } else { rowUpdatedEventArgs2.Errors = ADP.UpdateOpenConnectionRequired(StatementType.Batch, isRowUpdatingCommand: false, connectionState3); rowUpdatedEventArgs2.Status = UpdateStatus.ErrorsOccurred; } } catch (Exception ex5) when (ADP.IsCatchableExceptionType(ex5)) { ADP.TraceExceptionForCapture(ex5); rowUpdatedEventArgs2.Errors = ex5; rowUpdatedEventArgs2.Status = UpdateStatus.ErrorsOccurred; } Exception errors2 = rowUpdatedEventArgs2.Errors; OnRowUpdated(rowUpdatedEventArgs2); if (errors2 != rowUpdatedEventArgs2.Errors) { for (int m = 0; m < array3.Length; m++) { array3[m]._errors = null; } } num += UpdatedRowStatus(rowUpdatedEventArgs2, array3, num3); } } finally { if (1 != num2) { TerminateBatching(); } } } finally { for (int n = 0; n < array.Length; n++) { QuietClose(array[n], array2[n]); } } return num; } finally { DataCommonEventSource.Log.ExitScope(scopeId); } } private void UpdateBatchExecute(BatchCommandInfo[] batchCommands, int commandCount, RowUpdatedEventArgs rowUpdatedEvent) { try { int recordsAffected = ExecuteBatch(); rowUpdatedEvent.AdapterInit(recordsAffected); } catch (DbException ex) { ADP.TraceExceptionForCapture(ex); rowUpdatedEvent.Errors = ex; rowUpdatedEvent.Status = UpdateStatus.ErrorsOccurred; } MissingMappingAction updateMappingAction = UpdateMappingAction; MissingSchemaAction updateSchemaAction = UpdateSchemaAction; int num = 0; bool flag = false; List list = null; for (int i = 0; i < commandCount; i++) { BatchCommandInfo batchCommandInfo = batchCommands[i]; StatementType statementType = batchCommandInfo._statementType; if (GetBatchedRecordsAffected(batchCommandInfo._commandIdentifier, out var recordsAffected2, out batchCommands[i]._errors)) { batchCommands[i]._recordsAffected = recordsAffected2; } if (batchCommands[i]._errors != null || !batchCommands[i]._recordsAffected.HasValue) { continue; } if (StatementType.Update == statementType || StatementType.Delete == statementType) { num++; if (recordsAffected2 == 0) { if (list == null) { list = new List(); } batchCommands[i]._errors = ADP.UpdateConcurrencyViolation(batchCommands[i]._statementType, 0, 1, new DataRow[1] { rowUpdatedEvent.Rows[i] }); flag = true; list.Add(rowUpdatedEvent.Rows[i]); } } if ((StatementType.Insert == statementType || StatementType.Update == statementType) && (UpdateRowSource.OutputParameters & batchCommandInfo._updatedRowSource) != 0 && recordsAffected2 != 0) { if (StatementType.Insert == statementType) { rowUpdatedEvent.Rows[i].AcceptChanges(); } for (int j = 0; j < batchCommandInfo._parameterCount; j++) { IDataParameter batchedParameter = GetBatchedParameter(batchCommandInfo._commandIdentifier, j); ParameterOutput(batchedParameter, batchCommandInfo._row, rowUpdatedEvent.TableMapping, updateMappingAction, updateSchemaAction); } } } if (rowUpdatedEvent.Errors == null && rowUpdatedEvent.Status == UpdateStatus.Continue && 0 < num && (rowUpdatedEvent.RecordsAffected == 0 || flag)) { DataRow[] array = ((list != null) ? list.ToArray() : rowUpdatedEvent.Rows); rowUpdatedEvent.Errors = ADP.UpdateConcurrencyViolation(StatementType.Batch, commandCount - array.Length, commandCount, array); rowUpdatedEvent.Status = UpdateStatus.ErrorsOccurred; } } private ConnectionState UpdateConnectionOpen(IDbConnection connection, StatementType statementType, IDbConnection[] connections, ConnectionState[] connectionStates, bool useSelectConnectionState) { if (connection != connections[(int)statementType]) { QuietClose(connections[(int)statementType], connectionStates[(int)statementType]); connections[(int)statementType] = connection; connectionStates[(int)statementType] = ConnectionState.Closed; QuietOpen(connection, out connectionStates[(int)statementType]); if (useSelectConnectionState && connections[0] == connection) { connectionStates[(int)statementType] = connections[0].State; } } return connection.State; } private int UpdateFromDataTable(DataTable dataTable, DataTableMapping tableMapping) { int result = 0; DataRow[] array = ADP.SelectAdapterRows(dataTable, sorted: false); if (array != null && array.Length != 0) { result = Update(array, tableMapping); } return result; } private void UpdateRowExecute(RowUpdatedEventArgs rowUpdatedEvent, IDbCommand dataCommand, StatementType cmdIndex) { bool flag = true; UpdateRowSource updatedRowSource = dataCommand.UpdatedRowSource; if (StatementType.Delete == cmdIndex || (UpdateRowSource.FirstReturnedRecord & updatedRowSource) == 0) { int recordsAffected = dataCommand.ExecuteNonQuery(); rowUpdatedEvent.AdapterInit(recordsAffected); } else if (StatementType.Insert == cmdIndex || StatementType.Update == cmdIndex) { using IDataReader dataReader = dataCommand.ExecuteReader(CommandBehavior.SequentialAccess); DataReaderContainer dataReaderContainer = DataReaderContainer.Create(dataReader, ReturnProviderSpecificTypes); try { bool flag2 = false; do { if (0 < dataReaderContainer.FieldCount) { flag2 = true; break; } } while (dataReader.NextResult()); if (flag2 && dataReader.RecordsAffected != 0) { SchemaMapping schemaMapping = new SchemaMapping(this, null, rowUpdatedEvent.Row.Table, dataReaderContainer, keyInfo: false, SchemaType.Mapped, rowUpdatedEvent.TableMapping.SourceTable, gettingData: true, null, null); if (schemaMapping.DataTable != null && schemaMapping.DataValues != null && dataReader.Read()) { if (StatementType.Insert == cmdIndex && flag) { rowUpdatedEvent.Row.AcceptChanges(); flag = false; } schemaMapping.ApplyToDataRow(rowUpdatedEvent.Row); } } } finally { dataReader.Close(); int recordsAffected2 = dataReader.RecordsAffected; rowUpdatedEvent.AdapterInit(recordsAffected2); } } if ((StatementType.Insert == cmdIndex || StatementType.Update == cmdIndex) && (UpdateRowSource.OutputParameters & updatedRowSource) != 0 && rowUpdatedEvent.RecordsAffected != 0) { if (StatementType.Insert == cmdIndex && flag) { rowUpdatedEvent.Row.AcceptChanges(); } ParameterOutput(dataCommand.Parameters, rowUpdatedEvent.Row, rowUpdatedEvent.TableMapping); } if (rowUpdatedEvent.Status == UpdateStatus.Continue && (uint)(cmdIndex - 2) <= 1u && rowUpdatedEvent.RecordsAffected == 0) { rowUpdatedEvent.Errors = ADP.UpdateConcurrencyViolation(cmdIndex, rowUpdatedEvent.RecordsAffected, 1, new DataRow[1] { rowUpdatedEvent.Row }); rowUpdatedEvent.Status = UpdateStatus.ErrorsOccurred; } } private int UpdatedRowStatus(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, int commandCount) { int num = 0; switch (rowUpdatedEvent.Status) { case UpdateStatus.Continue: return UpdatedRowStatusContinue(rowUpdatedEvent, batchCommands, commandCount); case UpdateStatus.ErrorsOccurred: return UpdatedRowStatusErrors(rowUpdatedEvent, batchCommands, commandCount); case UpdateStatus.SkipCurrentRow: case UpdateStatus.SkipAllRemainingRows: return UpdatedRowStatusSkip(batchCommands, commandCount); default: throw ADP.InvalidUpdateStatus(rowUpdatedEvent.Status); } } private int UpdatedRowStatusContinue(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, int commandCount) { int num = 0; bool acceptChangesDuringUpdate = base.AcceptChangesDuringUpdate; for (int i = 0; i < commandCount; i++) { DataRow row = batchCommands[i]._row; if (batchCommands[i]._errors == null && batchCommands[i]._recordsAffected.HasValue && batchCommands[i]._recordsAffected.Value != 0) { if (acceptChangesDuringUpdate && ((DataRowState.Added | DataRowState.Deleted | DataRowState.Modified) & row.RowState) != 0) { row.AcceptChanges(); } num++; } } return num; } private int UpdatedRowStatusErrors(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, int commandCount) { Exception ex = rowUpdatedEvent.Errors; if (ex == null) { ex = (rowUpdatedEvent.Errors = ADP.RowUpdatedErrors()); } int result = 0; bool flag = false; string message = ex.Message; for (int i = 0; i < commandCount; i++) { DataRow row = batchCommands[i]._row; if (batchCommands[i]._errors != null) { string text = batchCommands[i]._errors.Message; if (string.IsNullOrEmpty(text)) { text = message; } row.RowError += text; flag = true; } } if (!flag) { for (int j = 0; j < commandCount; j++) { batchCommands[j]._row.RowError += message; } } else { result = UpdatedRowStatusContinue(rowUpdatedEvent, batchCommands, commandCount); } if (!base.ContinueUpdateOnError) { throw ex; } return result; } private int UpdatedRowStatusSkip(BatchCommandInfo[] batchCommands, int commandCount) { int num = 0; for (int i = 0; i < commandCount; i++) { DataRow row = batchCommands[i]._row; if (((DataRowState.Detached | DataRowState.Unchanged) & row.RowState) != 0) { num++; } } return num; } private void UpdatingRowStatusErrors(RowUpdatingEventArgs rowUpdatedEvent, DataRow dataRow) { Exception ex = rowUpdatedEvent.Errors; if (ex == null) { ex = (rowUpdatedEvent.Errors = ADP.RowUpdatingErrors()); } string message = ex.Message; dataRow.RowError += message; if (!base.ContinueUpdateOnError) { throw ex; } } private static IDbConnection GetConnection1(DbDataAdapter adapter) { IDbCommand dbCommand = adapter._IDbDataAdapter.SelectCommand; if (dbCommand == null) { dbCommand = adapter._IDbDataAdapter.InsertCommand; if (dbCommand == null) { dbCommand = adapter._IDbDataAdapter.UpdateCommand; if (dbCommand == null) { dbCommand = adapter._IDbDataAdapter.DeleteCommand; } } } IDbConnection dbConnection = null; if (dbCommand != null) { dbConnection = dbCommand.Connection; } if (dbConnection == null) { throw ADP.UpdateConnectionRequired(StatementType.Batch, isRowUpdatingCommand: false); } return dbConnection; } private static IDbConnection GetConnection3(DbDataAdapter adapter, IDbCommand command, string method) { IDbConnection connection = command.Connection; if (connection == null) { throw ADP.ConnectionRequired_Res(method); } return connection; } private static IDbConnection GetConnection4(DbDataAdapter adapter, IDbCommand command, StatementType statementType, bool isCommandFromRowUpdating) { IDbConnection connection = command.Connection; if (connection == null) { throw ADP.UpdateConnectionRequired(statementType, isCommandFromRowUpdating); } return connection; } private static DataRowVersion GetParameterSourceVersion(StatementType statementType, IDataParameter parameter) { switch (statementType) { case StatementType.Insert: return DataRowVersion.Current; case StatementType.Update: return parameter.SourceVersion; case StatementType.Delete: return DataRowVersion.Original; case StatementType.Select: case StatementType.Batch: throw ADP.UnwantedStatementType(statementType); default: throw ADP.InvalidStatementType(statementType); } } private static void QuietClose(IDbConnection connection, ConnectionState originalState) { if (connection != null && originalState == ConnectionState.Closed) { connection.Close(); } } private static void QuietOpen(IDbConnection connection, out ConnectionState originalState) { originalState = connection.State; if (originalState == ConnectionState.Closed) { connection.Open(); } } } public abstract class DbDataReader : MarshalByRefObject, IDataReader, IDisposable, IDataRecord, IEnumerable { public abstract int Depth { get; } public abstract int FieldCount { get; } public abstract bool HasRows { get; } public abstract bool IsClosed { get; } public abstract int RecordsAffected { get; } public virtual int VisibleFieldCount => FieldCount; public abstract object this[int ordinal] { get; } public abstract object this[string name] { get; } public virtual void Close() { } [EditorBrowsable(EditorBrowsableState.Never)] public void Dispose() { Dispose(disposing: true); } protected virtual void Dispose(bool disposing) { if (disposing) { Close(); } } public abstract string GetDataTypeName(int ordinal); [EditorBrowsable(EditorBrowsableState.Never)] public abstract IEnumerator GetEnumerator(); public abstract Type GetFieldType(int ordinal); public abstract string GetName(int ordinal); public abstract int GetOrdinal(string name); public virtual DataTable GetSchemaTable() { throw new NotSupportedException(); } public abstract bool GetBoolean(int ordinal); public abstract byte GetByte(int ordinal); public abstract long GetBytes(int ordinal, long dataOffset, byte[] buffer, int bufferOffset, int length); public abstract char GetChar(int ordinal); public abstract long GetChars(int ordinal, long dataOffset, char[] buffer, int bufferOffset, int length); [EditorBrowsable(EditorBrowsableState.Never)] public DbDataReader GetData(int ordinal) { return GetDbDataReader(ordinal); } IDataReader IDataRecord.GetData(int ordinal) { return GetDbDataReader(ordinal); } protected virtual DbDataReader GetDbDataReader(int ordinal) { throw ADP.NotSupported(); } public abstract DateTime GetDateTime(int ordinal); public abstract decimal GetDecimal(int ordinal); public abstract double GetDouble(int ordinal); public abstract float GetFloat(int ordinal); public abstract Guid GetGuid(int ordinal); public abstract short GetInt16(int ordinal); public abstract int GetInt32(int ordinal); public abstract long GetInt64(int ordinal); [EditorBrowsable(EditorBrowsableState.Never)] public virtual Type GetProviderSpecificFieldType(int ordinal) { return GetFieldType(ordinal); } [EditorBrowsable(EditorBrowsableState.Never)] public virtual object GetProviderSpecificValue(int ordinal) { return GetValue(ordinal); } [EditorBrowsable(EditorBrowsableState.Never)] public virtual int GetProviderSpecificValues(object[] values) { return GetValues(values); } public abstract string GetString(int ordinal); public virtual Stream GetStream(int ordinal) { using MemoryStream memoryStream = new MemoryStream(); long num = 0L; long num2 = 0L; byte[] array = new byte[4096]; do { num = GetBytes(ordinal, num2, array, 0, array.Length); memoryStream.Write(array, 0, (int)num); num2 += num; } while (num > 0); return new MemoryStream(memoryStream.ToArray(), writable: false); } public virtual TextReader GetTextReader(int ordinal) { if (IsDBNull(ordinal)) { return new StringReader(string.Empty); } return new StringReader(GetString(ordinal)); } public abstract object GetValue(int ordinal); public virtual T GetFieldValue(int ordinal) { return (T)GetValue(ordinal); } public Task GetFieldValueAsync(int ordinal) { return GetFieldValueAsync(ordinal, CancellationToken.None); } public virtual Task GetFieldValueAsync(int ordinal, CancellationToken cancellationToken) { if (cancellationToken.IsCancellationRequested) { return ADP.CreatedTaskWithCancellation(); } try { return Task.FromResult(GetFieldValue(ordinal)); } catch (Exception exception) { return Task.FromException(exception); } } public abstract int GetValues(object[] values); public abstract bool IsDBNull(int ordinal); public Task IsDBNullAsync(int ordinal) { return IsDBNullAsync(ordinal, CancellationToken.None); } public virtual Task IsDBNullAsync(int ordinal, CancellationToken cancellationToken) { if (cancellationToken.IsCancellationRequested) { return ADP.CreatedTaskWithCancellation(); } try { return IsDBNull(ordinal) ? ADP.TrueTask : ADP.FalseTask; } catch (Exception exception) { return Task.FromException(exception); } } public abstract bool NextResult(); public abstract bool Read(); public Task ReadAsync() { return ReadAsync(CancellationToken.None); } public virtual Task ReadAsync(CancellationToken cancellationToken) { if (cancellationToken.IsCancellationRequested) { return ADP.CreatedTaskWithCancellation(); } try { return Read() ? ADP.TrueTask : ADP.FalseTask; } catch (Exception exception) { return Task.FromException(exception); } } public Task NextResultAsync() { return NextResultAsync(CancellationToken.None); } public virtual Task NextResultAsync(CancellationToken cancellationToken) { if (cancellationToken.IsCancellationRequested) { return ADP.CreatedTaskWithCancellation(); } try { return NextResult() ? ADP.TrueTask : ADP.FalseTask; } catch (Exception exception) { return Task.FromException(exception); } } } public static class DbDataReaderExtensions { public static ReadOnlyCollection GetColumnSchema(this DbDataReader reader) { if (reader.CanGetColumnSchema()) { return ((IDbColumnSchemaGenerator)reader).GetColumnSchema(); } throw new NotSupportedException(); } public static bool CanGetColumnSchema(this DbDataReader reader) { return reader is IDbColumnSchemaGenerator; } } public abstract class DbDataRecord : ICustomTypeDescriptor, IDataRecord { public abstract int FieldCount { get; } public abstract object this[int i] { get; } public abstract object this[string name] { get; } public abstract bool GetBoolean(int i); public abstract byte GetByte(int i); public abstract long GetBytes(int i, long dataIndex, byte[] buffer, int bufferIndex, int length); public abstract char GetChar(int i); public abstract long GetChars(int i, long dataIndex, char[] buffer, int bufferIndex, int length); public IDataReader GetData(int i) { return GetDbDataReader(i); } protected virtual DbDataReader GetDbDataReader(int i) { throw ADP.NotSupported(); } public abstract string GetDataTypeName(int i); public abstract DateTime GetDateTime(int i); public abstract decimal GetDecimal(int i); public abstract double GetDouble(int i); public abstract Type GetFieldType(int i); public abstract float GetFloat(int i); public abstract Guid GetGuid(int i); public abstract short GetInt16(int i); public abstract int GetInt32(int i); public abstract long GetInt64(int i); public abstract string GetName(int i); public abstract int GetOrdinal(string name); public abstract string GetString(int i); public abstract object GetValue(int i); public abstract int GetValues(object[] values); public abstract bool IsDBNull(int i); AttributeCollection ICustomTypeDescriptor.GetAttributes() { return new AttributeCollection((Attribute[]?)null); } string ICustomTypeDescriptor.GetClassName() { return null; } string ICustomTypeDescriptor.GetComponentName() { return null; } TypeConverter ICustomTypeDescriptor.GetConverter() { return null; } EventDescriptor ICustomTypeDescriptor.GetDefaultEvent() { return null; } PropertyDescriptor ICustomTypeDescriptor.GetDefaultProperty() { return null; } object ICustomTypeDescriptor.GetEditor(Type editorBaseType) { return null; } EventDescriptorCollection ICustomTypeDescriptor.GetEvents() { return new EventDescriptorCollection(null); } EventDescriptorCollection ICustomTypeDescriptor.GetEvents(Attribute[] attributes) { return new EventDescriptorCollection(null); } PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties() { return ((ICustomTypeDescriptor)this).GetProperties((Attribute[]?)null); } PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes) { return new PropertyDescriptorCollection(null); } object ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor pd) { return this; } } public abstract class DbDataSourceEnumerator { public abstract DataTable GetDataSources(); } public class DbEnumerator : IEnumerator { private sealed class DbColumnDescriptor : PropertyDescriptor { private int _ordinal; private Type _type; public override Type ComponentType => typeof(IDataRecord); public override bool IsReadOnly => true; public override Type PropertyType => _type; internal DbColumnDescriptor(int ordinal, string name, Type type) : base(name, null) { _ordinal = ordinal; _type = type; } public override bool CanResetValue(object component) { return false; } public override object GetValue(object component) { return ((IDataRecord)component)[_ordinal]; } public override void ResetValue(object component) { throw ADP.NotSupported(); } public override void SetValue(object component, object value) { throw ADP.NotSupported(); } public override bool ShouldSerializeValue(object component) { return false; } } internal IDataReader _reader; internal DbDataRecord _current; internal SchemaInfo[] _schemaInfo; internal PropertyDescriptorCollection _descriptors; private FieldNameLookup _fieldNameLookup; private bool _closeReader; public object Current => _current; public DbEnumerator(IDataReader reader) { if (reader == null) { throw ADP.ArgumentNull("reader"); } _reader = reader; } public DbEnumerator(IDataReader reader, bool closeReader) { if (reader == null) { throw ADP.ArgumentNull("reader"); } _reader = reader; _closeReader = closeReader; } public DbEnumerator(DbDataReader reader) : this((IDataReader)reader) { } public DbEnumerator(DbDataReader reader, bool closeReader) : this((IDataReader)reader, closeReader) { } public bool MoveNext() { if (_schemaInfo == null) { BuildSchemaInfo(); } _current = null; if (_reader.Read()) { object[] values = new object[_schemaInfo.Length]; _reader.GetValues(values); _current = new DataRecordInternal(_schemaInfo, values, _descriptors, _fieldNameLookup); return true; } if (_closeReader) { _reader.Close(); } return false; } [EditorBrowsable(EditorBrowsableState.Never)] public void Reset() { throw ADP.NotSupported(); } private void BuildSchemaInfo() { int fieldCount = _reader.FieldCount; string[] array = new string[fieldCount]; for (int i = 0; i < fieldCount; i++) { array[i] = _reader.GetName(i); } ADP.BuildSchemaTableInfoTableNames(array); SchemaInfo[] array2 = new SchemaInfo[fieldCount]; PropertyDescriptor[] array3 = new PropertyDescriptor[_reader.FieldCount]; for (int j = 0; j < array2.Length; j++) { SchemaInfo schemaInfo = default(SchemaInfo); schemaInfo.name = _reader.GetName(j); schemaInfo.type = _reader.GetFieldType(j); schemaInfo.typeName = _reader.GetDataTypeName(j); array3[j] = new DbColumnDescriptor(j, array[j], schemaInfo.type); array2[j] = schemaInfo; } _schemaInfo = array2; _fieldNameLookup = new FieldNameLookup(_reader, -1); _descriptors = new PropertyDescriptorCollection(array3); } } [Serializable] public abstract class DbException : ExternalException { protected DbException() { } protected DbException(string message) : base(message) { } protected DbException(string message, Exception innerException) : base(message, innerException) { } protected DbException(string message, int errorCode) : base(message, errorCode) { } protected DbException(SerializationInfo info, StreamingContext context) : base(info, context) { throw new PlatformNotSupportedException(); } } public static class DbMetaDataCollectionNames { public static readonly string MetaDataCollections = "MetaDataCollections"; public static readonly string DataSourceInformation = "DataSourceInformation"; public static readonly string DataTypes = "DataTypes"; public static readonly string Restrictions = "Restrictions"; public static readonly string ReservedWords = "ReservedWords"; } public static class DbMetaDataColumnNames { public static readonly string CollectionName = "CollectionName"; public static readonly string ColumnSize = "ColumnSize"; public static readonly string CompositeIdentifierSeparatorPattern = "CompositeIdentifierSeparatorPattern"; public static readonly string CreateFormat = "CreateFormat"; public static readonly string CreateParameters = "CreateParameters"; public static readonly string DataSourceProductName = "DataSourceProductName"; public static readonly string DataSourceProductVersion = "DataSourceProductVersion"; public static readonly string DataType = "DataType"; public static readonly string DataSourceProductVersionNormalized = "DataSourceProductVersionNormalized"; public static readonly string GroupByBehavior = "GroupByBehavior"; public static readonly string IdentifierCase = "IdentifierCase"; public static readonly string IdentifierPattern = "IdentifierPattern"; public static readonly string IsAutoIncrementable = "IsAutoIncrementable"; public static readonly string IsBestMatch = "IsBestMatch"; public static readonly string IsCaseSensitive = "IsCaseSensitive"; public static readonly string IsConcurrencyType = "IsConcurrencyType"; public static readonly string IsFixedLength = "IsFixedLength"; public static readonly string IsFixedPrecisionScale = "IsFixedPrecisionScale"; public static readonly string IsLiteralSupported = "IsLiteralSupported"; public static readonly string IsLong = "IsLong"; public static readonly string IsNullable = "IsNullable"; public static readonly string IsSearchable = "IsSearchable"; public static readonly string IsSearchableWithLike = "IsSearchableWithLike"; public static readonly string IsUnsigned = "IsUnsigned"; public static readonly string LiteralPrefix = "LiteralPrefix"; public static readonly string LiteralSuffix = "LiteralSuffix"; public static readonly string MaximumScale = "MaximumScale"; public static readonly string MinimumScale = "MinimumScale"; public static readonly string NumberOfIdentifierParts = "NumberOfIdentifierParts"; public static readonly string NumberOfRestrictions = "NumberOfRestrictions"; public static readonly string OrderByColumnsInSelect = "OrderByColumnsInSelect"; public static readonly string ParameterMarkerFormat = "ParameterMarkerFormat"; public static readonly string ParameterMarkerPattern = "ParameterMarkerPattern"; public static readonly string ParameterNameMaxLength = "ParameterNameMaxLength"; public static readonly string ParameterNamePattern = "ParameterNamePattern"; public static readonly string ProviderDbType = "ProviderDbType"; public static readonly string QuotedIdentifierCase = "QuotedIdentifierCase"; public static readonly string QuotedIdentifierPattern = "QuotedIdentifierPattern"; public static readonly string ReservedWord = "ReservedWord"; public static readonly string StatementSeparatorPattern = "StatementSeparatorPattern"; public static readonly string StringLiteralPattern = "StringLiteralPattern"; public static readonly string SupportedJoinOperators = "SupportedJoinOperators"; public static readonly string TypeName = "TypeName"; } public abstract class DbParameter : MarshalByRefObject, IDbDataParameter, IDataParameter { [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [RefreshProperties(RefreshProperties.All)] public abstract DbType DbType { get; set; } [RefreshProperties(RefreshProperties.All)] [DefaultValue(ParameterDirection.Input)] public abstract ParameterDirection Direction { get; set; } [EditorBrowsable(EditorBrowsableState.Never)] [DesignOnly(true)] [Browsable(false)] public abstract bool IsNullable { get; set; } [DefaultValue("")] public abstract string ParameterName { get; set; } byte IDbDataParameter.Precision { get { return 0; } set { } } byte IDbDataParameter.Scale { get { return 0; } set { } } public virtual byte Precision { get { return ((IDbDataParameter)this).Precision; } set { ((IDbDataParameter)this).Precision = value; } } public virtual byte Scale { get { return ((IDbDataParameter)this).Scale; } set { ((IDbDataParameter)this).Scale = value; } } public abstract int Size { get; set; } [DefaultValue("")] public abstract string SourceColumn { get; set; } [RefreshProperties(RefreshProperties.All)] [EditorBrowsable(EditorBrowsableState.Advanced)] [DefaultValue(false)] public abstract bool SourceColumnNullMapping { get; set; } [DefaultValue(DataRowVersion.Current)] public virtual DataRowVersion SourceVersion { get { return DataRowVersion.Default; } set { } } [DefaultValue(null)] [RefreshProperties(RefreshProperties.All)] public abstract object Value { get; set; } [EditorBrowsable(EditorBrowsableState.Advanced)] public abstract void ResetDbType(); } public abstract class DbParameterCollection : MarshalByRefObject, IDataParameterCollection, IList, ICollection, IEnumerable { [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public abstract int Count { get; } [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [EditorBrowsable(EditorBrowsableState.Never)] public virtual bool IsFixedSize => false; [Browsable(false)] [EditorBrowsable(EditorBrowsableState.Never)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public virtual bool IsReadOnly => false; [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [EditorBrowsable(EditorBrowsableState.Never)] public virtual bool IsSynchronized => false; [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [EditorBrowsable(EditorBrowsableState.Never)] [Browsable(false)] public abstract object SyncRoot { get; } object IList.this[int index] { get { return GetParameter(index); } set { SetParameter(index, (DbParameter)value); } } object IDataParameterCollection.this[string parameterName] { get { return GetParameter(parameterName); } set { SetParameter(parameterName, (DbParameter)value); } } public DbParameter this[int index] { get { return GetParameter(index); } set { SetParameter(index, value); } } public DbParameter this[string parameterName] { get { return GetParameter(parameterName); } set { SetParameter(parameterName, value); } } public abstract int Add(object value); public abstract void AddRange(Array values); public abstract bool Contains(object value); public abstract bool Contains(string value); public abstract void CopyTo(Array array, int index); public abstract void Clear(); [EditorBrowsable(EditorBrowsableState.Never)] public abstract IEnumerator GetEnumerator(); protected abstract DbParameter GetParameter(int index); protected abstract DbParameter GetParameter(string parameterName); public abstract int IndexOf(object value); public abstract int IndexOf(string parameterName); public abstract void Insert(int index, object value); public abstract void Remove(object value); public abstract void RemoveAt(int index); public abstract void RemoveAt(string parameterName); protected abstract void SetParameter(int index, DbParameter value); protected abstract void SetParameter(string parameterName, DbParameter value); } public abstract class DbProviderFactory { public virtual bool CanCreateDataSourceEnumerator => false; public virtual CodeAccessPermission CreatePermission(PermissionState state) { return null; } public virtual DbCommand CreateCommand() { return null; } public virtual DbCommandBuilder CreateCommandBuilder() { return null; } public virtual DbConnection CreateConnection() { return null; } public virtual DbConnectionStringBuilder CreateConnectionStringBuilder() { return null; } public virtual DbDataAdapter CreateDataAdapter() { return null; } public virtual DbParameter CreateParameter() { return null; } public virtual DbDataSourceEnumerator CreateDataSourceEnumerator() { return null; } } [Serializable] [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] public sealed class DbProviderSpecificTypePropertyAttribute : Attribute { public bool IsProviderSpecificTypeProperty { get; } public DbProviderSpecificTypePropertyAttribute(bool isProviderSpecificTypeProperty) { IsProviderSpecificTypeProperty = isProviderSpecificTypeProperty; } } public abstract class DbTransaction : MarshalByRefObject, IDbTransaction, IDisposable { public DbConnection Connection => DbConnection; IDbConnection IDbTransaction.Connection => DbConnection; protected abstract DbConnection DbConnection { get; } public abstract IsolationLevel IsolationLevel { get; } public abstract void Commit(); public void Dispose() { Dispose(disposing: true); } protected virtual void Dispose(bool disposing) { } public abstract void Rollback(); } internal sealed class DecimalStorage : DataStorage { private static readonly decimal s_defaultValue; private decimal[] _values; internal DecimalStorage(DataColumn column) : base(column, typeof(decimal), s_defaultValue, StorageType.Decimal) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Sum: { decimal num13 = s_defaultValue; int[] array = records; foreach (int num14 in array) { if (HasValue(num14)) { num13 += _values[num14]; flag = true; } } if (flag) { return num13; } return _nullValue; } case AggregateType.Mean: { decimal num6 = s_defaultValue; int num7 = 0; int[] array = records; foreach (int num8 in array) { if (HasValue(num8)) { num6 += _values[num8]; num7++; flag = true; } } if (flag) { return num6 / (decimal)num7; } return _nullValue; } case AggregateType.Var: case AggregateType.StDev: { int num = 0; double num2 = (double)s_defaultValue; _ = (double)s_defaultValue; double num3 = (double)s_defaultValue; double num4 = (double)s_defaultValue; int[] array = records; foreach (int num5 in array) { if (HasValue(num5)) { num3 += (double)_values[num5]; num4 += (double)_values[num5] * (double)_values[num5]; num++; } } if (num > 1) { num2 = (double)num * num4 - num3 * num3; num2 = ((!(num2 / (num3 * num3) < 1E-15) && !(num2 < 0.0)) ? (num2 / (double)(num * (num - 1))) : 0.0); if (kind == AggregateType.StDev) { return Math.Sqrt(num2); } return num2; } return _nullValue; } case AggregateType.Min: { decimal num11 = decimal.MaxValue; foreach (int num12 in records) { if (HasValue(num12)) { num11 = Math.Min(_values[num12], num11); flag = true; } } if (flag) { return num11; } return _nullValue; } case AggregateType.Max: { decimal num9 = decimal.MinValue; foreach (int num10 in records) { if (HasValue(num10)) { num9 = Math.Max(_values[num10], num9); flag = true; } } if (flag) { return num9; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: return base.Aggregate(records, kind); } } catch (OverflowException) { throw ExprException.Overflow(typeof(decimal)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { decimal num = _values[recordNo1]; decimal num2 = _values[recordNo2]; if (num == s_defaultValue || num2 == s_defaultValue) { int num3 = CompareBits(recordNo1, recordNo2); if (num3 != 0) { return num3; } } return decimal.Compare(num, num2); } public override int CompareValueTo(int recordNo, object value) { if (_nullValue == value) { if (!HasValue(recordNo)) { return 0; } return 1; } decimal num = _values[recordNo]; if (s_defaultValue == num && !HasValue(recordNo)) { return -1; } return decimal.Compare(num, (decimal)value); } public override object ConvertValue(object value) { if (_nullValue != value) { value = ((value == null) ? _nullValue : ((object)((IConvertible)value).ToDecimal(base.FormatProvider))); } return value; } public override void Copy(int recordNo1, int recordNo2) { CopyBits(recordNo1, recordNo2); _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { if (!HasValue(record)) { return _nullValue; } return _values[record]; } public override void Set(int record, object value) { if (_nullValue == value) { _values[record] = s_defaultValue; SetNullBit(record, flag: true); } else { _values[record] = ((IConvertible)value).ToDecimal(base.FormatProvider); SetNullBit(record, flag: false); } } public override void SetCapacity(int capacity) { decimal[] array = new decimal[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; base.SetCapacity(capacity); } public override object ConvertXmlToObject(string s) { return XmlConvert.ToDecimal(s); } public override string ConvertObjectToXml(object value) { return XmlConvert.ToString((decimal)value); } protected override object GetEmptyStorage(int recordCount) { return new decimal[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((decimal[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, !HasValue(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (decimal[])store; SetNullStorage(nullbits); } } internal sealed class DoubleStorage : DataStorage { private const double defaultValue = 0.0; private double[] _values; internal DoubleStorage(DataColumn column) : base(column, typeof(double), 0.0, StorageType.Double) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Sum: { double num13 = 0.0; int[] array = records; foreach (int num14 in array) { if (!IsNull(num14)) { num13 += _values[num14]; flag = true; } } if (flag) { return num13; } return _nullValue; } case AggregateType.Mean: { double num6 = 0.0; int num7 = 0; int[] array = records; foreach (int num8 in array) { if (!IsNull(num8)) { num6 += _values[num8]; num7++; flag = true; } } if (flag) { return num6 / (double)num7; } return _nullValue; } case AggregateType.Var: case AggregateType.StDev: { int num = 0; double num2 = 0.0; double num3 = 0.0; double num4 = 0.0; int[] array = records; foreach (int num5 in array) { if (!IsNull(num5)) { num3 += _values[num5]; num4 += _values[num5] * _values[num5]; num++; } } if (num > 1) { num2 = (double)num * num4 - num3 * num3; num2 = ((!(num2 / (num3 * num3) < 1E-15) && !(num2 < 0.0)) ? (num2 / (double)(num * (num - 1))) : 0.0); if (kind == AggregateType.StDev) { return Math.Sqrt(num2); } return num2; } return _nullValue; } case AggregateType.Min: { double num11 = double.MaxValue; foreach (int num12 in records) { if (!IsNull(num12)) { num11 = Math.Min(_values[num12], num11); flag = true; } } if (flag) { return num11; } return _nullValue; } case AggregateType.Max: { double num9 = double.MinValue; foreach (int num10 in records) { if (!IsNull(num10)) { num9 = Math.Max(_values[num10], num9); flag = true; } } if (flag) { return num9; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: return base.Aggregate(records, kind); } } catch (OverflowException) { throw ExprException.Overflow(typeof(double)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { double num = _values[recordNo1]; double num2 = _values[recordNo2]; if (num == 0.0 || num2 == 0.0) { int num3 = CompareBits(recordNo1, recordNo2); if (num3 != 0) { return num3; } } return num.CompareTo(num2); } public override int CompareValueTo(int recordNo, object value) { if (_nullValue == value) { if (IsNull(recordNo)) { return 0; } return 1; } double num = _values[recordNo]; if (0.0 == num && IsNull(recordNo)) { return -1; } return num.CompareTo((double)value); } public override object ConvertValue(object value) { if (_nullValue != value) { value = ((value == null) ? _nullValue : ((object)((IConvertible)value).ToDouble(base.FormatProvider))); } return value; } public override void Copy(int recordNo1, int recordNo2) { CopyBits(recordNo1, recordNo2); _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { double num = _values[record]; if (num != 0.0) { return num; } return GetBits(record); } public override void Set(int record, object value) { if (_nullValue == value) { _values[record] = 0.0; SetNullBit(record, flag: true); } else { _values[record] = ((IConvertible)value).ToDouble(base.FormatProvider); SetNullBit(record, flag: false); } } public override void SetCapacity(int capacity) { double[] array = new double[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; base.SetCapacity(capacity); } public override object ConvertXmlToObject(string s) { return XmlConvert.ToDouble(s); } public override string ConvertObjectToXml(object value) { return XmlConvert.ToString((double)value); } protected override object GetEmptyStorage(int recordCount) { return new double[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((double[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (double[])store; SetNullStorage(nullbits); } } public enum GroupByBehavior { Unknown, NotSupported, Unrelated, MustContainAll, ExactMatch } public interface IDbColumnSchemaGenerator { ReadOnlyCollection GetColumnSchema(); } internal sealed class Int16Storage : DataStorage { private const short defaultValue = 0; private short[] _values; internal Int16Storage(DataColumn column) : base(column, typeof(short), (short)0, StorageType.Int16) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Sum: { long num4 = 0L; int[] array = records; foreach (int num5 in array) { if (HasValue(num5)) { num4 = checked(num4 + _values[num5]); flag = true; } } if (flag) { return num4; } return _nullValue; } case AggregateType.Mean: { long num10 = 0L; int num11 = 0; int[] array = records; foreach (int num12 in array) { if (HasValue(num12)) { num10 = checked(num10 + _values[num12]); num11++; flag = true; } } checked { if (flag) { return (short)unchecked(num10 / num11); } return _nullValue; } } case AggregateType.Var: case AggregateType.StDev: { int num = 0; double num6 = 0.0; double num7 = 0.0; double num8 = 0.0; int[] array = records; foreach (int num9 in array) { if (HasValue(num9)) { num7 += (double)_values[num9]; num8 += (double)_values[num9] * (double)_values[num9]; num++; } } if (num > 1) { num6 = (double)num * num8 - num7 * num7; num6 = ((!(num6 / (num7 * num7) < 1E-15) && !(num6 < 0.0)) ? (num6 / (double)(num * (num - 1))) : 0.0); if (kind == AggregateType.StDev) { return Math.Sqrt(num6); } return num6; } return _nullValue; } case AggregateType.Min: { short num2 = short.MaxValue; foreach (int num3 in records) { if (HasValue(num3)) { num2 = Math.Min(_values[num3], num2); flag = true; } } if (flag) { return num2; } return _nullValue; } case AggregateType.Max: { short num13 = short.MinValue; foreach (int num14 in records) { if (HasValue(num14)) { num13 = Math.Max(_values[num14], num13); flag = true; } } if (flag) { return num13; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: { int num = 0; for (int i = 0; i < records.Length; i++) { if (HasValue(records[i])) { num++; } } return num; } } } catch (OverflowException) { throw ExprException.Overflow(typeof(short)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { short num = _values[recordNo1]; short num2 = _values[recordNo2]; if (num == 0 || num2 == 0) { int num3 = CompareBits(recordNo1, recordNo2); if (num3 != 0) { return num3; } } return num - num2; } public override int CompareValueTo(int recordNo, object value) { if (_nullValue == value) { if (!HasValue(recordNo)) { return 0; } return 1; } short num = _values[recordNo]; if (num == 0 && !HasValue(recordNo)) { return -1; } return num.CompareTo((short)value); } public override object ConvertValue(object value) { if (_nullValue != value) { value = ((value == null) ? _nullValue : ((object)((IConvertible)value).ToInt16(base.FormatProvider))); } return value; } public override void Copy(int recordNo1, int recordNo2) { CopyBits(recordNo1, recordNo2); _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { short num = _values[record]; if (num != 0) { return num; } return GetBits(record); } public override void Set(int record, object value) { if (_nullValue == value) { _values[record] = 0; SetNullBit(record, flag: true); } else { _values[record] = ((IConvertible)value).ToInt16(base.FormatProvider); SetNullBit(record, flag: false); } } public override void SetCapacity(int capacity) { short[] array = new short[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; base.SetCapacity(capacity); } public override object ConvertXmlToObject(string s) { return XmlConvert.ToInt16(s); } public override string ConvertObjectToXml(object value) { return XmlConvert.ToString((short)value); } protected override object GetEmptyStorage(int recordCount) { return new short[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((short[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, !HasValue(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (short[])store; SetNullStorage(nullbits); } } internal sealed class Int32Storage : DataStorage { private const int defaultValue = 0; private int[] _values; internal Int32Storage(DataColumn column) : base(column, typeof(int), 0, StorageType.Int32) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Sum: { long num4 = 0L; int[] array = records; foreach (int num5 in array) { if (HasValue(num5)) { num4 = checked(num4 + _values[num5]); flag = true; } } if (flag) { return num4; } return _nullValue; } case AggregateType.Mean: { long num10 = 0L; int num11 = 0; int[] array = records; foreach (int num12 in array) { if (HasValue(num12)) { num10 = checked(num10 + _values[num12]); num11++; flag = true; } } checked { if (flag) { return (int)unchecked(num10 / num11); } return _nullValue; } } case AggregateType.Var: case AggregateType.StDev: { int num = 0; double num6 = 0.0; double num7 = 0.0; double num8 = 0.0; int[] array = records; foreach (int num9 in array) { if (HasValue(num9)) { num7 += (double)_values[num9]; num8 += (double)_values[num9] * (double)_values[num9]; num++; } } if (num > 1) { num6 = (double)num * num8 - num7 * num7; num6 = ((!(num6 / (num7 * num7) < 1E-15) && !(num6 < 0.0)) ? (num6 / (double)(num * (num - 1))) : 0.0); if (kind == AggregateType.StDev) { return Math.Sqrt(num6); } return num6; } return _nullValue; } case AggregateType.Min: { int num2 = int.MaxValue; foreach (int num3 in records) { if (HasValue(num3)) { num2 = Math.Min(_values[num3], num2); flag = true; } } if (flag) { return num2; } return _nullValue; } case AggregateType.Max: { int num13 = int.MinValue; foreach (int num14 in records) { if (HasValue(num14)) { num13 = Math.Max(_values[num14], num13); flag = true; } } if (flag) { return num13; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: { int num = 0; for (int i = 0; i < records.Length; i++) { if (HasValue(records[i])) { num++; } } return num; } } } catch (OverflowException) { throw ExprException.Overflow(typeof(int)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { int num = _values[recordNo1]; int num2 = _values[recordNo2]; if (num == 0 || num2 == 0) { int num3 = CompareBits(recordNo1, recordNo2); if (num3 != 0) { return num3; } } if (num >= num2) { if (num <= num2) { return 0; } return 1; } return -1; } public override int CompareValueTo(int recordNo, object value) { if (_nullValue == value) { if (!HasValue(recordNo)) { return 0; } return 1; } int num = _values[recordNo]; if (num == 0 && !HasValue(recordNo)) { return -1; } return num.CompareTo((int)value); } public override object ConvertValue(object value) { if (_nullValue != value) { value = ((value == null) ? _nullValue : ((object)((IConvertible)value).ToInt32(base.FormatProvider))); } return value; } public override void Copy(int recordNo1, int recordNo2) { CopyBits(recordNo1, recordNo2); _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { int num = _values[record]; if (num != 0) { return num; } return GetBits(record); } public override void Set(int record, object value) { if (_nullValue == value) { _values[record] = 0; SetNullBit(record, flag: true); } else { _values[record] = ((IConvertible)value).ToInt32(base.FormatProvider); SetNullBit(record, flag: false); } } public override void SetCapacity(int capacity) { int[] array = new int[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; base.SetCapacity(capacity); } public override object ConvertXmlToObject(string s) { return XmlConvert.ToInt32(s); } public override string ConvertObjectToXml(object value) { return XmlConvert.ToString((int)value); } protected override object GetEmptyStorage(int recordCount) { return new int[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((int[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, !HasValue(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (int[])store; SetNullStorage(nullbits); } } internal sealed class Int64Storage : DataStorage { private const long defaultValue = 0L; private long[] _values; internal Int64Storage(DataColumn column) : base(column, typeof(long), 0L, StorageType.Int64) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Sum: { long num13 = 0L; int[] array = records; foreach (int num14 in array) { if (HasValue(num14)) { num13 = checked(num13 + _values[num14]); flag = true; } } if (flag) { return num13; } return _nullValue; } case AggregateType.Mean: { decimal num6 = default(decimal); int num7 = 0; int[] array = records; foreach (int num8 in array) { if (HasValue(num8)) { num6 += (decimal)_values[num8]; num7++; flag = true; } } if (flag) { return (long)(num6 / (decimal)num7); } return _nullValue; } case AggregateType.Var: case AggregateType.StDev: { int num = 0; double num2 = 0.0; double num3 = 0.0; double num4 = 0.0; int[] array = records; foreach (int num5 in array) { if (HasValue(num5)) { num3 += (double)_values[num5]; num4 += (double)_values[num5] * (double)_values[num5]; num++; } } if (num > 1) { num2 = (double)num * num4 - num3 * num3; num2 = ((!(num2 / (num3 * num3) < 1E-15) && !(num2 < 0.0)) ? (num2 / (double)(num * (num - 1))) : 0.0); if (kind == AggregateType.StDev) { return Math.Sqrt(num2); } return num2; } return _nullValue; } case AggregateType.Min: { long num11 = long.MaxValue; foreach (int num12 in records) { if (HasValue(num12)) { num11 = Math.Min(_values[num12], num11); flag = true; } } if (flag) { return num11; } return _nullValue; } case AggregateType.Max: { long num9 = long.MinValue; foreach (int num10 in records) { if (HasValue(num10)) { num9 = Math.Max(_values[num10], num9); flag = true; } } if (flag) { return num9; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: return base.Aggregate(records, kind); } } catch (OverflowException) { throw ExprException.Overflow(typeof(long)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { long num = _values[recordNo1]; long num2 = _values[recordNo2]; if (num == 0L || num2 == 0L) { int num3 = CompareBits(recordNo1, recordNo2); if (num3 != 0) { return num3; } } if (num >= num2) { if (num <= num2) { return 0; } return 1; } return -1; } public override int CompareValueTo(int recordNo, object value) { if (_nullValue == value) { if (!HasValue(recordNo)) { return 0; } return 1; } long num = _values[recordNo]; if (num == 0L && !HasValue(recordNo)) { return -1; } return num.CompareTo((long)value); } public override object ConvertValue(object value) { if (_nullValue != value) { value = ((value == null) ? _nullValue : ((object)((IConvertible)value).ToInt64(base.FormatProvider))); } return value; } public override void Copy(int recordNo1, int recordNo2) { CopyBits(recordNo1, recordNo2); _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { long num = _values[record]; if (num != 0L) { return num; } return GetBits(record); } public override void Set(int record, object value) { if (_nullValue == value) { _values[record] = 0L; SetNullBit(record, flag: true); } else { _values[record] = ((IConvertible)value).ToInt64(base.FormatProvider); SetNullBit(record, flag: false); } } public override void SetCapacity(int capacity) { long[] array = new long[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; base.SetCapacity(capacity); } public override object ConvertXmlToObject(string s) { return XmlConvert.ToInt64(s); } public override string ConvertObjectToXml(object value) { return XmlConvert.ToString((long)value); } protected override object GetEmptyStorage(int recordCount) { return new long[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((long[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, !HasValue(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (long[])store; SetNullStorage(nullbits); } } internal sealed class ObjectStorage : DataStorage { private enum Families { DATETIME, NUMBER, STRING, BOOLEAN, ARRAY } private class TempAssemblyComparer : IEqualityComparer> { internal static readonly IEqualityComparer> s_default = new TempAssemblyComparer(); private TempAssemblyComparer() { } public bool Equals(KeyValuePair x, KeyValuePair y) { if (x.Key == y.Key) { if (x.Value != null || y.Value != null) { if (x.Value != null && y.Value != null && x.Value.ElementName == y.Value.ElementName && x.Value.Namespace == y.Value.Namespace && x.Value.DataType == y.Value.DataType) { return x.Value.IsNullable == y.Value.IsNullable; } return false; } return true; } return false; } public int GetHashCode(KeyValuePair obj) { return obj.Key.GetHashCode() + obj.Value.ElementName.GetHashCode(); } } private static readonly object s_defaultValue = null; private object[] _values; private readonly bool _implementsIXmlSerializable; private static readonly object s_tempAssemblyCacheLock = new object(); private static Dictionary, XmlSerializer> s_tempAssemblyCache; private static readonly XmlSerializerFactory s_serializerFactory = new XmlSerializerFactory(); internal ObjectStorage(DataColumn column, Type type) : base(column, type, s_defaultValue, DBNull.Value, typeof(ICloneable).IsAssignableFrom(type), DataStorage.GetStorageType(type)) { _implementsIXmlSerializable = typeof(IXmlSerializable).IsAssignableFrom(type); } public override object Aggregate(int[] records, AggregateType kind) { throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { object obj = _values[recordNo1]; object obj2 = _values[recordNo2]; if (obj == obj2) { return 0; } if (obj == null) { return -1; } if (obj2 == null) { return 1; } if (obj is IComparable comparable) { try { return comparable.CompareTo(obj2); } catch (ArgumentException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); } } return CompareWithFamilies(obj, obj2); } public override int CompareValueTo(int recordNo1, object value) { object obj = Get(recordNo1); if (obj is IComparable && value.GetType() == obj.GetType()) { return ((IComparable)obj).CompareTo(value); } if (obj == value) { return 0; } if (obj == null) { if (_nullValue == value) { return 0; } return -1; } if (_nullValue == value || value == null) { return 1; } return CompareWithFamilies(obj, value); } private int CompareTo(object valueNo1, object valueNo2) { if (valueNo1 == null) { return -1; } if (valueNo2 == null) { return 1; } if (valueNo1 == valueNo2) { return 0; } if (valueNo1 == _nullValue) { return -1; } if (valueNo2 == _nullValue) { return 1; } if (valueNo1 is IComparable) { try { return ((IComparable)valueNo1).CompareTo(valueNo2); } catch (ArgumentException e) { ExceptionBuilder.TraceExceptionWithoutRethrow(e); } } return CompareWithFamilies(valueNo1, valueNo2); } private int CompareWithFamilies(object valueNo1, object valueNo2) { Families family = GetFamily(valueNo1.GetType()); Families family2 = GetFamily(valueNo2.GetType()); if (family < family2) { return -1; } if (family > family2) { return 1; } switch (family) { case Families.BOOLEAN: valueNo1 = Convert.ToBoolean(valueNo1, base.FormatProvider); valueNo2 = Convert.ToBoolean(valueNo2, base.FormatProvider); break; case Families.DATETIME: valueNo1 = Convert.ToDateTime(valueNo1, base.FormatProvider); valueNo2 = Convert.ToDateTime(valueNo1, base.FormatProvider); break; case Families.NUMBER: valueNo1 = Convert.ToDouble(valueNo1, base.FormatProvider); valueNo2 = Convert.ToDouble(valueNo2, base.FormatProvider); break; case Families.ARRAY: { Array array = (Array)valueNo1; Array array2 = (Array)valueNo2; if (array.Length > array2.Length) { return 1; } if (array.Length < array2.Length) { return -1; } for (int i = 0; i < array.Length; i++) { int num = CompareTo(array.GetValue(i), array2.GetValue(i)); if (num != 0) { return num; } } return 0; } default: valueNo1 = valueNo1.ToString(); valueNo2 = valueNo2.ToString(); break; } return ((IComparable)valueNo1).CompareTo(valueNo2); } public override void Copy(int recordNo1, int recordNo2) { _values[recordNo2] = _values[recordNo1]; } public override object Get(int recordNo) { object obj = _values[recordNo]; if (obj != null) { return obj; } return _nullValue; } private Families GetFamily(Type dataType) { switch (Type.GetTypeCode(dataType)) { case TypeCode.Boolean: return Families.BOOLEAN; case TypeCode.Char: return Families.STRING; case TypeCode.SByte: return Families.STRING; case TypeCode.Byte: return Families.STRING; case TypeCode.Int16: return Families.NUMBER; case TypeCode.UInt16: return Families.NUMBER; case TypeCode.Int32: return Families.NUMBER; case TypeCode.UInt32: return Families.NUMBER; case TypeCode.Int64: return Families.NUMBER; case TypeCode.UInt64: return Families.NUMBER; case TypeCode.Single: return Families.NUMBER; case TypeCode.Double: return Families.NUMBER; case TypeCode.Decimal: return Families.NUMBER; case TypeCode.DateTime: return Families.DATETIME; case TypeCode.String: return Families.STRING; default: if (typeof(TimeSpan) == dataType) { return Families.DATETIME; } if (dataType.IsArray) { return Families.ARRAY; } return Families.STRING; } } public override bool IsNull(int record) { return _values[record] == null; } public override void Set(int recordNo, object value) { if (_nullValue == value) { _values[recordNo] = null; return; } if (_dataType == typeof(object) || _dataType.IsInstanceOfType(value)) { _values[recordNo] = value; return; } Type type = value.GetType(); if (_dataType == typeof(Guid) && type == typeof(string)) { _values[recordNo] = new Guid((string)value); return; } if (_dataType == typeof(byte[])) { if (type == typeof(bool)) { _values[recordNo] = BitConverter.GetBytes((bool)value); return; } if (type == typeof(char)) { _values[recordNo] = BitConverter.GetBytes((char)value); return; } if (type == typeof(short)) { _values[recordNo] = BitConverter.GetBytes((short)value); return; } if (type == typeof(int)) { _values[recordNo] = BitConverter.GetBytes((int)value); return; } if (type == typeof(long)) { _values[recordNo] = BitConverter.GetBytes((long)value); return; } if (type == typeof(ushort)) { _values[recordNo] = BitConverter.GetBytes((ushort)value); return; } if (type == typeof(uint)) { _values[recordNo] = BitConverter.GetBytes((uint)value); return; } if (type == typeof(ulong)) { _values[recordNo] = BitConverter.GetBytes((ulong)value); return; } if (type == typeof(float)) { _values[recordNo] = BitConverter.GetBytes((float)value); return; } if (type == typeof(double)) { _values[recordNo] = BitConverter.GetBytes((double)value); return; } throw ExceptionBuilder.StorageSetFailed(); } throw ExceptionBuilder.StorageSetFailed(); } public override void SetCapacity(int capacity) { object[] array = new object[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; } [MethodImpl(MethodImplOptions.NoInlining)] public override object ConvertXmlToObject(string s) { Type dataType = _dataType; if (dataType == typeof(byte[])) { return Convert.FromBase64String(s); } if (dataType == typeof(Type)) { return Type.GetType(s); } if (dataType == typeof(Guid)) { return new Guid(s); } if (dataType == typeof(Uri)) { return new Uri(s); } if (_implementsIXmlSerializable) { object obj = Activator.CreateInstance(_dataType, nonPublic: true); using XmlTextReader reader = new XmlTextReader(new StringReader(s)); ((IXmlSerializable)obj).ReadXml(reader); return obj; } StringReader textReader = new StringReader(s); return GetXmlSerializer(dataType).Deserialize(textReader); } [MethodImpl(MethodImplOptions.NoInlining)] public override object ConvertXmlToObject(XmlReader xmlReader, XmlRootAttribute xmlAttrib) { object obj = null; bool flag = false; bool flag2 = false; if (xmlAttrib == null) { Type type = null; string attribute = xmlReader.GetAttribute("InstanceType", "urn:schemas-microsoft-com:xml-msdata"); if (attribute == null || attribute.Length == 0) { string text = xmlReader.GetAttribute("type", "http://www.w3.org/2001/XMLSchema-instance"); if (text != null && text.Length > 0) { string[] array = text.Split(new char[1] { ':' }); if (array.Length == 2 && xmlReader.LookupNamespace(array[0]) == "http://www.w3.org/2001/XMLSchema") { text = array[1]; } type = XSDSchema.XsdtoClr(text); flag = true; } else if (_dataType == typeof(object)) { flag2 = true; } } if (flag2) { obj = xmlReader.ReadString(); } else if (attribute == "Type") { obj = Type.GetType(xmlReader.ReadString()); xmlReader.Read(); } else { if (null == type) { type = ((attribute == null) ? _dataType : DataStorage.GetType(attribute)); } if (type == typeof(char) || type == typeof(Guid)) { flag = true; } if (type == typeof(object)) { throw ExceptionBuilder.CanNotDeserializeObjectType(); } if (!flag) { obj = Activator.CreateInstance(type, nonPublic: true); ((IXmlSerializable)obj).ReadXml(xmlReader); } else { if (type == typeof(string) && xmlReader.NodeType == XmlNodeType.Element && xmlReader.IsEmptyElement) { obj = string.Empty; } else { obj = xmlReader.ReadString(); obj = ((!(type != typeof(byte[]))) ? Convert.FromBase64String(obj.ToString()) : SqlConvert.ChangeTypeForXML(obj, type)); } xmlReader.Read(); } } } else { obj = GetXmlSerializer(_dataType, xmlAttrib).Deserialize(xmlReader); } return obj; } public override string ConvertObjectToXml(object value) { if (value == null || value == _nullValue) { return string.Empty; } Type dataType = _dataType; if (dataType == typeof(byte[]) || (dataType == typeof(object) && value is byte[])) { return Convert.ToBase64String((byte[])value); } if (dataType == typeof(Type) || (dataType == typeof(object) && value is Type)) { return ((Type)value).AssemblyQualifiedName; } if (!DataStorage.IsTypeCustomType(value.GetType())) { return (string)SqlConvert.ChangeTypeForXML(value, typeof(string)); } if (Type.GetTypeCode(value.GetType()) != TypeCode.Object) { return value.ToString(); } StringWriter stringWriter = new StringWriter(base.FormatProvider); if (_implementsIXmlSerializable) { using (XmlTextWriter writer = new XmlTextWriter(stringWriter)) { ((IXmlSerializable)value).WriteXml(writer); } return stringWriter.ToString(); } GetXmlSerializer(value.GetType()).Serialize(stringWriter, value); return stringWriter.ToString(); } public override void ConvertObjectToXml(object value, XmlWriter xmlWriter, XmlRootAttribute xmlAttrib) { if (xmlAttrib == null) { ((IXmlSerializable)value).WriteXml(xmlWriter); } else { GetXmlSerializer(value.GetType(), xmlAttrib).Serialize(xmlWriter, value); } } protected override object GetEmptyStorage(int recordCount) { return new object[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { object[] array = (object[])store; array[storeIndex] = _values[record]; bool flag = IsNull(record); nullbits.Set(storeIndex, flag); if (!flag && array[storeIndex] is DateTime) { DateTime dateTime = (DateTime)array[storeIndex]; if (dateTime.Kind == DateTimeKind.Local) { array[storeIndex] = DateTime.SpecifyKind(dateTime.ToUniversalTime(), DateTimeKind.Local); } } } protected override void SetStorage(object store, BitArray nullbits) { _values = (object[])store; for (int i = 0; i < _values.Length; i++) { if (_values[i] is DateTime) { DateTime value = (DateTime)_values[i]; if (value.Kind == DateTimeKind.Local) { _values[i] = DateTime.SpecifyKind(value, DateTimeKind.Utc).ToLocalTime(); } } } } internal static void VerifyIDynamicMetaObjectProvider(Type type) { if (typeof(IDynamicMetaObjectProvider).IsAssignableFrom(type) && !typeof(IXmlSerializable).IsAssignableFrom(type)) { throw ADP.InvalidOperation("DataSet will not serialize types that implement IDynamicMetaObjectProvider but do not also implement IXmlSerializable."); } } internal static XmlSerializer GetXmlSerializer(Type type) { VerifyIDynamicMetaObjectProvider(type); return s_serializerFactory.CreateSerializer(type); } internal static XmlSerializer GetXmlSerializer(Type type, XmlRootAttribute attribute) { XmlSerializer value = null; KeyValuePair key = new KeyValuePair(type, attribute); Dictionary, XmlSerializer> dictionary = s_tempAssemblyCache; if (dictionary == null || !dictionary.TryGetValue(key, out value)) { lock (s_tempAssemblyCacheLock) { dictionary = s_tempAssemblyCache; if (dictionary == null || !dictionary.TryGetValue(key, out value)) { VerifyIDynamicMetaObjectProvider(type); if (dictionary != null) { Dictionary, XmlSerializer> dictionary2 = new Dictionary, XmlSerializer>(1 + dictionary.Count, TempAssemblyComparer.s_default); foreach (KeyValuePair, XmlSerializer> item in dictionary) { dictionary2.Add(item.Key, item.Value); } dictionary = dictionary2; } else { dictionary = new Dictionary, XmlSerializer>(TempAssemblyComparer.s_default); } key = new KeyValuePair(type, new XmlRootAttribute()); key.Value.ElementName = attribute.ElementName; key.Value.Namespace = attribute.Namespace; key.Value.DataType = attribute.DataType; key.Value.IsNullable = attribute.IsNullable; value = s_serializerFactory.CreateSerializer(type, attribute); dictionary.Add(key, value); s_tempAssemblyCache = dictionary; } } } return value; } } public class RowUpdatedEventArgs : EventArgs { private IDbCommand _command; private StatementType _statementType; private DataTableMapping _tableMapping; private Exception _errors; private DataRow _dataRow; private DataRow[] _dataRows; private UpdateStatus _status; private int _recordsAffected; public IDbCommand Command => _command; public Exception Errors { get { return _errors; } set { _errors = value; } } public int RecordsAffected => _recordsAffected; public DataRow Row => _dataRow; internal DataRow[] Rows => _dataRows; public int RowCount { get { DataRow[] dataRows = _dataRows; if (dataRows == null) { if (_dataRow == null) { return 0; } return 1; } return dataRows.Length; } } public StatementType StatementType => _statementType; public UpdateStatus Status { get { return _status; } set { if ((uint)value <= 3u) { _status = value; return; } throw ADP.InvalidUpdateStatus(value); } } public DataTableMapping TableMapping => _tableMapping; public RowUpdatedEventArgs(DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) { if ((uint)statementType > 4u) { throw ADP.InvalidStatementType(statementType); } _dataRow = dataRow; _command = command; _statementType = statementType; _tableMapping = tableMapping; } internal void AdapterInit(DataRow[] dataRows) { _statementType = StatementType.Batch; _dataRows = dataRows; if (dataRows != null && 1 == dataRows.Length) { _dataRow = dataRows[0]; } } internal void AdapterInit(int recordsAffected) { _recordsAffected = recordsAffected; } public void CopyToRows(DataRow[] array) { CopyToRows(array, 0); } public void CopyToRows(DataRow[] array, int arrayIndex) { DataRow[] dataRows = _dataRows; if (dataRows != null) { dataRows.CopyTo(array, arrayIndex); return; } if (array == null) { throw ADP.ArgumentNull("array"); } array[arrayIndex] = Row; } } public class RowUpdatingEventArgs : EventArgs { private IDbCommand _command; private StatementType _statementType; private DataTableMapping _tableMapping; private Exception _errors; private DataRow _dataRow; private UpdateStatus _status; protected virtual IDbCommand BaseCommand { get { return _command; } set { _command = value; } } public IDbCommand Command { get { return BaseCommand; } set { BaseCommand = value; } } public Exception Errors { get { return _errors; } set { _errors = value; } } public DataRow Row => _dataRow; public StatementType StatementType => _statementType; public UpdateStatus Status { get { return _status; } set { if ((uint)value <= 3u) { _status = value; return; } throw ADP.InvalidUpdateStatus(value); } } public DataTableMapping TableMapping => _tableMapping; public RowUpdatingEventArgs(DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) { ADP.CheckArgumentNull(dataRow, "dataRow"); ADP.CheckArgumentNull(tableMapping, "tableMapping"); switch (statementType) { case StatementType.Batch: throw ADP.NotSupportedStatementType(statementType, "RowUpdatingEventArgs"); default: throw ADP.InvalidStatementType(statementType); case StatementType.Select: case StatementType.Insert: case StatementType.Update: case StatementType.Delete: _dataRow = dataRow; _command = command; _statementType = statementType; _tableMapping = tableMapping; break; } } } internal sealed class SByteStorage : DataStorage { private const sbyte defaultValue = 0; private sbyte[] _values; public SByteStorage(DataColumn column) : base(column, typeof(sbyte), (sbyte)0, StorageType.SByte) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Sum: { long num11 = 0L; int[] array = records; foreach (int num12 in array) { if (!IsNull(num12)) { num11 = checked(num11 + _values[num12]); flag = true; } } if (flag) { return num11; } return _nullValue; } case AggregateType.Mean: { long num6 = 0L; int num7 = 0; int[] array = records; foreach (int num8 in array) { if (!IsNull(num8)) { num6 = checked(num6 + _values[num8]); num7++; flag = true; } } checked { if (flag) { return (sbyte)unchecked(num6 / num7); } return _nullValue; } } case AggregateType.Var: case AggregateType.StDev: { int num = 0; double num2 = 0.0; double num3 = 0.0; double num4 = 0.0; int[] array = records; foreach (int num5 in array) { if (!IsNull(num5)) { num3 += (double)_values[num5]; num4 += (double)_values[num5] * (double)_values[num5]; num++; } } if (num > 1) { num2 = (double)num * num4 - num3 * num3; num2 = ((!(num2 / (num3 * num3) < 1E-15) && !(num2 < 0.0)) ? (num2 / (double)(num * (num - 1))) : 0.0); if (kind == AggregateType.StDev) { return Math.Sqrt(num2); } return num2; } return _nullValue; } case AggregateType.Min: { sbyte b2 = sbyte.MaxValue; foreach (int num10 in records) { if (!IsNull(num10)) { b2 = Math.Min(_values[num10], b2); flag = true; } } if (flag) { return b2; } return _nullValue; } case AggregateType.Max: { sbyte b = sbyte.MinValue; foreach (int num9 in records) { if (!IsNull(num9)) { b = Math.Max(_values[num9], b); flag = true; } } if (flag) { return b; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: return base.Aggregate(records, kind); } } catch (OverflowException) { throw ExprException.Overflow(typeof(sbyte)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { sbyte b = _values[recordNo1]; sbyte value = _values[recordNo2]; if (b.Equals(0) || value.Equals(0)) { int num = CompareBits(recordNo1, recordNo2); if (num != 0) { return num; } } return b.CompareTo(value); } public override int CompareValueTo(int recordNo, object value) { if (_nullValue == value) { if (IsNull(recordNo)) { return 0; } return 1; } sbyte b = _values[recordNo]; if (b == 0 && IsNull(recordNo)) { return -1; } return b.CompareTo((sbyte)value); } public override object ConvertValue(object value) { if (_nullValue != value) { value = ((value == null) ? _nullValue : ((object)((IConvertible)value).ToSByte(base.FormatProvider))); } return value; } public override void Copy(int recordNo1, int recordNo2) { CopyBits(recordNo1, recordNo2); _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { sbyte b = _values[record]; if (!b.Equals(0)) { return b; } return GetBits(record); } public override void Set(int record, object value) { if (_nullValue == value) { _values[record] = 0; SetNullBit(record, flag: true); } else { _values[record] = ((IConvertible)value).ToSByte(base.FormatProvider); SetNullBit(record, flag: false); } } public override void SetCapacity(int capacity) { sbyte[] array = new sbyte[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; base.SetCapacity(capacity); } public override object ConvertXmlToObject(string s) { return XmlConvert.ToSByte(s); } public override string ConvertObjectToXml(object value) { return XmlConvert.ToString((sbyte)value); } protected override object GetEmptyStorage(int recordCount) { return new sbyte[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((sbyte[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (sbyte[])store; SetNullStorage(nullbits); } } internal static class SqlConvert { public static SqlByte ConvertToSqlByte(object value) { if (value == DBNull.Value) { return SqlByte.Null; } Type type = value.GetType(); return DataStorage.GetStorageType(type) switch { StorageType.SqlByte => (SqlByte)value, StorageType.Byte => (byte)value, _ => throw ExceptionBuilder.ConvertFailed(type, typeof(SqlByte)), }; } public static SqlInt16 ConvertToSqlInt16(object value) { if (value == DBNull.Value) { return SqlInt16.Null; } Type type = value.GetType(); return DataStorage.GetStorageType(type) switch { StorageType.Byte => (byte)value, StorageType.Int16 => (short)value, StorageType.SqlByte => (SqlByte)value, StorageType.SqlInt16 => (SqlInt16)value, _ => throw ExceptionBuilder.ConvertFailed(type, typeof(SqlInt16)), }; } public static SqlInt32 ConvertToSqlInt32(object value) { if (value == DBNull.Value) { return SqlInt32.Null; } Type type = value.GetType(); return DataStorage.GetStorageType(type) switch { StorageType.SqlInt32 => (SqlInt32)value, StorageType.Int32 => (int)value, StorageType.SqlInt16 => (SqlInt16)value, StorageType.Int16 => (short)value, StorageType.UInt16 => (ushort)value, StorageType.SqlByte => (SqlByte)value, StorageType.Byte => (byte)value, _ => throw ExceptionBuilder.ConvertFailed(type, typeof(SqlInt32)), }; } public static SqlInt64 ConvertToSqlInt64(object value) { if (value == DBNull.Value) { return SqlInt32.Null; } Type type = value.GetType(); return DataStorage.GetStorageType(type) switch { StorageType.SqlInt64 => (SqlInt64)value, StorageType.Int64 => (long)value, StorageType.SqlInt16 => (SqlInt16)value, StorageType.Int16 => (short)value, StorageType.UInt16 => (ushort)value, StorageType.SqlInt32 => (SqlInt32)value, StorageType.Int32 => (int)value, StorageType.UInt32 => (uint)value, StorageType.SqlByte => (SqlByte)value, StorageType.Byte => (byte)value, _ => throw ExceptionBuilder.ConvertFailed(type, typeof(SqlInt64)), }; } public static SqlDouble ConvertToSqlDouble(object value) { if (value == DBNull.Value) { return SqlDouble.Null; } Type type = value.GetType(); return DataStorage.GetStorageType(type) switch { StorageType.SqlDouble => (SqlDouble)value, StorageType.Double => (double)value, StorageType.SqlInt64 => (SqlInt64)value, StorageType.Int64 => (long)value, StorageType.UInt64 => (ulong)value, StorageType.SqlInt16 => (SqlInt16)value, StorageType.Int16 => (short)value, StorageType.UInt16 => (int)(ushort)value, StorageType.SqlInt32 => (SqlInt32)value, StorageType.Int32 => (int)value, StorageType.UInt32 => (uint)value, StorageType.SqlByte => (SqlByte)value, StorageType.Byte => (int)(byte)value, StorageType.SqlSingle => (SqlSingle)value, StorageType.Single => (float)value, StorageType.SqlMoney => (SqlMoney)value, StorageType.SqlDecimal => (SqlDecimal)value, _ => throw ExceptionBuilder.ConvertFailed(type, typeof(SqlDouble)), }; } public static SqlDecimal ConvertToSqlDecimal(object value) { if (value == DBNull.Value) { return SqlDecimal.Null; } Type type = value.GetType(); return DataStorage.GetStorageType(type) switch { StorageType.SqlDecimal => (SqlDecimal)value, StorageType.Decimal => (decimal)value, StorageType.SqlInt64 => (SqlInt64)value, StorageType.Int64 => (long)value, StorageType.UInt64 => (ulong)value, StorageType.SqlInt16 => (SqlInt16)value, StorageType.Int16 => (short)value, StorageType.UInt16 => (ushort)value, StorageType.SqlInt32 => (SqlInt32)value, StorageType.Int32 => (int)value, StorageType.UInt32 => (uint)value, StorageType.SqlByte => (SqlByte)value, StorageType.Byte => (byte)value, StorageType.SqlMoney => (SqlMoney)value, _ => throw ExceptionBuilder.ConvertFailed(type, typeof(SqlDecimal)), }; } public static SqlSingle ConvertToSqlSingle(object value) { if (value == DBNull.Value) { return SqlSingle.Null; } Type type = value.GetType(); return DataStorage.GetStorageType(type) switch { StorageType.SqlSingle => (SqlSingle)value, StorageType.Single => (float)value, StorageType.SqlInt64 => (SqlInt64)value, StorageType.Int64 => (long)value, StorageType.UInt64 => (ulong)value, StorageType.SqlInt16 => (SqlInt16)value, StorageType.Int16 => (short)value, StorageType.UInt16 => (int)(ushort)value, StorageType.SqlInt32 => (SqlInt32)value, StorageType.Int32 => (int)value, StorageType.UInt32 => (uint)value, StorageType.SqlByte => (SqlByte)value, StorageType.Byte => (int)(byte)value, StorageType.SqlMoney => (SqlMoney)value, StorageType.SqlDecimal => (SqlDecimal)value, _ => throw ExceptionBuilder.ConvertFailed(type, typeof(SqlSingle)), }; } public static SqlMoney ConvertToSqlMoney(object value) { if (value == DBNull.Value) { return SqlMoney.Null; } Type type = value.GetType(); return DataStorage.GetStorageType(type) switch { StorageType.SqlMoney => (SqlMoney)value, StorageType.Decimal => (decimal)value, StorageType.SqlInt64 => (SqlInt64)value, StorageType.Int64 => (long)value, StorageType.UInt64 => (ulong)value, StorageType.SqlInt16 => (SqlInt16)value, StorageType.Int16 => (short)value, StorageType.UInt16 => (ushort)value, StorageType.SqlInt32 => (SqlInt32)value, StorageType.Int32 => (int)value, StorageType.UInt32 => (uint)value, StorageType.SqlByte => (SqlByte)value, StorageType.Byte => (byte)value, _ => throw ExceptionBuilder.ConvertFailed(type, typeof(SqlMoney)), }; } public static SqlDateTime ConvertToSqlDateTime(object value) { if (value == DBNull.Value) { return SqlDateTime.Null; } Type type = value.GetType(); return DataStorage.GetStorageType(type) switch { StorageType.SqlDateTime => (SqlDateTime)value, StorageType.DateTime => (DateTime)value, _ => throw ExceptionBuilder.ConvertFailed(type, typeof(SqlDateTime)), }; } public static SqlBoolean ConvertToSqlBoolean(object value) { if (value == DBNull.Value || value == null) { return SqlBoolean.Null; } Type type = value.GetType(); return DataStorage.GetStorageType(type) switch { StorageType.SqlBoolean => (SqlBoolean)value, StorageType.Boolean => (bool)value, _ => throw ExceptionBuilder.ConvertFailed(type, typeof(SqlBoolean)), }; } public static SqlGuid ConvertToSqlGuid(object value) { if (value == DBNull.Value) { return SqlGuid.Null; } Type type = value.GetType(); return DataStorage.GetStorageType(type) switch { StorageType.SqlGuid => (SqlGuid)value, StorageType.Guid => (Guid)value, _ => throw ExceptionBuilder.ConvertFailed(type, typeof(SqlGuid)), }; } public static SqlBinary ConvertToSqlBinary(object value) { if (value == DBNull.Value) { return SqlBinary.Null; } Type type = value.GetType(); return DataStorage.GetStorageType(type) switch { StorageType.SqlBinary => (SqlBinary)value, StorageType.ByteArray => (byte[])value, _ => throw ExceptionBuilder.ConvertFailed(type, typeof(SqlBinary)), }; } public static SqlString ConvertToSqlString(object value) { if (value == DBNull.Value || value == null) { return SqlString.Null; } Type type = value.GetType(); return DataStorage.GetStorageType(type) switch { StorageType.SqlString => (SqlString)value, StorageType.String => (string)value, _ => throw ExceptionBuilder.ConvertFailed(type, typeof(SqlString)), }; } public static SqlChars ConvertToSqlChars(object value) { if (value == DBNull.Value) { return SqlChars.Null; } Type type = value.GetType(); StorageType storageType = DataStorage.GetStorageType(type); if (storageType == StorageType.SqlChars) { return (SqlChars)value; } throw ExceptionBuilder.ConvertFailed(type, typeof(SqlChars)); } public static SqlBytes ConvertToSqlBytes(object value) { if (value == DBNull.Value) { return SqlBytes.Null; } Type type = value.GetType(); StorageType storageType = DataStorage.GetStorageType(type); if (storageType == StorageType.SqlBytes) { return (SqlBytes)value; } throw ExceptionBuilder.ConvertFailed(type, typeof(SqlBytes)); } public static DateTimeOffset ConvertStringToDateTimeOffset(string value, IFormatProvider formatProvider) { return DateTimeOffset.Parse(value, formatProvider); } public static object ChangeTypeForDefaultValue(object value, Type type, IFormatProvider formatProvider) { if (type == typeof(BigInteger)) { if (DBNull.Value == value || value == null) { return DBNull.Value; } return BigIntegerStorage.ConvertToBigInteger(value, formatProvider); } if (value is BigInteger) { return BigIntegerStorage.ConvertFromBigInteger((BigInteger)value, type, formatProvider); } return ChangeType2(value, DataStorage.GetStorageType(type), type, formatProvider); } public static object ChangeType2(object value, StorageType stype, Type type, IFormatProvider formatProvider) { switch (stype) { case StorageType.SqlBinary: return ConvertToSqlBinary(value); case StorageType.SqlBoolean: return ConvertToSqlBoolean(value); case StorageType.SqlByte: return ConvertToSqlByte(value); case StorageType.SqlBytes: return ConvertToSqlBytes(value); case StorageType.SqlChars: return ConvertToSqlChars(value); case StorageType.SqlDateTime: return ConvertToSqlDateTime(value); case StorageType.SqlDecimal: return ConvertToSqlDecimal(value); case StorageType.SqlDouble: return ConvertToSqlDouble(value); case StorageType.SqlGuid: return ConvertToSqlGuid(value); case StorageType.SqlInt16: return ConvertToSqlInt16(value); case StorageType.SqlInt32: return ConvertToSqlInt32(value); case StorageType.SqlInt64: return ConvertToSqlInt64(value); case StorageType.SqlMoney: return ConvertToSqlMoney(value); case StorageType.SqlSingle: return ConvertToSqlSingle(value); case StorageType.SqlString: return ConvertToSqlString(value); default: { if (DBNull.Value == value || value == null) { return DBNull.Value; } Type type2 = value.GetType(); StorageType storageType = DataStorage.GetStorageType(type2); if ((uint)(storageType - 26) <= 14u) { throw ExceptionBuilder.ConvertFailed(type2, type); } if (StorageType.String == stype) { switch (storageType) { case StorageType.Boolean: return ((IConvertible)(bool)value).ToString(formatProvider); case StorageType.Char: return ((IConvertible)(char)value).ToString(formatProvider); case StorageType.SByte: return ((sbyte)value).ToString(formatProvider); case StorageType.Byte: return ((byte)value).ToString(formatProvider); case StorageType.Int16: return ((short)value).ToString(formatProvider); case StorageType.UInt16: return ((ushort)value).ToString(formatProvider); case StorageType.Int32: return ((int)value).ToString(formatProvider); case StorageType.UInt32: return ((uint)value).ToString(formatProvider); case StorageType.Int64: return ((long)value).ToString(formatProvider); case StorageType.UInt64: return ((ulong)value).ToString(formatProvider); case StorageType.Single: return ((float)value).ToString(formatProvider); case StorageType.Double: return ((double)value).ToString(formatProvider); case StorageType.Decimal: return ((decimal)value).ToString(formatProvider); case StorageType.DateTime: return ((DateTime)value).ToString(formatProvider); case StorageType.TimeSpan: return XmlConvert.ToString((TimeSpan)value); case StorageType.Guid: return XmlConvert.ToString((Guid)value); case StorageType.String: return (string)value; case StorageType.CharArray: return new string((char[])value); case StorageType.DateTimeOffset: return ((DateTimeOffset)value).ToString(formatProvider); default: if (value is IConvertible convertible) { return convertible.ToString(formatProvider); } if (value is IFormattable formattable) { return formattable.ToString(null, formatProvider); } return value.ToString(); case StorageType.BigInteger: break; } } else { if (StorageType.TimeSpan == stype) { return storageType switch { StorageType.String => XmlConvert.ToTimeSpan((string)value), StorageType.Int32 => new TimeSpan((int)value), StorageType.Int64 => new TimeSpan((long)value), _ => (TimeSpan)value, }; } if (StorageType.DateTimeOffset == stype) { return (DateTimeOffset)value; } if (StorageType.String == storageType) { switch (stype) { case StorageType.String: return (string)value; case StorageType.Boolean: if ("1" == (string)value) { return true; } if ("0" == (string)value) { return false; } break; case StorageType.Char: return ((IConvertible)(string)value).ToChar(formatProvider); case StorageType.SByte: return ((IConvertible)(string)value).ToSByte(formatProvider); case StorageType.Byte: return ((IConvertible)(string)value).ToByte(formatProvider); case StorageType.Int16: return ((IConvertible)(string)value).ToInt16(formatProvider); case StorageType.UInt16: return ((IConvertible)(string)value).ToUInt16(formatProvider); case StorageType.Int32: return ((IConvertible)(string)value).ToInt32(formatProvider); case StorageType.UInt32: return ((IConvertible)(string)value).ToUInt32(formatProvider); case StorageType.Int64: return ((IConvertible)(string)value).ToInt64(formatProvider); case StorageType.UInt64: return ((IConvertible)(string)value).ToUInt64(formatProvider); case StorageType.Single: return ((IConvertible)(string)value).ToSingle(formatProvider); case StorageType.Double: return ((IConvertible)(string)value).ToDouble(formatProvider); case StorageType.Decimal: return ((IConvertible)(string)value).ToDecimal(formatProvider); case StorageType.DateTime: return ((IConvertible)(string)value).ToDateTime(formatProvider); case StorageType.TimeSpan: return XmlConvert.ToTimeSpan((string)value); case StorageType.Guid: return XmlConvert.ToGuid((string)value); case StorageType.Uri: return new Uri((string)value); } } } return Convert.ChangeType(value, type, formatProvider); } } } public static object ChangeTypeForXML(object value, Type type) { StorageType storageType = DataStorage.GetStorageType(type); StorageType storageType2 = DataStorage.GetStorageType(value.GetType()); switch (storageType) { case StorageType.SqlBinary: return new SqlBinary(Convert.FromBase64String((string)value)); case StorageType.SqlBoolean: return new SqlBoolean(XmlConvert.ToBoolean((string)value)); case StorageType.SqlByte: return new SqlByte(XmlConvert.ToByte((string)value)); case StorageType.SqlBytes: return new SqlBytes(Convert.FromBase64String((string)value)); case StorageType.SqlChars: return new SqlChars(((string)value).ToCharArray()); case StorageType.SqlDateTime: return new SqlDateTime(XmlConvert.ToDateTime((string)value, XmlDateTimeSerializationMode.RoundtripKind)); case StorageType.SqlDecimal: return SqlDecimal.Parse((string)value); case StorageType.SqlDouble: return new SqlDouble(XmlConvert.ToDouble((string)value)); case StorageType.SqlGuid: return new SqlGuid(XmlConvert.ToGuid((string)value)); case StorageType.SqlInt16: return new SqlInt16(XmlConvert.ToInt16((string)value)); case StorageType.SqlInt32: return new SqlInt32(XmlConvert.ToInt32((string)value)); case StorageType.SqlInt64: return new SqlInt64(XmlConvert.ToInt64((string)value)); case StorageType.SqlMoney: return new SqlMoney(XmlConvert.ToDecimal((string)value)); case StorageType.SqlSingle: return new SqlSingle(XmlConvert.ToSingle((string)value)); case StorageType.SqlString: return new SqlString((string)value); case StorageType.Boolean: if ("1" == (string)value) { return true; } if ("0" == (string)value) { return false; } return XmlConvert.ToBoolean((string)value); case StorageType.Char: return XmlConvert.ToChar((string)value); case StorageType.SByte: return XmlConvert.ToSByte((string)value); case StorageType.Byte: return XmlConvert.ToByte((string)value); case StorageType.Int16: return XmlConvert.ToInt16((string)value); case StorageType.UInt16: return XmlConvert.ToUInt16((string)value); case StorageType.Int32: return XmlConvert.ToInt32((string)value); case StorageType.UInt32: return XmlConvert.ToUInt32((string)value); case StorageType.Int64: return XmlConvert.ToInt64((string)value); case StorageType.UInt64: return XmlConvert.ToUInt64((string)value); case StorageType.Single: return XmlConvert.ToSingle((string)value); case StorageType.Double: return XmlConvert.ToDouble((string)value); case StorageType.Decimal: return XmlConvert.ToDecimal((string)value); case StorageType.DateTime: return XmlConvert.ToDateTime((string)value, XmlDateTimeSerializationMode.RoundtripKind); case StorageType.Guid: return XmlConvert.ToGuid((string)value); case StorageType.Uri: return new Uri((string)value); case StorageType.DateTimeOffset: return XmlConvert.ToDateTimeOffset((string)value); case StorageType.TimeSpan: return storageType2 switch { StorageType.String => XmlConvert.ToTimeSpan((string)value), StorageType.Int32 => new TimeSpan((int)value), StorageType.Int64 => new TimeSpan((long)value), _ => (TimeSpan)value, }; default: if (DBNull.Value == value || value == null) { return DBNull.Value; } switch (storageType2) { case StorageType.SqlBinary: return Convert.ToBase64String(((SqlBinary)value).Value); case StorageType.SqlBoolean: return XmlConvert.ToString(((SqlBoolean)value).Value); case StorageType.SqlByte: return XmlConvert.ToString(((SqlByte)value).Value); case StorageType.SqlBytes: return Convert.ToBase64String(((SqlBytes)value).Value); case StorageType.SqlChars: return new string(((SqlChars)value).Value); case StorageType.SqlDateTime: return XmlConvert.ToString(((SqlDateTime)value).Value, XmlDateTimeSerializationMode.RoundtripKind); case StorageType.SqlDecimal: return ((SqlDecimal)value).ToString(); case StorageType.SqlDouble: return XmlConvert.ToString(((SqlDouble)value).Value); case StorageType.SqlGuid: return XmlConvert.ToString(((SqlGuid)value).Value); case StorageType.SqlInt16: return XmlConvert.ToString(((SqlInt16)value).Value); case StorageType.SqlInt32: return XmlConvert.ToString(((SqlInt32)value).Value); case StorageType.SqlInt64: return XmlConvert.ToString(((SqlInt64)value).Value); case StorageType.SqlMoney: return XmlConvert.ToString(((SqlMoney)value).Value); case StorageType.SqlSingle: return XmlConvert.ToString(((SqlSingle)value).Value); case StorageType.SqlString: return ((SqlString)value).Value; case StorageType.Boolean: return XmlConvert.ToString((bool)value); case StorageType.Char: return XmlConvert.ToString((char)value); case StorageType.SByte: return XmlConvert.ToString((sbyte)value); case StorageType.Byte: return XmlConvert.ToString((byte)value); case StorageType.Int16: return XmlConvert.ToString((short)value); case StorageType.UInt16: return XmlConvert.ToString((ushort)value); case StorageType.Int32: return XmlConvert.ToString((int)value); case StorageType.UInt32: return XmlConvert.ToString((uint)value); case StorageType.Int64: return XmlConvert.ToString((long)value); case StorageType.UInt64: return XmlConvert.ToString((ulong)value); case StorageType.Single: return XmlConvert.ToString((float)value); case StorageType.Double: return XmlConvert.ToString((double)value); case StorageType.Decimal: return XmlConvert.ToString((decimal)value); case StorageType.DateTime: return XmlConvert.ToString((DateTime)value, XmlDateTimeSerializationMode.RoundtripKind); case StorageType.TimeSpan: return XmlConvert.ToString((TimeSpan)value); case StorageType.Guid: return XmlConvert.ToString((Guid)value); case StorageType.String: return (string)value; case StorageType.CharArray: return new string((char[])value); case StorageType.DateTimeOffset: return XmlConvert.ToString((DateTimeOffset)value); default: if (value is IConvertible convertible) { return convertible.ToString(CultureInfo.InvariantCulture); } if (value is IFormattable formattable) { return formattable.ToString(null, CultureInfo.InvariantCulture); } return value.ToString(); } } } } internal sealed class SqlBinaryStorage : DataStorage { private SqlBinary[] _values; public SqlBinaryStorage(DataColumn column) : base(column, typeof(SqlBinary), SqlBinary.Null, SqlBinary.Null, StorageType.SqlBinary) { } public override object Aggregate(int[] records, AggregateType kind) { try { switch (kind) { case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: { int num = 0; for (int i = 0; i < records.Length; i++) { if (!IsNull(records[i])) { num++; } } return num; } } } catch (OverflowException) { throw ExprException.Overflow(typeof(SqlBinary)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { return _values[recordNo1].CompareTo(_values[recordNo2]); } public override int CompareValueTo(int recordNo, object value) { return _values[recordNo].CompareTo((SqlBinary)value); } public override object ConvertValue(object value) { if (value != null) { return SqlConvert.ConvertToSqlBinary(value); } return _nullValue; } public override void Copy(int recordNo1, int recordNo2) { _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { return _values[record]; } public override bool IsNull(int record) { return _values[record].IsNull; } public override void Set(int record, object value) { _values[record] = SqlConvert.ConvertToSqlBinary(value); } public override void SetCapacity(int capacity) { SqlBinary[] array = new SqlBinary[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; } public override object ConvertXmlToObject(string s) { SqlBinary sqlBinary = default(SqlBinary); StringReader input = new StringReader("" + s + ""); IXmlSerializable xmlSerializable = sqlBinary; using (XmlTextReader reader = new XmlTextReader(input)) { xmlSerializable.ReadXml(reader); } return (SqlBinary)(object)xmlSerializable; } public override string ConvertObjectToXml(object value) { StringWriter stringWriter = new StringWriter(base.FormatProvider); using (XmlTextWriter writer = new XmlTextWriter(stringWriter)) { ((IXmlSerializable)value).WriteXml(writer); } return stringWriter.ToString(); } protected override object GetEmptyStorage(int recordCount) { return new SqlBinary[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((SqlBinary[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (SqlBinary[])store; } } internal sealed class SqlByteStorage : DataStorage { private SqlByte[] _values; public SqlByteStorage(DataColumn column) : base(column, typeof(SqlByte), SqlByte.Null, SqlByte.Null, StorageType.SqlByte) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Sum: { SqlInt64 sqlInt = 0L; int[] array = records; foreach (int num3 in array) { if (!IsNull(num3)) { sqlInt += (SqlInt64)_values[num3]; flag = true; } } if (flag) { return sqlInt; } return _nullValue; } case AggregateType.Mean: { SqlInt64 sqlInt2 = 0L; int num5 = 0; int[] array = records; foreach (int num6 in array) { if (!IsNull(num6)) { sqlInt2 += _values[num6].ToSqlInt64(); num5++; flag = true; } } if (flag) { _ = (SqlByte)(byte)0; return (sqlInt2 / num5).ToSqlByte(); } return _nullValue; } case AggregateType.Var: case AggregateType.StDev: { int num = 0; SqlDouble sqlDouble = 0.0; _ = (SqlDouble)0.0; SqlDouble sqlDouble2 = 0.0; SqlDouble sqlDouble3 = 0.0; int[] array = records; foreach (int num4 in array) { if (!IsNull(num4)) { sqlDouble2 += _values[num4].ToSqlDouble(); sqlDouble3 += _values[num4].ToSqlDouble() * _values[num4].ToSqlDouble(); num++; } } if (num > 1) { sqlDouble = num * sqlDouble3 - sqlDouble2 * sqlDouble2; if (sqlDouble / (sqlDouble2 * sqlDouble2) < 1E-15 || sqlDouble < 0.0) { sqlDouble = 0.0; } else { sqlDouble /= (SqlDouble)(num * (num - 1)); } if (kind == AggregateType.StDev) { return Math.Sqrt(sqlDouble.Value); } return sqlDouble; } return _nullValue; } case AggregateType.Min: { SqlByte sqlByte = SqlByte.MaxValue; foreach (int num2 in records) { if (!IsNull(num2)) { if (SqlByte.LessThan(_values[num2], sqlByte).IsTrue) { sqlByte = _values[num2]; } flag = true; } } if (flag) { return sqlByte; } return _nullValue; } case AggregateType.Max: { SqlByte sqlByte2 = SqlByte.MinValue; foreach (int num7 in records) { if (!IsNull(num7)) { if (SqlByte.GreaterThan(_values[num7], sqlByte2).IsTrue) { sqlByte2 = _values[num7]; } flag = true; } } if (flag) { return sqlByte2; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: { int num = 0; for (int i = 0; i < records.Length; i++) { if (!IsNull(records[i])) { num++; } } return num; } } } catch (OverflowException) { throw ExprException.Overflow(typeof(SqlByte)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { return _values[recordNo1].CompareTo(_values[recordNo2]); } public override int CompareValueTo(int recordNo, object value) { return _values[recordNo].CompareTo((SqlByte)value); } public override object ConvertValue(object value) { if (value != null) { return SqlConvert.ConvertToSqlByte(value); } return _nullValue; } public override void Copy(int recordNo1, int recordNo2) { _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { return _values[record]; } public override bool IsNull(int record) { return _values[record].IsNull; } public override void Set(int record, object value) { _values[record] = SqlConvert.ConvertToSqlByte(value); } public override void SetCapacity(int capacity) { SqlByte[] array = new SqlByte[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; } public override object ConvertXmlToObject(string s) { SqlByte sqlByte = default(SqlByte); StringReader input = new StringReader("" + s + ""); IXmlSerializable xmlSerializable = sqlByte; using (XmlTextReader reader = new XmlTextReader(input)) { xmlSerializable.ReadXml(reader); } return (SqlByte)(object)xmlSerializable; } public override string ConvertObjectToXml(object value) { StringWriter stringWriter = new StringWriter(base.FormatProvider); using (XmlTextWriter writer = new XmlTextWriter(stringWriter)) { ((IXmlSerializable)value).WriteXml(writer); } return stringWriter.ToString(); } protected override object GetEmptyStorage(int recordCount) { return new SqlByte[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((SqlByte[])store)[storeIndex] = _values[record]; nullbits.Set(record, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (SqlByte[])store; } } internal sealed class SqlBytesStorage : DataStorage { private SqlBytes[] _values; public SqlBytesStorage(DataColumn column) : base(column, typeof(SqlBytes), SqlBytes.Null, SqlBytes.Null, StorageType.SqlBytes) { } public override object Aggregate(int[] records, AggregateType kind) { try { switch (kind) { case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: { int num = 0; for (int i = 0; i < records.Length; i++) { if (!IsNull(records[i])) { num++; } } return num; } } } catch (OverflowException) { throw ExprException.Overflow(typeof(SqlBytes)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { return 0; } public override int CompareValueTo(int recordNo, object value) { return 0; } public override void Copy(int recordNo1, int recordNo2) { _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { return _values[record]; } public override bool IsNull(int record) { return _values[record].IsNull; } public override void Set(int record, object value) { if (value == DBNull.Value || value == null) { _values[record] = SqlBytes.Null; } else { _values[record] = (SqlBytes)value; } } public override void SetCapacity(int capacity) { SqlBytes[] array = new SqlBytes[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; } public override object ConvertXmlToObject(string s) { SqlBinary sqlBinary = default(SqlBinary); StringReader input = new StringReader("" + s + ""); IXmlSerializable xmlSerializable = sqlBinary; using (XmlTextReader reader = new XmlTextReader(input)) { xmlSerializable.ReadXml(reader); } return new SqlBytes((SqlBinary)(object)xmlSerializable); } public override string ConvertObjectToXml(object value) { StringWriter stringWriter = new StringWriter(base.FormatProvider); using (XmlTextWriter writer = new XmlTextWriter(stringWriter)) { ((IXmlSerializable)value).WriteXml(writer); } return stringWriter.ToString(); } protected override object GetEmptyStorage(int recordCount) { return new SqlBytes[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((SqlBytes[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (SqlBytes[])store; } } internal sealed class SqlCharsStorage : DataStorage { private SqlChars[] _values; public SqlCharsStorage(DataColumn column) : base(column, typeof(SqlChars), SqlChars.Null, SqlChars.Null, StorageType.SqlChars) { } public override object Aggregate(int[] records, AggregateType kind) { try { switch (kind) { case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: { int num = 0; for (int i = 0; i < records.Length; i++) { if (!IsNull(records[i])) { num++; } } return num; } } } catch (OverflowException) { throw ExprException.Overflow(typeof(SqlChars)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { return 0; } public override int CompareValueTo(int recordNo, object value) { return 0; } public override void Copy(int recordNo1, int recordNo2) { _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { return _values[record]; } public override bool IsNull(int record) { return _values[record].IsNull; } public override void Set(int record, object value) { if (value == DBNull.Value || value == null) { _values[record] = SqlChars.Null; } else { _values[record] = (SqlChars)value; } } public override void SetCapacity(int capacity) { SqlChars[] array = new SqlChars[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; } public override object ConvertXmlToObject(string s) { SqlString sqlString = default(SqlString); StringReader input = new StringReader("" + s + ""); IXmlSerializable xmlSerializable = sqlString; using (XmlTextReader reader = new XmlTextReader(input)) { xmlSerializable.ReadXml(reader); } return new SqlChars((SqlString)(object)xmlSerializable); } public override string ConvertObjectToXml(object value) { StringWriter stringWriter = new StringWriter(base.FormatProvider); using (XmlTextWriter writer = new XmlTextWriter(stringWriter)) { ((IXmlSerializable)value).WriteXml(writer); } return stringWriter.ToString(); } protected override object GetEmptyStorage(int recordCount) { return new SqlChars[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((SqlChars[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (SqlChars[])store; } } internal sealed class SqlDateTimeStorage : DataStorage { private SqlDateTime[] _values; public SqlDateTimeStorage(DataColumn column) : base(column, typeof(SqlDateTime), SqlDateTime.Null, SqlDateTime.Null, StorageType.SqlDateTime) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Min: { SqlDateTime sqlDateTime2 = SqlDateTime.MaxValue; foreach (int num3 in records) { if (!IsNull(num3)) { if (SqlDateTime.LessThan(_values[num3], sqlDateTime2).IsTrue) { sqlDateTime2 = _values[num3]; } flag = true; } } if (flag) { return sqlDateTime2; } return _nullValue; } case AggregateType.Max: { SqlDateTime sqlDateTime = SqlDateTime.MinValue; foreach (int num2 in records) { if (!IsNull(num2)) { if (SqlDateTime.GreaterThan(_values[num2], sqlDateTime).IsTrue) { sqlDateTime = _values[num2]; } flag = true; } } if (flag) { return sqlDateTime; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: { int num = 0; for (int i = 0; i < records.Length; i++) { if (!IsNull(records[i])) { num++; } } return num; } } } catch (OverflowException) { throw ExprException.Overflow(typeof(SqlDateTime)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { return _values[recordNo1].CompareTo(_values[recordNo2]); } public override int CompareValueTo(int recordNo, object value) { return _values[recordNo].CompareTo((SqlDateTime)value); } public override object ConvertValue(object value) { if (value != null) { return SqlConvert.ConvertToSqlDateTime(value); } return _nullValue; } public override void Copy(int recordNo1, int recordNo2) { _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { return _values[record]; } public override bool IsNull(int record) { return _values[record].IsNull; } public override void Set(int record, object value) { _values[record] = SqlConvert.ConvertToSqlDateTime(value); } public override void SetCapacity(int capacity) { SqlDateTime[] array = new SqlDateTime[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; } public override object ConvertXmlToObject(string s) { SqlDateTime sqlDateTime = default(SqlDateTime); StringReader input = new StringReader("" + s + ""); IXmlSerializable xmlSerializable = sqlDateTime; using (XmlTextReader reader = new XmlTextReader(input)) { xmlSerializable.ReadXml(reader); } return (SqlDateTime)(object)xmlSerializable; } public override string ConvertObjectToXml(object value) { StringWriter stringWriter = new StringWriter(base.FormatProvider); using (XmlTextWriter writer = new XmlTextWriter(stringWriter)) { ((IXmlSerializable)value).WriteXml(writer); } return stringWriter.ToString(); } protected override object GetEmptyStorage(int recordCount) { return new SqlDateTime[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((SqlDateTime[])store)[storeIndex] = _values[record]; nullbits.Set(record, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (SqlDateTime[])store; } } internal sealed class SqlDecimalStorage : DataStorage { private SqlDecimal[] _values; public SqlDecimalStorage(DataColumn column) : base(column, typeof(SqlDecimal), SqlDecimal.Null, SqlDecimal.Null, StorageType.SqlDecimal) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Sum: { SqlDecimal sqlDecimal2 = 0L; int[] array = records; foreach (int num3 in array) { if (!IsNull(num3)) { sqlDecimal2 += _values[num3]; flag = true; } } if (flag) { return sqlDecimal2; } return _nullValue; } case AggregateType.Mean: { SqlDecimal sqlDecimal3 = 0L; int num5 = 0; int[] array = records; foreach (int num6 in array) { if (!IsNull(num6)) { sqlDecimal3 += _values[num6]; num5++; flag = true; } } if (flag) { _ = (SqlDecimal)0L; return sqlDecimal3 / num5; } return _nullValue; } case AggregateType.Var: case AggregateType.StDev: { int num = 0; SqlDouble sqlDouble = 0.0; _ = (SqlDouble)0.0; SqlDouble sqlDouble2 = 0.0; SqlDouble sqlDouble3 = 0.0; int[] array = records; foreach (int num4 in array) { if (!IsNull(num4)) { sqlDouble2 += _values[num4].ToSqlDouble(); sqlDouble3 += _values[num4].ToSqlDouble() * _values[num4].ToSqlDouble(); num++; } } if (num > 1) { sqlDouble = num * sqlDouble3 - sqlDouble2 * sqlDouble2; if (sqlDouble / (sqlDouble2 * sqlDouble2) < 1E-15 || sqlDouble < 0.0) { sqlDouble = 0.0; } else { sqlDouble /= (SqlDouble)(num * (num - 1)); } if (kind == AggregateType.StDev) { return Math.Sqrt(sqlDouble.Value); } return sqlDouble; } return _nullValue; } case AggregateType.Min: { SqlDecimal sqlDecimal = SqlDecimal.MaxValue; foreach (int num2 in records) { if (!IsNull(num2)) { if (SqlDecimal.LessThan(_values[num2], sqlDecimal).IsTrue) { sqlDecimal = _values[num2]; } flag = true; } } if (flag) { return sqlDecimal; } return _nullValue; } case AggregateType.Max: { SqlDecimal sqlDecimal4 = SqlDecimal.MinValue; foreach (int num7 in records) { if (!IsNull(num7)) { if (SqlDecimal.GreaterThan(_values[num7], sqlDecimal4).IsTrue) { sqlDecimal4 = _values[num7]; } flag = true; } } if (flag) { return sqlDecimal4; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: { int num = 0; for (int i = 0; i < records.Length; i++) { if (!IsNull(records[i])) { num++; } } return num; } } } catch (OverflowException) { throw ExprException.Overflow(typeof(SqlDecimal)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { return _values[recordNo1].CompareTo(_values[recordNo2]); } public override int CompareValueTo(int recordNo, object value) { return _values[recordNo].CompareTo((SqlDecimal)value); } public override object ConvertValue(object value) { if (value != null) { return SqlConvert.ConvertToSqlDecimal(value); } return _nullValue; } public override void Copy(int recordNo1, int recordNo2) { _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { return _values[record]; } public override bool IsNull(int record) { return _values[record].IsNull; } public override void Set(int record, object value) { _values[record] = SqlConvert.ConvertToSqlDecimal(value); } public override void SetCapacity(int capacity) { SqlDecimal[] array = new SqlDecimal[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; } public override object ConvertXmlToObject(string s) { SqlDecimal sqlDecimal = default(SqlDecimal); StringReader input = new StringReader("" + s + ""); IXmlSerializable xmlSerializable = sqlDecimal; using (XmlTextReader reader = new XmlTextReader(input)) { xmlSerializable.ReadXml(reader); } return (SqlDecimal)(object)xmlSerializable; } public override string ConvertObjectToXml(object value) { StringWriter stringWriter = new StringWriter(base.FormatProvider); using (XmlTextWriter writer = new XmlTextWriter(stringWriter)) { ((IXmlSerializable)value).WriteXml(writer); } return stringWriter.ToString(); } protected override object GetEmptyStorage(int recordCount) { return new SqlDecimal[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((SqlDecimal[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (SqlDecimal[])store; } } internal sealed class SqlDoubleStorage : DataStorage { private SqlDouble[] _values; public SqlDoubleStorage(DataColumn column) : base(column, typeof(SqlDouble), SqlDouble.Null, SqlDouble.Null, StorageType.SqlDouble) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Sum: { SqlDouble sqlDouble2 = 0.0; int[] array = records; foreach (int num3 in array) { if (!IsNull(num3)) { sqlDouble2 += _values[num3]; flag = true; } } if (flag) { return sqlDouble2; } return _nullValue; } case AggregateType.Mean: { SqlDouble sqlDouble6 = 0.0; int num5 = 0; int[] array = records; foreach (int num6 in array) { if (!IsNull(num6)) { sqlDouble6 += _values[num6]; num5++; flag = true; } } if (flag) { _ = (SqlDouble)0.0; return sqlDouble6 / num5; } return _nullValue; } case AggregateType.Var: case AggregateType.StDev: { int num = 0; SqlDouble sqlDouble3 = 0.0; _ = (SqlDouble)0.0; SqlDouble sqlDouble4 = 0.0; SqlDouble sqlDouble5 = 0.0; int[] array = records; foreach (int num4 in array) { if (!IsNull(num4)) { sqlDouble4 += _values[num4]; sqlDouble5 += _values[num4] * _values[num4]; num++; } } if (num > 1) { sqlDouble3 = num * sqlDouble5 - sqlDouble4 * sqlDouble4; if (sqlDouble3 / (sqlDouble4 * sqlDouble4) < 1E-15 || sqlDouble3 < 0.0) { sqlDouble3 = 0.0; } else { sqlDouble3 /= (SqlDouble)(num * (num - 1)); } if (kind == AggregateType.StDev) { return Math.Sqrt(sqlDouble3.Value); } return sqlDouble3; } return _nullValue; } case AggregateType.Min: { SqlDouble sqlDouble = SqlDouble.MaxValue; foreach (int num2 in records) { if (!IsNull(num2)) { if (SqlDouble.LessThan(_values[num2], sqlDouble).IsTrue) { sqlDouble = _values[num2]; } flag = true; } } if (flag) { return sqlDouble; } return _nullValue; } case AggregateType.Max: { SqlDouble sqlDouble7 = SqlDouble.MinValue; foreach (int num7 in records) { if (!IsNull(num7)) { if (SqlDouble.GreaterThan(_values[num7], sqlDouble7).IsTrue) { sqlDouble7 = _values[num7]; } flag = true; } } if (flag) { return sqlDouble7; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: { int num = 0; for (int i = 0; i < records.Length; i++) { if (!IsNull(records[i])) { num++; } } return num; } } } catch (OverflowException) { throw ExprException.Overflow(typeof(SqlDouble)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { return _values[recordNo1].CompareTo(_values[recordNo2]); } public override int CompareValueTo(int recordNo, object value) { return _values[recordNo].CompareTo((SqlDouble)value); } public override object ConvertValue(object value) { if (value != null) { return SqlConvert.ConvertToSqlDouble(value); } return _nullValue; } public override void Copy(int recordNo1, int recordNo2) { _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { return _values[record]; } public override bool IsNull(int record) { return _values[record].IsNull; } public override void Set(int record, object value) { _values[record] = SqlConvert.ConvertToSqlDouble(value); } public override void SetCapacity(int capacity) { SqlDouble[] array = new SqlDouble[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; } public override object ConvertXmlToObject(string s) { SqlDouble sqlDouble = default(SqlDouble); StringReader input = new StringReader("" + s + ""); IXmlSerializable xmlSerializable = sqlDouble; using (XmlTextReader reader = new XmlTextReader(input)) { xmlSerializable.ReadXml(reader); } return (SqlDouble)(object)xmlSerializable; } public override string ConvertObjectToXml(object value) { StringWriter stringWriter = new StringWriter(base.FormatProvider); using (XmlTextWriter writer = new XmlTextWriter(stringWriter)) { ((IXmlSerializable)value).WriteXml(writer); } return stringWriter.ToString(); } protected override object GetEmptyStorage(int recordCount) { return new SqlDouble[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((SqlDouble[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (SqlDouble[])store; } } internal sealed class SqlGuidStorage : DataStorage { private SqlGuid[] _values; public SqlGuidStorage(DataColumn column) : base(column, typeof(SqlGuid), SqlGuid.Null, SqlGuid.Null, StorageType.SqlGuid) { } public override object Aggregate(int[] records, AggregateType kind) { try { switch (kind) { case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: { int num = 0; for (int i = 0; i < records.Length; i++) { if (!IsNull(records[i])) { num++; } } return num; } } } catch (OverflowException) { throw ExprException.Overflow(typeof(SqlGuid)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { return _values[recordNo1].CompareTo(_values[recordNo2]); } public override int CompareValueTo(int recordNo, object value) { return _values[recordNo].CompareTo((SqlGuid)value); } public override object ConvertValue(object value) { if (value != null) { return SqlConvert.ConvertToSqlGuid(value); } return _nullValue; } public override void Copy(int recordNo1, int recordNo2) { _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { return _values[record]; } public override bool IsNull(int record) { return _values[record].IsNull; } public override void Set(int record, object value) { _values[record] = SqlConvert.ConvertToSqlGuid(value); } public override void SetCapacity(int capacity) { SqlGuid[] array = new SqlGuid[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; } public override object ConvertXmlToObject(string s) { SqlGuid sqlGuid = default(SqlGuid); StringReader input = new StringReader("" + s + ""); IXmlSerializable xmlSerializable = sqlGuid; using (XmlTextReader reader = new XmlTextReader(input)) { xmlSerializable.ReadXml(reader); } return (SqlGuid)(object)xmlSerializable; } public override string ConvertObjectToXml(object value) { StringWriter stringWriter = new StringWriter(base.FormatProvider); using (XmlTextWriter writer = new XmlTextWriter(stringWriter)) { ((IXmlSerializable)value).WriteXml(writer); } return stringWriter.ToString(); } protected override object GetEmptyStorage(int recordCount) { return new SqlGuid[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((SqlGuid[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (SqlGuid[])store; } } internal sealed class SqlInt16Storage : DataStorage { private SqlInt16[] _values; public SqlInt16Storage(DataColumn column) : base(column, typeof(SqlInt16), SqlInt16.Null, SqlInt16.Null, StorageType.SqlInt16) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Sum: { SqlInt64 sqlInt2 = 0L; int[] array = records; foreach (int num3 in array) { if (!IsNull(num3)) { sqlInt2 += (SqlInt64)_values[num3]; flag = true; } } if (flag) { return sqlInt2; } return _nullValue; } case AggregateType.Mean: { SqlInt64 sqlInt3 = 0L; int num5 = 0; int[] array = records; foreach (int num6 in array) { if (!IsNull(num6)) { sqlInt3 += _values[num6].ToSqlInt64(); num5++; flag = true; } } if (flag) { _ = (SqlInt16)(short)0; return (sqlInt3 / num5).ToSqlInt16(); } return _nullValue; } case AggregateType.Var: case AggregateType.StDev: { int num = 0; SqlDouble sqlDouble = 0.0; _ = (SqlDouble)0.0; SqlDouble sqlDouble2 = 0.0; SqlDouble sqlDouble3 = 0.0; int[] array = records; foreach (int num4 in array) { if (!IsNull(num4)) { sqlDouble2 += _values[num4].ToSqlDouble(); sqlDouble3 += _values[num4].ToSqlDouble() * _values[num4].ToSqlDouble(); num++; } } if (num > 1) { sqlDouble = num * sqlDouble3 - sqlDouble2 * sqlDouble2; if (sqlDouble / (sqlDouble2 * sqlDouble2) < 1E-15 || sqlDouble < 0.0) { sqlDouble = 0.0; } else { sqlDouble /= (SqlDouble)(num * (num - 1)); } if (kind == AggregateType.StDev) { return Math.Sqrt(sqlDouble.Value); } return sqlDouble; } return _nullValue; } case AggregateType.Min: { SqlInt16 sqlInt = SqlInt16.MaxValue; foreach (int num2 in records) { if (!IsNull(num2)) { if (SqlInt16.LessThan(_values[num2], sqlInt).IsTrue) { sqlInt = _values[num2]; } flag = true; } } if (flag) { return sqlInt; } return _nullValue; } case AggregateType.Max: { SqlInt16 sqlInt4 = SqlInt16.MinValue; foreach (int num7 in records) { if (!IsNull(num7)) { if (SqlInt16.GreaterThan(_values[num7], sqlInt4).IsTrue) { sqlInt4 = _values[num7]; } flag = true; } } if (flag) { return sqlInt4; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: { int num = 0; for (int i = 0; i < records.Length; i++) { if (!IsNull(records[i])) { num++; } } return num; } } } catch (OverflowException) { throw ExprException.Overflow(typeof(SqlInt16)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { return _values[recordNo1].CompareTo(_values[recordNo2]); } public override int CompareValueTo(int recordNo, object value) { return _values[recordNo].CompareTo((SqlInt16)value); } public override object ConvertValue(object value) { if (value != null) { return SqlConvert.ConvertToSqlInt16(value); } return _nullValue; } public override void Copy(int recordNo1, int recordNo2) { _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { return _values[record]; } public override bool IsNull(int record) { return _values[record].IsNull; } public override void Set(int record, object value) { _values[record] = SqlConvert.ConvertToSqlInt16(value); } public override void SetCapacity(int capacity) { SqlInt16[] array = new SqlInt16[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; } public override object ConvertXmlToObject(string s) { SqlInt16 sqlInt = default(SqlInt16); StringReader input = new StringReader("" + s + ""); IXmlSerializable xmlSerializable = sqlInt; using (XmlTextReader reader = new XmlTextReader(input)) { xmlSerializable.ReadXml(reader); } return (SqlInt16)(object)xmlSerializable; } public override string ConvertObjectToXml(object value) { StringWriter stringWriter = new StringWriter(base.FormatProvider); using (XmlTextWriter writer = new XmlTextWriter(stringWriter)) { ((IXmlSerializable)value).WriteXml(writer); } return stringWriter.ToString(); } protected override object GetEmptyStorage(int recordCount) { return new SqlInt16[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((SqlInt16[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (SqlInt16[])store; } } internal sealed class SqlInt32Storage : DataStorage { private SqlInt32[] _values; public SqlInt32Storage(DataColumn column) : base(column, typeof(SqlInt32), SqlInt32.Null, SqlInt32.Null, StorageType.SqlInt32) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Sum: { SqlInt64 sqlInt2 = 0L; int[] array = records; foreach (int num3 in array) { if (!IsNull(num3)) { sqlInt2 += (SqlInt64)_values[num3]; flag = true; } } if (flag) { return sqlInt2; } return _nullValue; } case AggregateType.Mean: { SqlInt64 sqlInt3 = 0L; int num5 = 0; int[] array = records; foreach (int num6 in array) { if (!IsNull(num6)) { sqlInt3 += _values[num6].ToSqlInt64(); num5++; flag = true; } } if (flag) { _ = (SqlInt32)0; return (sqlInt3 / num5).ToSqlInt32(); } return _nullValue; } case AggregateType.Var: case AggregateType.StDev: { int num = 0; SqlDouble sqlDouble = 0.0; _ = (SqlDouble)0.0; SqlDouble sqlDouble2 = 0.0; SqlDouble sqlDouble3 = 0.0; int[] array = records; foreach (int num4 in array) { if (!IsNull(num4)) { sqlDouble2 += _values[num4].ToSqlDouble(); sqlDouble3 += _values[num4].ToSqlDouble() * _values[num4].ToSqlDouble(); num++; } } if (num > 1) { sqlDouble = num * sqlDouble3 - sqlDouble2 * sqlDouble2; if (sqlDouble / (sqlDouble2 * sqlDouble2) < 1E-15 || sqlDouble < 0.0) { sqlDouble = 0.0; } else { sqlDouble /= (SqlDouble)(num * (num - 1)); } if (kind == AggregateType.StDev) { return Math.Sqrt(sqlDouble.Value); } return sqlDouble; } return _nullValue; } case AggregateType.Min: { SqlInt32 sqlInt = SqlInt32.MaxValue; foreach (int num2 in records) { if (!IsNull(num2)) { if (SqlInt32.LessThan(_values[num2], sqlInt).IsTrue) { sqlInt = _values[num2]; } flag = true; } } if (flag) { return sqlInt; } return _nullValue; } case AggregateType.Max: { SqlInt32 sqlInt4 = SqlInt32.MinValue; foreach (int num7 in records) { if (!IsNull(num7)) { if (SqlInt32.GreaterThan(_values[num7], sqlInt4).IsTrue) { sqlInt4 = _values[num7]; } flag = true; } } if (flag) { return sqlInt4; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: { int num = 0; for (int i = 0; i < records.Length; i++) { if (!IsNull(records[i])) { num++; } } return num; } } } catch (OverflowException) { throw ExprException.Overflow(typeof(SqlInt32)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { return _values[recordNo1].CompareTo(_values[recordNo2]); } public override int CompareValueTo(int recordNo, object value) { return _values[recordNo].CompareTo((SqlInt32)value); } public override object ConvertValue(object value) { if (value != null) { return SqlConvert.ConvertToSqlInt32(value); } return _nullValue; } public override void Copy(int recordNo1, int recordNo2) { _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { return _values[record]; } public override bool IsNull(int record) { return _values[record].IsNull; } public override void Set(int record, object value) { _values[record] = SqlConvert.ConvertToSqlInt32(value); } public override void SetCapacity(int capacity) { SqlInt32[] array = new SqlInt32[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; } public override object ConvertXmlToObject(string s) { SqlInt32 sqlInt = default(SqlInt32); StringReader input = new StringReader("" + s + ""); IXmlSerializable xmlSerializable = sqlInt; using (XmlTextReader reader = new XmlTextReader(input)) { xmlSerializable.ReadXml(reader); } return (SqlInt32)(object)xmlSerializable; } public override string ConvertObjectToXml(object value) { StringWriter stringWriter = new StringWriter(base.FormatProvider); using (XmlTextWriter writer = new XmlTextWriter(stringWriter)) { ((IXmlSerializable)value).WriteXml(writer); } return stringWriter.ToString(); } protected override object GetEmptyStorage(int recordCount) { return new SqlInt32[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((SqlInt32[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (SqlInt32[])store; } } internal sealed class SqlInt64Storage : DataStorage { private SqlInt64[] _values; public SqlInt64Storage(DataColumn column) : base(column, typeof(SqlInt64), SqlInt64.Null, SqlInt64.Null, StorageType.SqlInt64) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Sum: { SqlInt64 sqlInt2 = 0L; int[] array = records; foreach (int num3 in array) { if (!IsNull(num3)) { sqlInt2 += _values[num3]; flag = true; } } if (flag) { return sqlInt2; } return _nullValue; } case AggregateType.Mean: { SqlDecimal sqlDecimal = 0L; int num5 = 0; int[] array = records; foreach (int num6 in array) { if (!IsNull(num6)) { sqlDecimal += _values[num6].ToSqlDecimal(); num5++; flag = true; } } if (flag) { _ = (SqlInt64)0L; return (sqlDecimal / num5).ToSqlInt64(); } return _nullValue; } case AggregateType.Var: case AggregateType.StDev: { int num = 0; SqlDouble sqlDouble = 0.0; _ = (SqlDouble)0.0; SqlDouble sqlDouble2 = 0.0; SqlDouble sqlDouble3 = 0.0; int[] array = records; foreach (int num4 in array) { if (!IsNull(num4)) { sqlDouble2 += _values[num4].ToSqlDouble(); sqlDouble3 += _values[num4].ToSqlDouble() * _values[num4].ToSqlDouble(); num++; } } if (num > 1) { sqlDouble = num * sqlDouble3 - sqlDouble2 * sqlDouble2; if (sqlDouble / (sqlDouble2 * sqlDouble2) < 1E-15 || sqlDouble < 0.0) { sqlDouble = 0.0; } else { sqlDouble /= (SqlDouble)(num * (num - 1)); } if (kind == AggregateType.StDev) { return Math.Sqrt(sqlDouble.Value); } return sqlDouble; } return _nullValue; } case AggregateType.Min: { SqlInt64 sqlInt = SqlInt64.MaxValue; foreach (int num2 in records) { if (!IsNull(num2)) { if (SqlInt64.LessThan(_values[num2], sqlInt).IsTrue) { sqlInt = _values[num2]; } flag = true; } } if (flag) { return sqlInt; } return _nullValue; } case AggregateType.Max: { SqlInt64 sqlInt3 = SqlInt64.MinValue; foreach (int num7 in records) { if (!IsNull(num7)) { if (SqlInt64.GreaterThan(_values[num7], sqlInt3).IsTrue) { sqlInt3 = _values[num7]; } flag = true; } } if (flag) { return sqlInt3; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: { int num = 0; for (int i = 0; i < records.Length; i++) { if (!IsNull(records[i])) { num++; } } return num; } } } catch (OverflowException) { throw ExprException.Overflow(typeof(SqlInt64)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { return _values[recordNo1].CompareTo(_values[recordNo2]); } public override int CompareValueTo(int recordNo, object value) { return _values[recordNo].CompareTo((SqlInt64)value); } public override object ConvertValue(object value) { if (value != null) { return SqlConvert.ConvertToSqlInt64(value); } return _nullValue; } public override void Copy(int recordNo1, int recordNo2) { _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { return _values[record]; } public override bool IsNull(int record) { return _values[record].IsNull; } public override void Set(int record, object value) { _values[record] = SqlConvert.ConvertToSqlInt64(value); } public override void SetCapacity(int capacity) { SqlInt64[] array = new SqlInt64[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; } public override object ConvertXmlToObject(string s) { SqlInt64 sqlInt = default(SqlInt64); StringReader input = new StringReader("" + s + ""); IXmlSerializable xmlSerializable = sqlInt; using (XmlTextReader reader = new XmlTextReader(input)) { xmlSerializable.ReadXml(reader); } return (SqlInt64)(object)xmlSerializable; } public override string ConvertObjectToXml(object value) { StringWriter stringWriter = new StringWriter(base.FormatProvider); using (XmlTextWriter writer = new XmlTextWriter(stringWriter)) { ((IXmlSerializable)value).WriteXml(writer); } return stringWriter.ToString(); } protected override object GetEmptyStorage(int recordCount) { return new SqlInt64[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((SqlInt64[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (SqlInt64[])store; } } internal sealed class SqlMoneyStorage : DataStorage { private SqlMoney[] _values; public SqlMoneyStorage(DataColumn column) : base(column, typeof(SqlMoney), SqlMoney.Null, SqlMoney.Null, StorageType.SqlMoney) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Sum: { SqlDecimal sqlDecimal = 0L; int[] array = records; foreach (int num3 in array) { if (!IsNull(num3)) { sqlDecimal += (SqlDecimal)_values[num3]; flag = true; } } if (flag) { return sqlDecimal; } return _nullValue; } case AggregateType.Mean: { SqlDecimal sqlDecimal2 = 0L; int num5 = 0; int[] array = records; foreach (int num6 in array) { if (!IsNull(num6)) { sqlDecimal2 += _values[num6].ToSqlDecimal(); num5++; flag = true; } } if (flag) { _ = (SqlMoney)0L; return (sqlDecimal2 / num5).ToSqlMoney(); } return _nullValue; } case AggregateType.Var: case AggregateType.StDev: { int num = 0; SqlDouble sqlDouble = 0.0; _ = (SqlDouble)0.0; SqlDouble sqlDouble2 = 0.0; SqlDouble sqlDouble3 = 0.0; int[] array = records; foreach (int num4 in array) { if (!IsNull(num4)) { sqlDouble2 += _values[num4].ToSqlDouble(); sqlDouble3 += _values[num4].ToSqlDouble() * _values[num4].ToSqlDouble(); num++; } } if (num > 1) { sqlDouble = num * sqlDouble3 - sqlDouble2 * sqlDouble2; if (sqlDouble / (sqlDouble2 * sqlDouble2) < 1E-15 || sqlDouble < 0.0) { sqlDouble = 0.0; } else { sqlDouble /= (SqlDouble)(num * (num - 1)); } if (kind == AggregateType.StDev) { return Math.Sqrt(sqlDouble.Value); } return sqlDouble; } return _nullValue; } case AggregateType.Min: { SqlMoney sqlMoney = SqlMoney.MaxValue; foreach (int num2 in records) { if (!IsNull(num2)) { if (SqlMoney.LessThan(_values[num2], sqlMoney).IsTrue) { sqlMoney = _values[num2]; } flag = true; } } if (flag) { return sqlMoney; } return _nullValue; } case AggregateType.Max: { SqlMoney sqlMoney2 = SqlMoney.MinValue; foreach (int num7 in records) { if (!IsNull(num7)) { if (SqlMoney.GreaterThan(_values[num7], sqlMoney2).IsTrue) { sqlMoney2 = _values[num7]; } flag = true; } } if (flag) { return sqlMoney2; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: { int num = 0; for (int i = 0; i < records.Length; i++) { if (!IsNull(records[i])) { num++; } } return num; } } } catch (OverflowException) { throw ExprException.Overflow(typeof(SqlMoney)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { return _values[recordNo1].CompareTo(_values[recordNo2]); } public override int CompareValueTo(int recordNo, object value) { return _values[recordNo].CompareTo((SqlMoney)value); } public override object ConvertValue(object value) { if (value != null) { return SqlConvert.ConvertToSqlMoney(value); } return _nullValue; } public override void Copy(int recordNo1, int recordNo2) { _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { return _values[record]; } public override bool IsNull(int record) { return _values[record].IsNull; } public override void Set(int record, object value) { _values[record] = SqlConvert.ConvertToSqlMoney(value); } public override void SetCapacity(int capacity) { SqlMoney[] array = new SqlMoney[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; } public override object ConvertXmlToObject(string s) { SqlMoney sqlMoney = default(SqlMoney); StringReader input = new StringReader("" + s + ""); IXmlSerializable xmlSerializable = sqlMoney; using (XmlTextReader reader = new XmlTextReader(input)) { xmlSerializable.ReadXml(reader); } return (SqlMoney)(object)xmlSerializable; } public override string ConvertObjectToXml(object value) { StringWriter stringWriter = new StringWriter(base.FormatProvider); using (XmlTextWriter writer = new XmlTextWriter(stringWriter)) { ((IXmlSerializable)value).WriteXml(writer); } return stringWriter.ToString(); } protected override object GetEmptyStorage(int recordCount) { return new SqlMoney[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((SqlMoney[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (SqlMoney[])store; } } internal sealed class SqlSingleStorage : DataStorage { private SqlSingle[] _values; public SqlSingleStorage(DataColumn column) : base(column, typeof(SqlSingle), SqlSingle.Null, SqlSingle.Null, StorageType.SqlSingle) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Sum: { SqlSingle sqlSingle2 = 0f; int[] array = records; foreach (int num3 in array) { if (!IsNull(num3)) { sqlSingle2 += _values[num3]; flag = true; } } if (flag) { return sqlSingle2; } return _nullValue; } case AggregateType.Mean: { SqlDouble sqlDouble4 = 0.0; int num5 = 0; int[] array = records; foreach (int num6 in array) { if (!IsNull(num6)) { sqlDouble4 += _values[num6].ToSqlDouble(); num5++; flag = true; } } if (flag) { _ = (SqlSingle)0f; return (sqlDouble4 / num5).ToSqlSingle(); } return _nullValue; } case AggregateType.Var: case AggregateType.StDev: { int num = 0; SqlDouble sqlDouble = 0.0; _ = (SqlDouble)0.0; SqlDouble sqlDouble2 = 0.0; SqlDouble sqlDouble3 = 0.0; int[] array = records; foreach (int num4 in array) { if (!IsNull(num4)) { sqlDouble2 += _values[num4].ToSqlDouble(); sqlDouble3 += _values[num4].ToSqlDouble() * _values[num4].ToSqlDouble(); num++; } } if (num > 1) { sqlDouble = num * sqlDouble3 - sqlDouble2 * sqlDouble2; if (sqlDouble / (sqlDouble2 * sqlDouble2) < 1E-15 || sqlDouble < 0.0) { sqlDouble = 0.0; } else { sqlDouble /= (SqlDouble)(num * (num - 1)); } if (kind == AggregateType.StDev) { return Math.Sqrt(sqlDouble.Value); } return sqlDouble; } return _nullValue; } case AggregateType.Min: { SqlSingle sqlSingle = SqlSingle.MaxValue; foreach (int num2 in records) { if (!IsNull(num2)) { if (SqlSingle.LessThan(_values[num2], sqlSingle).IsTrue) { sqlSingle = _values[num2]; } flag = true; } } if (flag) { return sqlSingle; } return _nullValue; } case AggregateType.Max: { SqlSingle sqlSingle3 = SqlSingle.MinValue; foreach (int num7 in records) { if (!IsNull(num7)) { if (SqlSingle.GreaterThan(_values[num7], sqlSingle3).IsTrue) { sqlSingle3 = _values[num7]; } flag = true; } } if (flag) { return sqlSingle3; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: { int num = 0; for (int i = 0; i < records.Length; i++) { if (!IsNull(records[i])) { num++; } } return num; } } } catch (OverflowException) { throw ExprException.Overflow(typeof(SqlSingle)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { return _values[recordNo1].CompareTo(_values[recordNo2]); } public override int CompareValueTo(int recordNo, object value) { return _values[recordNo].CompareTo((SqlSingle)value); } public override object ConvertValue(object value) { if (value != null) { return SqlConvert.ConvertToSqlSingle(value); } return _nullValue; } public override void Copy(int recordNo1, int recordNo2) { _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { return _values[record]; } public override bool IsNull(int record) { return _values[record].IsNull; } public override void Set(int record, object value) { _values[record] = SqlConvert.ConvertToSqlSingle(value); } public override void SetCapacity(int capacity) { SqlSingle[] array = new SqlSingle[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; } public override object ConvertXmlToObject(string s) { SqlSingle sqlSingle = default(SqlSingle); StringReader input = new StringReader("" + s + ""); IXmlSerializable xmlSerializable = sqlSingle; using (XmlTextReader reader = new XmlTextReader(input)) { xmlSerializable.ReadXml(reader); } return (SqlSingle)(object)xmlSerializable; } public override string ConvertObjectToXml(object value) { StringWriter stringWriter = new StringWriter(base.FormatProvider); using (XmlTextWriter writer = new XmlTextWriter(stringWriter)) { ((IXmlSerializable)value).WriteXml(writer); } return stringWriter.ToString(); } protected override object GetEmptyStorage(int recordCount) { return new SqlSingle[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((SqlSingle[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (SqlSingle[])store; } } internal sealed class SqlStringStorage : DataStorage { private SqlString[] _values; public SqlStringStorage(DataColumn column) : base(column, typeof(SqlString), SqlString.Null, SqlString.Null, StorageType.SqlString) { } public override object Aggregate(int[] recordNos, AggregateType kind) { try { switch (kind) { case AggregateType.Min: { int num3 = -1; int i; for (i = 0; i < recordNos.Length; i++) { if (!IsNull(recordNos[i])) { num3 = recordNos[i]; break; } } if (num3 >= 0) { for (i++; i < recordNos.Length; i++) { if (!IsNull(recordNos[i]) && Compare(num3, recordNos[i]) > 0) { num3 = recordNos[i]; } } return Get(num3); } return _nullValue; } case AggregateType.Max: { int num2 = -1; int i; for (i = 0; i < recordNos.Length; i++) { if (!IsNull(recordNos[i])) { num2 = recordNos[i]; break; } } if (num2 >= 0) { for (i++; i < recordNos.Length; i++) { if (Compare(num2, recordNos[i]) < 0) { num2 = recordNos[i]; } } return Get(num2); } return _nullValue; } case AggregateType.Count: { int num = 0; for (int i = 0; i < recordNos.Length; i++) { if (!IsNull(recordNos[i])) { num++; } } return num; } case AggregateType.First: break; } } catch (OverflowException) { throw ExprException.Overflow(typeof(SqlString)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { return Compare(_values[recordNo1], _values[recordNo2]); } public int Compare(SqlString valueNo1, SqlString valueNo2) { if (valueNo1.IsNull && valueNo2.IsNull) { return 0; } if (valueNo1.IsNull) { return -1; } if (valueNo2.IsNull) { return 1; } return _table.Compare(valueNo1.Value, valueNo2.Value); } public override int CompareValueTo(int recordNo, object value) { return Compare(_values[recordNo], (SqlString)value); } public override object ConvertValue(object value) { if (value != null) { return SqlConvert.ConvertToSqlString(value); } return _nullValue; } public override void Copy(int recordNo1, int recordNo2) { _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { return _values[record]; } public override int GetStringLength(int record) { SqlString sqlString = _values[record]; if (!sqlString.IsNull) { return sqlString.Value.Length; } return 0; } public override bool IsNull(int record) { return _values[record].IsNull; } public override void Set(int record, object value) { _values[record] = SqlConvert.ConvertToSqlString(value); } public override void SetCapacity(int capacity) { SqlString[] array = new SqlString[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; } public override object ConvertXmlToObject(string s) { SqlString sqlString = default(SqlString); StringReader input = new StringReader("" + s + ""); IXmlSerializable xmlSerializable = sqlString; using (XmlTextReader reader = new XmlTextReader(input)) { xmlSerializable.ReadXml(reader); } return (SqlString)(object)xmlSerializable; } public override string ConvertObjectToXml(object value) { StringWriter stringWriter = new StringWriter(base.FormatProvider); using (XmlTextWriter writer = new XmlTextWriter(stringWriter)) { ((IXmlSerializable)value).WriteXml(writer); } return stringWriter.ToString(); } protected override object GetEmptyStorage(int recordCount) { return new SqlString[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((SqlString[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (SqlString[])store; } } internal sealed class SqlBooleanStorage : DataStorage { private SqlBoolean[] _values; public SqlBooleanStorage(DataColumn column) : base(column, typeof(SqlBoolean), SqlBoolean.Null, SqlBoolean.Null, StorageType.SqlBoolean) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Min: { SqlBoolean sqlBoolean2 = true; foreach (int num3 in records) { if (!IsNull(num3)) { sqlBoolean2 = SqlBoolean.And(_values[num3], sqlBoolean2); flag = true; } } if (flag) { return sqlBoolean2; } return _nullValue; } case AggregateType.Max: { SqlBoolean sqlBoolean = false; foreach (int num2 in records) { if (!IsNull(num2)) { sqlBoolean = SqlBoolean.Or(_values[num2], sqlBoolean); flag = true; } } if (flag) { return sqlBoolean; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return _nullValue; case AggregateType.Count: { int num = 0; for (int i = 0; i < records.Length; i++) { if (!IsNull(records[i])) { num++; } } return num; } } } catch (OverflowException) { throw ExprException.Overflow(typeof(SqlBoolean)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { return _values[recordNo1].CompareTo(_values[recordNo2]); } public override int CompareValueTo(int recordNo, object value) { return _values[recordNo].CompareTo((SqlBoolean)value); } public override object ConvertValue(object value) { if (value != null) { return SqlConvert.ConvertToSqlBoolean(value); } return _nullValue; } public override void Copy(int recordNo1, int recordNo2) { _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { return _values[record]; } public override bool IsNull(int record) { return _values[record].IsNull; } public override void Set(int record, object value) { _values[record] = SqlConvert.ConvertToSqlBoolean(value); } public override void SetCapacity(int capacity) { SqlBoolean[] array = new SqlBoolean[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; } public override object ConvertXmlToObject(string s) { SqlBoolean sqlBoolean = default(SqlBoolean); StringReader input = new StringReader("" + s + ""); IXmlSerializable xmlSerializable = sqlBoolean; using (XmlTextReader reader = new XmlTextReader(input)) { xmlSerializable.ReadXml(reader); } return (SqlBoolean)(object)xmlSerializable; } public override string ConvertObjectToXml(object value) { StringWriter stringWriter = new StringWriter(base.FormatProvider); using (XmlTextWriter writer = new XmlTextWriter(stringWriter)) { ((IXmlSerializable)value).WriteXml(writer); } return stringWriter.ToString(); } protected override object GetEmptyStorage(int recordCount) { return new SqlBoolean[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((SqlBoolean[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (SqlBoolean[])store; } } public static class SchemaTableColumn { public static readonly string ColumnName = "ColumnName"; public static readonly string ColumnOrdinal = "ColumnOrdinal"; public static readonly string ColumnSize = "ColumnSize"; public static readonly string NumericPrecision = "NumericPrecision"; public static readonly string NumericScale = "NumericScale"; public static readonly string DataType = "DataType"; public static readonly string ProviderType = "ProviderType"; public static readonly string NonVersionedProviderType = "NonVersionedProviderType"; public static readonly string IsLong = "IsLong"; public static readonly string AllowDBNull = "AllowDBNull"; public static readonly string IsAliased = "IsAliased"; public static readonly string IsExpression = "IsExpression"; public static readonly string IsKey = "IsKey"; public static readonly string IsUnique = "IsUnique"; public static readonly string BaseSchemaName = "BaseSchemaName"; public static readonly string BaseTableName = "BaseTableName"; public static readonly string BaseColumnName = "BaseColumnName"; } public static class SchemaTableOptionalColumn { public static readonly string ProviderSpecificDataType = "ProviderSpecificDataType"; public static readonly string IsAutoIncrement = "IsAutoIncrement"; public static readonly string IsHidden = "IsHidden"; public static readonly string IsReadOnly = "IsReadOnly"; public static readonly string IsRowVersion = "IsRowVersion"; public static readonly string BaseServerName = "BaseServerName"; public static readonly string BaseCatalogName = "BaseCatalogName"; public static readonly string AutoIncrementSeed = "AutoIncrementSeed"; public static readonly string AutoIncrementStep = "AutoIncrementStep"; public static readonly string DefaultValue = "DefaultValue"; public static readonly string Expression = "Expression"; public static readonly string BaseTableNamespace = "BaseTableNamespace"; public static readonly string BaseColumnNamespace = "BaseColumnNamespace"; public static readonly string ColumnMapping = "ColumnMapping"; } internal sealed class SingleStorage : DataStorage { private const float defaultValue = 0f; private float[] _values; public SingleStorage(DataColumn column) : base(column, typeof(float), 0f, StorageType.Single) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Sum: { float num13 = 0f; int[] array = records; foreach (int num14 in array) { if (!IsNull(num14)) { num13 += _values[num14]; flag = true; } } if (flag) { return num13; } return _nullValue; } case AggregateType.Mean: { double num6 = 0.0; int num7 = 0; int[] array = records; foreach (int num8 in array) { if (!IsNull(num8)) { num6 += (double)_values[num8]; num7++; flag = true; } } if (flag) { return (float)(num6 / (double)num7); } return _nullValue; } case AggregateType.Var: case AggregateType.StDev: { int num = 0; double num2 = 0.0; double num3 = 0.0; double num4 = 0.0; int[] array = records; foreach (int num5 in array) { if (!IsNull(num5)) { num3 += (double)_values[num5]; num4 += (double)_values[num5] * (double)_values[num5]; num++; } } if (num > 1) { num2 = (double)num * num4 - num3 * num3; num2 = ((!(num2 / (num3 * num3) < 1E-15) && !(num2 < 0.0)) ? (num2 / (double)(num * (num - 1))) : 0.0); if (kind == AggregateType.StDev) { return Math.Sqrt(num2); } return num2; } return _nullValue; } case AggregateType.Min: { float num11 = float.MaxValue; foreach (int num12 in records) { if (!IsNull(num12)) { num11 = Math.Min(_values[num12], num11); flag = true; } } if (flag) { return num11; } return _nullValue; } case AggregateType.Max: { float num9 = float.MinValue; foreach (int num10 in records) { if (!IsNull(num10)) { num9 = Math.Max(_values[num10], num9); flag = true; } } if (flag) { return num9; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: return base.Aggregate(records, kind); } } catch (OverflowException) { throw ExprException.Overflow(typeof(float)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { float num = _values[recordNo1]; float num2 = _values[recordNo2]; if (num == 0f || num2 == 0f) { int num3 = CompareBits(recordNo1, recordNo2); if (num3 != 0) { return num3; } } return num.CompareTo(num2); } public override int CompareValueTo(int recordNo, object value) { if (_nullValue == value) { if (IsNull(recordNo)) { return 0; } return 1; } float num = _values[recordNo]; if (0f == num && IsNull(recordNo)) { return -1; } return num.CompareTo((float)value); } public override object ConvertValue(object value) { if (_nullValue != value) { value = ((value == null) ? _nullValue : ((object)((IConvertible)value).ToSingle(base.FormatProvider))); } return value; } public override void Copy(int recordNo1, int recordNo2) { CopyBits(recordNo1, recordNo2); _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { float num = _values[record]; if (num != 0f) { return num; } return GetBits(record); } public override void Set(int record, object value) { if (_nullValue == value) { _values[record] = 0f; SetNullBit(record, flag: true); } else { _values[record] = ((IConvertible)value).ToSingle(base.FormatProvider); SetNullBit(record, flag: false); } } public override void SetCapacity(int capacity) { float[] array = new float[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; base.SetCapacity(capacity); } public override object ConvertXmlToObject(string s) { return XmlConvert.ToSingle(s); } public override string ConvertObjectToXml(object value) { return XmlConvert.ToString((float)value); } protected override object GetEmptyStorage(int recordCount) { return new float[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((float[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (float[])store; SetNullStorage(nullbits); } } internal sealed class SqlUdtStorage : DataStorage { private object[] _values; private readonly bool _implementsIXmlSerializable; private readonly bool _implementsIComparable; private static readonly Dictionary s_typeToNull = new Dictionary(); public SqlUdtStorage(DataColumn column, Type type) : this(column, type, GetStaticNullForUdtType(type)) { } private SqlUdtStorage(DataColumn column, Type type, object nullValue) : base(column, type, nullValue, nullValue, typeof(ICloneable).IsAssignableFrom(type), DataStorage.GetStorageType(type)) { _implementsIXmlSerializable = typeof(IXmlSerializable).IsAssignableFrom(type); _implementsIComparable = typeof(IComparable).IsAssignableFrom(type); } internal static object GetStaticNullForUdtType(Type type) { if (!s_typeToNull.TryGetValue(type, out var value)) { PropertyInfo property = type.GetProperty("Null", BindingFlags.Static | BindingFlags.Public); if (property != null) { value = property.GetValue(null, null); } else { FieldInfo field = type.GetField("Null", BindingFlags.Static | BindingFlags.Public); if (!(field != null)) { throw ExceptionBuilder.INullableUDTwithoutStaticNull(type.AssemblyQualifiedName); } value = field.GetValue(null); } lock (s_typeToNull) { s_typeToNull[type] = value; } } return value; } public override bool IsNull(int record) { return ((INullable)_values[record]).IsNull; } public override object Aggregate(int[] records, AggregateType kind) { throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { return CompareValueTo(recordNo1, _values[recordNo2]); } public override int CompareValueTo(int recordNo1, object value) { if (DBNull.Value == value) { value = _nullValue; } if (_implementsIComparable) { return ((IComparable)_values[recordNo1]).CompareTo(value); } if (_nullValue == value) { if (!((INullable)_values[recordNo1]).IsNull) { return 1; } return 0; } throw ExceptionBuilder.IComparableNotImplemented(_dataType.AssemblyQualifiedName); } public override void Copy(int recordNo1, int recordNo2) { CopyBits(recordNo1, recordNo2); _values[recordNo2] = _values[recordNo1]; } public override object Get(int recordNo) { return _values[recordNo]; } public override void Set(int recordNo, object value) { if (DBNull.Value == value) { _values[recordNo] = _nullValue; SetNullBit(recordNo, flag: true); } else if (value == null) { if (_isValueType) { throw ExceptionBuilder.StorageSetFailed(); } _values[recordNo] = _nullValue; SetNullBit(recordNo, flag: true); } else { if (!_dataType.IsInstanceOfType(value)) { throw ExceptionBuilder.StorageSetFailed(); } _values[recordNo] = value; SetNullBit(recordNo, flag: false); } } public override void SetCapacity(int capacity) { object[] array = new object[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; base.SetCapacity(capacity); } [MethodImpl(MethodImplOptions.NoInlining)] public override object ConvertXmlToObject(string s) { if (_implementsIXmlSerializable) { object obj = Activator.CreateInstance(_dataType, nonPublic: true); using XmlTextReader reader = new XmlTextReader(new StringReader("" + s + "")); ((IXmlSerializable)obj).ReadXml(reader); return obj; } StringReader textReader = new StringReader(s); return ObjectStorage.GetXmlSerializer(_dataType).Deserialize(textReader); } [MethodImpl(MethodImplOptions.NoInlining)] public override object ConvertXmlToObject(XmlReader xmlReader, XmlRootAttribute xmlAttrib) { if (xmlAttrib == null) { string text = xmlReader.GetAttribute("InstanceType", "urn:schemas-microsoft-com:xml-msdata"); if (text == null) { string attribute = xmlReader.GetAttribute("InstanceType", "http://www.w3.org/2001/XMLSchema-instance"); if (attribute != null) { text = XSDSchema.XsdtoClr(attribute).FullName; } } object? obj = Activator.CreateInstance((text == null) ? _dataType : Type.GetType(text), nonPublic: true); ((IXmlSerializable)obj).ReadXml(xmlReader); return obj; } return ObjectStorage.GetXmlSerializer(_dataType, xmlAttrib).Deserialize(xmlReader); } public override string ConvertObjectToXml(object value) { StringWriter stringWriter = new StringWriter(base.FormatProvider); if (_implementsIXmlSerializable) { using XmlTextWriter writer = new XmlTextWriter(stringWriter); ((IXmlSerializable)value).WriteXml(writer); } else { ObjectStorage.GetXmlSerializer(value.GetType()).Serialize(stringWriter, value); } return stringWriter.ToString(); } public override void ConvertObjectToXml(object value, XmlWriter xmlWriter, XmlRootAttribute xmlAttrib) { if (xmlAttrib == null) { ((IXmlSerializable)value).WriteXml(xmlWriter); } else { ObjectStorage.GetXmlSerializer(_dataType, xmlAttrib).Serialize(xmlWriter, value); } } protected override object GetEmptyStorage(int recordCount) { return new object[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((object[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (object[])store; } } internal sealed class StringStorage : DataStorage { private string[] _values; public StringStorage(DataColumn column) : base(column, typeof(string), string.Empty, StorageType.String) { } public override object Aggregate(int[] recordNos, AggregateType kind) { switch (kind) { case AggregateType.Min: { int num3 = -1; int i; for (i = 0; i < recordNos.Length; i++) { if (!IsNull(recordNos[i])) { num3 = recordNos[i]; break; } } if (num3 >= 0) { for (i++; i < recordNos.Length; i++) { if (!IsNull(recordNos[i]) && Compare(num3, recordNos[i]) > 0) { num3 = recordNos[i]; } } return Get(num3); } return _nullValue; } case AggregateType.Max: { int num2 = -1; int i; for (i = 0; i < recordNos.Length; i++) { if (!IsNull(recordNos[i])) { num2 = recordNos[i]; break; } } if (num2 >= 0) { for (i++; i < recordNos.Length; i++) { if (Compare(num2, recordNos[i]) < 0) { num2 = recordNos[i]; } } return Get(num2); } return _nullValue; } case AggregateType.Count: { int num = 0; for (int i = 0; i < recordNos.Length; i++) { if (_values[recordNos[i]] != null) { num++; } } return num; } default: throw ExceptionBuilder.AggregateException(kind, _dataType); } } public override int Compare(int recordNo1, int recordNo2) { string text = _values[recordNo1]; string text2 = _values[recordNo2]; if ((object)text == text2) { return 0; } if (text == null) { return -1; } if (text2 == null) { return 1; } return _table.Compare(text, text2); } public override int CompareValueTo(int recordNo, object value) { string text = _values[recordNo]; if (text == null) { if (_nullValue == value) { return 0; } return -1; } if (_nullValue == value) { return 1; } return _table.Compare(text, (string)value); } public override object ConvertValue(object value) { if (_nullValue != value) { value = ((value == null) ? _nullValue : value.ToString()); } return value; } public override void Copy(int recordNo1, int recordNo2) { _values[recordNo2] = _values[recordNo1]; } public override object Get(int recordNo) { string text = _values[recordNo]; if (text != null) { return text; } return _nullValue; } public override int GetStringLength(int record) { return _values[record]?.Length ?? 0; } public override bool IsNull(int record) { return _values[record] == null; } public override void Set(int record, object value) { if (_nullValue == value) { _values[record] = null; } else { _values[record] = value.ToString(); } } public override void SetCapacity(int capacity) { string[] array = new string[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; } public override object ConvertXmlToObject(string s) { return s; } public override string ConvertObjectToXml(object value) { return (string)value; } protected override object GetEmptyStorage(int recordCount) { return new string[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((string[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (string[])store; } } [Flags] public enum SupportedJoinOperators { None = 0, Inner = 1, LeftOuter = 2, RightOuter = 4, FullOuter = 8 } internal sealed class TimeSpanStorage : DataStorage { private static readonly TimeSpan s_defaultValue = TimeSpan.Zero; private TimeSpan[] _values; public TimeSpanStorage(DataColumn column) : base(column, typeof(TimeSpan), s_defaultValue, StorageType.TimeSpan) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Min: { TimeSpan timeSpan = TimeSpan.MaxValue; foreach (int num9 in records) { if (!IsNull(num9)) { timeSpan = ((TimeSpan.Compare(_values[num9], timeSpan) < 0) ? _values[num9] : timeSpan); flag = true; } } if (flag) { return timeSpan; } return _nullValue; } case AggregateType.Max: { TimeSpan timeSpan2 = TimeSpan.MinValue; foreach (int num13 in records) { if (!IsNull(num13)) { timeSpan2 = ((TimeSpan.Compare(_values[num13], timeSpan2) >= 0) ? _values[num13] : timeSpan2); flag = true; } } if (flag) { return timeSpan2; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: return base.Aggregate(records, kind); case AggregateType.Sum: { decimal d = default(decimal); int[] array = records; foreach (int num14 in array) { if (!IsNull(num14)) { d += (decimal)_values[num14].Ticks; flag = true; } } if (flag) { return TimeSpan.FromTicks((long)Math.Round(d)); } return null; } case AggregateType.Mean: { decimal num10 = default(decimal); int num11 = 0; int[] array = records; foreach (int num12 in array) { if (!IsNull(num12)) { num10 += (decimal)_values[num12].Ticks; num11++; } } if (num11 > 0) { return TimeSpan.FromTicks((long)Math.Round(num10 / (decimal)num11)); } return null; } case AggregateType.StDev: { int num = 0; decimal num2 = default(decimal); int[] array = records; foreach (int num3 in array) { if (!IsNull(num3)) { num2 += (decimal)_values[num3].Ticks; num++; } } if (num > 1) { double num4 = 0.0; decimal num5 = num2 / (decimal)num; array = records; foreach (int num6 in array) { if (!IsNull(num6)) { double num7 = (double)((decimal)_values[num6].Ticks - num5); num4 += num7 * num7; } } ulong num8 = (ulong)Math.Round(Math.Sqrt(num4 / (double)(num - 1))); if (num8 > long.MaxValue) { num8 = 9223372036854775807uL; } return TimeSpan.FromTicks((long)num8); } return null; } case AggregateType.Var: break; } } catch (OverflowException) { throw ExprException.Overflow(typeof(TimeSpan)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { TimeSpan timeSpan = _values[recordNo1]; TimeSpan timeSpan2 = _values[recordNo2]; if (timeSpan == s_defaultValue || timeSpan2 == s_defaultValue) { int num = CompareBits(recordNo1, recordNo2); if (num != 0) { return num; } } return TimeSpan.Compare(timeSpan, timeSpan2); } public override int CompareValueTo(int recordNo, object value) { if (_nullValue == value) { if (IsNull(recordNo)) { return 0; } return 1; } TimeSpan timeSpan = _values[recordNo]; if (s_defaultValue == timeSpan && IsNull(recordNo)) { return -1; } return timeSpan.CompareTo((TimeSpan)value); } private static TimeSpan ConvertToTimeSpan(object value) { Type type = value.GetType(); if (type == typeof(string)) { return TimeSpan.Parse((string)value); } if (type == typeof(int)) { return new TimeSpan((int)value); } if (type == typeof(long)) { return new TimeSpan((long)value); } return (TimeSpan)value; } public override object ConvertValue(object value) { if (_nullValue != value) { value = ((value == null) ? _nullValue : ((object)ConvertToTimeSpan(value))); } return value; } public override void Copy(int recordNo1, int recordNo2) { CopyBits(recordNo1, recordNo2); _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { TimeSpan timeSpan = _values[record]; if (timeSpan != s_defaultValue) { return timeSpan; } return GetBits(record); } public override void Set(int record, object value) { if (_nullValue == value) { _values[record] = s_defaultValue; SetNullBit(record, flag: true); } else { _values[record] = ConvertToTimeSpan(value); SetNullBit(record, flag: false); } } public override void SetCapacity(int capacity) { TimeSpan[] array = new TimeSpan[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; base.SetCapacity(capacity); } public override object ConvertXmlToObject(string s) { return XmlConvert.ToTimeSpan(s); } public override string ConvertObjectToXml(object value) { return XmlConvert.ToString((TimeSpan)value); } protected override object GetEmptyStorage(int recordCount) { return new TimeSpan[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((TimeSpan[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, IsNull(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (TimeSpan[])store; SetNullStorage(nullbits); } } internal sealed class UInt16Storage : DataStorage { private static readonly ushort s_defaultValue; private ushort[] _values; public UInt16Storage(DataColumn column) : base(column, typeof(ushort), s_defaultValue, StorageType.UInt16) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Sum: { ulong num4 = s_defaultValue; int[] array = records; foreach (int num5 in array) { if (HasValue(num5)) { num4 = checked(num4 + _values[num5]); flag = true; } } if (flag) { return num4; } return _nullValue; } case AggregateType.Mean: { long num10 = s_defaultValue; int num11 = 0; int[] array = records; foreach (int num12 in array) { if (HasValue(num12)) { num10 = checked(num10 + _values[num12]); num11++; flag = true; } } checked { if (flag) { return (ushort)unchecked(num10 / num11); } return _nullValue; } } case AggregateType.Var: case AggregateType.StDev: { int num = 0; double num6 = 0.0; double num7 = 0.0; double num8 = 0.0; int[] array = records; foreach (int num9 in array) { if (HasValue(num9)) { num7 += (double)(int)_values[num9]; num8 += (double)(int)_values[num9] * (double)(int)_values[num9]; num++; } } if (num > 1) { num6 = (double)num * num8 - num7 * num7; num6 = ((!(num6 / (num7 * num7) < 1E-15) && !(num6 < 0.0)) ? (num6 / (double)(num * (num - 1))) : 0.0); if (kind == AggregateType.StDev) { return Math.Sqrt(num6); } return num6; } return _nullValue; } case AggregateType.Min: { ushort num2 = ushort.MaxValue; foreach (int num3 in records) { if (HasValue(num3)) { num2 = Math.Min(_values[num3], num2); flag = true; } } if (flag) { return num2; } return _nullValue; } case AggregateType.Max: { ushort num13 = 0; foreach (int num14 in records) { if (HasValue(num14)) { num13 = Math.Max(_values[num14], num13); flag = true; } } if (flag) { return num13; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: { int num = 0; for (int i = 0; i < records.Length; i++) { if (HasValue(records[i])) { num++; } } return num; } } } catch (OverflowException) { throw ExprException.Overflow(typeof(ushort)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { ushort num = _values[recordNo1]; ushort num2 = _values[recordNo2]; if (num == s_defaultValue || num2 == s_defaultValue) { int num3 = CompareBits(recordNo1, recordNo2); if (num3 != 0) { return num3; } } return num - num2; } public override int CompareValueTo(int recordNo, object value) { if (_nullValue == value) { if (!HasValue(recordNo)) { return 0; } return 1; } ushort num = _values[recordNo]; if (s_defaultValue == num && !HasValue(recordNo)) { return -1; } return num.CompareTo((ushort)value); } public override object ConvertValue(object value) { if (_nullValue != value) { value = ((value == null) ? _nullValue : ((object)((IConvertible)value).ToUInt16(base.FormatProvider))); } return value; } public override void Copy(int recordNo1, int recordNo2) { CopyBits(recordNo1, recordNo2); _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { ushort num = _values[record]; if (!num.Equals(s_defaultValue)) { return num; } return GetBits(record); } public override void Set(int record, object value) { if (_nullValue == value) { _values[record] = s_defaultValue; SetNullBit(record, flag: true); } else { _values[record] = ((IConvertible)value).ToUInt16(base.FormatProvider); SetNullBit(record, flag: false); } } public override void SetCapacity(int capacity) { ushort[] array = new ushort[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; base.SetCapacity(capacity); } public override object ConvertXmlToObject(string s) { return XmlConvert.ToUInt16(s); } public override string ConvertObjectToXml(object value) { return XmlConvert.ToString((ushort)value); } protected override object GetEmptyStorage(int recordCount) { return new ushort[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((ushort[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, !HasValue(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (ushort[])store; SetNullStorage(nullbits); } } internal sealed class UInt32Storage : DataStorage { private static readonly uint s_defaultValue; private uint[] _values; public UInt32Storage(DataColumn column) : base(column, typeof(uint), s_defaultValue, StorageType.UInt32) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Sum: { ulong num4 = s_defaultValue; int[] array = records; foreach (int num5 in array) { if (HasValue(num5)) { num4 = checked(num4 + _values[num5]); flag = true; } } if (flag) { return num4; } return _nullValue; } case AggregateType.Mean: { long num10 = s_defaultValue; int num11 = 0; int[] array = records; foreach (int num12 in array) { if (HasValue(num12)) { num10 = checked(num10 + _values[num12]); num11++; flag = true; } } checked { if (flag) { return (uint)unchecked(num10 / num11); } return _nullValue; } } case AggregateType.Var: case AggregateType.StDev: { int num = 0; double num6 = 0.0; double num7 = 0.0; double num8 = 0.0; int[] array = records; foreach (int num9 in array) { if (HasValue(num9)) { num7 += (double)_values[num9]; num8 += (double)_values[num9] * (double)_values[num9]; num++; } } if (num > 1) { num6 = (double)num * num8 - num7 * num7; num6 = ((!(num6 / (num7 * num7) < 1E-15) && !(num6 < 0.0)) ? (num6 / (double)(num * (num - 1))) : 0.0); if (kind == AggregateType.StDev) { return Math.Sqrt(num6); } return num6; } return _nullValue; } case AggregateType.Min: { uint num2 = uint.MaxValue; foreach (int num3 in records) { if (HasValue(num3)) { num2 = Math.Min(_values[num3], num2); flag = true; } } if (flag) { return num2; } return _nullValue; } case AggregateType.Max: { uint num13 = 0u; foreach (int num14 in records) { if (HasValue(num14)) { num13 = Math.Max(_values[num14], num13); flag = true; } } if (flag) { return num13; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: { int num = 0; for (int i = 0; i < records.Length; i++) { if (HasValue(records[i])) { num++; } } return num; } } } catch (OverflowException) { throw ExprException.Overflow(typeof(uint)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { uint num = _values[recordNo1]; uint num2 = _values[recordNo2]; if (num == s_defaultValue || num2 == s_defaultValue) { int num3 = CompareBits(recordNo1, recordNo2); if (num3 != 0) { return num3; } } if (num >= num2) { if (num <= num2) { return 0; } return 1; } return -1; } public override int CompareValueTo(int recordNo, object value) { if (_nullValue == value) { if (!HasValue(recordNo)) { return 0; } return 1; } uint num = _values[recordNo]; if (s_defaultValue == num && !HasValue(recordNo)) { return -1; } return num.CompareTo((uint)value); } public override object ConvertValue(object value) { if (_nullValue != value) { value = ((value == null) ? _nullValue : ((object)((IConvertible)value).ToUInt32(base.FormatProvider))); } return value; } public override void Copy(int recordNo1, int recordNo2) { CopyBits(recordNo1, recordNo2); _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { uint num = _values[record]; if (!num.Equals(s_defaultValue)) { return num; } return GetBits(record); } public override void Set(int record, object value) { if (_nullValue == value) { _values[record] = s_defaultValue; SetNullBit(record, flag: true); } else { _values[record] = ((IConvertible)value).ToUInt32(base.FormatProvider); SetNullBit(record, flag: false); } } public override void SetCapacity(int capacity) { uint[] array = new uint[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; base.SetCapacity(capacity); } public override object ConvertXmlToObject(string s) { return XmlConvert.ToUInt32(s); } public override string ConvertObjectToXml(object value) { return XmlConvert.ToString((uint)value); } protected override object GetEmptyStorage(int recordCount) { return new uint[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((uint[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, !HasValue(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (uint[])store; SetNullStorage(nullbits); } } internal sealed class UInt64Storage : DataStorage { private static readonly ulong s_defaultValue; private ulong[] _values; public UInt64Storage(DataColumn column) : base(column, typeof(ulong), s_defaultValue, StorageType.UInt64) { } public override object Aggregate(int[] records, AggregateType kind) { bool flag = false; try { switch (kind) { case AggregateType.Sum: { ulong num13 = s_defaultValue; int[] array = records; foreach (int num14 in array) { if (HasValue(num14)) { num13 = checked(num13 + _values[num14]); flag = true; } } if (flag) { return num13; } return _nullValue; } case AggregateType.Mean: { decimal num6 = s_defaultValue; int num7 = 0; int[] array = records; foreach (int num8 in array) { if (HasValue(num8)) { num6 += (decimal)_values[num8]; num7++; flag = true; } } if (flag) { return (ulong)(num6 / (decimal)num7); } return _nullValue; } case AggregateType.Var: case AggregateType.StDev: { int num = 0; double num2 = 0.0; double num3 = 0.0; double num4 = 0.0; int[] array = records; foreach (int num5 in array) { if (HasValue(num5)) { num3 += (double)_values[num5]; num4 += (double)_values[num5] * (double)_values[num5]; num++; } } if (num > 1) { num2 = (double)num * num4 - num3 * num3; num2 = ((!(num2 / (num3 * num3) < 1E-15) && !(num2 < 0.0)) ? (num2 / (double)(num * (num - 1))) : 0.0); if (kind == AggregateType.StDev) { return Math.Sqrt(num2); } return num2; } return _nullValue; } case AggregateType.Min: { ulong num11 = ulong.MaxValue; foreach (int num12 in records) { if (HasValue(num12)) { num11 = Math.Min(_values[num12], num11); flag = true; } } if (flag) { return num11; } return _nullValue; } case AggregateType.Max: { ulong num9 = 0uL; foreach (int num10 in records) { if (HasValue(num10)) { num9 = Math.Max(_values[num10], num9); flag = true; } } if (flag) { return num9; } return _nullValue; } case AggregateType.First: if (records.Length != 0) { return _values[records[0]]; } return null; case AggregateType.Count: return base.Aggregate(records, kind); } } catch (OverflowException) { throw ExprException.Overflow(typeof(ulong)); } throw ExceptionBuilder.AggregateException(kind, _dataType); } public override int Compare(int recordNo1, int recordNo2) { ulong num = _values[recordNo1]; ulong num2 = _values[recordNo2]; if (num.Equals(s_defaultValue) || num2.Equals(s_defaultValue)) { int num3 = CompareBits(recordNo1, recordNo2); if (num3 != 0) { return num3; } } if (num >= num2) { if (num <= num2) { return 0; } return 1; } return -1; } public override int CompareValueTo(int recordNo, object value) { if (_nullValue == value) { if (!HasValue(recordNo)) { return 0; } return 1; } ulong num = _values[recordNo]; if (s_defaultValue == num && !HasValue(recordNo)) { return -1; } return num.CompareTo((ulong)value); } public override object ConvertValue(object value) { if (_nullValue != value) { value = ((value == null) ? _nullValue : ((object)((IConvertible)value).ToUInt64(base.FormatProvider))); } return value; } public override void Copy(int recordNo1, int recordNo2) { CopyBits(recordNo1, recordNo2); _values[recordNo2] = _values[recordNo1]; } public override object Get(int record) { ulong num = _values[record]; if (!num.Equals(s_defaultValue)) { return num; } return GetBits(record); } public override void Set(int record, object value) { if (_nullValue == value) { _values[record] = s_defaultValue; SetNullBit(record, flag: true); } else { _values[record] = ((IConvertible)value).ToUInt64(base.FormatProvider); SetNullBit(record, flag: false); } } public override void SetCapacity(int capacity) { ulong[] array = new ulong[capacity]; if (_values != null) { Array.Copy(_values, 0, array, 0, Math.Min(capacity, _values.Length)); } _values = array; base.SetCapacity(capacity); } public override object ConvertXmlToObject(string s) { return XmlConvert.ToUInt64(s); } public override string ConvertObjectToXml(object value) { return XmlConvert.ToString((ulong)value); } protected override object GetEmptyStorage(int recordCount) { return new ulong[recordCount]; } protected override void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { ((ulong[])store)[storeIndex] = _values[record]; nullbits.Set(storeIndex, !HasValue(record)); } protected override void SetStorage(object store, BitArray nullbits) { _values = (ulong[])store; SetNullStorage(nullbits); } } public enum IdentifierCase { Unknown, Insensitive, Sensitive } [Serializable] internal sealed class DBConnectionString { private static class KEY { internal const string Password = "password"; internal const string PersistSecurityInfo = "persist security info"; internal const string Pwd = "pwd"; } private readonly string _encryptedUsersConnectionString; private readonly Dictionary _parsetable; private readonly NameValuePair _keychain; private readonly bool _hasPassword; private readonly string[] _restrictionValues; private readonly string _restrictions; private readonly KeyRestrictionBehavior _behavior; private readonly string _encryptedActualConnectionString; internal KeyRestrictionBehavior Behavior => _behavior; internal string ConnectionString => _encryptedUsersConnectionString; internal bool IsEmpty => _keychain == null; internal NameValuePair KeyChain => _keychain; internal string Restrictions { get { string text = _restrictions; if (text == null) { string[] restrictionValues = _restrictionValues; if (restrictionValues != null && restrictionValues.Length != 0) { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < restrictionValues.Length; i++) { if (!string.IsNullOrEmpty(restrictionValues[i])) { stringBuilder.Append(restrictionValues[i]); stringBuilder.Append("=;"); } } text = stringBuilder.ToString(); } } if (text == null) { return ""; } return text; } } internal string this[string keyword] => _parsetable[keyword]; internal DBConnectionString(string value, string restrictions, KeyRestrictionBehavior behavior, Dictionary synonyms, bool useOdbcRules) : this(new DbConnectionOptions(value, synonyms, useOdbcRules), restrictions, behavior, synonyms, mustCloneDictionary: false) { } internal DBConnectionString(DbConnectionOptions connectionOptions) : this(connectionOptions, null, KeyRestrictionBehavior.AllowOnly, null, mustCloneDictionary: true) { } private DBConnectionString(DbConnectionOptions connectionOptions, string restrictions, KeyRestrictionBehavior behavior, Dictionary synonyms, bool mustCloneDictionary) { if ((uint)behavior <= 1u) { _behavior = behavior; _encryptedUsersConnectionString = connectionOptions.UsersConnectionString(hidePassword: false); _hasPassword = connectionOptions._hasPasswordKeyword; _parsetable = connectionOptions.Parsetable; _keychain = connectionOptions._keyChain; if (_hasPassword && !connectionOptions.HasPersistablePassword) { if (mustCloneDictionary) { _parsetable = new Dictionary(_parsetable); } if (_parsetable.ContainsKey("password")) { _parsetable["password"] = "*"; } if (_parsetable.ContainsKey("pwd")) { _parsetable["pwd"] = "*"; } _keychain = connectionOptions.ReplacePasswordPwd(out _encryptedUsersConnectionString, fakePassword: true); } if (!string.IsNullOrEmpty(restrictions)) { _restrictionValues = ParseRestrictions(restrictions, synonyms); _restrictions = restrictions; } return; } throw ADP.InvalidKeyRestrictionBehavior(behavior); } private DBConnectionString(DBConnectionString connectionString, string[] restrictionValues, KeyRestrictionBehavior behavior) { _encryptedUsersConnectionString = connectionString._encryptedUsersConnectionString; _parsetable = connectionString._parsetable; _keychain = connectionString._keychain; _hasPassword = connectionString._hasPassword; _restrictionValues = restrictionValues; _restrictions = null; _behavior = behavior; } internal bool ContainsKey(string keyword) { return _parsetable.ContainsKey(keyword); } internal DBConnectionString Intersect(DBConnectionString entry) { KeyRestrictionBehavior behavior = _behavior; string[] restrictionValues = null; if (entry == null) { behavior = KeyRestrictionBehavior.AllowOnly; } else if (_behavior != entry._behavior) { behavior = KeyRestrictionBehavior.AllowOnly; if (entry._behavior == KeyRestrictionBehavior.AllowOnly) { if (!ADP.IsEmptyArray(_restrictionValues)) { if (!ADP.IsEmptyArray(entry._restrictionValues)) { restrictionValues = NewRestrictionAllowOnly(entry._restrictionValues, _restrictionValues); } } else { restrictionValues = entry._restrictionValues; } } else if (!ADP.IsEmptyArray(_restrictionValues)) { restrictionValues = (ADP.IsEmptyArray(entry._restrictionValues) ? _restrictionValues : NewRestrictionAllowOnly(_restrictionValues, entry._restrictionValues)); } } else if (KeyRestrictionBehavior.PreventUsage == _behavior) { restrictionValues = (ADP.IsEmptyArray(_restrictionValues) ? entry._restrictionValues : ((!ADP.IsEmptyArray(entry._restrictionValues)) ? NoDuplicateUnion(_restrictionValues, entry._restrictionValues) : _restrictionValues)); } else if (!ADP.IsEmptyArray(_restrictionValues) && !ADP.IsEmptyArray(entry._restrictionValues)) { restrictionValues = ((_restrictionValues.Length > entry._restrictionValues.Length) ? NewRestrictionIntersect(entry._restrictionValues, _restrictionValues) : NewRestrictionIntersect(_restrictionValues, entry._restrictionValues)); } return new DBConnectionString(this, restrictionValues, behavior); } [Conditional("DEBUG")] private void ValidateCombinedSet(DBConnectionString componentSet, DBConnectionString combinedSet) { if (componentSet == null || combinedSet._restrictionValues == null || componentSet._restrictionValues == null) { return; } if (componentSet._behavior == KeyRestrictionBehavior.AllowOnly) { if (combinedSet._behavior != 0) { _ = combinedSet._behavior; _ = 1; } } else if (componentSet._behavior == KeyRestrictionBehavior.PreventUsage && combinedSet._behavior != 0) { _ = combinedSet._behavior; _ = 1; } } private bool IsRestrictedKeyword(string key) { if (_restrictionValues != null) { return 0 > Array.BinarySearch(_restrictionValues, key, (IComparer?)StringComparer.Ordinal); } return true; } internal bool IsSupersetOf(DBConnectionString entry) { switch (_behavior) { case KeyRestrictionBehavior.AllowOnly: { for (NameValuePair nameValuePair = entry.KeyChain; nameValuePair != null; nameValuePair = nameValuePair.Next) { if (!ContainsKey(nameValuePair.Name) && IsRestrictedKeyword(nameValuePair.Name)) { return false; } } break; } case KeyRestrictionBehavior.PreventUsage: { if (_restrictionValues == null) { break; } string[] restrictionValues = _restrictionValues; foreach (string keyword in restrictionValues) { if (entry.ContainsKey(keyword)) { return false; } } break; } default: throw ADP.InvalidKeyRestrictionBehavior(_behavior); } return true; } private static string[] NewRestrictionAllowOnly(string[] allowonly, string[] preventusage) { List list = null; for (int i = 0; i < allowonly.Length; i++) { if (0 > Array.BinarySearch(preventusage, allowonly[i], (IComparer?)StringComparer.Ordinal)) { if (list == null) { list = new List(); } list.Add(allowonly[i]); } } string[] result = null; if (list != null) { result = list.ToArray(); } return result; } private static string[] NewRestrictionIntersect(string[] a, string[] b) { List list = null; for (int i = 0; i < a.Length; i++) { if (0 <= Array.BinarySearch(b, a[i], (IComparer?)StringComparer.Ordinal)) { if (list == null) { list = new List(); } list.Add(a[i]); } } string[] result = null; if (list != null) { result = list.ToArray(); } return result; } private static string[] NoDuplicateUnion(string[] a, string[] b) { List list = new List(a.Length + b.Length); for (int i = 0; i < a.Length; i++) { list.Add(a[i]); } for (int j = 0; j < b.Length; j++) { if (0 > Array.BinarySearch(a, b[j], (IComparer?)StringComparer.Ordinal)) { list.Add(b[j]); } } string[] array = list.ToArray(); Array.Sort(array, (IComparer?)StringComparer.Ordinal); return array; } private static string[] ParseRestrictions(string restrictions, Dictionary synonyms) { List list = new List(); StringBuilder buffer = new StringBuilder(restrictions.Length); int num = 0; int length = restrictions.Length; while (num < length) { int currentPosition = num; num = DbConnectionOptions.GetKeyValuePair(restrictions, currentPosition, buffer, useOdbcRules: false, out var keyname, out var _); if (!string.IsNullOrEmpty(keyname)) { string text = ((synonyms != null) ? synonyms[keyname] : keyname); if (string.IsNullOrEmpty(text)) { throw ADP.KeywordNotSupported(keyname); } list.Add(text); } } return RemoveDuplicates(list.ToArray()); } internal static string[] RemoveDuplicates(string[] restrictions) { int num = restrictions.Length; if (0 < num) { Array.Sort(restrictions, (IComparer?)StringComparer.Ordinal); for (int i = 1; i < restrictions.Length; i++) { string text = restrictions[i - 1]; if (text.Length == 0 || text == restrictions[i]) { restrictions[i - 1] = null; num--; } } if (restrictions[^1].Length == 0) { restrictions[^1] = null; num--; } if (num != restrictions.Length) { string[] array = new string[num]; num = 0; for (int j = 0; j < restrictions.Length; j++) { if (restrictions[j] != null) { array[num++] = restrictions[j]; } } restrictions = array; } } return restrictions; } [Conditional("DEBUG")] private static void Verify(string[] restrictionValues) { if (restrictionValues != null) { for (int i = 1; i < restrictionValues.Length; i++) { } } } } [Serializable] internal sealed class NameValuePermission : IComparable { private string _value; private DBConnectionString _entry; private NameValuePermission[] _tree; internal static readonly NameValuePermission Default; internal NameValuePermission() { } private NameValuePermission(string keyword) { _value = keyword; } private NameValuePermission(string value, DBConnectionString entry) { _value = value; _entry = entry; } private NameValuePermission(NameValuePermission permit) { _value = permit._value; _entry = permit._entry; _tree = permit._tree; if (_tree == null) { return; } NameValuePermission[] array = _tree.Clone() as NameValuePermission[]; for (int i = 0; i < array.Length; i++) { if (array[i] != null) { array[i] = array[i].CopyNameValue(); } } _tree = array; } int IComparable.CompareTo(object a) { return StringComparer.Ordinal.Compare(_value, ((NameValuePermission)a)._value); } internal static void AddEntry(NameValuePermission kvtree, ArrayList entries, DBConnectionString entry) { if (entry.KeyChain != null) { for (NameValuePair nameValuePair = entry.KeyChain; nameValuePair != null; nameValuePair = nameValuePair.Next) { NameValuePermission nameValuePermission = kvtree.CheckKeyForValue(nameValuePair.Name); if (nameValuePermission == null) { nameValuePermission = new NameValuePermission(nameValuePair.Name); kvtree.Add(nameValuePermission); } kvtree = nameValuePermission; nameValuePermission = kvtree.CheckKeyForValue(nameValuePair.Value); if (nameValuePermission == null) { DBConnectionString dBConnectionString = ((nameValuePair.Next != null) ? null : entry); nameValuePermission = new NameValuePermission(nameValuePair.Value, dBConnectionString); kvtree.Add(nameValuePermission); if (dBConnectionString != null) { entries.Add(dBConnectionString); } } else if (nameValuePair.Next == null) { if (nameValuePermission._entry != null) { entries.Remove(nameValuePermission._entry); nameValuePermission._entry = nameValuePermission._entry.Intersect(entry); } else { nameValuePermission._entry = entry; } entries.Add(nameValuePermission._entry); } kvtree = nameValuePermission; } } else { DBConnectionString entry2 = kvtree._entry; if (entry2 != null) { entries.Remove(entry2); kvtree._entry = entry2.Intersect(entry); } else { kvtree._entry = entry; } entries.Add(kvtree._entry); } } internal void Intersect(ArrayList entries, NameValuePermission target) { if (target == null) { _tree = null; _entry = null; return; } if (_entry != null) { entries.Remove(_entry); _entry = _entry.Intersect(target._entry); entries.Add(_entry); } else if (target._entry != null) { _entry = target._entry.Intersect(null); entries.Add(_entry); } if (_tree == null) { return; } int num = _tree.Length; for (int i = 0; i < _tree.Length; i++) { NameValuePermission nameValuePermission = target.CheckKeyForValue(_tree[i]._value); if (nameValuePermission != null) { _tree[i].Intersect(entries, nameValuePermission); continue; } _tree[i] = null; num--; } if (num == 0) { _tree = null; } else { if (num >= _tree.Length) { return; } NameValuePermission[] array = new NameValuePermission[num]; int j = 0; int num2 = 0; for (; j < _tree.Length; j++) { if (_tree[j] != null) { array[num2++] = _tree[j]; } } _tree = array; } } private void Add(NameValuePermission permit) { NameValuePermission[] tree = _tree; int num = ((tree != null) ? tree.Length : 0); NameValuePermission[] array = new NameValuePermission[1 + num]; for (int i = 0; i < array.Length - 1; i++) { array[i] = tree[i]; } array[num] = permit; Array.Sort(array); _tree = array; } internal bool CheckValueForKeyPermit(DBConnectionString parsetable) { if (parsetable == null) { return false; } bool flag = false; NameValuePermission[] tree = _tree; if (tree != null) { flag = parsetable.IsEmpty; if (!flag) { foreach (NameValuePermission nameValuePermission in tree) { if (nameValuePermission == null) { continue; } string value = nameValuePermission._value; if (parsetable.ContainsKey(value)) { string keyInQuestion = parsetable[value]; NameValuePermission nameValuePermission2 = nameValuePermission.CheckKeyForValue(keyInQuestion); if (nameValuePermission2 == null) { return false; } if (!nameValuePermission2.CheckValueForKeyPermit(parsetable)) { return false; } flag = true; } } } } DBConnectionString entry = _entry; if (entry != null) { flag = entry.IsSupersetOf(parsetable); } return flag; } private NameValuePermission CheckKeyForValue(string keyInQuestion) { NameValuePermission[] tree = _tree; if (tree != null) { foreach (NameValuePermission nameValuePermission in tree) { if (string.Equals(keyInQuestion, nameValuePermission._value, StringComparison.OrdinalIgnoreCase)) { return nameValuePermission; } } } return null; } internal NameValuePermission CopyNameValue() { return new NameValuePermission(this); } } internal static class ActivityCorrelator { internal class ActivityId { internal Guid Id { get; private set; } internal uint Sequence { get; private set; } internal ActivityId() { Id = Guid.NewGuid(); Sequence = 0u; } internal ActivityId(ActivityId activity) { Id = activity.Id; Sequence = activity.Sequence; } internal void Increment() { uint sequence = Sequence + 1; Sequence = sequence; } public override string ToString() { return string.Format(CultureInfo.InvariantCulture, "{0}:{1}", Id, Sequence); } } [ThreadStatic] private static ActivityId t_tlsActivity; internal static ActivityId Current { get { if (t_tlsActivity == null) { t_tlsActivity = new ActivityId(); } return new ActivityId(t_tlsActivity); } } internal static ActivityId Next() { if (t_tlsActivity == null) { t_tlsActivity = new ActivityId(); } t_tlsActivity.Increment(); return new ActivityId(t_tlsActivity); } } internal static class DbConnectionStringBuilderUtil { private const string ApplicationIntentReadWriteString = "ReadWrite"; private const string ApplicationIntentReadOnlyString = "ReadOnly"; internal static bool ConvertToBoolean(object value) { if (value is string text) { if (StringComparer.OrdinalIgnoreCase.Equals(text, "true") || StringComparer.OrdinalIgnoreCase.Equals(text, "yes")) { return true; } if (StringComparer.OrdinalIgnoreCase.Equals(text, "false") || StringComparer.OrdinalIgnoreCase.Equals(text, "no")) { return false; } string x = text.Trim(); if (StringComparer.OrdinalIgnoreCase.Equals(x, "true") || StringComparer.OrdinalIgnoreCase.Equals(x, "yes")) { return true; } if (StringComparer.OrdinalIgnoreCase.Equals(x, "false") || StringComparer.OrdinalIgnoreCase.Equals(x, "no")) { return false; } return bool.Parse(text); } try { return Convert.ToBoolean(value); } catch (InvalidCastException innerException) { throw ADP.ConvertFailed(value.GetType(), typeof(bool), innerException); } } internal static bool ConvertToIntegratedSecurity(object value) { if (value is string text) { if (StringComparer.OrdinalIgnoreCase.Equals(text, "sspi") || StringComparer.OrdinalIgnoreCase.Equals(text, "true") || StringComparer.OrdinalIgnoreCase.Equals(text, "yes")) { return true; } if (StringComparer.OrdinalIgnoreCase.Equals(text, "false") || StringComparer.OrdinalIgnoreCase.Equals(text, "no")) { return false; } string x = text.Trim(); if (StringComparer.OrdinalIgnoreCase.Equals(x, "sspi") || StringComparer.OrdinalIgnoreCase.Equals(x, "true") || StringComparer.OrdinalIgnoreCase.Equals(x, "yes")) { return true; } if (StringComparer.OrdinalIgnoreCase.Equals(x, "false") || StringComparer.OrdinalIgnoreCase.Equals(x, "no")) { return false; } return bool.Parse(text); } try { return Convert.ToBoolean(value); } catch (InvalidCastException innerException) { throw ADP.ConvertFailed(value.GetType(), typeof(bool), innerException); } } internal static int ConvertToInt32(object value) { try { return Convert.ToInt32(value); } catch (InvalidCastException innerException) { throw ADP.ConvertFailed(value.GetType(), typeof(int), innerException); } } internal static string ConvertToString(object value) { try { return Convert.ToString(value); } catch (InvalidCastException innerException) { throw ADP.ConvertFailed(value.GetType(), typeof(string), innerException); } } internal static bool TryConvertToApplicationIntent(string value, out ApplicationIntent result) { if (StringComparer.OrdinalIgnoreCase.Equals(value, "ReadOnly")) { result = ApplicationIntent.ReadOnly; return true; } if (StringComparer.OrdinalIgnoreCase.Equals(value, "ReadWrite")) { result = ApplicationIntent.ReadWrite; return true; } result = ApplicationIntent.ReadWrite; return false; } internal static bool IsValidApplicationIntentValue(ApplicationIntent value) { if (value != ApplicationIntent.ReadOnly) { return value == ApplicationIntent.ReadWrite; } return true; } internal static string ApplicationIntentToString(ApplicationIntent value) { if (value == ApplicationIntent.ReadOnly) { return "ReadOnly"; } return "ReadWrite"; } internal static ApplicationIntent ConvertToApplicationIntent(string keyword, object value) { if (value is string text) { if (TryConvertToApplicationIntent(text, out var result)) { return result; } string value2 = text.Trim(); if (TryConvertToApplicationIntent(value2, out result)) { return result; } throw ADP.InvalidConnectionOptionValue(keyword); } ApplicationIntent applicationIntent; if (value is ApplicationIntent) { applicationIntent = (ApplicationIntent)value; } else { if (value.GetType().GetTypeInfo().IsEnum) { throw ADP.ConvertFailed(value.GetType(), typeof(ApplicationIntent), null); } try { applicationIntent = (ApplicationIntent)Enum.ToObject(typeof(ApplicationIntent), value); } catch (ArgumentException innerException) { throw ADP.ConvertFailed(value.GetType(), typeof(ApplicationIntent), innerException); } } if (IsValidApplicationIntentValue(applicationIntent)) { return applicationIntent; } throw ADP.InvalidEnumerationValue(typeof(ApplicationIntent), (int)applicationIntent); } } internal static class DbConnectionStringDefaults { internal const ApplicationIntent ApplicationIntent = ApplicationIntent.ReadWrite; internal const string ApplicationName = "Core .Net SqlClient Data Provider"; internal const string AttachDBFilename = ""; internal const int ConnectTimeout = 15; internal const string CurrentLanguage = ""; internal const string DataSource = ""; internal const bool Encrypt = false; internal const bool Enlist = true; internal const string FailoverPartner = ""; internal const string InitialCatalog = ""; internal const bool IntegratedSecurity = false; internal const int LoadBalanceTimeout = 0; internal const bool MultipleActiveResultSets = false; internal const bool MultiSubnetFailover = false; internal const int MaxPoolSize = 100; internal const int MinPoolSize = 0; internal const int PacketSize = 8000; internal const string Password = ""; internal const bool PersistSecurityInfo = false; internal const bool Pooling = true; internal const bool TrustServerCertificate = false; internal const string TypeSystemVersion = "Latest"; internal const string UserID = ""; internal const bool UserInstance = false; internal const bool Replication = false; internal const string WorkstationID = ""; internal const string TransactionBinding = "Implicit Unbind"; internal const int ConnectRetryCount = 1; internal const int ConnectRetryInterval = 10; } internal static class DbConnectionStringKeywords { internal const string ApplicationIntent = "ApplicationIntent"; internal const string ApplicationName = "Application Name"; internal const string AsynchronousProcessing = "Asynchronous Processing"; internal const string AttachDBFilename = "AttachDbFilename"; internal const string ConnectTimeout = "Connect Timeout"; internal const string ConnectionReset = "Connection Reset"; internal const string ContextConnection = "Context Connection"; internal const string CurrentLanguage = "Current Language"; internal const string Encrypt = "Encrypt"; internal const string FailoverPartner = "Failover Partner"; internal const string InitialCatalog = "Initial Catalog"; internal const string MultipleActiveResultSets = "MultipleActiveResultSets"; internal const string MultiSubnetFailover = "MultiSubnetFailover"; internal const string NetworkLibrary = "Network Library"; internal const string PacketSize = "Packet Size"; internal const string Replication = "Replication"; internal const string TransactionBinding = "Transaction Binding"; internal const string TrustServerCertificate = "TrustServerCertificate"; internal const string TypeSystemVersion = "Type System Version"; internal const string UserInstance = "User Instance"; internal const string WorkstationID = "Workstation ID"; internal const string ConnectRetryCount = "ConnectRetryCount"; internal const string ConnectRetryInterval = "ConnectRetryInterval"; internal const string DataSource = "Data Source"; internal const string IntegratedSecurity = "Integrated Security"; internal const string Password = "Password"; internal const string Driver = "Driver"; internal const string PersistSecurityInfo = "Persist Security Info"; internal const string UserID = "User ID"; internal const string Enlist = "Enlist"; internal const string LoadBalanceTimeout = "Load Balance Timeout"; internal const string MaxPoolSize = "Max Pool Size"; internal const string Pooling = "Pooling"; internal const string MinPoolSize = "Min Pool Size"; } internal static class DbConnectionStringSynonyms { internal const string Async = "async"; internal const string APP = "app"; internal const string EXTENDEDPROPERTIES = "extended properties"; internal const string INITIALFILENAME = "initial file name"; internal const string CONNECTIONTIMEOUT = "connection timeout"; internal const string TIMEOUT = "timeout"; internal const string LANGUAGE = "language"; internal const string ADDR = "addr"; internal const string ADDRESS = "address"; internal const string SERVER = "server"; internal const string NETWORKADDRESS = "network address"; internal const string DATABASE = "database"; internal const string TRUSTEDCONNECTION = "trusted_connection"; internal const string ConnectionLifetime = "connection lifetime"; internal const string NET = "net"; internal const string NETWORK = "network"; internal const string Pwd = "pwd"; internal const string PERSISTSECURITYINFO = "persistsecurityinfo"; internal const string UID = "uid"; internal const string User = "user"; internal const string WSID = "wsid"; } [Serializable] [SecurityPermission(SecurityAction.InheritanceDemand, ControlEvidence = true, ControlPolicy = true)] public abstract class DBDataPermission : CodeAccessPermission, IUnrestrictedPermission { private static class XmlStr { internal const string _class = "class"; internal const string _IPermission = "IPermission"; internal const string _Permission = "Permission"; internal const string _Unrestricted = "Unrestricted"; internal const string _AllowBlankPassword = "AllowBlankPassword"; internal const string _true = "true"; internal const string _Version = "version"; internal const string _VersionNumber = "1"; internal const string _add = "add"; internal const string _ConnectionString = "ConnectionString"; internal const string _KeyRestrictions = "KeyRestrictions"; internal const string _KeyRestrictionBehavior = "KeyRestrictionBehavior"; } private bool _isUnrestricted; private bool _allowBlankPassword; private NameValuePermission _keyvaluetree = NameValuePermission.Default; private ArrayList _keyvalues; public bool AllowBlankPassword { get { return _allowBlankPassword; } set { _allowBlankPassword = value; } } [Obsolete("DBDataPermission() has been deprecated. Use the DBDataPermission(PermissionState.None) constructor. http://go.microsoft.com/fwlink/?linkid=14202", true)] protected DBDataPermission() : this(PermissionState.None) { } protected DBDataPermission(PermissionState state) { switch (state) { case PermissionState.Unrestricted: _isUnrestricted = true; break; case PermissionState.None: _isUnrestricted = false; break; default: throw ADP.InvalidPermissionState(state); } } [Obsolete("DBDataPermission(PermissionState state,Boolean allowBlankPassword) has been deprecated. Use the DBDataPermission(PermissionState.None) constructor. http://go.microsoft.com/fwlink/?linkid=14202", true)] protected DBDataPermission(PermissionState state, bool allowBlankPassword) : this(state) { AllowBlankPassword = allowBlankPassword; } protected DBDataPermission(DBDataPermission permission) { if (permission == null) { throw ADP.ArgumentNull("permissionAttribute"); } CopyFrom(permission); } protected DBDataPermission(DBDataPermissionAttribute permissionAttribute) { if (permissionAttribute == null) { throw ADP.ArgumentNull("permissionAttribute"); } _isUnrestricted = permissionAttribute.Unrestricted; if (!_isUnrestricted) { _allowBlankPassword = permissionAttribute.AllowBlankPassword; if (permissionAttribute.ShouldSerializeConnectionString() || permissionAttribute.ShouldSerializeKeyRestrictions()) { Add(permissionAttribute.ConnectionString, permissionAttribute.KeyRestrictions, permissionAttribute.KeyRestrictionBehavior); } } } internal DBDataPermission(DbConnectionOptions connectionOptions) { if (connectionOptions != null) { _allowBlankPassword = connectionOptions.HasBlankPassword; AddPermissionEntry(new DBConnectionString(connectionOptions)); } } public virtual void Add(string connectionString, string restrictions, KeyRestrictionBehavior behavior) { DBConnectionString entry = new DBConnectionString(connectionString, restrictions, behavior, null, useOdbcRules: false); AddPermissionEntry(entry); } internal void AddPermissionEntry(DBConnectionString entry) { if (_keyvaluetree == null) { _keyvaluetree = new NameValuePermission(); } if (_keyvalues == null) { _keyvalues = new ArrayList(); } NameValuePermission.AddEntry(_keyvaluetree, _keyvalues, entry); _isUnrestricted = false; } protected void Clear() { _keyvaluetree = null; _keyvalues = null; } public override IPermission Copy() { DBDataPermission dBDataPermission = CreateInstance(); dBDataPermission.CopyFrom(this); return (IPermission)dBDataPermission; } private void CopyFrom(DBDataPermission permission) { _isUnrestricted = permission.IsUnrestricted(); if (_isUnrestricted) { return; } _allowBlankPassword = permission.AllowBlankPassword; if (permission._keyvalues != null) { _keyvalues = (ArrayList)permission._keyvalues.Clone(); if (permission._keyvaluetree != null) { _keyvaluetree = permission._keyvaluetree.CopyNameValue(); } } } [PermissionSet(SecurityAction.Demand, Name = "FullTrust")] protected virtual DBDataPermission CreateInstance() { return Activator.CreateInstance(((object)this).GetType(), BindingFlags.Instance | BindingFlags.Public, null, null, CultureInfo.InvariantCulture, null) as DBDataPermission; } public override IPermission Intersect(IPermission target) { if (target == null) { return null; } if (target.GetType() != ((object)this).GetType()) { throw ADP.PermissionTypeMismatch(); } if (IsUnrestricted()) { return target.Copy(); } DBDataPermission dBDataPermission = (DBDataPermission)target; if (dBDataPermission.IsUnrestricted()) { return ((CodeAccessPermission)this).Copy(); } DBDataPermission dBDataPermission2 = (DBDataPermission)((CodeAccessPermission)dBDataPermission).Copy(); dBDataPermission2._allowBlankPassword &= AllowBlankPassword; if (_keyvalues != null && dBDataPermission2._keyvalues != null) { dBDataPermission2._keyvalues.Clear(); dBDataPermission2._keyvaluetree.Intersect(dBDataPermission2._keyvalues, _keyvaluetree); } else { dBDataPermission2._keyvalues = null; dBDataPermission2._keyvaluetree = null; } if (dBDataPermission2.IsEmpty()) { dBDataPermission2 = null; } return (IPermission)dBDataPermission2; } private bool IsEmpty() { ArrayList keyvalues = _keyvalues; if (!IsUnrestricted() && !AllowBlankPassword) { if (keyvalues != null) { return keyvalues.Count == 0; } return true; } return false; } public override bool IsSubsetOf(IPermission target) { if (target == null) { return IsEmpty(); } if (target.GetType() != ((object)this).GetType()) { throw ADP.PermissionTypeMismatch(); } DBDataPermission dBDataPermission = target as DBDataPermission; bool flag = dBDataPermission.IsUnrestricted(); if (!flag && !IsUnrestricted() && (!AllowBlankPassword || dBDataPermission.AllowBlankPassword) && (_keyvalues == null || dBDataPermission._keyvaluetree != null)) { flag = true; if (_keyvalues != null) { foreach (DBConnectionString keyvalue in _keyvalues) { if (!dBDataPermission._keyvaluetree.CheckValueForKeyPermit(keyvalue)) { flag = false; break; } } } } return flag; } public bool IsUnrestricted() { return _isUnrestricted; } public override IPermission Union(IPermission target) { if (target == null) { return ((CodeAccessPermission)this).Copy(); } if (target.GetType() != ((object)this).GetType()) { throw ADP.PermissionTypeMismatch(); } if (IsUnrestricted()) { return ((CodeAccessPermission)this).Copy(); } DBDataPermission dBDataPermission = (DBDataPermission)target.Copy(); if (!dBDataPermission.IsUnrestricted()) { dBDataPermission._allowBlankPassword |= AllowBlankPassword; if (_keyvalues != null) { foreach (DBConnectionString keyvalue in _keyvalues) { dBDataPermission.AddPermissionEntry(keyvalue); } } } if (!dBDataPermission.IsEmpty()) { return (IPermission)dBDataPermission; } return null; } private string DecodeXmlValue(string value) { if (value != null && 0 < value.Length) { value = value.Replace(""", "\""); value = value.Replace("'", "'"); value = value.Replace("<", "<"); value = value.Replace(">", ">"); value = value.Replace("&", "&"); } return value; } private string EncodeXmlValue(string value) { if (value != null && 0 < value.Length) { value = value.Replace('\0', ' '); value = value.Trim(); value = value.Replace("&", "&"); value = value.Replace(">", ">"); value = value.Replace("<", "<"); value = value.Replace("'", "'"); value = value.Replace("\"", """); } return value; } public override void FromXml(SecurityElement securityElement) { if (securityElement == null) { throw ADP.ArgumentNull("securityElement"); } string tag = securityElement.Tag; if (!tag.Equals("Permission") && !tag.Equals("IPermission")) { throw ADP.NotAPermissionElement(); } string text = securityElement.Attribute("version"); if (text != null && !text.Equals("1")) { throw ADP.InvalidXMLBadVersion(); } string text2 = securityElement.Attribute("Unrestricted"); _isUnrestricted = text2 != null && bool.Parse(text2); Clear(); if (!_isUnrestricted) { string text3 = securityElement.Attribute("AllowBlankPassword"); _allowBlankPassword = text3 != null && bool.Parse(text3); ArrayList children = securityElement.Children; if (children == null) { return; } { foreach (SecurityElement item in children) { tag = item.Tag; if ("add" == tag || (tag != null && "add" == tag.ToLower(CultureInfo.InvariantCulture))) { string value = item.Attribute("ConnectionString"); string value2 = item.Attribute("KeyRestrictions"); string text4 = item.Attribute("KeyRestrictionBehavior"); KeyRestrictionBehavior behavior = KeyRestrictionBehavior.AllowOnly; if (text4 != null) { behavior = (KeyRestrictionBehavior)Enum.Parse(typeof(KeyRestrictionBehavior), text4, ignoreCase: true); } value = DecodeXmlValue(value); value2 = DecodeXmlValue(value2); Add(value, value2, behavior); } } return; } } _allowBlankPassword = false; } public override SecurityElement ToXml() { Type type = ((object)this).GetType(); SecurityElement securityElement = new SecurityElement("IPermission"); securityElement.AddAttribute("class", type.AssemblyQualifiedName.Replace('"', '\'')); securityElement.AddAttribute("version", "1"); if (IsUnrestricted()) { securityElement.AddAttribute("Unrestricted", "true"); } else { securityElement.AddAttribute("AllowBlankPassword", _allowBlankPassword.ToString(CultureInfo.InvariantCulture)); if (_keyvalues != null) { foreach (DBConnectionString keyvalue in _keyvalues) { SecurityElement securityElement2 = new SecurityElement("add"); string connectionString = keyvalue.ConnectionString; connectionString = EncodeXmlValue(connectionString); if (!ADP.IsEmpty(connectionString)) { securityElement2.AddAttribute("ConnectionString", connectionString); } connectionString = keyvalue.Restrictions; connectionString = EncodeXmlValue(connectionString); if (connectionString == null) { connectionString = ADP.StrEmpty; } securityElement2.AddAttribute("KeyRestrictions", connectionString); connectionString = keyvalue.Behavior.ToString(); securityElement2.AddAttribute("KeyRestrictionBehavior", connectionString); securityElement.AddChild(securityElement2); } } } return securityElement; } } [Serializable] [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Constructor | AttributeTargets.Method, AllowMultiple = true, Inherited = false)] public abstract class DBDataPermissionAttribute : CodeAccessSecurityAttribute { private bool _allowBlankPassword; private string _connectionString; private string _restrictions; private KeyRestrictionBehavior _behavior; public bool AllowBlankPassword { get { return _allowBlankPassword; } set { _allowBlankPassword = value; } } public string ConnectionString { get { string connectionString = _connectionString; if (connectionString == null) { return string.Empty; } return connectionString; } set { _connectionString = value; } } public KeyRestrictionBehavior KeyRestrictionBehavior { get { return _behavior; } set { if ((uint)value <= 1u) { _behavior = value; return; } throw ADP.InvalidKeyRestrictionBehavior(value); } } public string KeyRestrictions { get { string restrictions = _restrictions; if (restrictions == null) { return ADP.StrEmpty; } return restrictions; } set { _restrictions = value; } } protected DBDataPermissionAttribute(SecurityAction action) : base(action) { } [EditorBrowsable(EditorBrowsableState.Never)] public bool ShouldSerializeConnectionString() { return _connectionString != null; } [EditorBrowsable(EditorBrowsableState.Never)] public bool ShouldSerializeKeyRestrictions() { return _restrictions != null; } } internal static class DbConnectionOptionKeywords { internal const string Driver = "driver"; internal const string Pwd = "pwd"; internal const string UID = "uid"; internal const string DataProvider = "data provider"; internal const string ExtendedProperties = "extended properties"; internal const string FileName = "file name"; internal const string Provider = "provider"; internal const string RemoteProvider = "remote provider"; internal const string Password = "password"; internal const string UserID = "user id"; } } namespace Microsoft.SqlServer.Server { internal enum ExtendedClrTypeCode { Invalid = -1, Boolean = 0, Byte = 1, Char = 2, DateTime = 3, DBNull = 4, Decimal = 5, Double = 6, Empty = 7, Int16 = 8, Int32 = 9, Int64 = 10, SByte = 11, Single = 12, String = 13, UInt16 = 14, UInt32 = 15, UInt64 = 16, Object = 17, ByteArray = 18, CharArray = 19, Guid = 20, SqlBinary = 21, SqlBoolean = 22, SqlByte = 23, SqlDateTime = 24, SqlDouble = 25, SqlGuid = 26, SqlInt16 = 27, SqlInt32 = 28, SqlInt64 = 29, SqlMoney = 30, SqlDecimal = 31, SqlSingle = 32, SqlString = 33, SqlChars = 34, SqlBytes = 35, SqlXml = 36, DataTable = 37, DbDataReader = 38, IEnumerableOfSqlDataRecord = 39, TimeSpan = 40, DateTimeOffset = 41, Stream = 42, TextReader = 43, XmlReader = 44, Last = 44, First = 0 } internal interface ITypedGetters { bool IsDBNull(int ordinal); SqlDbType GetVariantType(int ordinal); bool GetBoolean(int ordinal); byte GetByte(int ordinal); long GetBytes(int ordinal, long fieldOffset, byte[] buffer, int bufferOffset, int length); char GetChar(int ordinal); long GetChars(int ordinal, long fieldOffset, char[] buffer, int bufferOffset, int length); short GetInt16(int ordinal); int GetInt32(int ordinal); long GetInt64(int ordinal); float GetFloat(int ordinal); double GetDouble(int ordinal); string GetString(int ordinal); decimal GetDecimal(int ordinal); DateTime GetDateTime(int ordinal); Guid GetGuid(int ordinal); SqlBoolean GetSqlBoolean(int ordinal); SqlByte GetSqlByte(int ordinal); SqlInt16 GetSqlInt16(int ordinal); SqlInt32 GetSqlInt32(int ordinal); SqlInt64 GetSqlInt64(int ordinal); SqlSingle GetSqlSingle(int ordinal); SqlDouble GetSqlDouble(int ordinal); SqlMoney GetSqlMoney(int ordinal); SqlDateTime GetSqlDateTime(int ordinal); SqlDecimal GetSqlDecimal(int ordinal); SqlString GetSqlString(int ordinal); SqlBinary GetSqlBinary(int ordinal); SqlGuid GetSqlGuid(int ordinal); SqlChars GetSqlChars(int ordinal); SqlBytes GetSqlBytes(int ordinal); SqlXml GetSqlXml(int ordinal); SqlBytes GetSqlBytesRef(int ordinal); SqlChars GetSqlCharsRef(int ordinal); SqlXml GetSqlXmlRef(int ordinal); } internal interface ITypedGettersV3 { bool IsDBNull(SmiEventSink sink, int ordinal); SmiMetaData GetVariantType(SmiEventSink sink, int ordinal); bool GetBoolean(SmiEventSink sink, int ordinal); byte GetByte(SmiEventSink sink, int ordinal); long GetBytesLength(SmiEventSink sink, int ordinal); int GetBytes(SmiEventSink sink, int ordinal, long fieldOffset, byte[] buffer, int bufferOffset, int length); long GetCharsLength(SmiEventSink sink, int ordinal); int GetChars(SmiEventSink sink, int ordinal, long fieldOffset, char[] buffer, int bufferOffset, int length); string GetString(SmiEventSink sink, int ordinal); short GetInt16(SmiEventSink sink, int ordinal); int GetInt32(SmiEventSink sink, int ordinal); long GetInt64(SmiEventSink sink, int ordinal); float GetSingle(SmiEventSink sink, int ordinal); double GetDouble(SmiEventSink sink, int ordinal); SqlDecimal GetSqlDecimal(SmiEventSink sink, int ordinal); DateTime GetDateTime(SmiEventSink sink, int ordinal); Guid GetGuid(SmiEventSink sink, int ordinal); } internal interface ITypedSetters { void SetDBNull(int ordinal); void SetBoolean(int ordinal, bool value); void SetByte(int ordinal, byte value); void SetBytes(int ordinal, long fieldOffset, byte[] buffer, int bufferOffset, int length); void SetChar(int ordinal, char value); void SetChars(int ordinal, long fieldOffset, char[] buffer, int bufferOffset, int length); void SetInt16(int ordinal, short value); void SetInt32(int ordinal, int value); void SetInt64(int ordinal, long value); void SetFloat(int ordinal, float value); void SetDouble(int ordinal, double value); [Obsolete("Not supported as of SMI v2. Will be removed when v1 support dropped. Use setter with offset.")] void SetString(int ordinal, string value); void SetString(int ordinal, string value, int offset); void SetDecimal(int ordinal, decimal value); void SetDateTime(int ordinal, DateTime value); void SetGuid(int ordinal, Guid value); void SetSqlBoolean(int ordinal, SqlBoolean value); void SetSqlByte(int ordinal, SqlByte value); void SetSqlInt16(int ordinal, SqlInt16 value); void SetSqlInt32(int ordinal, SqlInt32 value); void SetSqlInt64(int ordinal, SqlInt64 value); void SetSqlSingle(int ordinal, SqlSingle value); void SetSqlDouble(int ordinal, SqlDouble value); void SetSqlMoney(int ordinal, SqlMoney value); void SetSqlDateTime(int ordinal, SqlDateTime value); void SetSqlDecimal(int ordinal, SqlDecimal value); [Obsolete("Not supported as of SMI v2. Will be removed when v1 support dropped. Use setter with offset.")] void SetSqlString(int ordinal, SqlString value); void SetSqlString(int ordinal, SqlString value, int offset); [Obsolete("Not supported as of SMI v2. Will be removed when v1 support dropped. Use setter with offset.")] void SetSqlBinary(int ordinal, SqlBinary value); void SetSqlBinary(int ordinal, SqlBinary value, int offset); void SetSqlGuid(int ordinal, SqlGuid value); [Obsolete("Not supported as of SMI v2. Will be removed when v1 support dropped. Use setter with offset.")] void SetSqlChars(int ordinal, SqlChars value); void SetSqlChars(int ordinal, SqlChars value, int offset); [Obsolete("Not supported as of SMI v2. Will be removed when v1 support dropped. Use setter with offset.")] void SetSqlBytes(int ordinal, SqlBytes value); void SetSqlBytes(int ordinal, SqlBytes value, int offset); void SetSqlXml(int ordinal, SqlXml value); } internal interface ITypedSettersV3 { void SetVariantMetaData(SmiEventSink sink, int ordinal, SmiMetaData metaData); void SetDBNull(SmiEventSink sink, int ordinal); void SetBoolean(SmiEventSink sink, int ordinal, bool value); void SetByte(SmiEventSink sink, int ordinal, byte value); int SetBytes(SmiEventSink sink, int ordinal, long fieldOffset, byte[] buffer, int bufferOffset, int length); void SetBytesLength(SmiEventSink sink, int ordinal, long length); int SetChars(SmiEventSink sink, int ordinal, long fieldOffset, char[] buffer, int bufferOffset, int length); void SetCharsLength(SmiEventSink sink, int ordinal, long length); void SetString(SmiEventSink sink, int ordinal, string value, int offset, int length); void SetInt16(SmiEventSink sink, int ordinal, short value); void SetInt32(SmiEventSink sink, int ordinal, int value); void SetInt64(SmiEventSink sink, int ordinal, long value); void SetSingle(SmiEventSink sink, int ordinal, float value); void SetDouble(SmiEventSink sink, int ordinal, double value); void SetSqlDecimal(SmiEventSink sink, int ordinal, SqlDecimal value); void SetDateTime(SmiEventSink sink, int ordinal, DateTime value); void SetGuid(SmiEventSink sink, int ordinal, Guid value); } internal sealed class MemoryRecordBuffer : SmiRecordBuffer { private SqlRecordBuffer[] _buffer; internal MemoryRecordBuffer(SmiMetaData[] metaData) { _buffer = new SqlRecordBuffer[metaData.Length]; for (int i = 0; i < _buffer.Length; i++) { _buffer[i] = new SqlRecordBuffer(metaData[i]); } } public override bool IsDBNull(SmiEventSink sink, int ordinal) { return _buffer[ordinal].IsNull; } public override SmiMetaData GetVariantType(SmiEventSink sink, int ordinal) { return _buffer[ordinal].VariantType; } public override bool GetBoolean(SmiEventSink sink, int ordinal) { return _buffer[ordinal].Boolean; } public override byte GetByte(SmiEventSink sink, int ordinal) { return _buffer[ordinal].Byte; } public override long GetBytesLength(SmiEventSink sink, int ordinal) { return _buffer[ordinal].BytesLength; } public override int GetBytes(SmiEventSink sink, int ordinal, long fieldOffset, byte[] buffer, int bufferOffset, int length) { return _buffer[ordinal].GetBytes(fieldOffset, buffer, bufferOffset, length); } public override long GetCharsLength(SmiEventSink sink, int ordinal) { return _buffer[ordinal].CharsLength; } public override int GetChars(SmiEventSink sink, int ordinal, long fieldOffset, char[] buffer, int bufferOffset, int length) { return _buffer[ordinal].GetChars(fieldOffset, buffer, bufferOffset, length); } public override string GetString(SmiEventSink sink, int ordinal) { return _buffer[ordinal].String; } public override short GetInt16(SmiEventSink sink, int ordinal) { return _buffer[ordinal].Int16; } public override int GetInt32(SmiEventSink sink, int ordinal) { return _buffer[ordinal].Int32; } public override long GetInt64(SmiEventSink sink, int ordinal) { return _buffer[ordinal].Int64; } public override float GetSingle(SmiEventSink sink, int ordinal) { return _buffer[ordinal].Single; } public override double GetDouble(SmiEventSink sink, int ordinal) { return _buffer[ordinal].Double; } public override SqlDecimal GetSqlDecimal(SmiEventSink sink, int ordinal) { return _buffer[ordinal].SqlDecimal; } public override DateTime GetDateTime(SmiEventSink sink, int ordinal) { return _buffer[ordinal].DateTime; } public override Guid GetGuid(SmiEventSink sink, int ordinal) { return _buffer[ordinal].Guid; } public override TimeSpan GetTimeSpan(SmiEventSink sink, int ordinal) { return _buffer[ordinal].TimeSpan; } public override DateTimeOffset GetDateTimeOffset(SmiEventSink sink, int ordinal) { return _buffer[ordinal].DateTimeOffset; } public override void SetDBNull(SmiEventSink sink, int ordinal) { _buffer[ordinal].SetNull(); } public override void SetBoolean(SmiEventSink sink, int ordinal, bool value) { _buffer[ordinal].Boolean = value; } public override void SetByte(SmiEventSink sink, int ordinal, byte value) { _buffer[ordinal].Byte = value; } public override int SetBytes(SmiEventSink sink, int ordinal, long fieldOffset, byte[] buffer, int bufferOffset, int length) { return _buffer[ordinal].SetBytes(fieldOffset, buffer, bufferOffset, length); } public override void SetBytesLength(SmiEventSink sink, int ordinal, long length) { _buffer[ordinal].BytesLength = length; } public override int SetChars(SmiEventSink sink, int ordinal, long fieldOffset, char[] buffer, int bufferOffset, int length) { return _buffer[ordinal].SetChars(fieldOffset, buffer, bufferOffset, length); } public override void SetCharsLength(SmiEventSink sink, int ordinal, long length) { _buffer[ordinal].CharsLength = length; } public override void SetString(SmiEventSink sink, int ordinal, string value, int offset, int length) { _buffer[ordinal].String = value.Substring(offset, length); } public override void SetInt16(SmiEventSink sink, int ordinal, short value) { _buffer[ordinal].Int16 = value; } public override void SetInt32(SmiEventSink sink, int ordinal, int value) { _buffer[ordinal].Int32 = value; } public override void SetInt64(SmiEventSink sink, int ordinal, long value) { _buffer[ordinal].Int64 = value; } public override void SetSingle(SmiEventSink sink, int ordinal, float value) { _buffer[ordinal].Single = value; } public override void SetDouble(SmiEventSink sink, int ordinal, double value) { _buffer[ordinal].Double = value; } public override void SetSqlDecimal(SmiEventSink sink, int ordinal, SqlDecimal value) { _buffer[ordinal].SqlDecimal = value; } public override void SetDateTime(SmiEventSink sink, int ordinal, DateTime value) { _buffer[ordinal].DateTime = value; } public override void SetGuid(SmiEventSink sink, int ordinal, Guid value) { _buffer[ordinal].Guid = value; } public override void SetTimeSpan(SmiEventSink sink, int ordinal, TimeSpan value) { _buffer[ordinal].TimeSpan = value; } public override void SetDateTimeOffset(SmiEventSink sink, int ordinal, DateTimeOffset value) { _buffer[ordinal].DateTimeOffset = value; } public override void SetVariantMetaData(SmiEventSink sink, int ordinal, SmiMetaData metaData) { _buffer[ordinal].VariantType = metaData; } } internal class MetaDataUtilsSmi { internal const SqlDbType InvalidSqlDbType = (SqlDbType)(-1); internal const long InvalidMaxLength = -2L; private static readonly SqlDbType[] s_extendedTypeCodeToSqlDbTypeMap = new SqlDbType[43] { (SqlDbType)(-1), SqlDbType.Bit, SqlDbType.TinyInt, SqlDbType.NVarChar, SqlDbType.DateTime, (SqlDbType)(-1), SqlDbType.Decimal, SqlDbType.Float, (SqlDbType)(-1), SqlDbType.SmallInt, SqlDbType.Int, SqlDbType.BigInt, (SqlDbType)(-1), SqlDbType.Real, SqlDbType.NVarChar, (SqlDbType)(-1), (SqlDbType)(-1), (SqlDbType)(-1), (SqlDbType)(-1), SqlDbType.VarBinary, SqlDbType.NVarChar, SqlDbType.UniqueIdentifier, SqlDbType.VarBinary, SqlDbType.Bit, SqlDbType.TinyInt, SqlDbType.DateTime, SqlDbType.Float, SqlDbType.UniqueIdentifier, SqlDbType.SmallInt, SqlDbType.Int, SqlDbType.BigInt, SqlDbType.Money, SqlDbType.Decimal, SqlDbType.Real, SqlDbType.NVarChar, SqlDbType.NVarChar, SqlDbType.VarBinary, SqlDbType.Xml, SqlDbType.Structured, SqlDbType.Structured, SqlDbType.Structured, SqlDbType.Time, SqlDbType.DateTimeOffset }; private static readonly Dictionary s_typeToExtendedTypeCodeMap = CreateTypeToExtendedTypeCodeMap(); private static Dictionary CreateTypeToExtendedTypeCodeMap() { return new Dictionary(42) { { typeof(bool), ExtendedClrTypeCode.Boolean }, { typeof(byte), ExtendedClrTypeCode.Byte }, { typeof(char), ExtendedClrTypeCode.Char }, { typeof(DateTime), ExtendedClrTypeCode.DateTime }, { typeof(DBNull), ExtendedClrTypeCode.DBNull }, { typeof(decimal), ExtendedClrTypeCode.Decimal }, { typeof(double), ExtendedClrTypeCode.Double }, { typeof(short), ExtendedClrTypeCode.Int16 }, { typeof(int), ExtendedClrTypeCode.Int32 }, { typeof(long), ExtendedClrTypeCode.Int64 }, { typeof(sbyte), ExtendedClrTypeCode.SByte }, { typeof(float), ExtendedClrTypeCode.Single }, { typeof(string), ExtendedClrTypeCode.String }, { typeof(ushort), ExtendedClrTypeCode.UInt16 }, { typeof(uint), ExtendedClrTypeCode.UInt32 }, { typeof(ulong), ExtendedClrTypeCode.UInt64 }, { typeof(object), ExtendedClrTypeCode.Object }, { typeof(byte[]), ExtendedClrTypeCode.ByteArray }, { typeof(char[]), ExtendedClrTypeCode.CharArray }, { typeof(Guid), ExtendedClrTypeCode.Guid }, { typeof(SqlBinary), ExtendedClrTypeCode.SqlBinary }, { typeof(SqlBoolean), ExtendedClrTypeCode.SqlBoolean }, { typeof(SqlByte), ExtendedClrTypeCode.SqlByte }, { typeof(SqlDateTime), ExtendedClrTypeCode.SqlDateTime }, { typeof(SqlDouble), ExtendedClrTypeCode.SqlDouble }, { typeof(SqlGuid), ExtendedClrTypeCode.SqlGuid }, { typeof(SqlInt16), ExtendedClrTypeCode.SqlInt16 }, { typeof(SqlInt32), ExtendedClrTypeCode.SqlInt32 }, { typeof(SqlInt64), ExtendedClrTypeCode.SqlInt64 }, { typeof(SqlMoney), ExtendedClrTypeCode.SqlMoney }, { typeof(SqlDecimal), ExtendedClrTypeCode.SqlDecimal }, { typeof(SqlSingle), ExtendedClrTypeCode.SqlSingle }, { typeof(SqlString), ExtendedClrTypeCode.SqlString }, { typeof(SqlChars), ExtendedClrTypeCode.SqlChars }, { typeof(SqlBytes), ExtendedClrTypeCode.SqlBytes }, { typeof(SqlXml), ExtendedClrTypeCode.SqlXml }, { typeof(DataTable), ExtendedClrTypeCode.DataTable }, { typeof(DbDataReader), ExtendedClrTypeCode.DbDataReader }, { typeof(IEnumerable), ExtendedClrTypeCode.IEnumerableOfSqlDataRecord }, { typeof(TimeSpan), ExtendedClrTypeCode.TimeSpan }, { typeof(DateTimeOffset), ExtendedClrTypeCode.DateTimeOffset } }; } internal static bool IsCharOrXmlType(SqlDbType type) { if (!IsUnicodeType(type) && !IsAnsiType(type)) { return type == SqlDbType.Xml; } return true; } internal static bool IsUnicodeType(SqlDbType type) { if (type != SqlDbType.NChar && type != SqlDbType.NVarChar) { return type == SqlDbType.NText; } return true; } internal static bool IsAnsiType(SqlDbType type) { if (type != SqlDbType.Char && type != SqlDbType.VarChar) { return type == SqlDbType.Text; } return true; } internal static bool IsBinaryType(SqlDbType type) { if (type != SqlDbType.Binary && type != SqlDbType.VarBinary) { return type == SqlDbType.Image; } return true; } internal static bool IsPlpFormat(SmiMetaData metaData) { if (metaData.MaxLength != -1 && metaData.SqlDbType != SqlDbType.Image && metaData.SqlDbType != SqlDbType.NText && metaData.SqlDbType != SqlDbType.Text) { return metaData.SqlDbType == SqlDbType.Udt; } return true; } internal static ExtendedClrTypeCode DetermineExtendedTypeCodeForUseWithSqlDbType(SqlDbType dbType, bool isMultiValued, object value) { ExtendedClrTypeCode extendedClrTypeCode = ExtendedClrTypeCode.Invalid; if (value == null) { extendedClrTypeCode = ExtendedClrTypeCode.Empty; } else if (DBNull.Value == value) { extendedClrTypeCode = ExtendedClrTypeCode.DBNull; } else { switch (dbType) { case SqlDbType.BigInt: if (value.GetType() == typeof(long)) { extendedClrTypeCode = ExtendedClrTypeCode.Int64; } else if (value.GetType() == typeof(SqlInt64)) { extendedClrTypeCode = ExtendedClrTypeCode.SqlInt64; } break; case SqlDbType.Binary: case SqlDbType.Image: case SqlDbType.Timestamp: case SqlDbType.VarBinary: if (value.GetType() == typeof(byte[])) { extendedClrTypeCode = ExtendedClrTypeCode.ByteArray; } else if (value.GetType() == typeof(SqlBinary)) { extendedClrTypeCode = ExtendedClrTypeCode.SqlBinary; } else if (value.GetType() == typeof(SqlBytes)) { extendedClrTypeCode = ExtendedClrTypeCode.SqlBytes; } else if (value.GetType() == typeof(StreamDataFeed)) { extendedClrTypeCode = ExtendedClrTypeCode.Stream; } break; case SqlDbType.Bit: if (value.GetType() == typeof(bool)) { extendedClrTypeCode = ExtendedClrTypeCode.Boolean; } else if (value.GetType() == typeof(SqlBoolean)) { extendedClrTypeCode = ExtendedClrTypeCode.SqlBoolean; } break; case SqlDbType.Char: case SqlDbType.NChar: case SqlDbType.NText: case SqlDbType.NVarChar: case SqlDbType.Text: case SqlDbType.VarChar: if (value.GetType() == typeof(string)) { extendedClrTypeCode = ExtendedClrTypeCode.String; } if (value.GetType() == typeof(TextDataFeed)) { extendedClrTypeCode = ExtendedClrTypeCode.TextReader; } else if (value.GetType() == typeof(SqlString)) { extendedClrTypeCode = ExtendedClrTypeCode.SqlString; } else if (value.GetType() == typeof(char[])) { extendedClrTypeCode = ExtendedClrTypeCode.CharArray; } else if (value.GetType() == typeof(SqlChars)) { extendedClrTypeCode = ExtendedClrTypeCode.SqlChars; } else if (value.GetType() == typeof(char)) { extendedClrTypeCode = ExtendedClrTypeCode.Char; } break; case SqlDbType.DateTime: case SqlDbType.SmallDateTime: case SqlDbType.Date: case SqlDbType.DateTime2: if (value.GetType() == typeof(DateTime)) { extendedClrTypeCode = ExtendedClrTypeCode.DateTime; } else if (value.GetType() == typeof(SqlDateTime)) { extendedClrTypeCode = ExtendedClrTypeCode.SqlDateTime; } break; case SqlDbType.Decimal: if (value.GetType() == typeof(decimal)) { extendedClrTypeCode = ExtendedClrTypeCode.Decimal; } else if (value.GetType() == typeof(SqlDecimal)) { extendedClrTypeCode = ExtendedClrTypeCode.SqlDecimal; } break; case SqlDbType.Real: if (value.GetType() == typeof(float)) { extendedClrTypeCode = ExtendedClrTypeCode.Single; } else if (value.GetType() == typeof(SqlSingle)) { extendedClrTypeCode = ExtendedClrTypeCode.SqlSingle; } break; case SqlDbType.Int: if (value.GetType() == typeof(int)) { extendedClrTypeCode = ExtendedClrTypeCode.Int32; } else if (value.GetType() == typeof(SqlInt32)) { extendedClrTypeCode = ExtendedClrTypeCode.SqlInt32; } break; case SqlDbType.Money: case SqlDbType.SmallMoney: if (value.GetType() == typeof(SqlMoney)) { extendedClrTypeCode = ExtendedClrTypeCode.SqlMoney; } else if (value.GetType() == typeof(decimal)) { extendedClrTypeCode = ExtendedClrTypeCode.Decimal; } break; case SqlDbType.Float: if (value.GetType() == typeof(SqlDouble)) { extendedClrTypeCode = ExtendedClrTypeCode.SqlDouble; } else if (value.GetType() == typeof(double)) { extendedClrTypeCode = ExtendedClrTypeCode.Double; } break; case SqlDbType.UniqueIdentifier: if (value.GetType() == typeof(SqlGuid)) { extendedClrTypeCode = ExtendedClrTypeCode.SqlGuid; } else if (value.GetType() == typeof(Guid)) { extendedClrTypeCode = ExtendedClrTypeCode.Guid; } break; case SqlDbType.SmallInt: if (value.GetType() == typeof(short)) { extendedClrTypeCode = ExtendedClrTypeCode.Int16; } else if (value.GetType() == typeof(SqlInt16)) { extendedClrTypeCode = ExtendedClrTypeCode.SqlInt16; } break; case SqlDbType.TinyInt: if (value.GetType() == typeof(byte)) { extendedClrTypeCode = ExtendedClrTypeCode.Byte; } else if (value.GetType() == typeof(SqlByte)) { extendedClrTypeCode = ExtendedClrTypeCode.SqlByte; } break; case SqlDbType.Variant: extendedClrTypeCode = DetermineExtendedTypeCode(value); if (ExtendedClrTypeCode.SqlXml == extendedClrTypeCode) { extendedClrTypeCode = ExtendedClrTypeCode.Invalid; } break; case SqlDbType.Udt: throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString()); case SqlDbType.Time: if (value.GetType() == typeof(TimeSpan)) { extendedClrTypeCode = ExtendedClrTypeCode.TimeSpan; } break; case SqlDbType.DateTimeOffset: if (value.GetType() == typeof(DateTimeOffset)) { extendedClrTypeCode = ExtendedClrTypeCode.DateTimeOffset; } break; case SqlDbType.Xml: if (value.GetType() == typeof(SqlXml)) { extendedClrTypeCode = ExtendedClrTypeCode.SqlXml; } if (value.GetType() == typeof(XmlDataFeed)) { extendedClrTypeCode = ExtendedClrTypeCode.XmlReader; } else if (value.GetType() == typeof(string)) { extendedClrTypeCode = ExtendedClrTypeCode.String; } break; case SqlDbType.Structured: if (isMultiValued) { if (value is DataTable) { extendedClrTypeCode = ExtendedClrTypeCode.DataTable; } else if (value is IEnumerable) { extendedClrTypeCode = ExtendedClrTypeCode.IEnumerableOfSqlDataRecord; } else if (value is DbDataReader) { extendedClrTypeCode = ExtendedClrTypeCode.DbDataReader; } } break; } } return extendedClrTypeCode; } internal static ExtendedClrTypeCode DetermineExtendedTypeCodeFromType(Type clrType) { if (!s_typeToExtendedTypeCodeMap.TryGetValue(clrType, out var value)) { return ExtendedClrTypeCode.Invalid; } return value; } internal static ExtendedClrTypeCode DetermineExtendedTypeCode(object value) { if (value == null) { return ExtendedClrTypeCode.Empty; } return DetermineExtendedTypeCodeFromType(value.GetType()); } internal static SqlDbType InferSqlDbTypeFromTypeCode(ExtendedClrTypeCode typeCode) { return s_extendedTypeCodeToSqlDbTypeMap[(int)(typeCode + 1)]; } internal static SqlDbType InferSqlDbTypeFromType(Type type) { ExtendedClrTypeCode extendedClrTypeCode = DetermineExtendedTypeCodeFromType(type); if (ExtendedClrTypeCode.Invalid == extendedClrTypeCode) { return (SqlDbType)(-1); } return InferSqlDbTypeFromTypeCode(extendedClrTypeCode); } internal static SqlDbType InferSqlDbTypeFromType_Katmai(Type type) { SqlDbType sqlDbType = InferSqlDbTypeFromType(type); if (SqlDbType.DateTime == sqlDbType) { sqlDbType = SqlDbType.DateTime2; } return sqlDbType; } internal static SqlMetaData SmiExtendedMetaDataToSqlMetaData(SmiExtendedMetaData source) { if (SqlDbType.Xml == source.SqlDbType) { return new SqlMetaData(source.Name, source.SqlDbType, source.MaxLength, source.Precision, source.Scale, source.LocaleId, source.CompareOptions, source.TypeSpecificNamePart1, source.TypeSpecificNamePart2, source.TypeSpecificNamePart3, partialLength: true); } return new SqlMetaData(source.Name, source.SqlDbType, source.MaxLength, source.Precision, source.Scale, source.LocaleId, source.CompareOptions, null); } internal static SmiExtendedMetaData SqlMetaDataToSmiExtendedMetaData(SqlMetaData source) { string typeSpecificNamePart = null; string typeSpecificNamePart2 = null; string typeSpecificNamePart3 = null; if (SqlDbType.Xml == source.SqlDbType) { typeSpecificNamePart = source.XmlSchemaCollectionDatabase; typeSpecificNamePart2 = source.XmlSchemaCollectionOwningSchema; typeSpecificNamePart3 = source.XmlSchemaCollectionName; } else if (SqlDbType.Udt == source.SqlDbType) { throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString()); } return new SmiExtendedMetaData(source.SqlDbType, source.MaxLength, source.Precision, source.Scale, source.LocaleId, source.CompareOptions, source.Name, typeSpecificNamePart, typeSpecificNamePart2, typeSpecificNamePart3); } internal static bool IsCompatible(SmiMetaData firstMd, SqlMetaData secondMd) { if (firstMd.SqlDbType == secondMd.SqlDbType && firstMd.MaxLength == secondMd.MaxLength && firstMd.Precision == secondMd.Precision && firstMd.Scale == secondMd.Scale && firstMd.CompareOptions == secondMd.CompareOptions && firstMd.LocaleId == secondMd.LocaleId && firstMd.SqlDbType != SqlDbType.Structured) { return !firstMd.IsMultiValued; } return false; } internal static SmiExtendedMetaData SmiMetaDataFromDataColumn(DataColumn column, DataTable parent) { SqlDbType sqlDbType = InferSqlDbTypeFromType_Katmai(column.DataType); if ((SqlDbType)(-1) == sqlDbType) { throw SQL.UnsupportedColumnTypeForSqlProvider(column.ColumnName, column.DataType.Name); } long num = AdjustMaxLength(sqlDbType, column.MaxLength); if (-2 == num) { throw SQL.InvalidColumnMaxLength(column.ColumnName, num); } checked { byte b; byte b4; if (column.DataType == typeof(SqlDecimal)) { b = 0; byte b2 = 0; foreach (DataRow row in parent.Rows) { object obj = row[column]; if (obj is DBNull) { continue; } SqlDecimal sqlDecimal = (SqlDecimal)obj; if (!sqlDecimal.IsNull) { byte b3 = (byte)(sqlDecimal.Precision - sqlDecimal.Scale); if (b3 > b2) { b2 = b3; } if (sqlDecimal.Scale > b) { b = sqlDecimal.Scale; } } } b4 = (byte)(b2 + b); if (SqlDecimal.MaxPrecision < b4) { throw SQL.InvalidTableDerivedPrecisionForTvp(column.ColumnName, b4); } if (b4 == 0) { b4 = 1; } } else { switch (sqlDbType) { case SqlDbType.Time: case SqlDbType.DateTime2: case SqlDbType.DateTimeOffset: b4 = 0; b = SmiMetaData.DefaultTime.Scale; break; case SqlDbType.Decimal: { b = 0; byte b5 = 0; foreach (DataRow row2 in parent.Rows) { object obj2 = row2[column]; if (!(obj2 is DBNull)) { SqlDecimal sqlDecimal2 = (decimal)obj2; byte b6 = (byte)(sqlDecimal2.Precision - sqlDecimal2.Scale); if (b6 > b5) { b5 = b6; } if (sqlDecimal2.Scale > b) { b = sqlDecimal2.Scale; } } } b4 = (byte)(b5 + b); if (SqlDecimal.MaxPrecision < b4) { throw SQL.InvalidTableDerivedPrecisionForTvp(column.ColumnName, b4); } if (b4 == 0) { b4 = 1; } break; } default: b4 = 0; b = 0; break; } } CultureInfo cultureInfo = ((parent != null) ? parent.Locale : CultureInfo.CurrentCulture); return new SmiExtendedMetaData(sqlDbType, num, b4, b, cultureInfo.LCID, SmiMetaData.DefaultNVarChar.CompareOptions, isMultiValued: false, null, null, column.ColumnName, null, null, null); } } internal static long AdjustMaxLength(SqlDbType dbType, long maxLength) { if (-1 != maxLength) { if (maxLength < 0) { maxLength = -2L; } switch (dbType) { case SqlDbType.Binary: if (maxLength > 8000) { maxLength = -2L; } break; case SqlDbType.Char: if (maxLength > 8000) { maxLength = -2L; } break; case SqlDbType.NChar: if (maxLength > 4000) { maxLength = -2L; } break; case SqlDbType.NVarChar: if (4000 < maxLength) { maxLength = -1L; } break; case SqlDbType.VarBinary: if (8000 < maxLength) { maxLength = -1L; } break; case SqlDbType.VarChar: if (8000 < maxLength) { maxLength = -1L; } break; } } return maxLength; } internal static SmiExtendedMetaData SmiMetaDataFromSchemaTableRow(DataRow schemaRow) { string text = ""; object obj = schemaRow[SchemaTableColumn.ColumnName]; if (DBNull.Value != obj) { text = (string)obj; } obj = schemaRow[SchemaTableColumn.DataType]; if (DBNull.Value == obj) { throw SQL.NullSchemaTableDataTypeNotSupported(text); } Type type = (Type)obj; SqlDbType sqlDbType = InferSqlDbTypeFromType_Katmai(type); if ((SqlDbType)(-1) == sqlDbType) { if (!(typeof(object) == type)) { throw SQL.UnsupportedColumnTypeForSqlProvider(text, type.ToString()); } sqlDbType = SqlDbType.VarBinary; } long num = 0L; byte b = 0; byte b2 = 0; switch (sqlDbType) { case SqlDbType.Binary: case SqlDbType.VarBinary: obj = schemaRow[SchemaTableColumn.ColumnSize]; if (DBNull.Value == obj) { num = ((SqlDbType.Binary != sqlDbType) ? (-1) : 8000); break; } num = Convert.ToInt64(obj, null); if (num > 8000) { num = -1L; } if (num >= 0 || (num == -1 && SqlDbType.Binary != sqlDbType)) { break; } throw SQL.InvalidColumnMaxLength(text, num); case SqlDbType.Char: case SqlDbType.VarChar: obj = schemaRow[SchemaTableColumn.ColumnSize]; if (DBNull.Value == obj) { num = ((SqlDbType.Char != sqlDbType) ? (-1) : 8000); break; } num = Convert.ToInt64(obj, null); if (num > 8000) { num = -1L; } if (num >= 0 || (num == -1 && SqlDbType.Char != sqlDbType)) { break; } throw SQL.InvalidColumnMaxLength(text, num); case SqlDbType.NChar: case SqlDbType.NVarChar: obj = schemaRow[SchemaTableColumn.ColumnSize]; if (DBNull.Value == obj) { num = ((SqlDbType.NChar != sqlDbType) ? (-1) : 4000); break; } num = Convert.ToInt64(obj, null); if (num > 4000) { num = -1L; } if (num >= 0 || (num == -1 && SqlDbType.NChar != sqlDbType)) { break; } throw SQL.InvalidColumnMaxLength(text, num); case SqlDbType.Decimal: obj = schemaRow[SchemaTableColumn.NumericPrecision]; b = ((DBNull.Value != obj) ? Convert.ToByte(obj, null) : SmiMetaData.DefaultDecimal.Precision); obj = schemaRow[SchemaTableColumn.NumericScale]; b2 = ((DBNull.Value != obj) ? Convert.ToByte(obj, null) : SmiMetaData.DefaultDecimal.Scale); if (b < 1 || b > SqlDecimal.MaxPrecision || b2 < 0 || b2 > SqlDecimal.MaxScale || b2 > b) { throw SQL.InvalidColumnPrecScale(); } break; case SqlDbType.Time: case SqlDbType.DateTime2: case SqlDbType.DateTimeOffset: obj = schemaRow[SchemaTableColumn.NumericScale]; b2 = ((DBNull.Value != obj) ? Convert.ToByte(obj, null) : SmiMetaData.DefaultTime.Scale); if (b2 > 7) { throw SQL.InvalidColumnPrecScale(); } if (b2 < 0) { b2 = SmiMetaData.DefaultTime.Scale; } break; default: throw SQL.UnsupportedColumnTypeForSqlProvider(text, type.ToString()); case SqlDbType.BigInt: case SqlDbType.Bit: case SqlDbType.DateTime: case SqlDbType.Float: case SqlDbType.Image: case SqlDbType.Int: case SqlDbType.Money: case SqlDbType.NText: case SqlDbType.Real: case SqlDbType.UniqueIdentifier: case SqlDbType.SmallDateTime: case SqlDbType.SmallInt: case SqlDbType.SmallMoney: case SqlDbType.Text: case SqlDbType.Timestamp: case SqlDbType.TinyInt: case SqlDbType.Variant: case SqlDbType.Xml: case SqlDbType.Date: break; } return new SmiExtendedMetaData(sqlDbType, num, b, b2, CultureInfo.CurrentCulture.LCID, SmiMetaData.GetDefaultForType(sqlDbType).CompareOptions, isMultiValued: false, null, null, text, null, null, null); } } internal abstract class SmiEventSink { } internal class SmiEventSink_Default : SmiEventSink { private SqlErrorCollection _errors; private SqlErrorCollection _warnings; internal bool HasMessages { get { if (_errors == null) { return _warnings != null; } return true; } } internal virtual string ServerVersion => null; protected virtual void DispatchMessages() { SqlException ex = ProcessMessages(ignoreWarnings: true); if (ex != null) { throw ex; } } protected SqlException ProcessMessages(bool ignoreWarnings) { SqlException result = null; SqlErrorCollection sqlErrorCollection = null; if (_errors != null) { if (_warnings != null) { foreach (SqlError warning in _warnings) { _errors.Add(warning); } } sqlErrorCollection = _errors; _errors = null; _warnings = null; } else { if (!ignoreWarnings) { sqlErrorCollection = _warnings; } _warnings = null; } if (sqlErrorCollection != null) { result = SqlException.CreateException(sqlErrorCollection, ServerVersion); } return result; } internal void ProcessMessagesAndThrow() { if (HasMessages) { DispatchMessages(); } } internal SmiEventSink_Default() { } } internal class SmiGettersStream : Stream { private SmiEventSink_Default _sink; private ITypedGettersV3 _getters; private int _ordinal; private long _readPosition; private SmiMetaData _metaData; public override bool CanRead => true; public override bool CanSeek => false; public override bool CanWrite => false; public override long Length => ValueUtilsSmi.GetBytesInternal(_sink, _getters, _ordinal, _metaData, 0L, null, 0, 0, throwOnNull: false); public override long Position { get { return _readPosition; } set { throw SQL.StreamSeekNotSupported(); } } internal SmiGettersStream(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { _sink = sink; _getters = getters; _ordinal = ordinal; _readPosition = 0L; _metaData = metaData; } public override void Flush() { throw SQL.StreamWriteNotSupported(); } public override long Seek(long offset, SeekOrigin origin) { throw SQL.StreamSeekNotSupported(); } public override void SetLength(long value) { throw SQL.StreamWriteNotSupported(); } public override int Read(byte[] buffer, int offset, int count) { long bytesInternal = ValueUtilsSmi.GetBytesInternal(_sink, _getters, _ordinal, _metaData, _readPosition, buffer, offset, count, throwOnNull: false); _readPosition += bytesInternal; return checked((int)bytesInternal); } public override void Write(byte[] buffer, int offset, int count) { throw SQL.StreamWriteNotSupported(); } } internal class SmiMetaData { private SqlDbType _databaseType; private long _maxLength; private byte _precision; private byte _scale; private long _localeId; private SqlCompareOptions _compareOptions; private bool _isMultiValued; private IList _fieldMetaData; private SmiMetaDataPropertyCollection _extendedProperties; internal const long UnlimitedMaxLengthIndicator = -1L; internal const long MaxUnicodeCharacters = 4000L; internal const long MaxANSICharacters = 8000L; internal const long MaxBinaryLength = 8000L; internal const int MinPrecision = 1; internal const int MinScale = 0; internal const int MaxTimeScale = 7; internal static readonly DateTime MaxSmallDateTime = new DateTime(2079, 6, 6, 23, 59, 29, 998); internal static readonly DateTime MinSmallDateTime = new DateTime(1899, 12, 31, 23, 59, 29, 999); internal static readonly SqlMoney MaxSmallMoney = new SqlMoney(214748.3647m); internal static readonly SqlMoney MinSmallMoney = new SqlMoney(-214748.3648m); internal const SqlCompareOptions DefaultStringCompareOptions = SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth; internal const long MaxNameLength = 128L; private static readonly IList s_emptyFieldList = new SmiExtendedMetaData[0]; private static byte[] s_maxLenFromPrecision = new byte[38] { 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 13, 13, 13, 13, 13, 13, 13, 13, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17 }; private static byte[] s_maxVarTimeLenOffsetFromScale = new byte[8] { 2, 2, 2, 1, 1, 0, 0, 0 }; internal static readonly SmiMetaData DefaultBigInt = new SmiMetaData(SqlDbType.BigInt, 8L, 19, 0, SqlCompareOptions.None); internal static readonly SmiMetaData DefaultBinary = new SmiMetaData(SqlDbType.Binary, 1L, 0, 0, SqlCompareOptions.None); internal static readonly SmiMetaData DefaultBit = new SmiMetaData(SqlDbType.Bit, 1L, 1, 0, SqlCompareOptions.None); internal static readonly SmiMetaData DefaultChar_NoCollation = new SmiMetaData(SqlDbType.Char, 1L, 0, 0, SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth); internal static readonly SmiMetaData DefaultDateTime = new SmiMetaData(SqlDbType.DateTime, 8L, 23, 3, SqlCompareOptions.None); internal static readonly SmiMetaData DefaultDecimal = new SmiMetaData(SqlDbType.Decimal, 9L, 18, 0, SqlCompareOptions.None); internal static readonly SmiMetaData DefaultFloat = new SmiMetaData(SqlDbType.Float, 8L, 53, 0, SqlCompareOptions.None); internal static readonly SmiMetaData DefaultImage = new SmiMetaData(SqlDbType.Image, -1L, 0, 0, SqlCompareOptions.None); internal static readonly SmiMetaData DefaultInt = new SmiMetaData(SqlDbType.Int, 4L, 10, 0, SqlCompareOptions.None); internal static readonly SmiMetaData DefaultMoney = new SmiMetaData(SqlDbType.Money, 8L, 19, 4, SqlCompareOptions.None); internal static readonly SmiMetaData DefaultNChar_NoCollation = new SmiMetaData(SqlDbType.NChar, 1L, 0, 0, SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth); internal static readonly SmiMetaData DefaultNText_NoCollation = new SmiMetaData(SqlDbType.NText, -1L, 0, 0, SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth); internal static readonly SmiMetaData DefaultNVarChar_NoCollation = new SmiMetaData(SqlDbType.NVarChar, 4000L, 0, 0, SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth); internal static readonly SmiMetaData DefaultReal = new SmiMetaData(SqlDbType.Real, 4L, 24, 0, SqlCompareOptions.None); internal static readonly SmiMetaData DefaultUniqueIdentifier = new SmiMetaData(SqlDbType.UniqueIdentifier, 16L, 0, 0, SqlCompareOptions.None); internal static readonly SmiMetaData DefaultSmallDateTime = new SmiMetaData(SqlDbType.SmallDateTime, 4L, 16, 0, SqlCompareOptions.None); internal static readonly SmiMetaData DefaultSmallInt = new SmiMetaData(SqlDbType.SmallInt, 2L, 5, 0, SqlCompareOptions.None); internal static readonly SmiMetaData DefaultSmallMoney = new SmiMetaData(SqlDbType.SmallMoney, 4L, 10, 4, SqlCompareOptions.None); internal static readonly SmiMetaData DefaultText_NoCollation = new SmiMetaData(SqlDbType.Text, -1L, 0, 0, SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth); internal static readonly SmiMetaData DefaultTimestamp = new SmiMetaData(SqlDbType.Timestamp, 8L, 0, 0, SqlCompareOptions.None); internal static readonly SmiMetaData DefaultTinyInt = new SmiMetaData(SqlDbType.TinyInt, 1L, 3, 0, SqlCompareOptions.None); internal static readonly SmiMetaData DefaultVarBinary = new SmiMetaData(SqlDbType.VarBinary, 8000L, 0, 0, SqlCompareOptions.None); internal static readonly SmiMetaData DefaultVarChar_NoCollation = new SmiMetaData(SqlDbType.VarChar, 8000L, 0, 0, SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth); internal static readonly SmiMetaData DefaultVariant = new SmiMetaData(SqlDbType.Variant, 8016L, 0, 0, SqlCompareOptions.None); internal static readonly SmiMetaData DefaultXml = new SmiMetaData(SqlDbType.Xml, -1L, 0, 0, SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth); internal static readonly SmiMetaData DefaultStructured = new SmiMetaData(SqlDbType.Structured, 0L, 0, 0, SqlCompareOptions.None); internal static readonly SmiMetaData DefaultDate = new SmiMetaData(SqlDbType.Date, 3L, 10, 0, SqlCompareOptions.None); internal static readonly SmiMetaData DefaultTime = new SmiMetaData(SqlDbType.Time, 5L, 0, 7, SqlCompareOptions.None); internal static readonly SmiMetaData DefaultDateTime2 = new SmiMetaData(SqlDbType.DateTime2, 8L, 0, 7, SqlCompareOptions.None); internal static readonly SmiMetaData DefaultDateTimeOffset = new SmiMetaData(SqlDbType.DateTimeOffset, 10L, 0, 7, SqlCompareOptions.None); private static SmiMetaData[] s_defaultValues = new SmiMetaData[35] { DefaultBigInt, DefaultBinary, DefaultBit, DefaultChar_NoCollation, DefaultDateTime, DefaultDecimal, DefaultFloat, DefaultImage, DefaultInt, DefaultMoney, DefaultNChar_NoCollation, DefaultNText_NoCollation, DefaultNVarChar_NoCollation, DefaultReal, DefaultUniqueIdentifier, DefaultSmallDateTime, DefaultSmallInt, DefaultSmallMoney, DefaultText_NoCollation, DefaultTimestamp, DefaultTinyInt, DefaultVarBinary, DefaultVarChar_NoCollation, DefaultVariant, DefaultNVarChar_NoCollation, DefaultXml, DefaultNVarChar_NoCollation, DefaultNVarChar_NoCollation, DefaultNVarChar_NoCollation, null, DefaultStructured, DefaultDate, DefaultTime, DefaultDateTime2, DefaultDateTimeOffset }; internal static SmiMetaData DefaultNVarChar => new SmiMetaData(DefaultNVarChar_NoCollation.SqlDbType, DefaultNVarChar_NoCollation.MaxLength, DefaultNVarChar_NoCollation.Precision, DefaultNVarChar_NoCollation.Scale, CultureInfo.CurrentCulture.LCID, SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth); internal SqlCompareOptions CompareOptions => _compareOptions; internal long LocaleId => _localeId; internal long MaxLength => _maxLength; internal byte Precision => _precision; internal byte Scale => _scale; internal SqlDbType SqlDbType => _databaseType; internal bool IsMultiValued => _isMultiValued; internal IList FieldMetaData => _fieldMetaData; internal SmiMetaDataPropertyCollection ExtendedProperties => _extendedProperties; internal SmiMetaData(SqlDbType dbType, long maxLength, byte precision, byte scale, long localeId, SqlCompareOptions compareOptions) : this(dbType, maxLength, precision, scale, localeId, compareOptions, isMultiValued: false, null, null) { } internal SmiMetaData(SqlDbType dbType, long maxLength, byte precision, byte scale, long localeId, SqlCompareOptions compareOptions, bool isMultiValued, IList fieldTypes, SmiMetaDataPropertyCollection extendedProperties) { SetDefaultsForType(dbType); switch (dbType) { case SqlDbType.Binary: case SqlDbType.VarBinary: _maxLength = maxLength; break; case SqlDbType.Char: case SqlDbType.NChar: case SqlDbType.NVarChar: case SqlDbType.VarChar: _maxLength = maxLength; _localeId = localeId; _compareOptions = compareOptions; break; case SqlDbType.NText: case SqlDbType.Text: _localeId = localeId; _compareOptions = compareOptions; break; case SqlDbType.Decimal: _precision = precision; _scale = scale; _maxLength = s_maxLenFromPrecision[precision - 1]; break; case SqlDbType.Udt: throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString()); case SqlDbType.Structured: if (fieldTypes != null) { _fieldMetaData = new ReadOnlyCollection(fieldTypes); } _isMultiValued = isMultiValued; _maxLength = _fieldMetaData.Count; break; case SqlDbType.Time: _scale = scale; _maxLength = 5 - s_maxVarTimeLenOffsetFromScale[scale]; break; case SqlDbType.DateTime2: _scale = scale; _maxLength = 8 - s_maxVarTimeLenOffsetFromScale[scale]; break; case SqlDbType.DateTimeOffset: _scale = scale; _maxLength = 10 - s_maxVarTimeLenOffsetFromScale[scale]; break; } if (extendedProperties != null) { extendedProperties.SetReadOnly(); _extendedProperties = extendedProperties; } } internal static bool IsSupportedDbType(SqlDbType dbType) { if (SqlDbType.BigInt > dbType || SqlDbType.Xml < dbType) { if (SqlDbType.Udt <= dbType) { return SqlDbType.DateTimeOffset >= dbType; } return false; } return true; } internal static SmiMetaData GetDefaultForType(SqlDbType dbType) { return s_defaultValues[(int)dbType]; } private SmiMetaData(SqlDbType sqlDbType, long maxLength, byte precision, byte scale, SqlCompareOptions compareOptions) { _databaseType = sqlDbType; _maxLength = maxLength; _precision = precision; _scale = scale; _compareOptions = compareOptions; _localeId = 0L; _isMultiValued = false; _fieldMetaData = s_emptyFieldList; _extendedProperties = SmiMetaDataPropertyCollection.EmptyInstance; } private void SetDefaultsForType(SqlDbType dbType) { SmiMetaData defaultForType = GetDefaultForType(dbType); _databaseType = dbType; _maxLength = defaultForType.MaxLength; _precision = defaultForType.Precision; _scale = defaultForType.Scale; _localeId = defaultForType.LocaleId; _compareOptions = defaultForType.CompareOptions; _isMultiValued = defaultForType._isMultiValued; _fieldMetaData = defaultForType._fieldMetaData; _extendedProperties = defaultForType._extendedProperties; } } internal class SmiExtendedMetaData : SmiMetaData { private string _name; private string _typeSpecificNamePart1; private string _typeSpecificNamePart2; private string _typeSpecificNamePart3; internal string Name => _name; internal string TypeSpecificNamePart1 => _typeSpecificNamePart1; internal string TypeSpecificNamePart2 => _typeSpecificNamePart2; internal string TypeSpecificNamePart3 => _typeSpecificNamePart3; internal SmiExtendedMetaData(SqlDbType dbType, long maxLength, byte precision, byte scale, long localeId, SqlCompareOptions compareOptions, string name, string typeSpecificNamePart1, string typeSpecificNamePart2, string typeSpecificNamePart3) : this(dbType, maxLength, precision, scale, localeId, compareOptions, isMultiValued: false, null, null, name, typeSpecificNamePart1, typeSpecificNamePart2, typeSpecificNamePart3) { } internal SmiExtendedMetaData(SqlDbType dbType, long maxLength, byte precision, byte scale, long localeId, SqlCompareOptions compareOptions, bool isMultiValued, IList fieldMetaData, SmiMetaDataPropertyCollection extendedProperties, string name, string typeSpecificNamePart1, string typeSpecificNamePart2, string typeSpecificNamePart3) : base(dbType, maxLength, precision, scale, localeId, compareOptions, isMultiValued, fieldMetaData, extendedProperties) { _name = name; _typeSpecificNamePart1 = typeSpecificNamePart1; _typeSpecificNamePart2 = typeSpecificNamePart2; _typeSpecificNamePart3 = typeSpecificNamePart3; } } internal sealed class SmiParameterMetaData : SmiExtendedMetaData { private ParameterDirection _direction; internal ParameterDirection Direction => _direction; internal SmiParameterMetaData(SqlDbType dbType, long maxLength, byte precision, byte scale, long localeId, SqlCompareOptions compareOptions, bool isMultiValued, IList fieldMetaData, SmiMetaDataPropertyCollection extendedProperties, string name, string typeSpecificNamePart1, string typeSpecificNamePart2, string typeSpecificNamePart3, ParameterDirection direction) : base(dbType, maxLength, precision, scale, localeId, compareOptions, isMultiValued, fieldMetaData, extendedProperties, name, typeSpecificNamePart1, typeSpecificNamePart2, typeSpecificNamePart3) { _direction = direction; } } internal class SmiStorageMetaData : SmiExtendedMetaData { private bool _allowsDBNull; private string _serverName; private string _catalogName; private string _schemaName; private string _tableName; private string _columnName; private SqlBoolean _isKey; private bool _isIdentity; private bool _isColumnSet; internal SqlBoolean IsKey => _isKey; internal SmiStorageMetaData(SqlDbType dbType, long maxLength, byte precision, byte scale, long localeId, SqlCompareOptions compareOptions, bool isMultiValued, IList fieldMetaData, SmiMetaDataPropertyCollection extendedProperties, string name, string typeSpecificNamePart1, string typeSpecificNamePart2, string typeSpecificNamePart3, bool allowsDBNull, string serverName, string catalogName, string schemaName, string tableName, string columnName, SqlBoolean isKey, bool isIdentity, bool isColumnSet) : base(dbType, maxLength, precision, scale, localeId, compareOptions, isMultiValued, fieldMetaData, extendedProperties, name, typeSpecificNamePart1, typeSpecificNamePart2, typeSpecificNamePart3) { _allowsDBNull = allowsDBNull; _serverName = serverName; _catalogName = catalogName; _schemaName = schemaName; _tableName = tableName; _columnName = columnName; _isKey = isKey; _isIdentity = isIdentity; _isColumnSet = isColumnSet; } } internal class SmiQueryMetaData : SmiStorageMetaData { private bool _isReadOnly; private SqlBoolean _isExpression; private SqlBoolean _isAliased; private SqlBoolean _isHidden; internal SmiQueryMetaData(SqlDbType dbType, long maxLength, byte precision, byte scale, long localeId, SqlCompareOptions compareOptions, bool isMultiValued, IList fieldMetaData, SmiMetaDataPropertyCollection extendedProperties, string name, string typeSpecificNamePart1, string typeSpecificNamePart2, string typeSpecificNamePart3, bool allowsDBNull, string serverName, string catalogName, string schemaName, string tableName, string columnName, SqlBoolean isKey, bool isIdentity, bool isReadOnly, SqlBoolean isExpression, SqlBoolean isAliased, SqlBoolean isHidden) : this(dbType, maxLength, precision, scale, localeId, compareOptions, isMultiValued, fieldMetaData, extendedProperties, name, typeSpecificNamePart1, typeSpecificNamePart2, typeSpecificNamePart3, allowsDBNull, serverName, catalogName, schemaName, tableName, columnName, isKey, isIdentity, isColumnSet: false, isReadOnly, isExpression, isAliased, isHidden) { } internal SmiQueryMetaData(SqlDbType dbType, long maxLength, byte precision, byte scale, long localeId, SqlCompareOptions compareOptions, bool isMultiValued, IList fieldMetaData, SmiMetaDataPropertyCollection extendedProperties, string name, string typeSpecificNamePart1, string typeSpecificNamePart2, string typeSpecificNamePart3, bool allowsDBNull, string serverName, string catalogName, string schemaName, string tableName, string columnName, SqlBoolean isKey, bool isIdentity, bool isColumnSet, bool isReadOnly, SqlBoolean isExpression, SqlBoolean isAliased, SqlBoolean isHidden) : base(dbType, maxLength, precision, scale, localeId, compareOptions, isMultiValued, fieldMetaData, extendedProperties, name, typeSpecificNamePart1, typeSpecificNamePart2, typeSpecificNamePart3, allowsDBNull, serverName, catalogName, schemaName, tableName, columnName, isKey, isIdentity, isColumnSet) { _isReadOnly = isReadOnly; _isExpression = isExpression; _isAliased = isAliased; _isHidden = isHidden; } } internal enum SmiPropertySelector { DefaultFields, SortOrder, UniqueKey } internal class SmiMetaDataPropertyCollection { private const int SelectorCount = 3; private SmiMetaDataProperty[] _properties; private bool _isReadOnly; private static readonly SmiDefaultFieldsProperty s_emptyDefaultFields = new SmiDefaultFieldsProperty(new List()); private static readonly SmiOrderProperty s_emptySortOrder = new SmiOrderProperty(new List()); private static readonly SmiUniqueKeyProperty s_emptyUniqueKey = new SmiUniqueKeyProperty(new List()); internal static readonly SmiMetaDataPropertyCollection EmptyInstance = CreateEmptyInstance(); internal SmiMetaDataProperty this[SmiPropertySelector key] { get { return _properties[(int)key]; } set { if (value == null) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } EnsureWritable(); _properties[(int)key] = value; } } internal bool IsReadOnly => _isReadOnly; private static SmiMetaDataPropertyCollection CreateEmptyInstance() { SmiMetaDataPropertyCollection smiMetaDataPropertyCollection = new SmiMetaDataPropertyCollection(); smiMetaDataPropertyCollection.SetReadOnly(); return smiMetaDataPropertyCollection; } internal SmiMetaDataPropertyCollection() { _properties = new SmiMetaDataProperty[3]; _isReadOnly = false; _properties[0] = s_emptyDefaultFields; _properties[1] = s_emptySortOrder; _properties[2] = s_emptyUniqueKey; } internal void SetReadOnly() { _isReadOnly = true; } private void EnsureWritable() { if (IsReadOnly) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } } } internal abstract class SmiMetaDataProperty { } internal class SmiUniqueKeyProperty : SmiMetaDataProperty { private IList _columns; internal bool this[int ordinal] { get { if (_columns.Count <= ordinal) { return false; } return _columns[ordinal]; } } internal SmiUniqueKeyProperty(IList columnIsKey) { _columns = new ReadOnlyCollection(columnIsKey); } [Conditional("DEBUG")] internal void CheckCount(int countToMatch) { } } internal class SmiOrderProperty : SmiMetaDataProperty { internal struct SmiColumnOrder { internal int SortOrdinal; internal SortOrder Order; } private IList _columns; internal SmiColumnOrder this[int ordinal] { get { if (_columns.Count <= ordinal) { SmiColumnOrder result = default(SmiColumnOrder); result.Order = SortOrder.Unspecified; result.SortOrdinal = -1; return result; } return _columns[ordinal]; } } internal SmiOrderProperty(IList columnOrders) { _columns = new ReadOnlyCollection(columnOrders); } [Conditional("DEBUG")] internal void CheckCount(int countToMatch) { } } internal class SmiDefaultFieldsProperty : SmiMetaDataProperty { private IList _defaults; internal bool this[int ordinal] { get { if (_defaults.Count <= ordinal) { return false; } return _defaults[ordinal]; } } internal SmiDefaultFieldsProperty(IList defaultFields) { _defaults = new ReadOnlyCollection(defaultFields); } [Conditional("DEBUG")] internal void CheckCount(int countToMatch) { } } internal abstract class SmiRecordBuffer : SmiTypedGetterSetter, ITypedGettersV3, ITypedSettersV3, ITypedGetters, ITypedSetters, IDisposable { internal override bool CanGet => true; internal override bool CanSet => true; public virtual void Dispose() { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual bool IsDBNull(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual SqlDbType GetVariantType(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual bool GetBoolean(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual byte GetByte(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual long GetBytes(int ordinal, long fieldOffset, byte[] buffer, int bufferOffset, int length) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual char GetChar(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual long GetChars(int ordinal, long fieldOffset, char[] buffer, int bufferOffset, int length) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual short GetInt16(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual int GetInt32(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual long GetInt64(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual float GetFloat(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual double GetDouble(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual string GetString(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual decimal GetDecimal(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual DateTime GetDateTime(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual Guid GetGuid(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual SqlBoolean GetSqlBoolean(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual SqlByte GetSqlByte(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual SqlInt16 GetSqlInt16(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual SqlInt32 GetSqlInt32(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual SqlInt64 GetSqlInt64(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual SqlSingle GetSqlSingle(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual SqlDouble GetSqlDouble(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual SqlMoney GetSqlMoney(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual SqlDateTime GetSqlDateTime(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual SqlDecimal GetSqlDecimal(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual SqlString GetSqlString(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual SqlBinary GetSqlBinary(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual SqlGuid GetSqlGuid(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual SqlChars GetSqlChars(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual SqlBytes GetSqlBytes(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual SqlXml GetSqlXml(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual SqlXml GetSqlXmlRef(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual SqlBytes GetSqlBytesRef(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual SqlChars GetSqlCharsRef(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetDBNull(int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetBoolean(int ordinal, bool value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetByte(int ordinal, byte value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetBytes(int ordinal, long fieldOffset, byte[] buffer, int bufferOffset, int length) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetChar(int ordinal, char value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetChars(int ordinal, long fieldOffset, char[] buffer, int bufferOffset, int length) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetInt16(int ordinal, short value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetInt32(int ordinal, int value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetInt64(int ordinal, long value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetFloat(int ordinal, float value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetDouble(int ordinal, double value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetString(int ordinal, string value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetString(int ordinal, string value, int offset) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetDecimal(int ordinal, decimal value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetDateTime(int ordinal, DateTime value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetGuid(int ordinal, Guid value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetSqlBoolean(int ordinal, SqlBoolean value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetSqlByte(int ordinal, SqlByte value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetSqlInt16(int ordinal, SqlInt16 value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetSqlInt32(int ordinal, SqlInt32 value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetSqlInt64(int ordinal, SqlInt64 value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetSqlSingle(int ordinal, SqlSingle value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetSqlDouble(int ordinal, SqlDouble value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetSqlMoney(int ordinal, SqlMoney value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetSqlDateTime(int ordinal, SqlDateTime value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetSqlDecimal(int ordinal, SqlDecimal value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetSqlString(int ordinal, SqlString value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetSqlString(int ordinal, SqlString value, int offset) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetSqlBinary(int ordinal, SqlBinary value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetSqlBinary(int ordinal, SqlBinary value, int offset) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetSqlGuid(int ordinal, SqlGuid value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetSqlChars(int ordinal, SqlChars value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetSqlChars(int ordinal, SqlChars value, int offset) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetSqlBytes(int ordinal, SqlBytes value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetSqlBytes(int ordinal, SqlBytes value, int offset) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetSqlXml(int ordinal, SqlXml value) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } } internal class SmiSettersStream : Stream { private SmiEventSink_Default _sink; private ITypedSettersV3 _setters; private int _ordinal; private long _lengthWritten; private SmiMetaData _metaData; public override bool CanRead => false; public override bool CanSeek => false; public override bool CanWrite => true; public override long Length => _lengthWritten; public override long Position { get { return _lengthWritten; } set { throw SQL.StreamSeekNotSupported(); } } internal SmiSettersStream(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData) { _sink = sink; _setters = setters; _ordinal = ordinal; _lengthWritten = 0L; _metaData = metaData; } public override void Flush() { _lengthWritten = ValueUtilsSmi.SetBytesLength(_sink, _setters, _ordinal, _metaData, _lengthWritten); } public override long Seek(long offset, SeekOrigin origin) { throw SQL.StreamSeekNotSupported(); } public override void SetLength(long value) { if (value < 0) { throw ADP.ArgumentOutOfRange("value"); } ValueUtilsSmi.SetBytesLength(_sink, _setters, _ordinal, _metaData, value); } public override int Read(byte[] buffer, int offset, int count) { throw SQL.StreamReadNotSupported(); } public override void Write(byte[] buffer, int offset, int count) { _lengthWritten += ValueUtilsSmi.SetBytes(_sink, _setters, _ordinal, _metaData, _lengthWritten, buffer, offset, count); } } internal abstract class SmiTypedGetterSetter : ITypedGettersV3, ITypedSettersV3 { internal abstract bool CanGet { get; } internal abstract bool CanSet { get; } public virtual bool IsDBNull(SmiEventSink sink, int ordinal) { if (!CanGet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual SmiMetaData GetVariantType(SmiEventSink sink, int ordinal) { if (!CanGet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual bool GetBoolean(SmiEventSink sink, int ordinal) { if (!CanGet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual byte GetByte(SmiEventSink sink, int ordinal) { if (!CanGet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual long GetBytesLength(SmiEventSink sink, int ordinal) { if (!CanGet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual int GetBytes(SmiEventSink sink, int ordinal, long fieldOffset, byte[] buffer, int bufferOffset, int length) { if (!CanGet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual long GetCharsLength(SmiEventSink sink, int ordinal) { if (!CanGet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual int GetChars(SmiEventSink sink, int ordinal, long fieldOffset, char[] buffer, int bufferOffset, int length) { if (!CanGet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual string GetString(SmiEventSink sink, int ordinal) { if (!CanGet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual short GetInt16(SmiEventSink sink, int ordinal) { if (!CanGet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual int GetInt32(SmiEventSink sink, int ordinal) { if (!CanGet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual long GetInt64(SmiEventSink sink, int ordinal) { if (!CanGet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual float GetSingle(SmiEventSink sink, int ordinal) { if (!CanGet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual double GetDouble(SmiEventSink sink, int ordinal) { if (!CanGet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual SqlDecimal GetSqlDecimal(SmiEventSink sink, int ordinal) { if (!CanGet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual DateTime GetDateTime(SmiEventSink sink, int ordinal) { if (!CanGet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual Guid GetGuid(SmiEventSink sink, int ordinal) { if (!CanGet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual TimeSpan GetTimeSpan(SmiEventSink sink, int ordinal) { if (!CanGet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual DateTimeOffset GetDateTimeOffset(SmiEventSink sink, int ordinal) { if (!CanGet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } internal virtual SmiTypedGetterSetter GetTypedGetterSetter(SmiEventSink sink, int ordinal) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetDBNull(SmiEventSink sink, int ordinal) { if (!CanSet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetBoolean(SmiEventSink sink, int ordinal, bool value) { if (!CanSet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetByte(SmiEventSink sink, int ordinal, byte value) { if (!CanSet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual int SetBytes(SmiEventSink sink, int ordinal, long fieldOffset, byte[] buffer, int bufferOffset, int length) { if (!CanSet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetBytesLength(SmiEventSink sink, int ordinal, long length) { if (!CanSet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual int SetChars(SmiEventSink sink, int ordinal, long fieldOffset, char[] buffer, int bufferOffset, int length) { if (!CanSet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetCharsLength(SmiEventSink sink, int ordinal, long length) { if (!CanSet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetString(SmiEventSink sink, int ordinal, string value, int offset, int length) { if (!CanSet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetInt16(SmiEventSink sink, int ordinal, short value) { if (!CanSet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetInt32(SmiEventSink sink, int ordinal, int value) { if (!CanSet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetInt64(SmiEventSink sink, int ordinal, long value) { if (!CanSet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetSingle(SmiEventSink sink, int ordinal, float value) { if (!CanSet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetDouble(SmiEventSink sink, int ordinal, double value) { if (!CanSet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetSqlDecimal(SmiEventSink sink, int ordinal, SqlDecimal value) { if (!CanSet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetDateTime(SmiEventSink sink, int ordinal, DateTime value) { if (!CanSet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetGuid(SmiEventSink sink, int ordinal, Guid value) { if (!CanSet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetTimeSpan(SmiEventSink sink, int ordinal, TimeSpan value) { if (!CanSet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetDateTimeOffset(SmiEventSink sink, int ordinal, DateTimeOffset value) { if (!CanSet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } public virtual void SetVariantMetaData(SmiEventSink sink, int ordinal, SmiMetaData metaData) { throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } internal virtual void NewElement(SmiEventSink sink) { if (!CanSet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } internal virtual void EndElements(SmiEventSink sink) { if (!CanSet) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } throw ADP.InternalError(ADP.InternalErrorCode.UnimplementedSMIMethod); } } internal class SmiXetterAccessMap { private const bool X = true; private const bool _ = false; private static bool[,] s_isSetterAccessValid = new bool[35, 17] { { false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false }, { false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false }, { false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false }, { false, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false }, { false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false }, { false, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false }, { true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, true }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false }, { false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false }, { false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true } }; internal static bool IsSetterAccessValid(SmiMetaData metaData, SmiXetterTypeCode xetterType) { return s_isSetterAccessValid[(int)metaData.SqlDbType, (int)xetterType]; } } internal enum SmiXetterTypeCode { XetBoolean = 0, XetByte = 1, XetBytes = 2, XetChars = 3, XetString = 4, XetInt16 = 5, XetInt32 = 6, XetInt64 = 7, XetSingle = 8, XetDouble = 9, XetSqlDecimal = 10, XetDateTime = 11, XetGuid = 12, GetVariantMetaData = 13, GetXet = 14, XetTime = 15, XetTimeSpan = 15, XetDateTimeOffset = 16 } public class SqlDataRecord : IDataRecord { private SmiRecordBuffer _recordBuffer; private SmiExtendedMetaData[] _columnSmiMetaData; private SmiEventSink_Default _eventSink; private SqlMetaData[] _columnMetaData; private FieldNameLookup _fieldNameLookup; private bool _usesStringStorageForXml; private static readonly SmiMetaData s_maxNVarCharForXml = new SmiMetaData(SqlDbType.NVarChar, -1L, SmiMetaData.DefaultNVarChar_NoCollation.Precision, SmiMetaData.DefaultNVarChar_NoCollation.Scale, SmiMetaData.DefaultNVarChar.LocaleId, SmiMetaData.DefaultNVarChar.CompareOptions); public virtual int FieldCount { get { EnsureSubclassOverride(); return _columnMetaData.Length; } } public virtual object this[int ordinal] { get { EnsureSubclassOverride(); return GetValue(ordinal); } } public virtual object this[string name] { get { EnsureSubclassOverride(); return GetValue(GetOrdinal(name)); } } internal SmiRecordBuffer RecordBuffer => _recordBuffer; public virtual string GetName(int ordinal) { EnsureSubclassOverride(); return GetSqlMetaData(ordinal).Name; } public virtual string GetDataTypeName(int ordinal) { EnsureSubclassOverride(); SqlMetaData sqlMetaData = GetSqlMetaData(ordinal); if (SqlDbType.Udt == sqlMetaData.SqlDbType) { return null; } return MetaType.GetMetaTypeFromSqlDbType(sqlMetaData.SqlDbType, isMultiValued: false).TypeName; } public virtual Type GetFieldType(int ordinal) { EnsureSubclassOverride(); return MetaType.GetMetaTypeFromSqlDbType(GetSqlMetaData(ordinal).SqlDbType, isMultiValued: false).ClassType; } public virtual object GetValue(int ordinal) { EnsureSubclassOverride(); SmiMetaData smiMetaData = GetSmiMetaData(ordinal); return ValueUtilsSmi.GetValue200(_eventSink, _recordBuffer, ordinal, smiMetaData); } public virtual int GetValues(object[] values) { EnsureSubclassOverride(); if (values == null) { throw ADP.ArgumentNull("values"); } int num = ((values.Length < FieldCount) ? values.Length : FieldCount); for (int i = 0; i < num; i++) { values[i] = GetValue(i); } return num; } public virtual int GetOrdinal(string name) { EnsureSubclassOverride(); if (_fieldNameLookup == null) { string[] array = new string[FieldCount]; for (int i = 0; i < array.Length; i++) { array[i] = GetSqlMetaData(i).Name; } _fieldNameLookup = new FieldNameLookup(array, -1); } return _fieldNameLookup.GetOrdinal(name); } public virtual bool GetBoolean(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetBoolean(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual byte GetByte(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetByte(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual long GetBytes(int ordinal, long fieldOffset, byte[] buffer, int bufferOffset, int length) { EnsureSubclassOverride(); return ValueUtilsSmi.GetBytes(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), fieldOffset, buffer, bufferOffset, length, throwOnNull: true); } public virtual char GetChar(int ordinal) { EnsureSubclassOverride(); throw ADP.NotSupported(); } public virtual long GetChars(int ordinal, long fieldOffset, char[] buffer, int bufferOffset, int length) { EnsureSubclassOverride(); return ValueUtilsSmi.GetChars(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), fieldOffset, buffer, bufferOffset, length); } public virtual Guid GetGuid(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetGuid(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual short GetInt16(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetInt16(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual int GetInt32(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetInt32(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual long GetInt64(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetInt64(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual float GetFloat(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetSingle(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual double GetDouble(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetDouble(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual string GetString(int ordinal) { EnsureSubclassOverride(); SmiMetaData smiMetaData = GetSmiMetaData(ordinal); if (_usesStringStorageForXml && SqlDbType.Xml == smiMetaData.SqlDbType) { return ValueUtilsSmi.GetString(_eventSink, _recordBuffer, ordinal, s_maxNVarCharForXml); } return ValueUtilsSmi.GetString(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual decimal GetDecimal(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetDecimal(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual DateTime GetDateTime(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetDateTime(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual DateTimeOffset GetDateTimeOffset(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetDateTimeOffset(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual TimeSpan GetTimeSpan(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetTimeSpan(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual bool IsDBNull(int ordinal) { EnsureSubclassOverride(); ThrowIfInvalidOrdinal(ordinal); return ValueUtilsSmi.IsDBNull(_eventSink, _recordBuffer, ordinal); } public virtual SqlMetaData GetSqlMetaData(int ordinal) { EnsureSubclassOverride(); return _columnMetaData[ordinal]; } public virtual Type GetSqlFieldType(int ordinal) { EnsureSubclassOverride(); return MetaType.GetMetaTypeFromSqlDbType(GetSqlMetaData(ordinal).SqlDbType, isMultiValued: false).SqlType; } public virtual object GetSqlValue(int ordinal) { EnsureSubclassOverride(); SmiMetaData smiMetaData = GetSmiMetaData(ordinal); return ValueUtilsSmi.GetSqlValue200(_eventSink, _recordBuffer, ordinal, smiMetaData); } public virtual int GetSqlValues(object[] values) { EnsureSubclassOverride(); if (values == null) { throw ADP.ArgumentNull("values"); } int num = ((values.Length < FieldCount) ? values.Length : FieldCount); for (int i = 0; i < num; i++) { values[i] = GetSqlValue(i); } return num; } public virtual SqlBinary GetSqlBinary(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetSqlBinary(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual SqlBytes GetSqlBytes(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetSqlBytes(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual SqlXml GetSqlXml(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetSqlXml(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual SqlBoolean GetSqlBoolean(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetSqlBoolean(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual SqlByte GetSqlByte(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetSqlByte(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual SqlChars GetSqlChars(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetSqlChars(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual SqlInt16 GetSqlInt16(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetSqlInt16(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual SqlInt32 GetSqlInt32(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetSqlInt32(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual SqlInt64 GetSqlInt64(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetSqlInt64(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual SqlSingle GetSqlSingle(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetSqlSingle(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual SqlDouble GetSqlDouble(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetSqlDouble(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual SqlMoney GetSqlMoney(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetSqlMoney(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual SqlDateTime GetSqlDateTime(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetSqlDateTime(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual SqlDecimal GetSqlDecimal(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetSqlDecimal(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual SqlString GetSqlString(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetSqlString(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual SqlGuid GetSqlGuid(int ordinal) { EnsureSubclassOverride(); return ValueUtilsSmi.GetSqlGuid(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal)); } public virtual int SetValues(params object[] values) { EnsureSubclassOverride(); if (values == null) { throw ADP.ArgumentNull("values"); } int num = ((values.Length > FieldCount) ? FieldCount : values.Length); ExtendedClrTypeCode[] array = new ExtendedClrTypeCode[num]; for (int i = 0; i < num; i++) { SqlMetaData sqlMetaData = GetSqlMetaData(i); array[i] = MetaDataUtilsSmi.DetermineExtendedTypeCodeForUseWithSqlDbType(sqlMetaData.SqlDbType, isMultiValued: false, values[i]); if (ExtendedClrTypeCode.Invalid == array[i]) { throw ADP.InvalidCast(); } } for (int j = 0; j < num; j++) { ValueUtilsSmi.SetCompatibleValueV200(_eventSink, _recordBuffer, j, GetSmiMetaData(j), values[j], array[j], 0, 0, null); } return num; } public virtual void SetValue(int ordinal, object value) { EnsureSubclassOverride(); ExtendedClrTypeCode extendedClrTypeCode = MetaDataUtilsSmi.DetermineExtendedTypeCodeForUseWithSqlDbType(GetSqlMetaData(ordinal).SqlDbType, isMultiValued: false, value); if (ExtendedClrTypeCode.Invalid == extendedClrTypeCode) { throw ADP.InvalidCast(); } ValueUtilsSmi.SetCompatibleValueV200(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value, extendedClrTypeCode, 0, 0, null); } public virtual void SetBoolean(int ordinal, bool value) { EnsureSubclassOverride(); ValueUtilsSmi.SetBoolean(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetByte(int ordinal, byte value) { EnsureSubclassOverride(); ValueUtilsSmi.SetByte(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetBytes(int ordinal, long fieldOffset, byte[] buffer, int bufferOffset, int length) { EnsureSubclassOverride(); ValueUtilsSmi.SetBytes(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), fieldOffset, buffer, bufferOffset, length); } public virtual void SetChar(int ordinal, char value) { EnsureSubclassOverride(); throw ADP.NotSupported(); } public virtual void SetChars(int ordinal, long fieldOffset, char[] buffer, int bufferOffset, int length) { EnsureSubclassOverride(); ValueUtilsSmi.SetChars(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), fieldOffset, buffer, bufferOffset, length); } public virtual void SetInt16(int ordinal, short value) { EnsureSubclassOverride(); ValueUtilsSmi.SetInt16(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetInt32(int ordinal, int value) { EnsureSubclassOverride(); ValueUtilsSmi.SetInt32(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetInt64(int ordinal, long value) { EnsureSubclassOverride(); ValueUtilsSmi.SetInt64(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetFloat(int ordinal, float value) { EnsureSubclassOverride(); ValueUtilsSmi.SetSingle(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetDouble(int ordinal, double value) { EnsureSubclassOverride(); ValueUtilsSmi.SetDouble(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetString(int ordinal, string value) { EnsureSubclassOverride(); ValueUtilsSmi.SetString(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetDecimal(int ordinal, decimal value) { EnsureSubclassOverride(); ValueUtilsSmi.SetDecimal(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetDateTime(int ordinal, DateTime value) { EnsureSubclassOverride(); ValueUtilsSmi.SetDateTime(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetTimeSpan(int ordinal, TimeSpan value) { EnsureSubclassOverride(); ValueUtilsSmi.SetTimeSpan(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetDateTimeOffset(int ordinal, DateTimeOffset value) { EnsureSubclassOverride(); ValueUtilsSmi.SetDateTimeOffset(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetDBNull(int ordinal) { EnsureSubclassOverride(); ValueUtilsSmi.SetDBNull(_eventSink, _recordBuffer, ordinal, value: true); } public virtual void SetGuid(int ordinal, Guid value) { EnsureSubclassOverride(); ValueUtilsSmi.SetGuid(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetSqlBoolean(int ordinal, SqlBoolean value) { EnsureSubclassOverride(); ValueUtilsSmi.SetSqlBoolean(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetSqlByte(int ordinal, SqlByte value) { EnsureSubclassOverride(); ValueUtilsSmi.SetSqlByte(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetSqlInt16(int ordinal, SqlInt16 value) { EnsureSubclassOverride(); ValueUtilsSmi.SetSqlInt16(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetSqlInt32(int ordinal, SqlInt32 value) { EnsureSubclassOverride(); ValueUtilsSmi.SetSqlInt32(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetSqlInt64(int ordinal, SqlInt64 value) { EnsureSubclassOverride(); ValueUtilsSmi.SetSqlInt64(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetSqlSingle(int ordinal, SqlSingle value) { EnsureSubclassOverride(); ValueUtilsSmi.SetSqlSingle(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetSqlDouble(int ordinal, SqlDouble value) { EnsureSubclassOverride(); ValueUtilsSmi.SetSqlDouble(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetSqlMoney(int ordinal, SqlMoney value) { EnsureSubclassOverride(); ValueUtilsSmi.SetSqlMoney(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetSqlDateTime(int ordinal, SqlDateTime value) { EnsureSubclassOverride(); ValueUtilsSmi.SetSqlDateTime(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetSqlXml(int ordinal, SqlXml value) { EnsureSubclassOverride(); ValueUtilsSmi.SetSqlXml(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetSqlDecimal(int ordinal, SqlDecimal value) { EnsureSubclassOverride(); ValueUtilsSmi.SetSqlDecimal(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetSqlString(int ordinal, SqlString value) { EnsureSubclassOverride(); ValueUtilsSmi.SetSqlString(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetSqlBinary(int ordinal, SqlBinary value) { EnsureSubclassOverride(); ValueUtilsSmi.SetSqlBinary(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetSqlGuid(int ordinal, SqlGuid value) { EnsureSubclassOverride(); ValueUtilsSmi.SetSqlGuid(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetSqlChars(int ordinal, SqlChars value) { EnsureSubclassOverride(); ValueUtilsSmi.SetSqlChars(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public virtual void SetSqlBytes(int ordinal, SqlBytes value) { EnsureSubclassOverride(); ValueUtilsSmi.SetSqlBytes(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value); } public SqlDataRecord(params SqlMetaData[] metaData) { if (metaData == null) { throw ADP.ArgumentNull("metaData"); } _columnMetaData = new SqlMetaData[metaData.Length]; _columnSmiMetaData = new SmiExtendedMetaData[metaData.Length]; for (int i = 0; i < _columnSmiMetaData.Length; i++) { if (metaData[i] == null) { throw ADP.ArgumentNull(string.Format("{0}[{1}]", "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 SqlDataRecord(SmiRecordBuffer recordBuffer, params SmiExtendedMetaData[] metaData) { _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(); } internal SqlMetaData[] InternalGetMetaData() { return _columnMetaData; } internal SmiExtendedMetaData[] InternalGetSmiMetaData() { return _columnSmiMetaData; } internal SmiExtendedMetaData GetSmiMetaData(int ordinal) { return _columnSmiMetaData[ordinal]; } internal void ThrowIfInvalidOrdinal(int ordinal) { if (0 > ordinal || FieldCount <= ordinal) { throw ADP.IndexOutOfRange(ordinal); } } private void EnsureSubclassOverride() { if (_recordBuffer == null) { throw SQL.SubclassMustOverride(); } } public IDataReader GetData(int i) { throw ADP.NotSupported(); } } internal sealed class SqlRecordBuffer { internal enum StorageType { Boolean, Byte, ByteArray, CharArray, DateTime, DateTimeOffset, Double, Guid, Int16, Int32, Int64, Single, String, SqlDecimal, TimeSpan } [StructLayout(LayoutKind.Explicit)] internal struct Storage { [FieldOffset(0)] internal bool _boolean; [FieldOffset(0)] internal byte _byte; [FieldOffset(0)] internal DateTime _dateTime; [FieldOffset(0)] internal DateTimeOffset _dateTimeOffset; [FieldOffset(0)] internal double _double; [FieldOffset(0)] internal Guid _guid; [FieldOffset(0)] internal short _int16; [FieldOffset(0)] internal int _int32; [FieldOffset(0)] internal long _int64; [FieldOffset(0)] internal float _single; [FieldOffset(0)] internal TimeSpan _timeSpan; } private bool _isNull; private StorageType _type; private Storage _value; private object _object; private SmiMetaData _metadata; private bool _isMetaSet; internal bool IsNull => _isNull; internal bool Boolean { get { return _value._boolean; } set { _value._boolean = value; _type = StorageType.Boolean; _isNull = false; } } internal byte Byte { get { return _value._byte; } set { _value._byte = value; _type = StorageType.Byte; _isNull = false; } } internal DateTime DateTime { get { return _value._dateTime; } set { _value._dateTime = value; _type = StorageType.DateTime; _isNull = false; if (_isMetaSet) { _isMetaSet = false; } else { _metadata = null; } } } internal DateTimeOffset DateTimeOffset { get { return _value._dateTimeOffset; } set { _value._dateTimeOffset = value; _type = StorageType.DateTimeOffset; _isNull = false; } } internal double Double { get { return _value._double; } set { _value._double = value; _type = StorageType.Double; _isNull = false; } } internal Guid Guid { get { return _value._guid; } set { _value._guid = value; _type = StorageType.Guid; _isNull = false; } } internal short Int16 { get { return _value._int16; } set { _value._int16 = value; _type = StorageType.Int16; _isNull = false; } } internal int Int32 { get { return _value._int32; } set { _value._int32 = value; _type = StorageType.Int32; _isNull = false; } } internal long Int64 { get { return _value._int64; } set { _value._int64 = value; _type = StorageType.Int64; _isNull = false; if (_isMetaSet) { _isMetaSet = false; } else { _metadata = null; } } } internal float Single { get { return _value._single; } set { _value._single = value; _type = StorageType.Single; _isNull = false; } } internal string String { get { if (StorageType.String == _type) { return (string)_object; } if (StorageType.CharArray == _type) { return new string((char[])_object, 0, (int)CharsLength); } return new SqlXml(new MemoryStream((byte[])_object, writable: false)).Value; } set { _object = value; _value._int64 = value.Length; _type = StorageType.String; _isNull = false; if (_isMetaSet) { _isMetaSet = false; } else { _metadata = null; } } } internal SqlDecimal SqlDecimal { get { return (SqlDecimal)_object; } set { _object = value; _type = StorageType.SqlDecimal; _isNull = false; } } internal TimeSpan TimeSpan { get { return _value._timeSpan; } set { _value._timeSpan = value; _type = StorageType.TimeSpan; _isNull = false; } } internal long BytesLength { get { if (StorageType.String == _type) { ConvertXmlStringToByteArray(); } return _value._int64; } set { if (value == 0L) { _value._int64 = value; _object = Array.Empty(); _type = StorageType.ByteArray; _isNull = false; } else { _value._int64 = value; } } } internal long CharsLength { get { return _value._int64; } set { if (value == 0L) { _value._int64 = value; _object = Array.Empty(); _type = StorageType.CharArray; _isNull = false; } else { _value._int64 = value; } } } internal SmiMetaData VariantType { get { return _type switch { StorageType.Boolean => SmiMetaData.DefaultBit, StorageType.Byte => SmiMetaData.DefaultTinyInt, StorageType.ByteArray => SmiMetaData.DefaultVarBinary, StorageType.CharArray => SmiMetaData.DefaultNVarChar, StorageType.DateTime => _metadata ?? SmiMetaData.DefaultDateTime, StorageType.DateTimeOffset => SmiMetaData.DefaultDateTimeOffset, StorageType.Double => SmiMetaData.DefaultFloat, StorageType.Guid => SmiMetaData.DefaultUniqueIdentifier, StorageType.Int16 => SmiMetaData.DefaultSmallInt, StorageType.Int32 => SmiMetaData.DefaultInt, StorageType.Int64 => _metadata ?? SmiMetaData.DefaultBigInt, StorageType.Single => SmiMetaData.DefaultReal, StorageType.String => _metadata ?? SmiMetaData.DefaultNVarChar, StorageType.SqlDecimal => new SmiMetaData(SqlDbType.Decimal, 17L, ((SqlDecimal)_object).Precision, ((SqlDecimal)_object).Scale, 0L, SqlCompareOptions.None), StorageType.TimeSpan => SmiMetaData.DefaultTime, _ => null, }; } set { _metadata = value; _isMetaSet = true; } } internal SqlRecordBuffer(SmiMetaData metaData) { _isNull = true; } internal int GetBytes(long fieldOffset, byte[] buffer, int bufferOffset, int length) { int srcOffset = (int)fieldOffset; if (StorageType.String == _type) { ConvertXmlStringToByteArray(); } Buffer.BlockCopy((byte[])_object, srcOffset, buffer, bufferOffset, length); return length; } internal int GetChars(long fieldOffset, char[] buffer, int bufferOffset, int length) { int sourceIndex = (int)fieldOffset; if (StorageType.CharArray == _type) { Array.Copy((char[])_object, sourceIndex, buffer, bufferOffset, length); } else { ((string)_object).CopyTo(sourceIndex, buffer, bufferOffset, length); } return length; } internal int SetBytes(long fieldOffset, byte[] buffer, int bufferOffset, int length) { int num = (int)fieldOffset; if (IsNull || StorageType.ByteArray != _type) { if (num != 0) { throw ADP.ArgumentOutOfRange("fieldOffset"); } _object = new byte[length]; _type = StorageType.ByteArray; _isNull = false; BytesLength = length; } else { if (num > BytesLength) { throw ADP.ArgumentOutOfRange("fieldOffset"); } if (num + length > BytesLength) { int num2 = ((byte[])_object).Length; if (num + length > num2) { byte[] array = new byte[Math.Max(num + length, 2 * num2)]; Buffer.BlockCopy((byte[])_object, 0, array, 0, (int)BytesLength); _object = array; } BytesLength = num + length; } } Buffer.BlockCopy(buffer, bufferOffset, (byte[])_object, num, length); return length; } internal int SetChars(long fieldOffset, char[] buffer, int bufferOffset, int length) { int num = (int)fieldOffset; if (IsNull || (StorageType.CharArray != _type && StorageType.String != _type)) { if (num != 0) { throw ADP.ArgumentOutOfRange("fieldOffset"); } _object = new char[length]; _type = StorageType.CharArray; _isNull = false; CharsLength = length; } else { if (num > CharsLength) { throw ADP.ArgumentOutOfRange("fieldOffset"); } if (StorageType.String == _type) { _object = ((string)_object).ToCharArray(); _type = StorageType.CharArray; } if (num + length > CharsLength) { int num2 = ((char[])_object).Length; if (num + length > num2) { char[] array = new char[Math.Max(num + length, 2 * num2)]; Array.Copy((char[])_object, 0, array, 0, (int)CharsLength); _object = array; } CharsLength = num + length; } } Array.Copy(buffer, bufferOffset, (char[])_object, num, length); return length; } internal void SetNull() { _isNull = true; } private void ConvertXmlStringToByteArray() { string text = (string)_object; byte[] array = new byte[2 + Encoding.Unicode.GetByteCount(text)]; array[0] = byte.MaxValue; array[1] = 254; Encoding.Unicode.GetBytes(text, 0, text.Length, array, 2); _object = array; _value._int64 = array.Length; _type = StorageType.ByteArray; } } internal static class ValueUtilsSmi { private const int __maxByteChunkSize = 8000; private const int __maxCharChunkSize = 4000; private const int NoLengthLimit = -1; private const int constBinBufferSize = 4096; private const int constTextBufferSize = 4096; private static object[] s_typeSpecificNullForSqlValue = new object[35] { SqlInt64.Null, SqlBinary.Null, SqlBoolean.Null, SqlString.Null, SqlDateTime.Null, SqlDecimal.Null, SqlDouble.Null, SqlBinary.Null, SqlInt32.Null, SqlMoney.Null, SqlString.Null, SqlString.Null, SqlString.Null, SqlSingle.Null, SqlGuid.Null, SqlDateTime.Null, SqlInt16.Null, SqlMoney.Null, SqlString.Null, SqlBinary.Null, SqlByte.Null, SqlBinary.Null, SqlString.Null, DBNull.Value, null, SqlXml.Null, null, null, null, null, null, DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value }; private static readonly DateTime s_dtSmallMax = new DateTime(2079, 6, 6, 23, 59, 29, 998); private static readonly DateTime s_dtSmallMin = new DateTime(1899, 12, 31, 23, 59, 29, 999); private static readonly TimeSpan s_timeMin = TimeSpan.Zero; private static readonly TimeSpan s_timeMax = new TimeSpan(863999999999L); private const bool X = true; private const bool _ = false; private static bool[,] s_canAccessGetterDirectly = new bool[45, 35] { { false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, true, false, false, false, false, false, false, true, true, true, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, true, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, true, false, false, false, false, false, false, true, true, true, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false }, { false, true, false, true, false, false, false, true, false, false, true, true, true, false, false, false, false, false, true, true, false, true, true, false, false, true, false, false, false, true, false, false, false, false, false }, { false, false, false, true, false, false, false, false, false, false, true, true, true, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, true, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, true, false, true, false, false, false, false, false, false, false, true, false, false, false, false, false }, { false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, true, false }, { false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, true, false, false, false, false, false, false, true, true, true, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, true, false, false, false, false, false, false, true, true, true, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false }, { false, true, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, true, false, true, false, false, false, false, false, false, false, true, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true }, { false, true, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, true, false, false, false, false, false }, { false, false, false, true, false, false, false, false, false, false, true, true, true, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false } }; private static bool[,] s_canAccessSetterDirectly = new bool[45, 35] { { false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, true, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, true, false, false, false, false, false, false, true, true, true, false, false, false, false, false, true, false, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, true, false, true, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, true, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false }, { true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, true, false, false, false, false, false, false, true, true, true, false, false, false, false, false, true, false, false, false, true, true, false, true, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false }, { false, true, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, true, false, true, false, true, false, true, false, false, false, true, false, false, false, false, false }, { false, false, false, true, false, false, false, false, false, false, true, true, true, false, false, false, false, false, true, false, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false }, { false, true, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, true, false, true, false, true, false, false, false, false, false, true, false, false, false, false, false }, { false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, true, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, true, false, true, false }, { false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false }, { true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, true, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, true, false, false, false, false, false, false, true, true, true, false, false, false, false, false, true, false, false, false, true, true, false, true, false, false, false, false, false, false, false, false, false }, { false, false, false, true, false, false, false, false, false, false, true, true, true, false, false, false, false, false, true, false, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false }, { false, true, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, true, false, true, false, true, false, false, false, false, false, true, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false } }; internal static bool IsDBNull(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal) { return IsDBNull_Unchecked(sink, getters, ordinal); } internal static bool GetBoolean(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { ThrowIfITypedGettersIsNull(sink, getters, ordinal); if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.Boolean)) { return GetBoolean_Unchecked(sink, getters, ordinal); } object value = GetValue(sink, getters, ordinal, metaData); if (value == null) { throw ADP.InvalidCast(); } return (bool)value; } 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 value = GetValue(sink, getters, ordinal, metaData); if (value == null) { throw ADP.InvalidCast(); } return (byte)value; } private static long GetBytesConversion(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, long fieldOffset, byte[] buffer, int bufferOffset, int length, bool throwOnNull) { object sqlValue = GetSqlValue(sink, getters, ordinal, metaData); if (sqlValue == null) { throw ADP.InvalidCast(); } SqlBinary sqlBinary = (SqlBinary)sqlValue; if (sqlBinary.IsNull) { if (throwOnNull) { throw SQL.SqlNullValue(); } return 0L; } if (buffer == null) { return sqlBinary.Length; } length = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength * 2, sqlBinary.Length, fieldOffset, buffer.Length, bufferOffset, length); Array.Copy(sqlBinary.Value, checked((int)fieldOffset), buffer, bufferOffset, length); return length; } internal static long GetBytes(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiExtendedMetaData metaData, long fieldOffset, byte[] buffer, int bufferOffset, int length, bool throwOnNull) { if ((-1 != metaData.MaxLength && (SqlDbType.VarChar == metaData.SqlDbType || SqlDbType.NVarChar == metaData.SqlDbType || SqlDbType.Char == metaData.SqlDbType || SqlDbType.NChar == metaData.SqlDbType)) || SqlDbType.Xml == metaData.SqlDbType) { throw SQL.NonBlobColumn(metaData.Name); } return GetBytesInternal(sink, getters, ordinal, metaData, fieldOffset, buffer, bufferOffset, length, throwOnNull); } internal static long GetBytesInternal(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, long fieldOffset, byte[] buffer, int bufferOffset, int length, bool throwOnNull) { if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.ByteArray)) { if (IsDBNull_Unchecked(sink, getters, ordinal)) { if (throwOnNull) { throw SQL.SqlNullValue(); } CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, 0L, fieldOffset, buffer.Length, bufferOffset, length); return 0L; } long bytesLength_Unchecked = GetBytesLength_Unchecked(sink, getters, ordinal); if (buffer == null) { return bytesLength_Unchecked; } length = ((!MetaDataUtilsSmi.IsCharOrXmlType(metaData.SqlDbType)) ? CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, bytesLength_Unchecked, fieldOffset, buffer.Length, bufferOffset, length) : CheckXetParameters(metaData.SqlDbType, metaData.MaxLength * 2, bytesLength_Unchecked, fieldOffset, buffer.Length, bufferOffset, length)); if (length > 0) { length = GetBytes_Unchecked(sink, getters, ordinal, fieldOffset, buffer, bufferOffset, length); } return length; } return GetBytesConversion(sink, getters, ordinal, metaData, fieldOffset, buffer, bufferOffset, length, throwOnNull); } internal static long GetChars(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, long fieldOffset, char[] buffer, int bufferOffset, int length) { ThrowIfITypedGettersIsNull(sink, getters, ordinal); if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.CharArray)) { long charsLength_Unchecked = GetCharsLength_Unchecked(sink, getters, ordinal); if (buffer == null) { return charsLength_Unchecked; } length = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, charsLength_Unchecked, fieldOffset, buffer.Length, bufferOffset, length); if (length > 0) { length = GetChars_Unchecked(sink, getters, ordinal, fieldOffset, buffer, bufferOffset, length); } return length; } string text = (string)GetValue(sink, getters, ordinal, metaData); if (text == null) { throw ADP.InvalidCast(); } if (buffer == null) { return text.Length; } length = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength * 2, text.Length, fieldOffset, buffer.Length, bufferOffset, length); text.CopyTo(checked((int)fieldOffset), buffer, bufferOffset, length); return length; } internal static DateTime GetDateTime(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { ThrowIfITypedGettersIsNull(sink, getters, ordinal); if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.DateTime)) { return GetDateTime_Unchecked(sink, getters, ordinal); } object value = GetValue(sink, getters, ordinal, metaData); if (value == null) { throw ADP.InvalidCast(); } return (DateTime)value; } internal static DateTimeOffset GetDateTimeOffset(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData, bool gettersSupportKatmaiDateTime) { if (gettersSupportKatmaiDateTime) { return GetDateTimeOffset(sink, (SmiTypedGetterSetter)getters, ordinal, metaData); } ThrowIfITypedGettersIsNull(sink, getters, ordinal); object value = GetValue(sink, getters, ordinal, metaData); if (value == null) { throw ADP.InvalidCast(); } return (DateTimeOffset)value; } internal static DateTimeOffset GetDateTimeOffset(SmiEventSink_Default sink, SmiTypedGetterSetter getters, int ordinal, SmiMetaData metaData) { ThrowIfITypedGettersIsNull(sink, getters, ordinal); if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.DateTimeOffset)) { return GetDateTimeOffset_Unchecked(sink, getters, ordinal); } return (DateTimeOffset)GetValue200(sink, getters, ordinal, metaData); } internal static decimal GetDecimal(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { ThrowIfITypedGettersIsNull(sink, getters, ordinal); if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.Decimal)) { return GetDecimal_PossiblyMoney(sink, getters, ordinal, metaData); } object value = GetValue(sink, getters, ordinal, metaData); if (value == null) { throw ADP.InvalidCast(); } return (decimal)value; } internal static double GetDouble(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { ThrowIfITypedGettersIsNull(sink, getters, ordinal); if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.Double)) { return GetDouble_Unchecked(sink, getters, ordinal); } object value = GetValue(sink, getters, ordinal, metaData); if (value == null) { throw ADP.InvalidCast(); } return (double)value; } internal static Guid GetGuid(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { ThrowIfITypedGettersIsNull(sink, getters, ordinal); if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.Guid)) { return GetGuid_Unchecked(sink, getters, ordinal); } object value = GetValue(sink, getters, ordinal, metaData); if (value == null) { throw ADP.InvalidCast(); } return (Guid)value; } internal static short GetInt16(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { ThrowIfITypedGettersIsNull(sink, getters, ordinal); if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.Int16)) { return GetInt16_Unchecked(sink, getters, ordinal); } object value = GetValue(sink, getters, ordinal, metaData); if (value == null) { throw ADP.InvalidCast(); } return (short)value; } internal static int GetInt32(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { ThrowIfITypedGettersIsNull(sink, getters, ordinal); if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.Int32)) { return GetInt32_Unchecked(sink, getters, ordinal); } object value = GetValue(sink, getters, ordinal, metaData); if (value == null) { throw ADP.InvalidCast(); } return (int)value; } internal static long GetInt64(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { ThrowIfITypedGettersIsNull(sink, getters, ordinal); if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.Int64)) { return GetInt64_Unchecked(sink, getters, ordinal); } object value = GetValue(sink, getters, ordinal, metaData); if (value == null) { throw ADP.InvalidCast(); } return (long)value; } internal static float GetSingle(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { ThrowIfITypedGettersIsNull(sink, getters, ordinal); if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.Single)) { return GetSingle_Unchecked(sink, getters, ordinal); } object value = GetValue(sink, getters, ordinal, metaData); if (value == null) { throw ADP.InvalidCast(); } return (float)value; } internal static SqlBinary GetSqlBinary(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlBinary)) { if (IsDBNull_Unchecked(sink, getters, ordinal)) { return SqlBinary.Null; } return GetSqlBinary_Unchecked(sink, getters, ordinal); } object sqlValue = GetSqlValue(sink, getters, ordinal, metaData); if (sqlValue == null) { throw ADP.InvalidCast(); } return (SqlBinary)sqlValue; } internal static SqlBoolean GetSqlBoolean(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlBoolean)) { if (IsDBNull_Unchecked(sink, getters, ordinal)) { return SqlBoolean.Null; } return new SqlBoolean(GetBoolean_Unchecked(sink, getters, ordinal)); } object sqlValue = GetSqlValue(sink, getters, ordinal, metaData); if (sqlValue == null) { throw ADP.InvalidCast(); } return (SqlBoolean)sqlValue; } internal static SqlByte GetSqlByte(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlByte)) { if (IsDBNull_Unchecked(sink, getters, ordinal)) { return SqlByte.Null; } return new SqlByte(GetByte_Unchecked(sink, getters, ordinal)); } object sqlValue = GetSqlValue(sink, getters, ordinal, metaData); if (sqlValue == null) { throw ADP.InvalidCast(); } return (SqlByte)sqlValue; } internal static SqlBytes GetSqlBytes(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlBytes)) { if (IsDBNull_Unchecked(sink, getters, ordinal)) { return SqlBytes.Null; } long bytesLength_Unchecked = GetBytesLength_Unchecked(sink, getters, ordinal); if (0 <= bytesLength_Unchecked && bytesLength_Unchecked < 8000) { return new SqlBytes(GetByteArray_Unchecked(sink, getters, ordinal)); } return new SqlBytes(CopyIntoNewSmiScratchStream(new SmiGettersStream(sink, getters, ordinal, metaData), sink)); } object sqlValue = GetSqlValue(sink, getters, ordinal, metaData); if (sqlValue == null) { throw ADP.InvalidCast(); } SqlBinary sqlBinary = (SqlBinary)sqlValue; if (sqlBinary.IsNull) { return SqlBytes.Null; } return new SqlBytes(sqlBinary.Value); } internal static SqlChars GetSqlChars(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlChars)) { if (IsDBNull_Unchecked(sink, getters, ordinal)) { return SqlChars.Null; } return new SqlChars(GetCharArray_Unchecked(sink, getters, ordinal)); } if (SqlDbType.Xml == metaData.SqlDbType) { SqlXml sqlXml_Unchecked = GetSqlXml_Unchecked(sink, getters, ordinal); if (sqlXml_Unchecked.IsNull) { return SqlChars.Null; } return new SqlChars(sqlXml_Unchecked.Value.ToCharArray()); } object sqlValue = GetSqlValue(sink, getters, ordinal, metaData); if (sqlValue == null) { throw ADP.InvalidCast(); } SqlString sqlString = (SqlString)sqlValue; if (sqlString.IsNull) { return SqlChars.Null; } return new SqlChars(sqlString.Value.ToCharArray()); } internal static SqlDateTime GetSqlDateTime(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlDateTime)) { if (IsDBNull_Unchecked(sink, getters, ordinal)) { return SqlDateTime.Null; } DateTime dateTime_Unchecked = GetDateTime_Unchecked(sink, getters, ordinal); return new SqlDateTime(dateTime_Unchecked); } object sqlValue = GetSqlValue(sink, getters, ordinal, metaData); if (sqlValue == null) { throw ADP.InvalidCast(); } return (SqlDateTime)sqlValue; } internal static SqlDecimal GetSqlDecimal(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlDecimal)) { if (IsDBNull_Unchecked(sink, getters, ordinal)) { return SqlDecimal.Null; } return GetSqlDecimal_Unchecked(sink, getters, ordinal); } object sqlValue = GetSqlValue(sink, getters, ordinal, metaData); if (sqlValue == null) { throw ADP.InvalidCast(); } return (SqlDecimal)sqlValue; } internal static SqlDouble GetSqlDouble(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlDouble)) { if (IsDBNull_Unchecked(sink, getters, ordinal)) { return SqlDouble.Null; } double double_Unchecked = GetDouble_Unchecked(sink, getters, ordinal); return new SqlDouble(double_Unchecked); } object sqlValue = GetSqlValue(sink, getters, ordinal, metaData); if (sqlValue == null) { throw ADP.InvalidCast(); } return (SqlDouble)sqlValue; } internal static SqlGuid GetSqlGuid(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlGuid)) { if (IsDBNull_Unchecked(sink, getters, ordinal)) { return SqlGuid.Null; } Guid guid_Unchecked = GetGuid_Unchecked(sink, getters, ordinal); return new SqlGuid(guid_Unchecked); } object sqlValue = GetSqlValue(sink, getters, ordinal, metaData); if (sqlValue == null) { throw ADP.InvalidCast(); } return (SqlGuid)sqlValue; } internal static SqlInt16 GetSqlInt16(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlInt16)) { if (IsDBNull_Unchecked(sink, getters, ordinal)) { return SqlInt16.Null; } short int16_Unchecked = GetInt16_Unchecked(sink, getters, ordinal); return new SqlInt16(int16_Unchecked); } object sqlValue = GetSqlValue(sink, getters, ordinal, metaData); if (sqlValue == null) { throw ADP.InvalidCast(); } return (SqlInt16)sqlValue; } internal static SqlInt32 GetSqlInt32(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlInt32)) { if (IsDBNull_Unchecked(sink, getters, ordinal)) { return SqlInt32.Null; } int int32_Unchecked = GetInt32_Unchecked(sink, getters, ordinal); return new SqlInt32(int32_Unchecked); } object sqlValue = GetSqlValue(sink, getters, ordinal, metaData); if (sqlValue == null) { throw ADP.InvalidCast(); } return (SqlInt32)sqlValue; } internal static SqlInt64 GetSqlInt64(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlInt64)) { if (IsDBNull_Unchecked(sink, getters, ordinal)) { return SqlInt64.Null; } long int64_Unchecked = GetInt64_Unchecked(sink, getters, ordinal); return new SqlInt64(int64_Unchecked); } object sqlValue = GetSqlValue(sink, getters, ordinal, metaData); if (sqlValue == null) { throw ADP.InvalidCast(); } return (SqlInt64)sqlValue; } internal static SqlMoney GetSqlMoney(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlMoney)) { if (IsDBNull_Unchecked(sink, getters, ordinal)) { return SqlMoney.Null; } return GetSqlMoney_Unchecked(sink, getters, ordinal); } object sqlValue = GetSqlValue(sink, getters, ordinal, metaData); if (sqlValue == null) { throw ADP.InvalidCast(); } return (SqlMoney)sqlValue; } internal static SqlSingle GetSqlSingle(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlSingle)) { if (IsDBNull_Unchecked(sink, getters, ordinal)) { return SqlSingle.Null; } float single_Unchecked = GetSingle_Unchecked(sink, getters, ordinal); return new SqlSingle(single_Unchecked); } object sqlValue = GetSqlValue(sink, getters, ordinal, metaData); if (sqlValue == null) { throw ADP.InvalidCast(); } return (SqlSingle)sqlValue; } 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)) { return SqlString.Null; } string string_Unchecked = GetString_Unchecked(sink, getters, ordinal); result = new SqlString(string_Unchecked); } else { if (SqlDbType.Xml != metaData.SqlDbType) { object sqlValue = GetSqlValue(sink, getters, ordinal, metaData); if (sqlValue == null) { throw ADP.InvalidCast(); } return (SqlString)sqlValue; } SqlXml sqlXml_Unchecked = GetSqlXml_Unchecked(sink, getters, ordinal); if (sqlXml_Unchecked.IsNull) { return SqlString.Null; } result = new SqlString(sqlXml_Unchecked.Value); } return result; } internal static SqlXml GetSqlXml(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { if (CanAccessGetterDirectly(metaData, ExtendedClrTypeCode.SqlXml)) { if (IsDBNull_Unchecked(sink, getters, ordinal)) { return SqlXml.Null; } return GetSqlXml_Unchecked(sink, getters, ordinal); } object sqlValue = GetSqlValue(sink, getters, ordinal, metaData); if (sqlValue == null) { throw ADP.InvalidCast(); } return (SqlXml)sqlValue; } 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 value = GetValue(sink, getters, ordinal, metaData); if (value == null) { throw ADP.InvalidCast(); } return (string)value; } 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); } internal static object GetValue200(SmiEventSink_Default sink, SmiTypedGetterSetter getters, int ordinal, SmiMetaData metaData) { object obj = null; if (IsDBNull_Unchecked(sink, getters, ordinal)) { return DBNull.Value; } switch (metaData.SqlDbType) { case SqlDbType.Variant: metaData = getters.GetVariantType(sink, ordinal); sink.ProcessMessagesAndThrow(); return GetValue200(sink, getters, ordinal, metaData); case SqlDbType.Date: case SqlDbType.DateTime2: return GetDateTime_Unchecked(sink, getters, ordinal); case SqlDbType.Time: return GetTimeSpan_Unchecked(sink, getters, ordinal); case SqlDbType.DateTimeOffset: return GetDateTimeOffset_Unchecked(sink, getters, ordinal); default: return GetValue(sink, getters, ordinal, metaData); } } internal static object GetValue(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { object result = null; if (IsDBNull_Unchecked(sink, getters, ordinal)) { result = DBNull.Value; } else { switch (metaData.SqlDbType) { case SqlDbType.BigInt: result = GetInt64_Unchecked(sink, getters, ordinal); break; case SqlDbType.Binary: result = GetByteArray_Unchecked(sink, getters, ordinal); break; case SqlDbType.Bit: result = GetBoolean_Unchecked(sink, getters, ordinal); break; case SqlDbType.Char: result = GetString_Unchecked(sink, getters, ordinal); break; case SqlDbType.DateTime: result = GetDateTime_Unchecked(sink, getters, ordinal); break; case SqlDbType.Decimal: result = GetSqlDecimal_Unchecked(sink, getters, ordinal).Value; break; case SqlDbType.Float: result = GetDouble_Unchecked(sink, getters, ordinal); break; case SqlDbType.Image: result = GetByteArray_Unchecked(sink, getters, ordinal); break; case SqlDbType.Int: result = GetInt32_Unchecked(sink, getters, ordinal); break; case SqlDbType.Money: result = GetSqlMoney_Unchecked(sink, getters, ordinal).Value; break; case SqlDbType.NChar: result = GetString_Unchecked(sink, getters, ordinal); break; case SqlDbType.NText: result = GetString_Unchecked(sink, getters, ordinal); break; case SqlDbType.NVarChar: result = GetString_Unchecked(sink, getters, ordinal); break; case SqlDbType.Real: result = GetSingle_Unchecked(sink, getters, ordinal); break; case SqlDbType.UniqueIdentifier: result = GetGuid_Unchecked(sink, getters, ordinal); break; case SqlDbType.SmallDateTime: result = GetDateTime_Unchecked(sink, getters, ordinal); break; case SqlDbType.SmallInt: result = GetInt16_Unchecked(sink, getters, ordinal); break; case SqlDbType.SmallMoney: result = GetSqlMoney_Unchecked(sink, getters, ordinal).Value; break; case SqlDbType.Text: result = GetString_Unchecked(sink, getters, ordinal); break; case SqlDbType.Timestamp: result = GetByteArray_Unchecked(sink, getters, ordinal); break; case SqlDbType.TinyInt: result = GetByte_Unchecked(sink, getters, ordinal); break; case SqlDbType.VarBinary: result = GetByteArray_Unchecked(sink, getters, ordinal); break; case SqlDbType.VarChar: result = GetString_Unchecked(sink, getters, ordinal); break; case SqlDbType.Variant: metaData = getters.GetVariantType(sink, ordinal); sink.ProcessMessagesAndThrow(); result = GetValue(sink, getters, ordinal, metaData); break; case SqlDbType.Xml: result = GetSqlXml_Unchecked(sink, getters, ordinal).Value; break; case SqlDbType.Udt: throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString()); } } return result; } internal static object GetSqlValue200(SmiEventSink_Default sink, SmiTypedGetterSetter getters, int ordinal, SmiMetaData metaData) { object obj = null; if (IsDBNull_Unchecked(sink, getters, ordinal)) { if (SqlDbType.Udt == metaData.SqlDbType) { throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString()); } return s_typeSpecificNullForSqlValue[(int)metaData.SqlDbType]; } switch (metaData.SqlDbType) { case SqlDbType.Variant: metaData = getters.GetVariantType(sink, ordinal); sink.ProcessMessagesAndThrow(); return GetSqlValue200(sink, getters, ordinal, metaData); case SqlDbType.Date: case SqlDbType.DateTime2: return GetDateTime_Unchecked(sink, getters, ordinal); case SqlDbType.Time: return GetTimeSpan_Unchecked(sink, getters, ordinal); case SqlDbType.DateTimeOffset: return GetDateTimeOffset_Unchecked(sink, getters, ordinal); default: return GetSqlValue(sink, getters, ordinal, metaData); } } internal static object GetSqlValue(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { object result = null; if (IsDBNull_Unchecked(sink, getters, ordinal)) { if (SqlDbType.Udt == metaData.SqlDbType) { throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString()); } result = s_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(); result = GetSqlValue(sink, getters, ordinal, metaData); break; case SqlDbType.Xml: result = GetSqlXml_Unchecked(sink, getters, ordinal); break; case SqlDbType.Udt: throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString()); } } return result; } internal static void SetDBNull(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, bool value) { SetDBNull_Unchecked(sink, setters, ordinal); } internal static void SetBoolean(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, bool value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.Boolean); SetBoolean_Unchecked(sink, setters, ordinal, value); } internal static void SetByte(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, byte value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.Byte); SetByte_Unchecked(sink, setters, ordinal, value); } internal static long SetBytes(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, long fieldOffset, byte[] buffer, int bufferOffset, int length) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.ByteArray); if (buffer == null) { throw ADP.ArgumentNull("buffer"); } length = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, -1L, fieldOffset, buffer.Length, bufferOffset, length); if (length == 0) { fieldOffset = 0L; bufferOffset = 0; } return SetBytes_Unchecked(sink, setters, ordinal, fieldOffset, buffer, bufferOffset, length); } internal static long SetBytesLength(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, long length) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.ByteArray); if (length < 0) { throw ADP.InvalidDataLength(length); } if (metaData.MaxLength >= 0 && length > metaData.MaxLength) { length = metaData.MaxLength; } setters.SetBytesLength(sink, ordinal, length); sink.ProcessMessagesAndThrow(); return length; } internal static long SetChars(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, long fieldOffset, char[] buffer, int bufferOffset, int length) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.CharArray); if (buffer == null) { throw ADP.ArgumentNull("buffer"); } length = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, -1L, fieldOffset, buffer.Length, bufferOffset, length); if (length == 0) { fieldOffset = 0L; bufferOffset = 0; } return SetChars_Unchecked(sink, setters, ordinal, fieldOffset, buffer, bufferOffset, length); } internal static void SetDateTime(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, DateTime value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.DateTime); SetDateTime_Checked(sink, setters, ordinal, metaData, value); } internal static void SetDateTimeOffset(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, DateTimeOffset value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.DateTimeOffset); SetDateTimeOffset_Unchecked(sink, (SmiTypedGetterSetter)setters, ordinal, value); } internal static void SetDecimal(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, decimal value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.Decimal); SetDecimal_PossiblyMoney(sink, setters, ordinal, metaData, value); } internal static void SetDouble(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, double value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.Double); SetDouble_Unchecked(sink, setters, ordinal, value); } internal static void SetGuid(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, Guid value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.Guid); SetGuid_Unchecked(sink, setters, ordinal, value); } internal static void SetInt16(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, short value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.Int16); SetInt16_Unchecked(sink, setters, ordinal, value); } internal static void SetInt32(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, int value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.Int32); SetInt32_Unchecked(sink, setters, ordinal, value); } internal static void SetInt64(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, long value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.Int64); SetInt64_Unchecked(sink, setters, ordinal, value); } internal static void SetSingle(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, float value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.Single); SetSingle_Unchecked(sink, setters, ordinal, value); } internal static void SetSqlBinary(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlBinary value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlBinary); SetSqlBinary_LengthChecked(sink, setters, ordinal, metaData, value, 0); } internal static void SetSqlBoolean(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlBoolean value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlBoolean); SetSqlBoolean_Unchecked(sink, setters, ordinal, value); } internal static void SetSqlByte(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlByte value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlByte); SetSqlByte_Unchecked(sink, setters, ordinal, value); } internal static void SetSqlBytes(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlBytes value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlBytes); SetSqlBytes_LengthChecked(sink, setters, ordinal, metaData, value, 0); } internal static void SetSqlChars(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlChars value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlChars); SetSqlChars_LengthChecked(sink, setters, ordinal, metaData, value, 0); } internal static void SetSqlDateTime(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlDateTime value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlDateTime); SetSqlDateTime_Checked(sink, setters, ordinal, metaData, value); } internal static void SetSqlDecimal(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlDecimal value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlDecimal); SetSqlDecimal_Unchecked(sink, setters, ordinal, value); } internal static void SetSqlDouble(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlDouble value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlDouble); SetSqlDouble_Unchecked(sink, setters, ordinal, value); } internal static void SetSqlGuid(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlGuid value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlGuid); SetSqlGuid_Unchecked(sink, setters, ordinal, value); } internal static void SetSqlInt16(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlInt16 value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlInt16); SetSqlInt16_Unchecked(sink, setters, ordinal, value); } internal static void SetSqlInt32(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlInt32 value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlInt32); SetSqlInt32_Unchecked(sink, setters, ordinal, value); } internal static void SetSqlInt64(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlInt64 value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlInt64); SetSqlInt64_Unchecked(sink, setters, ordinal, value); } internal static void SetSqlMoney(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlMoney value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlMoney); SetSqlMoney_Checked(sink, setters, ordinal, metaData, value); } internal static void SetSqlSingle(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlSingle value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlSingle); SetSqlSingle_Unchecked(sink, setters, ordinal, value); } internal static void SetSqlString(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlString value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlString); SetSqlString_LengthChecked(sink, setters, ordinal, metaData, value, 0); } internal static void SetSqlXml(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlXml value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.SqlXml); SetSqlXml_Unchecked(sink, setters, ordinal, value); } internal static void SetString(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, string value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.String); SetString_LengthChecked(sink, setters, ordinal, metaData, value, 0); } internal static void SetTimeSpan(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, TimeSpan value) { ThrowIfInvalidSetterAccess(metaData, ExtendedClrTypeCode.TimeSpan); SetTimeSpan_Checked(sink, (SmiTypedGetterSetter)setters, ordinal, metaData, value); } internal static void SetCompatibleValue(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, object value, ExtendedClrTypeCode typeCode, int offset) { switch (typeCode) { case ExtendedClrTypeCode.Invalid: throw ADP.UnknownDataType(value.GetType()); case ExtendedClrTypeCode.Boolean: SetBoolean_Unchecked(sink, setters, ordinal, (bool)value); break; case ExtendedClrTypeCode.Byte: SetByte_Unchecked(sink, setters, ordinal, (byte)value); break; case ExtendedClrTypeCode.Char: { char[] value2 = new char[1] { (char)value }; SetCompatibleValue(sink, setters, ordinal, metaData, value2, ExtendedClrTypeCode.CharArray, 0); break; } case ExtendedClrTypeCode.DateTime: SetDateTime_Checked(sink, setters, ordinal, metaData, (DateTime)value); break; case ExtendedClrTypeCode.DBNull: SetDBNull_Unchecked(sink, setters, ordinal); break; case ExtendedClrTypeCode.Decimal: SetDecimal_PossiblyMoney(sink, setters, ordinal, metaData, (decimal)value); break; case ExtendedClrTypeCode.Double: SetDouble_Unchecked(sink, setters, ordinal, (double)value); break; case ExtendedClrTypeCode.Empty: SetDBNull_Unchecked(sink, setters, ordinal); break; case ExtendedClrTypeCode.Int16: SetInt16_Unchecked(sink, setters, ordinal, (short)value); break; case ExtendedClrTypeCode.Int32: SetInt32_Unchecked(sink, setters, ordinal, (int)value); break; case ExtendedClrTypeCode.Int64: SetInt64_Unchecked(sink, setters, ordinal, (long)value); break; case ExtendedClrTypeCode.SByte: throw ADP.InvalidCast(); case ExtendedClrTypeCode.Single: SetSingle_Unchecked(sink, setters, ordinal, (float)value); break; case ExtendedClrTypeCode.String: SetString_LengthChecked(sink, setters, ordinal, metaData, (string)value, offset); break; case ExtendedClrTypeCode.UInt16: throw ADP.InvalidCast(); case ExtendedClrTypeCode.UInt32: throw ADP.InvalidCast(); case ExtendedClrTypeCode.UInt64: throw ADP.InvalidCast(); case ExtendedClrTypeCode.Object: throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString()); case ExtendedClrTypeCode.ByteArray: SetByteArray_LengthChecked(sink, setters, ordinal, metaData, (byte[])value, offset); break; case ExtendedClrTypeCode.CharArray: SetCharArray_LengthChecked(sink, setters, ordinal, metaData, (char[])value, offset); break; case ExtendedClrTypeCode.Guid: SetGuid_Unchecked(sink, setters, ordinal, (Guid)value); break; case ExtendedClrTypeCode.SqlBinary: SetSqlBinary_LengthChecked(sink, setters, ordinal, metaData, (SqlBinary)value, offset); break; case ExtendedClrTypeCode.SqlBoolean: SetSqlBoolean_Unchecked(sink, setters, ordinal, (SqlBoolean)value); break; case ExtendedClrTypeCode.SqlByte: SetSqlByte_Unchecked(sink, setters, ordinal, (SqlByte)value); break; case ExtendedClrTypeCode.SqlDateTime: SetSqlDateTime_Checked(sink, setters, ordinal, metaData, (SqlDateTime)value); break; case ExtendedClrTypeCode.SqlDouble: SetSqlDouble_Unchecked(sink, setters, ordinal, (SqlDouble)value); break; case ExtendedClrTypeCode.SqlGuid: SetSqlGuid_Unchecked(sink, setters, ordinal, (SqlGuid)value); break; case ExtendedClrTypeCode.SqlInt16: SetSqlInt16_Unchecked(sink, setters, ordinal, (SqlInt16)value); break; case ExtendedClrTypeCode.SqlInt32: SetSqlInt32_Unchecked(sink, setters, ordinal, (SqlInt32)value); break; case ExtendedClrTypeCode.SqlInt64: SetSqlInt64_Unchecked(sink, setters, ordinal, (SqlInt64)value); break; case ExtendedClrTypeCode.SqlMoney: SetSqlMoney_Checked(sink, setters, ordinal, metaData, (SqlMoney)value); break; case ExtendedClrTypeCode.SqlDecimal: SetSqlDecimal_Unchecked(sink, setters, ordinal, (SqlDecimal)value); break; case ExtendedClrTypeCode.SqlSingle: SetSqlSingle_Unchecked(sink, setters, ordinal, (SqlSingle)value); break; case ExtendedClrTypeCode.SqlString: SetSqlString_LengthChecked(sink, setters, ordinal, metaData, (SqlString)value, offset); break; case ExtendedClrTypeCode.SqlChars: SetSqlChars_LengthChecked(sink, setters, ordinal, metaData, (SqlChars)value, offset); break; case ExtendedClrTypeCode.SqlBytes: SetSqlBytes_LengthChecked(sink, setters, ordinal, metaData, (SqlBytes)value, offset); break; case ExtendedClrTypeCode.SqlXml: SetSqlXml_Unchecked(sink, setters, ordinal, (SqlXml)value); break; case ExtendedClrTypeCode.Stream: SetStream_Unchecked(sink, setters, ordinal, metaData, (StreamDataFeed)value); break; case ExtendedClrTypeCode.TextReader: SetTextReader_Unchecked(sink, setters, ordinal, metaData, (TextDataFeed)value); break; case ExtendedClrTypeCode.XmlReader: SetXmlReader_Unchecked(sink, setters, ordinal, ((XmlDataFeed)value)._source); break; case ExtendedClrTypeCode.DataTable: case ExtendedClrTypeCode.DbDataReader: case ExtendedClrTypeCode.IEnumerableOfSqlDataRecord: case ExtendedClrTypeCode.TimeSpan: case ExtendedClrTypeCode.DateTimeOffset: break; } } internal static void SetCompatibleValueV200(SmiEventSink_Default sink, SmiTypedGetterSetter setters, int ordinal, SmiMetaData metaData, object value, ExtendedClrTypeCode typeCode, int offset, int length, ParameterPeekAheadValue peekAhead, SqlBuffer.StorageType storageType) { if (typeCode == ExtendedClrTypeCode.DateTime) { switch (storageType) { case SqlBuffer.StorageType.DateTime2: SetDateTime2_Checked(sink, setters, ordinal, metaData, (DateTime)value); break; case SqlBuffer.StorageType.Date: SetDate_Checked(sink, setters, ordinal, metaData, (DateTime)value); break; default: SetDateTime_Checked(sink, setters, ordinal, metaData, (DateTime)value); break; } } else { SetCompatibleValueV200(sink, setters, ordinal, metaData, value, typeCode, offset, length, peekAhead); } } internal static void SetCompatibleValueV200(SmiEventSink_Default sink, SmiTypedGetterSetter setters, int ordinal, SmiMetaData metaData, object value, ExtendedClrTypeCode typeCode, int offset, int length, ParameterPeekAheadValue peekAhead) { switch (typeCode) { case ExtendedClrTypeCode.DataTable: SetDataTable_Unchecked(sink, setters, ordinal, metaData, (DataTable)value); break; case ExtendedClrTypeCode.DbDataReader: SetDbDataReader_Unchecked(sink, setters, ordinal, metaData, (DbDataReader)value); break; case ExtendedClrTypeCode.IEnumerableOfSqlDataRecord: SetIEnumerableOfSqlDataRecord_Unchecked(sink, setters, ordinal, metaData, (IEnumerable)value, peekAhead); break; case ExtendedClrTypeCode.TimeSpan: SetTimeSpan_Checked(sink, setters, ordinal, metaData, (TimeSpan)value); break; case ExtendedClrTypeCode.DateTimeOffset: SetDateTimeOffset_Unchecked(sink, setters, ordinal, (DateTimeOffset)value); break; default: SetCompatibleValue(sink, setters, ordinal, metaData, value, typeCode, offset); break; } } private static void SetDataTable_Unchecked(SmiEventSink_Default sink, SmiTypedGetterSetter setters, int ordinal, SmiMetaData metaData, DataTable value) { setters = setters.GetTypedGetterSetter(sink, ordinal); sink.ProcessMessagesAndThrow(); ExtendedClrTypeCode[] array = new ExtendedClrTypeCode[metaData.FieldMetaData.Count]; for (int i = 0; i < metaData.FieldMetaData.Count; i++) { array[i] = ExtendedClrTypeCode.Invalid; } foreach (DataRow row in value.Rows) { setters.NewElement(sink); sink.ProcessMessagesAndThrow(); for (int j = 0; j < metaData.FieldMetaData.Count; j++) { SmiMetaData smiMetaData = metaData.FieldMetaData[j]; if (row.IsNull(j)) { SetDBNull_Unchecked(sink, setters, j); continue; } object value2 = row[j]; if (ExtendedClrTypeCode.Invalid == array[j]) { array[j] = MetaDataUtilsSmi.DetermineExtendedTypeCodeForUseWithSqlDbType(smiMetaData.SqlDbType, smiMetaData.IsMultiValued, value2); } SetCompatibleValueV200(sink, setters, j, smiMetaData, value2, array[j], 0, -1, null); } } setters.EndElements(sink); sink.ProcessMessagesAndThrow(); } internal static void FillCompatibleITypedSettersFromReader(SmiEventSink_Default sink, ITypedSettersV3 setters, SmiMetaData[] metaData, SqlDataReader reader) { for (int i = 0; i < metaData.Length; i++) { if (reader.IsDBNull(i)) { SetDBNull_Unchecked(sink, setters, i); continue; } switch (metaData[i].SqlDbType) { case SqlDbType.BigInt: SetInt64_Unchecked(sink, setters, i, reader.GetInt64(i)); break; case SqlDbType.Binary: SetSqlBytes_LengthChecked(sink, setters, i, metaData[i], reader.GetSqlBytes(i), 0); break; case SqlDbType.Bit: SetBoolean_Unchecked(sink, setters, i, reader.GetBoolean(i)); break; case SqlDbType.Char: SetSqlChars_LengthChecked(sink, setters, i, metaData[i], reader.GetSqlChars(i), 0); break; case SqlDbType.DateTime: SetDateTime_Checked(sink, setters, i, metaData[i], reader.GetDateTime(i)); break; case SqlDbType.Decimal: SetSqlDecimal_Unchecked(sink, setters, i, reader.GetSqlDecimal(i)); break; case SqlDbType.Float: SetDouble_Unchecked(sink, setters, i, reader.GetDouble(i)); break; case SqlDbType.Image: SetSqlBytes_LengthChecked(sink, setters, i, metaData[i], reader.GetSqlBytes(i), 0); break; case SqlDbType.Int: SetInt32_Unchecked(sink, setters, i, reader.GetInt32(i)); break; case SqlDbType.Money: SetSqlMoney_Unchecked(sink, setters, i, metaData[i], reader.GetSqlMoney(i)); break; case SqlDbType.NChar: case SqlDbType.NText: case SqlDbType.NVarChar: SetSqlChars_LengthChecked(sink, setters, i, metaData[i], reader.GetSqlChars(i), 0); break; case SqlDbType.Real: SetSingle_Unchecked(sink, setters, i, reader.GetFloat(i)); break; case SqlDbType.UniqueIdentifier: SetGuid_Unchecked(sink, setters, i, reader.GetGuid(i)); break; case SqlDbType.SmallDateTime: SetDateTime_Checked(sink, setters, i, metaData[i], reader.GetDateTime(i)); break; case SqlDbType.SmallInt: SetInt16_Unchecked(sink, setters, i, reader.GetInt16(i)); break; case SqlDbType.SmallMoney: SetSqlMoney_Checked(sink, setters, i, metaData[i], reader.GetSqlMoney(i)); break; case SqlDbType.Text: SetSqlChars_LengthChecked(sink, setters, i, metaData[i], reader.GetSqlChars(i), 0); break; case SqlDbType.Timestamp: SetSqlBytes_LengthChecked(sink, setters, i, metaData[i], reader.GetSqlBytes(i), 0); break; case SqlDbType.TinyInt: SetByte_Unchecked(sink, setters, i, reader.GetByte(i)); break; case SqlDbType.VarBinary: SetSqlBytes_LengthChecked(sink, setters, i, metaData[i], reader.GetSqlBytes(i), 0); break; case SqlDbType.VarChar: SetSqlChars_LengthChecked(sink, setters, i, metaData[i], reader.GetSqlChars(i), 0); break; case SqlDbType.Xml: SetSqlXml_Unchecked(sink, setters, i, reader.GetSqlXml(i)); break; case SqlDbType.Variant: { object sqlValue = reader.GetSqlValue(i); ExtendedClrTypeCode typeCode = MetaDataUtilsSmi.DetermineExtendedTypeCode(sqlValue); SetCompatibleValue(sink, setters, i, metaData[i], sqlValue, typeCode, 0); break; } case SqlDbType.Udt: throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString()); default: throw ADP.NotSupported(); } } } internal static void FillCompatibleSettersFromReader(SmiEventSink_Default sink, SmiTypedGetterSetter setters, IList metaData, DbDataReader reader) { for (int i = 0; i < metaData.Count; i++) { if (reader.IsDBNull(i)) { SetDBNull_Unchecked(sink, setters, i); continue; } switch (metaData[i].SqlDbType) { case SqlDbType.BigInt: SetInt64_Unchecked(sink, setters, i, reader.GetInt64(i)); break; case SqlDbType.Binary: SetBytes_FromReader(sink, setters, i, metaData[i], reader, 0); break; case SqlDbType.Bit: SetBoolean_Unchecked(sink, setters, i, reader.GetBoolean(i)); break; case SqlDbType.Char: SetCharsOrString_FromReader(sink, setters, i, metaData[i], reader, 0); break; case SqlDbType.DateTime: SetDateTime_Checked(sink, setters, i, metaData[i], reader.GetDateTime(i)); break; case SqlDbType.Decimal: if (reader is SqlDataReader sqlDataReader4) { SetSqlDecimal_Unchecked(sink, setters, i, sqlDataReader4.GetSqlDecimal(i)); } else { SetSqlDecimal_Unchecked(sink, setters, i, new SqlDecimal(reader.GetDecimal(i))); } break; case SqlDbType.Float: SetDouble_Unchecked(sink, setters, i, reader.GetDouble(i)); break; case SqlDbType.Image: SetBytes_FromReader(sink, setters, i, metaData[i], reader, 0); break; case SqlDbType.Int: SetInt32_Unchecked(sink, setters, i, reader.GetInt32(i)); break; case SqlDbType.Money: SetSqlMoney_Checked(sink, setters, i, metaData[i], new SqlMoney(reader.GetDecimal(i))); break; case SqlDbType.NChar: case SqlDbType.NText: case SqlDbType.NVarChar: SetCharsOrString_FromReader(sink, setters, i, metaData[i], reader, 0); break; case SqlDbType.Real: SetSingle_Unchecked(sink, setters, i, reader.GetFloat(i)); break; case SqlDbType.UniqueIdentifier: SetGuid_Unchecked(sink, setters, i, reader.GetGuid(i)); break; case SqlDbType.SmallDateTime: SetDateTime_Checked(sink, setters, i, metaData[i], reader.GetDateTime(i)); break; case SqlDbType.SmallInt: SetInt16_Unchecked(sink, setters, i, reader.GetInt16(i)); break; case SqlDbType.SmallMoney: SetSqlMoney_Checked(sink, setters, i, metaData[i], new SqlMoney(reader.GetDecimal(i))); break; case SqlDbType.Text: SetCharsOrString_FromReader(sink, setters, i, metaData[i], reader, 0); break; case SqlDbType.Timestamp: SetBytes_FromReader(sink, setters, i, metaData[i], reader, 0); break; case SqlDbType.TinyInt: SetByte_Unchecked(sink, setters, i, reader.GetByte(i)); break; case SqlDbType.VarBinary: SetBytes_FromReader(sink, setters, i, metaData[i], reader, 0); break; case SqlDbType.VarChar: SetCharsOrString_FromReader(sink, setters, i, metaData[i], reader, 0); break; case SqlDbType.Xml: if (reader is SqlDataReader sqlDataReader5) { SetSqlXml_Unchecked(sink, setters, i, sqlDataReader5.GetSqlXml(i)); } else { SetBytes_FromReader(sink, setters, i, metaData[i], reader, 0); } break; case SqlDbType.Variant: { SqlDataReader sqlDataReader3 = reader as SqlDataReader; SqlBuffer.StorageType storageType = SqlBuffer.StorageType.Empty; object value3; if (sqlDataReader3 != null) { value3 = sqlDataReader3.GetSqlValue(i); storageType = sqlDataReader3.GetVariantInternalStorageType(i); } else { value3 = reader.GetValue(i); } ExtendedClrTypeCode typeCode = MetaDataUtilsSmi.DetermineExtendedTypeCodeForUseWithSqlDbType(metaData[i].SqlDbType, metaData[i].IsMultiValued, value3); if (storageType == SqlBuffer.StorageType.DateTime2 || storageType == SqlBuffer.StorageType.Date) { SetCompatibleValueV200(sink, setters, i, metaData[i], value3, typeCode, 0, 0, null, storageType); } else { SetCompatibleValueV200(sink, setters, i, metaData[i], value3, typeCode, 0, 0, null); } break; } case SqlDbType.Udt: throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString()); case SqlDbType.Date: case SqlDbType.DateTime2: SetDateTime_Checked(sink, setters, i, metaData[i], reader.GetDateTime(i)); break; case SqlDbType.Time: SetTimeSpan_Checked(value: (!(reader is SqlDataReader sqlDataReader2)) ? ((TimeSpan)reader.GetValue(i)) : sqlDataReader2.GetTimeSpan(i), sink: sink, setters: setters, ordinal: i, metaData: metaData[i]); break; case SqlDbType.DateTimeOffset: { DateTimeOffset value = ((!(reader is SqlDataReader sqlDataReader)) ? ((DateTimeOffset)reader.GetValue(i)) : sqlDataReader.GetDateTimeOffset(i)); SetDateTimeOffset_Unchecked(sink, setters, i, value); break; } default: throw ADP.NotSupported(); } } } internal static void FillCompatibleSettersFromRecord(SmiEventSink_Default sink, SmiTypedGetterSetter setters, SmiMetaData[] metaData, SqlDataRecord record, SmiDefaultFieldsProperty useDefaultValues) { for (int i = 0; i < metaData.Length; i++) { if (useDefaultValues != null && useDefaultValues[i]) { continue; } if (record.IsDBNull(i)) { SetDBNull_Unchecked(sink, setters, i); continue; } switch (metaData[i].SqlDbType) { case SqlDbType.BigInt: SetInt64_Unchecked(sink, setters, i, record.GetInt64(i)); break; case SqlDbType.Binary: SetBytes_FromRecord(sink, setters, i, metaData[i], record, 0); break; case SqlDbType.Bit: SetBoolean_Unchecked(sink, setters, i, record.GetBoolean(i)); break; case SqlDbType.Char: SetChars_FromRecord(sink, setters, i, metaData[i], record, 0); break; case SqlDbType.DateTime: SetDateTime_Checked(sink, setters, i, metaData[i], record.GetDateTime(i)); break; case SqlDbType.Decimal: SetSqlDecimal_Unchecked(sink, setters, i, record.GetSqlDecimal(i)); break; case SqlDbType.Float: SetDouble_Unchecked(sink, setters, i, record.GetDouble(i)); break; case SqlDbType.Image: SetBytes_FromRecord(sink, setters, i, metaData[i], record, 0); break; case SqlDbType.Int: SetInt32_Unchecked(sink, setters, i, record.GetInt32(i)); break; case SqlDbType.Money: SetSqlMoney_Unchecked(sink, setters, i, metaData[i], record.GetSqlMoney(i)); break; case SqlDbType.NChar: case SqlDbType.NText: case SqlDbType.NVarChar: SetChars_FromRecord(sink, setters, i, metaData[i], record, 0); break; case SqlDbType.Real: SetSingle_Unchecked(sink, setters, i, record.GetFloat(i)); break; case SqlDbType.UniqueIdentifier: SetGuid_Unchecked(sink, setters, i, record.GetGuid(i)); break; case SqlDbType.SmallDateTime: SetDateTime_Checked(sink, setters, i, metaData[i], record.GetDateTime(i)); break; case SqlDbType.SmallInt: SetInt16_Unchecked(sink, setters, i, record.GetInt16(i)); break; case SqlDbType.SmallMoney: SetSqlMoney_Checked(sink, setters, i, metaData[i], record.GetSqlMoney(i)); break; case SqlDbType.Text: SetChars_FromRecord(sink, setters, i, metaData[i], record, 0); break; case SqlDbType.Timestamp: SetBytes_FromRecord(sink, setters, i, metaData[i], record, 0); break; case SqlDbType.TinyInt: SetByte_Unchecked(sink, setters, i, record.GetByte(i)); break; case SqlDbType.VarBinary: SetBytes_FromRecord(sink, setters, i, metaData[i], record, 0); break; case SqlDbType.VarChar: SetChars_FromRecord(sink, setters, i, metaData[i], record, 0); break; case SqlDbType.Xml: SetSqlXml_Unchecked(sink, setters, i, record.GetSqlXml(i)); break; case SqlDbType.Variant: { object sqlValue = record.GetSqlValue(i); ExtendedClrTypeCode typeCode = MetaDataUtilsSmi.DetermineExtendedTypeCode(sqlValue); SetCompatibleValueV200(sink, setters, i, metaData[i], sqlValue, typeCode, 0, -1, null); break; } case SqlDbType.Udt: throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString()); case SqlDbType.Date: case SqlDbType.DateTime2: SetDateTime_Checked(sink, setters, i, metaData[i], record.GetDateTime(i)); break; case SqlDbType.Time: SetTimeSpan_Checked(value: record?.GetTimeSpan(i) ?? ((TimeSpan)record.GetValue(i)), sink: sink, setters: setters, ordinal: i, metaData: metaData[i]); break; case SqlDbType.DateTimeOffset: { DateTimeOffset value = record?.GetDateTimeOffset(i) ?? ((DateTimeOffset)record.GetValue(i)); SetDateTimeOffset_Unchecked(sink, setters, i, value); break; } default: throw ADP.NotSupported(); } } } internal static Stream CopyIntoNewSmiScratchStream(Stream source, SmiEventSink_Default sink) { Stream stream = new MemoryStream(); int num = (int)((!source.CanSeek || 8000 <= source.Length) ? 8000 : source.Length); byte[] buffer = new byte[num]; int count; while ((count = source.Read(buffer, 0, num)) != 0) { stream.Write(buffer, 0, count); } stream.Flush(); stream.Seek(0L, SeekOrigin.Begin); return stream; } private static decimal GetDecimal_PossiblyMoney(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, SmiMetaData metaData) { if (SqlDbType.Decimal == metaData.SqlDbType) { return GetSqlDecimal_Unchecked(sink, getters, ordinal).Value; } return GetSqlMoney_Unchecked(sink, getters, ordinal).Value; } private static void SetDecimal_PossiblyMoney(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, decimal value) { if (SqlDbType.Decimal == metaData.SqlDbType || SqlDbType.Variant == metaData.SqlDbType) { SetDecimal_Unchecked(sink, setters, ordinal, value); } else { SetSqlMoney_Checked(sink, setters, ordinal, metaData, new SqlMoney(value)); } } private static void VerifyDateTimeRange(SqlDbType dbType, DateTime value) { if (SqlDbType.SmallDateTime == dbType && (s_dtSmallMax < value || s_dtSmallMin > value)) { throw ADP.InvalidMetaDataValue(); } } private static void VerifyTimeRange(SqlDbType dbType, TimeSpan value) { if (SqlDbType.Time == dbType && (s_timeMin > value || value > s_timeMax)) { throw ADP.InvalidMetaDataValue(); } } private static void SetDateTime_Checked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, DateTime value) { VerifyDateTimeRange(metaData.SqlDbType, value); SetDateTime_Unchecked(sink, setters, ordinal, (SqlDbType.Date == metaData.SqlDbType) ? value.Date : value); } private static void SetTimeSpan_Checked(SmiEventSink_Default sink, SmiTypedGetterSetter setters, int ordinal, SmiMetaData metaData, TimeSpan value) { VerifyTimeRange(metaData.SqlDbType, value); SetTimeSpan_Unchecked(sink, setters, ordinal, value); } private static void SetSqlDateTime_Checked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlDateTime value) { if (!value.IsNull) { VerifyDateTimeRange(metaData.SqlDbType, value.Value); } SetSqlDateTime_Unchecked(sink, setters, ordinal, value); } private static void SetDateTime2_Checked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, DateTime value) { VerifyDateTimeRange(metaData.SqlDbType, value); SetDateTime2_Unchecked(sink, setters, ordinal, metaData, value); } private static void SetDate_Checked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, DateTime value) { VerifyDateTimeRange(metaData.SqlDbType, value); SetDate_Unchecked(sink, setters, ordinal, metaData, value); } private static void SetSqlMoney_Checked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlMoney value) { if (!value.IsNull && SqlDbType.SmallMoney == metaData.SqlDbType) { decimal value2 = value.Value; if (TdsEnums.SQL_SMALL_MONEY_MIN > value2 || TdsEnums.SQL_SMALL_MONEY_MAX < value2) { throw SQL.MoneyOverflow(value2.ToString(CultureInfo.InvariantCulture)); } } SetSqlMoney_Unchecked(sink, setters, ordinal, metaData, value); } private static void SetByteArray_LengthChecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, byte[] buffer, int offset) { int length = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, -1L, 0L, buffer.Length, offset, buffer.Length - offset); SetByteArray_Unchecked(sink, setters, ordinal, buffer, offset, length); } private static void SetCharArray_LengthChecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, char[] buffer, int offset) { int length = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, -1L, 0L, buffer.Length, offset, buffer.Length - offset); SetCharArray_Unchecked(sink, setters, ordinal, buffer, offset, length); } private static void SetSqlBinary_LengthChecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlBinary value, int offset) { int length = 0; if (!value.IsNull) { length = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, -1L, 0L, value.Length, offset, value.Length - offset); } SetSqlBinary_Unchecked(sink, setters, ordinal, value, offset, length); } private static void SetBytes_FromRecord(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlDataRecord record, int offset) { int num = 0; long num2 = record.GetBytes(ordinal, 0L, null, 0, 0); if (num2 > int.MaxValue) { num2 = -1L; } checked { num = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, -1L, 0L, (int)num2, offset, (int)num2); int num3 = ((num <= 8000 && num >= 0) ? num : 8000); byte[] buffer = new byte[num3]; long num4 = 1L; long num5 = offset; for (long num6 = 0L; num < 0 || num6 < num; num6 += num4) { long bytes; if ((bytes = record.GetBytes(ordinal, num5, buffer, 0, num3)) == 0L) { break; } if (num4 == 0L) { break; } num4 = setters.SetBytes(sink, ordinal, num5, buffer, 0, (int)bytes); sink.ProcessMessagesAndThrow(); num5 += num4; } setters.SetBytesLength(sink, ordinal, num5); sink.ProcessMessagesAndThrow(); } } private static void SetBytes_FromReader(SmiEventSink_Default sink, SmiTypedGetterSetter setters, int ordinal, SmiMetaData metaData, DbDataReader reader, int offset) { int num = 0; num = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, -1L, 0L, -1, offset, -1); int num2 = 8000; byte[] buffer = new byte[num2]; long num3 = 1L; long num4 = offset; checked { for (long num5 = 0L; num < 0 || num5 < num; num5 += num3) { long bytes; if ((bytes = reader.GetBytes(ordinal, num4, buffer, 0, num2)) == 0L) { break; } if (num3 == 0L) { break; } num3 = setters.SetBytes(sink, ordinal, num4, buffer, 0, (int)bytes); sink.ProcessMessagesAndThrow(); num4 += num3; } setters.SetBytesLength(sink, ordinal, num4); sink.ProcessMessagesAndThrow(); } } private static void SetSqlBytes_LengthChecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlBytes value, int offset) { int num = 0; if (!value.IsNull) { long num2 = value.Length; if (num2 > int.MaxValue) { num2 = -1L; } num = checked(CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, -1L, 0L, (int)num2, offset, (int)num2)); } SetSqlBytes_Unchecked(sink, setters, ordinal, value, 0, num); } private static void SetChars_FromRecord(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlDataRecord record, int offset) { int num = 0; long num2 = record.GetChars(ordinal, 0L, null, 0, 0); if (num2 > int.MaxValue) { num2 = -1L; } checked { num = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, -1L, 0L, (int)num2, offset, (int)num2 - offset); int num3 = ((num <= 4000 && num >= 0) ? num : ((!MetaDataUtilsSmi.IsAnsiType(metaData.SqlDbType)) ? 4000 : 8000)); char[] buffer = new char[num3]; long num4 = 1L; long num5 = offset; for (long num6 = 0L; num < 0 || num6 < num; num6 += num4) { long chars; if ((chars = record.GetChars(ordinal, num5, buffer, 0, num3)) == 0L) { break; } if (num4 == 0L) { break; } num4 = setters.SetChars(sink, ordinal, num5, buffer, 0, (int)chars); sink.ProcessMessagesAndThrow(); num5 += num4; } setters.SetCharsLength(sink, ordinal, num5); sink.ProcessMessagesAndThrow(); } } private static void SetCharsOrString_FromReader(SmiEventSink_Default sink, SmiTypedGetterSetter setters, int ordinal, SmiMetaData metaData, DbDataReader reader, int offset) { bool flag = false; try { SetChars_FromReader(sink, setters, ordinal, metaData, reader, offset); flag = true; } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } } if (!flag) { SetString_FromReader(sink, setters, ordinal, metaData, reader, offset); } } private static void SetChars_FromReader(SmiEventSink_Default sink, SmiTypedGetterSetter setters, int ordinal, SmiMetaData metaData, DbDataReader reader, int offset) { int num = 0; num = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, -1L, 0L, -1, offset, -1); int num2 = ((!MetaDataUtilsSmi.IsAnsiType(metaData.SqlDbType)) ? 4000 : 8000); char[] buffer = new char[num2]; long num3 = 1L; long num4 = offset; checked { for (long num5 = 0L; num < 0 || num5 < num; num5 += num3) { long chars; if ((chars = reader.GetChars(ordinal, num4, buffer, 0, num2)) == 0L) { break; } if (num3 == 0L) { break; } num3 = setters.SetChars(sink, ordinal, num4, buffer, 0, (int)chars); sink.ProcessMessagesAndThrow(); num4 += num3; } setters.SetCharsLength(sink, ordinal, num4); sink.ProcessMessagesAndThrow(); } } private static void SetString_FromReader(SmiEventSink_Default sink, SmiTypedGetterSetter setters, int ordinal, SmiMetaData metaData, DbDataReader reader, int offset) { string @string = reader.GetString(ordinal); int length = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, @string.Length, 0L, -1, offset, -1); setters.SetString(sink, ordinal, @string, offset, length); sink.ProcessMessagesAndThrow(); } private static void SetSqlChars_LengthChecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlChars value, int offset) { int length = 0; if (!value.IsNull) { long num = value.Length; if (num > int.MaxValue) { num = -1L; } length = checked(CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, -1L, 0L, (int)num, offset, (int)num - offset)); } SetSqlChars_Unchecked(sink, setters, ordinal, value, 0, length); } private static void SetSqlString_LengthChecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlString value, int offset) { if (value.IsNull) { SetDBNull_Unchecked(sink, setters, ordinal); return; } string value2 = value.Value; int length = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, -1L, 0L, value2.Length, offset, value2.Length - offset); SetSqlString_Unchecked(sink, setters, ordinal, metaData, value, offset, length); } private static void SetString_LengthChecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, string value, int offset) { int length = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, -1L, 0L, value.Length, offset, checked(value.Length - offset)); SetString_Unchecked(sink, setters, ordinal, value, offset, length); } private static void ThrowIfInvalidSetterAccess(SmiMetaData metaData, ExtendedClrTypeCode setterTypeCode) { if (!CanAccessSetterDirectly(metaData, setterTypeCode)) { throw ADP.InvalidCast(); } } private static void ThrowIfITypedGettersIsNull(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal) { if (IsDBNull_Unchecked(sink, getters, ordinal)) { throw SQL.SqlNullValue(); } } private static bool CanAccessGetterDirectly(SmiMetaData metaData, ExtendedClrTypeCode setterTypeCode) { bool flag = s_canAccessGetterDirectly[(int)setterTypeCode, (int)metaData.SqlDbType]; if (flag && (ExtendedClrTypeCode.DataTable == setterTypeCode || ExtendedClrTypeCode.DbDataReader == setterTypeCode || ExtendedClrTypeCode.IEnumerableOfSqlDataRecord == setterTypeCode)) { flag = metaData.IsMultiValued; } return flag; } private static bool CanAccessSetterDirectly(SmiMetaData metaData, ExtendedClrTypeCode setterTypeCode) { bool flag = s_canAccessSetterDirectly[(int)setterTypeCode, (int)metaData.SqlDbType]; if (flag && (ExtendedClrTypeCode.DataTable == setterTypeCode || ExtendedClrTypeCode.DbDataReader == setterTypeCode || ExtendedClrTypeCode.IEnumerableOfSqlDataRecord == setterTypeCode)) { flag = metaData.IsMultiValued; } return flag; } private static long PositiveMin(long first, long second) { if (first < 0) { return second; } if (second < 0) { return first; } return Math.Min(first, second); } private static int CheckXetParameters(SqlDbType dbType, long maxLength, long actualLength, long fieldOffset, int bufferLength, int bufferOffset, int length) { if (0 > fieldOffset) { throw ADP.NegativeParameter("fieldOffset"); } if (bufferOffset < 0) { throw ADP.InvalidDestinationBufferIndex(bufferLength, bufferOffset, "bufferOffset"); } checked { if (bufferLength < 0) { length = (int)PositiveMin(length, PositiveMin(maxLength, actualLength)); if (length < -1) { length = -1; } return length; } if (bufferOffset > bufferLength) { throw ADP.InvalidDestinationBufferIndex(bufferLength, bufferOffset, "bufferOffset"); } if (length + bufferOffset > bufferLength) { throw ADP.InvalidBufferSizeOrIndex(length, bufferOffset); } if (length < 0) { throw ADP.InvalidDataLength(length); } if (0 <= actualLength && actualLength <= fieldOffset) { return 0; } } length = Math.Min(length, bufferLength - bufferOffset); if (SqlDbType.Variant == dbType) { length = Math.Min(length, 8000); } if (0 <= actualLength) { length = (int)Math.Min(length, actualLength - fieldOffset); } else if (SqlDbType.Udt != dbType && 0 <= maxLength) { length = (int)Math.Min(length, maxLength - fieldOffset); } if (length < 0) { return 0; } return length; } private static bool IsDBNull_Unchecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal) { bool result = getters.IsDBNull(sink, ordinal); sink.ProcessMessagesAndThrow(); return result; } private static bool GetBoolean_Unchecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal) { bool boolean = getters.GetBoolean(sink, ordinal); sink.ProcessMessagesAndThrow(); return boolean; } private static byte GetByte_Unchecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal) { byte @byte = getters.GetByte(sink, ordinal); sink.ProcessMessagesAndThrow(); return @byte; } private static byte[] GetByteArray_Unchecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal) { long bytesLength = getters.GetBytesLength(sink, ordinal); sink.ProcessMessagesAndThrow(); int num = checked((int)bytesLength); byte[] array = new byte[num]; getters.GetBytes(sink, ordinal, 0L, array, 0, num); sink.ProcessMessagesAndThrow(); return array; } internal static int GetBytes_Unchecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, long fieldOffset, byte[] buffer, int bufferOffset, int length) { int bytes = getters.GetBytes(sink, ordinal, fieldOffset, buffer, bufferOffset, length); sink.ProcessMessagesAndThrow(); return bytes; } private static long GetBytesLength_Unchecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal) { long bytesLength = getters.GetBytesLength(sink, ordinal); sink.ProcessMessagesAndThrow(); return bytesLength; } private static char[] GetCharArray_Unchecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal) { long charsLength = getters.GetCharsLength(sink, ordinal); sink.ProcessMessagesAndThrow(); int num = checked((int)charsLength); char[] array = new char[num]; getters.GetChars(sink, ordinal, 0L, array, 0, num); sink.ProcessMessagesAndThrow(); return array; } internal static int GetChars_Unchecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal, long fieldOffset, char[] buffer, int bufferOffset, int length) { int chars = getters.GetChars(sink, ordinal, fieldOffset, buffer, bufferOffset, length); sink.ProcessMessagesAndThrow(); return chars; } private static long GetCharsLength_Unchecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal) { long charsLength = getters.GetCharsLength(sink, ordinal); sink.ProcessMessagesAndThrow(); return charsLength; } private static DateTime GetDateTime_Unchecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal) { DateTime dateTime = getters.GetDateTime(sink, ordinal); sink.ProcessMessagesAndThrow(); return dateTime; } private static DateTimeOffset GetDateTimeOffset_Unchecked(SmiEventSink_Default sink, SmiTypedGetterSetter getters, int ordinal) { DateTimeOffset dateTimeOffset = getters.GetDateTimeOffset(sink, ordinal); sink.ProcessMessagesAndThrow(); return dateTimeOffset; } private static double GetDouble_Unchecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal) { double @double = getters.GetDouble(sink, ordinal); sink.ProcessMessagesAndThrow(); return @double; } private static Guid GetGuid_Unchecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal) { Guid guid = getters.GetGuid(sink, ordinal); sink.ProcessMessagesAndThrow(); return guid; } private static short GetInt16_Unchecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal) { short @int = getters.GetInt16(sink, ordinal); sink.ProcessMessagesAndThrow(); return @int; } private static int GetInt32_Unchecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal) { int @int = getters.GetInt32(sink, ordinal); sink.ProcessMessagesAndThrow(); return @int; } private static long GetInt64_Unchecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal) { long @int = getters.GetInt64(sink, ordinal); sink.ProcessMessagesAndThrow(); return @int; } private static float GetSingle_Unchecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal) { float single = getters.GetSingle(sink, ordinal); sink.ProcessMessagesAndThrow(); return single; } private static SqlBinary GetSqlBinary_Unchecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal) { return new SqlBinary(GetByteArray_Unchecked(sink, getters, ordinal)); } private static SqlDecimal GetSqlDecimal_Unchecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal) { SqlDecimal sqlDecimal = getters.GetSqlDecimal(sink, ordinal); sink.ProcessMessagesAndThrow(); return sqlDecimal; } private static SqlMoney GetSqlMoney_Unchecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal) { long @int = getters.GetInt64(sink, ordinal); sink.ProcessMessagesAndThrow(); return SqlTypeWorkarounds.SqlMoneyCtor(@int, 1); } private static SqlXml GetSqlXml_Unchecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal) { return new SqlXml(CopyIntoNewSmiScratchStream(new SmiGettersStream(sink, getters, ordinal, SmiMetaData.DefaultXml), sink)); } private static string GetString_Unchecked(SmiEventSink_Default sink, ITypedGettersV3 getters, int ordinal) { string @string = getters.GetString(sink, ordinal); sink.ProcessMessagesAndThrow(); return @string; } private static TimeSpan GetTimeSpan_Unchecked(SmiEventSink_Default sink, SmiTypedGetterSetter getters, int ordinal) { TimeSpan timeSpan = getters.GetTimeSpan(sink, ordinal); sink.ProcessMessagesAndThrow(); return timeSpan; } private static void SetBoolean_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, bool value) { setters.SetBoolean(sink, ordinal, value); sink.ProcessMessagesAndThrow(); } private static void SetByteArray_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, byte[] buffer, int bufferOffset, int length) { if (length > 0) { setters.SetBytes(sink, ordinal, 0L, buffer, bufferOffset, length); sink.ProcessMessagesAndThrow(); } setters.SetBytesLength(sink, ordinal, length); sink.ProcessMessagesAndThrow(); } private static void SetStream_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metadata, StreamDataFeed feed) { long maxLength = metadata.MaxLength; byte[] buffer = new byte[4096]; int num = 0; do { int num2 = 0; int num3 = 4096; if (maxLength > 0 && num + num3 > maxLength) { num3 = (int)(maxLength - num); } num2 = feed._source.Read(buffer, 0, num3); if (num2 == 0) { break; } setters.SetBytes(sink, ordinal, num, buffer, 0, num2); sink.ProcessMessagesAndThrow(); num += num2; } while (maxLength <= 0 || num < maxLength); setters.SetBytesLength(sink, ordinal, num); sink.ProcessMessagesAndThrow(); } private static void SetTextReader_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metadata, TextDataFeed feed) { long maxLength = metadata.MaxLength; char[] buffer = new char[4096]; int num = 0; do { int num2 = 0; int num3 = 4096; if (maxLength > 0 && num + num3 > maxLength) { num3 = (int)(maxLength - num); } num2 = feed._source.Read(buffer, 0, num3); if (num2 == 0) { break; } setters.SetChars(sink, ordinal, num, buffer, 0, num2); sink.ProcessMessagesAndThrow(); num += num2; } while (maxLength <= 0 || num < maxLength); setters.SetCharsLength(sink, ordinal, num); sink.ProcessMessagesAndThrow(); } private static void SetByte_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, byte value) { setters.SetByte(sink, ordinal, value); sink.ProcessMessagesAndThrow(); } private static int SetBytes_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, long fieldOffset, byte[] buffer, int bufferOffset, int length) { int result = setters.SetBytes(sink, ordinal, fieldOffset, buffer, bufferOffset, length); sink.ProcessMessagesAndThrow(); return result; } private static void SetCharArray_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, char[] buffer, int bufferOffset, int length) { if (length > 0) { setters.SetChars(sink, ordinal, 0L, buffer, bufferOffset, length); sink.ProcessMessagesAndThrow(); } setters.SetCharsLength(sink, ordinal, length); sink.ProcessMessagesAndThrow(); } private static int SetChars_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, long fieldOffset, char[] buffer, int bufferOffset, int length) { int result = setters.SetChars(sink, ordinal, fieldOffset, buffer, bufferOffset, length); sink.ProcessMessagesAndThrow(); return result; } private static void SetDBNull_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal) { setters.SetDBNull(sink, ordinal); sink.ProcessMessagesAndThrow(); } private static void SetDecimal_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, decimal value) { setters.SetSqlDecimal(sink, ordinal, new SqlDecimal(value)); sink.ProcessMessagesAndThrow(); } private static void SetDateTime_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, DateTime value) { setters.SetDateTime(sink, ordinal, value); sink.ProcessMessagesAndThrow(); } private static void SetDateTime2_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, DateTime value) { setters.SetVariantMetaData(sink, ordinal, SmiMetaData.DefaultDateTime2); setters.SetDateTime(sink, ordinal, value); sink.ProcessMessagesAndThrow(); } private static void SetDate_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, DateTime value) { setters.SetVariantMetaData(sink, ordinal, SmiMetaData.DefaultDate); setters.SetDateTime(sink, ordinal, value); sink.ProcessMessagesAndThrow(); } private static void SetTimeSpan_Unchecked(SmiEventSink_Default sink, SmiTypedGetterSetter setters, int ordinal, TimeSpan value) { setters.SetTimeSpan(sink, ordinal, value); sink.ProcessMessagesAndThrow(); } private static void SetDateTimeOffset_Unchecked(SmiEventSink_Default sink, SmiTypedGetterSetter setters, int ordinal, DateTimeOffset value) { setters.SetDateTimeOffset(sink, ordinal, value); sink.ProcessMessagesAndThrow(); } private static void SetDouble_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, double value) { setters.SetDouble(sink, ordinal, value); sink.ProcessMessagesAndThrow(); } private static void SetGuid_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, Guid value) { setters.SetGuid(sink, ordinal, value); sink.ProcessMessagesAndThrow(); } private static void SetInt16_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, short value) { setters.SetInt16(sink, ordinal, value); sink.ProcessMessagesAndThrow(); } private static void SetInt32_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, int value) { setters.SetInt32(sink, ordinal, value); sink.ProcessMessagesAndThrow(); } private static void SetInt64_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, long value) { setters.SetInt64(sink, ordinal, value); sink.ProcessMessagesAndThrow(); } private static void SetSingle_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, float value) { setters.SetSingle(sink, ordinal, value); sink.ProcessMessagesAndThrow(); } private static void SetSqlBinary_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SqlBinary value, int offset, int length) { if (value.IsNull) { setters.SetDBNull(sink, ordinal); } else { SetByteArray_Unchecked(sink, setters, ordinal, value.Value, offset, length); } sink.ProcessMessagesAndThrow(); } private static void SetSqlBoolean_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SqlBoolean value) { if (value.IsNull) { setters.SetDBNull(sink, ordinal); } else { setters.SetBoolean(sink, ordinal, value.Value); } sink.ProcessMessagesAndThrow(); } private static void SetSqlByte_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SqlByte value) { if (value.IsNull) { setters.SetDBNull(sink, ordinal); } else { setters.SetByte(sink, ordinal, value.Value); } sink.ProcessMessagesAndThrow(); } private static void SetSqlBytes_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SqlBytes value, int offset, long length) { if (value.IsNull) { setters.SetDBNull(sink, ordinal); sink.ProcessMessagesAndThrow(); return; } checked { int num = ((length <= 8000 && length >= 0) ? ((int)length) : 8000); byte[] buffer = new byte[num]; long num2 = 1L; long num3 = offset; for (long num4 = 0L; length < 0 || num4 < length; num4 += num2) { long num5; if ((num5 = value.Read(num3, buffer, 0, num)) == 0L) { break; } if (num2 == 0L) { break; } num2 = setters.SetBytes(sink, ordinal, num3, buffer, 0, (int)num5); sink.ProcessMessagesAndThrow(); num3 += num2; } setters.SetBytesLength(sink, ordinal, num3); sink.ProcessMessagesAndThrow(); } } private static void SetSqlChars_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SqlChars value, int offset, int length) { if (value.IsNull) { setters.SetDBNull(sink, ordinal); sink.ProcessMessagesAndThrow(); return; } int num = ((length <= 4000 && length >= 0) ? length : 4000); char[] buffer = new char[num]; long num2 = 1L; long num3 = offset; checked { for (long num4 = 0L; length < 0 || num4 < length; num4 += num2) { long num5; if ((num5 = value.Read(num3, buffer, 0, num)) == 0L) { break; } if (num2 == 0L) { break; } num2 = setters.SetChars(sink, ordinal, num3, buffer, 0, (int)num5); sink.ProcessMessagesAndThrow(); num3 += num2; } setters.SetCharsLength(sink, ordinal, num3); sink.ProcessMessagesAndThrow(); } } private static void SetSqlDateTime_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SqlDateTime value) { if (value.IsNull) { setters.SetDBNull(sink, ordinal); } else { setters.SetDateTime(sink, ordinal, value.Value); } sink.ProcessMessagesAndThrow(); } private static void SetSqlDecimal_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SqlDecimal value) { if (value.IsNull) { setters.SetDBNull(sink, ordinal); } else { setters.SetSqlDecimal(sink, ordinal, value); } sink.ProcessMessagesAndThrow(); } private static void SetSqlDouble_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SqlDouble value) { if (value.IsNull) { setters.SetDBNull(sink, ordinal); } else { setters.SetDouble(sink, ordinal, value.Value); } sink.ProcessMessagesAndThrow(); } private static void SetSqlGuid_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SqlGuid value) { if (value.IsNull) { setters.SetDBNull(sink, ordinal); } else { setters.SetGuid(sink, ordinal, value.Value); } sink.ProcessMessagesAndThrow(); } private static void SetSqlInt16_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SqlInt16 value) { if (value.IsNull) { setters.SetDBNull(sink, ordinal); } else { setters.SetInt16(sink, ordinal, value.Value); } sink.ProcessMessagesAndThrow(); } private static void SetSqlInt32_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SqlInt32 value) { if (value.IsNull) { setters.SetDBNull(sink, ordinal); } else { setters.SetInt32(sink, ordinal, value.Value); } sink.ProcessMessagesAndThrow(); } private static void SetSqlInt64_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SqlInt64 value) { if (value.IsNull) { setters.SetDBNull(sink, ordinal); } else { setters.SetInt64(sink, ordinal, value.Value); } sink.ProcessMessagesAndThrow(); } private static void SetSqlMoney_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlMoney value) { if (value.IsNull) { setters.SetDBNull(sink, ordinal); } else { if (SqlDbType.Variant == metaData.SqlDbType) { setters.SetVariantMetaData(sink, ordinal, SmiMetaData.DefaultMoney); sink.ProcessMessagesAndThrow(); } setters.SetInt64(sink, ordinal, SqlTypeWorkarounds.SqlMoneyToSqlInternalRepresentation(value)); } sink.ProcessMessagesAndThrow(); } private static void SetSqlSingle_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SqlSingle value) { if (value.IsNull) { setters.SetDBNull(sink, ordinal); } else { setters.SetSingle(sink, ordinal, value.Value); } sink.ProcessMessagesAndThrow(); } private static void SetSqlString_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SmiMetaData metaData, SqlString value, int offset, int length) { if (value.IsNull) { setters.SetDBNull(sink, ordinal); sink.ProcessMessagesAndThrow(); return; } if (SqlDbType.Variant == metaData.SqlDbType) { metaData = new SmiMetaData(SqlDbType.NVarChar, 4000L, 0, 0, value.LCID, value.SqlCompareOptions); setters.SetVariantMetaData(sink, ordinal, metaData); sink.ProcessMessagesAndThrow(); } SetString_Unchecked(sink, setters, ordinal, value.Value, offset, length); } private static void SetSqlXml_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, SqlXml value) { if (value.IsNull) { setters.SetDBNull(sink, ordinal); sink.ProcessMessagesAndThrow(); } else { SetXmlReader_Unchecked(sink, setters, ordinal, value.CreateReader()); } } private static void SetXmlReader_Unchecked(SmiEventSink_Default sink, ITypedSettersV3 setters, int ordinal, XmlReader xmlReader) { XmlWriterSettings xmlWriterSettings = new XmlWriterSettings(); xmlWriterSettings.CloseOutput = false; xmlWriterSettings.ConformanceLevel = ConformanceLevel.Fragment; xmlWriterSettings.Encoding = Encoding.Unicode; xmlWriterSettings.OmitXmlDeclaration = true; XmlWriter xmlWriter = XmlWriter.Create(new SmiSettersStream(sink, setters, ordinal, SmiMetaData.DefaultXml), xmlWriterSettings); xmlReader.Read(); while (!xmlReader.EOF) { xmlWriter.WriteNode(xmlReader, defattr: true); } xmlWriter.Flush(); sink.ProcessMessagesAndThrow(); } 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(); } private static void SetDbDataReader_Unchecked(SmiEventSink_Default sink, SmiTypedGetterSetter setters, int ordinal, SmiMetaData metaData, DbDataReader value) { setters = setters.GetTypedGetterSetter(sink, ordinal); sink.ProcessMessagesAndThrow(); while (value.Read()) { setters.NewElement(sink); sink.ProcessMessagesAndThrow(); FillCompatibleSettersFromReader(sink, setters, metaData.FieldMetaData, value); } setters.EndElements(sink); sink.ProcessMessagesAndThrow(); } private static void SetIEnumerableOfSqlDataRecord_Unchecked(SmiEventSink_Default sink, SmiTypedGetterSetter setters, int ordinal, SmiMetaData metaData, IEnumerable value, ParameterPeekAheadValue peekAhead) { setters = setters.GetTypedGetterSetter(sink, ordinal); sink.ProcessMessagesAndThrow(); IEnumerator enumerator = null; try { SmiExtendedMetaData[] array = new SmiExtendedMetaData[metaData.FieldMetaData.Count]; metaData.FieldMetaData.CopyTo(array, 0); SmiDefaultFieldsProperty useDefaultValues = (SmiDefaultFieldsProperty)metaData.ExtendedProperties[SmiPropertySelector.DefaultFields]; int num = 1; if (peekAhead != null && peekAhead.FirstRecord != null) { enumerator = peekAhead.Enumerator; setters.NewElement(sink); sink.ProcessMessagesAndThrow(); FillCompatibleSettersFromRecord(sink, setters, array, peekAhead.FirstRecord, useDefaultValues); num++; } else { enumerator = value.GetEnumerator(); } using (enumerator) { while (enumerator.MoveNext()) { setters.NewElement(sink); sink.ProcessMessagesAndThrow(); SqlDataRecord current = enumerator.Current; if (current.FieldCount != array.Length) { throw SQL.EnumeratedRecordFieldCountChanged(num); } for (int i = 0; i < current.FieldCount; i++) { if (!MetaDataUtilsSmi.IsCompatible(metaData.FieldMetaData[i], current.GetSqlMetaData(i))) { throw SQL.EnumeratedRecordMetaDataChanged(current.GetName(i), num); } } FillCompatibleSettersFromRecord(sink, setters, array, current, useDefaultValues); num++; } setters.EndElements(sink); sink.ProcessMessagesAndThrow(); } } finally { enumerator?.Dispose(); } } } public sealed class SqlMetaData { private string _strName; private long _lMaxLength; private SqlDbType _sqlDbType; private byte _bPrecision; private byte _bScale; private long _lLocale; private SqlCompareOptions _eCompareOptions; private string _xmlSchemaCollectionDatabase; private string _xmlSchemaCollectionOwningSchema; private string _xmlSchemaCollectionName; private bool _bPartialLength; private bool _useServerDefault; private bool _isUniqueKey; private SortOrder _columnSortOrder; private int _sortOrdinal; private const long x_lMax = -1L; private const long x_lServerMaxUnicode = 4000L; private const long x_lServerMaxANSI = 8000L; private const long x_lServerMaxBinary = 8000L; private const bool x_defaultUseServerDefault = false; private const bool x_defaultIsUniqueKey = false; private const SortOrder x_defaultColumnSortOrder = SortOrder.Unspecified; private const int x_defaultSortOrdinal = -1; private const SqlCompareOptions x_eDefaultStringCompareOptions = SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth; private static byte[] s_maxLenFromPrecision = new byte[38] { 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 13, 13, 13, 13, 13, 13, 13, 13, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17 }; private const byte MaxTimeScale = 7; private static byte[] s_maxVarTimeLenOffsetFromScale = new byte[8] { 2, 2, 2, 1, 1, 0, 0, 0 }; private static readonly DateTime s_dtSmallMax = new DateTime(2079, 6, 6, 23, 59, 29, 998); private static readonly DateTime s_dtSmallMin = new DateTime(1899, 12, 31, 23, 59, 29, 999); private static readonly SqlMoney s_smSmallMax = new SqlMoney(214748.3647m); private static readonly SqlMoney s_smSmallMin = new SqlMoney(-214748.3648m); private static readonly TimeSpan s_timeMin = TimeSpan.Zero; private static readonly TimeSpan s_timeMax = new TimeSpan(863999999999L); private static readonly long[] s_unitTicksFromScale = new long[8] { 10000000L, 1000000L, 100000L, 10000L, 1000L, 100L, 10L, 1L }; internal static SqlMetaData[] sxm_rgDefaults = new SqlMetaData[35] { new SqlMetaData("bigint", SqlDbType.BigInt, 8L, 19, 0, 0L, SqlCompareOptions.None, partialLength: false), new SqlMetaData("binary", SqlDbType.Binary, 1L, 0, 0, 0L, SqlCompareOptions.None, partialLength: false), new SqlMetaData("bit", SqlDbType.Bit, 1L, 1, 0, 0L, SqlCompareOptions.None, partialLength: false), new SqlMetaData("char", SqlDbType.Char, 1L, 0, 0, 0L, SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth, partialLength: false), new SqlMetaData("datetime", SqlDbType.DateTime, 8L, 23, 3, 0L, SqlCompareOptions.None, partialLength: false), new SqlMetaData("decimal", SqlDbType.Decimal, 9L, 18, 0, 0L, SqlCompareOptions.None, partialLength: false), new SqlMetaData("float", SqlDbType.Float, 8L, 53, 0, 0L, SqlCompareOptions.None, partialLength: false), new SqlMetaData("image", SqlDbType.Image, -1L, 0, 0, 0L, SqlCompareOptions.None, partialLength: false), new SqlMetaData("int", SqlDbType.Int, 4L, 10, 0, 0L, SqlCompareOptions.None, partialLength: false), new SqlMetaData("money", SqlDbType.Money, 8L, 19, 4, 0L, SqlCompareOptions.None, partialLength: false), new SqlMetaData("nchar", SqlDbType.NChar, 1L, 0, 0, 0L, SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth, partialLength: false), new SqlMetaData("ntext", SqlDbType.NText, -1L, 0, 0, 0L, SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth, partialLength: false), new SqlMetaData("nvarchar", SqlDbType.NVarChar, 4000L, 0, 0, 0L, SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth, partialLength: false), new SqlMetaData("real", SqlDbType.Real, 4L, 24, 0, 0L, SqlCompareOptions.None, partialLength: false), new SqlMetaData("uniqueidentifier", SqlDbType.UniqueIdentifier, 16L, 0, 0, 0L, SqlCompareOptions.None, partialLength: false), new SqlMetaData("smalldatetime", SqlDbType.SmallDateTime, 4L, 16, 0, 0L, SqlCompareOptions.None, partialLength: false), new SqlMetaData("smallint", SqlDbType.SmallInt, 2L, 5, 0, 0L, SqlCompareOptions.None, partialLength: false), new SqlMetaData("smallmoney", SqlDbType.SmallMoney, 4L, 10, 4, 0L, SqlCompareOptions.None, partialLength: false), new SqlMetaData("text", SqlDbType.Text, -1L, 0, 0, 0L, SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth, partialLength: false), new SqlMetaData("timestamp", SqlDbType.Timestamp, 8L, 0, 0, 0L, SqlCompareOptions.None, partialLength: false), new SqlMetaData("tinyint", SqlDbType.TinyInt, 1L, 3, 0, 0L, SqlCompareOptions.None, partialLength: false), new SqlMetaData("varbinary", SqlDbType.VarBinary, 8000L, 0, 0, 0L, SqlCompareOptions.None, partialLength: false), new SqlMetaData("varchar", SqlDbType.VarChar, 8000L, 0, 0, 0L, SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth, partialLength: false), new SqlMetaData("sql_variant", SqlDbType.Variant, 8016L, 0, 0, 0L, SqlCompareOptions.None, partialLength: false), new SqlMetaData("nvarchar", SqlDbType.NVarChar, 1L, 0, 0, 0L, SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth, partialLength: false), new SqlMetaData("xml", SqlDbType.Xml, -1L, 0, 0, 0L, SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth, partialLength: true), new SqlMetaData("nvarchar", SqlDbType.NVarChar, 1L, 0, 0, 0L, SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth, partialLength: false), new SqlMetaData("nvarchar", SqlDbType.NVarChar, 4000L, 0, 0, 0L, SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth, partialLength: false), new SqlMetaData("nvarchar", SqlDbType.NVarChar, 4000L, 0, 0, 0L, SqlCompareOptions.IgnoreCase | SqlCompareOptions.IgnoreKanaType | SqlCompareOptions.IgnoreWidth, partialLength: false), new SqlMetaData("udt", SqlDbType.Structured, 0L, 0, 0, 0L, SqlCompareOptions.None, partialLength: false), new SqlMetaData("table", SqlDbType.Structured, 0L, 0, 0, 0L, SqlCompareOptions.None, partialLength: false), new SqlMetaData("date", SqlDbType.Date, 3L, 10, 0, 0L, SqlCompareOptions.None, partialLength: false), new SqlMetaData("time", SqlDbType.Time, 5L, 0, 7, 0L, SqlCompareOptions.None, partialLength: false), new SqlMetaData("datetime2", SqlDbType.DateTime2, 8L, 0, 7, 0L, SqlCompareOptions.None, partialLength: false), new SqlMetaData("datetimeoffset", SqlDbType.DateTimeOffset, 10L, 0, 7, 0L, SqlCompareOptions.None, partialLength: false) }; public SqlCompareOptions CompareOptions => _eCompareOptions; public bool IsUniqueKey => _isUniqueKey; public long LocaleId => _lLocale; public static long Max => -1L; public long MaxLength => _lMaxLength; public string Name => _strName; public byte Precision => _bPrecision; public byte Scale => _bScale; public SortOrder SortOrder => _columnSortOrder; public int SortOrdinal => _sortOrdinal; public SqlDbType SqlDbType => _sqlDbType; public string TypeName => sxm_rgDefaults[(int)SqlDbType].Name; public bool UseServerDefault => _useServerDefault; public string XmlSchemaCollectionDatabase => _xmlSchemaCollectionDatabase; public string XmlSchemaCollectionName => _xmlSchemaCollectionName; public string XmlSchemaCollectionOwningSchema => _xmlSchemaCollectionOwningSchema; internal bool IsPartialLength => _bPartialLength; [MonoTODO] public DbType DbType { get { throw new NotImplementedException(); } } public Type Type { get { ThrowStub.ThrowNotSupportedException(); return null; } } public SqlMetaData(string name, SqlDbType dbType) { Construct(name, dbType, useServerDefault: false, isUniqueKey: false, SortOrder.Unspecified, -1); } public SqlMetaData(string name, SqlDbType dbType, bool useServerDefault, bool isUniqueKey, SortOrder columnSortOrder, int sortOrdinal) { Construct(name, dbType, useServerDefault, isUniqueKey, columnSortOrder, sortOrdinal); } public SqlMetaData(string name, SqlDbType dbType, long maxLength) { Construct(name, dbType, maxLength, useServerDefault: false, isUniqueKey: false, SortOrder.Unspecified, -1); } public SqlMetaData(string name, SqlDbType dbType, long maxLength, bool useServerDefault, bool isUniqueKey, SortOrder columnSortOrder, int sortOrdinal) { Construct(name, dbType, maxLength, useServerDefault, isUniqueKey, columnSortOrder, sortOrdinal); } public SqlMetaData(string name, SqlDbType dbType, byte precision, byte scale) { Construct(name, dbType, precision, scale, useServerDefault: false, isUniqueKey: false, SortOrder.Unspecified, -1); } public SqlMetaData(string name, SqlDbType dbType, byte precision, byte scale, bool useServerDefault, bool isUniqueKey, SortOrder columnSortOrder, int sortOrdinal) { Construct(name, dbType, precision, scale, useServerDefault, isUniqueKey, columnSortOrder, sortOrdinal); } public SqlMetaData(string name, SqlDbType dbType, long maxLength, long locale, SqlCompareOptions compareOptions) { Construct(name, dbType, maxLength, locale, compareOptions, useServerDefault: false, isUniqueKey: false, SortOrder.Unspecified, -1); } public SqlMetaData(string name, SqlDbType dbType, long maxLength, long locale, SqlCompareOptions compareOptions, bool useServerDefault, bool isUniqueKey, SortOrder columnSortOrder, int sortOrdinal) { Construct(name, dbType, maxLength, locale, compareOptions, useServerDefault, isUniqueKey, columnSortOrder, sortOrdinal); } public SqlMetaData(string name, SqlDbType dbType, string database, string owningSchema, string objectName, bool useServerDefault, bool isUniqueKey, SortOrder columnSortOrder, int sortOrdinal) { Construct(name, dbType, database, owningSchema, objectName, useServerDefault, isUniqueKey, columnSortOrder, sortOrdinal); } public SqlMetaData(string name, SqlDbType dbType, long maxLength, byte precision, byte scale, long locale, SqlCompareOptions compareOptions, Type userDefinedType) : this(name, dbType, maxLength, precision, scale, locale, compareOptions, userDefinedType, useServerDefault: false, isUniqueKey: false, SortOrder.Unspecified, -1) { } public SqlMetaData(string name, SqlDbType dbType, long maxLength, byte precision, byte scale, long localeId, SqlCompareOptions compareOptions, Type userDefinedType, bool useServerDefault, bool isUniqueKey, SortOrder columnSortOrder, int sortOrdinal) { switch (dbType) { case SqlDbType.BigInt: case SqlDbType.Bit: case SqlDbType.DateTime: case SqlDbType.Float: case SqlDbType.Image: case SqlDbType.Int: case SqlDbType.Money: case SqlDbType.Real: case SqlDbType.UniqueIdentifier: case SqlDbType.SmallDateTime: case SqlDbType.SmallInt: case SqlDbType.SmallMoney: case SqlDbType.Timestamp: case SqlDbType.TinyInt: case SqlDbType.Xml: case SqlDbType.Date: Construct(name, dbType, useServerDefault, isUniqueKey, columnSortOrder, sortOrdinal); break; case SqlDbType.Binary: case SqlDbType.VarBinary: Construct(name, dbType, maxLength, useServerDefault, isUniqueKey, columnSortOrder, sortOrdinal); break; case SqlDbType.Char: case SqlDbType.NChar: case SqlDbType.NVarChar: case SqlDbType.VarChar: Construct(name, dbType, maxLength, localeId, compareOptions, useServerDefault, isUniqueKey, columnSortOrder, sortOrdinal); break; case SqlDbType.NText: case SqlDbType.Text: Construct(name, dbType, Max, localeId, compareOptions, useServerDefault, isUniqueKey, columnSortOrder, sortOrdinal); break; case SqlDbType.Decimal: case SqlDbType.Time: case SqlDbType.DateTime2: case SqlDbType.DateTimeOffset: Construct(name, dbType, precision, scale, useServerDefault, isUniqueKey, columnSortOrder, sortOrdinal); break; case SqlDbType.Variant: Construct(name, dbType, useServerDefault, isUniqueKey, columnSortOrder, sortOrdinal); break; case SqlDbType.Udt: throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString()); default: SQL.InvalidSqlDbTypeForConstructor(dbType); break; } } public SqlMetaData(string name, SqlDbType dbType, string database, string owningSchema, string objectName) { Construct(name, dbType, database, owningSchema, objectName, useServerDefault: false, isUniqueKey: false, SortOrder.Unspecified, -1); } internal SqlMetaData(string name, SqlDbType sqlDBType, long maxLength, byte precision, byte scale, long localeId, SqlCompareOptions compareOptions, string xmlSchemaCollectionDatabase, string xmlSchemaCollectionOwningSchema, string xmlSchemaCollectionName, bool partialLength) { AssertNameIsValid(name); _strName = name; _sqlDbType = sqlDBType; _lMaxLength = maxLength; _bPrecision = precision; _bScale = scale; _lLocale = localeId; _eCompareOptions = compareOptions; _xmlSchemaCollectionDatabase = xmlSchemaCollectionDatabase; _xmlSchemaCollectionOwningSchema = xmlSchemaCollectionOwningSchema; _xmlSchemaCollectionName = xmlSchemaCollectionName; _bPartialLength = partialLength; ThrowIfUdt(sqlDBType); } private SqlMetaData(string name, SqlDbType sqlDbType, long maxLength, byte precision, byte scale, long localeId, SqlCompareOptions compareOptions, bool partialLength) { AssertNameIsValid(name); _strName = name; _sqlDbType = sqlDbType; _lMaxLength = maxLength; _bPrecision = precision; _bScale = scale; _lLocale = localeId; _eCompareOptions = compareOptions; _bPartialLength = partialLength; ThrowIfUdt(sqlDbType); } private void Construct(string name, SqlDbType dbType, bool useServerDefault, bool isUniqueKey, SortOrder columnSortOrder, int sortOrdinal) { AssertNameIsValid(name); ValidateSortOrder(columnSortOrder, sortOrdinal); if (dbType != 0 && SqlDbType.Bit != dbType && SqlDbType.DateTime != dbType && SqlDbType.Date != dbType && SqlDbType.DateTime2 != dbType && SqlDbType.DateTimeOffset != dbType && SqlDbType.Decimal != dbType && SqlDbType.Float != dbType && SqlDbType.Image != dbType && SqlDbType.Int != dbType && SqlDbType.Money != dbType && SqlDbType.NText != dbType && SqlDbType.Real != dbType && SqlDbType.SmallDateTime != dbType && SqlDbType.SmallInt != dbType && SqlDbType.SmallMoney != dbType && SqlDbType.Text != dbType && SqlDbType.Time != dbType && SqlDbType.Timestamp != dbType && SqlDbType.TinyInt != dbType && SqlDbType.UniqueIdentifier != dbType && SqlDbType.Variant != dbType && SqlDbType.Xml != dbType) { throw SQL.InvalidSqlDbTypeForConstructor(dbType); } ThrowIfUdt(dbType); SetDefaultsForType(dbType); if (SqlDbType.NText == dbType || SqlDbType.Text == dbType) { _lLocale = CultureInfo.CurrentCulture.LCID; } _strName = name; _useServerDefault = useServerDefault; _isUniqueKey = isUniqueKey; _columnSortOrder = columnSortOrder; _sortOrdinal = sortOrdinal; } private void Construct(string name, SqlDbType dbType, long maxLength, bool useServerDefault, bool isUniqueKey, SortOrder columnSortOrder, int sortOrdinal) { AssertNameIsValid(name); ValidateSortOrder(columnSortOrder, sortOrdinal); long lLocale = 0L; if (SqlDbType.Char == dbType) { if (maxLength > 8000 || maxLength < 0) { throw ADP.Argument(SR.GetString("Specified length '{0}' is out of range.", maxLength.ToString(CultureInfo.InvariantCulture)), "maxLength"); } lLocale = CultureInfo.CurrentCulture.LCID; } else if (SqlDbType.VarChar == dbType) { if ((maxLength > 8000 || maxLength < 0) && maxLength != Max) { throw ADP.Argument(SR.GetString("Specified length '{0}' is out of range.", maxLength.ToString(CultureInfo.InvariantCulture)), "maxLength"); } lLocale = CultureInfo.CurrentCulture.LCID; } else if (SqlDbType.NChar == dbType) { if (maxLength > 4000 || maxLength < 0) { throw ADP.Argument(SR.GetString("Specified length '{0}' is out of range.", maxLength.ToString(CultureInfo.InvariantCulture)), "maxLength"); } lLocale = CultureInfo.CurrentCulture.LCID; } else if (SqlDbType.NVarChar == dbType) { if ((maxLength > 4000 || maxLength < 0) && maxLength != Max) { throw ADP.Argument(SR.GetString("Specified length '{0}' is out of range.", maxLength.ToString(CultureInfo.InvariantCulture)), "maxLength"); } lLocale = CultureInfo.CurrentCulture.LCID; } else if (SqlDbType.NText == dbType || SqlDbType.Text == dbType) { if (Max != maxLength) { throw ADP.Argument(SR.GetString("Specified length '{0}' is out of range.", maxLength.ToString(CultureInfo.InvariantCulture)), "maxLength"); } lLocale = CultureInfo.CurrentCulture.LCID; } else if (SqlDbType.Binary == dbType) { if (maxLength > 8000 || maxLength < 0) { throw ADP.Argument(SR.GetString("Specified length '{0}' is out of range.", maxLength.ToString(CultureInfo.InvariantCulture)), "maxLength"); } } else if (SqlDbType.VarBinary == dbType) { if ((maxLength > 8000 || maxLength < 0) && maxLength != Max) { throw ADP.Argument(SR.GetString("Specified length '{0}' is out of range.", maxLength.ToString(CultureInfo.InvariantCulture)), "maxLength"); } } else { if (SqlDbType.Image != dbType) { throw SQL.InvalidSqlDbTypeForConstructor(dbType); } if (Max != maxLength) { throw ADP.Argument(SR.GetString("Specified length '{0}' is out of range.", maxLength.ToString(CultureInfo.InvariantCulture)), "maxLength"); } } SetDefaultsForType(dbType); _strName = name; _lMaxLength = maxLength; _lLocale = lLocale; _useServerDefault = useServerDefault; _isUniqueKey = isUniqueKey; _columnSortOrder = columnSortOrder; _sortOrdinal = sortOrdinal; } private void Construct(string name, SqlDbType dbType, long maxLength, long locale, SqlCompareOptions compareOptions, bool useServerDefault, bool isUniqueKey, SortOrder columnSortOrder, int sortOrdinal) { AssertNameIsValid(name); ValidateSortOrder(columnSortOrder, sortOrdinal); if (SqlDbType.Char == dbType) { if (maxLength > 8000 || maxLength < 0) { throw ADP.Argument(SR.GetString("Specified length '{0}' is out of range.", maxLength.ToString(CultureInfo.InvariantCulture)), "maxLength"); } } else if (SqlDbType.VarChar == dbType) { if ((maxLength > 8000 || maxLength < 0) && maxLength != Max) { throw ADP.Argument(SR.GetString("Specified length '{0}' is out of range.", maxLength.ToString(CultureInfo.InvariantCulture)), "maxLength"); } } else if (SqlDbType.NChar == dbType) { if (maxLength > 4000 || maxLength < 0) { throw ADP.Argument(SR.GetString("Specified length '{0}' is out of range.", maxLength.ToString(CultureInfo.InvariantCulture)), "maxLength"); } } else if (SqlDbType.NVarChar == dbType) { if ((maxLength > 4000 || maxLength < 0) && maxLength != Max) { throw ADP.Argument(SR.GetString("Specified length '{0}' is out of range.", maxLength.ToString(CultureInfo.InvariantCulture)), "maxLength"); } } else { if (SqlDbType.NText != dbType && SqlDbType.Text != dbType) { throw SQL.InvalidSqlDbTypeForConstructor(dbType); } if (Max != maxLength) { throw ADP.Argument(SR.GetString("Specified length '{0}' is out of range.", maxLength.ToString(CultureInfo.InvariantCulture)), "maxLength"); } } if (SqlCompareOptions.BinarySort != compareOptions && (0xFFFFFFE4u & (uint)compareOptions) != 0) { throw ADP.InvalidEnumerationValue(typeof(SqlCompareOptions), (int)compareOptions); } SetDefaultsForType(dbType); _strName = name; _lMaxLength = maxLength; _lLocale = locale; _eCompareOptions = compareOptions; _useServerDefault = useServerDefault; _isUniqueKey = isUniqueKey; _columnSortOrder = columnSortOrder; _sortOrdinal = sortOrdinal; } private void Construct(string name, SqlDbType dbType, byte precision, byte scale, bool useServerDefault, bool isUniqueKey, SortOrder columnSortOrder, int sortOrdinal) { AssertNameIsValid(name); ValidateSortOrder(columnSortOrder, sortOrdinal); if (SqlDbType.Decimal == dbType) { if (precision > SqlDecimal.MaxPrecision || scale > precision) { throw SQL.PrecisionValueOutOfRange(precision); } if (scale > SqlDecimal.MaxScale) { throw SQL.ScaleValueOutOfRange(scale); } } else { if (SqlDbType.Time != dbType && SqlDbType.DateTime2 != dbType && SqlDbType.DateTimeOffset != dbType) { throw SQL.InvalidSqlDbTypeForConstructor(dbType); } if (scale > 7) { throw SQL.TimeScaleValueOutOfRange(scale); } } SetDefaultsForType(dbType); _strName = name; _bPrecision = precision; _bScale = scale; if (SqlDbType.Decimal == dbType) { _lMaxLength = s_maxLenFromPrecision[precision - 1]; } else { _lMaxLength -= s_maxVarTimeLenOffsetFromScale[scale]; } _useServerDefault = useServerDefault; _isUniqueKey = isUniqueKey; _columnSortOrder = columnSortOrder; _sortOrdinal = sortOrdinal; } private void Construct(string name, SqlDbType dbType, string database, string owningSchema, string objectName, bool useServerDefault, bool isUniqueKey, SortOrder columnSortOrder, int sortOrdinal) { AssertNameIsValid(name); ValidateSortOrder(columnSortOrder, sortOrdinal); if (SqlDbType.Xml != dbType) { throw SQL.InvalidSqlDbTypeForConstructor(dbType); } if ((database != null || owningSchema != null) && objectName == null) { throw ADP.ArgumentNull("objectName"); } SetDefaultsForType(SqlDbType.Xml); _strName = name; _xmlSchemaCollectionDatabase = database; _xmlSchemaCollectionOwningSchema = owningSchema; _xmlSchemaCollectionName = objectName; _useServerDefault = useServerDefault; _isUniqueKey = isUniqueKey; _columnSortOrder = columnSortOrder; _sortOrdinal = sortOrdinal; } private void AssertNameIsValid(string name) { if (name == null) { throw ADP.ArgumentNull("name"); } if (128L < (long)name.Length) { throw SQL.NameTooLong("name"); } } private void ValidateSortOrder(SortOrder columnSortOrder, int sortOrdinal) { if (SortOrder.Unspecified != columnSortOrder && columnSortOrder != 0 && SortOrder.Descending != columnSortOrder) { throw SQL.InvalidSortOrder(columnSortOrder); } if (SortOrder.Unspecified == columnSortOrder != (-1 == sortOrdinal)) { throw SQL.MustSpecifyBothSortOrderAndOrdinal(columnSortOrder, sortOrdinal); } } public short Adjust(short value) { if (SqlDbType.SmallInt != SqlDbType) { ThrowInvalidType(); } return value; } public int Adjust(int value) { if (SqlDbType.Int != SqlDbType) { ThrowInvalidType(); } return value; } public long Adjust(long value) { if (SqlDbType != 0) { ThrowInvalidType(); } return value; } public float Adjust(float value) { if (SqlDbType.Real != SqlDbType) { ThrowInvalidType(); } return value; } public double Adjust(double value) { if (SqlDbType.Float != SqlDbType) { ThrowInvalidType(); } return value; } public string Adjust(string value) { if (SqlDbType.Char == SqlDbType || SqlDbType.NChar == SqlDbType) { if (value != null && value.Length < MaxLength) { value = value.PadRight((int)MaxLength); } } else if (SqlDbType.VarChar != SqlDbType && SqlDbType.NVarChar != SqlDbType && SqlDbType.Text != SqlDbType && SqlDbType.NText != SqlDbType) { ThrowInvalidType(); } if (value == null) { return null; } if (value.Length > MaxLength && Max != MaxLength) { value = value.Remove((int)MaxLength, (int)(value.Length - MaxLength)); } return value; } public decimal Adjust(decimal value) { if (SqlDbType.Decimal != SqlDbType && SqlDbType.Money != SqlDbType && SqlDbType.SmallMoney != SqlDbType) { ThrowInvalidType(); } if (SqlDbType.Decimal != SqlDbType) { VerifyMoneyRange(new SqlMoney(value)); return value; } return InternalAdjustSqlDecimal(new SqlDecimal(value)).Value; } public DateTime Adjust(DateTime value) { if (SqlDbType.DateTime == SqlDbType || SqlDbType.SmallDateTime == SqlDbType) { VerifyDateTimeRange(value); } else { if (SqlDbType.DateTime2 == SqlDbType) { return new DateTime(InternalAdjustTimeTicks(value.Ticks)); } if (SqlDbType.Date == SqlDbType) { return value.Date; } ThrowInvalidType(); } return value; } public Guid Adjust(Guid value) { if (SqlDbType.UniqueIdentifier != SqlDbType) { ThrowInvalidType(); } return value; } public SqlBoolean Adjust(SqlBoolean value) { if (SqlDbType.Bit != SqlDbType) { ThrowInvalidType(); } return value; } public SqlByte Adjust(SqlByte value) { if (SqlDbType.TinyInt != SqlDbType) { ThrowInvalidType(); } return value; } public SqlInt16 Adjust(SqlInt16 value) { if (SqlDbType.SmallInt != SqlDbType) { ThrowInvalidType(); } return value; } public SqlInt32 Adjust(SqlInt32 value) { if (SqlDbType.Int != SqlDbType) { ThrowInvalidType(); } return value; } public SqlInt64 Adjust(SqlInt64 value) { if (SqlDbType != 0) { ThrowInvalidType(); } return value; } public SqlSingle Adjust(SqlSingle value) { if (SqlDbType.Real != SqlDbType) { ThrowInvalidType(); } return value; } public SqlDouble Adjust(SqlDouble value) { if (SqlDbType.Float != SqlDbType) { ThrowInvalidType(); } return value; } public SqlMoney Adjust(SqlMoney value) { if (SqlDbType.Money != SqlDbType && SqlDbType.SmallMoney != SqlDbType) { ThrowInvalidType(); } if (!value.IsNull) { VerifyMoneyRange(value); } return value; } public SqlDateTime Adjust(SqlDateTime value) { if (SqlDbType.DateTime != SqlDbType && SqlDbType.SmallDateTime != SqlDbType) { ThrowInvalidType(); } if (!value.IsNull) { VerifyDateTimeRange(value.Value); } return value; } public SqlDecimal Adjust(SqlDecimal value) { if (SqlDbType.Decimal != SqlDbType) { ThrowInvalidType(); } return InternalAdjustSqlDecimal(value); } public SqlString Adjust(SqlString value) { if (SqlDbType.Char == SqlDbType || SqlDbType.NChar == SqlDbType) { if (!value.IsNull && value.Value.Length < MaxLength) { return new SqlString(value.Value.PadRight((int)MaxLength)); } } else if (SqlDbType.VarChar != SqlDbType && SqlDbType.NVarChar != SqlDbType && SqlDbType.Text != SqlDbType && SqlDbType.NText != SqlDbType) { ThrowInvalidType(); } if (value.IsNull) { return value; } if (value.Value.Length > MaxLength && Max != MaxLength) { value = new SqlString(value.Value.Remove((int)MaxLength, (int)(value.Value.Length - MaxLength))); } return value; } public SqlBinary Adjust(SqlBinary value) { if (SqlDbType.Binary == SqlDbType || SqlDbType.Timestamp == SqlDbType) { if (!value.IsNull && value.Length < MaxLength) { byte[] value2 = value.Value; byte[] array = new byte[MaxLength]; Buffer.BlockCopy(value2, 0, array, 0, value2.Length); Array.Clear(array, value2.Length, array.Length - value2.Length); return new SqlBinary(array); } } else if (SqlDbType.VarBinary != SqlDbType && SqlDbType.Image != SqlDbType) { ThrowInvalidType(); } if (value.IsNull) { return value; } if (value.Length > MaxLength && Max != MaxLength) { byte[] value3 = value.Value; byte[] array2 = new byte[MaxLength]; Buffer.BlockCopy(value3, 0, array2, 0, (int)MaxLength); value = new SqlBinary(array2); } return value; } public SqlGuid Adjust(SqlGuid value) { if (SqlDbType.UniqueIdentifier != SqlDbType) { ThrowInvalidType(); } return value; } public SqlChars Adjust(SqlChars value) { if (SqlDbType.Char == SqlDbType || SqlDbType.NChar == SqlDbType) { if (value != null && !value.IsNull) { long length = value.Length; if (length < MaxLength) { if (value.MaxLength < MaxLength) { char[] array = new char[(int)MaxLength]; Array.Copy(value.Buffer, 0, array, 0, (int)length); value = new SqlChars(array); } char[] buffer = value.Buffer; for (long num = length; num < MaxLength; num++) { buffer[num] = ' '; } value.SetLength(MaxLength); return value; } } } else if (SqlDbType.VarChar != SqlDbType && SqlDbType.NVarChar != SqlDbType && SqlDbType.Text != SqlDbType && SqlDbType.NText != SqlDbType) { ThrowInvalidType(); } if (value == null || value.IsNull) { return value; } if (value.Length > MaxLength && Max != MaxLength) { value.SetLength(MaxLength); } return value; } public SqlBytes Adjust(SqlBytes value) { if (SqlDbType.Binary == SqlDbType || SqlDbType.Timestamp == SqlDbType) { if (value != null && !value.IsNull) { int num = (int)value.Length; if (num < MaxLength) { if (value.MaxLength < MaxLength) { byte[] array = new byte[MaxLength]; Buffer.BlockCopy(value.Buffer, 0, array, 0, num); value = new SqlBytes(array); } byte[] buffer = value.Buffer; Array.Clear(buffer, num, buffer.Length - num); value.SetLength(MaxLength); return value; } } } else if (SqlDbType.VarBinary != SqlDbType && SqlDbType.Image != SqlDbType) { ThrowInvalidType(); } if (value == null || value.IsNull) { return value; } if (value.Length > MaxLength && Max != MaxLength) { value.SetLength(MaxLength); } return value; } public SqlXml Adjust(SqlXml value) { if (SqlDbType.Xml != SqlDbType) { ThrowInvalidType(); } return value; } public TimeSpan Adjust(TimeSpan value) { if (SqlDbType.Time != SqlDbType) { ThrowInvalidType(); } VerifyTimeRange(value); return new TimeSpan(InternalAdjustTimeTicks(value.Ticks)); } public DateTimeOffset Adjust(DateTimeOffset value) { if (SqlDbType.DateTimeOffset != SqlDbType) { ThrowInvalidType(); } return new DateTimeOffset(InternalAdjustTimeTicks(value.Ticks), value.Offset); } public object Adjust(object value) { if (value == null) { return null; } if (value is bool) { value = Adjust((bool)value); } else if (value is byte) { value = Adjust((byte)value); } else if (value is char) { value = Adjust((char)value); } else if (value is DateTime) { value = Adjust((DateTime)value); } else if (!(value is DBNull)) { if (value is decimal) { value = Adjust((decimal)value); } else if (value is double) { value = Adjust((double)value); } else if (value is short) { value = Adjust((short)value); } else if (value is int) { value = Adjust((int)value); } else if (value is long) { value = Adjust((long)value); } else { if (value is sbyte) { throw ADP.InvalidDataType("SByte"); } if (value is float) { value = Adjust((float)value); } else if (value is string) { value = Adjust((string)value); } else { if (value is ushort) { throw ADP.InvalidDataType("UInt16"); } if (value is uint) { throw ADP.InvalidDataType("UInt32"); } if (value is ulong) { throw ADP.InvalidDataType("UInt64"); } if (value is byte[]) { value = Adjust((byte[])value); } else if (value is char[]) { value = Adjust((char[])value); } else if (value is Guid) { value = Adjust((Guid)value); } else if (value is SqlBinary) { value = Adjust((SqlBinary)value); } else if (value is SqlBoolean) { value = Adjust((SqlBoolean)value); } else if (value is SqlByte) { value = Adjust((SqlByte)value); } else if (value is SqlDateTime) { value = Adjust((SqlDateTime)value); } else if (value is SqlDouble) { value = Adjust((SqlDouble)value); } else if (value is SqlGuid) { value = Adjust((SqlGuid)value); } else if (value is SqlInt16) { value = Adjust((SqlInt16)value); } else if (value is SqlInt32) { value = Adjust((SqlInt32)value); } else if (value is SqlInt64) { value = Adjust((SqlInt64)value); } else if (value is SqlMoney) { value = Adjust((SqlMoney)value); } else if (value is SqlDecimal) { value = Adjust((SqlDecimal)value); } else if (value is SqlSingle) { value = Adjust((SqlSingle)value); } else if (value is SqlString) { value = Adjust((SqlString)value); } else if (value is SqlChars) { value = Adjust((SqlChars)value); } else if (value is SqlBytes) { value = Adjust((SqlBytes)value); } else if (value is SqlXml) { value = Adjust((SqlXml)value); } else if (value is TimeSpan) { value = Adjust((TimeSpan)value); } else { if (!(value is DateTimeOffset)) { throw ADP.UnknownDataType(value.GetType()); } value = Adjust((DateTimeOffset)value); } } } } return value; } public static SqlMetaData InferFromValue(object value, string name) { if (value == null) { throw ADP.ArgumentNull("value"); } if (value is bool) { return new SqlMetaData(name, SqlDbType.Bit); } if (value is byte) { return new SqlMetaData(name, SqlDbType.TinyInt); } if (value is char) { return new SqlMetaData(name, SqlDbType.NVarChar, 1L); } if (value is DateTime) { return new SqlMetaData(name, SqlDbType.DateTime); } if (value is DBNull) { throw ADP.InvalidDataType("DBNull"); } if (value is decimal) { SqlDecimal sqlDecimal = new SqlDecimal((decimal)value); return new SqlMetaData(name, SqlDbType.Decimal, sqlDecimal.Precision, sqlDecimal.Scale); } if (value is double) { return new SqlMetaData(name, SqlDbType.Float); } if (value is short) { return new SqlMetaData(name, SqlDbType.SmallInt); } if (value is int) { return new SqlMetaData(name, SqlDbType.Int); } if (value is long) { return new SqlMetaData(name, SqlDbType.BigInt); } if (value is sbyte) { throw ADP.InvalidDataType("SByte"); } if (value is float) { return new SqlMetaData(name, SqlDbType.Real); } if (value is string) { long num = ((string)value).Length; if (num < 1) { num = 1L; } if (4000 < num) { num = Max; } return new SqlMetaData(name, SqlDbType.NVarChar, num); } if (value is ushort) { throw ADP.InvalidDataType("UInt16"); } if (value is uint) { throw ADP.InvalidDataType("UInt32"); } if (value is ulong) { throw ADP.InvalidDataType("UInt64"); } if (value is byte[]) { long num2 = ((byte[])value).Length; if (num2 < 1) { num2 = 1L; } if (8000 < num2) { num2 = Max; } return new SqlMetaData(name, SqlDbType.VarBinary, num2); } if (value is char[]) { long num3 = ((char[])value).Length; if (num3 < 1) { num3 = 1L; } if (4000 < num3) { num3 = Max; } return new SqlMetaData(name, SqlDbType.NVarChar, num3); } if (value is Guid) { return new SqlMetaData(name, SqlDbType.UniqueIdentifier); } if (value != null) { return new SqlMetaData(name, SqlDbType.Variant); } if (value is SqlBinary sqlBinary) { long num4; if (!sqlBinary.IsNull) { num4 = sqlBinary.Length; if (num4 < 1) { num4 = 1L; } if (8000 < num4) { num4 = Max; } } else { num4 = sxm_rgDefaults[21].MaxLength; } return new SqlMetaData(name, SqlDbType.VarBinary, num4); } if (value is SqlBoolean) { return new SqlMetaData(name, SqlDbType.Bit); } if (value is SqlByte) { return new SqlMetaData(name, SqlDbType.TinyInt); } if (value is SqlDateTime) { return new SqlMetaData(name, SqlDbType.DateTime); } if (value is SqlDouble) { return new SqlMetaData(name, SqlDbType.Float); } if (value is SqlGuid) { return new SqlMetaData(name, SqlDbType.UniqueIdentifier); } if (value is SqlInt16) { return new SqlMetaData(name, SqlDbType.SmallInt); } if (value is SqlInt32) { return new SqlMetaData(name, SqlDbType.Int); } if (value is SqlInt64) { return new SqlMetaData(name, SqlDbType.BigInt); } if (value is SqlMoney) { return new SqlMetaData(name, SqlDbType.Money); } if (value is SqlDecimal sqlDecimal2) { byte precision; byte scale; if (!sqlDecimal2.IsNull) { precision = sqlDecimal2.Precision; scale = sqlDecimal2.Scale; } else { precision = sxm_rgDefaults[5].Precision; scale = sxm_rgDefaults[5].Scale; } return new SqlMetaData(name, SqlDbType.Decimal, precision, scale); } if (value is SqlSingle) { return new SqlMetaData(name, SqlDbType.Real); } if (value is SqlString sqlString) { if (!sqlString.IsNull) { long num5 = sqlString.Value.Length; if (num5 < 1) { num5 = 1L; } if (num5 > 4000) { num5 = Max; } return new SqlMetaData(name, SqlDbType.NVarChar, num5, sqlString.LCID, sqlString.SqlCompareOptions); } return new SqlMetaData(name, SqlDbType.NVarChar, sxm_rgDefaults[12].MaxLength); } if (value is SqlChars) { SqlChars sqlChars = (SqlChars)value; long num6; if (!sqlChars.IsNull) { num6 = sqlChars.Length; if (num6 < 1) { num6 = 1L; } if (num6 > 4000) { num6 = Max; } } else { num6 = sxm_rgDefaults[12].MaxLength; } return new SqlMetaData(name, SqlDbType.NVarChar, num6); } if (value is SqlBytes) { SqlBytes sqlBytes = (SqlBytes)value; long num7; if (!sqlBytes.IsNull) { num7 = sqlBytes.Length; if (num7 < 1) { num7 = 1L; } else if (8000 < num7) { num7 = Max; } } else { num7 = sxm_rgDefaults[21].MaxLength; } return new SqlMetaData(name, SqlDbType.VarBinary, num7); } if (value is SqlXml) { return new SqlMetaData(name, SqlDbType.Xml); } if (value is TimeSpan) { return new SqlMetaData(name, SqlDbType.Time, 0, InferScaleFromTimeTicks(((TimeSpan)value).Ticks)); } if (value is DateTimeOffset) { return new SqlMetaData(name, SqlDbType.DateTimeOffset, 0, InferScaleFromTimeTicks(((DateTimeOffset)value).Ticks)); } throw ADP.UnknownDataType(value.GetType()); } public bool Adjust(bool value) { if (SqlDbType.Bit != SqlDbType) { ThrowInvalidType(); } return value; } public byte Adjust(byte value) { if (SqlDbType.TinyInt != SqlDbType) { ThrowInvalidType(); } return value; } public byte[] Adjust(byte[] value) { if (SqlDbType.Binary == SqlDbType || SqlDbType.Timestamp == SqlDbType) { if (value != null && value.Length < MaxLength) { byte[] array = new byte[MaxLength]; Buffer.BlockCopy(value, 0, array, 0, value.Length); Array.Clear(array, value.Length, array.Length - value.Length); return array; } } else if (SqlDbType.VarBinary != SqlDbType && SqlDbType.Image != SqlDbType) { ThrowInvalidType(); } if (value == null) { return null; } if (value.Length > MaxLength && Max != MaxLength) { byte[] array2 = new byte[MaxLength]; Buffer.BlockCopy(value, 0, array2, 0, (int)MaxLength); value = array2; } return value; } public char Adjust(char value) { if (SqlDbType.Char == SqlDbType || SqlDbType.NChar == SqlDbType) { if (1 != MaxLength) { ThrowInvalidType(); } } else if (1 > MaxLength || (SqlDbType.VarChar != SqlDbType && SqlDbType.NVarChar != SqlDbType && SqlDbType.Text != SqlDbType && SqlDbType.NText != SqlDbType)) { ThrowInvalidType(); } return value; } public char[] Adjust(char[] value) { if (SqlDbType.Char == SqlDbType || SqlDbType.NChar == SqlDbType) { if (value != null) { long num = value.Length; if (num < MaxLength) { char[] array = new char[(int)MaxLength]; Array.Copy(value, 0, array, 0, (int)num); for (long num2 = num; num2 < array.Length; num2++) { array[num2] = ' '; } return array; } } } else if (SqlDbType.VarChar != SqlDbType && SqlDbType.NVarChar != SqlDbType && SqlDbType.Text != SqlDbType && SqlDbType.NText != SqlDbType) { ThrowInvalidType(); } if (value == null) { return null; } if (value.Length > MaxLength && Max != MaxLength) { char[] array2 = new char[MaxLength]; Array.Copy(value, 0, array2, 0, (int)MaxLength); value = array2; } return value; } internal static SqlMetaData GetPartialLengthMetaData(SqlMetaData md) { if (md.IsPartialLength) { return md; } if (md.SqlDbType == SqlDbType.Xml) { ThrowInvalidType(); } if (md.SqlDbType == SqlDbType.NVarChar || md.SqlDbType == SqlDbType.VarChar || md.SqlDbType == SqlDbType.VarBinary) { return new SqlMetaData(md.Name, md.SqlDbType, Max, 0, 0, md.LocaleId, md.CompareOptions, null, null, null, partialLength: true); } return md; } private static void ThrowInvalidType() { throw ADP.InvalidMetaDataValue(); } private void VerifyDateTimeRange(DateTime value) { if (SqlDbType.SmallDateTime == SqlDbType && (s_dtSmallMax < value || s_dtSmallMin > value)) { ThrowInvalidType(); } } private void VerifyMoneyRange(SqlMoney value) { if (SqlDbType.SmallMoney == SqlDbType && ((s_smSmallMax < value).Value || (s_smSmallMin > value).Value)) { ThrowInvalidType(); } } private SqlDecimal InternalAdjustSqlDecimal(SqlDecimal value) { if (!value.IsNull && (value.Precision != Precision || value.Scale != Scale)) { if (value.Scale != Scale) { value = SqlDecimal.AdjustScale(value, Scale - value.Scale, fRound: false); } return SqlDecimal.ConvertToPrecScale(value, Precision, Scale); } return value; } private void VerifyTimeRange(TimeSpan value) { if (SqlDbType.Time == SqlDbType && (s_timeMin > value || value > s_timeMax)) { ThrowInvalidType(); } } private long InternalAdjustTimeTicks(long ticks) { return ticks / s_unitTicksFromScale[Scale] * s_unitTicksFromScale[Scale]; } private static byte InferScaleFromTimeTicks(long ticks) { for (byte b = 0; b < 7; b++) { if (ticks / s_unitTicksFromScale[b] * s_unitTicksFromScale[b] == ticks) { return b; } } return 7; } private void SetDefaultsForType(SqlDbType dbType) { if (SqlDbType.BigInt <= dbType && SqlDbType.DateTimeOffset >= dbType) { SqlMetaData sqlMetaData = sxm_rgDefaults[(int)dbType]; _sqlDbType = dbType; _lMaxLength = sqlMetaData.MaxLength; _bPrecision = sqlMetaData.Precision; _bScale = sqlMetaData.Scale; _lLocale = sqlMetaData.LocaleId; _eCompareOptions = sqlMetaData.CompareOptions; } } private void ThrowIfUdt(SqlDbType dbType) { if (dbType == SqlDbType.Udt) { throw ADP.DbTypeNotSupported(SqlDbType.Udt.ToString()); } } public SqlMetaData(string name, SqlDbType dbType, Type userDefinedType) : this(name, dbType, -1L, 0, 0, 0L, SqlCompareOptions.None, userDefinedType) { } public SqlMetaData(string name, SqlDbType dbType, Type userDefinedType, string serverTypeName) { ThrowStub.ThrowNotSupportedException(); } public SqlMetaData(string name, SqlDbType dbType, Type userDefinedType, string serverTypeName, bool useServerDefault, bool isUniqueKey, SortOrder columnSortOrder, int sortOrdinal) { ThrowStub.ThrowNotSupportedException(); } } public sealed class SqlTriggerContext { private TriggerAction _triggerAction; private bool[] _columnsUpdated; private SqlXml _eventInstanceData; public int ColumnCount { get { int result = 0; if (_columnsUpdated != null) { result = _columnsUpdated.Length; } return result; } } public SqlXml EventData => _eventInstanceData; public TriggerAction TriggerAction => _triggerAction; internal SqlTriggerContext(TriggerAction triggerAction, bool[] columnsUpdated, SqlXml eventInstanceData) { _triggerAction = triggerAction; _columnsUpdated = columnsUpdated; _eventInstanceData = eventInstanceData; } public bool IsUpdatedColumn(int columnOrdinal) { if (_columnsUpdated != null) { return _columnsUpdated[columnOrdinal]; } throw ADP.IndexOutOfRange(columnOrdinal); } internal SqlTriggerContext() { ThrowStub.ThrowNotSupportedException(); } } public interface IBinarySerialize { void Read(BinaryReader r); void Write(BinaryWriter w); } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue, AllowMultiple = false, Inherited = false)] public class SqlFacetAttribute : Attribute { private bool m_IsFixedLength; private int m_MaxSize; private int m_Scale; private int m_Precision; private bool m_IsNullable; public bool IsFixedLength { get { return m_IsFixedLength; } set { m_IsFixedLength = value; } } public int MaxSize { get { return m_MaxSize; } set { m_MaxSize = value; } } public int Precision { get { return m_Precision; } set { m_Precision = value; } } public int Scale { get { return m_Scale; } set { m_Scale = value; } } public bool IsNullable { get { return m_IsNullable; } set { m_IsNullable = value; } } } [Serializable] public enum DataAccessKind { None, Read } [Serializable] public enum SystemDataAccessKind { None, Read } [Serializable] [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] public class SqlFunctionAttribute : Attribute { private bool m_fDeterministic; private DataAccessKind m_eDataAccess; private SystemDataAccessKind m_eSystemDataAccess; private bool m_fPrecise; private string m_fName; private string m_fTableDefinition; private string m_FillRowMethodName; public bool IsDeterministic { get { return m_fDeterministic; } set { m_fDeterministic = value; } } public DataAccessKind DataAccess { get { return m_eDataAccess; } set { m_eDataAccess = value; } } public SystemDataAccessKind SystemDataAccess { get { return m_eSystemDataAccess; } set { m_eSystemDataAccess = value; } } public bool IsPrecise { get { return m_fPrecise; } set { m_fPrecise = value; } } public string Name { get { return m_fName; } set { m_fName = value; } } public string TableDefinition { get { return m_fTableDefinition; } set { m_fTableDefinition = value; } } public string FillRowMethodName { get { return m_FillRowMethodName; } set { m_FillRowMethodName = value; } } public SqlFunctionAttribute() { m_fDeterministic = false; m_eDataAccess = DataAccessKind.None; m_eSystemDataAccess = SystemDataAccessKind.None; m_fPrecise = false; m_fName = null; m_fTableDefinition = null; m_FillRowMethodName = null; } } [Serializable] [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] public sealed class SqlMethodAttribute : SqlFunctionAttribute { private bool m_fCallOnNullInputs; private bool m_fMutator; private bool m_fInvokeIfReceiverIsNull; public bool OnNullCall { get { return m_fCallOnNullInputs; } set { m_fCallOnNullInputs = value; } } public bool IsMutator { get { return m_fMutator; } set { m_fMutator = value; } } public bool InvokeIfReceiverIsNull { get { return m_fInvokeIfReceiverIsNull; } set { m_fInvokeIfReceiverIsNull = value; } } public SqlMethodAttribute() { m_fCallOnNullInputs = true; m_fMutator = false; m_fInvokeIfReceiverIsNull = false; } } [Serializable] [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] public sealed class SqlProcedureAttribute : Attribute { private string m_fName; public string Name { get { return m_fName; } set { m_fName = value; } } public SqlProcedureAttribute() { m_fName = null; } } [Serializable] [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] public sealed class SqlTriggerAttribute : Attribute { private string m_fName; private string m_fTarget; private string m_fEvent; public string Name { get { return m_fName; } set { m_fName = value; } } public string Target { get { return m_fTarget; } set { m_fTarget = value; } } public string Event { get { return m_fEvent; } set { m_fEvent = value; } } public SqlTriggerAttribute() { m_fName = null; m_fTarget = null; m_fEvent = null; } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = false, Inherited = false)] public sealed class SqlUserDefinedAggregateAttribute : Attribute { private int m_MaxByteSize; private bool m_fInvariantToDup; private bool m_fInvariantToNulls; private bool m_fInvariantToOrder = true; private bool m_fNullIfEmpty; private Format m_format; private string m_fName; public const int MaxByteSizeValue = 8000; public int MaxByteSize { get { return m_MaxByteSize; } set { if (value < -1 || value > 8000) { throw ADP.ArgumentOutOfRange(Res.GetString("range: 0-8000"), "MaxByteSize", value); } m_MaxByteSize = value; } } public bool IsInvariantToDuplicates { get { return m_fInvariantToDup; } set { m_fInvariantToDup = value; } } public bool IsInvariantToNulls { get { return m_fInvariantToNulls; } set { m_fInvariantToNulls = value; } } public bool IsInvariantToOrder { get { return m_fInvariantToOrder; } set { m_fInvariantToOrder = value; } } public bool IsNullIfEmpty { get { return m_fNullIfEmpty; } set { m_fNullIfEmpty = value; } } public Format Format => m_format; public string Name { get { return m_fName; } set { m_fName = value; } } public SqlUserDefinedAggregateAttribute(Format format) { switch (format) { case Format.Unknown: throw ADP.NotSupportedUserDefinedTypeSerializationFormat(format, "format"); case Format.Native: case Format.UserDefined: m_format = format; break; default: throw ADP.InvalidUserDefinedTypeSerializationFormat(format); } } } public enum Format { Unknown, Native, UserDefined } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = false, Inherited = true)] public sealed class SqlUserDefinedTypeAttribute : Attribute { private int m_MaxByteSize; private bool m_IsFixedLength; private bool m_IsByteOrdered; private Format m_format; private string m_fName; internal const int YukonMaxByteSizeValue = 8000; private string m_ValidationMethodName; public int MaxByteSize { get { return m_MaxByteSize; } set { if (value < -1) { throw ADP.ArgumentOutOfRange("MaxByteSize"); } m_MaxByteSize = value; } } public bool IsFixedLength { get { return m_IsFixedLength; } set { m_IsFixedLength = value; } } public bool IsByteOrdered { get { return m_IsByteOrdered; } set { m_IsByteOrdered = value; } } public Format Format => m_format; public string ValidationMethodName { get { return m_ValidationMethodName; } set { m_ValidationMethodName = value; } } public string Name { get { return m_fName; } set { m_fName = value; } } public SqlUserDefinedTypeAttribute(Format format) { switch (format) { case Format.Unknown: throw ADP.NotSupportedUserDefinedTypeSerializationFormat(format, "format"); case Format.Native: case Format.UserDefined: m_format = format; break; default: throw ADP.InvalidUserDefinedTypeSerializationFormat(format); } } } internal enum EMDEventType { x_eet_Invalid = 0, x_eet_Insert = 1, x_eet_Update = 2, x_eet_Delete = 3, x_eet_Create_Table = 21, x_eet_Alter_Table = 22, x_eet_Drop_Table = 23, x_eet_Create_Index = 24, x_eet_Alter_Index = 25, x_eet_Drop_Index = 26, x_eet_Create_Stats = 27, x_eet_Update_Stats = 28, x_eet_Drop_Stats = 29, x_eet_Create_Secexpr = 31, x_eet_Drop_Secexpr = 33, x_eet_Create_Synonym = 34, x_eet_Drop_Synonym = 36, x_eet_Create_View = 41, x_eet_Alter_View = 42, x_eet_Drop_View = 43, x_eet_Create_Procedure = 51, x_eet_Alter_Procedure = 52, x_eet_Drop_Procedure = 53, x_eet_Create_Function = 61, x_eet_Alter_Function = 62, x_eet_Drop_Function = 63, x_eet_Create_Trigger = 71, x_eet_Alter_Trigger = 72, x_eet_Drop_Trigger = 73, x_eet_Create_Event_Notification = 74, x_eet_Drop_Event_Notification = 76, x_eet_Create_Type = 91, x_eet_Drop_Type = 93, x_eet_Create_Assembly = 101, x_eet_Alter_Assembly = 102, x_eet_Drop_Assembly = 103, x_eet_Create_User = 131, x_eet_Alter_User = 132, x_eet_Drop_User = 133, x_eet_Create_Role = 134, x_eet_Alter_Role = 135, x_eet_Drop_Role = 136, x_eet_Create_AppRole = 137, x_eet_Alter_AppRole = 138, x_eet_Drop_AppRole = 139, x_eet_Create_Schema = 141, x_eet_Alter_Schema = 142, x_eet_Drop_Schema = 143, x_eet_Create_Login = 144, x_eet_Alter_Login = 145, x_eet_Drop_Login = 146, x_eet_Create_MsgType = 151, x_eet_Alter_MsgType = 152, x_eet_Drop_MsgType = 153, x_eet_Create_Contract = 154, x_eet_Alter_Contract = 155, x_eet_Drop_Contract = 156, x_eet_Create_Queue = 157, x_eet_Alter_Queue = 158, x_eet_Drop_Queue = 159, x_eet_Create_Service = 161, x_eet_Alter_Service = 162, x_eet_Drop_Service = 163, x_eet_Create_Route = 164, x_eet_Alter_Route = 165, x_eet_Drop_Route = 166, x_eet_Grant_Statement = 167, x_eet_Deny_Statement = 168, x_eet_Revoke_Statement = 169, x_eet_Grant_Object = 170, x_eet_Deny_Object = 171, x_eet_Revoke_Object = 172, x_eet_Activation = 173, x_eet_Create_Binding = 174, x_eet_Alter_Binding = 175, x_eet_Drop_Binding = 176, x_eet_Create_XmlSchema = 177, x_eet_Alter_XmlSchema = 178, x_eet_Drop_XmlSchema = 179, x_eet_Create_HttpEndpoint = 181, x_eet_Alter_HttpEndpoint = 182, x_eet_Drop_HttpEndpoint = 183, x_eet_Create_Partition_Function = 191, x_eet_Alter_Partition_Function = 192, x_eet_Drop_Partition_Function = 193, x_eet_Create_Partition_Scheme = 194, x_eet_Alter_Partition_Scheme = 195, x_eet_Drop_Partition_Scheme = 196, x_eet_Create_Database = 201, x_eet_Alter_Database = 202, x_eet_Drop_Database = 203, x_eet_Trace_Start = 1000, x_eet_Trace_End = 1999 } public enum TriggerAction { Invalid = 0, Insert = 1, Update = 2, Delete = 3, CreateTable = 21, AlterTable = 22, DropTable = 23, CreateIndex = 24, AlterIndex = 25, DropIndex = 26, CreateSynonym = 34, DropSynonym = 36, CreateSecurityExpression = 31, DropSecurityExpression = 33, CreateView = 41, AlterView = 42, DropView = 43, CreateProcedure = 51, AlterProcedure = 52, DropProcedure = 53, CreateFunction = 61, AlterFunction = 62, DropFunction = 63, CreateTrigger = 71, AlterTrigger = 72, DropTrigger = 73, CreateEventNotification = 74, DropEventNotification = 76, CreateType = 91, DropType = 93, CreateAssembly = 101, AlterAssembly = 102, DropAssembly = 103, CreateUser = 131, AlterUser = 132, DropUser = 133, CreateRole = 134, AlterRole = 135, DropRole = 136, CreateAppRole = 137, AlterAppRole = 138, DropAppRole = 139, CreateSchema = 141, AlterSchema = 142, DropSchema = 143, CreateLogin = 144, AlterLogin = 145, DropLogin = 146, CreateMsgType = 151, DropMsgType = 153, CreateContract = 154, DropContract = 156, CreateQueue = 157, AlterQueue = 158, DropQueue = 159, CreateService = 161, AlterService = 162, DropService = 163, CreateRoute = 164, AlterRoute = 165, DropRoute = 166, GrantStatement = 167, DenyStatement = 168, RevokeStatement = 169, GrantObject = 170, DenyObject = 171, RevokeObject = 172, CreateBinding = 174, AlterBinding = 175, DropBinding = 176, CreatePartitionFunction = 191, AlterPartitionFunction = 192, DropPartitionFunction = 193, CreatePartitionScheme = 194, AlterPartitionScheme = 195, DropPartitionScheme = 196 } [Serializable] public sealed class InvalidUdtException : SystemException { private class HResults { internal const int InvalidUdt = -2146232009; } internal InvalidUdtException() { base.HResult = -2146232009; } internal InvalidUdtException(string message) : base(message) { base.HResult = -2146232009; } internal InvalidUdtException(string message, Exception innerException) : base(message, innerException) { base.HResult = -2146232009; } private InvalidUdtException(SerializationInfo si, StreamingContext sc) : base(si, sc) { } [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)] public override void GetObjectData(SerializationInfo si, StreamingContext context) { base.GetObjectData(si, context); } internal static InvalidUdtException Create(Type udtType, string resourceReason) { string @string = Res.GetString(resourceReason); InvalidUdtException ex = new InvalidUdtException(Res.GetString("'{0}' is an invalid user defined type, reason: {1}.", udtType.FullName, @string)); ADP.TraceExceptionAsReturnValue(ex); return ex; } } } namespace Microsoft.Win32.SafeHandles { internal sealed class SafeGssNameHandle : SafeHandle { public override bool IsInvalid => handle == IntPtr.Zero; public static Microsoft.Win32.SafeHandles.SafeGssNameHandle CreateUser(string name) { global::Interop.NetSecurityNative.Status minorStatus; Microsoft.Win32.SafeHandles.SafeGssNameHandle outputName; global::Interop.NetSecurityNative.Status status = global::Interop.NetSecurityNative.ImportUserName(out minorStatus, name, Encoding.UTF8.GetByteCount(name), out outputName); if (status != 0) { outputName.Dispose(); throw new global::Interop.NetSecurityNative.GssApiException(status, minorStatus); } return outputName; } public static Microsoft.Win32.SafeHandles.SafeGssNameHandle CreatePrincipal(string name) { global::Interop.NetSecurityNative.Status minorStatus; Microsoft.Win32.SafeHandles.SafeGssNameHandle outputName; global::Interop.NetSecurityNative.Status status = global::Interop.NetSecurityNative.ImportPrincipalName(out minorStatus, name, Encoding.UTF8.GetByteCount(name), out outputName); if (status != 0) { outputName.Dispose(); throw new global::Interop.NetSecurityNative.GssApiException(status, minorStatus); } return outputName; } protected override bool ReleaseHandle() { global::Interop.NetSecurityNative.Status minorStatus; global::Interop.NetSecurityNative.Status num = global::Interop.NetSecurityNative.ReleaseName(out minorStatus, ref handle); SetHandle(IntPtr.Zero); return num == global::Interop.NetSecurityNative.Status.GSS_S_COMPLETE; } private SafeGssNameHandle() : base(IntPtr.Zero, ownsHandle: true) { } } internal class SafeGssCredHandle : SafeHandle { public override bool IsInvalid => handle == IntPtr.Zero; public static Microsoft.Win32.SafeHandles.SafeGssCredHandle Create(string username, string password, bool isNtlmOnly) { if (string.IsNullOrEmpty(username)) { return new Microsoft.Win32.SafeHandles.SafeGssCredHandle(); } Microsoft.Win32.SafeHandles.SafeGssCredHandle outputCredHandle = null; using Microsoft.Win32.SafeHandles.SafeGssNameHandle desiredName = Microsoft.Win32.SafeHandles.SafeGssNameHandle.CreateUser(username); global::Interop.NetSecurityNative.Status minorStatus; global::Interop.NetSecurityNative.Status status = ((!string.IsNullOrEmpty(password)) ? global::Interop.NetSecurityNative.InitiateCredWithPassword(out minorStatus, isNtlmOnly, desiredName, password, Encoding.UTF8.GetByteCount(password), out outputCredHandle) : global::Interop.NetSecurityNative.InitiateCredSpNego(out minorStatus, desiredName, out outputCredHandle)); if (status != 0) { outputCredHandle.Dispose(); throw new global::Interop.NetSecurityNative.GssApiException(status, minorStatus); } return outputCredHandle; } private SafeGssCredHandle() : base(IntPtr.Zero, ownsHandle: true) { } protected override bool ReleaseHandle() { global::Interop.NetSecurityNative.Status minorStatus; global::Interop.NetSecurityNative.Status num = global::Interop.NetSecurityNative.ReleaseCred(out minorStatus, ref handle); SetHandle(IntPtr.Zero); return num == global::Interop.NetSecurityNative.Status.GSS_S_COMPLETE; } } internal sealed class SafeGssContextHandle : SafeHandle { public override bool IsInvalid => handle == IntPtr.Zero; public SafeGssContextHandle() : base(IntPtr.Zero, ownsHandle: true) { } protected override bool ReleaseHandle() { global::Interop.NetSecurityNative.Status minorStatus; global::Interop.NetSecurityNative.Status num = global::Interop.NetSecurityNative.DeleteSecContext(out minorStatus, ref handle); SetHandle(IntPtr.Zero); return num == global::Interop.NetSecurityNative.Status.GSS_S_COMPLETE; } } } namespace System.Data.SqlClient { public abstract class SqlColumnEncryptionKeyStoreProvider { protected SqlColumnEncryptionKeyStoreProvider() { ThrowStub.ThrowNotSupportedException(); } public abstract byte[] DecryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] encryptedColumnEncryptionKey); public abstract byte[] EncryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] columnEncryptionKey); } } namespace System.Data { public class DataSetSchemaImporterExtension : SchemaImporterExtension { public DataSetSchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } public override string ImportSchemaType(string name, string schemaNamespace, XmlSchemaObject context, XmlSchemas schemas, XmlSchemaImporter importer, CodeCompileUnit compileUnit, CodeNamespace mainNamespace, CodeGenerationOptions options, CodeDomProvider codeProvider) { ThrowStub.ThrowNotSupportedException(); return null; } public override string ImportSchemaType(XmlSchemaType type, XmlSchemaObject context, XmlSchemas schemas, XmlSchemaImporter importer, CodeCompileUnit compileUnit, CodeNamespace mainNamespace, CodeGenerationOptions options, CodeDomProvider codeProvider) { ThrowStub.ThrowNotSupportedException(); return null; } } [Obsolete("TypedDataSetGenerator class will be removed in a future release. Please use System.Data.Design.TypedDataSetGenerator in System.Design.dll.")] [HostProtection(SecurityAction.LinkDemand, SharedState = true, Synchronization = true)] public class TypedDataSetGenerator { public TypedDataSetGenerator() { ThrowStub.ThrowNotSupportedException(); } public static void Generate(DataSet dataSet, CodeNamespace codeNamespace, ICodeGenerator codeGen) { ThrowStub.ThrowNotSupportedException(); } public static string GenerateIdName(string name, ICodeGenerator codeGen) { ThrowStub.ThrowNotSupportedException(); return null; } } } namespace System.Data.SqlTypes { public sealed class SqlFileStream : Stream { public override bool CanRead { get { ThrowStub.ThrowNotSupportedException(); return default(bool); } } public override bool CanSeek { get { ThrowStub.ThrowNotSupportedException(); return default(bool); } } public override bool CanWrite { get { ThrowStub.ThrowNotSupportedException(); return default(bool); } } public override long Length { get { ThrowStub.ThrowNotSupportedException(); return default(long); } } public string Name { get { ThrowStub.ThrowNotSupportedException(); return null; } } public override long Position { get { ThrowStub.ThrowNotSupportedException(); return default(long); } set { ThrowStub.ThrowNotSupportedException(); } } public byte[] TransactionContext { get { ThrowStub.ThrowNotSupportedException(); return null; } } public SqlFileStream(string path, byte[] transactionContext, FileAccess access) { ThrowStub.ThrowNotSupportedException(); } public SqlFileStream(string path, byte[] transactionContext, FileAccess access, FileOptions options, long allocationSize) { ThrowStub.ThrowNotSupportedException(); } public override void Flush() { ThrowStub.ThrowNotSupportedException(); } public override int Read([In][Out] byte[] buffer, int offset, int count) { ThrowStub.ThrowNotSupportedException(); return default(int); } public override long Seek(long offset, SeekOrigin origin) { ThrowStub.ThrowNotSupportedException(); return default(long); } public override void SetLength(long value) { ThrowStub.ThrowNotSupportedException(); } public override void Write(byte[] buffer, int offset, int count) { ThrowStub.ThrowNotSupportedException(); } } public class SqlTypesSchemaImporterExtensionHelper : SchemaImporterExtension { protected static readonly string SqlTypesNamespace; public SqlTypesSchemaImporterExtensionHelper(string name, string destinationType) { ThrowStub.ThrowNotSupportedException(); } public SqlTypesSchemaImporterExtensionHelper(string name, string destinationType, bool direct) { ThrowStub.ThrowNotSupportedException(); } public SqlTypesSchemaImporterExtensionHelper(string name, string targetNamespace, string[] references, CodeNamespaceImport[] namespaceImports, string destinationType, bool direct) { ThrowStub.ThrowNotSupportedException(); } public override string ImportSchemaType(string name, string xmlNamespace, XmlSchemaObject context, XmlSchemas schemas, XmlSchemaImporter importer, CodeCompileUnit compileUnit, CodeNamespace mainNamespace, CodeGenerationOptions options, CodeDomProvider codeProvider) { ThrowStub.ThrowNotSupportedException(); return null; } public override string ImportSchemaType(XmlSchemaType type, XmlSchemaObject context, XmlSchemas schemas, XmlSchemaImporter importer, CodeCompileUnit compileUnit, CodeNamespace mainNamespace, CodeGenerationOptions options, CodeDomProvider codeProvider) { ThrowStub.ThrowNotSupportedException(); return null; } } public sealed class TypeBigIntSchemaImporterExtension : SqlTypesSchemaImporterExtensionHelper { public TypeBigIntSchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } } public sealed class TypeBinarySchemaImporterExtension : SqlTypesSchemaImporterExtensionHelper { public TypeBinarySchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } } public sealed class TypeBitSchemaImporterExtension : SqlTypesSchemaImporterExtensionHelper { public TypeBitSchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } } public sealed class TypeCharSchemaImporterExtension : SqlTypesSchemaImporterExtensionHelper { public TypeCharSchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } } public sealed class TypeDateTimeSchemaImporterExtension : SqlTypesSchemaImporterExtensionHelper { public TypeDateTimeSchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } } public sealed class TypeDecimalSchemaImporterExtension : SqlTypesSchemaImporterExtensionHelper { public TypeDecimalSchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } } public sealed class TypeFloatSchemaImporterExtension : SqlTypesSchemaImporterExtensionHelper { public TypeFloatSchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } } public sealed class TypeIntSchemaImporterExtension : SqlTypesSchemaImporterExtensionHelper { public TypeIntSchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } } public sealed class TypeMoneySchemaImporterExtension : SqlTypesSchemaImporterExtensionHelper { public TypeMoneySchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } } public sealed class TypeNCharSchemaImporterExtension : SqlTypesSchemaImporterExtensionHelper { public TypeNCharSchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } } public sealed class TypeNTextSchemaImporterExtension : SqlTypesSchemaImporterExtensionHelper { public TypeNTextSchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } } public sealed class TypeNumericSchemaImporterExtension : SqlTypesSchemaImporterExtensionHelper { public TypeNumericSchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } } public sealed class TypeNVarCharSchemaImporterExtension : SqlTypesSchemaImporterExtensionHelper { public TypeNVarCharSchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } } public sealed class TypeRealSchemaImporterExtension : SqlTypesSchemaImporterExtensionHelper { public TypeRealSchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } } public sealed class TypeSmallDateTimeSchemaImporterExtension : SqlTypesSchemaImporterExtensionHelper { public TypeSmallDateTimeSchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } } public sealed class TypeSmallIntSchemaImporterExtension : SqlTypesSchemaImporterExtensionHelper { public TypeSmallIntSchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } } public sealed class TypeSmallMoneySchemaImporterExtension : SqlTypesSchemaImporterExtensionHelper { public TypeSmallMoneySchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } } public sealed class TypeTextSchemaImporterExtension : SqlTypesSchemaImporterExtensionHelper { public TypeTextSchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } } public sealed class TypeTinyIntSchemaImporterExtension : SqlTypesSchemaImporterExtensionHelper { public TypeTinyIntSchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } } public sealed class TypeUniqueIdentifierSchemaImporterExtension : SqlTypesSchemaImporterExtensionHelper { public TypeUniqueIdentifierSchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } } public sealed class TypeVarBinarySchemaImporterExtension : SqlTypesSchemaImporterExtensionHelper { public TypeVarBinarySchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } } public sealed class TypeVarCharSchemaImporterExtension : SqlTypesSchemaImporterExtensionHelper { public TypeVarCharSchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } } public sealed class TypeVarImageSchemaImporterExtension : SqlTypesSchemaImporterExtensionHelper { public TypeVarImageSchemaImporterExtension() { ThrowStub.ThrowNotSupportedException(); } } } namespace System.Data.SqlClient { public class SqlColumnEncryptionCertificateStoreProvider : SqlColumnEncryptionKeyStoreProvider { public const string ProviderName = "MSSQL_CERTIFICATE_STORE"; public SqlColumnEncryptionCertificateStoreProvider() { ThrowStub.ThrowNotSupportedException(); } public override byte[] DecryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] encryptedColumnEncryptionKey) { ThrowStub.ThrowNotSupportedException(); return null; } public override byte[] EncryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] columnEncryptionKey) { ThrowStub.ThrowNotSupportedException(); return null; } } public class SqlColumnEncryptionCngProvider : SqlColumnEncryptionKeyStoreProvider { public const string ProviderName = "MSSQL_CNG_STORE"; public SqlColumnEncryptionCngProvider() { ThrowStub.ThrowNotSupportedException(); } public override byte[] DecryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] encryptedColumnEncryptionKey) { ThrowStub.ThrowNotSupportedException(); return null; } public override byte[] EncryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] columnEncryptionKey) { ThrowStub.ThrowNotSupportedException(); return null; } } public class SqlColumnEncryptionCspProvider : SqlColumnEncryptionKeyStoreProvider { public const string ProviderName = "MSSQL_CSP_PROVIDER"; public SqlColumnEncryptionCspProvider() { ThrowStub.ThrowNotSupportedException(); } public override byte[] DecryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] encryptedColumnEncryptionKey) { ThrowStub.ThrowNotSupportedException(); return null; } public override byte[] EncryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] columnEncryptionKey) { ThrowStub.ThrowNotSupportedException(); return null; } } } namespace System.Data.OleDb { [DefaultEvent("RecordsAffected")] [Designer("Microsoft.VSDesigner.Data.VS.OleDbCommandDesigner, Microsoft.VSDesigner, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] [ToolboxItem(true)] public sealed class OleDbCommand : DbCommand, ICloneable { public override string CommandText { get { ThrowStub.ThrowNotSupportedException(); return null; } set { ThrowStub.ThrowNotSupportedException(); } } public override int CommandTimeout { get { ThrowStub.ThrowNotSupportedException(); return default(int); } set { ThrowStub.ThrowNotSupportedException(); } } public override CommandType CommandType { get { ThrowStub.ThrowNotSupportedException(); return default(CommandType); } set { ThrowStub.ThrowNotSupportedException(); } } public new OleDbConnection Connection { set { ThrowStub.ThrowNotSupportedException(); } } protected override DbConnection DbConnection { get { ThrowStub.ThrowNotSupportedException(); return null; } set { ThrowStub.ThrowNotSupportedException(); } } protected override DbParameterCollection DbParameterCollection { get { ThrowStub.ThrowNotSupportedException(); return null; } } protected override DbTransaction DbTransaction { get { ThrowStub.ThrowNotSupportedException(); return null; } set { ThrowStub.ThrowNotSupportedException(); } } public override bool DesignTimeVisible { get { ThrowStub.ThrowNotSupportedException(); return default(bool); } set { ThrowStub.ThrowNotSupportedException(); } } public new OleDbTransaction Transaction { set { ThrowStub.ThrowNotSupportedException(); } } public override UpdateRowSource UpdatedRowSource { get { ThrowStub.ThrowNotSupportedException(); return default(UpdateRowSource); } set { ThrowStub.ThrowNotSupportedException(); } } public OleDbCommand() { ThrowStub.ThrowNotSupportedException(); } public OleDbCommand(string cmdText) { ThrowStub.ThrowNotSupportedException(); } public OleDbCommand(string cmdText, OleDbConnection connection) { ThrowStub.ThrowNotSupportedException(); } public OleDbCommand(string cmdText, OleDbConnection connection, OleDbTransaction transaction) { ThrowStub.ThrowNotSupportedException(); } public override void Cancel() { ThrowStub.ThrowNotSupportedException(); } public OleDbCommand Clone() { ThrowStub.ThrowNotSupportedException(); return null; } protected override DbParameter CreateDbParameter() { ThrowStub.ThrowNotSupportedException(); return null; } protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior) { ThrowStub.ThrowNotSupportedException(); return null; } public override int ExecuteNonQuery() { ThrowStub.ThrowNotSupportedException(); return default(int); } public override object ExecuteScalar() { ThrowStub.ThrowNotSupportedException(); return null; } public override void Prepare() { ThrowStub.ThrowNotSupportedException(); } public void ResetCommandTimeout() { ThrowStub.ThrowNotSupportedException(); } object ICloneable.Clone() { ThrowStub.ThrowNotSupportedException(); return null; } } [DefaultEvent("InfoMessage")] public sealed class OleDbConnection : DbConnection, ICloneable { public override string ConnectionString { get { ThrowStub.ThrowNotSupportedException(); return null; } set { ThrowStub.ThrowNotSupportedException(); } } public override string Database { get { ThrowStub.ThrowNotSupportedException(); return null; } } public override string DataSource { get { ThrowStub.ThrowNotSupportedException(); return null; } } public string Provider { get { ThrowStub.ThrowNotSupportedException(); return null; } } public override string ServerVersion { get { ThrowStub.ThrowNotSupportedException(); return null; } } public override ConnectionState State { get { ThrowStub.ThrowNotSupportedException(); return default(ConnectionState); } } public event OleDbInfoMessageEventHandler InfoMessage { add { ThrowStub.ThrowNotSupportedException(); } remove { ThrowStub.ThrowNotSupportedException(); } } public OleDbConnection() { ThrowStub.ThrowNotSupportedException(); } public OleDbConnection(string connectionString) { ThrowStub.ThrowNotSupportedException(); } protected override DbTransaction BeginDbTransaction(IsolationLevel isolationLevel) { ThrowStub.ThrowNotSupportedException(); return null; } public override void ChangeDatabase(string value) { ThrowStub.ThrowNotSupportedException(); } public override void Close() { ThrowStub.ThrowNotSupportedException(); } protected override DbCommand CreateDbCommand() { ThrowStub.ThrowNotSupportedException(); return null; } public void EnlistDistributedTransaction(ITransaction transaction) { ThrowStub.ThrowNotSupportedException(); } public DataTable GetOleDbSchemaTable(Guid schema, object[] restrictions) { ThrowStub.ThrowNotSupportedException(); return null; } public override void Open() { ThrowStub.ThrowNotSupportedException(); } public static void ReleaseObjectPool() { ThrowStub.ThrowNotSupportedException(); } [EditorBrowsable(EditorBrowsableState.Advanced)] public void ResetState() { ThrowStub.ThrowNotSupportedException(); } object ICloneable.Clone() { ThrowStub.ThrowNotSupportedException(); return null; } } public delegate void OleDbInfoMessageEventHandler(object sender, OleDbInfoMessageEventArgs e); public sealed class OleDbInfoMessageEventArgs : EventArgs { public int ErrorCode { get { ThrowStub.ThrowNotSupportedException(); return default(int); } } public OleDbErrorCollection Errors { get { ThrowStub.ThrowNotSupportedException(); return null; } } public string Message { get { ThrowStub.ThrowNotSupportedException(); return null; } } public string Source { get { ThrowStub.ThrowNotSupportedException(); return null; } } internal OleDbInfoMessageEventArgs() { ThrowStub.ThrowNotSupportedException(); } } [Serializable] [ListBindable(false)] public sealed class OleDbErrorCollection : ICollection, IEnumerable { public int Count { get { ThrowStub.ThrowNotSupportedException(); return default(int); } } public OleDbError this[int index] { get { ThrowStub.ThrowNotSupportedException(); return null; } } internal OleDbErrorCollection() { ThrowStub.ThrowNotSupportedException(); } [SpecialName] bool ICollection.get_IsSynchronized() { ThrowStub.ThrowNotSupportedException(); return default(bool); } [SpecialName] object ICollection.get_SyncRoot() { ThrowStub.ThrowNotSupportedException(); return null; } public void CopyTo(Array array, int index) { ThrowStub.ThrowNotSupportedException(); } public void CopyTo(OleDbError[] array, int index) { ThrowStub.ThrowNotSupportedException(); } public IEnumerator GetEnumerator() { ThrowStub.ThrowNotSupportedException(); return null; } } [Serializable] public sealed class OleDbError { public string Message { get { ThrowStub.ThrowNotSupportedException(); return null; } } public int NativeError { get { ThrowStub.ThrowNotSupportedException(); return default(int); } } public string Source { get { ThrowStub.ThrowNotSupportedException(); return null; } } public string SQLState { get { ThrowStub.ThrowNotSupportedException(); return null; } } internal OleDbError() { ThrowStub.ThrowNotSupportedException(); } } public sealed class OleDbTransaction : DbTransaction { protected override DbConnection DbConnection { get { ThrowStub.ThrowNotSupportedException(); return null; } } public override IsolationLevel IsolationLevel { get { ThrowStub.ThrowNotSupportedException(); return default(IsolationLevel); } } internal OleDbTransaction() { ThrowStub.ThrowNotSupportedException(); } public OleDbTransaction Begin() { ThrowStub.ThrowNotSupportedException(); return null; } public OleDbTransaction Begin(IsolationLevel isolevel) { ThrowStub.ThrowNotSupportedException(); return null; } public override void Commit() { ThrowStub.ThrowNotSupportedException(); } public override void Rollback() { ThrowStub.ThrowNotSupportedException(); } } public sealed class OleDbCommandBuilder : DbCommandBuilder { public new OleDbDataAdapter DataAdapter { set { ThrowStub.ThrowNotSupportedException(); } } public OleDbCommandBuilder() { ThrowStub.ThrowNotSupportedException(); } public OleDbCommandBuilder(OleDbDataAdapter adapter) { ThrowStub.ThrowNotSupportedException(); } protected override void ApplyParameterInfo(DbParameter parameter, DataRow datarow, StatementType statementType, bool whereClause) { ThrowStub.ThrowNotSupportedException(); } public static void DeriveParameters(OleDbCommand command) { ThrowStub.ThrowNotSupportedException(); } protected override string GetParameterName(int parameterOrdinal) { ThrowStub.ThrowNotSupportedException(); return null; } protected override string GetParameterName(string parameterName) { ThrowStub.ThrowNotSupportedException(); return null; } protected override string GetParameterPlaceholder(int parameterOrdinal) { ThrowStub.ThrowNotSupportedException(); return null; } public string QuoteIdentifier(string unquotedIdentifier, OleDbConnection connection) { ThrowStub.ThrowNotSupportedException(); return null; } protected override void SetRowUpdatingHandler(DbDataAdapter adapter) { ThrowStub.ThrowNotSupportedException(); } public string UnquoteIdentifier(string quotedIdentifier, OleDbConnection connection) { ThrowStub.ThrowNotSupportedException(); return null; } } [DefaultEvent("RowUpdated")] [ToolboxItem("Microsoft.VSDesigner.Data.VS.OleDbDataAdapterToolboxItem, Microsoft.VSDesigner, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] [Designer("Microsoft.VSDesigner.Data.VS.OleDbDataAdapterDesigner, Microsoft.VSDesigner, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] public sealed class OleDbDataAdapter : DbDataAdapter { public new OleDbCommand DeleteCommand { set { ThrowStub.ThrowNotSupportedException(); } } public new OleDbCommand InsertCommand { set { ThrowStub.ThrowNotSupportedException(); } } public new OleDbCommand SelectCommand { set { ThrowStub.ThrowNotSupportedException(); } } public new OleDbCommand UpdateCommand { set { ThrowStub.ThrowNotSupportedException(); } } public event OleDbRowUpdatedEventHandler RowUpdated { add { ThrowStub.ThrowNotSupportedException(); } remove { ThrowStub.ThrowNotSupportedException(); } } public event OleDbRowUpdatingEventHandler RowUpdating { add { ThrowStub.ThrowNotSupportedException(); } remove { ThrowStub.ThrowNotSupportedException(); } } public OleDbDataAdapter() { ThrowStub.ThrowNotSupportedException(); } public OleDbDataAdapter(OleDbCommand selectCommand) { ThrowStub.ThrowNotSupportedException(); } public OleDbDataAdapter(string selectCommandText, OleDbConnection selectConnection) { ThrowStub.ThrowNotSupportedException(); } public OleDbDataAdapter(string selectCommandText, string selectConnectionString) { ThrowStub.ThrowNotSupportedException(); } public int Fill(DataSet dataSet, object ADODBRecordSet, string srcTable) { ThrowStub.ThrowNotSupportedException(); return default(int); } public int Fill(DataTable dataTable, object ADODBRecordSet) { ThrowStub.ThrowNotSupportedException(); return default(int); } } public delegate void OleDbRowUpdatedEventHandler(object sender, OleDbRowUpdatedEventArgs e); public sealed class OleDbRowUpdatedEventArgs : RowUpdatedEventArgs { public OleDbRowUpdatedEventArgs(DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) { ThrowStub.ThrowNotSupportedException(); } } public delegate void OleDbRowUpdatingEventHandler(object sender, OleDbRowUpdatingEventArgs e); public sealed class OleDbRowUpdatingEventArgs : RowUpdatingEventArgs { public new OleDbCommand Command { set { ThrowStub.ThrowNotSupportedException(); } } public OleDbRowUpdatingEventArgs(DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) { ThrowStub.ThrowNotSupportedException(); } } [DefaultMember("Item")] [DefaultProperty("Provider")] [RefreshProperties(RefreshProperties.All)] [TypeConverter("System.Data.OleDb.OleDbConnectionStringBuilder.OleDbConnectionStringBuilderConverter")] public sealed class OleDbConnectionStringBuilder : DbConnectionStringBuilder { public string DataSource { get { ThrowStub.ThrowNotSupportedException(); return null; } set { ThrowStub.ThrowNotSupportedException(); } } public string FileName { get { ThrowStub.ThrowNotSupportedException(); return null; } set { ThrowStub.ThrowNotSupportedException(); } } public int OleDbServices { get { ThrowStub.ThrowNotSupportedException(); return default(int); } set { ThrowStub.ThrowNotSupportedException(); } } public bool PersistSecurityInfo { get { ThrowStub.ThrowNotSupportedException(); return default(bool); } set { ThrowStub.ThrowNotSupportedException(); } } public string Provider { get { ThrowStub.ThrowNotSupportedException(); return null; } set { ThrowStub.ThrowNotSupportedException(); } } public OleDbConnectionStringBuilder() { ThrowStub.ThrowNotSupportedException(); } public OleDbConnectionStringBuilder(string connectionString) { ThrowStub.ThrowNotSupportedException(); } } public sealed class OleDbDataReader : DbDataReader { public override int Depth { get { ThrowStub.ThrowNotSupportedException(); return default(int); } } public override int FieldCount { get { ThrowStub.ThrowNotSupportedException(); return default(int); } } public override bool HasRows { get { ThrowStub.ThrowNotSupportedException(); return default(bool); } } public override bool IsClosed { get { ThrowStub.ThrowNotSupportedException(); return default(bool); } } public override object this[string name] { get { ThrowStub.ThrowNotSupportedException(); return null; } } public override int RecordsAffected { get { ThrowStub.ThrowNotSupportedException(); return default(int); } } internal OleDbDataReader() { ThrowStub.ThrowNotSupportedException(); } [SpecialName] public object get_Item(int index) { ThrowStub.ThrowNotSupportedException(); return null; } public override bool GetBoolean(int ordinal) { ThrowStub.ThrowNotSupportedException(); return default(bool); } public override byte GetByte(int ordinal) { ThrowStub.ThrowNotSupportedException(); return default(byte); } public override long GetBytes(int ordinal, long dataIndex, byte[] buffer, int bufferIndex, int length) { ThrowStub.ThrowNotSupportedException(); return default(long); } [EditorBrowsable(EditorBrowsableState.Never)] public override char GetChar(int ordinal) { ThrowStub.ThrowNotSupportedException(); return default(char); } public override long GetChars(int ordinal, long dataIndex, char[] buffer, int bufferIndex, int length) { ThrowStub.ThrowNotSupportedException(); return default(long); } public override string GetDataTypeName(int index) { ThrowStub.ThrowNotSupportedException(); return null; } public override DateTime GetDateTime(int ordinal) { ThrowStub.ThrowNotSupportedException(); return default(DateTime); } public override decimal GetDecimal(int ordinal) { ThrowStub.ThrowNotSupportedException(); return default(decimal); } public override double GetDouble(int ordinal) { ThrowStub.ThrowNotSupportedException(); return default(double); } public override IEnumerator GetEnumerator() { ThrowStub.ThrowNotSupportedException(); return null; } public override Type GetFieldType(int index) { ThrowStub.ThrowNotSupportedException(); return null; } public override float GetFloat(int ordinal) { ThrowStub.ThrowNotSupportedException(); return default(float); } public override Guid GetGuid(int ordinal) { ThrowStub.ThrowNotSupportedException(); return default(Guid); } public override short GetInt16(int ordinal) { ThrowStub.ThrowNotSupportedException(); return default(short); } public override int GetInt32(int ordinal) { ThrowStub.ThrowNotSupportedException(); return default(int); } public override long GetInt64(int ordinal) { ThrowStub.ThrowNotSupportedException(); return default(long); } public override string GetName(int index) { ThrowStub.ThrowNotSupportedException(); return null; } public override int GetOrdinal(string name) { ThrowStub.ThrowNotSupportedException(); return default(int); } public override string GetString(int ordinal) { ThrowStub.ThrowNotSupportedException(); return null; } public TimeSpan GetTimeSpan(int ordinal) { ThrowStub.ThrowNotSupportedException(); return default(TimeSpan); } public override object GetValue(int ordinal) { ThrowStub.ThrowNotSupportedException(); return null; } public override int GetValues(object[] values) { ThrowStub.ThrowNotSupportedException(); return default(int); } public override bool IsDBNull(int ordinal) { ThrowStub.ThrowNotSupportedException(); return default(bool); } public override bool NextResult() { ThrowStub.ThrowNotSupportedException(); return default(bool); } public override bool Read() { ThrowStub.ThrowNotSupportedException(); return default(bool); } } public sealed class OleDbEnumerator { public OleDbEnumerator() { ThrowStub.ThrowNotSupportedException(); } public DataTable GetElements() { ThrowStub.ThrowNotSupportedException(); return null; } public static OleDbDataReader GetEnumerator(Type type) { ThrowStub.ThrowNotSupportedException(); return null; } public static OleDbDataReader GetRootEnumerator() { ThrowStub.ThrowNotSupportedException(); return null; } } [Serializable] public sealed class OleDbException : DbException { public OleDbErrorCollection Errors { get { ThrowStub.ThrowNotSupportedException(); return null; } } internal OleDbException() { ThrowStub.ThrowNotSupportedException(); } } public sealed class OleDbFactory : DbProviderFactory { public static readonly OleDbFactory Instance; internal OleDbFactory() { ThrowStub.ThrowNotSupportedException(); } } public enum OleDbLiteral { Binary_Literal = 1, Catalog_Name = 2, Catalog_Separator = 3, Char_Literal = 4, Column_Alias = 5, Column_Name = 6, Correlation_Name = 7, Cube_Name = 21, Cursor_Name = 8, Dimension_Name = 22, Escape_Percent_Prefix = 9, Escape_Percent_Suffix = 29, Escape_Underscore_Prefix = 10, Escape_Underscore_Suffix = 30, Hierarchy_Name = 23, Index_Name = 11, Invalid = 0, Level_Name = 24, Like_Percent = 12, Like_Underscore = 13, Member_Name = 25, Procedure_Name = 14, Property_Name = 26, Quote_Prefix = 15, Quote_Suffix = 28, Schema_Name = 16, Schema_Separator = 27, Table_Name = 17, Text_Command = 18, User_Name = 19, View_Name = 20 } public static class OleDbMetaDataCollectionNames { public static readonly string Catalogs; public static readonly string Collations; public static readonly string Columns; public static readonly string Indexes; public static readonly string ProcedureColumns; public static readonly string ProcedureParameters; public static readonly string Procedures; public static readonly string Tables; public static readonly string Views; } public static class OleDbMetaDataColumnNames { public static readonly string BooleanFalseLiteral; public static readonly string BooleanTrueLiteral; public static readonly string DateTimeDigits; public static readonly string NativeDataType; } [TypeConverter("System.Data.OleDb.OleDbParameter.OleDbParameterConverter")] public sealed class OleDbParameter : DbParameter, ICloneable { public override DbType DbType { get { ThrowStub.ThrowNotSupportedException(); return default(DbType); } set { ThrowStub.ThrowNotSupportedException(); } } public override ParameterDirection Direction { get { ThrowStub.ThrowNotSupportedException(); return default(ParameterDirection); } set { ThrowStub.ThrowNotSupportedException(); } } public override bool IsNullable { get { ThrowStub.ThrowNotSupportedException(); return default(bool); } set { ThrowStub.ThrowNotSupportedException(); } } public OleDbType OleDbType { get { ThrowStub.ThrowNotSupportedException(); return default(OleDbType); } set { ThrowStub.ThrowNotSupportedException(); } } public override string ParameterName { get { ThrowStub.ThrowNotSupportedException(); return null; } set { ThrowStub.ThrowNotSupportedException(); } } public override int Size { get { ThrowStub.ThrowNotSupportedException(); return default(int); } set { ThrowStub.ThrowNotSupportedException(); } } public override string SourceColumn { get { ThrowStub.ThrowNotSupportedException(); return null; } set { ThrowStub.ThrowNotSupportedException(); } } public override bool SourceColumnNullMapping { get { ThrowStub.ThrowNotSupportedException(); return default(bool); } set { ThrowStub.ThrowNotSupportedException(); } } public override object Value { get { ThrowStub.ThrowNotSupportedException(); return null; } set { ThrowStub.ThrowNotSupportedException(); } } public OleDbParameter() { ThrowStub.ThrowNotSupportedException(); } public OleDbParameter(string name, OleDbType dataType) { ThrowStub.ThrowNotSupportedException(); } public OleDbParameter(string name, OleDbType dataType, int size) { ThrowStub.ThrowNotSupportedException(); } [EditorBrowsable(EditorBrowsableState.Advanced)] public OleDbParameter(string parameterName, OleDbType dbType, int size, ParameterDirection direction, bool isNullable, byte precision, byte scale, string srcColumn, DataRowVersion srcVersion, object value) { ThrowStub.ThrowNotSupportedException(); } [EditorBrowsable(EditorBrowsableState.Advanced)] public OleDbParameter(string parameterName, OleDbType dbType, int size, ParameterDirection direction, byte precision, byte scale, string sourceColumn, DataRowVersion sourceVersion, bool sourceColumnNullMapping, object value) { ThrowStub.ThrowNotSupportedException(); } public OleDbParameter(string name, OleDbType dataType, int size, string srcColumn) { ThrowStub.ThrowNotSupportedException(); } public OleDbParameter(string name, object value) { ThrowStub.ThrowNotSupportedException(); } public override void ResetDbType() { ThrowStub.ThrowNotSupportedException(); } public void ResetOleDbType() { ThrowStub.ThrowNotSupportedException(); } object ICloneable.Clone() { ThrowStub.ThrowNotSupportedException(); return null; } } [ListBindable(false)] [Editor("Microsoft.VSDesigner.Data.Design.DBParametersEditor, Microsoft.VSDesigner, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] public sealed class OleDbParameterCollection : DbParameterCollection { public override int Count { get { ThrowStub.ThrowNotSupportedException(); return default(int); } } public new string this[string parameterName] { set { ThrowStub.ThrowNotSupportedException(); } } public override object SyncRoot { get { ThrowStub.ThrowNotSupportedException(); return null; } } internal OleDbParameterCollection() { ThrowStub.ThrowNotSupportedException(); } [SpecialName] public void set_Item(int index, OleDbParameter value) { ThrowStub.ThrowNotSupportedException(); } public OleDbParameter Add(OleDbParameter value) { ThrowStub.ThrowNotSupportedException(); return null; } [EditorBrowsable(EditorBrowsableState.Never)] public override int Add(object value) { ThrowStub.ThrowNotSupportedException(); return default(int); } public OleDbParameter Add(string parameterName, OleDbType oleDbType) { ThrowStub.ThrowNotSupportedException(); return null; } public OleDbParameter Add(string parameterName, OleDbType oleDbType, int size) { ThrowStub.ThrowNotSupportedException(); return null; } public OleDbParameter Add(string parameterName, OleDbType oleDbType, int size, string sourceColumn) { ThrowStub.ThrowNotSupportedException(); return null; } [Obsolete("Add(String parameterName, Object value) has been deprecated. Use AddWithValue(String parameterName, Object value). http://go.microsoft.com/fwlink/?linkid=14202", false)] [EditorBrowsable(EditorBrowsableState.Never)] public OleDbParameter Add(string parameterName, object value) { ThrowStub.ThrowNotSupportedException(); return null; } public override void AddRange(Array values) { ThrowStub.ThrowNotSupportedException(); } public void AddRange(OleDbParameter[] values) { ThrowStub.ThrowNotSupportedException(); } public OleDbParameter AddWithValue(string parameterName, object value) { ThrowStub.ThrowNotSupportedException(); return null; } public override void Clear() { ThrowStub.ThrowNotSupportedException(); } public bool Contains(OleDbParameter value) { ThrowStub.ThrowNotSupportedException(); return default(bool); } public override bool Contains(object value) { ThrowStub.ThrowNotSupportedException(); return default(bool); } public override bool Contains(string value) { ThrowStub.ThrowNotSupportedException(); return default(bool); } public override void CopyTo(Array array, int index) { ThrowStub.ThrowNotSupportedException(); } public void CopyTo(OleDbParameter[] array, int index) { ThrowStub.ThrowNotSupportedException(); } public override IEnumerator GetEnumerator() { ThrowStub.ThrowNotSupportedException(); return null; } protected override DbParameter GetParameter(int index) { ThrowStub.ThrowNotSupportedException(); return null; } protected override DbParameter GetParameter(string parameterName) { ThrowStub.ThrowNotSupportedException(); return null; } public int IndexOf(OleDbParameter value) { ThrowStub.ThrowNotSupportedException(); return default(int); } public override int IndexOf(object value) { ThrowStub.ThrowNotSupportedException(); return default(int); } public override int IndexOf(string parameterName) { ThrowStub.ThrowNotSupportedException(); return default(int); } public void Insert(int index, OleDbParameter value) { ThrowStub.ThrowNotSupportedException(); } public override void Insert(int index, object value) { ThrowStub.ThrowNotSupportedException(); } public void Remove(OleDbParameter value) { ThrowStub.ThrowNotSupportedException(); } public override void Remove(object value) { ThrowStub.ThrowNotSupportedException(); } public override void RemoveAt(int index) { ThrowStub.ThrowNotSupportedException(); } public override void RemoveAt(string parameterName) { ThrowStub.ThrowNotSupportedException(); } protected override void SetParameter(int index, DbParameter value) { ThrowStub.ThrowNotSupportedException(); } protected override void SetParameter(string parameterName, DbParameter value) { ThrowStub.ThrowNotSupportedException(); } } [Serializable] public sealed class OleDbPermission : DBDataPermission { public string Provider { get { ThrowStub.ThrowNotSupportedException(); return null; } set { ThrowStub.ThrowNotSupportedException(); } } [Obsolete("OleDbPermission() has been deprecated. Use the OleDbPermission(PermissionState.None) constructor. http://go.microsoft.com/fwlink/?linkid=14202", true)] public OleDbPermission() { ThrowStub.ThrowNotSupportedException(); } public OleDbPermission(PermissionState state) { ThrowStub.ThrowNotSupportedException(); } [Obsolete("OleDbPermission(PermissionState state, Boolean allowBlankPassword) has been deprecated. Use the OleDbPermission(PermissionState.None) constructor. http://go.microsoft.com/fwlink/?linkid=14202", true)] public OleDbPermission(PermissionState state, bool allowBlankPassword) { ThrowStub.ThrowNotSupportedException(); } } [Serializable] [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Constructor | AttributeTargets.Method, AllowMultiple = true, Inherited = false)] public sealed class OleDbPermissionAttribute : DBDataPermissionAttribute { public string Provider { get { ThrowStub.ThrowNotSupportedException(); return null; } set { ThrowStub.ThrowNotSupportedException(); } } public OleDbPermissionAttribute(SecurityAction action) { } public override IPermission CreatePermission() { ThrowStub.ThrowNotSupportedException(); return null; } } public sealed class OleDbSchemaGuid { public static readonly Guid Assertions; public static readonly Guid Catalogs; public static readonly Guid Character_Sets; public static readonly Guid Check_Constraints; public static readonly Guid Check_Constraints_By_Table; public static readonly Guid Collations; public static readonly Guid Columns; public static readonly Guid Column_Domain_Usage; public static readonly Guid Column_Privileges; public static readonly Guid Constraint_Column_Usage; public static readonly Guid Constraint_Table_Usage; public static readonly Guid DbInfoKeywords; public static readonly Guid DbInfoLiterals; public static readonly Guid Foreign_Keys; public static readonly Guid Indexes; public static readonly Guid Key_Column_Usage; public static readonly Guid Primary_Keys; public static readonly Guid Procedures; public static readonly Guid Procedure_Columns; public static readonly Guid Procedure_Parameters; public static readonly Guid Provider_Types; public static readonly Guid Referential_Constraints; public static readonly Guid SchemaGuids; public static readonly Guid Schemata; public static readonly Guid Sql_Languages; public static readonly Guid Statistics; public static readonly Guid Tables; public static readonly Guid Tables_Info; public static readonly Guid Table_Constraints; public static readonly Guid Table_Privileges; public static readonly Guid Table_Statistics; public static readonly Guid Translations; public static readonly Guid Trustee; public static readonly Guid Usage_Privileges; public static readonly Guid Views; public static readonly Guid View_Column_Usage; public static readonly Guid View_Table_Usage; public OleDbSchemaGuid() { ThrowStub.ThrowNotSupportedException(); } } } namespace System.Data.Odbc { [DefaultEvent("RecordsAffected")] [Designer("Microsoft.VSDesigner.Data.VS.OdbcCommandDesigner, Microsoft.VSDesigner, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] [ToolboxItem(true)] public sealed class OdbcCommand : DbCommand, ICloneable { public override string CommandText { get { ThrowStub.ThrowNotSupportedException(); return null; } set { ThrowStub.ThrowNotSupportedException(); } } public override int CommandTimeout { get { ThrowStub.ThrowNotSupportedException(); return default(int); } set { ThrowStub.ThrowNotSupportedException(); } } public override CommandType CommandType { get { ThrowStub.ThrowNotSupportedException(); return default(CommandType); } set { ThrowStub.ThrowNotSupportedException(); } } public new OdbcConnection Connection { set { ThrowStub.ThrowNotSupportedException(); } } protected override DbConnection DbConnection { get { ThrowStub.ThrowNotSupportedException(); return null; } set { ThrowStub.ThrowNotSupportedException(); } } protected override DbParameterCollection DbParameterCollection { get { ThrowStub.ThrowNotSupportedException(); return null; } } protected override DbTransaction DbTransaction { get { ThrowStub.ThrowNotSupportedException(); return null; } set { ThrowStub.ThrowNotSupportedException(); } } public override bool DesignTimeVisible { get { ThrowStub.ThrowNotSupportedException(); return default(bool); } set { ThrowStub.ThrowNotSupportedException(); } } public new OdbcTransaction Transaction { set { ThrowStub.ThrowNotSupportedException(); } } public override UpdateRowSource UpdatedRowSource { get { ThrowStub.ThrowNotSupportedException(); return default(UpdateRowSource); } set { ThrowStub.ThrowNotSupportedException(); } } public OdbcCommand() { ThrowStub.ThrowNotSupportedException(); } public OdbcCommand(string cmdText) { ThrowStub.ThrowNotSupportedException(); } public OdbcCommand(string cmdText, OdbcConnection connection) { ThrowStub.ThrowNotSupportedException(); } public OdbcCommand(string cmdText, OdbcConnection connection, OdbcTransaction transaction) { ThrowStub.ThrowNotSupportedException(); } public override void Cancel() { ThrowStub.ThrowNotSupportedException(); } protected override DbParameter CreateDbParameter() { ThrowStub.ThrowNotSupportedException(); return null; } protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior) { ThrowStub.ThrowNotSupportedException(); return null; } public override int ExecuteNonQuery() { ThrowStub.ThrowNotSupportedException(); return default(int); } public override object ExecuteScalar() { ThrowStub.ThrowNotSupportedException(); return null; } public override void Prepare() { ThrowStub.ThrowNotSupportedException(); } public void ResetCommandTimeout() { ThrowStub.ThrowNotSupportedException(); } object ICloneable.Clone() { ThrowStub.ThrowNotSupportedException(); return null; } } [DefaultEvent("InfoMessage")] public sealed class OdbcConnection : DbConnection, ICloneable { public override string ConnectionString { get { ThrowStub.ThrowNotSupportedException(); return null; } set { ThrowStub.ThrowNotSupportedException(); } } public new int ConnectionTimeout { set { ThrowStub.ThrowNotSupportedException(); } } public override string Database { get { ThrowStub.ThrowNotSupportedException(); return null; } } public override string DataSource { get { ThrowStub.ThrowNotSupportedException(); return null; } } public string Driver { get { ThrowStub.ThrowNotSupportedException(); return null; } } public override string ServerVersion { get { ThrowStub.ThrowNotSupportedException(); return null; } } public override ConnectionState State { get { ThrowStub.ThrowNotSupportedException(); return default(ConnectionState); } } public event OdbcInfoMessageEventHandler InfoMessage { add { ThrowStub.ThrowNotSupportedException(); } remove { ThrowStub.ThrowNotSupportedException(); } } public OdbcConnection() { ThrowStub.ThrowNotSupportedException(); } public OdbcConnection(string connectionString) { ThrowStub.ThrowNotSupportedException(); } protected override DbTransaction BeginDbTransaction(IsolationLevel isolationLevel) { ThrowStub.ThrowNotSupportedException(); return null; } public override void ChangeDatabase(string value) { ThrowStub.ThrowNotSupportedException(); } public override void Close() { ThrowStub.ThrowNotSupportedException(); } protected override DbCommand CreateDbCommand() { ThrowStub.ThrowNotSupportedException(); return null; } public void EnlistDistributedTransaction(ITransaction transaction) { ThrowStub.ThrowNotSupportedException(); } public override void Open() { ThrowStub.ThrowNotSupportedException(); } public static void ReleaseObjectPool() { ThrowStub.ThrowNotSupportedException(); } object ICloneable.Clone() { ThrowStub.ThrowNotSupportedException(); return null; } } public delegate void OdbcInfoMessageEventHandler(object sender, OdbcInfoMessageEventArgs e); public sealed class OdbcInfoMessageEventArgs : EventArgs { public OdbcErrorCollection Errors { get { ThrowStub.ThrowNotSupportedException(); return null; } } public string Message { get { ThrowStub.ThrowNotSupportedException(); return null; } } internal OdbcInfoMessageEventArgs() { ThrowStub.ThrowNotSupportedException(); } } [Serializable] public sealed class OdbcErrorCollection : ICollection, IEnumerable { public int Count { get { ThrowStub.ThrowNotSupportedException(); return default(int); } } public OdbcError this[int i] { get { ThrowStub.ThrowNotSupportedException(); return null; } } internal OdbcErrorCollection() { ThrowStub.ThrowNotSupportedException(); } [SpecialName] bool ICollection.get_IsSynchronized() { ThrowStub.ThrowNotSupportedException(); return default(bool); } [SpecialName] object ICollection.get_SyncRoot() { ThrowStub.ThrowNotSupportedException(); return null; } public void CopyTo(Array array, int i) { ThrowStub.ThrowNotSupportedException(); } public void CopyTo(OdbcError[] array, int i) { ThrowStub.ThrowNotSupportedException(); } public IEnumerator GetEnumerator() { ThrowStub.ThrowNotSupportedException(); return null; } } [Serializable] public sealed class OdbcError { public string Message { get { ThrowStub.ThrowNotSupportedException(); return null; } } public int NativeError { get { ThrowStub.ThrowNotSupportedException(); return default(int); } } public string Source { get { ThrowStub.ThrowNotSupportedException(); return null; } } public string SQLState { get { ThrowStub.ThrowNotSupportedException(); return null; } } internal OdbcError() { ThrowStub.ThrowNotSupportedException(); } } public sealed class OdbcTransaction : DbTransaction { protected override DbConnection DbConnection { get { ThrowStub.ThrowNotSupportedException(); return null; } } public override IsolationLevel IsolationLevel { get { ThrowStub.ThrowNotSupportedException(); return default(IsolationLevel); } } internal OdbcTransaction() { ThrowStub.ThrowNotSupportedException(); } public override void Commit() { ThrowStub.ThrowNotSupportedException(); } public override void Rollback() { ThrowStub.ThrowNotSupportedException(); } } public sealed class OdbcCommandBuilder : DbCommandBuilder { public new OdbcDataAdapter DataAdapter { set { ThrowStub.ThrowNotSupportedException(); } } public OdbcCommandBuilder() { ThrowStub.ThrowNotSupportedException(); } public OdbcCommandBuilder(OdbcDataAdapter adapter) { ThrowStub.ThrowNotSupportedException(); } protected override void ApplyParameterInfo(DbParameter parameter, DataRow datarow, StatementType statementType, bool whereClause) { ThrowStub.ThrowNotSupportedException(); } public static void DeriveParameters(OdbcCommand command) { ThrowStub.ThrowNotSupportedException(); } protected override string GetParameterName(int parameterOrdinal) { ThrowStub.ThrowNotSupportedException(); return null; } protected override string GetParameterName(string parameterName) { ThrowStub.ThrowNotSupportedException(); return null; } protected override string GetParameterPlaceholder(int parameterOrdinal) { ThrowStub.ThrowNotSupportedException(); return null; } public string QuoteIdentifier(string unquotedIdentifier, OdbcConnection connection) { ThrowStub.ThrowNotSupportedException(); return null; } protected override void SetRowUpdatingHandler(DbDataAdapter adapter) { ThrowStub.ThrowNotSupportedException(); } public string UnquoteIdentifier(string quotedIdentifier, OdbcConnection connection) { ThrowStub.ThrowNotSupportedException(); return null; } } [DefaultEvent("RowUpdated")] [Designer("Microsoft.VSDesigner.Data.VS.OdbcDataAdapterDesigner, Microsoft.VSDesigner, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] [ToolboxItem("Microsoft.VSDesigner.Data.VS.OdbcDataAdapterToolboxItem, Microsoft.VSDesigner, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] public sealed class OdbcDataAdapter : DbDataAdapter { public new OdbcCommand DeleteCommand { set { ThrowStub.ThrowNotSupportedException(); } } public new OdbcCommand InsertCommand { set { ThrowStub.ThrowNotSupportedException(); } } public new OdbcCommand SelectCommand { set { ThrowStub.ThrowNotSupportedException(); } } public new OdbcCommand UpdateCommand { set { ThrowStub.ThrowNotSupportedException(); } } public event OdbcRowUpdatedEventHandler RowUpdated { add { ThrowStub.ThrowNotSupportedException(); } remove { ThrowStub.ThrowNotSupportedException(); } } public event OdbcRowUpdatingEventHandler RowUpdating { add { ThrowStub.ThrowNotSupportedException(); } remove { ThrowStub.ThrowNotSupportedException(); } } public OdbcDataAdapter() { ThrowStub.ThrowNotSupportedException(); } public OdbcDataAdapter(OdbcCommand selectCommand) { ThrowStub.ThrowNotSupportedException(); } public OdbcDataAdapter(string selectCommandText, OdbcConnection selectConnection) { ThrowStub.ThrowNotSupportedException(); } public OdbcDataAdapter(string selectCommandText, string selectConnectionString) { ThrowStub.ThrowNotSupportedException(); } } public delegate void OdbcRowUpdatedEventHandler(object sender, OdbcRowUpdatedEventArgs e); public sealed class OdbcRowUpdatedEventArgs : RowUpdatedEventArgs { public OdbcRowUpdatedEventArgs(DataRow row, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) { ThrowStub.ThrowNotSupportedException(); } } public delegate void OdbcRowUpdatingEventHandler(object sender, OdbcRowUpdatingEventArgs e); public sealed class OdbcRowUpdatingEventArgs : RowUpdatingEventArgs { public new OdbcCommand Command { set { ThrowStub.ThrowNotSupportedException(); } } public OdbcRowUpdatingEventArgs(DataRow row, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) { ThrowStub.ThrowNotSupportedException(); } } [DefaultMember("Item")] [TypeConverter("System.Data.Odbc.OdbcConnectionStringBuilder.OdbcConnectionStringBuilderConverter")] [DefaultProperty("Driver")] public sealed class OdbcConnectionStringBuilder : DbConnectionStringBuilder { public string Driver { get { ThrowStub.ThrowNotSupportedException(); return null; } set { ThrowStub.ThrowNotSupportedException(); } } public string Dsn { get { ThrowStub.ThrowNotSupportedException(); return null; } set { ThrowStub.ThrowNotSupportedException(); } } public OdbcConnectionStringBuilder() { ThrowStub.ThrowNotSupportedException(); } public OdbcConnectionStringBuilder(string connectionString) { ThrowStub.ThrowNotSupportedException(); } } public sealed class OdbcDataReader : DbDataReader { public override int Depth { get { ThrowStub.ThrowNotSupportedException(); return default(int); } } public override int FieldCount { get { ThrowStub.ThrowNotSupportedException(); return default(int); } } public override bool HasRows { get { ThrowStub.ThrowNotSupportedException(); return default(bool); } } public override bool IsClosed { get { ThrowStub.ThrowNotSupportedException(); return default(bool); } } public override object this[string value] { get { ThrowStub.ThrowNotSupportedException(); return null; } } public override int RecordsAffected { get { ThrowStub.ThrowNotSupportedException(); return default(int); } } internal OdbcDataReader() { ThrowStub.ThrowNotSupportedException(); } [SpecialName] public object get_Item(int i) { ThrowStub.ThrowNotSupportedException(); return null; } public override bool GetBoolean(int i) { ThrowStub.ThrowNotSupportedException(); return default(bool); } public override byte GetByte(int i) { ThrowStub.ThrowNotSupportedException(); return default(byte); } public override long GetBytes(int i, long dataIndex, byte[] buffer, int bufferIndex, int length) { ThrowStub.ThrowNotSupportedException(); return default(long); } public override char GetChar(int i) { ThrowStub.ThrowNotSupportedException(); return default(char); } public override long GetChars(int i, long dataIndex, char[] buffer, int bufferIndex, int length) { ThrowStub.ThrowNotSupportedException(); return default(long); } public override string GetDataTypeName(int i) { ThrowStub.ThrowNotSupportedException(); return null; } public DateTime GetDate(int i) { ThrowStub.ThrowNotSupportedException(); return default(DateTime); } public override DateTime GetDateTime(int i) { ThrowStub.ThrowNotSupportedException(); return default(DateTime); } public override decimal GetDecimal(int i) { ThrowStub.ThrowNotSupportedException(); return default(decimal); } public override double GetDouble(int i) { ThrowStub.ThrowNotSupportedException(); return default(double); } public override IEnumerator GetEnumerator() { ThrowStub.ThrowNotSupportedException(); return null; } public override Type GetFieldType(int i) { ThrowStub.ThrowNotSupportedException(); return null; } public override float GetFloat(int i) { ThrowStub.ThrowNotSupportedException(); return default(float); } public override Guid GetGuid(int i) { ThrowStub.ThrowNotSupportedException(); return default(Guid); } public override short GetInt16(int i) { ThrowStub.ThrowNotSupportedException(); return default(short); } public override int GetInt32(int i) { ThrowStub.ThrowNotSupportedException(); return default(int); } public override long GetInt64(int i) { ThrowStub.ThrowNotSupportedException(); return default(long); } public override string GetName(int i) { ThrowStub.ThrowNotSupportedException(); return null; } public override int GetOrdinal(string value) { ThrowStub.ThrowNotSupportedException(); return default(int); } public override string GetString(int i) { ThrowStub.ThrowNotSupportedException(); return null; } public TimeSpan GetTime(int i) { ThrowStub.ThrowNotSupportedException(); return default(TimeSpan); } public override object GetValue(int i) { ThrowStub.ThrowNotSupportedException(); return null; } public override int GetValues(object[] values) { ThrowStub.ThrowNotSupportedException(); return default(int); } public override bool IsDBNull(int i) { ThrowStub.ThrowNotSupportedException(); return default(bool); } public override bool NextResult() { ThrowStub.ThrowNotSupportedException(); return default(bool); } public override bool Read() { ThrowStub.ThrowNotSupportedException(); return default(bool); } } [Serializable] public sealed class OdbcException : DbException { public OdbcErrorCollection Errors { get { ThrowStub.ThrowNotSupportedException(); return null; } } internal OdbcException() { ThrowStub.ThrowNotSupportedException(); } } public sealed class OdbcFactory : DbProviderFactory { public static readonly OdbcFactory Instance; internal OdbcFactory() { ThrowStub.ThrowNotSupportedException(); } } public static class OdbcMetaDataCollectionNames { public static readonly string Columns; public static readonly string Indexes; public static readonly string ProcedureColumns; public static readonly string ProcedureParameters; public static readonly string Procedures; public static readonly string Tables; public static readonly string Views; } public static class OdbcMetaDataColumnNames { public static readonly string BooleanFalseLiteral; public static readonly string BooleanTrueLiteral; public static readonly string SQLType; } [TypeConverter("System.Data.Odbc.OdbcParameter.OdbcParameterConverter")] public sealed class OdbcParameter : DbParameter, ICloneable { public override DbType DbType { get { ThrowStub.ThrowNotSupportedException(); return default(DbType); } set { ThrowStub.ThrowNotSupportedException(); } } public override ParameterDirection Direction { get { ThrowStub.ThrowNotSupportedException(); return default(ParameterDirection); } set { ThrowStub.ThrowNotSupportedException(); } } public override bool IsNullable { get { ThrowStub.ThrowNotSupportedException(); return default(bool); } set { ThrowStub.ThrowNotSupportedException(); } } public OdbcType OdbcType { get { ThrowStub.ThrowNotSupportedException(); return default(OdbcType); } set { ThrowStub.ThrowNotSupportedException(); } } public override string ParameterName { get { ThrowStub.ThrowNotSupportedException(); return null; } set { ThrowStub.ThrowNotSupportedException(); } } public override int Size { get { ThrowStub.ThrowNotSupportedException(); return default(int); } set { ThrowStub.ThrowNotSupportedException(); } } public override string SourceColumn { get { ThrowStub.ThrowNotSupportedException(); return null; } set { ThrowStub.ThrowNotSupportedException(); } } public override bool SourceColumnNullMapping { get { ThrowStub.ThrowNotSupportedException(); return default(bool); } set { ThrowStub.ThrowNotSupportedException(); } } public override object Value { get { ThrowStub.ThrowNotSupportedException(); return null; } set { ThrowStub.ThrowNotSupportedException(); } } public OdbcParameter() { ThrowStub.ThrowNotSupportedException(); } public OdbcParameter(string name, OdbcType type) { ThrowStub.ThrowNotSupportedException(); } public OdbcParameter(string name, OdbcType type, int size) { ThrowStub.ThrowNotSupportedException(); } [EditorBrowsable(EditorBrowsableState.Advanced)] public OdbcParameter(string parameterName, OdbcType odbcType, int size, ParameterDirection parameterDirection, bool isNullable, byte precision, byte scale, string srcColumn, DataRowVersion srcVersion, object value) { ThrowStub.ThrowNotSupportedException(); } [EditorBrowsable(EditorBrowsableState.Advanced)] public OdbcParameter(string parameterName, OdbcType odbcType, int size, ParameterDirection parameterDirection, byte precision, byte scale, string sourceColumn, DataRowVersion sourceVersion, bool sourceColumnNullMapping, object value) { ThrowStub.ThrowNotSupportedException(); } public OdbcParameter(string name, OdbcType type, int size, string sourcecolumn) { ThrowStub.ThrowNotSupportedException(); } public OdbcParameter(string name, object value) { ThrowStub.ThrowNotSupportedException(); } public override void ResetDbType() { ThrowStub.ThrowNotSupportedException(); } public void ResetOdbcType() { ThrowStub.ThrowNotSupportedException(); } object ICloneable.Clone() { ThrowStub.ThrowNotSupportedException(); return null; } } public enum OdbcType { BigInt = 1, Binary = 2, Bit = 3, Char = 4, Date = 23, DateTime = 5, Decimal = 6, Double = 8, Image = 9, Int = 10, NChar = 11, NText = 12, Numeric = 7, NVarChar = 13, Real = 14, SmallDateTime = 16, SmallInt = 17, Text = 18, Time = 24, Timestamp = 19, TinyInt = 20, UniqueIdentifier = 15, VarBinary = 21, VarChar = 22 } [Editor("Microsoft.VSDesigner.Data.Design.DBParametersEditor, Microsoft.VSDesigner, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] [ListBindable(false)] public sealed class OdbcParameterCollection : DbParameterCollection { public override int Count { get { ThrowStub.ThrowNotSupportedException(); return default(int); } } public new string this[string parameterName] { set { ThrowStub.ThrowNotSupportedException(); } } public override object SyncRoot { get { ThrowStub.ThrowNotSupportedException(); return null; } } internal OdbcParameterCollection() { ThrowStub.ThrowNotSupportedException(); } [SpecialName] public void set_Item(int index, OdbcParameter value) { ThrowStub.ThrowNotSupportedException(); } public OdbcParameter Add(OdbcParameter value) { ThrowStub.ThrowNotSupportedException(); return null; } [EditorBrowsable(EditorBrowsableState.Never)] public override int Add(object value) { ThrowStub.ThrowNotSupportedException(); return default(int); } public OdbcParameter Add(string parameterName, OdbcType odbcType) { ThrowStub.ThrowNotSupportedException(); return null; } public OdbcParameter Add(string parameterName, OdbcType odbcType, int size) { ThrowStub.ThrowNotSupportedException(); return null; } public OdbcParameter Add(string parameterName, OdbcType odbcType, int size, string sourceColumn) { ThrowStub.ThrowNotSupportedException(); return null; } [EditorBrowsable(EditorBrowsableState.Never)] [Obsolete("Add(String parameterName, Object value) has been deprecated. Use AddWithValue(String parameterName, Object value). http://go.microsoft.com/fwlink/?linkid=14202", false)] public OdbcParameter Add(string parameterName, object value) { ThrowStub.ThrowNotSupportedException(); return null; } public override void AddRange(Array values) { ThrowStub.ThrowNotSupportedException(); } public void AddRange(OdbcParameter[] values) { ThrowStub.ThrowNotSupportedException(); } public OdbcParameter AddWithValue(string parameterName, object value) { ThrowStub.ThrowNotSupportedException(); return null; } public override void Clear() { ThrowStub.ThrowNotSupportedException(); } public bool Contains(OdbcParameter value) { ThrowStub.ThrowNotSupportedException(); return default(bool); } public override bool Contains(object value) { ThrowStub.ThrowNotSupportedException(); return default(bool); } public override bool Contains(string value) { ThrowStub.ThrowNotSupportedException(); return default(bool); } public override void CopyTo(Array array, int index) { ThrowStub.ThrowNotSupportedException(); } public void CopyTo(OdbcParameter[] array, int index) { ThrowStub.ThrowNotSupportedException(); } public override IEnumerator GetEnumerator() { ThrowStub.ThrowNotSupportedException(); return null; } protected override DbParameter GetParameter(int index) { ThrowStub.ThrowNotSupportedException(); return null; } protected override DbParameter GetParameter(string parameterName) { ThrowStub.ThrowNotSupportedException(); return null; } public int IndexOf(OdbcParameter value) { ThrowStub.ThrowNotSupportedException(); return default(int); } public override int IndexOf(object value) { ThrowStub.ThrowNotSupportedException(); return default(int); } public override int IndexOf(string parameterName) { ThrowStub.ThrowNotSupportedException(); return default(int); } public void Insert(int index, OdbcParameter value) { ThrowStub.ThrowNotSupportedException(); } public override void Insert(int index, object value) { ThrowStub.ThrowNotSupportedException(); } public void Remove(OdbcParameter value) { ThrowStub.ThrowNotSupportedException(); } public override void Remove(object value) { ThrowStub.ThrowNotSupportedException(); } public override void RemoveAt(int index) { ThrowStub.ThrowNotSupportedException(); } public override void RemoveAt(string parameterName) { ThrowStub.ThrowNotSupportedException(); } protected override void SetParameter(int index, DbParameter value) { ThrowStub.ThrowNotSupportedException(); } protected override void SetParameter(string parameterName, DbParameter value) { ThrowStub.ThrowNotSupportedException(); } } [Serializable] public sealed class OdbcPermission : DBDataPermission { [Obsolete("OdbcPermission() has been deprecated. Use the OdbcPermission(PermissionState.None) constructor. http://go.microsoft.com/fwlink/?linkid=14202", true)] public OdbcPermission() { ThrowStub.ThrowNotSupportedException(); } public OdbcPermission(PermissionState state) { ThrowStub.ThrowNotSupportedException(); } [Obsolete("OdbcPermission(PermissionState state, Boolean allowBlankPassword) has been deprecated. Use the OdbcPermission(PermissionState.None) constructor. http://go.microsoft.com/fwlink/?linkid=14202", true)] public OdbcPermission(PermissionState state, bool allowBlankPassword) { ThrowStub.ThrowNotSupportedException(); } } [Serializable] [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Constructor | AttributeTargets.Method, AllowMultiple = true, Inherited = false)] public sealed class OdbcPermissionAttribute : DBDataPermissionAttribute { public OdbcPermissionAttribute(SecurityAction action) { } public override IPermission CreatePermission() { ThrowStub.ThrowNotSupportedException(); return null; } } } namespace System.Data.Common { public class DbProviderConfigurationHandler : IConfigurationSectionHandler { public DbProviderConfigurationHandler() { ThrowStub.ThrowNotSupportedException(); } public virtual object Create(object parent, object configContext, XmlNode section) { ThrowStub.ThrowNotSupportedException(); return null; } } public static class DbProviderFactories { public static DbProviderFactory GetFactory(DbConnection connection) { ThrowStub.ThrowNotSupportedException(); return null; } public static DbProviderFactory GetFactory(DataRow providerRow) { ThrowStub.ThrowNotSupportedException(); return null; } public static DbProviderFactory GetFactory(string providerInvariantName) { ThrowStub.ThrowNotSupportedException(); return null; } public static DataTable GetFactoryClasses() { ThrowStub.ThrowNotSupportedException(); return null; } } public class DbProviderFactoriesConfigurationHandler : IConfigurationSectionHandler { public DbProviderFactoriesConfigurationHandler() { ThrowStub.ThrowNotSupportedException(); } public virtual object Create(object parent, object configContext, XmlNode section) { ThrowStub.ThrowNotSupportedException(); return null; } } } namespace Microsoft.SqlServer.Server { public sealed class SqlContext { public static bool IsAvailable { get { ThrowStub.ThrowNotSupportedException(); return default(bool); } } public static SqlPipe Pipe { get { ThrowStub.ThrowNotSupportedException(); return null; } } public static SqlTriggerContext TriggerContext { get { ThrowStub.ThrowNotSupportedException(); return null; } } public static WindowsIdentity WindowsIdentity { get { ThrowStub.ThrowNotSupportedException(); return null; } } internal SqlContext() { ThrowStub.ThrowNotSupportedException(); } } public sealed class SqlPipe { public bool IsSendingResults { get { ThrowStub.ThrowNotSupportedException(); return default(bool); } } internal SqlPipe() { ThrowStub.ThrowNotSupportedException(); } public void ExecuteAndSend(SqlCommand command) { ThrowStub.ThrowNotSupportedException(); } public void Send(SqlDataRecord record) { ThrowStub.ThrowNotSupportedException(); } public void Send(SqlDataReader reader) { ThrowStub.ThrowNotSupportedException(); } public void Send(string message) { ThrowStub.ThrowNotSupportedException(); } public void SendResultsEnd() { ThrowStub.ThrowNotSupportedException(); } public void SendResultsRow(SqlDataRecord record) { ThrowStub.ThrowNotSupportedException(); } public void SendResultsStart(SqlDataRecord record) { ThrowStub.ThrowNotSupportedException(); } } } namespace Unity { internal sealed class ThrowStub : ObjectDisposedException { public static void ThrowNotSupportedException() { throw new PlatformNotSupportedException(); } } }