/******************************************************** * ADO.NET 2.0 Data Provider for SQLite Version 3.X * Written by Robert Simpson (robert@blackcastlesoft.com) * * Released to the public domain, use at your own risk! ********************************************************/ namespace System.Data.SQLite { using System; using System.Data; using System.Data.Common; /// /// SQLite implementation of DbTransaction. /// public sealed class SQLiteTransaction : DbTransaction { private SQLiteConnection _cnn; internal SQLiteTransaction(SQLiteConnection cnn) { try { cnn._sql.Execute("BEGIN"); _cnn = cnn; } catch (SQLiteException e) { BaseDispose(); throw (e); } } /// /// Commits the current transaction. /// public override void Commit() { if (_cnn == null) throw new ArgumentNullException(); try { _cnn._sql.Execute("COMMIT"); } catch (SQLiteException e) { BaseDispose(); throw (e); } BaseDispose(); } /// /// Returns the underlying connection to which this transaction applies. /// protected override DbConnection DbConnection { get { return _cnn; } } /// /// Disposes the transaction. If it is currently active, any changes are rolled back. /// public override void Dispose() { if (_cnn != null) Rollback(); GC.SuppressFinalize(this); } /// /// Gets the isolation level of the transaction. SQLite does not support isolation levels, so this always returns Unspecified. /// public override IsolationLevel IsolationLevel { get { return IsolationLevel.Unspecified; } } /// /// Rolls back the active transaction. /// public override void Rollback() { if (_cnn == null) throw new ArgumentNullException(); try { _cnn._sql.Execute("ROLLBACK"); } catch (SQLiteException e) { BaseDispose(); throw (e); } BaseDispose(); } private void BaseDispose() { _cnn._activeTransaction = null; _cnn = null; } } }