a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
151 lines
3.1 KiB
C#
151 lines
3.1 KiB
C#
//
|
|
// 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
|
|
}
|
|
}
|