internal YamsterThread(long threadId, YamsterGroup group, YamsterCache yamsterCache) : base(yamsterCache) { this.ThreadId = threadId; this.Group = group; this.participants = YamsterUserSet.EmptyUserSet; this.dbThreadState = new DbThreadState() { ThreadId = threadId, ChangeNumber = 0 }; }
internal void SetDbThreadState(DbThreadState newValue, YamsterModelEventCollector eventCollector) { if (newValue == null) { throw new ArgumentNullException("DbThreadState"); } if (newValue.ThreadId != this.ThreadId) { throw new ArgumentException("Cannot change ID"); } this.dbThreadState = newValue; UpdateLoadedStatus(); eventCollector.NotifyAfterUpdate(this); }
void ProcessDbThreadState(DbThreadState record) { // Does the thread exist yet? YamsterThread thread; if (threadsById.TryGetValue(record.ThreadId, out thread)) { var eventCollector = new YamsterModelEventCollector(); thread.SetDbThreadState(record, eventCollector); eventCollector.FireEvents(); } else { // Stash the record and deal with it later unresolvedThreadStatesById[record.ThreadId] = record; } }
void WriteToDatabase(YamsterCoreDb yamsterCoreDb) { using (var transaction = yamsterCoreDb.BeginTransaction()) { yamsterCoreDb.DeleteEverything(markArchiveDbInactive: true); yamsterCoreDb.UpdateProperties(row => { row.CurrentNetworkId = this.networkId; }); foreach (var user in this.usersById.Values) { // NOTE: For now, deleted users are always included because they // are heavily referenced //if (this.IncludeDeletedObjects || !this.deletedUsers.Contains(user.UserId)) yamsterCoreDb.Users.InsertRecord(user); } foreach (var group in this.groupsById.Values) { if (this.IncludeDeletedObjects || !this.deletedGroups.Contains(group.GroupId)) { yamsterCoreDb.Groups.InsertRecord(group); DbGroupState groupState = new DbGroupState() { GroupId = group.GroupId }; groupState.ShowInYamster = true; yamsterCoreDb.GroupStates.InsertRecord(groupState); } } foreach (var conversation in this.conversationsById.Values) { if (this.IncludeDeletedObjects || this.notDeletedConversations.Contains(conversation.ConversationId)) { yamsterCoreDb.Conversations.InsertRecord(conversation); } } foreach (var message in this.messagesById.Values) { bool messageIsDeleted = this.deletedMessages.Contains(message.MessageId); if (this.IncludeDeletedObjects || !messageIsDeleted) { yamsterCoreDb.Messages.InsertRecord(message); DbMessageState messageState = new DbMessageState() { MessageId = message.MessageId }; messageState.Deleted = messageIsDeleted; yamsterCoreDb.MessageStates.InsertRecord(messageState); // Ensure that every message has a corresponding DbThreadState for its thread DbThreadState threadState = new DbThreadState() { ThreadId = message.ThreadId }; yamsterCoreDb.ThreadStates.InsertRecord(threadState, SQLiteConflictResolution.Ignore); } } transaction.Commit(); } }
void UpdateMessage(DbArchiveMessageRecord archiveMessage) { JsonMessage message = SQLiteJsonConverter.LoadFromJson <JsonMessage>(archiveMessage.Json); DbMessage coreMessage = new DbMessage(); coreMessage.LastFetchedUtc = archiveMessage.LastFetchedUtc; coreMessage.MessageId = message.Id; coreMessage.GroupId = archiveMessage.GroupId; coreMessage.ThreadId = message.ThreadId; coreMessage.ConversationId = message.ConversationId; coreMessage.CreatedDate = message.Created; coreMessage.SenderUserId = message.SenderId; coreMessage.MessageIdRepliedTo = message.RepliedToId ?? 0; coreMessage.LikingUserIds.AssignFrom(message.Likes.Users.Select(x => x.UserId)); foreach (var likingUser in message.Likes.Users) { // We don't get a proper UserReference for liking users, but we do get // some basic information. Write this to the Users table *only* if there // is not already some real data there. DbUser coreUser = new DbUser(); coreUser.LastFetchedUtc = archiveMessage.LastFetchedUtc; coreUser.UserId = likingUser.UserId; coreUser.FullName = likingUser.FullName ?? ""; coreUser.JobTitle = ""; coreUser.WebUrl = ""; // we could infer this from likingUser.Alias coreUser.MugshotUrl = ""; // Ignore = only write if there isn't already an existing record Users.InsertRecord(coreUser, SQLiteConflictResolution.Ignore); } coreMessage.LikesCount = message.Likes.Count; coreMessage.NotifiedUserIds.AssignFrom(message.NotifiedUserIds ?? new long[0]); coreMessage.Body = message.Body.Plain ?? ""; coreMessage.WebUrl = message.Permalink ?? ""; var firstImageAttachment = message.Attachments.Where(x => x.AttachmentType == "image").FirstOrDefault(); if (firstImageAttachment != null) { coreMessage.AttachmentFilename = firstImageAttachment.Name; coreMessage.AttachmentWebUrl = firstImageAttachment.WebUrl; coreMessage.AttachmentScaledUrlTemplate = firstImageAttachment.ScaledUrlTemplate; coreMessage.AttachmentWidth = firstImageAttachment.Width ?? 0; coreMessage.AttachmentHeight = firstImageAttachment.Height ?? 0; } if (!Enum.TryParse(message.MessageType, true, out coreMessage.MessageType)) { coreMessage.MessageType = DbMessageType.Unknown; } Messages.InsertRecord(coreMessage, SQLiteConflictResolution.Replace); DbMessageState messageState = new DbMessageState() { MessageId = archiveMessage.Id }; MessageStates.InsertRecord(messageState, SQLiteConflictResolution.Ignore); // Ensure that every message has a corresponding DbThreadState for its thread DbThreadState threadState = new DbThreadState() { ThreadId = coreMessage.ThreadId }; ThreadStates.InsertRecord(threadState, SQLiteConflictResolution.Ignore); }