@@ -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 ? {
0 commit comments