Skip to content

Commit 77fafce

Browse files
gh-action-runnergh-action-runner
authored andcommitted
Squashed 'apollo-ios/' changes from 8f26ccb8..8e4cbf79
8e4cbf79 Batch writing of records to SQLite store (#498) git-subtree-dir: apollo-ios git-subtree-split: 8e4cbf79b73d1c507a8755bc4dc177576c87b534
1 parent ded9db5 commit 77fafce

File tree

3 files changed

+36
-15
lines changed

3 files changed

+36
-15
lines changed

Sources/ApolloSQLite/SQLiteDatabase.swift

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,25 @@ public protocol SQLiteDatabase {
1616

1717
func selectRawRows(forKeys keys: Set<CacheKey>) throws -> [DatabaseRow]
1818

19-
func addOrUpdateRecordString(_ recordString: String, for cacheKey: CacheKey) throws
20-
19+
func addOrUpdate(records: [(cacheKey: CacheKey, recordString: String)]) throws
20+
2121
func deleteRecord(for cacheKey: CacheKey) throws
2222

2323
func deleteRecords(matching pattern: CacheKey) throws
2424

2525
func clearDatabase(shouldVacuumOnClear: Bool) throws
2626

27+
@available(*, deprecated, renamed: "addOrUpdate(records:)")
28+
func addOrUpdateRecordString(_ recordString: String, for cacheKey: CacheKey) throws
29+
30+
}
31+
32+
extension SQLiteDatabase {
33+
34+
public func addOrUpdateRecordString(_ recordString: String, for cacheKey: CacheKey) throws {
35+
try addOrUpdate(records: [(cacheKey, recordString)])
36+
}
37+
2738
}
2839

2940
public extension SQLiteDatabase {

Sources/ApolloSQLite/SQLiteDotSwiftDatabase.swift

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,17 @@ public final class SQLiteDotSwiftDatabase: SQLiteDatabase {
4343
return DatabaseRow(cacheKey: key, storedInfo: record)
4444
}
4545
}
46-
47-
public func addOrUpdateRecordString(_ recordString: String, for cacheKey: CacheKey) throws {
48-
try self.db.run(self.records.insert(or: .replace, self.keyColumn <- cacheKey, self.recordColumn <- recordString))
46+
47+
public func addOrUpdate(records: [(cacheKey: CacheKey, recordString: String)]) throws {
48+
guard !records.isEmpty else { return }
49+
50+
let setters = records.map {
51+
[self.keyColumn <- $0.cacheKey, self.recordColumn <- $0.recordString]
52+
}
53+
54+
try self.db.run(self.records.insertMany(or: .replace, setters))
4955
}
50-
56+
5157
public func deleteRecord(for cacheKey: CacheKey) throws {
5258
let query = self.records.filter(keyColumn == cacheKey)
5359
try self.db.run(query.delete())

Sources/ApolloSQLite/SQLiteNormalizedCache.swift

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,17 +61,21 @@ public final class SQLiteNormalizedCache {
6161
var recordSet = RecordSet(records: try self.selectRecords(for: records.keys))
6262
let changedFieldKeys = recordSet.merge(records: records)
6363
let changedRecordKeys = changedFieldKeys.map { self.recordCacheKey(forFieldCacheKey: $0) }
64-
for recordKey in Set(changedRecordKeys) {
65-
if let recordFields = recordSet[recordKey]?.fields {
66-
let recordData = try SQLiteSerialization.serialize(fields: recordFields)
67-
guard let recordString = String(data: recordData, encoding: .utf8) else {
68-
assertionFailure("Serialization should yield UTF-8 data")
69-
continue
64+
65+
let serializedRecords = try Set(changedRecordKeys)
66+
.compactMap { recordKey -> (CacheKey, String)? in
67+
if let recordFields = recordSet[recordKey]?.fields {
68+
let recordData = try SQLiteSerialization.serialize(fields: recordFields)
69+
guard let recordString = String(data: recordData, encoding: .utf8) else {
70+
assertionFailure("Serialization should yield UTF-8 data")
71+
return nil
72+
}
73+
return (recordKey, recordString)
7074
}
71-
72-
try self.database.addOrUpdateRecordString(recordString, for: recordKey)
75+
return nil
7376
}
74-
}
77+
78+
try self.database.addOrUpdate(records: serializedRecords)
7579
return Set(changedFieldKeys)
7680
}
7781

0 commit comments

Comments
 (0)