New test.
[mono.git] / mcs / class / Mono.Data.SqliteClient / Mono.Data.SqliteClient / SqliteTransaction.cs
1 //
2 // Mono.Data.SqliteClient.SqliteTransaction.cs
3 //
4 // Mono.Data.SqliteClient data access components for .Net
5 // Derived from ByteFX.Data
6 // With permission from Reggie Burnett to relicense under MIT/X11
7 //
8 // Permission is hereby granted, free of charge, to any person obtaining
9 // a copy of this software and associated documentation files (the
10 // "Software"), to deal in the Software without restriction, including
11 // without limitation the rights to use, copy, modify, merge, publish,
12 // distribute, sublicense, and/or sell copies of the Software, and to
13 // permit persons to whom the Software is furnished to do so, subject to
14 // the following conditions:
15 // 
16 // The above copyright notice and this permission notice shall be
17 // included in all copies or substantial portions of the Software.
18 // 
19 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
23 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
24 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
25 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 //
27
28 using System;
29 using System.Data;
30
31 namespace Mono.Data.SqliteClient
32 {
33         public sealed class SqliteTransaction : IDbTransaction
34         {
35         
36                 #region Fields
37                 
38                 private IsolationLevel _isolationLevel;
39                 private SqliteConnection _connection;
40                 private bool _open;
41                 
42                 #endregion
43
44                 #region Contructors and destructors
45                 
46                 internal SqliteTransaction() 
47                 {
48                         _open = true;
49                 }
50
51                 void System.IDisposable.Dispose() 
52                 {
53                 }
54                 
55                 #endregion
56
57                 #region Public Properties
58
59                 public IDbConnection Connection
60                 {
61                         get { return _connection; } 
62                         set { _connection = (SqliteConnection)value; }
63                 }
64
65                 public IsolationLevel IsolationLevel 
66                 {
67                         get { return _isolationLevel; }
68                         set { _isolationLevel = value; }
69                 }
70
71                 #endregion
72                 
73                 #region Public Methods
74                 
75                 public void Commit()
76                 {
77                         if (_connection == null || _connection.State != ConnectionState.Open)
78                                 throw new InvalidOperationException("Connection must be valid and open to commit transaction");
79                         if (!_open)
80                                 throw new InvalidOperationException("Transaction has already been committed or is not pending");
81                         try 
82                         {
83                                 SqliteCommand cmd = _connection.CreateCommand();
84                                 cmd.CommandText = "COMMIT";
85                                 cmd.ExecuteNonQuery();
86                                 _open = false;
87                         }
88                         catch (Exception ex) 
89                         {
90                                 throw ex;
91                         }
92                 }
93
94                 public void Rollback()
95                 {
96                         if (_connection == null || _connection.State != ConnectionState.Open)
97                                 throw new InvalidOperationException("Connection must be valid and open to commit transaction");
98                         if (!_open)
99                                 throw new InvalidOperationException("Transaction has already been rolled back or is not pending");
100                         try 
101                         {
102                                 SqliteCommand cmd = _connection.CreateCommand();
103                                 cmd.CommandText = "ROLLBACK";
104                                 cmd.ExecuteNonQuery();
105                                 _open = false;
106                         }
107                         catch (Exception ex) 
108                         {
109                                 throw ex;
110                         }
111                 }
112                 
113                 #endregion
114         }
115 }