@@ -97,6 +97,7 @@ INSERT INTO ps_oplog(bucket, op_id, op, key, row_type, row_id, data, hash, super
97
97
98
98
let mut last_op: Option < i64 > = None ;
99
99
let mut add_checksum: i32 = 0 ;
100
+ let mut op_checksum: i32 = 0 ;
100
101
101
102
while iterate_statement. step ( ) ? == ResultCode :: ROW {
102
103
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
126
127
let superseded_op = supersede_statement. column_int64 ( 0 ) ?;
127
128
let supersede_checksum = supersede_statement. column_int ( 1 ) ?;
128
129
add_checksum = add_checksum. wrapping_add ( supersede_checksum) ;
130
+ op_checksum = op_checksum. wrapping_sub ( supersede_checksum) ;
129
131
130
132
if superseded_op <= last_applied_op {
131
133
// 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
172
174
173
175
insert_statement. bind_int ( 8 , checksum) ?;
174
176
insert_statement. exec ( ) ?;
177
+
178
+ op_checksum = op_checksum. wrapping_add ( checksum) ;
175
179
} else if op == "MOVE" {
176
180
add_checksum = add_checksum. wrapping_add ( checksum) ;
177
181
} else if op == "CLEAR" {
@@ -185,14 +189,15 @@ INSERT INTO ps_oplog(bucket, op_id, op, key, row_type, row_id, data, hash, super
185
189
// We also replace the checksum with the checksum of the CLEAR op.
186
190
// language=SQLite
187
191
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" ,
189
193
) ?;
190
194
clear_statement2. bind_text ( 2 , bucket, sqlite:: Destructor :: STATIC ) ?;
191
195
clear_statement2. bind_int ( 1 , checksum) ?;
192
196
clear_statement2. exec ( ) ?;
193
197
194
198
add_checksum = 0 ;
195
199
last_applied_op = 0 ;
200
+ op_checksum = 0 ;
196
201
}
197
202
}
198
203
@@ -201,12 +206,14 @@ INSERT INTO ps_oplog(bucket, op_id, op, key, row_type, row_id, data, hash, super
201
206
let statement = db. prepare_v2 (
202
207
"UPDATE ps_buckets
203
208
SET last_op = ?2,
204
- add_checksum = add_checksum + ?3
209
+ add_checksum = (add_checksum + ?3) & 0xffffffff,
210
+ op_checksum = (op_checksum + ?4) & 0xffffffff
205
211
WHERE name = ?1" ,
206
212
) ?;
207
213
statement. bind_text ( 1 , bucket, sqlite:: Destructor :: STATIC ) ?;
208
214
statement. bind_int64 ( 2 , * last_op) ?;
209
215
statement. bind_int ( 3 , add_checksum) ?;
216
+ statement. bind_int ( 4 , op_checksum) ?;
210
217
211
218
statement. exec ( ) ?;
212
219
}
@@ -216,17 +223,27 @@ INSERT INTO ps_oplog(bucket, op_id, op, key, row_type, row_id, data, hash, super
216
223
217
224
pub fn clear_remove_ops ( db : * mut sqlite:: sqlite3 , _data : & str ) -> Result < ( ) , SQLiteError > {
218
225
// 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
+ ) ?;
221
240
222
241
// language=SQLite
223
242
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
230
247
WHERE ps_buckets.name = ?1" ,
231
248
) ?;
232
249
@@ -243,9 +260,10 @@ pub fn clear_remove_ops(db: *mut sqlite::sqlite3, _data: &str) -> Result<(), SQL
243
260
// Note: Each iteration here may be run in a separate transaction.
244
261
let name = statement. column_text ( 0 ) ?;
245
262
let last_applied_op = statement. column_int64 ( 1 ) ?;
263
+ let checksum = statement. column_int ( 2 ) ?;
246
264
247
265
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 ) ?;
249
267
250
268
update_statement. exec ( ) ?;
251
269
0 commit comments