private void AddWeb(SEActivities activities, SEActivities.Thread thread, DataRow tr) { bool found = activities.webs.Any(w => w.id == thread.webId); if (found) { return; } lock (_locker) { found = activities.webs.Any(w => w.id == thread.webId); if (found) { return; } activities.webs.Add(new SEActivities.Web { id = thread.webId, title = (string)tr["WebTitle"], url = (string)tr["WebUrl"] }); } }
private void BuildActivities(IEnumerable <DataRow> activityRows, SEActivities activities, SEActivities.Thread thread) { Parallel.ForEach(activityRows, r => { foreach (string column in _activityDateTimeColumns) { SetLocalDateTime(r, column, _utcTimeDict, _regionalSettings); } SEActivities.Thread.Activity activity = BuildActivity(r, activities); thread.activities.Add(activity); }); }
// Private Methods (17) private void AddList(SEActivities.Thread thread, SEActivities activities, DataRow tr) { if (!thread.listId.HasValue) { return; } bool found = activities.lists.Any(list => list.id == thread.listId.Value); if (found) { return; } lock (_locker) { found = activities.lists.Any(list => list.id == thread.listId.Value); if (found) { return; } string url = string.Format("{0}/{1}?action=gotolist&webid={2}&listid={3}&nodlg=true", GetSafeWebUrl(tr["WebUrl"]), PROXY_URL, thread.webId, thread.listId); if (((ObjectKind)tr["ThreadKind"]) == ObjectKind.List) { tr["ListName"] = tr["ThreadTitle"]; } activities.lists.Add(new SEActivities.ItemList { id = thread.listId.Value, name = tr["ListName"] as string, icon = tr["ListIcon"] as string, url = url }); } }
private SEActivities.Thread BuildThread(DataRow tr, DBConnectionManager manager, int userId, int activityLimit, int commentLimit, SEActivities activities, DateTime?offset, string kind = null) { foreach (string column in _threadDateTimeColumns) { SetLocalDateTime(tr, column, _utcTimeDict, _regionalSettings); } var activityRows = new List <DataRow>(); var commentRows = new List <DataRow>(); var totalComments = (int)tr["TotalComments"]; var threadKind = (ObjectKind)tr["ThreadKind"]; bool ignoreAccess = threadKind == ObjectKind.StatusUpdate; if (!string.IsNullOrEmpty(kind)) { kind = kind.ToLower(); if (kind.Equals("activities")) { activityRows = GetThreadActivities(manager, userId, 0, 3, activityLimit, tr, offset, ignoreAccess) .AsEnumerable() .ToList(); } else if (kind.Equals("comments")) { commentRows = GetThreadActivities(manager, userId, 4, 4, commentLimit, tr, offset, ignoreAccess) .AsEnumerable() .ToList(); } } else { activityRows = GetThreadActivities(manager, userId, 0, 3, activityLimit, tr, null, ignoreAccess) .AsEnumerable() .ToList(); if (totalComments > 0) { commentRows = GetThreadActivities(manager, userId, 4, 4, commentLimit, tr, null, ignoreAccess) .AsEnumerable() .ToList(); } } int totalActivities = activityRows.Count; var webId = (Guid)tr["WebId"]; var listId = tr["ListId"] as Guid?; var itemId = tr["ItemId"] as int?; var url = tr["ThreadUrl"] as string; if (listId.HasValue && itemId.HasValue) { url = string.Format("{0}/{1}?action=view&webid={2}&listid={3}&id={4}", GetSafeWebUrl(tr["WebUrl"]), PROXY_URL, webId, listId.Value, itemId.Value); } var thread = new SEActivities.Thread { id = (Guid)tr["ThreadId"], title = HttpUtility.HtmlDecode(HttpUtility.HtmlDecode((string)tr["ThreadTitle"])), url = url, kind = ((ObjectKind)tr["ThreadKind"]).ToString(), lastActivityOn = ((DateTime)tr["ThreadLastActivityOn"]).ToString(DATE_FORMAT), firstActivityOn = ((DateTime)tr["ThreadFirstActivityOn"]).ToString(DATE_FORMAT), webId = webId, listId = listId, itemId = itemId, totalActivities = totalActivities, totalComments = totalComments }; var threadTasks = new[] { Task.Factory.StartNew(() => BuildActivities(activityRows, activities, thread)), Task.Factory.StartNew(() => BuildComments(commentRows, activities, thread)), Task.Factory.StartNew(() => AddWeb(activities, thread, tr)), Task.Factory.StartNew(() => AddList(thread, activities, tr)) }; Task.WaitAll(threadTasks); thread.activities = thread.activities.Distinct().ToList(); thread.comments = thread.comments.Distinct().ToList(); return(thread); }