namespace System.Data.OleDb
{
- public sealed class OleDbTransaction : MarshalByRefObject, IDbTransaction, IDisposable
+ public sealed class OleDbTransaction : DbTransaction, IDbTransaction
{
#region Fields
+ bool disposed;
OleDbConnection connection;
IntPtr gdaTransaction;
int depth;
+ bool isOpen;
#endregion // Fields
}
libgda.gda_connection_begin_transaction (connection.GdaConnection, gdaTransaction);
+ isOpen = true;
}
internal OleDbTransaction (OleDbConnection connection, IsolationLevel isolevel)
#region Properties
- public OleDbConnection Connection {
+ public new OleDbConnection Connection {
get {
return connection;
}
}
- IDbConnection IDbTransaction.Connection {
- get {
- return connection;
- }
+ protected override DbConnection DbConnection {
+ get { return connection; }
}
- public IsolationLevel IsolationLevel {
+ public
+ override
+ IsolationLevel IsolationLevel {
get {
+ if (!isOpen)
+ throw ExceptionHelper.TransactionNotUsable (GetType ());
+
switch (libgda.gda_transaction_get_isolation_level (gdaTransaction)) {
case GdaTransactionIsolation.ReadCommitted :
return IsolationLevel.ReadCommitted;
case GdaTransactionIsolation.Serializable :
return IsolationLevel.Serializable;
}
-
return IsolationLevel.Unspecified;
}
}
#region Methods
- public OleDbTransaction Begin ()
+ public OleDbTransaction Begin ()
{
+ if (!isOpen)
+ throw ExceptionHelper.TransactionNotUsable (GetType ());
return new OleDbTransaction (connection, depth + 1);
}
public OleDbTransaction Begin (IsolationLevel isolevel)
{
+ if (!isOpen)
+ throw ExceptionHelper.TransactionNotUsable (GetType ());
return new OleDbTransaction (connection, depth + 1, isolevel);
}
- public void Commit ()
+ public
+ override
+ void Commit ()
{
+ if (!isOpen)
+ throw ExceptionHelper.TransactionNotUsable (GetType ());
+
if (!libgda.gda_connection_commit_transaction (connection.GdaConnection,
- gdaTransaction))
+ gdaTransaction))
throw new InvalidOperationException ();
+ connection = null;
+ isOpen = false;
}
- [MonoTODO]
- ~OleDbTransaction ()
+
+ protected override
+ void Dispose (bool disposing)
{
- libgda.FreeObject (gdaTransaction);
- gdaTransaction = IntPtr.Zero;
+ if (!disposed) {
+ if (disposing && isOpen)
+ Rollback ();
+ disposed = true;
+ }
+
+ base.Dispose (disposing);
}
- [MonoTODO]
- void IDisposable.Dispose ()
+
+ public
+ override
+ void Rollback ()
{
- GC.SuppressFinalize (this);
- throw new NotImplementedException ();
- }
+ if (!isOpen)
+ throw ExceptionHelper.TransactionNotUsable (GetType ());
- public void Rollback ()
- {
if (!libgda.gda_connection_rollback_transaction (connection.GdaConnection,
- gdaTransaction))
+ gdaTransaction))
throw new InvalidOperationException ();
+ connection = null;
+ isOpen = false;
}
#endregion // Methods