@@ -36,7 +36,8 @@ Map<int, Future<void> Function(SqliteWriteContext)> _migrationsMap = {
3636
3737Future <void > _migrateFrom0 (SqliteWriteContext ctx) async {
3838 await _createListsRawTable (ctx);
39- await insertListTriggers (ctx);
39+ // await insertListTriggers(ctx);
40+ await _updateListTrigger (ctx);
4041}
4142
4243Future <void > _createListsRawTable (SqliteWriteContext ctx) async {
@@ -52,7 +53,16 @@ CREATE TABLE IF NOT EXISTS $listsRawTable(
5253
5354Future <void > insertListTriggers (SqliteWriteContext ctx) async {
5455 final table = listsRawTable;
55- final dataJsonExpr = "json(json_object('created_at', NEW.created_at, 'name', NEW.name, 'owner_id', NEW.owner_id))" ;
56+ final dataJsonExpr = 'json(${_buildJsonObjectExpression (
57+ columns : [
58+ 'created_at' ,
59+ 'name' ,
60+ 'owner_id' ,
61+ ],
62+ columnPrefix : 'NEW' ,
63+ )})' ;
64+ // final dataJsonExpr =
65+ // "json(json_object('created_at', NEW.created_at, 'name', NEW.name, 'owner_id', NEW.owner_id))";
5666
5767 final insert = '''
5868INSERT INTO powersync_crud_(data)
@@ -81,6 +91,52 @@ CREATE TRIGGER fts_insert_trigger_todos AFTER INSERT ON ps_data__todos
8191'''); */
8292}
8393
94+ String _buildJsonObjectExpression (
95+ {required List <String > columns, String ? columnPrefix}) {
96+ final list = columns.map ((columnName) {
97+ final String key = "'$columnName '" ;
98+ final String value =
99+ columnPrefix != null ? '$columnPrefix .$columnName ' : columnName;
100+ return '$key , $value ' ;
101+ }).join (', ' );
102+
103+ return "json_object($list )" ;
104+ }
105+
106+ Future <void > _updateListTrigger (SqliteWriteContext ctx) async {
107+ final table = listsRawTable;
108+ final columns = [
109+ 'created_at' ,
110+ 'name' ,
111+ 'owner_id' ,
112+ ];
113+ final newRowJsonObj = 'json(${_buildJsonObjectExpression (
114+ columns : columns ,
115+ columnPrefix : 'NEW' ,
116+ )})' ;
117+
118+ final oldRowJsonObj = 'json(${_buildJsonObjectExpression (
119+ columns : columns ,
120+ columnPrefix : 'OLD' ,
121+ )})' ;
122+
123+ await ctx.execute ('''
124+ CREATE TRIGGER ${table }_update
125+ AFTER UPDATE ON $table
126+ FOR EACH ROW
127+ BEGIN
128+ SELECT CASE
129+ WHEN (OLD.id != NEW.id)
130+ THEN RAISE (FAIL, 'Cannot update id')
131+ END;
132+ INSERT INTO powersync_crud_(data, options)
133+ VALUES(json_object('op', 'PATCH', 'type', '$table ', 'id', NEW.id, 'data', json(powersync_diff($oldRowJsonObj , $newRowJsonObj ))), 0);
134+ --INSERT OR IGNORE INTO ps_updated_rows(row_type, row_id) VALUES('todos', NEW.id);
135+ --INSERT OR REPLACE INTO ps_buckets(name, last_op, target_op) VALUES('\$ local', 0, 9223372036854775807);
136+ END
137+ ''' );
138+ }
139+
84140Future <void > _setupSchemaVersionTable (PowerSyncDatabase db) async {
85141 await db.writeTransaction ((ctx) async {
86142 // Create a simple version table to manage migrations.
0 commit comments