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 public OciServerHandle ServerHandle {
73 get { return server; }
76 public OciSessionHandle SessionHandle {
77 get { return session; }
80 #endregion // Properties
84 public void CreateConnection (OracleConnectionInfo conInfo)
86 environment = new OciEnvironmentHandle (OciEnvironmentMode.Threaded | OciEnvironmentMode.NoUserCallback);
88 if (environment.Handle == IntPtr.Zero)
89 throw new OracleException (0, "Could not allocate the Oracle environment.");
91 service = (OciServiceHandle) environment.Allocate (OciHandleType.Service);
92 if (service == null) {
93 OciErrorInfo info = environment.HandleError ();
95 throw new OracleException (info.ErrorCode, info.ErrorMessage);
98 error = (OciErrorHandle) environment.Allocate (OciHandleType.Error);
100 OciErrorInfo info = environment.HandleError ();
102 throw new OracleException (info.ErrorCode, info.ErrorMessage);
104 service.ErrorHandle = error;
106 server = (OciServerHandle) environment.Allocate (OciHandleType.Server);
107 if (server == null) {
108 OciErrorInfo info = environment.HandleError ();
110 throw new OracleException (info.ErrorCode, info.ErrorMessage);
113 session = (OciSessionHandle) environment.Allocate (OciHandleType.Session);
114 if (session == null) {
115 OciErrorInfo info = environment.HandleError ();
117 throw new OracleException (info.ErrorCode, info.ErrorMessage);
119 session.Username = conInfo.Username;
120 session.Password = conInfo.Password;
121 session.Service = service;
123 if (!server.Attach (conInfo.Database, ErrorHandle)) {
124 OciErrorInfo info = error.HandleError ();
126 throw new OracleException (info.ErrorCode, info.ErrorMessage);
129 if (!service.SetServer (server)) {
130 OciErrorInfo info = error.HandleError ();
132 throw new OracleException (info.ErrorCode, info.ErrorMessage);
135 if (!session.BeginSession (conInfo.CredentialType, OciSessionMode.Default, ErrorHandle)) {
136 OciErrorInfo info = error.HandleError ();
138 throw new OracleException (info.ErrorCode, info.ErrorMessage);
141 if (!service.SetSession (session)) {
142 OciErrorInfo info = error.HandleError ();
144 throw new OracleException (info.ErrorCode, info.ErrorMessage);
150 public OciStatementHandle CreateStatement ()
152 OciStatementHandle statement = (OciStatementHandle) environment.Allocate (OciHandleType.Statement);
153 if (statement == null) {
154 OciErrorInfo info = environment.HandleError ();
155 throw new OracleException (info.ErrorCode, info.ErrorMessage);
157 statement.ErrorHandle = error;
158 statement.Service = service;
163 public OciTransactionHandle CreateTransaction ()
165 OciTransactionHandle transaction = (OciTransactionHandle) environment.Allocate (OciHandleType.Transaction);
166 if (transaction == null) {
167 OciErrorInfo info = environment.HandleError ();
168 throw new OracleException (info.ErrorCode, info.ErrorMessage);
170 transaction.ErrorHandle = error;
171 transaction.Service = service;
176 public void Disconnect()
178 if (session != null) {
179 session.EndSession (error);
183 if (server != null) {
184 server.Detach (error);
192 if (service != null) {
196 if (environment != null) {
197 environment.Dispose ();
202 #endregion // Methods