File: OciTransactionHandle.cs

package info (click to toggle)
mono 6.14.1%2Bds2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 1,282,732 kB
  • sloc: cs: 11,182,461; xml: 2,850,281; ansic: 699,123; cpp: 122,919; perl: 58,604; javascript: 30,841; asm: 21,845; makefile: 19,602; sh: 10,973; python: 4,772; pascal: 925; sql: 859; sed: 16; php: 1
file content (150 lines) | stat: -rw-r--r-- 3,136 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
// 
// OciTransactionHandle.cs 
//  
// Part of managed C#/.NET library System.Data.OracleClient.dll
//
// Part of the Mono class libraries at
// mcs/class/System.Data.OracleClient/System.Data.OracleClient.Oci
//
// Assembly: System.Data.OracleClient.dll
// Namespace: System.Data.OracleClient.Oci
// 
// Author: 
//     Tim Coleman <tim@timcoleman.com>
//         
// Copyright (C) Tim Coleman, 2003
// 

using System;
using System.Runtime.InteropServices;

namespace System.Data.OracleClient.Oci {
	internal sealed class OciTransactionHandle : OciHandle, IDisposable
	{
		#region Fields

		bool disposed = false;
		OciErrorHandle errorHandle;
		OciServiceHandle serviceHandle;

		#endregion // Fields

		#region Constructors

		public OciTransactionHandle (OciHandle parent, IntPtr handle)
			: base (OciHandleType.Transaction, parent, handle)
		{
		}

		#endregion // Constructors

		#region Properties

		public OciErrorHandle ErrorHandle {
			get { return errorHandle; }
			set { errorHandle = value; }
		}

		public OciServiceHandle Service {
			get { return serviceHandle; }
			set { serviceHandle = value; }
		}

		#endregion // Properties

		#region Methods

		public void AttachToServiceContext ()
		{
			int status = 0;
			status = OciCalls.OCIAttrSet (Service,
							OciHandleType.Service,
							this,
							0,
							OciAttributeType.Transaction,
							ErrorHandle);
			if (status != 0) {
				OciErrorInfo info = ErrorHandle.HandleError ();
				throw new OracleException (info.ErrorCode, info.ErrorMessage);
			}
		}

		public void DetachFromServiceContext ()
		{
			int status = 0;
			status = OciCalls.OCIAttrSet (Service,
				OciHandleType.Service,
				IntPtr.Zero,
				0,
				OciAttributeType.Transaction,
				ErrorHandle);
			if (status != 0) 
			{
				OciErrorInfo info = ErrorHandle.HandleError ();
				throw new OracleException (info.ErrorCode, info.ErrorMessage);
			}
		}

		public void Begin ()
		{
			int status = 0;

			AttachToServiceContext ();

			status = OciCalls.OCITransStart (Service,
						ErrorHandle,
						60,
						OciTransactionFlags.New);

			if (status != 0) {
				OciErrorInfo info = ErrorHandle.HandleError ();
				throw new OracleException (info.ErrorCode, info.ErrorMessage);
			}
		}

		public void Commit ()
		{
			int status = 0;
			AttachToServiceContext ();
			try {
				status = OciCalls.OCITransCommit (Service, ErrorHandle, 0);

				if (status != 0) 
				{
					OciErrorInfo info = ErrorHandle.HandleError ();
					throw new OracleException (info.ErrorCode, info.ErrorMessage);
				}
			}
			finally {
				DetachFromServiceContext ();
			}
		}

		protected override void Dispose (bool disposing)
		{
			if (!disposed) {
				disposed = true;
				base.Dispose (disposing);
			}
		}

		public void Rollback ()
		{
			try {
				int status = 0;
				AttachToServiceContext ();
				status = OciCalls.OCITransRollback (Service, ErrorHandle, 0);

				if (status != 0) {
					OciErrorInfo info = ErrorHandle.HandleError ();
					throw new OracleException (info.ErrorCode, info.ErrorMessage);
				}
			}
			finally {
				DetachFromServiceContext ();
			}
		}

		#endregion // Methods
	}
}