1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4 
5 using System.ComponentModel;
6 using System.Threading;
7 using System.Threading.Tasks;
8 
9 namespace System.Data.Common
10 {
11     public abstract partial class DbConnection : Component, IDbConnection
12     {
13 #pragma warning disable 649 // ignore unassigned field warning
14         internal bool _suppressStateChangeForReconnection;
15 #pragma warning restore 649
16 
DbConnection()17         protected DbConnection() : base()
18         {
19         }
20 
21         [DefaultValue("")]
22         [SettingsBindableAttribute(true)]
23         [RefreshProperties(RefreshProperties.All)]
24 #pragma warning disable 618 // ignore obsolete warning about RecommendedAsConfigurable to use SettingsBindableAttribute
25         [RecommendedAsConfigurable(true)]
26 #pragma warning restore 618
27         public abstract string ConnectionString { get; set; }
28 
29         public virtual int ConnectionTimeout => ADP.DefaultConnectionTimeout;
30 
31         public abstract string Database { get; }
32 
33         public abstract string DataSource { get; }
34 
35         /// <summary>
36         /// The associated provider factory for derived class.
37         /// </summary>
38         protected virtual DbProviderFactory DbProviderFactory => null;
39 
40         internal DbProviderFactory ProviderFactory => DbProviderFactory;
41 
42         [Browsable(false)]
43         public abstract string ServerVersion { get; }
44 
45         [Browsable(false)]
46         public abstract ConnectionState State { get; }
47 
48         public virtual event StateChangeEventHandler StateChange;
49 
BeginDbTransaction(IsolationLevel isolationLevel)50         protected abstract DbTransaction BeginDbTransaction(IsolationLevel isolationLevel);
51 
BeginTransaction()52         public DbTransaction BeginTransaction() =>
53             BeginDbTransaction(IsolationLevel.Unspecified);
54 
BeginTransaction(IsolationLevel isolationLevel)55         public DbTransaction BeginTransaction(IsolationLevel isolationLevel)
56         {
57             return BeginDbTransaction(isolationLevel);
58         }
59 
IDbConnection.BeginTransaction()60         IDbTransaction IDbConnection.BeginTransaction() =>
61             BeginDbTransaction(IsolationLevel.Unspecified);
62 
63         IDbTransaction IDbConnection.BeginTransaction(IsolationLevel isolationLevel) =>
64             BeginDbTransaction(isolationLevel);
65 
Close()66         public abstract void Close();
67 
ChangeDatabase(string databaseName)68         public abstract void ChangeDatabase(string databaseName);
69 
CreateCommand()70         public DbCommand CreateCommand() => CreateDbCommand();
71 
IDbConnection.CreateCommand()72         IDbCommand IDbConnection.CreateCommand() => CreateDbCommand();
73 
CreateDbCommand()74         protected abstract DbCommand CreateDbCommand();
75 
EnlistTransaction(System.Transactions.Transaction transaction)76         public virtual void EnlistTransaction(System.Transactions.Transaction transaction)
77         {
78             throw ADP.NotSupported();
79         }
80 
81         // these need to be here so that GetSchema is visible when programming to a dbConnection object.
82         // they are overridden by the real implementations in DbConnectionBase
GetSchema()83         public virtual DataTable GetSchema()
84         {
85             throw ADP.NotSupported();
86         }
87 
GetSchema(string collectionName)88         public virtual DataTable GetSchema(string collectionName)
89         {
90             throw ADP.NotSupported();
91         }
92 
GetSchema(string collectionName, string[] restrictionValues)93         public virtual DataTable GetSchema(string collectionName, string[] restrictionValues)
94         {
95             throw ADP.NotSupported();
96         }
97 
OnStateChange(StateChangeEventArgs stateChange)98         protected virtual void OnStateChange(StateChangeEventArgs stateChange)
99         {
100             if (_suppressStateChangeForReconnection)
101             {
102                 return;
103             }
104 
105             StateChange?.Invoke(this, stateChange);
106         }
107 
Open()108         public abstract void Open();
109 
OpenAsync()110         public Task OpenAsync() => OpenAsync(CancellationToken.None);
111 
OpenAsync(CancellationToken cancellationToken)112         public virtual Task OpenAsync(CancellationToken cancellationToken)
113         {
114             if (cancellationToken.IsCancellationRequested)
115             {
116                 return Task.FromCanceled(cancellationToken);
117             }
118             else
119             {
120                 try
121                 {
122                     Open();
123                     return Task.CompletedTask;
124                 }
125                 catch (Exception e)
126                 {
127                     return Task.FromException(e);
128                 }
129             }
130         }
131     }
132 }
133