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);					
				}
			}
Exemple #5
0
 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());
 }
Exemple #7
0
        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");
            }
        }