public void SetAutoCommit(System.Data.OleDb.OleDbConnection connection, bool boolean) { if (this[connection] != null) { ConnectionProperties Properties = ((ConnectionProperties) this[connection]); Properties.AutoCommit = boolean; if(!boolean) { System.Data.OleDb.OleDbTransaction transaction = Properties.Transaction; if (Properties.TransactionLevel == 0) { transaction = connection.BeginTransaction(); } else { transaction = connection.BeginTransaction(Properties.TransactionLevel); } } } else { ConnectionProperties TempProp = new ConnectionProperties(); TempProp.AutoCommit=boolean; TempProp.TransactionLevel=0; if(boolean) TempProp.Transaction = connection.BeginTransaction(); Add(connection, TempProp); } }
public DirectBlockMarker(System.Data.IDbConnection connection, string blocktablename, string filetablename, string statstablename) { m_insertblockCommand = connection.CreateCommand(); m_resetfileCommand = connection.CreateCommand(); m_updateAsRestoredCommand = connection.CreateCommand(); m_updateFileAsDataVerifiedCommand = connection.CreateCommand(); m_statUpdateCommand = connection.CreateCommand(); m_insertblockCommand.Transaction = connection.BeginTransaction(); m_resetfileCommand.Transaction = m_insertblockCommand.Transaction; m_updateAsRestoredCommand.Transaction = m_insertblockCommand.Transaction; m_updateFileAsDataVerifiedCommand.Transaction = m_insertblockCommand.Transaction; m_statUpdateCommand.Transaction = m_insertblockCommand.Transaction; m_blocktablename = blocktablename; m_filetablename = filetablename; m_insertblockCommand.CommandText = string.Format( @"UPDATE ""{0}"" SET ""Restored"" = 1 " + @" WHERE ""FileID"" = ? AND ""Index"" = ? AND ""Hash"" = ? AND ""Size"" = ? AND ""Metadata"" = ? AND ""Restored"" = 0 " , m_blocktablename); m_insertblockCommand.AddParameters(5); m_resetfileCommand.CommandText = string.Format( @"UPDATE ""{0}"" SET ""Restored"" = 0 WHERE ""FileID"" = ? " , m_blocktablename); m_resetfileCommand.AddParameters(1); m_updateAsRestoredCommand.CommandText = string.Format( @"UPDATE ""{0}"" SET ""Restored"" = 1 WHERE ""FileID"" = ? AND ""Metadata"" <= ? " , m_blocktablename); m_updateAsRestoredCommand.AddParameters(2); m_updateFileAsDataVerifiedCommand.CommandText = string.Format( @"UPDATE ""{0}"" SET ""DataVerified"" = 1 WHERE ""ID"" = ?" , m_filetablename); m_updateFileAsDataVerifiedCommand.AddParameters(1); if (statstablename != null) { // Fields in Stats: TotalFiles, TotalBlocks, TotalSize // FilesFullyRestored, FilesPartiallyRestored, BlocksRestored, SizeRestored m_statUpdateCommand.CommandText = string.Format(@"SELECT SUM(""FilesFullyRestored""), SUM(""SizeRestored"") FROM ""{0}"" ", statstablename); } else // very slow fallback if stats tables were not created m_statUpdateCommand.CommandText = string.Format(@"SELECT COUNT(DISTINCT ""FileID""), SUM(""Size"") FROM ""{0}"" WHERE ""Restored"" = 1 ", m_blocktablename); }
public BlockMarker(System.Data.IDbConnection connection, string blocktablename, string filetablename) { m_insertblockCommand = connection.CreateCommand(); m_resetfileCommand = connection.CreateCommand(); m_updateAsRestoredCommand = connection.CreateCommand(); m_statUpdateCommand = connection.CreateCommand(); m_insertblockCommand.Transaction = connection.BeginTransaction(); m_resetfileCommand.Transaction = m_insertblockCommand.Transaction; m_updateAsRestoredCommand.Transaction = m_insertblockCommand.Transaction; m_statUpdateCommand.Transaction = m_insertblockCommand.Transaction; m_blocktablename = blocktablename; m_updateTable = "UpdatedBlocks-" + Library.Utility.Utility.ByteArrayAsHexString(Guid.NewGuid().ToByteArray()); m_insertblockCommand.ExecuteNonQuery(string.Format(@"CREATE TEMPORARY TABLE ""{0}"" (""FileID"" INTEGER NOT NULL, ""Index"" INTEGER NOT NULL, ""Hash"" TEXT NOT NULL, ""Size"" INTEGER NOT NULL)", m_updateTable)); m_insertblockCommand.CommandText = string.Format(@"INSERT INTO ""{0}"" (""FileID"", ""Index"", ""Hash"", ""Size"") VALUES (?, ?, ?, ?) ", m_updateTable); m_insertblockCommand.AddParameters(4); m_resetfileCommand.CommandText = string.Format(@"DELETE FROM ""{0}"" WHERE ""FileID"" = ?", m_updateTable); m_resetfileCommand.AddParameters(1); m_updateAsRestoredCommand.CommandText = string.Format(@"INSERT INTO ""{0}"" (""FileID"", ""Index"", ""Hash"", ""Size"") SELECT ""FileID"", ""Index"", ""Hash"", ""Size"" FROM ""{1}"" WHERE ""{1}"".""FileID"" = ?", m_updateTable, m_blocktablename); m_updateAsRestoredCommand.AddParameters(1); m_statUpdateCommand.CommandText = string.Format(@"SELECT COUNT(DISTINCT ""FileID""), SUM(""Size"") FROM ""{0}"" WHERE ""Restored"" = 1 OR ""ID"" IN (SELECT ""{0}"".""ID"" FROM ""{0}"", ""{1}"" WHERE ""{0}"".""FileID"" = ""{1}"".""FileID"" AND ""{0}"".""Index"" = ""{1}"".""Index"" AND ""{0}"".""Hash"" = ""{1}"".""Hash"" AND ""{0}"".""Size"" = ""{1}"".""Size"" )", m_blocktablename, m_updateTable); }
public void RollBack(System.Data.OleDb.OleDbConnection connection) { if (this[connection] != null && !((ConnectionProperties)this[connection]).AutoCommit) { ConnectionProperties Properties = ((ConnectionProperties) this[connection]); System.Data.OleDb.OleDbTransaction transaction = Properties.Transaction; transaction.Rollback(); if (Properties.TransactionLevel == 0) Properties.Transaction = connection.BeginTransaction(); else Properties.Transaction = connection.BeginTransaction(Properties.TransactionLevel); } }
public System.Data.IDbTransaction BeginTransaction(System.Data.IDbConnection connection) { return connection.BeginTransaction(); }
/// <summary> /// Enlists a Transaction in the transaction manager. /// </summary> /// <param name="conn">The connection to create the transaction.</param> /// <returns>The nested level of the transaction.</returns> public static int Enlist(System.Data.Common.DbConnection conn) { return Enlist(conn.BeginTransaction()); }
static void RunTransaction(System.Data.OleDb.OleDbConnection cn, bool hasError) { using (var tr = cn.BeginTransaction()) { try { Insert(cn, tr); if (hasError) { throw new Exception(); } Update(cn, tr); tr.Commit(); Console.WriteLine("Commit"); } catch (Exception e) { Console.WriteLine(e.ToString()); tr.Rollback(); Console.WriteLine("Rollback"); } Console.WriteLine("End Transaction"); } }