示例#1
0
            protected override void ProcessInternal()
            {
                Debug.Assert(_database.TableExists(SqlTable.WuHistory));

                var selectSql = PetaPoco.Sql.Builder.Select("ID", "ProjectID", "ProjectRun", "ProjectClone", "ProjectGen", "DownloadDateTime", "COUNT(*)")
                                .From("WuHistory")
                                .GroupBy("ProjectID", "ProjectRun", "ProjectClone", "ProjectGen", "DownloadDateTime")
                                .Append("HAVING COUNT(*) > 1");

                int count      = 0;
                int totalCount = 0;

                _logger.Info("Checking for duplicate WU History entries...");

                using (var table = _database.Select(selectSql.SQL))
                {
                    int lastProgress = 0;
                    foreach (DataRow row in table.Rows)
                    {
                        var deleteSql = PetaPoco.Sql.Builder.Append("DELETE FROM WuHistory")
                                        .Where("ID < @0 AND ProjectID = @1 AND ProjectRun = @2 AND ProjectClone = @3 AND ProjectGen = @4 AND datetime(DownloadDateTime) = datetime(@5)",
                                               row.ItemArray[0], row.ItemArray[1], row.ItemArray[2], row.ItemArray[3], row.ItemArray[4], row.ItemArray[5]);

                        int result = _database.Execute(deleteSql.SQL, deleteSql.Arguments);
                        if (result != 0)
                        {
                            _logger.DebugFormat("Deleted rows: {0}", result);
                            totalCount += result;
                        }
                        count++;

                        int progress = Convert.ToInt32((count / (double)table.Rows.Count) * 100);
                        if (progress != lastProgress)
                        {
                            string message = String.Format(CultureInfo.CurrentCulture, "Deleting duplicate {0} of {1}.", count, table.Rows.Count);
                            OnProgressChanged(new ProgressChangedEventArgs(progress, message));
                            lastProgress = progress;
                        }
                    }
                }

                if (totalCount != 0)
                {
                    _logger.InfoFormat("Total number of duplicate WU History entries deleted: {0}", totalCount);
                }
            }