@@ -160,7 +160,7 @@ impl VirtualTable {
160
160
set_updated_rows. bind_text ( 1 , row_type, sqlite:: Destructor :: STATIC ) ?;
161
161
set_updated_rows. bind_text ( 2 , id, sqlite:: Destructor :: STATIC ) ?;
162
162
set_updated_rows. exec ( ) ?;
163
- simple. had_writes = true ;
163
+ simple. record_local_write ( db ) ? ;
164
164
}
165
165
}
166
166
@@ -191,26 +191,7 @@ impl VirtualTable {
191
191
Ok ( ( ) )
192
192
}
193
193
194
- fn end_transaction ( & mut self ) -> Result < ( ) , SQLiteError > {
195
- let tx = self . current_tx . take ( ) ;
196
- if let Some ( tx) = tx {
197
- let needs_local_bucket_update = match tx. mode {
198
- CrudTransactionMode :: Manual { .. } => {
199
- // In manual mode, users need to update the $local bucket themselves.
200
- false
201
- }
202
- CrudTransactionMode :: Simple ( simple) => simple. had_writes ,
203
- } ;
204
-
205
- if needs_local_bucket_update {
206
- self . db . exec_safe ( formatcp ! ( "INSERT OR REPLACE INTO ps_buckets(name, last_op, target_op) VALUES('$local', 0, {MAX_OP_ID})" ) ) ?;
207
- }
208
- }
209
-
210
- Ok ( ( ) )
211
- }
212
-
213
- fn clear_transaction_state ( & mut self ) {
194
+ fn end_transaction ( & mut self ) {
214
195
self . current_tx = None ;
215
196
}
216
197
}
@@ -252,6 +233,15 @@ impl SimpleCrudTransactionMode {
252
233
)
253
234
} )
254
235
}
236
+
237
+ fn record_local_write ( & mut self , db : * mut sqlite:: sqlite3 ) -> Result < ( ) , ResultCode > {
238
+ if !self . had_writes {
239
+ db. exec_safe ( formatcp ! ( "INSERT OR REPLACE INTO ps_buckets(name, last_op, target_op) VALUES('$local', 0, {MAX_OP_ID})" ) ) ?;
240
+ self . had_writes = true ;
241
+ }
242
+
243
+ Ok ( ( ) )
244
+ }
255
245
}
256
246
257
247
/// A variant of `Option.get_or_insert` that handles insertions returning errors.
@@ -324,12 +314,13 @@ extern "C" fn begin(vtab: *mut sqlite::vtab) -> c_int {
324
314
325
315
extern "C" fn commit ( vtab : * mut sqlite:: vtab ) -> c_int {
326
316
let tab = unsafe { & mut * ( vtab. cast :: < VirtualTable > ( ) ) } ;
327
- vtab_result ( vtab, tab. end_transaction ( ) )
317
+ tab. end_transaction ( ) ;
318
+ ResultCode :: OK as c_int
328
319
}
329
320
330
321
extern "C" fn rollback ( vtab : * mut sqlite:: vtab ) -> c_int {
331
322
let tab = unsafe { & mut * ( vtab. cast :: < VirtualTable > ( ) ) } ;
332
- tab. clear_transaction_state ( ) ;
323
+ tab. end_transaction ( ) ;
333
324
// ps_tx will be rolled back automatically
334
325
ResultCode :: OK as c_int
335
326
}
0 commit comments