@@ -97,6 +97,7 @@ INSERT INTO ps_oplog(bucket, op_id, op, key, row_type, row_id, data, hash, super
9797
9898 let mut last_op: Option < i64 > = None ;
9999 let mut add_checksum: i32 = 0 ;
100+ let mut op_checksum: i32 = 0 ;
100101
101102 while iterate_statement. step ( ) ? == ResultCode :: ROW {
102103 let op_id = iterate_statement. column_int64 ( 0 ) ?;
@@ -126,6 +127,7 @@ INSERT INTO ps_oplog(bucket, op_id, op, key, row_type, row_id, data, hash, super
126127 let superseded_op = supersede_statement. column_int64 ( 0 ) ?;
127128 let supersede_checksum = supersede_statement. column_int ( 1 ) ?;
128129 add_checksum = add_checksum. wrapping_add ( supersede_checksum) ;
130+ op_checksum = op_checksum. wrapping_sub ( supersede_checksum) ;
129131
130132 if superseded_op <= last_applied_op {
131133 // Superseded an operation previously applied - we cannot skip removes
@@ -172,6 +174,8 @@ INSERT INTO ps_oplog(bucket, op_id, op, key, row_type, row_id, data, hash, super
172174
173175 insert_statement. bind_int ( 8 , checksum) ?;
174176 insert_statement. exec ( ) ?;
177+
178+ op_checksum = op_checksum. wrapping_add ( checksum) ;
175179 } else if op == "MOVE" {
176180 add_checksum = add_checksum. wrapping_add ( checksum) ;
177181 } else if op == "CLEAR" {
@@ -185,14 +189,15 @@ INSERT INTO ps_oplog(bucket, op_id, op, key, row_type, row_id, data, hash, super
185189 // We also replace the checksum with the checksum of the CLEAR op.
186190 // language=SQLite
187191 let clear_statement2 = db. prepare_v2 (
188- "UPDATE ps_buckets SET last_applied_op = 0, add_checksum = ?1 WHERE name = ?2" ,
192+ "UPDATE ps_buckets SET last_applied_op = 0, add_checksum = ?1, op_checksum = 0 WHERE name = ?2" ,
189193 ) ?;
190194 clear_statement2. bind_text ( 2 , bucket, sqlite:: Destructor :: STATIC ) ?;
191195 clear_statement2. bind_int ( 1 , checksum) ?;
192196 clear_statement2. exec ( ) ?;
193197
194198 add_checksum = 0 ;
195199 last_applied_op = 0 ;
200+ op_checksum = 0 ;
196201 }
197202 }
198203
@@ -201,12 +206,14 @@ INSERT INTO ps_oplog(bucket, op_id, op, key, row_type, row_id, data, hash, super
201206 let statement = db. prepare_v2 (
202207 "UPDATE ps_buckets
203208 SET last_op = ?2,
204- add_checksum = add_checksum + ?3
209+ add_checksum = (add_checksum + ?3) & 0xffffffff,
210+ op_checksum = (op_checksum + ?4) & 0xffffffff
205211 WHERE name = ?1" ,
206212 ) ?;
207213 statement. bind_text ( 1 , bucket, sqlite:: Destructor :: STATIC ) ?;
208214 statement. bind_int64 ( 2 , * last_op) ?;
209215 statement. bind_int ( 3 , add_checksum) ?;
216+ statement. bind_int ( 4 , op_checksum) ?;
210217
211218 statement. exec ( ) ?;
212219 }
@@ -216,17 +223,27 @@ INSERT INTO ps_oplog(bucket, op_id, op, key, row_type, row_id, data, hash, super
216223
217224pub fn clear_remove_ops ( db : * mut sqlite:: sqlite3 , _data : & str ) -> Result < ( ) , SQLiteError > {
218225 // language=SQLite
219- let statement =
220- db. prepare_v2 ( "SELECT name, last_applied_op FROM ps_buckets WHERE pending_delete = 0" ) ?;
226+ let statement = db. prepare_v2 (
227+ "
228+ SELECT
229+ name,
230+ last_applied_op,
231+ (SELECT IFNULL(SUM(oplog.hash), 0)
232+ FROM ps_oplog oplog
233+ WHERE oplog.bucket = ps_buckets.name
234+ AND oplog.op_id <= ps_buckets.last_applied_op
235+ AND (oplog.superseded = 1 OR oplog.op != 3)
236+ ) as checksum
237+ FROM ps_buckets
238+ WHERE ps_buckets.pending_delete = 0" ,
239+ ) ?;
221240
222241 // language=SQLite
223242 let update_statement = db. prepare_v2 (
224- "UPDATE ps_buckets
225- SET add_checksum = add_checksum + (SELECT IFNULL(SUM(hash), 0)
226- FROM ps_oplog AS oplog
227- WHERE (superseded = 1 OR op != 3)
228- AND oplog.bucket = ?1
229- AND oplog.op_id <= ?2)
243+ "
244+ UPDATE ps_buckets
245+ SET add_checksum = (add_checksum + ?2) & 0xffffffff,
246+ op_checksum = (op_checksum - ?2) & 0xffffffff
230247 WHERE ps_buckets.name = ?1" ,
231248 ) ?;
232249
@@ -243,9 +260,10 @@ pub fn clear_remove_ops(db: *mut sqlite::sqlite3, _data: &str) -> Result<(), SQL
243260 // Note: Each iteration here may be run in a separate transaction.
244261 let name = statement. column_text ( 0 ) ?;
245262 let last_applied_op = statement. column_int64 ( 1 ) ?;
263+ let checksum = statement. column_int ( 2 ) ?;
246264
247265 update_statement. bind_text ( 1 , name, sqlite:: Destructor :: STATIC ) ?;
248- update_statement. bind_int64 ( 2 , last_applied_op ) ?;
266+ update_statement. bind_int ( 2 , checksum ) ?;
249267
250268 update_statement. exec ( ) ?;
251269
0 commit comments