@@ -77,17 +77,24 @@ class DatabaseManager {
77
77
}
78
78
79
79
do {
80
- //Build the WHERE clause and fetch messages
81
- let whereClause : String
82
- do {
83
- if let id = _lastScannedMessageID. value {
84
- //If we've scanned previously, only search for messages with a higher ID than last time
85
- whereClause = " message.ROWID > \( id) "
86
- } else {
87
- //If we have no previous scan data, search for messages added since we first started scanning
88
- whereClause = " message.date > \( initTime) "
89
- }
80
+ //Resolve the last message ID to start scanning from
81
+ let lastMessageID : Int64
82
+
83
+ //Try to use the cached value in memory
84
+ if let lastScannedMessageID = _lastScannedMessageID. value {
85
+ lastMessageID = lastScannedMessageID
86
+ } else {
87
+ //Query the value from the database
88
+ //If no value is returned, the table is empty, and 0 is used
89
+ //because the first actual ID is always 1
90
+ let id = ( try dbConnection. scalar ( " SELECT MAX(ROWID) from message " ) as! Int64 ? ) ?? 0
91
+
92
+ lastMessageID = id
93
+ _lastScannedMessageID. value = id
90
94
}
95
+
96
+ //Build the WHERE clause and fetch messages
97
+ let whereClause = " message.ROWID > \( lastMessageID) "
91
98
let stmt = try fetchMessages ( using: dbConnection, where: whereClause)
92
99
let indices = DatabaseConverter . makeColumnIndexDict ( stmt. columnNames)
93
100
let rows = try stmt. map { row -> ( id: Int64 , messageRow: DatabaseMessageRow ? ) in
@@ -103,25 +110,17 @@ class DatabaseManager {
103
110
//Collect new additions
104
111
let ( conversationItems, looseModifiers) = DatabaseConverter . groupMessageRows ( rows. map { $0. messageRow } ) . destructured
105
112
106
- //Set to the latest message ID, only we hit a new max
107
- var updatedMessageID : Int64 ?
108
-
109
113
//Update the latest message ID
114
+ let updatedMessageID : Int64 ?
110
115
if rows. isEmpty {
111
116
updatedMessageID = nil
112
117
} else {
113
- _lastScannedMessageID. with { value in
114
- let maxID = rows. reduce ( Int64 . min) { lastID, row in
115
- max ( lastID, row. id)
116
- }
117
-
118
- if value == nil || maxID > value! {
119
- value = maxID
120
- updatedMessageID = maxID
121
- } else {
122
- updatedMessageID = nil
123
- }
118
+ let maxID = rows. reduce ( Int64 . min) { lastID, row in
119
+ max ( lastID, row. id)
124
120
}
121
+
122
+ _lastScannedMessageID. value = maxID
123
+ updatedMessageID = maxID
125
124
}
126
125
127
126
//Check for updated message states
0 commit comments