0
|
1 using System;
|
|
2 using System.Data;
|
|
3 using System.Text;
|
|
4
|
|
5 namespace BLToolkit.Data.Linq
|
|
6 {
|
|
7 using Data.Sql.SqlProvider;
|
|
8 using DataProvider;
|
|
9 using Mapping;
|
|
10
|
|
11 public class DataContext : IDataContext
|
|
12 {
|
|
13 public DataContext() : this(DbManager.DefaultConfiguration)
|
|
14 {
|
|
15 }
|
|
16
|
|
17 public DataContext(string configurationString)
|
|
18 {
|
|
19 ConfigurationString = configurationString;
|
|
20 DataProvider = DbManager.GetDataProvider(configurationString);
|
|
21 ContextID = DataProvider.Name;
|
|
22
|
|
23 MappingSchema = DataProvider.MappingSchema ?? Map.DefaultSchema;
|
|
24 }
|
|
25
|
|
26 public string ConfigurationString { get; private set; }
|
|
27 public DataProviderBase DataProvider { get; private set; }
|
|
28 public string ContextID { get; set; }
|
|
29 public MappingSchema MappingSchema { get; set; }
|
|
30 public string LastQuery { get; set; }
|
|
31
|
|
32 private bool _keepConnectionAlive;
|
|
33 public bool KeepConnectionAlive
|
|
34 {
|
|
35 get { return _keepConnectionAlive; }
|
|
36 set
|
|
37 {
|
|
38 _keepConnectionAlive = value;
|
|
39
|
|
40 if (value == false)
|
|
41 ReleaseQuery();
|
|
42 }
|
|
43 }
|
|
44
|
|
45 private bool? _isMarsEnabled;
|
|
46 public bool IsMarsEnabled
|
|
47 {
|
|
48 get
|
|
49 {
|
|
50 if (_isMarsEnabled == null)
|
|
51 {
|
|
52 if (_dbManager == null)
|
|
53 return false;
|
|
54 _isMarsEnabled = _dbManager.IsMarsEnabled;
|
|
55 }
|
|
56
|
|
57 return _isMarsEnabled.Value;
|
|
58 }
|
|
59 set { _isMarsEnabled = value; }
|
|
60 }
|
|
61
|
|
62 internal int LockDbManagerCounter;
|
|
63
|
|
64 string _connectionString;
|
|
65 DbManager _dbManager;
|
|
66
|
|
67 internal DbManager GetDBManager()
|
|
68 {
|
|
69 if (_dbManager == null)
|
|
70 {
|
|
71 if (_connectionString == null)
|
|
72 _connectionString = DbManager.GetConnectionString(ConfigurationString);
|
|
73
|
|
74 _dbManager = new DbManager(DataProvider, _connectionString) { MappingSchema = MappingSchema };
|
|
75 }
|
|
76
|
|
77 return _dbManager;
|
|
78 }
|
|
79
|
|
80 internal void ReleaseQuery()
|
|
81 {
|
|
82 LastQuery = _dbManager.LastQuery;
|
|
83
|
|
84 if (_dbManager != null && LockDbManagerCounter == 0 && KeepConnectionAlive == false)
|
|
85 {
|
|
86 _dbManager.Dispose();
|
|
87 _dbManager = null;
|
|
88 }
|
|
89 }
|
|
90
|
|
91 Func<ISqlProvider> IDataContext.CreateSqlProvider
|
|
92 {
|
|
93 get { return DataProvider.CreateSqlProvider; }
|
|
94 }
|
|
95
|
|
96 object IDataContext.SetQuery(IQueryContext queryContext)
|
|
97 {
|
|
98 var ctx = GetDBManager() as IDataContext;
|
|
99 return ctx.SetQuery(queryContext);
|
|
100 }
|
|
101
|
|
102 int IDataContext.ExecuteNonQuery(object query)
|
|
103 {
|
|
104 var ctx = GetDBManager() as IDataContext;
|
|
105 return ctx.ExecuteNonQuery(query);
|
|
106 }
|
|
107
|
|
108 object IDataContext.ExecuteScalar(object query)
|
|
109 {
|
|
110 var ctx = GetDBManager() as IDataContext;
|
|
111 return ctx.ExecuteScalar(query);
|
|
112 }
|
|
113
|
|
114 IDataReader IDataContext.ExecuteReader(object query)
|
|
115 {
|
|
116 var ctx = GetDBManager() as IDataContext;
|
|
117 return ctx.ExecuteReader(query);
|
|
118 }
|
|
119
|
|
120 void IDataContext.ReleaseQuery(object query)
|
|
121 {
|
|
122 ReleaseQuery();
|
|
123 }
|
|
124
|
|
125 string IDataContext.GetSqlText(object query)
|
|
126 {
|
|
127 if (_dbManager != null)
|
|
128 return ((IDataContext)_dbManager).GetSqlText(query);
|
|
129
|
|
130 var ctx = GetDBManager() as IDataContext;
|
|
131 var str = ctx.GetSqlText(query);
|
|
132
|
|
133 ReleaseQuery();
|
|
134
|
|
135 return str;
|
|
136 }
|
|
137
|
|
138 DataContext(int n) {}
|
|
139
|
|
140 IDataContext IDataContext.Clone(bool forNestedQuery)
|
|
141 {
|
|
142 var dc = new DataContext(0)
|
|
143 {
|
|
144 ConfigurationString = ConfigurationString,
|
|
145 KeepConnectionAlive = KeepConnectionAlive,
|
|
146 DataProvider = DataProvider,
|
|
147 ContextID = ContextID,
|
|
148 MappingSchema = MappingSchema,
|
|
149 };
|
|
150
|
|
151 if (forNestedQuery && _dbManager != null && _dbManager.IsMarsEnabled)
|
|
152 dc._dbManager = _dbManager.Transaction != null ?
|
|
153 new DbManager(DataProvider, _dbManager.Transaction) { MappingSchema = MappingSchema } :
|
|
154 new DbManager(DataProvider, _dbManager.Connection) { MappingSchema = MappingSchema };
|
|
155
|
|
156 return dc;
|
|
157 }
|
|
158
|
|
159 public event EventHandler OnClosing;
|
|
160
|
|
161 void IDisposable.Dispose()
|
|
162 {
|
|
163 if (_dbManager != null)
|
|
164 {
|
|
165 if (OnClosing != null)
|
|
166 OnClosing(this, EventArgs.Empty);
|
|
167
|
|
168 _dbManager.Dispose();
|
|
169 _dbManager = null;
|
|
170 }
|
|
171 }
|
|
172 }
|
|
173 }
|