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 [DllImport ("oci", EntryPoint = "OCIAttrSet")]
77 public static extern int OCIAttrSet (IntPtr trgthndlp,
78 [MarshalAs (UnmanagedType.U4)] OciHandleType trghndltyp,
81 [MarshalAs (UnmanagedType.U4)] OciAttributeType attrtype,
84 [DllImport ("oci", EntryPoint = "OCIAttrSet")]
85 public static extern int OCIAttrSetString (IntPtr trgthndlp,
86 [MarshalAs (UnmanagedType.U4)] OciHandleType trghndltyp,
89 [MarshalAs (UnmanagedType.U4)] OciAttributeType attrtype,
93 public static extern int OCIErrorGet (IntPtr hndlp,
99 [MarshalAs (UnmanagedType.U4)] OciHandleType type);
101 public void CreateConnection (OracleConnectionInfo conInfo)
103 environment = new OciEnvironmentHandle (OciEnvironmentMode.NoUserCallback);
104 if (environment.Handle == IntPtr.Zero)
105 throw new OracleException (0, "Could not allocate the Oracle environment.");
107 service = (OciServiceHandle) environment.Allocate (OciHandleType.Service);
108 if (service == null) {
109 OciErrorInfo info = environment.HandleError ();
111 throw new OracleException (info.ErrorCode, info.ErrorMessage);
114 error = (OciErrorHandle) environment.Allocate (OciHandleType.Error);
116 OciErrorInfo info = environment.HandleError ();
118 throw new OracleException (info.ErrorCode, info.ErrorMessage);
120 service.ErrorHandle = error;
122 server = (OciServerHandle) environment.Allocate (OciHandleType.Server);
123 if (server == null) {
124 OciErrorInfo info = environment.HandleError ();
126 throw new OracleException (info.ErrorCode, info.ErrorMessage);
129 session = (OciSessionHandle) environment.Allocate (OciHandleType.Session);
130 if (session == null) {
131 OciErrorInfo info = environment.HandleError ();
133 throw new OracleException (info.ErrorCode, info.ErrorMessage);
135 session.Username = conInfo.Username;
136 session.Password = conInfo.Password;
137 session.Service = service;
139 if (!server.Attach (conInfo.Database, ErrorHandle)) {
140 OciErrorInfo info = error.HandleError ();
142 throw new OracleException (info.ErrorCode, info.ErrorMessage);
145 if (!service.SetServer (server)) {
146 OciErrorInfo info = error.HandleError ();
148 throw new OracleException (info.ErrorCode, info.ErrorMessage);
151 if (!session.BeginSession (OciCredentialType.RDBMS, OciSessionMode.Default, ErrorHandle)) {
152 OciErrorInfo info = error.HandleError ();
154 throw new OracleException (info.ErrorCode, info.ErrorMessage);
158 if (!service.SetSession (session)) {
159 OciErrorInfo info = error.HandleError ();
161 throw new OracleException (info.ErrorCode, info.ErrorMessage);
167 public OciStatementHandle CreateStatement ()
169 OciStatementHandle statement = (OciStatementHandle) environment.Allocate (OciHandleType.Statement);
170 if (statement == null) {
171 OciErrorInfo info = environment.HandleError ();
172 throw new OracleException (info.ErrorCode, info.ErrorMessage);
174 statement.ErrorHandle = error;
175 statement.Service = service;
180 public OciTransactionHandle CreateTransaction ()
182 OciTransactionHandle transaction = (OciTransactionHandle) environment.Allocate (OciHandleType.Transaction);
183 if (transaction == null) {
184 OciErrorInfo info = environment.HandleError ();
185 throw new OracleException (info.ErrorCode, info.ErrorMessage);
187 transaction.ErrorHandle = error;
188 transaction.Service = service;
193 public void Disconnect()
203 if (environment != null)
204 environment.Dispose ();
207 #endregion // Methods