Source/NuGetGallery.Operations/Tasks/PurgePackageStatisticsTask.cs (57 lines of code) (raw):
using NuGetGallery.Operations.Common;
using System;
using System.Data;
using System.Data.SqlClient;
namespace NuGetGallery.Operations
{
[Command("purgepackagestatisticstask", "Purge Package Statistics", AltName = "purgestats", MaxArgs = 0)]
public class PurgePackageStatisticsTask : DatabaseTask
{
[Option("Connection string to the warehouse database server", AltName = "wdb")]
public SqlConnectionStringBuilder WarehouseConnectionString { get; set; }
public override void ValidateArguments()
{
base.ValidateArguments();
if (CurrentEnvironment != null && WarehouseConnectionString == null)
{
WarehouseConnectionString = CurrentEnvironment.WarehouseDatabase;
}
ArgCheck.RequiredOrConfig(WarehouseConnectionString, "WarehouseConnectionString");
}
public override void ExecuteCommand()
{
var source = ConnectionString.DataSource;
var destination = ConnectionString.DataSource;
Log.Trace("Connecting to '{0}' to replicate package statistics to '{1}'.", source, destination);
Purge(ConnectionString.ConnectionString, WarehouseConnectionString.ConnectionString);
}
private void Purge(string source, string destination)
{
Log.Trace("Purge data from the production database.");
int originalKey = ReplicatePackageStatisticsTask.GetLastOriginalKey(destination);
Log.Info("Purging PackageStatistics records that are in the warehouse. LastOriginalKey in warehouse is: {0}", originalKey);
if (!WhatIf)
{
DeletePackageStatistics(source, originalKey);
}
}
private static void DeletePackageStatistics(string connectionString, int warehouseHighWatermark)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
int iterations = 0;
int rows;
do
{
string sql = @"
DELETE TOP(50000) [PackageStatistics]
WHERE [Key] <= @OriginalKey
AND [Key] <= (SELECT DownloadStatsLastAggregatedId FROM GallerySettings)
AND [TimeStamp] < DATEADD(day, -7, GETDATE())
";
SqlCommand command = new SqlCommand(sql, connection);
command.CommandType = CommandType.Text;
SqlParameter parameter = command.CreateParameter();
parameter.DbType = DbType.Int32;
parameter.ParameterName = "@OriginalKey";
parameter.Value = warehouseHighWatermark;
command.Parameters.Add(parameter);
rows = command.ExecuteNonQuery();
}
while (rows > 0 && iterations++ < 10);
}
}
}
}