Skip to content

Commit fbf0bc9

Browse files
committed
refactor: consolidate row provider cache into single struct, clean up databaseType handling
1 parent 2e60b4e commit fbf0bc9

3 files changed

Lines changed: 46 additions & 45 deletions

File tree

TablePro/Core/ChangeTracking/DataChangeManager.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -776,16 +776,16 @@ final class DataChangeManager {
776776
return state
777777
}
778778

779-
func restoreState(from state: TabPendingChanges, tableName: String, databaseType: DatabaseType? = nil) {
779+
func restoreState(from state: TabPendingChanges, tableName: String, databaseType: DatabaseType) {
780780
self.tableName = tableName
781+
self.columns = state.columns
782+
self.primaryKeyColumn = state.primaryKeyColumn
783+
self.databaseType = databaseType
781784
self.changes = state.changes
782785
self.deletedRowIndices = state.deletedRowIndices
783786
self.insertedRowIndices = state.insertedRowIndices
784787
self.modifiedCells = state.modifiedCells
785788
self.insertedRowData = state.insertedRowData
786-
self.primaryKeyColumn = state.primaryKeyColumn
787-
self.columns = state.columns
788-
if let databaseType { self.databaseType = databaseType }
789789
self.hasChanges = !state.changes.isEmpty
790790
rebuildChangeIndex()
791791
}

TablePro/Views/Main/Child/MainEditorContentView.swift

Lines changed: 42 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@ private struct SortedRowsCache {
1818
let resultVersion: Int
1919
}
2020

21+
/// Per-tab row provider cache entry — groups all cache-invalidation keys together
22+
private struct RowProviderCacheEntry {
23+
let provider: InMemoryRowProvider
24+
let resultVersion: Int
25+
let metadataVersion: Int
26+
let sortState: SortState
27+
}
28+
2129
/// Main editor content with tab bar and content switching
2230
struct MainEditorContentView: View {
2331
// MARK: - Dependencies
@@ -62,10 +70,7 @@ struct MainEditorContentView: View {
6270
@State private var sortCache: [UUID: SortedRowsCache] = [:]
6371

6472
// Per-tab row provider cache — avoids recreation on every SwiftUI render.
65-
@State private var tabRowProviders: [UUID: InMemoryRowProvider] = [:]
66-
@State private var tabProviderVersions: [UUID: Int] = [:]
67-
@State private var tabProviderMetaVersions: [UUID: Int] = [:]
68-
@State private var tabProviderSortStates: [UUID: SortState] = [:]
73+
@State private var tabProviderCache: [UUID: RowProviderCacheEntry] = [:]
6974
@State private var cachedChangeManager: AnyChangeManager?
7075
@State private var favoriteDialogQuery: FavoriteDialogQuery?
7176

@@ -120,52 +125,32 @@ struct MainEditorContentView: View {
120125
let openTabIds = Set(newIds)
121126
sortCache = sortCache.filter { openTabIds.contains($0.key) }
122127
coordinator.cleanupSortCache(openTabIds: openTabIds)
123-
tabRowProviders = tabRowProviders.filter { openTabIds.contains($0.key) }
124-
tabProviderVersions = tabProviderVersions.filter { openTabIds.contains($0.key) }
125-
tabProviderMetaVersions = tabProviderMetaVersions.filter { openTabIds.contains($0.key) }
126-
tabProviderSortStates = tabProviderSortStates.filter { openTabIds.contains($0.key) }
128+
tabProviderCache = tabProviderCache.filter { openTabIds.contains($0.key) }
127129
}
128130
.onChange(of: tabManager.selectedTabId) { _, newId in
129131
updateHasQueryText()
130132

131133
guard let newId, let tab = tabManager.selectedTab else { return }
132-
if tabProviderVersions[newId] != tab.resultVersion
133-
|| tabProviderMetaVersions[newId] != tab.metadataVersion {
134-
let provider = makeRowProvider(for: tab)
135-
tabRowProviders[newId] = provider
136-
tabProviderVersions[newId] = tab.resultVersion
137-
tabProviderMetaVersions[newId] = tab.metadataVersion
138-
tabProviderSortStates[newId] = tab.sortState
134+
let cached = tabProviderCache[newId]
135+
if cached?.resultVersion != tab.resultVersion
136+
|| cached?.metadataVersion != tab.metadataVersion {
137+
cacheRowProvider(for: tab)
139138
}
140139
}
141140
.onAppear {
142141
updateHasQueryText()
143142
cachedChangeManager = AnyChangeManager(dataManager: changeManager)
144143
if let tab = tabManager.selectedTab {
145-
let provider = makeRowProvider(for: tab)
146-
tabRowProviders[tab.id] = provider
147-
tabProviderVersions[tab.id] = tab.resultVersion
148-
tabProviderMetaVersions[tab.id] = tab.metadataVersion
149-
tabProviderSortStates[tab.id] = tab.sortState
144+
cacheRowProvider(for: tab)
150145
}
151146
}
152147
.onChange(of: tabManager.selectedTab?.resultVersion) { _, newVersion in
153-
guard let tab = tabManager.selectedTab, newVersion != nil else {
154-
return
155-
}
156-
let provider = makeRowProvider(for: tab)
157-
tabRowProviders[tab.id] = provider
158-
tabProviderVersions[tab.id] = tab.resultVersion
159-
tabProviderMetaVersions[tab.id] = tab.metadataVersion
160-
tabProviderSortStates[tab.id] = tab.sortState
148+
guard let tab = tabManager.selectedTab, newVersion != nil else { return }
149+
cacheRowProvider(for: tab)
161150
}
162151
.onChange(of: tabManager.selectedTab?.metadataVersion) { _, _ in
163152
guard let tab = tabManager.selectedTab else { return }
164-
let provider = makeRowProvider(for: tab)
165-
tabRowProviders[tab.id] = provider
166-
tabProviderVersions[tab.id] = tab.resultVersion
167-
tabProviderMetaVersions[tab.id] = tab.metadataVersion
168-
tabProviderSortStates[tab.id] = tab.sortState
153+
cacheRowProvider(for: tab)
169154
}
170155
}
171156

@@ -354,16 +339,33 @@ struct MainEditorContentView: View {
354339

355340
private func rowProvider(for tab: QueryTab) -> InMemoryRowProvider {
356341
if tab.rowBuffer.isEvicted {
357-
tabRowProviders.removeValue(forKey: tab.id)
342+
tabProviderCache.removeValue(forKey: tab.id)
358343
return makeRowProvider(for: tab)
359344
}
360-
if let cached = tabRowProviders[tab.id],
361-
tabProviderVersions[tab.id] == tab.resultVersion,
362-
tabProviderMetaVersions[tab.id] == tab.metadataVersion,
363-
tabProviderSortStates[tab.id] == tab.sortState {
364-
return cached
345+
if let entry = tabProviderCache[tab.id],
346+
entry.resultVersion == tab.resultVersion,
347+
entry.metadataVersion == tab.metadataVersion,
348+
entry.sortState == tab.sortState {
349+
return entry.provider
365350
}
366-
return makeRowProvider(for: tab)
351+
let provider = makeRowProvider(for: tab)
352+
tabProviderCache[tab.id] = RowProviderCacheEntry(
353+
provider: provider,
354+
resultVersion: tab.resultVersion,
355+
metadataVersion: tab.metadataVersion,
356+
sortState: tab.sortState
357+
)
358+
return provider
359+
}
360+
361+
private func cacheRowProvider(for tab: QueryTab) {
362+
let provider = makeRowProvider(for: tab)
363+
tabProviderCache[tab.id] = RowProviderCacheEntry(
364+
provider: provider,
365+
resultVersion: tab.resultVersion,
366+
metadataVersion: tab.metadataVersion,
367+
sortState: tab.sortState
368+
)
367369
}
368370

369371
private func makeRowProvider(for tab: QueryTab) -> InMemoryRowProvider {

TablePro/Views/Main/Extensions/MainContentCoordinator+SQLPreview.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ extension MainContentCoordinator {
7575
}
7676

7777
if changeManager.hasChanges {
78-
changeManager.databaseType = dbType
7978
let editStatements = try changeManager.generateSQL()
8079
allStatements.append(contentsOf: editStatements)
8180
}

0 commit comments

Comments
 (0)