Skip to content

Commit 209555f

Browse files
committed
Limit the number of parameters
1 parent d9dc3e8 commit 209555f

File tree

8 files changed

+220
-100
lines changed

8 files changed

+220
-100
lines changed

Mixin/Service/DeviceTransfer/DeviceTransferServerDataSource.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ final class DeviceTransferServerDataSource {
99
private let key: DeviceTransferKey
1010
private let remotePlatform: DeviceTransferPlatform
1111
private let fileContentBuffer: UnsafeMutablePointer<UInt8>
12-
private let conversationIDs: String?
12+
private let conversationIDs: [String]?
1313
private let fromDate: String?
1414
private let needsFilterData: Bool
1515

1616
init(key: DeviceTransferKey, remotePlatform: DeviceTransferPlatform, filter: DeviceTransferFilter) {
1717
self.key = key
1818
self.remotePlatform = remotePlatform
1919
self.fileContentBuffer = .allocate(capacity: fileChunkSize)
20-
conversationIDs = filter.conversation.joinedIDs
20+
conversationIDs = filter.conversation.ids
2121
fromDate = filter.time.utcString
2222
needsFilterData = conversationIDs != nil || fromDate != nil
2323
}

Mixin/UserInterface/Controllers/DeviceTransfer/DeviceTransferFilter.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ struct DeviceTransferFilter {
2424
}
2525
}
2626

27-
var joinedIDs: String? {
27+
var ids: [String]? {
2828
switch self {
2929
case .all:
3030
return nil
3131
case .designated(let ids):
32-
return ids.joined(separator: "', '")
32+
return ids
3333
}
3434
}
3535

MixinServices/MixinServices/Database/User/DAO/ConversationDAO.swift

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -659,27 +659,46 @@ public final class ConversationDAO: UserDatabaseDAO {
659659
}
660660
}
661661

662-
public func conversations(limit: Int, after conversationId: String?, matching conversationIDs: String?) -> [Conversation] {
663-
var sql = "SELECT * FROM conversations"
662+
public func conversations(limit: Int, after conversationId: String?, matching conversationIDs: [String]?) -> [Conversation] {
664663
if let conversationIDs {
665-
sql += " WHERE conversation_id in ('\(conversationIDs)')"
664+
var totalConversations = [Conversation]()
665+
for i in stride(from: 0, to: conversationIDs.count, by: Self.maxCountOfHostParameter) {
666+
let endIndex = min(i + Self.maxCountOfHostParameter, conversationIDs.count)
667+
let ids = Array(conversationIDs[i..<endIndex]).joined(separator: "', '")
668+
var sql = "SELECT * FROM conversations WHERE conversation_id in ('\(ids)')"
669+
if let conversationId {
670+
sql += " AND ROWID > IFNULL((SELECT ROWID FROM conversations WHERE conversation_id = '\(conversationId)'), 0)"
671+
}
672+
sql += " ORDER BY ROWID LIMIT ?"
673+
let conversations: [Conversation] = db.select(with: sql, arguments: [limit])
674+
totalConversations += conversations
675+
}
676+
return totalConversations
677+
} else {
678+
var sql = "SELECT * FROM conversations"
666679
if let conversationId {
667-
sql += " AND ROWID > IFNULL((SELECT ROWID FROM conversations WHERE conversation_id = '\(conversationId)'), 0)"
680+
sql += " WHERE ROWID > IFNULL((SELECT ROWID FROM conversations WHERE conversation_id = '\(conversationId)'), 0)"
668681
}
669-
} else if let conversationId {
670-
sql += " WHERE ROWID > IFNULL((SELECT ROWID FROM conversations WHERE conversation_id = '\(conversationId)'), 0)"
682+
sql += " ORDER BY ROWID LIMIT ?"
683+
return db.select(with: sql, arguments: [limit])
671684
}
672-
sql += " ORDER BY ROWID LIMIT ?"
673-
return db.select(with: sql, arguments: [limit])
674685
}
675686

676-
public func conversationsCount(matching conversationIDs: String?) -> Int {
677-
var sql = "SELECT COUNT(*) FROM conversations"
687+
public func conversationsCount(matching conversationIDs: [String]?) -> Int {
678688
if let conversationIDs {
679-
sql += " WHERE conversation_id in ('\(conversationIDs)')"
689+
var totalCount = 0
690+
for i in stride(from: 0, to: conversationIDs.count, by: Self.maxCountOfHostParameter) {
691+
let endIndex = min(i + Self.maxCountOfHostParameter, conversationIDs.count)
692+
let ids = Array(conversationIDs[i..<endIndex]).joined(separator: "', '")
693+
let sql = "SELECT COUNT(*) FROM conversations WHERE conversation_id in ('\(ids)')"
694+
let count: Int? = db.select(with: sql)
695+
totalCount += (count ?? 0)
696+
}
697+
return totalCount
698+
} else {
699+
let count: Int? = db.select(with: "SELECT COUNT(*) FROM conversations")
700+
return count ?? 0
680701
}
681-
let count: Int? = db.select(with: sql)
682-
return count ?? 0
683702
}
684703

685704
public func save(conversation: Conversation) {

MixinServices/MixinServices/Database/User/DAO/MessageDAO.swift

Lines changed: 76 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -980,63 +980,104 @@ extension MessageDAO {
980980
silentNotification: silentNotification)
981981
}
982982

983-
public func messages(limit: Int, after messageId: String?, matching conversationIDs: String?, sinceDate date: String?) -> [Message] {
984-
var sql = "SELECT * FROM messages"
983+
public func messages(limit: Int, after messageId: String?, matching conversationIDs: [String]?, sinceDate date: String?) -> [Message] {
985984
if let conversationIDs {
986-
sql += " WHERE conversation_id in ('\(conversationIDs)')"
987-
if let date {
988-
sql += " AND created_at >= '\(date)'"
985+
var totalMessages = [Message]()
986+
for i in stride(from: 0, to: conversationIDs.count, by: Self.maxCountOfHostParameter) {
987+
let endIndex = min(i + Self.maxCountOfHostParameter, conversationIDs.count)
988+
let ids = Array(conversationIDs[i..<endIndex]).joined(separator: "', '")
989+
var sql = "SELECT * FROM messages WHERE conversation_id in ('\(ids)')"
990+
if let date {
991+
sql += " AND created_at >= '\(date)'"
992+
}
993+
if let messageId {
994+
sql += " AND ROWID > IFNULL((SELECT ROWID FROM messages WHERE id = '\(messageId)'), 0)"
995+
}
996+
sql += " ORDER BY ROWID LIMIT ?"
997+
let messages: [Message] = db.select(with: sql, arguments: [limit])
998+
totalMessages += messages
989999
}
990-
if let messageId {
991-
sql += " AND ROWID > IFNULL((SELECT ROWID FROM messages WHERE id = '\(messageId)'), 0)"
1000+
return totalMessages
1001+
} else {
1002+
var sql = "SELECT * FROM messages"
1003+
if let date {
1004+
sql += " WHERE created_at >= '\(date)'"
9921005
}
993-
} else if let date {
994-
sql += " WHERE created_at >= '\(date)'"
9951006
if let messageId {
996-
sql += " AND ROWID > IFNULL((SELECT ROWID FROM messages WHERE id = '\(messageId)'), 0)"
1007+
sql += date == nil ? " WHERE " : " AND "
1008+
sql += "ROWID > IFNULL((SELECT ROWID FROM messages WHERE id = '\(messageId)'), 0)"
9971009
}
998-
} else if let messageId {
999-
sql += " WHERE ROWID > IFNULL((SELECT ROWID FROM messages WHERE id = '\(messageId)'), 0)"
1010+
sql += " ORDER BY ROWID LIMIT ?"
1011+
return db.select(with: sql, arguments: [limit])
10001012
}
1001-
sql += " ORDER BY ROWID LIMIT ?"
1002-
return db.select(with: sql, arguments: [limit])
10031013
}
10041014

1005-
public func messagesCount(matching conversationIDs: String?, sinceDate date: String?) -> Int {
1006-
var sql = "SELECT COUNT(*) FROM messages"
1015+
public func messagesCount(matching conversationIDs: [String]?, sinceDate date: String?) -> Int {
10071016
if let conversationIDs {
1008-
sql += " WHERE conversation_id in ('\(conversationIDs)')"
1017+
var totalCount = 0
1018+
for i in stride(from: 0, to: conversationIDs.count, by: Self.maxCountOfHostParameter) {
1019+
let endIndex = min(i + Self.maxCountOfHostParameter, conversationIDs.count)
1020+
let ids = Array(conversationIDs[i..<endIndex]).joined(separator: "', '")
1021+
var sql = "SELECT COUNT(*) FROM messages WHERE conversation_id in ('\(ids)')"
1022+
if let date {
1023+
sql += " AND created_at >= '\(date)'"
1024+
}
1025+
let count: Int? = db.select(with: sql)
1026+
totalCount += (count ?? 0)
1027+
}
1028+
return totalCount
1029+
} else {
1030+
var sql = "SELECT COUNT(*) FROM messages"
10091031
if let date {
1010-
sql += " AND created_at >= '\(date)'"
1032+
sql += " WHERE created_at >= '\(date)'"
10111033
}
1012-
} else if let date {
1013-
sql += " WHERE created_at >= '\(date)'"
1034+
let count: Int? = db.select(with: sql)
1035+
return count ?? 0
10141036
}
1015-
let count: Int? = db.select(with: sql)
1016-
return count ?? 0
10171037
}
10181038

1019-
public func mediaMessagesCount(matching conversationIDs: String?) -> Int {
1039+
public func mediaMessagesCount(matching conversationIDs: [String]?) -> Int {
10201040
let categories = MessageCategory.allMediaCategories.map(\.rawValue).joined(separator: "', '")
1021-
var sql = "SELECT COUNT(*) FROM messages WHERE category in ('\(categories)')"
10221041
if let conversationIDs {
1023-
sql += " AND conversation_id in ('\(conversationIDs)')"
1042+
var totalCount = 0
1043+
for i in stride(from: 0, to: conversationIDs.count, by: Self.maxCountOfHostParameter) {
1044+
let endIndex = min(i + Self.maxCountOfHostParameter, conversationIDs.count)
1045+
let ids = Array(conversationIDs[i..<endIndex]).joined(separator: "', '")
1046+
var sql = "SELECT COUNT(*) FROM messages WHERE conversation_id in ('\(ids)') AND category in ('\(categories)')"
1047+
let count: Int? = db.select(with: sql)
1048+
totalCount += (count ?? 0)
1049+
}
1050+
return totalCount
1051+
} else {
1052+
var sql = "SELECT COUNT(*) FROM messages WHERE category in ('\(categories)')"
1053+
let count: Int? = db.select(with: sql)
1054+
return count ?? 0
10241055
}
1025-
let count: Int? = db.select(with: sql)
1026-
return count ?? 0
10271056
}
10281057

1029-
public func transcriptMessageCount(matching conversationIDs: String?, sinceDate date: String?) -> Int {
1058+
public func transcriptMessageCount(matching conversationIDs: [String]?, sinceDate date: String?) -> Int {
10301059
let categories = MessageCategory.transcriptCategories.map(\.rawValue).joined(separator: "', '")
1031-
var sql = "SELECT COUNT(*) FROM messages WHERE category in ('\(categories)')"
10321060
if let conversationIDs {
1033-
sql += " AND conversation_id in ('\(conversationIDs)')"
1034-
}
1035-
if let date {
1036-
sql += " AND created_at >= '\(date)'"
1061+
var totalCount = 0
1062+
for i in stride(from: 0, to: conversationIDs.count, by: Self.maxCountOfHostParameter) {
1063+
let endIndex = min(i + Self.maxCountOfHostParameter, conversationIDs.count)
1064+
let ids = Array(conversationIDs[i..<endIndex]).joined(separator: "', '")
1065+
var sql = "SELECT COUNT(*) FROM messages WHERE conversation_id in ('\(ids)') AND category in ('\(categories)')"
1066+
if let date {
1067+
sql += " AND created_at >= '\(date)'"
1068+
}
1069+
let count: Int? = db.select(with: sql)
1070+
totalCount += (count ?? 0)
1071+
}
1072+
return totalCount
1073+
} else {
1074+
var sql = "SELECT COUNT(*) FROM messages WHERE category in ('\(categories)')"
1075+
if let date {
1076+
sql += " AND created_at >= '\(date)'"
1077+
}
1078+
let count: Int? = db.select(with: sql)
1079+
return count ?? 0
10371080
}
1038-
let count: Int? = db.select(with: sql)
1039-
return count ?? 0
10401081
}
10411082

10421083
public func lastMessageCreatedAt() -> String? {

MixinServices/MixinServices/Database/User/DAO/MessageMentionDAO.swift

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,46 @@ public final class MessageMentionDAO: UserDatabaseDAO {
1515
return db.select(with: sql, arguments: [conversationId])
1616
}
1717

18-
public func messageMentions(limit: Int, after messageId: String?, matching conversationIDs: String?) -> [MessageMention] {
19-
var sql = "SELECT * FROM message_mentions"
18+
public func messageMentions(limit: Int, after messageId: String?, matching conversationIDs: [String]?) -> [MessageMention] {
2019
if let conversationIDs {
21-
sql += " WHERE conversation_id in ('\(conversationIDs)')"
20+
var totalMessageMentions = [MessageMention]()
21+
for i in stride(from: 0, to: conversationIDs.count, by: Self.maxCountOfHostParameter) {
22+
let endIndex = min(i + Self.maxCountOfHostParameter, conversationIDs.count)
23+
let ids = Array(conversationIDs[i..<endIndex]).joined(separator: "', '")
24+
var sql = "SELECT * FROM message_mentions WHERE conversation_id in ('\(ids)')"
25+
if let messageId {
26+
sql += " AND ROWID > IFNULL((SELECT ROWID FROM message_mentions WHERE message_id = '\(messageId)'), 0)"
27+
}
28+
sql += " ORDER BY ROWID LIMIT ?"
29+
let messageMentions: [MessageMention] = db.select(with: sql, arguments: [limit])
30+
totalMessageMentions += messageMentions
31+
}
32+
return totalMessageMentions
33+
} else {
34+
var sql = "SELECT * FROM message_mentions"
2235
if let messageId {
23-
sql += " AND ROWID > IFNULL((SELECT ROWID FROM message_mentions WHERE message_id = '\(messageId)'), 0)"
36+
sql += " WHERE ROWID > IFNULL((SELECT ROWID FROM message_mentions WHERE message_id = '\(messageId)'), 0)"
2437
}
25-
} else if let messageId {
26-
sql += " WHERE ROWID > IFNULL((SELECT ROWID FROM message_mentions WHERE message_id = '\(messageId)'), 0)"
38+
sql += " ORDER BY ROWID LIMIT ?"
39+
return db.select(with: sql, arguments: [limit])
2740
}
28-
sql += " ORDER BY ROWID LIMIT ?"
29-
return db.select(with: sql, arguments: [limit])
3041
}
3142

32-
public func messageMentionsCount(matching conversationIDs: String?) -> Int {
33-
var sql = "SELECT COUNT(*) FROM message_mentions"
43+
public func messageMentionsCount(matching conversationIDs: [String]?) -> Int {
3444
if let conversationIDs {
35-
sql += " WHERE conversation_id in ('\(conversationIDs)')"
45+
var totalCount = 0
46+
for i in stride(from: 0, to: conversationIDs.count, by: Self.maxCountOfHostParameter) {
47+
let endIndex = min(i + Self.maxCountOfHostParameter, conversationIDs.count)
48+
let ids = Array(conversationIDs[i..<endIndex]).joined(separator: "', '")
49+
let sql = "SELECT COUNT(*) FROM message_mentions WHERE conversation_id in ('\(ids)')"
50+
let count: Int? = db.select(with: sql)
51+
totalCount += (count ?? 0)
52+
}
53+
return totalCount
54+
} else {
55+
let count: Int? = db.select(with: "SELECT COUNT(*) FROM message_mentions")
56+
return count ?? 0
3657
}
37-
let count: Int? = db.select(with: sql)
38-
return count ?? 0
3958
}
4059

4160
public func save(messageMention: MessageMention) {

MixinServices/MixinServices/Database/User/DAO/ParticipantDAO.swift

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -175,27 +175,46 @@ public final class ParticipantDAO: UserDatabaseDAO {
175175
.map({ ParticipantRequest(userId: $0.userId, role: $0.role) })
176176
}
177177

178-
public func participants(limit: Int, after conversationId: String?, with userId: String?, matching conversationIDs: String?) -> [Participant] {
179-
var sql = "SELECT * FROM participants"
178+
public func participants(limit: Int, after conversationId: String?, with userId: String?, matching conversationIDs: [String]?) -> [Participant] {
180179
if let conversationIDs {
181-
sql += " WHERE conversation_id in ('\(conversationIDs)')"
180+
var totalParticipants = [Participant]()
181+
for i in stride(from: 0, to: conversationIDs.count, by: Self.maxCountOfHostParameter) {
182+
let endIndex = min(i + Self.maxCountOfHostParameter, conversationIDs.count)
183+
let ids = Array(conversationIDs[i..<endIndex]).joined(separator: "', '")
184+
var sql = "SELECT * FROM participants WHERE conversation_id in ('\(ids)')"
185+
if let conversationId, let userId {
186+
sql += " AND ROWID > IFNULL((SELECT ROWID FROM participants WHERE conversation_id = '\(conversationId)' AND user_id = '\(userId)'), 0)"
187+
}
188+
sql += " ORDER BY ROWID LIMIT ?"
189+
let participants: [Participant] = db.select(with: sql, arguments: [limit])
190+
totalParticipants += participants
191+
}
192+
return totalParticipants
193+
} else {
194+
var sql = "SELECT * FROM participants"
182195
if let conversationId, let userId {
183-
sql += " AND ROWID > IFNULL((SELECT ROWID FROM participants WHERE conversation_id = '\(conversationId)' AND user_id = '\(userId)'), 0)"
196+
sql += " WHERE ROWID > IFNULL((SELECT ROWID FROM participants WHERE conversation_id = '\(conversationId)' AND user_id = '\(userId)'), 0)"
184197
}
185-
} else if let conversationId, let userId {
186-
sql += " WHERE ROWID > IFNULL((SELECT ROWID FROM participants WHERE conversation_id = '\(conversationId)' AND user_id = '\(userId)'), 0)"
198+
sql += " ORDER BY ROWID LIMIT ?"
199+
return db.select(with: sql, arguments: [limit])
187200
}
188-
sql += " ORDER BY ROWID LIMIT ?"
189-
return db.select(with: sql, arguments: [limit])
190201
}
191202

192-
public func participantsCount(matching conversationIDs: String?) -> Int {
193-
var sql = "SELECT COUNT(*) FROM participants"
203+
public func participantsCount(matching conversationIDs: [String]?) -> Int {
194204
if let conversationIDs {
195-
sql += " WHERE conversation_id in ('\(conversationIDs)')"
205+
var totalCount = 0
206+
for i in stride(from: 0, to: conversationIDs.count, by: Self.maxCountOfHostParameter) {
207+
let endIndex = min(i + Self.maxCountOfHostParameter, conversationIDs.count)
208+
let ids = Array(conversationIDs[i..<endIndex]).joined(separator: "', '")
209+
let sql = "SELECT COUNT(*) FROM participants WHERE conversation_id in ('\(conversationIDs)')"
210+
let count: Int? = db.select(with: sql)
211+
totalCount += (count ?? 0)
212+
}
213+
return totalCount
214+
} else {
215+
let count: Int? = db.select(with: "SELECT COUNT(*) FROM participants")
216+
return count ?? 0
196217
}
197-
let count: Int? = db.select(with: sql)
198-
return count ?? 0
199218
}
200219

201220
public func save(participant: Participant) {

0 commit comments

Comments
 (0)