@@ -16,10 +16,10 @@ String createViewStatement(Table table) {
16
16
17
17
if (table.insertOnly) {
18
18
final nulls = table.columns.map ((column) => 'NULL' ).join (', ' );
19
- return 'CREATE VIEW ${quoteIdentifier (table .name )}("id", $columnNames ) AS SELECT NULL, $nulls WHERE 0 $_autoGenerated ' ;
19
+ return 'CREATE VIEW ${quoteIdentifier (table .viewName )}("id", $columnNames ) AS SELECT NULL, $nulls WHERE 0 $_autoGenerated ' ;
20
20
}
21
21
final select = table.columns.map (mapColumn).join (', ' );
22
- return 'CREATE VIEW ${quoteIdentifier (table .name )}("id", $columnNames ) AS SELECT "id", $select FROM ${quoteIdentifier (table .internalName )} $_autoGenerated ' ;
22
+ return 'CREATE VIEW ${quoteIdentifier (table .viewName )}("id", $columnNames ) AS SELECT "id", $select FROM ${quoteIdentifier (table .internalName )} $_autoGenerated ' ;
23
23
}
24
24
25
25
String mapColumn (Column column) {
@@ -32,6 +32,7 @@ List<String> createViewTriggerStatements(Table table) {
32
32
} else if (table.insertOnly) {
33
33
return createViewTriggerStatementsInsert (table);
34
34
}
35
+ final viewName = table.viewName;
35
36
final type = table.name;
36
37
final internalNameE = quoteIdentifier (table.internalName);
37
38
@@ -46,16 +47,16 @@ List<String> createViewTriggerStatements(Table table) {
46
47
// Names in alphabetical order
47
48
return [
48
49
"""
49
- CREATE TRIGGER ${quoteIdentifier ('ps_view_delete_$type ' )}
50
- INSTEAD OF DELETE ON ${quoteIdentifier (type )}
50
+ CREATE TRIGGER ${quoteIdentifier ('ps_view_delete_$viewName ' )}
51
+ INSTEAD OF DELETE ON ${quoteIdentifier (viewName )}
51
52
FOR EACH ROW
52
53
BEGIN
53
54
DELETE FROM $internalNameE WHERE id = OLD.id;
54
55
INSERT INTO ps_crud(tx_id, data) SELECT current_tx, json_object('op', 'DELETE', 'type', ${quoteString (type )}, 'id', OLD.id) FROM ps_tx WHERE id = 1;
55
56
END""" ,
56
57
"""
57
- CREATE TRIGGER ${quoteIdentifier ('ps_view_insert_$type ' )}
58
- INSTEAD OF INSERT ON ${quoteIdentifier (type )}
58
+ CREATE TRIGGER ${quoteIdentifier ('ps_view_insert_$viewName ' )}
59
+ INSTEAD OF INSERT ON ${quoteIdentifier (viewName )}
59
60
FOR EACH ROW
60
61
BEGIN
61
62
SELECT CASE
76
77
INSERT OR REPLACE INTO ps_buckets(name, pending_delete, last_op, target_op) VALUES('\$ local', 1, 0, $maxOpId );
77
78
END""" ,
78
79
"""
79
- CREATE TRIGGER ${quoteIdentifier ('ps_view_update_$type ' )}
80
- INSTEAD OF UPDATE ON ${quoteIdentifier (type )}
80
+ CREATE TRIGGER ${quoteIdentifier ('ps_view_update_$viewName ' )}
81
+ INSTEAD OF UPDATE ON ${quoteIdentifier (viewName )}
81
82
FOR EACH ROW
82
83
BEGIN
83
84
SELECT CASE
@@ -102,7 +103,7 @@ END"""
102
103
}
103
104
104
105
List <String > createViewTriggerStatementsLocal (Table table) {
105
- final type = table.name ;
106
+ final viewName = table.viewName ;
106
107
final internalNameE = quoteIdentifier (table.internalName);
107
108
108
109
final jsonFragment = table.columns
@@ -112,23 +113,23 @@ List<String> createViewTriggerStatementsLocal(Table table) {
112
113
// Names in alphabetical order
113
114
return [
114
115
"""
115
- CREATE TRIGGER ${quoteIdentifier ('ps_view_delete_$type ' )}
116
- INSTEAD OF DELETE ON ${quoteIdentifier (type )}
116
+ CREATE TRIGGER ${quoteIdentifier ('ps_view_delete_$viewName ' )}
117
+ INSTEAD OF DELETE ON ${quoteIdentifier (viewName )}
117
118
FOR EACH ROW
118
119
BEGIN
119
120
DELETE FROM $internalNameE WHERE id = OLD.id;
120
121
END""" ,
121
122
"""
122
- CREATE TRIGGER ${quoteIdentifier ('ps_view_insert_$type ' )}
123
- INSTEAD OF INSERT ON ${quoteIdentifier (type )}
123
+ CREATE TRIGGER ${quoteIdentifier ('ps_view_insert_$viewName ' )}
124
+ INSTEAD OF INSERT ON ${quoteIdentifier (viewName )}
124
125
FOR EACH ROW
125
126
BEGIN
126
127
INSERT INTO $internalNameE (id, data)
127
128
SELECT NEW.id, json_object($jsonFragment );
128
129
END""" ,
129
130
"""
130
- CREATE TRIGGER ${quoteIdentifier ('ps_view_update_$type ' )}
131
- INSTEAD OF UPDATE ON ${quoteIdentifier (type )}
131
+ CREATE TRIGGER ${quoteIdentifier ('ps_view_update_$viewName ' )}
132
+ INSTEAD OF UPDATE ON ${quoteIdentifier (viewName )}
132
133
FOR EACH ROW
133
134
BEGIN
134
135
SELECT CASE
@@ -144,15 +145,16 @@ END"""
144
145
145
146
List <String > createViewTriggerStatementsInsert (Table table) {
146
147
final type = table.name;
148
+ final viewName = table.viewName;
147
149
148
150
final jsonFragment = table.columns
149
151
.map ((column) =>
150
152
"${quoteString (column .name )}, NEW.${quoteIdentifier (column .name )}" )
151
153
.join (', ' );
152
154
return [
153
155
"""
154
- CREATE TRIGGER ${quoteIdentifier ('ps_view_insert_$type ' )}
155
- INSTEAD OF INSERT ON ${quoteIdentifier (type )}
156
+ CREATE TRIGGER ${quoteIdentifier ('ps_view_insert_$viewName ' )}
157
+ INSTEAD OF INSERT ON ${quoteIdentifier (viewName )}
156
158
FOR EACH ROW
157
159
BEGIN
158
160
INSERT INTO ps_crud(tx_id, data) SELECT current_tx, json_object('op', 'PUT', 'type', ${quoteString (type )}, 'id', NEW.id, 'data', json(powersync_diff('{}', json_object($jsonFragment )))) FROM ps_tx WHERE id = 1;
@@ -164,6 +166,10 @@ END"""
164
166
///
165
167
/// Must be wrapped in a transaction.
166
168
void updateSchema (sqlite.Database db, Schema schema) {
169
+ for (var table in schema.tables) {
170
+ table.validate ();
171
+ }
172
+
167
173
_createTablesAndIndexes (db, schema);
168
174
169
175
final existingViewRows = db.select (
@@ -172,8 +178,6 @@ void updateSchema(sqlite.Database db, Schema schema) {
172
178
Set <String > toRemove = {for (var row in existingViewRows) row['name' ]};
173
179
174
180
for (var table in schema.tables) {
175
- assert (table.validName, "Invalid characters in table name: ${table .name }" );
176
-
177
181
toRemove.remove (table.name);
178
182
179
183
var createViewOp = createViewStatement (table);
0 commit comments