2 // System.Data.OracleClient.OracleConnection
\r
5 // Konstantin Triger <kostat@mainsoft.com>
6 // Boris Kirzner <borisk@mainsoft.com>
8 // (C) 2005 Mainsoft Corporation (http://www.mainsoft.com)
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35 using System.Data.Common;
\r
36 using System.Data.ProviderBase;
\r
37 using System.Collections;
\r
41 namespace System.Data.OracleClient {
\r
42 public sealed class OracleConnection : AbstractDBConnection, System.ICloneable {
\r
45 static readonly Hashtable _skippedUserParameters = new Hashtable(new CaseInsensitiveHashCodeProvider(),new CaseInsensitiveComparer());
\r
47 private static readonly object _lockObjectStringManager = new object();
\r
48 //private static DbStringManager _stringManager = new DbStringManager("System.Data.System.Data.ProviderBase.jvm.OracleStrings");
\r
50 private static readonly string[] _resourceIgnoredKeys = new string[] {"CON_PROVIDER","CON_DATA_SOURCE","CON_DATABASE",
\r
51 "CON_PASSWORD","CON_USER_ID","CON_TIMEOUT",
\r
52 "CON_SERVER_NAME","CON_PORT","CON_SERVICE_NAME",
\r
53 "CON_JNDI_NAME","CON_JNDI_PROVIDER","CON_JNDI_FACTORY",
\r
54 "JDBC_DRIVER","JDBC_URL","DB2_CON_LOCATION" };
\r
60 public event OracleInfoMessageEventHandler InfoMessage;
\r
61 public event StateChangeEventHandler StateChange;
\r
63 #endregion // Events
\r
65 #region Constructors
\r
67 public OracleConnection() : this(null) {
\r
70 public OracleConnection(String connectionString) : base(connectionString) {
\r
73 #endregion // Constructors
\r
77 protected override string[] ResourceIgnoredKeys {
\r
78 get { return _resourceIgnoredKeys; }
\r
81 public String Provider {
\r
82 get { return ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("CON_PROVIDER")); }
\r
85 protected override Hashtable SkippedUserParameters {
\r
86 get { return _skippedUserParameters; }
\r
89 protected override string ServerName {
\r
91 if (ProviderType == PROVIDER_TYPE.IBMDADB2 || ProviderType == PROVIDER_TYPE.MSDAORA) {
\r
92 string host = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("CON_SERVER_NAME"));
\r
94 if (!String.Empty.Equals(host)) {
\r
98 if (ProviderType == PROVIDER_TYPE.IBMDADB2) {
\r
99 string location = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("DB2_CON_LOCATION"));
\r
101 if (!String.Empty.Equals(location)) {
\r
102 int semicolumnIndex = location.IndexOf(':');
\r
103 if (semicolumnIndex != -1) {
\r
104 return location.Substring(0,semicolumnIndex);
\r
113 return base.ServerName;
\r
117 protected override string CatalogName {
\r
119 switch (ProviderType) {
\r
120 case PROVIDER_TYPE.IBMDADB2:
\r
121 case PROVIDER_TYPE.MSDAORA:
\r
124 return base.CatalogName;
\r
128 protected override string Port {
\r
130 string port = ConnectionStringHelper.FindValue(UserParameters, StringManager.GetStringArray("CON_PORT"));
\r
131 switch (ProviderType) {
\r
132 case PROVIDER_TYPE.MSDAORA :
\r
133 if (String.Empty.Equals(port)) {
\r
134 return StringManager.GetString("ORA_CON_PORT");
\r
137 case PROVIDER_TYPE.IBMDADB2 :
\r
138 if (String.Empty.Equals(port)) {
\r
139 string location = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("DB2_CON_LOCATION"));
\r
141 if (!String.Empty.Equals(location)) {
\r
142 int semicolumnIndex = location.IndexOf(':');
\r
143 if (semicolumnIndex != -1) {
\r
144 return location.Substring(semicolumnIndex + 1);
\r
147 return StringManager.GetString("DB2_CON_PORT");
\r
155 protected override string JdbcDriverName {
\r
157 JDBC_MODE jdbcMode = JdbcMode;
\r
158 switch (jdbcMode) {
\r
159 case JDBC_MODE.DATA_SOURCE_MODE :
\r
160 return base.JdbcDriverName;
\r
161 case JDBC_MODE.JDBC_DRIVER_MODE :
\r
162 return ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("JDBC_DRIVER"));
\r
163 case JDBC_MODE.PROVIDER_MODE:
\r
164 switch (ProviderType) {
\r
165 case PROVIDER_TYPE.SQLOLEDB :
\r
166 return StringManager.GetString("SQL_JDBC_DRIVER");
\r
167 case PROVIDER_TYPE.MSDAORA :
\r
168 return StringManager.GetString("ORA_JDBC_DRIVER");
\r
169 case PROVIDER_TYPE.IBMDADB2 :
\r
170 return StringManager.GetString("DB2_JDBC_DRIVER");
\r
174 return base.JdbcDriverName;
\r
178 protected override DbStringManager StringManager {
\r
180 object stringManager = AppDomain.CurrentDomain.GetData("System.Data.OracleConnection.stringManager");
\r
181 if (stringManager == null) {
\r
182 lock(_lockObjectStringManager) {
\r
183 stringManager = AppDomain.CurrentDomain.GetData("System.Data.OracleConnection.stringManager");
\r
184 if (stringManager != null)
\r
185 return (DbStringManager)stringManager;
\r
186 stringManager = new DbStringManager("System.Data.System.Data.ProviderBase.jvm.OracleStrings");
\r
187 AppDomain.CurrentDomain.SetData("System.Data.OracleConnection.stringManager", stringManager);
\r
190 return (DbStringManager)stringManager;
\r
194 #endregion // Properties
\r
198 public new OracleTransaction BeginTransaction(IsolationLevel level) {
\r
199 return new OracleTransaction(level, this);
\r
202 public new OracleTransaction BeginTransaction() {
\r
203 return BeginTransaction(IsolationLevel.ReadCommitted);
\r
206 public new OracleCommand CreateCommand() {
\r
207 return new OracleCommand(this);
\r
210 protected override DbTransaction BeginDbTransaction(IsolationLevel isolationLevel) {
\r
211 return BeginTransaction();
\r
214 protected override DbCommand CreateDbCommand() {
\r
215 return CreateCommand();
\r
219 protected override void CopyTo(AbstractDBConnection target) {
\r
220 base.CopyTo(target);
\r
223 public object Clone() {
\r
224 OracleConnection clone = new OracleConnection();
\r
229 protected sealed override SystemException CreateException(SQLException e) {
\r
230 return new OracleException(e,this);
\r
233 protected sealed override SystemException CreateException(string message) {
\r
234 return new OracleException(message, null, this);
\r
237 public DataTable GetOracleSchemaTable (Guid schema, object[] restrictions) {
\r
238 DataTable schemaTable = new DataTable("Tables");
\r
239 schemaTable.Columns.Add("TABLE_CATALOG");
\r
240 schemaTable.Columns.Add("TABLE_SCHEMA");
\r
241 schemaTable.Columns.Add("TABLE_NAME");
\r
242 schemaTable.Columns.Add("TABLE_TYPE");
\r
243 schemaTable.Columns.Add("TABLE_GUID");
\r
244 schemaTable.Columns.Add("DESCRIPTION");
\r
245 schemaTable.Columns.Add("TABLE_PROPID");
\r
246 schemaTable.Columns.Add("DATE_CREATED");
\r
247 schemaTable.Columns.Add("DATE_MODIFIED");
\r
250 Connection con = JdbcConnection;
\r
251 String catalog = con.getCatalog();
\r
253 DatabaseMetaData meta = con.getMetaData();
\r
254 ResultSet schemaRes = meta.getSchemas();
\r
255 System.Collections.ArrayList schemas = new System.Collections.ArrayList();
\r
256 while(schemaRes.next()) {
\r
257 schemas.Add(schemaRes.getString(1));
\r
261 for(int i = 0; i < schemas.Count; i++) {
\r
262 ResultSet tableRes = meta.getTables(catalog, schemas[i].ToString(), null, null);
\r
263 while(tableRes.next()) {
\r
264 DataRow row = schemaTable.NewRow();
\r
265 row["TABLE_CATALOG"] = catalog;
\r
266 row["TABLE_SCHEMA"] = schemas[i];
\r
267 row["TABLE_NAME"] = tableRes.getString("TABLE_NAME");
\r
268 row["TABLE_TYPE"] = tableRes.getString("TABLE_TYPE");
\r
269 row["DESCRIPTION"] = tableRes.getString("REMARKS");
\r
271 schemaTable.Rows.Add(row);
\r
275 return schemaTable;
\r
278 protected override void ValidateConnectionString(string connectionString) {
\r
279 base.ValidateConnectionString(connectionString);
\r
282 protected override string BuildJdbcUrl() {
\r
283 return base.BuildJdbcUrl();
\r
286 public static void ReleaseObjectPool() {
\r
287 // since we're using connection pool from app servet, this is by design
\r
288 //throw new NotImplementedException();
\r
291 protected sealed override void OnSqlWarning(SQLWarning warning) {
\r
292 OracleErrorCollection col = new OracleErrorCollection(warning, this);
\r
293 OnOracleInfoMessage(new OracleInfoMessageEventArgs(col));
\r
296 // protected sealed override Connection GetConnectionFromProvider() {
\r
297 // if ((ProviderType == PROVIDER_TYPE.MSDAORA) &&
\r
298 // ("true").Equals(StringManager.GetString("ORA_CONNECTION_POOLING_ENABLED","false"))) {
\r
299 // ActivateJdbcDriver(JdbcDriverName);
\r
300 // return OracleConnectionFactory.GetConnection(ProviderType,JdbcUrl,User,Password,ConnectionTimeout);
\r
303 // return base.GetConnectionFromProvider();
\r
308 private String BuildDb2Url() {
\r
309 return StringManager.GetString("DB2_JDBC_URL") //jdbc:db2://
\r
310 + ServerName + ":" + Port + "/" + CatalogName;
\r
313 private String BuildOracleUrl() {
\r
314 return StringManager.GetString("ORA_JDBC_URL") //"jdbc:oracle:thin:@"
\r
315 + ServerName + ":" + Port + ":" + CatalogName;
\r
318 protected sealed override void OnStateChanged(ConnectionState orig, ConnectionState current) {
\r
319 if(StateChange != null) {
\r
320 StateChange(this, new StateChangeEventArgs(orig, current));
\r
324 public override void Close() {
\r
325 ConnectionState orig = State;
\r
327 ConnectionState current = State;
\r
328 if(current != orig) {
\r
329 OnStateChanged(orig, current);
\r
333 private void OnOracleInfoMessage (OracleInfoMessageEventArgs value) {
334 if (InfoMessage != null) {
335 InfoMessage (this, value);
339 #endregion // Methods
\r