public override void ExecuteCommand() { using (var sqlConnection = new SqlConnection(ConnectionString.ConnectionString)) using (var dbExecutor = new SqlExecutor(sqlConnection)) { sqlConnection.Open(); var package = Util.GetPackage( dbExecutor, PackageId, PackageVersion); // Multiple queries? Yes. Do I care? No. var packageRecord = new DataTable(); using (SqlCommand cmd = sqlConnection.CreateCommand()) { cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT * FROM Packages WHERE [Key] = @key"; cmd.Parameters.AddWithValue("@key", package.Key); var result = cmd.ExecuteReader(); packageRecord.Load(result); } var registrationRecord = new DataTable(); using (SqlCommand cmd = sqlConnection.CreateCommand()) { cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT * FROM PackageRegistrations WHERE [ID] = @id"; cmd.Parameters.AddWithValue("@id", package.Id); var result = cmd.ExecuteReader(); registrationRecord.Load(result); } // Write a delete audit record var auditRecord = new PackageAuditRecord( package.Id, package.Version, package.Hash, packageRecord, registrationRecord, PackageAuditAction.Deleted, Reason); if (WhatIf) { Log.Info("Would Write Audit Record to " + auditRecord.GetPath()); } else { Log.Info("Writing Audit Record"); var uri = Util.SaveAuditRecord(BackupStorage, auditRecord).Result; Log.Info("Successfully wrote audit record to: " + uri.AbsoluteUri); } if (package == null) { Log.Error("Package version does not exist: '{0}.{1}'", PackageId, PackageVersion); return; } if (!AuditOnly) { Log.Info( "Deleting package data for '{0}.{1}'", package.Id, package.Version); if (!WhatIf && !AuditOnly) { dbExecutor.Execute( "DELETE pa FROM PackageAuthors pa JOIN Packages p ON p.[Key] = pa.PackageKey WHERE p.[Key] = @key", new { key = package.Key }); dbExecutor.Execute( "DELETE pd FROM PackageDependencies pd JOIN Packages p ON p.[Key] = pd.PackageKey WHERE p.[Key] = @key", new { key = package.Key }); dbExecutor.Execute( "DELETE ps FROM PackageStatistics ps JOIN Packages p ON p.[Key] = ps.PackageKey WHERE p.[Key] = @key", new { key = package.Key }); dbExecutor.Execute( "DELETE pf FROM PackageFrameworks pf JOIN Packages p ON p.[Key] = pf.Package_Key WHERE p.[Key] = @key", new { key = package.Key }); dbExecutor.Execute( "DELETE p FROM Packages p JOIN PackageRegistrations pr ON pr.[Key] = p.PackageRegistrationKey WHERE p.[Key] = @key", new { key = package.Key }); } new DeletePackageFileTask { BackupStorage = BackupStorage, StorageAccount = StorageAccount, PackageId = package.Id, PackageVersion = package.Version, PackageHash = package.Hash, WhatIf = WhatIf }.ExecuteCommand(); } else { Log.Info("Only wrote audit record. Package was NOT deleted."); } } }