@@ -23,7 +23,7 @@ const SIMPLE_NAME: &CStr = c"powersync_crud";
23
23
24
24
// Structure:
25
25
// CREATE TABLE powersync_crud_(data TEXT, options INT HIDDEN);
26
- // CREATE TABLE powersync_crud(op TEXT, id TEXT, type TEXT, data TEXT, old_values TEXT, metadata TEXT);
26
+ // CREATE TABLE powersync_crud(op TEXT, id TEXT, type TEXT, data TEXT, old_values TEXT, metadata TEXT, options INT HIDDEN );
27
27
//
28
28
// This is a insert-only virtual table. It generates transaction ids in ps_tx, and inserts data in
29
29
// ps_crud(tx_id, data).
@@ -98,11 +98,24 @@ impl VirtualTable {
98
98
set_updated_rows,
99
99
update_local_bucket,
100
100
} => {
101
- // Columns are (op TEXT, id TEXT, type TEXT, data TEXT, old_values TEXT, metadata TEXT)
102
- let metadata = args[ 5 ] ;
101
+ // Columns are (op TEXT, id TEXT, type TEXT, data TEXT, old_values TEXT, metadata TEXT, options INT HIDDEN)
102
+ let flags = match args[ 6 ] . value_type ( ) {
103
+ sqlite_nostd:: ColumnType :: Null => TableInfoFlags :: default ( ) ,
104
+ _ => TableInfoFlags ( args[ 1 ] . int ( ) as u32 ) ,
105
+ } ;
103
106
let op = args[ 0 ] . text ( ) ;
104
107
let id = args[ 1 ] . text ( ) ;
105
108
let row_type = args[ 2 ] . text ( ) ;
109
+ let metadata = args[ 5 ] ;
110
+ let data = Self :: value_to_json ( & args[ 3 ] ) ;
111
+
112
+ if flags. include_old_only_when_changed ( )
113
+ && op == "PATCH"
114
+ && data. map ( |r| r. get ( ) ) == Some ( "{}" )
115
+ {
116
+ // Ignore this empty update
117
+ return Ok ( ( ) ) ;
118
+ }
106
119
107
120
#[ derive( Serialize ) ]
108
121
struct CrudEntry < ' a > {
@@ -121,11 +134,12 @@ impl VirtualTable {
121
134
// First, we insert into ps_crud like the manual vtab would too. We have to create
122
135
// the JSON out of the individual components for that.
123
136
stmt. bind_int64 ( 1 , current_tx. tx_id ) ?;
137
+
124
138
let serialized = serde_json:: to_string ( & CrudEntry {
125
139
op,
126
140
id,
127
141
row_type,
128
- data : Self :: value_to_json ( & args [ 3 ] ) ,
142
+ data : data ,
129
143
old : Self :: value_to_json ( & args[ 4 ] ) ,
130
144
metadata : if metadata. value_type ( ) == ColumnType :: Text {
131
145
Some ( metadata. text ( ) )
@@ -214,7 +228,7 @@ extern "C" fn connect(
214
228
let is_simple = name == SIMPLE_NAME ;
215
229
216
230
let sql = if is_simple {
217
- "CREATE TABLE powersync_crud(op TEXT, id TEXT, type TEXT, data TEXT, old_values TEXT, metadata TEXT);"
231
+ "CREATE TABLE powersync_crud(op TEXT, id TEXT, type TEXT, data TEXT, old_values TEXT, metadata TEXT, options INT HIDDEN );"
218
232
} else {
219
233
"CREATE TABLE powersync_crud_(data TEXT, options INT HIDDEN);"
220
234
} ;
0 commit comments