@@ -55,7 +55,7 @@ enum CrudTransactionMode {
55
55
Simple {
56
56
stmt : ManagedStmt ,
57
57
set_updated_rows : ManagedStmt ,
58
- update_local_bucket : ManagedStmt ,
58
+ had_writes : bool ,
59
59
} ,
60
60
}
61
61
@@ -73,13 +73,13 @@ impl VirtualTable {
73
73
}
74
74
}
75
75
76
- fn handle_insert ( & self , args : & [ * mut sqlite:: value ] ) -> Result < ( ) , SQLiteError > {
76
+ fn handle_insert ( & mut self , args : & [ * mut sqlite:: value ] ) -> Result < ( ) , SQLiteError > {
77
77
let current_tx = self
78
78
. current_tx
79
- . as_ref ( )
79
+ . as_mut ( )
80
80
. ok_or_else ( || SQLiteError ( ResultCode :: MISUSE , Some ( String :: from ( "No tx_id" ) ) ) ) ?;
81
81
82
- match & current_tx. mode {
82
+ match & mut current_tx. mode {
83
83
CrudTransactionMode :: Manual { stmt } => {
84
84
// Columns are (data TEXT, options INT HIDDEN)
85
85
let data = args[ 0 ] . text ( ) ;
@@ -96,7 +96,7 @@ impl VirtualTable {
96
96
CrudTransactionMode :: Simple {
97
97
stmt,
98
98
set_updated_rows,
99
- update_local_bucket ,
99
+ had_writes ,
100
100
} => {
101
101
// Columns are (op TEXT, id TEXT, type TEXT, data TEXT, old_values TEXT, metadata TEXT, options INT HIDDEN)
102
102
let flags = match args[ 6 ] . value_type ( ) {
@@ -154,7 +154,7 @@ impl VirtualTable {
154
154
set_updated_rows. bind_text ( 1 , row_type, sqlite:: Destructor :: STATIC ) ?;
155
155
set_updated_rows. bind_text ( 2 , id, sqlite:: Destructor :: STATIC ) ?;
156
156
set_updated_rows. exec ( ) ?;
157
- update_local_bucket . exec ( ) ? ;
157
+ * had_writes = true ;
158
158
}
159
159
}
160
160
@@ -184,7 +184,7 @@ impl VirtualTable {
184
184
"INSERT OR IGNORE INTO ps_updated_rows(row_type, row_id) VALUES(?, ?)" ,
185
185
0 ,
186
186
) ?,
187
- update_local_bucket : db . prepare_v3 ( formatcp ! ( "INSERT OR REPLACE INTO ps_buckets(name, last_op, target_op) VALUES('$local', 0, {MAX_OP_ID})" ) , 0 ) ? ,
187
+ had_writes : false ,
188
188
}
189
189
} else {
190
190
const SQL : & str = formatcp ! (
@@ -206,7 +206,30 @@ SELECT * FROM insertion WHERE (NOT (?3 & {})) OR data->>'op' != 'PATCH' OR data-
206
206
Ok ( ( ) )
207
207
}
208
208
209
- fn end_transaction ( & mut self ) {
209
+ fn end_transaction ( & mut self ) -> Result < ( ) , SQLiteError > {
210
+ let tx = self . current_tx . take ( ) ;
211
+ if let Some ( tx) = tx {
212
+ let needs_local_bucket_update = match tx. mode {
213
+ CrudTransactionMode :: Manual { .. } => {
214
+ // In manual mode, users need to update the $local bucket themselves.
215
+ false
216
+ }
217
+ CrudTransactionMode :: Simple {
218
+ had_writes,
219
+ stmt : _,
220
+ set_updated_rows : _,
221
+ } => had_writes,
222
+ } ;
223
+
224
+ if needs_local_bucket_update {
225
+ self . db . exec_safe ( formatcp ! ( "INSERT OR REPLACE INTO ps_buckets(name, last_op, target_op) VALUES('$local', 0, {MAX_OP_ID})" ) ) ?;
226
+ }
227
+ }
228
+
229
+ Ok ( ( ) )
230
+ }
231
+
232
+ fn clear_transaction_state ( & mut self ) {
210
233
self . current_tx = None ;
211
234
}
212
235
}
@@ -269,13 +292,12 @@ extern "C" fn begin(vtab: *mut sqlite::vtab) -> c_int {
269
292
270
293
extern "C" fn commit ( vtab : * mut sqlite:: vtab ) -> c_int {
271
294
let tab = unsafe { & mut * ( vtab. cast :: < VirtualTable > ( ) ) } ;
272
- tab. end_transaction ( ) ;
273
- ResultCode :: OK as c_int
295
+ vtab_result ( vtab, tab. end_transaction ( ) )
274
296
}
275
297
276
298
extern "C" fn rollback ( vtab : * mut sqlite:: vtab ) -> c_int {
277
299
let tab = unsafe { & mut * ( vtab. cast :: < VirtualTable > ( ) ) } ;
278
- tab. end_transaction ( ) ;
300
+ tab. clear_transaction_state ( ) ;
279
301
// ps_tx will be rolled back automatically
280
302
ResultCode :: OK as c_int
281
303
}
@@ -295,7 +317,7 @@ extern "C" fn update(
295
317
ResultCode :: MISUSE as c_int
296
318
} else if rowid. value_type ( ) == sqlite:: ColumnType :: Null {
297
319
// INSERT
298
- let tab = unsafe { & * ( vtab. cast :: < VirtualTable > ( ) ) } ;
320
+ let tab = unsafe { & mut * ( vtab. cast :: < VirtualTable > ( ) ) } ;
299
321
let result = tab. handle_insert ( & args[ 2 ..] ) ;
300
322
vtab_result ( vtab, result)
301
323
} else {
0 commit comments