public BuildStatus AsUnknownBuildStatus(SosDb sosDb)
        {
            var lastKnownBuild = sosDb.ReadAll(this).LastOrDefault();
            var comment = lastKnownBuild == null ? null : lastKnownBuild.Comment;
            var startedTime = lastKnownBuild == null ? null : lastKnownBuild.StartedTime;
            // SosDb doesn't store local start time, so use the server's start time
            var localStartTime = lastKnownBuild == null ? DateTime.MinValue : lastKnownBuild.StartedTime ?? DateTime.MinValue;
            var buildId = lastKnownBuild == null ? null : lastKnownBuild.BuildId;
            var requestedBy = lastKnownBuild == null ? null : lastKnownBuild.RequestedBy;
            var finishedTime = lastKnownBuild == null ? null : lastKnownBuild.FinishedTime;
            var url = lastKnownBuild == null ? null : lastKnownBuild.Url;

            return new BuildStatus
            {
                BuildStatusEnum = BuildStatusEnum.Unknown,
                BuildDefinitionId = Id,
                Name = Name,
                StartedTime = startedTime,
                Comment = comment,
                LocalStartTime = localStartTime,
                BuildId = buildId,
                RequestedBy = requestedBy,
                FinishedTime = finishedTime,
                Url = url
            };
        }
 private void InitializeBuildStats()
 {
     if (BuildDefinitionId == null) return;
     var sosDb = new SosDb();
     var allBuilds = sosDb.ReadAll(BuildDefinitionId);
     buildStats1.GraphBuildHistory(allBuilds);
 }
        public override void Upgrade(SirenOfShameSettings settings)
        {
            SosDb sosDb = new SosDb();
            List<BuildStatus> allActiveBuildDefinitionsOrderedChronoligically = sosDb
                .ReadAll(settings.GetAllActiveBuildDefinitions())
                .OrderBy(i => i.StartedTime)
                .ToList();

            settings.People.ForEach(i => i.CalculateStats(allActiveBuildDefinitionsOrderedChronoligically));
        }
        private void RecalculateAchievements()
        {
            var sosDb = new SosDb();
            var allSettings = sosDb
                .ReadAll(_settings.GetAllActiveBuildDefinitions())
                .OrderBy(i => i.StartedTime)
                .ToList();
            foreach (var person in _settings.People)
            {
                person.TotalBuilds = 0;
                person.FailedBuilds = 0;
                person.Achievements.Clear();
                person.CumulativeBuildTime = 0;
            }
            _status.Visible = true;
            var allActiveBuildDefinitionsOrderedChronoligically = new List<BuildStatus>();
            var buildCount = allSettings.Count;
            progressBar1.Maximum = buildCount;
            foreach (var buildStatus in allSettings)
            {
                _status.Text = string.Format("Processing {0:d}", buildStatus.StartedTime);
                progressBar1.Value++;
                var person = _settings.People.FirstOrDefault(i => i.RawName == buildStatus.RequestedBy);
                if (person == null)
                {
                    _log.Error("Could not find " + buildStatus.RequestedBy);
                    continue;
                }
                person.TotalBuilds++;
                if (buildStatus.BuildStatusEnum == BuildStatusEnum.Broken)
                    person.FailedBuilds++;
                allActiveBuildDefinitionsOrderedChronoligically.Add(buildStatus);
                var newAchievements = person
                    .CalculateNewAchievements(_settings, buildStatus, allActiveBuildDefinitionsOrderedChronoligically)
                    .ToList();

                if (!newAchievements.Any()) continue;

                person.AddAchievements(newAchievements);
                foreach (var achievementLookup in newAchievements)
                {
                    NewAchievement.ShowForm(_settings, achievementLookup, person, this, modal: true);
                }
            }
            _settings.Save();
        }