2
0

OracleConnection.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. //
  2. // System.Data.OracleClient.OracleConnection
  3. //
  4. // Authors:
  5. // Konstantin Triger <[email protected]>
  6. // Boris Kirzner <[email protected]>
  7. //
  8. // (C) 2005 Mainsoft Corporation (http://www.mainsoft.com)
  9. //
  10. //
  11. // Permission is hereby granted, free of charge, to any person obtaining
  12. // a copy of this software and associated documentation files (the
  13. // "Software"), to deal in the Software without restriction, including
  14. // without limitation the rights to use, copy, modify, merge, publish,
  15. // distribute, sublicense, and/or sell copies of the Software, and to
  16. // permit persons to whom the Software is furnished to do so, subject to
  17. // the following conditions:
  18. //
  19. // The above copyright notice and this permission notice shall be
  20. // included in all copies or substantial portions of the Software.
  21. //
  22. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  23. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  24. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  25. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  26. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  27. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  28. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  29. //
  30. using System.Data;
  31. using System.Data.Common;
  32. using System.Data.ProviderBase;
  33. using System.Collections;
  34. using java.sql;
  35. namespace System.Data.OracleClient {
  36. public sealed class OracleConnection : AbstractDBConnection, System.ICloneable {
  37. #region Fields
  38. static readonly Hashtable _skippedUserParameters = new Hashtable(new CaseInsensitiveHashCodeProvider(),new CaseInsensitiveComparer());
  39. private static readonly object _lockObjectStringManager = new object();
  40. //private static DbStringManager _stringManager = new DbStringManager("System.Data.System.Data.ProviderBase.jvm.OracleStrings");
  41. private static readonly string[] _resourceIgnoredKeys = new string[] {"CON_PROVIDER","CON_DATA_SOURCE","CON_DATABASE",
  42. "CON_PASSWORD","CON_USER_ID","CON_TIMEOUT",
  43. "CON_SERVER_NAME","CON_PORT","CON_SERVICE_NAME",
  44. "CON_JNDI_NAME","CON_JNDI_PROVIDER","CON_JNDI_FACTORY",
  45. "JDBC_DRIVER","JDBC_URL","DB2_CON_LOCATION" };
  46. #endregion //Fields
  47. #region Events
  48. public event OracleInfoMessageEventHandler InfoMessage;
  49. public event StateChangeEventHandler StateChange;
  50. #endregion // Events
  51. #region Constructors
  52. public OracleConnection() : this(null) {
  53. }
  54. public OracleConnection(String connectionString) : base(connectionString) {
  55. }
  56. #endregion // Constructors
  57. #region Properties
  58. protected override string[] ResourceIgnoredKeys {
  59. get { return _resourceIgnoredKeys; }
  60. }
  61. public String Provider {
  62. get { return ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("CON_PROVIDER")); }
  63. }
  64. protected override Hashtable SkippedUserParameters {
  65. get { return _skippedUserParameters; }
  66. }
  67. protected override string ServerName {
  68. get {
  69. if (ProviderType == PROVIDER_TYPE.IBMDADB2 || ProviderType == PROVIDER_TYPE.MSDAORA) {
  70. string host = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("CON_SERVER_NAME"));
  71. if (!String.Empty.Equals(host)) {
  72. return host;
  73. }
  74. if (ProviderType == PROVIDER_TYPE.IBMDADB2) {
  75. string location = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("DB2_CON_LOCATION"));
  76. if (!String.Empty.Equals(location)) {
  77. int semicolumnIndex = location.IndexOf(':');
  78. if (semicolumnIndex != -1) {
  79. return location.Substring(0,semicolumnIndex);
  80. }
  81. else {
  82. return location;
  83. }
  84. }
  85. }
  86. }
  87. return base.ServerName;
  88. }
  89. }
  90. protected override string CatalogName {
  91. get {
  92. switch (ProviderType) {
  93. case PROVIDER_TYPE.IBMDADB2:
  94. case PROVIDER_TYPE.MSDAORA:
  95. return DataSource;
  96. }
  97. return base.CatalogName;
  98. }
  99. }
  100. protected override string Port {
  101. get {
  102. string port = ConnectionStringHelper.FindValue(UserParameters, StringManager.GetStringArray("CON_PORT"));
  103. switch (ProviderType) {
  104. case PROVIDER_TYPE.MSDAORA :
  105. if (String.Empty.Equals(port)) {
  106. return StringManager.GetString("ORA_CON_PORT");
  107. }
  108. return port;
  109. case PROVIDER_TYPE.IBMDADB2 :
  110. if (String.Empty.Equals(port)) {
  111. string location = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("DB2_CON_LOCATION"));
  112. if (!String.Empty.Equals(location)) {
  113. int semicolumnIndex = location.IndexOf(':');
  114. if (semicolumnIndex != -1) {
  115. return location.Substring(semicolumnIndex + 1);
  116. }
  117. }
  118. return StringManager.GetString("DB2_CON_PORT");
  119. }
  120. return port;
  121. }
  122. return base.Port;
  123. }
  124. }
  125. protected override string JdbcDriverName {
  126. get {
  127. JDBC_MODE jdbcMode = JdbcMode;
  128. switch (jdbcMode) {
  129. case JDBC_MODE.DATA_SOURCE_MODE :
  130. return base.JdbcDriverName;
  131. case JDBC_MODE.JDBC_DRIVER_MODE :
  132. return ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("JDBC_DRIVER"));
  133. case JDBC_MODE.PROVIDER_MODE:
  134. switch (ProviderType) {
  135. case PROVIDER_TYPE.SQLOLEDB :
  136. return StringManager.GetString("SQL_JDBC_DRIVER");
  137. case PROVIDER_TYPE.MSDAORA :
  138. return StringManager.GetString("ORA_JDBC_DRIVER");
  139. case PROVIDER_TYPE.IBMDADB2 :
  140. return StringManager.GetString("DB2_JDBC_DRIVER");
  141. }
  142. break;
  143. };
  144. return base.JdbcDriverName;
  145. }
  146. }
  147. protected override DbStringManager StringManager {
  148. get {
  149. object stringManager = AppDomain.CurrentDomain.GetData("System.Data.OracleConnection.stringManager");
  150. if (stringManager == null) {
  151. lock(_lockObjectStringManager) {
  152. stringManager = AppDomain.CurrentDomain.GetData("System.Data.OracleConnection.stringManager");
  153. if (stringManager != null)
  154. return (DbStringManager)stringManager;
  155. stringManager = new DbStringManager("System.Data.System.Data.ProviderBase.jvm.OracleStrings");
  156. AppDomain.CurrentDomain.SetData("System.Data.OracleConnection.stringManager", stringManager);
  157. }
  158. }
  159. return (DbStringManager)stringManager;
  160. }
  161. }
  162. #endregion // Properties
  163. #region Methods
  164. public new OracleTransaction BeginTransaction(IsolationLevel level) {
  165. return new OracleTransaction(level, this);
  166. }
  167. public new OracleTransaction BeginTransaction() {
  168. return BeginTransaction(IsolationLevel.ReadCommitted);
  169. }
  170. public new OracleCommand CreateCommand() {
  171. return new OracleCommand(this);
  172. }
  173. protected override DbTransaction BeginDbTransaction(IsolationLevel isolationLevel) {
  174. return BeginTransaction();
  175. }
  176. protected override DbCommand CreateDbCommand() {
  177. return CreateCommand();
  178. }
  179. protected override void CopyTo(AbstractDBConnection target) {
  180. base.CopyTo(target);
  181. }
  182. public object Clone() {
  183. OracleConnection clone = new OracleConnection();
  184. CopyTo(clone);
  185. return clone;
  186. }
  187. protected sealed override SystemException CreateException(SQLException e) {
  188. return new OracleException(e,this);
  189. }
  190. protected sealed override SystemException CreateException(string message) {
  191. return new OracleException(message, null, this);
  192. }
  193. public DataTable GetOracleSchemaTable (Guid schema, object[] restrictions) {
  194. DataTable schemaTable = new DataTable("Tables");
  195. schemaTable.Columns.Add("TABLE_CATALOG");
  196. schemaTable.Columns.Add("TABLE_SCHEMA");
  197. schemaTable.Columns.Add("TABLE_NAME");
  198. schemaTable.Columns.Add("TABLE_TYPE");
  199. schemaTable.Columns.Add("TABLE_GUID");
  200. schemaTable.Columns.Add("DESCRIPTION");
  201. schemaTable.Columns.Add("TABLE_PROPID");
  202. schemaTable.Columns.Add("DATE_CREATED");
  203. schemaTable.Columns.Add("DATE_MODIFIED");
  204. Connection con = JdbcConnection;
  205. String catalog = con.getCatalog();
  206. DatabaseMetaData meta = con.getMetaData();
  207. ResultSet schemaRes = meta.getSchemas();
  208. System.Collections.ArrayList schemas = new System.Collections.ArrayList();
  209. while(schemaRes.next()) {
  210. schemas.Add(schemaRes.getString(1));
  211. }
  212. schemaRes.close();
  213. for(int i = 0; i < schemas.Count; i++) {
  214. ResultSet tableRes = meta.getTables(catalog, schemas[i].ToString(), null, null);
  215. while(tableRes.next()) {
  216. DataRow row = schemaTable.NewRow();
  217. row["TABLE_CATALOG"] = catalog;
  218. row["TABLE_SCHEMA"] = schemas[i];
  219. row["TABLE_NAME"] = tableRes.getString("TABLE_NAME");
  220. row["TABLE_TYPE"] = tableRes.getString("TABLE_TYPE");
  221. row["DESCRIPTION"] = tableRes.getString("REMARKS");
  222. schemaTable.Rows.Add(row);
  223. }
  224. tableRes.close();
  225. }
  226. return schemaTable;
  227. }
  228. protected override void ValidateConnectionString(string connectionString) {
  229. base.ValidateConnectionString(connectionString);
  230. }
  231. protected override string BuildJdbcUrl() {
  232. return base.BuildJdbcUrl();
  233. }
  234. public static void ReleaseObjectPool() {
  235. // since we're using connection pool from app servet, this is by design
  236. //throw new NotImplementedException();
  237. }
  238. protected sealed override void OnSqlWarning(SQLWarning warning) {
  239. OracleErrorCollection col = new OracleErrorCollection(warning, this);
  240. OnOracleInfoMessage(new OracleInfoMessageEventArgs(col));
  241. }
  242. // protected sealed override Connection GetConnectionFromProvider() {
  243. // if ((ProviderType == PROVIDER_TYPE.MSDAORA) &&
  244. // ("true").Equals(StringManager.GetString("ORA_CONNECTION_POOLING_ENABLED","false"))) {
  245. // ActivateJdbcDriver(JdbcDriverName);
  246. // return OracleConnectionFactory.GetConnection(ProviderType,JdbcUrl,User,Password,ConnectionTimeout);
  247. // }
  248. // else {
  249. // return base.GetConnectionFromProvider();
  250. // }
  251. //TBD
  252. // }
  253. private String BuildDb2Url() {
  254. return StringManager.GetString("DB2_JDBC_URL") //jdbc:db2://
  255. + ServerName + ":" + Port + "/" + CatalogName;
  256. }
  257. private String BuildOracleUrl() {
  258. return StringManager.GetString("ORA_JDBC_URL") //"jdbc:oracle:thin:@"
  259. + ServerName + ":" + Port + ":" + CatalogName;
  260. }
  261. protected sealed override void OnStateChanged(ConnectionState orig, ConnectionState current) {
  262. if(StateChange != null) {
  263. StateChange(this, new StateChangeEventArgs(orig, current));
  264. }
  265. }
  266. public override void Close() {
  267. ConnectionState orig = State;
  268. base.Close();
  269. ConnectionState current = State;
  270. if(current != orig) {
  271. OnStateChanged(orig, current);
  272. }
  273. }
  274. private void OnOracleInfoMessage (OracleInfoMessageEventArgs value) {
  275. if (InfoMessage != null) {
  276. InfoMessage (this, value);
  277. }
  278. }
  279. #endregion // Methods
  280. }
  281. }