Skip to content

Commit 5efc625

Browse files
committed
Fix unecessary schema changes
1 parent 410cd77 commit 5efc625

File tree

8 files changed

+279
-12
lines changed

8 files changed

+279
-12
lines changed

Cargo.lock

+4-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ inherits = "release"
2929
inherits = "wasm"
3030

3131
[workspace.package]
32-
version = "0.3.13"
32+
version = "0.3.14"
3333
edition = "2021"
3434
authors = ["JourneyApps"]
3535
keywords = ["sqlite", "powersync"]

android/build.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ plugins {
66
}
77

88
group = "co.powersync"
9-
version = "0.3.13"
9+
version = "0.3.14"
1010
description = "PowerSync Core SQLite Extension"
1111

1212
repositories {

android/src/prefab/prefab.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
"name": "powersync_sqlite_core",
33
"schema_version": 2,
44
"dependencies": [],
5-
"version": "0.3.13"
5+
"version": "0.3.14"
66
}

crates/core/src/views.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ DELETE FROM {internal_name} WHERE id = OLD.id;
129129
INSERT INTO powersync_crud_(data) VALUES(json_object('op', 'DELETE', 'type', {type_string}, 'id', OLD.id{old_fragment}));
130130
INSERT OR IGNORE INTO ps_updated_rows(row_type, row_id) VALUES({type_string}, OLD.id);
131131
INSERT OR REPLACE INTO ps_buckets(name, last_op, target_op) VALUES('$local', 0, {MAX_OP_ID});
132-
END;"
132+
END"
133133
);
134134

135135
// The DELETE statement can't include metadata for the delete operation, so we create
@@ -146,7 +146,7 @@ DELETE FROM {internal_name} WHERE id = NEW.id;
146146
INSERT INTO powersync_crud_(data) VALUES(json_object('op', 'DELETE', 'type', {type_string}, 'id', NEW.id{old_fragment}, 'metadata', NEW._metadata));
147147
INSERT OR IGNORE INTO ps_updated_rows(row_type, row_id) VALUES({type_string}, NEW.id);
148148
INSERT OR REPLACE INTO ps_buckets(name, last_op, target_op) VALUES('$local', 0, {MAX_OP_ID});
149-
END;"
149+
END"
150150
).expect("writing to string should be infallible");
151151
}
152152

dart/test/schema_test.dart

+267
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,267 @@
1+
import 'dart:convert';
2+
3+
import 'package:sqlite3/common.dart';
4+
import 'package:test/test.dart';
5+
6+
import 'utils/native_test_utils.dart';
7+
8+
void main() {
9+
late CommonDatabase db;
10+
11+
setUp(() async {
12+
db = openTestDatabase();
13+
});
14+
15+
tearDown(() {
16+
db.dispose();
17+
});
18+
19+
group('Schema Tests', () {
20+
test('Schema versioning', () {
21+
// Test that powersync_replace_schema() is a no-op when the schema is not
22+
// modified.
23+
db.execute('SELECT powersync_replace_schema(?)', [json.encode(schema)]);
24+
25+
final [versionBefore] = db.select('PRAGMA schema_version');
26+
db.execute('SELECT powersync_replace_schema(?)', [json.encode(schema)]);
27+
final [versionAfter] = db.select('PRAGMA schema_version');
28+
29+
// No change
30+
expect(versionAfter['schema_version'],
31+
equals(versionBefore['schema_version']));
32+
33+
db.execute('SELECT powersync_replace_schema(?)', [json.encode(schema2)]);
34+
final [versionAfter2] = db.select('PRAGMA schema_version');
35+
36+
// Updated
37+
expect(versionAfter2['schema_version'],
38+
greaterThan(versionAfter['schema_version'] as int));
39+
40+
db.execute('SELECT powersync_replace_schema(?)', [json.encode(schema3)]);
41+
final [versionAfter3] = db.select('PRAGMA schema_version');
42+
43+
// Updated again (index)
44+
expect(versionAfter3['schema_version'],
45+
greaterThan(versionAfter2['schema_version'] as int));
46+
});
47+
});
48+
}
49+
50+
final schema = {
51+
"tables": [
52+
{
53+
"name": "assets",
54+
"view_name": null,
55+
"local_only": false,
56+
"insert_only": false,
57+
"columns": [
58+
{"name": "created_at", "type": "TEXT"},
59+
{"name": "make", "type": "TEXT"},
60+
{"name": "model", "type": "TEXT"},
61+
{"name": "serial_number", "type": "TEXT"},
62+
{"name": "quantity", "type": "INTEGER"},
63+
{"name": "user_id", "type": "TEXT"},
64+
{"name": "weight", "type": "REAL"},
65+
{"name": "description", "type": "TEXT"}
66+
],
67+
"indexes": [
68+
{
69+
"name": "makemodel",
70+
"columns": [
71+
{"name": "make", "ascending": true, "type": "TEXT"},
72+
{"name": "model", "ascending": true, "type": "TEXT"}
73+
]
74+
}
75+
]
76+
},
77+
{
78+
"name": "customers",
79+
"view_name": null,
80+
"local_only": false,
81+
"insert_only": false,
82+
"columns": [
83+
{"name": "name", "type": "TEXT"},
84+
{"name": "email", "type": "TEXT"}
85+
],
86+
"indexes": []
87+
},
88+
{
89+
"name": "logs",
90+
"view_name": null,
91+
"local_only": false,
92+
"insert_only": true,
93+
"columns": [
94+
{"name": "level", "type": "TEXT"},
95+
{"name": "content", "type": "TEXT"}
96+
],
97+
"indexes": []
98+
},
99+
{
100+
"name": "credentials",
101+
"view_name": null,
102+
"local_only": true,
103+
"insert_only": false,
104+
"columns": [
105+
{"name": "key", "type": "TEXT"},
106+
{"name": "value", "type": "TEXT"}
107+
],
108+
"indexes": []
109+
},
110+
{
111+
"name": "aliased",
112+
"view_name": "test1",
113+
"local_only": false,
114+
"insert_only": false,
115+
"columns": [
116+
{"name": "name", "type": "TEXT"}
117+
],
118+
"indexes": []
119+
}
120+
]
121+
};
122+
123+
final schema2 = {
124+
"tables": [
125+
{
126+
"name": "assets",
127+
"view_name": null,
128+
"local_only": false,
129+
"insert_only": false,
130+
"columns": [
131+
{"name": "created_at", "type": "TEXT"},
132+
{"name": "make", "type": "TEXT"},
133+
{"name": "model", "type": "TEXT"},
134+
{"name": "serial_number", "type": "TEXT"},
135+
{"name": "quantity", "type": "INTEGER"},
136+
{"name": "user_id", "type": "TEXT"},
137+
{"name": "weights", "type": "REAL"},
138+
{"name": "description", "type": "TEXT"}
139+
],
140+
"indexes": [
141+
{
142+
"name": "makemodel",
143+
"columns": [
144+
{"name": "make", "ascending": true, "type": "TEXT"},
145+
{"name": "model", "ascending": true, "type": "TEXT"}
146+
]
147+
}
148+
]
149+
},
150+
{
151+
"name": "customers",
152+
"view_name": null,
153+
"local_only": false,
154+
"insert_only": false,
155+
"columns": [
156+
{"name": "name", "type": "TEXT"},
157+
{"name": "email", "type": "TEXT"}
158+
],
159+
"indexes": []
160+
},
161+
{
162+
"name": "logs",
163+
"view_name": null,
164+
"local_only": false,
165+
"insert_only": true,
166+
"columns": [
167+
{"name": "level", "type": "TEXT"},
168+
{"name": "content", "type": "TEXT"}
169+
],
170+
"indexes": []
171+
},
172+
{
173+
"name": "credentials",
174+
"view_name": null,
175+
"local_only": true,
176+
"insert_only": false,
177+
"columns": [
178+
{"name": "key", "type": "TEXT"},
179+
{"name": "value", "type": "TEXT"}
180+
],
181+
"indexes": []
182+
},
183+
{
184+
"name": "aliased",
185+
"view_name": "test1",
186+
"local_only": false,
187+
"insert_only": false,
188+
"columns": [
189+
{"name": "name", "type": "TEXT"}
190+
],
191+
"indexes": []
192+
}
193+
]
194+
};
195+
196+
final schema3 = {
197+
"tables": [
198+
{
199+
"name": "assets",
200+
"view_name": null,
201+
"local_only": false,
202+
"insert_only": false,
203+
"columns": [
204+
{"name": "created_at", "type": "TEXT"},
205+
{"name": "make", "type": "TEXT"},
206+
{"name": "model", "type": "TEXT"},
207+
{"name": "serial_number", "type": "TEXT"},
208+
{"name": "quantity", "type": "INTEGER"},
209+
{"name": "user_id", "type": "TEXT"},
210+
{"name": "weights", "type": "REAL"},
211+
{"name": "description", "type": "TEXT"}
212+
],
213+
"indexes": [
214+
{
215+
"name": "makemodel",
216+
"columns": [
217+
{"name": "make", "ascending": true, "type": "TEXT"},
218+
{"name": "model", "ascending": false, "type": "TEXT"}
219+
]
220+
}
221+
]
222+
},
223+
{
224+
"name": "customers",
225+
"view_name": null,
226+
"local_only": false,
227+
"insert_only": false,
228+
"columns": [
229+
{"name": "name", "type": "TEXT"},
230+
{"name": "email", "type": "TEXT"}
231+
],
232+
"indexes": []
233+
},
234+
{
235+
"name": "logs",
236+
"view_name": null,
237+
"local_only": false,
238+
"insert_only": true,
239+
"columns": [
240+
{"name": "level", "type": "TEXT"},
241+
{"name": "content", "type": "TEXT"}
242+
],
243+
"indexes": []
244+
},
245+
{
246+
"name": "credentials",
247+
"view_name": null,
248+
"local_only": true,
249+
"insert_only": false,
250+
"columns": [
251+
{"name": "key", "type": "TEXT"},
252+
{"name": "value", "type": "TEXT"}
253+
],
254+
"indexes": []
255+
},
256+
{
257+
"name": "aliased",
258+
"view_name": "test1",
259+
"local_only": false,
260+
"insert_only": false,
261+
"columns": [
262+
{"name": "name", "type": "TEXT"}
263+
],
264+
"indexes": []
265+
}
266+
]
267+
};

powersync-sqlite-core.podspec

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = 'powersync-sqlite-core'
3-
s.version = '0.3.13'
3+
s.version = '0.3.14'
44
s.summary = 'PowerSync SQLite Extension'
55
s.description = <<-DESC
66
PowerSync extension for SQLite.

tool/build_xcframework.sh

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ function createXcframework() {
2828
<key>MinimumOSVersion</key>
2929
<string>11.0</string>
3030
<key>CFBundleVersion</key>
31-
<string>0.3.13</string>
31+
<string>0.3.14</string>
3232
<key>CFBundleShortVersionString</key>
33-
<string>0.3.13</string>
33+
<string>0.3.14</string>
3434
</dict>
3535
</plist>
3636
EOF

0 commit comments

Comments
 (0)