2002-08-25 Rodrigo Moya <rodrigo@ximian.com>
[mono.git] / mcs / class / System.Data / System.Data.OleDb / OleDbTransaction.cs
1 //
2 // System.Data.OleDb.OleDbTransaction
3 //
4 // Authors:
5 //   Rodrigo Moya (rodrigo@ximian.com)
6 //   Tim Coleman (tim@timcoleman.com)
7 //
8 // Copyright (C) Rodrigo Moya, 2002
9 // Copyright (C) Tim Coleman, 2002
10 //
11
12 using System.Data;
13 using System.Data.Common;
14
15 namespace System.Data.OleDb
16 {
17         public sealed class OleDbTransaction : MarshalByRefObject, IDbTransaction, IDisposable
18         {
19                 #region Fields
20
21                 OleDbConnection connection;
22                 IntPtr gdaTransaction;
23                 int depth;
24
25                 #endregion // Fields
26
27                 #region Constructors
28
29                 internal OleDbTransaction (OleDbConnection connection, int depth)
30                         : this (connection, depth, IsolationLevel.ReadCommitted)
31                 {
32                 }
33
34                 internal OleDbTransaction (OleDbConnection connection)
35                         : this (connection, 1)
36                 {
37                 }
38
39                 internal OleDbTransaction (OleDbConnection connection, int depth, IsolationLevel isolevel) 
40                 {
41                         this.connection = connection;
42
43                         gdaTransaction = libgda.gda_transaction_new (depth.ToString ());
44                         
45                         switch (isolevel) {
46                         case IsolationLevel.ReadCommitted :
47                                 libgda.gda_transaction_set_isolation_level (gdaTransaction,
48                                                                             GdaTransactionIsolation.ReadCommitted);
49                                 break;
50                         case IsolationLevel.ReadUncommitted :
51                                 libgda.gda_transaction_set_isolation_level (gdaTransaction,
52                                                                             GdaTransactionIsolation.ReadUncommitted);
53                                 break;
54                         case IsolationLevel.RepeatableRead :
55                                 libgda.gda_transaction_set_isolation_level (gdaTransaction,
56                                                                             GdaTransactionIsolation.RepeatableRead);
57                                 break;
58                         case IsolationLevel.Serializable :
59                                 libgda.gda_transaction_set_isolation_level (gdaTransaction,
60                                                                             GdaTransactionIsolation.Serializable);
61                                 break;
62                         }
63                         
64                         libgda.gda_connection_begin_transaction (connection.GdaConnection, gdaTransaction);
65                 }
66
67                 internal OleDbTransaction (OleDbConnection connection, IsolationLevel isolevel) 
68                         : this (connection, 1, isolevel)
69                 {
70                 }
71
72
73                 #endregion // Constructors
74
75                 #region Properties
76
77                 public OleDbConnection Connection {
78                         get {
79                                 return connection;
80                         }
81                 }
82
83                 IDbConnection IDbTransaction.Connection {
84                         get {
85                                 return connection;
86                         }
87                 }
88                 
89                 public IsolationLevel IsolationLevel {
90                         get {
91                                 switch (libgda.gda_transaction_get_isolation_level (gdaTransaction)) {
92                                 case GdaTransactionIsolation.ReadCommitted :
93                                         return IsolationLevel.ReadCommitted;
94                                 case GdaTransactionIsolation.ReadUncommitted :
95                                         return IsolationLevel.ReadUncommitted;
96                                 case GdaTransactionIsolation.RepeatableRead :
97                                         return IsolationLevel.RepeatableRead;
98                                 case GdaTransactionIsolation.Serializable :
99                                         return IsolationLevel.Serializable;
100                                 }
101
102                                 return IsolationLevel.Unspecified;
103                         }
104                 }
105
106                 #endregion // Properties
107
108                 #region Methods
109
110                 public OleDbTransaction Begin () 
111                 {
112                         return new OleDbTransaction (connection, depth + 1);
113                 }
114
115                 public OleDbTransaction Begin (IsolationLevel isolevel) 
116                 {
117                         return new OleDbTransaction (connection, depth + 1, isolevel);
118                 }
119
120                 public void Commit ()
121                 {
122                         if (!libgda.gda_connection_commit_transaction (connection.GdaConnection,
123                                                                        gdaTransaction))
124                                 throw new InvalidOperationException ();
125                 }
126
127                 [MonoTODO]
128                 ~OleDbTransaction ()
129                 {
130                         libgda.FreeObject (gdaTransaction);
131                         gdaTransaction = IntPtr.Zero;
132                 }
133
134                 [MonoTODO]
135                 void IDisposable.Dispose ()
136                 {
137                         throw new NotImplementedException ();
138                 }
139
140                 public void Rollback ()
141                 {
142                         if (!libgda.gda_connection_rollback_transaction (connection.GdaConnection,
143                                                                          gdaTransaction))
144                                 throw new InvalidOperationException ();
145                 }
146
147                 #endregion // Methods
148         }
149 }