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