Skip to content

Commit 5d64f36

Browse files
committed
Add experimental include_old and include_metadata options.
1 parent 35404c1 commit 5d64f36

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

crates/core/src/util.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ pub fn extract_table_info(
5454
json_extract(?1, '$.name') as name,
5555
ifnull(json_extract(?1, '$.view_name'), json_extract(?1, '$.name')) as view_name,
5656
json_extract(?1, '$.local_only') as local_only,
57-
json_extract(?1, '$.insert_only') as insert_only",
57+
json_extract(?1, '$.insert_only') as insert_only,
58+
json_extract(?1, '$.include_old') as include_old,
59+
json_extract(?1, '$.include_metadata') as include_metadata",
5860
)?;
5961
statement.bind_text(1, data, sqlite::Destructor::STATIC)?;
6062

crates/core/src/views.rs

+25-2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ fn powersync_view_sql_impl(
2424
let name = statement.column_text(0)?;
2525
let view_name = statement.column_text(1)?;
2626
let local_only = statement.column_int(2)? != 0;
27+
let include_metadata = statement.column_int(5)? != 0;
2728

2829
let quoted_name = quote_identifier(view_name);
2930
let internal_name = quote_internal_name(name, local_only);
@@ -48,6 +49,11 @@ fn powersync_view_sql_impl(
4849
column_values.push(foo);
4950
}
5051

52+
if include_metadata {
53+
column_names_quoted.push(quote_identifier("_metadata"));
54+
column_values.push(String::from("NULL"));
55+
}
56+
5157
let view_statement = format!(
5258
"CREATE VIEW {:}({:}) AS SELECT {:} FROM {:} -- powersync-auto-generated",
5359
quoted_name,
@@ -206,6 +212,9 @@ fn powersync_trigger_update_sql_impl(
206212
let view_name = statement.column_text(1)?;
207213
let local_only = statement.column_int(2)? != 0;
208214
let insert_only = statement.column_int(3)? != 0;
215+
// TODO: allow accepting a column list
216+
let include_old = statement.column_type(4)? == sqlite::ColumnType::Text;
217+
let include_metadata = statement.column_int(5)? != 0;
209218

210219
let quoted_name = quote_identifier(view_name);
211220
let internal_name = quote_internal_name(name, local_only);
@@ -218,6 +227,20 @@ fn powersync_trigger_update_sql_impl(
218227
let json_fragment_new = json_object_fragment("NEW", &stmt2)?;
219228
stmt2.reset()?;
220229
let json_fragment_old = json_object_fragment("OLD", &stmt2)?;
230+
let old_fragment: String;
231+
let metadata_fragment: &str;
232+
233+
if include_old {
234+
old_fragment = format!(", 'old', {:}", json_fragment_old);
235+
} else {
236+
old_fragment = String::from("");
237+
}
238+
239+
if include_metadata {
240+
metadata_fragment = ", 'metadata', NEW._metadata";
241+
} else {
242+
metadata_fragment = "";
243+
}
221244

222245
return if !local_only && !insert_only {
223246
let trigger = format!("\
@@ -232,10 +255,10 @@ BEGIN
232255
UPDATE {:}
233256
SET data = {:}
234257
WHERE id = NEW.id;
235-
INSERT INTO powersync_crud_(data) VALUES(json_object('op', 'PATCH', 'type', {:}, 'id', NEW.id, 'data', json(powersync_diff({:}, {:}))));
258+
INSERT INTO powersync_crud_(data) VALUES(json_object('op', 'PATCH', 'type', {:}, 'id', NEW.id, 'data', json(powersync_diff({:}, {:})){:}{:}));
236259
INSERT OR IGNORE INTO ps_updated_rows(row_type, row_id) VALUES({:}, NEW.id);
237260
INSERT OR REPLACE INTO ps_buckets(name, last_op, target_op) VALUES('$local', 0, {:});
238-
END", trigger_name, quoted_name, internal_name, json_fragment_new, type_string, json_fragment_old, json_fragment_new, type_string, MAX_OP_ID);
261+
END", trigger_name, quoted_name, internal_name, json_fragment_new, type_string, json_fragment_old, json_fragment_new, old_fragment, metadata_fragment, type_string, MAX_OP_ID);
239262
Ok(trigger)
240263
} else if local_only {
241264
let trigger = format!(

0 commit comments

Comments
 (0)