diff --git a/Postbox.xcodeproj/project.pbxproj b/Postbox.xcodeproj/project.pbxproj index 77b2afe207..f833cd4a5e 100644 --- a/Postbox.xcodeproj/project.pbxproj +++ b/Postbox.xcodeproj/project.pbxproj @@ -56,6 +56,8 @@ D03229EF1E6B33FD0000AF9C /* SqliteInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03229ED1E6B33FD0000AF9C /* SqliteInterface.swift */; }; D033A6F71C73D512006A2EAB /* MessageHistoryUnsentTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D033A6F61C73D512006A2EAB /* MessageHistoryUnsentTable.swift */; }; D033A6F91C73E440006A2EAB /* UnsentMessageHistoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D033A6F81C73E440006A2EAB /* UnsentMessageHistoryView.swift */; }; + D037178B20D923CA004773C8 /* CachedItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D037178A20D923CA004773C8 /* CachedItemView.swift */; }; + D037178C20D923CA004773C8 /* CachedItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D037178A20D923CA004773C8 /* CachedItemView.swift */; }; D03BCCF81C73561C0097A291 /* Table.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03BCCF71C73561C0097A291 /* Table.swift */; }; D044CA2A1C617D39002160FF /* SeedConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D044CA291C617D39002160FF /* SeedConfiguration.swift */; }; D044CA2C1C617E2D002160FF /* MessageHistoryMetadataTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D044CA2B1C617E2D002160FF /* MessageHistoryMetadataTable.swift */; }; @@ -413,6 +415,7 @@ D03229ED1E6B33FD0000AF9C /* SqliteInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SqliteInterface.swift; sourceTree = ""; }; D033A6F61C73D512006A2EAB /* MessageHistoryUnsentTable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageHistoryUnsentTable.swift; sourceTree = ""; }; D033A6F81C73E440006A2EAB /* UnsentMessageHistoryView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnsentMessageHistoryView.swift; sourceTree = ""; }; + D037178A20D923CA004773C8 /* CachedItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CachedItemView.swift; sourceTree = ""; }; D03BCCF71C73561C0097A291 /* Table.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Table.swift; sourceTree = ""; }; D044CA291C617D39002160FF /* SeedConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SeedConfiguration.swift; sourceTree = ""; }; D044CA2B1C617E2D002160FF /* MessageHistoryMetadataTable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageHistoryMetadataTable.swift; sourceTree = ""; }; @@ -860,6 +863,7 @@ D0BE3033206026C800FBE6D8 /* MessagesView.swift */, D048B4AE20A5EEAE00C79D31 /* AdditionalChatListItemsView.swift */, D06ECFC420B796DC00C576C2 /* NoticeEntryView.swift */, + D037178A20D923CA004773C8 /* CachedItemView.swift */, ); name = Views; sourceTree = ""; @@ -1154,6 +1158,7 @@ D0943AFC1FDAE074001522CC /* ChatListTopPeersView.swift in Sources */, D048B4A920A5CBE400C79D31 /* AdditionalChatListItemsTable.swift in Sources */, D073CE771DCBF3B4007511FD /* Media.swift in Sources */, + D037178C20D923CA004773C8 /* CachedItemView.swift in Sources */, D0A352F91F549D95001423DC /* InvalidatedMessageHistoryTagSummariesView.swift in Sources */, D073CE791DCBF3B4007511FD /* ChatListHole.swift in Sources */, D0F53BF41E794C6700117362 /* PeerChatStateView.swift in Sources */, @@ -1328,6 +1333,7 @@ D021E0D81DB4FD1300C6B04F /* ItemCollectionItemTable.swift in Sources */, D048B4A820A5CBE400C79D31 /* AdditionalChatListItemsTable.swift in Sources */, D0F9E85B1C565EBB00037222 /* MessageMediaTable.swift in Sources */, + D037178B20D923CA004773C8 /* CachedItemView.swift in Sources */, D049EAF01E44D9B900A2CD3A /* PostboxStateView.swift in Sources */, D0079F631D5A242500A27A2C /* ContactPeerIdsView.swift in Sources */, D0E23DE21E808A9400B9B6D2 /* ItemCollectionIdsView.swift in Sources */, diff --git a/Postbox/CachedItemView.swift b/Postbox/CachedItemView.swift new file mode 100644 index 0000000000..b1048fd3a6 --- /dev/null +++ b/Postbox/CachedItemView.swift @@ -0,0 +1,31 @@ +import Foundation + +final class MutableCachedItemView: MutablePostboxView { + private let id: ItemCacheEntryId + fileprivate var value: PostboxCoding? + + init(postbox: Postbox, id: ItemCacheEntryId) { + self.id = id + self.value = postbox.itemCacheTable.retrieve(id: id, metaTable: postbox.itemCacheMetaTable) + } + + func replay(postbox: Postbox, transaction: PostboxTransaction) -> Bool { + if transaction.updatedCacheEntryKeys.contains(self.id) { + self.value = postbox.itemCacheTable.retrieve(id: id, metaTable: postbox.itemCacheMetaTable) + return true + } + return false + } + + func immutableView() -> PostboxView { + return CachedItemView(self) + } +} + +public final class CachedItemView: PostboxView { + public let value: PostboxCoding? + + init(_ view: MutableCachedItemView) { + self.value = view.value + } +} diff --git a/Postbox/Postbox.swift b/Postbox/Postbox.swift index 7616639753..c4c1b67c0a 100644 --- a/Postbox/Postbox.swift +++ b/Postbox/Postbox.swift @@ -813,6 +813,14 @@ public final class Transaction { self.postbox?.replaceMessageTagSummary(peerId: peerId, tagMask: tagMask, namespace: namespace, count: count, maxId: maxId) } + public func getMessageIndicesWithTag(peerId: PeerId, tag: MessageTags) -> [MessageIndex] { + assert(!self.disposed) + guard let postbox = self.postbox else { + return [] + } + return postbox.messageHistoryTagsTable.earlierIndices(tag, peerId: peerId, index: nil, count: 10000) + } + public func scanMessages(peerId: PeerId, tagMask: MessageTags, _ f: (ScanMessageEntry) -> Bool) { assert(!self.disposed) self.postbox?.scanMessages(peerId: peerId, tagMask: tagMask, f) diff --git a/Postbox/Views.swift b/Postbox/Views.swift index 7c008f5768..862d96ed60 100644 --- a/Postbox/Views.swift +++ b/Postbox/Views.swift @@ -26,6 +26,7 @@ public enum PostboxViewKey: Hashable { case messages(Set) case additionalChatListItems case noticeEntry(NoticeEntryKey) + case cachedItem(ItemCacheEntryId) public var hashValue: Int { switch self { @@ -79,6 +80,8 @@ public enum PostboxViewKey: Hashable { return 11 case let .noticeEntry(key): return key.hashValue + case let .cachedItem(id): + return id.hashValue } } @@ -234,6 +237,12 @@ public enum PostboxViewKey: Hashable { } else { return false } + case let .cachedItem(id): + if case .cachedItem(id) = rhs { + return true + } else { + return false + } } } } @@ -290,5 +299,7 @@ func postboxViewForKey(postbox: Postbox, key: PostboxViewKey) -> MutablePostboxV return MutableAdditionalChatListItemsView(postbox: postbox) case let .noticeEntry(key): return MutableNoticeEntryView(postbox: postbox, key: key) + case let .cachedItem(id): + return MutableCachedItemView(postbox: postbox, id: id) } }