2 // ociglue.cs - provides glue between
3 // managed C#/.NET System.Data.OracleClient.dll and
4 // unmanaged native c library oci.dll
5 // to be used in Mono System.Data.OracleClient as
6 // the Oracle 8i data provider.
8 // Part of managed C#/.NET library System.Data.OracleClient.dll
10 // Part of the Mono class libraries at
11 // mcs/class/System.Data.OracleClient/System.Data.OracleClient.OCI
13 // Assembly: System.Data.OracleClient.dll
14 // Namespace: System.Data.OracleClient.Oci
17 // Daniel Morgan <danmorg@sc.rr.com>
18 // Tim Coleman <tim@timcoleman.com>
20 // Copyright (C) Daniel Morgan, 2002
21 // Copyright (C) Tim Coleman, 2002
25 using System.Runtime.InteropServices;
28 namespace System.Data.OracleClient.Oci {
29 internal sealed class OciGlue
34 OciEnvironmentHandle environment;
36 OciServerHandle server;
37 OciServiceHandle service;
38 OciSessionHandle session;
41 public const int OCI_DEFAULT = 0;
42 public const int OCI_SUCCESS = 0;
43 public const int OCI_SUCCESS_WITH_INFO = 1;
44 public const int OCI_RESERVED_FOR_INT_USE = 200;
45 public const int OCI_NO_DATA = 100;
46 public const int OCI_ERROR = -1;
47 public const int OCI_INVALID_HANDLE = -2;
48 public const int OCI_NEED_DATA = 99;
49 public const int OCI_STILL_EXECUTING = -3123;
50 public const int OCI_CONTINUE = -24200;
56 public bool Connected {
57 get { return connected; }
60 public OciEnvironmentHandle Environment {
61 get { return environment; }
64 public OciErrorHandle ErrorHandle {
68 public OciServiceHandle ServiceContext {
69 get { return service; }
72 #endregion // Properties
76 public void CreateConnection (OracleConnectionInfo conInfo)
78 environment = new OciEnvironmentHandle (OciEnvironmentMode.Threaded | OciEnvironmentMode.NoUserCallback);
80 if (environment.Handle == IntPtr.Zero)
81 throw new OracleException (0, "Could not allocate the Oracle environment.");
83 service = (OciServiceHandle) environment.Allocate (OciHandleType.Service);
84 if (service == null) {
85 OciErrorInfo info = environment.HandleError ();
87 throw new OracleException (info.ErrorCode, info.ErrorMessage);
90 error = (OciErrorHandle) environment.Allocate (OciHandleType.Error);
92 OciErrorInfo info = environment.HandleError ();
94 throw new OracleException (info.ErrorCode, info.ErrorMessage);
96 service.ErrorHandle = error;
98 server = (OciServerHandle) environment.Allocate (OciHandleType.Server);
100 OciErrorInfo info = environment.HandleError ();
102 throw new OracleException (info.ErrorCode, info.ErrorMessage);
105 session = (OciSessionHandle) environment.Allocate (OciHandleType.Session);
106 if (session == null) {
107 OciErrorInfo info = environment.HandleError ();
109 throw new OracleException (info.ErrorCode, info.ErrorMessage);
111 session.Username = conInfo.Username;
112 session.Password = conInfo.Password;
113 session.Service = service;
115 if (!server.Attach (conInfo.Database, ErrorHandle)) {
116 OciErrorInfo info = error.HandleError ();
118 throw new OracleException (info.ErrorCode, info.ErrorMessage);
121 if (!service.SetServer (server)) {
122 OciErrorInfo info = error.HandleError ();
124 throw new OracleException (info.ErrorCode, info.ErrorMessage);
127 if (!session.BeginSession (OciCredentialType.RDBMS, OciSessionMode.Default, ErrorHandle)) {
128 OciErrorInfo info = error.HandleError ();
130 throw new OracleException (info.ErrorCode, info.ErrorMessage);
134 if (!service.SetSession (session)) {
135 OciErrorInfo info = error.HandleError ();
137 throw new OracleException (info.ErrorCode, info.ErrorMessage);
143 public OciStatementHandle CreateStatement ()
145 OciStatementHandle statement = (OciStatementHandle) environment.Allocate (OciHandleType.Statement);
146 if (statement == null) {
147 OciErrorInfo info = environment.HandleError ();
148 throw new OracleException (info.ErrorCode, info.ErrorMessage);
150 statement.ErrorHandle = error;
151 statement.Service = service;
156 public OciTransactionHandle CreateTransaction ()
158 OciTransactionHandle transaction = (OciTransactionHandle) environment.Allocate (OciHandleType.Transaction);
159 if (transaction == null) {
160 OciErrorInfo info = environment.HandleError ();
161 throw new OracleException (info.ErrorCode, info.ErrorMessage);
163 transaction.ErrorHandle = error;
164 transaction.Service = service;
169 public void Disconnect()
179 if (environment != null)
180 environment.Dispose ();
183 #endregion // Methods