Merge pull request #2006 from steffen-kiess/posix-sockets-2
[mono.git] / mcs / class / Mono.Data.Sqlite / Mono.Data.Sqlite_2.0 / SQLiteEnlistment.cs
1 /********************************************************\r
2  * ADO.NET 2.0 Data Provider for SQLite Version 3.X\r
3  * Written by Robert Simpson (robert@blackcastlesoft.com)\r
4  * \r
5  * Released to the public domain, use at your own risk!\r
6  ********************************************************/\r
7 \r
8 #if !PLATFORM_COMPACTFRAMEWORK\r
9 namespace Mono.Data.Sqlite\r
10 {\r
11   using System;\r
12   using System.Data;\r
13   using System.Data.Common;\r
14   using System.Transactions;\r
15 \r
16   internal class SQLiteEnlistment : IEnlistmentNotification\r
17   {\r
18     internal SqliteTransaction _transaction;\r
19     internal Transaction _scope;\r
20     internal bool _disposeConnection;\r
21 \r
22     internal SQLiteEnlistment(SqliteConnection cnn, Transaction scope)\r
23     {\r
24       _transaction = cnn.BeginTransaction();\r
25       _scope = scope;\r
26       _disposeConnection = false;\r
27 \r
28       _scope.EnlistVolatile(this, System.Transactions.EnlistmentOptions.None);\r
29     }\r
30 \r
31     private void Cleanup(SqliteConnection cnn)\r
32     {\r
33       if (_disposeConnection)\r
34         cnn.Dispose();\r
35 \r
36       _transaction = null;\r
37       _scope = null;\r
38     }\r
39 \r
40     #region IEnlistmentNotification Members\r
41 \r
42     public void Commit(Enlistment enlistment)\r
43     {\r
44       SqliteConnection cnn = _transaction.Connection;\r
45       cnn._enlistment = null;\r
46 \r
47       try\r
48       {\r
49         _transaction.IsValid(true);\r
50         _transaction.Connection._transactionLevel = 1;\r
51         _transaction.Commit();\r
52 \r
53         enlistment.Done();\r
54       }\r
55       finally\r
56       {\r
57         Cleanup(cnn);\r
58       }\r
59     }\r
60 \r
61     public void InDoubt(Enlistment enlistment)\r
62     {\r
63       enlistment.Done();\r
64     }\r
65 \r
66     public void Prepare(PreparingEnlistment preparingEnlistment)\r
67     {\r
68       if (_transaction.IsValid(false) == false)\r
69         preparingEnlistment.ForceRollback();\r
70       else\r
71         preparingEnlistment.Prepared();\r
72     }\r
73 \r
74     public void Rollback(Enlistment enlistment)\r
75     {\r
76       SqliteConnection cnn = _transaction.Connection;\r
77       cnn._enlistment = null;\r
78 \r
79       try\r
80       {\r
81         _transaction.Rollback();\r
82         enlistment.Done();\r
83       }\r
84       finally\r
85       {\r
86         Cleanup(cnn);\r
87       }\r
88     }\r
89 \r
90     #endregion\r
91   }\r
92 }\r
93 #endif // !PLATFORM_COMPACT_FRAMEWORK