Skip to content

Commit b2c081f

Browse files
committed
Fix test
1 parent 7afb7ec commit b2c081f

File tree

8 files changed

+82
-40
lines changed

8 files changed

+82
-40
lines changed

Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ default-members = ["crates/shell", "crates/sqlite"]
99

1010
[profile.dev]
1111
panic = "abort"
12-
strip = true
1312

1413
[profile.release]
1514
panic = "abort"

crates/core/src/migrations.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -314,9 +314,9 @@ json_array(
314314
local_db
315315
.exec_safe(
316316
"\
317-
ALTER TABLE ps_buckets ADD COLUMN priority NOT NULL DEFAULT 1;
317+
ALTER TABLE ps_buckets ADD COLUMN priority INTEGER NOT NULL DEFAULT 1;
318318
INSERT INTO ps_migration(id, down_migrations)
319-
VALUES(6,
319+
VALUES(7,
320320
json_array(
321321
json_object('sql', 'ALTER TABLE ps_buckets DROP COLUMN priority'),
322322
json_object('sql', 'DELETE FROM ps_migration WHERE id >= 7')

crates/core/src/operations.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ FROM json_each(?) e",
7979
RETURNING id, last_applied_op",
8080
)?;
8181
bucket_statement.bind_text(1, bucket, sqlite::Destructor::STATIC)?;
82-
bucket_statement.bind_int(2, priority.into());
82+
bucket_statement.bind_int(2, priority.into())?;
8383
bucket_statement.step()?;
8484

8585
let bucket_id = bucket_statement.column_int64(0)?;

crates/core/src/sync_local.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,6 @@ pub fn sync_local<V: Value>(db: *mut sqlite::sqlite3, data: &V) -> Result<i64, S
5959
return Ok(0);
6060
}
6161

62-
if priority >= BucketPriority::LOWEST {
63-
todo!("Only consider changes from certain bucket priorities")
64-
}
65-
6662
// language=SQLite
6763
let statement = db
6864
.prepare_v2("SELECT name FROM sqlite_master WHERE type='table' AND name GLOB 'ps_data_*'")
@@ -84,8 +80,8 @@ pub fn sync_local<V: Value>(db: *mut sqlite::sqlite3, data: &V) -> Result<i64, S
8480
-- SELECT DISTINCT / UNION is important for cases with many duplicate ids.
8581
WITH updated_rows AS (
8682
SELECT DISTINCT b.row_type, b.row_id FROM ps_buckets AS buckets
87-
CROSS JOIN ps_oplog AS b ON b.bucket = buckets.id
88-
AND (b.op_id > buckets.last_applied_op)
83+
CROSS JOIN ps_oplog AS b ON b.bucket = buckets.id AND (b.op_id > buckets.last_applied_op)
84+
WHERE buckets.priority <= ?
8985
UNION SELECT row_type, row_id FROM ps_updated_rows
9086
)
9187
@@ -108,6 +104,7 @@ GROUP BY b.row_type, b.row_id",
108104

109105
// TODO: cache statements
110106

107+
statement.bind_int(1, priority.into())?;
111108
while statement.step().into_db_result(db)? == ResultCode::ROW {
112109
let type_name = statement.column_text(0)?;
113110
let id = statement.column_text(1)?;

crates/sqlite/build.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
fn main() {
32
let mut cfg = cc::Build::new();
43

dart/test/utils/fix_035_fixtures.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ const dataBroken = '''
1818

1919
/// Data after applying the migration fix, but before sync_local
2020
const dataMigrated = '''
21-
;INSERT INTO ps_buckets(id, name, last_applied_op, last_op, target_op, add_checksum, op_checksum, pending_delete) VALUES
22-
(1, 'b1', 0, 0, 0, 0, 120, 0),
23-
(2, 'b2', 0, 0, 0, 0, 3, 0)
21+
;INSERT INTO ps_buckets(id, name, last_applied_op, last_op, target_op, add_checksum, op_checksum, pending_delete, priority) VALUES
22+
(1, 'b1', 0, 0, 0, 0, 120, 0, 1),
23+
(2, 'b2', 0, 0, 0, 0, 3, 0, 1)
2424
;INSERT INTO ps_oplog(bucket, op_id, row_type, row_id, key, data, hash) VALUES
2525
(1, 1, 'todos', 't1', '', '{}', 100),
2626
(1, 2, 'todos', 't2', '', '{}', 20),
@@ -39,9 +39,9 @@ const dataMigrated = '''
3939

4040
/// Data after applying the migration fix and sync_local
4141
const dataFixed = '''
42-
;INSERT INTO ps_buckets(id, name, last_applied_op, last_op, target_op, add_checksum, op_checksum, pending_delete) VALUES
43-
(1, 'b1', 0, 0, 0, 0, 120, 0),
44-
(2, 'b2', 0, 0, 0, 0, 3, 0)
42+
;INSERT INTO ps_buckets(id, name, last_applied_op, last_op, target_op, add_checksum, op_checksum, pending_delete, priority) VALUES
43+
(1, 'b1', 0, 0, 0, 0, 120, 0, 1),
44+
(2, 'b2', 0, 0, 0, 0, 3, 0, 1)
4545
;INSERT INTO ps_oplog(bucket, op_id, row_type, row_id, key, data, hash) VALUES
4646
(1, 1, 'todos', 't1', '', '{}', 100),
4747
(1, 2, 'todos', 't2', '', '{}', 20),

dart/test/utils/migration_fixtures.dart

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/// The current database version
2-
const databaseVersion = 6;
2+
const databaseVersion = 7;
33

44
/// This is the base database state that we expect at various schema versions.
55
/// Generated by loading the specific library version, and exporting the schema.
@@ -172,6 +172,46 @@ const expectedState = <int, String>{
172172
;INSERT INTO ps_migration(id, down_migrations) VALUES(4, '[{"sql":"DELETE FROM ps_migration WHERE id >= 4"},{"sql":"ALTER TABLE ps_buckets DROP COLUMN op_checksum"},{"sql":"ALTER TABLE ps_buckets DROP COLUMN remove_operations"}]')
173173
;INSERT INTO ps_migration(id, down_migrations) VALUES(5, '[{"sql":"SELECT powersync_drop_view(view.name)\n FROM sqlite_master view\n WHERE view.type = ''view''\n AND view.sql GLOB ''*-- powersync-auto-generated''"},{"sql":"ALTER TABLE ps_buckets RENAME TO ps_buckets_5"},{"sql":"ALTER TABLE ps_oplog RENAME TO ps_oplog_5"},{"sql":"CREATE TABLE ps_buckets(\n name TEXT PRIMARY KEY,\n last_applied_op INTEGER NOT NULL DEFAULT 0,\n last_op INTEGER NOT NULL DEFAULT 0,\n target_op INTEGER NOT NULL DEFAULT 0,\n add_checksum INTEGER NOT NULL DEFAULT 0,\n pending_delete INTEGER NOT NULL DEFAULT 0\n, op_checksum INTEGER NOT NULL DEFAULT 0, remove_operations INTEGER NOT NULL DEFAULT 0)"},{"sql":"INSERT INTO ps_buckets(name, last_applied_op, last_op, target_op, add_checksum, op_checksum, pending_delete)\n SELECT name, last_applied_op, last_op, target_op, add_checksum, op_checksum, pending_delete FROM ps_buckets_5"},{"sql":"CREATE TABLE ps_oplog(\n bucket TEXT NOT NULL,\n op_id INTEGER NOT NULL,\n op INTEGER NOT NULL,\n row_type TEXT,\n row_id TEXT,\n key TEXT,\n data TEXT,\n hash INTEGER NOT NULL,\n superseded INTEGER NOT NULL)"},{"sql":"CREATE INDEX ps_oplog_by_row ON ps_oplog (row_type, row_id) WHERE superseded = 0"},{"sql":"CREATE INDEX ps_oplog_by_opid ON ps_oplog (bucket, op_id)"},{"sql":"CREATE INDEX ps_oplog_by_key ON ps_oplog (bucket, key) WHERE superseded = 0"},{"sql":"INSERT INTO ps_oplog(bucket, op_id, op, row_type, row_id, key, data, hash, superseded)\n SELECT ps_buckets_5.name, oplog.op_id, 3, oplog.row_type, oplog.row_id, oplog.key, oplog.data, oplog.hash, 0\n FROM ps_oplog_5 oplog\n JOIN ps_buckets_5\n ON ps_buckets_5.id = oplog.bucket"},{"sql":"DROP TABLE ps_oplog_5"},{"sql":"DROP TABLE ps_buckets_5"},{"sql":"INSERT INTO ps_oplog(bucket, op_id, op, row_type, row_id, hash, superseded)\n SELECT ''$local'', 1, 4, r.row_type, r.row_id, 0, 0\n FROM ps_updated_rows r"},{"sql":"INSERT OR REPLACE INTO ps_buckets(name, pending_delete, last_op, target_op) VALUES(''$local'', 1, 0, 9223372036854775807)"},{"sql":"DROP TABLE ps_updated_rows"},{"sql":"DELETE FROM ps_migration WHERE id >= 5"}]')
174174
;INSERT INTO ps_migration(id, down_migrations) VALUES(6, '[{"sql":"DELETE FROM ps_migration WHERE id >= 6"}]')
175+
''',
176+
7: r'''
177+
;CREATE TABLE ps_buckets(
178+
id INTEGER PRIMARY KEY,
179+
name TEXT NOT NULL,
180+
last_applied_op INTEGER NOT NULL DEFAULT 0,
181+
last_op INTEGER NOT NULL DEFAULT 0,
182+
target_op INTEGER NOT NULL DEFAULT 0,
183+
add_checksum INTEGER NOT NULL DEFAULT 0,
184+
op_checksum INTEGER NOT NULL DEFAULT 0,
185+
pending_delete INTEGER NOT NULL DEFAULT 0
186+
, priority INTEGER NOT NULL DEFAULT 1) STRICT
187+
;CREATE TABLE ps_crud (id INTEGER PRIMARY KEY AUTOINCREMENT, data TEXT, tx_id INTEGER)
188+
;CREATE TABLE ps_kv(key TEXT PRIMARY KEY NOT NULL, value BLOB)
189+
;CREATE TABLE ps_migration(id INTEGER PRIMARY KEY, down_migrations TEXT)
190+
;CREATE TABLE ps_oplog(
191+
bucket INTEGER NOT NULL,
192+
op_id INTEGER NOT NULL,
193+
row_type TEXT,
194+
row_id TEXT,
195+
key TEXT,
196+
data TEXT,
197+
hash INTEGER NOT NULL) STRICT
198+
;CREATE TABLE ps_tx(id INTEGER PRIMARY KEY NOT NULL, current_tx INTEGER, next_tx INTEGER)
199+
;CREATE TABLE ps_untyped(type TEXT NOT NULL, id TEXT NOT NULL, data TEXT, PRIMARY KEY (type, id))
200+
;CREATE TABLE ps_updated_rows(
201+
row_type TEXT,
202+
row_id TEXT,
203+
PRIMARY KEY(row_type, row_id)) STRICT, WITHOUT ROWID
204+
;CREATE UNIQUE INDEX ps_buckets_name ON ps_buckets (name)
205+
;CREATE INDEX ps_oplog_key ON ps_oplog (bucket, key)
206+
;CREATE INDEX ps_oplog_opid ON ps_oplog (bucket, op_id)
207+
;CREATE INDEX ps_oplog_row ON ps_oplog (row_type, row_id)
208+
;INSERT INTO ps_migration(id, down_migrations) VALUES(1, null)
209+
;INSERT INTO ps_migration(id, down_migrations) VALUES(2, '[{"sql":"DELETE FROM ps_migration WHERE id >= 2","params":[]},{"sql":"DROP TABLE ps_tx","params":[]},{"sql":"ALTER TABLE ps_crud DROP COLUMN tx_id","params":[]}]')
210+
;INSERT INTO ps_migration(id, down_migrations) VALUES(3, '[{"sql":"DELETE FROM ps_migration WHERE id >= 3"},{"sql":"DROP TABLE ps_kv"}]')
211+
;INSERT INTO ps_migration(id, down_migrations) VALUES(4, '[{"sql":"DELETE FROM ps_migration WHERE id >= 4"},{"sql":"ALTER TABLE ps_buckets DROP COLUMN op_checksum"},{"sql":"ALTER TABLE ps_buckets DROP COLUMN remove_operations"}]')
212+
;INSERT INTO ps_migration(id, down_migrations) VALUES(5, '[{"sql":"SELECT powersync_drop_view(view.name)\n FROM sqlite_master view\n WHERE view.type = ''view''\n AND view.sql GLOB ''*-- powersync-auto-generated''"},{"sql":"ALTER TABLE ps_buckets RENAME TO ps_buckets_5"},{"sql":"ALTER TABLE ps_oplog RENAME TO ps_oplog_5"},{"sql":"CREATE TABLE ps_buckets(\n name TEXT PRIMARY KEY,\n last_applied_op INTEGER NOT NULL DEFAULT 0,\n last_op INTEGER NOT NULL DEFAULT 0,\n target_op INTEGER NOT NULL DEFAULT 0,\n add_checksum INTEGER NOT NULL DEFAULT 0,\n pending_delete INTEGER NOT NULL DEFAULT 0\n, op_checksum INTEGER NOT NULL DEFAULT 0, remove_operations INTEGER NOT NULL DEFAULT 0)"},{"sql":"INSERT INTO ps_buckets(name, last_applied_op, last_op, target_op, add_checksum, op_checksum, pending_delete)\n SELECT name, last_applied_op, last_op, target_op, add_checksum, op_checksum, pending_delete FROM ps_buckets_5"},{"sql":"CREATE TABLE ps_oplog(\n bucket TEXT NOT NULL,\n op_id INTEGER NOT NULL,\n op INTEGER NOT NULL,\n row_type TEXT,\n row_id TEXT,\n key TEXT,\n data TEXT,\n hash INTEGER NOT NULL,\n superseded INTEGER NOT NULL)"},{"sql":"CREATE INDEX ps_oplog_by_row ON ps_oplog (row_type, row_id) WHERE superseded = 0"},{"sql":"CREATE INDEX ps_oplog_by_opid ON ps_oplog (bucket, op_id)"},{"sql":"CREATE INDEX ps_oplog_by_key ON ps_oplog (bucket, key) WHERE superseded = 0"},{"sql":"INSERT INTO ps_oplog(bucket, op_id, op, row_type, row_id, key, data, hash, superseded)\n SELECT ps_buckets_5.name, oplog.op_id, 3, oplog.row_type, oplog.row_id, oplog.key, oplog.data, oplog.hash, 0\n FROM ps_oplog_5 oplog\n JOIN ps_buckets_5\n ON ps_buckets_5.id = oplog.bucket"},{"sql":"DROP TABLE ps_oplog_5"},{"sql":"DROP TABLE ps_buckets_5"},{"sql":"INSERT INTO ps_oplog(bucket, op_id, op, row_type, row_id, hash, superseded)\n SELECT ''$local'', 1, 4, r.row_type, r.row_id, 0, 0\n FROM ps_updated_rows r"},{"sql":"INSERT OR REPLACE INTO ps_buckets(name, pending_delete, last_op, target_op) VALUES(''$local'', 1, 0, 9223372036854775807)"},{"sql":"DROP TABLE ps_updated_rows"},{"sql":"DELETE FROM ps_migration WHERE id >= 5"}]')
213+
;INSERT INTO ps_migration(id, down_migrations) VALUES(6, '[{"sql":"DELETE FROM ps_migration WHERE id >= 6"}]')
214+
;INSERT INTO ps_migration(id, down_migrations) VALUES(7, '[{"sql":"ALTER TABLE ps_buckets DROP COLUMN priority"},{"sql":"DELETE FROM ps_migration WHERE id >= 7"}]')
175215
'''
176216
};
177217

@@ -230,6 +270,17 @@ const data1 = <int, String>{
230270
(2, 3, 'lists', 'l1', '', '{}', 3)
231271
;INSERT INTO ps_updated_rows(row_type, row_id) VALUES
232272
('lists', 'l2')
273+
''',
274+
7: r'''
275+
;INSERT INTO ps_buckets(id, name, last_applied_op, last_op, target_op, add_checksum, op_checksum, pending_delete, priority) VALUES
276+
(1, 'b1', 0, 0, 0, 0, 120, 0, 1),
277+
(2, 'b2', 0, 0, 0, 1005, 3, 0, 1)
278+
;INSERT INTO ps_oplog(bucket, op_id, row_type, row_id, key, data, hash) VALUES
279+
(1, 1, 'todos', 't1', '', '{}', 100),
280+
(1, 2, 'todos', 't2', '', '{}', 20),
281+
(2, 3, 'lists', 'l1', '', '{}', 3)
282+
;INSERT INTO ps_updated_rows(row_type, row_id) VALUES
283+
('lists', 'l2')
233284
'''
234285
};
235286

@@ -270,7 +321,8 @@ final dataDown1 = <int, String>{
270321
('b1', 2, 3, 'todos', 't2', '', '{}', 20, 0),
271322
('b2', 3, 3, 'lists', 'l1', '', '{}', 3, 0)
272323
''',
273-
5: data1[5]!
324+
5: data1[5]!,
325+
6: data1[5]!,
274326
};
275327

276328
final finalData1 = data1[databaseVersion]!;

dart/test/utils/native_test_utils.dart

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'dart:ffi';
33
import 'package:sqlite3/common.dart';
44
import 'package:sqlite3/open.dart' as sqlite_open;
55
import 'package:sqlite3/sqlite3.dart';
6+
import 'package:path/path.dart' as p;
67

78
const defaultSqlitePath = 'libsqlite3.so.0';
89

@@ -13,7 +14,8 @@ CommonDatabase openTestDatabase() {
1314
return DynamicLibrary.open('libsqlite3.so.0');
1415
});
1516
sqlite_open.open.overrideFor(sqlite_open.OperatingSystem.macOS, () {
16-
return DynamicLibrary.open('libsqlite3.dylib');
17+
return DynamicLibrary.open(
18+
'/opt/homebrew/Cellar/sqlite/3.48.0/lib/libsqlite3.dylib');
1719
});
1820
var lib = DynamicLibrary.open(getLibraryForPlatform(path: libPath));
1921
var extension = SqliteExtension.inLibrary(lib, 'sqlite3_powersync_init');
@@ -22,29 +24,22 @@ CommonDatabase openTestDatabase() {
2224
}
2325

2426
String getLibraryForPlatform({String? path = "."}) {
25-
switch (Abi.current()) {
26-
case Abi.androidArm:
27-
case Abi.androidArm64:
28-
case Abi.androidX64:
29-
return '$path/libpowersync.so';
30-
case Abi.macosArm64:
31-
case Abi.macosX64:
32-
return '$path/libpowersync.dylib';
33-
case Abi.linuxX64:
34-
case Abi.linuxArm64:
35-
return '$path/libpowersync.so';
36-
case Abi.windowsX64:
37-
return '$path/powersync.dll';
38-
case Abi.androidIA32:
39-
throw ArgumentError(
27+
return p.normalize(p.absolute(switch (Abi.current()) {
28+
Abi.androidArm ||
29+
Abi.androidArm64 ||
30+
Abi.androidX64 =>
31+
'$path/libpowersync.so',
32+
Abi.macosArm64 || Abi.macosX64 => '$path/libpowersync.dylib',
33+
Abi.linuxX64 || Abi.linuxArm64 => '$path/libpowersync.so',
34+
Abi.windowsX64 => '$path/powersync.dll',
35+
Abi.androidIA32 => throw ArgumentError(
4036
'Unsupported processor architecture. X86 Android emulators are not '
4137
'supported. Please use an x86_64 emulator instead. All physical '
4238
'Android devices are supported including 32bit ARM.',
43-
);
44-
default:
45-
throw ArgumentError(
39+
),
40+
_ => throw ArgumentError(
4641
'Unsupported processor architecture "${Abi.current()}". '
4742
'Please open an issue on GitHub to request it.',
48-
);
49-
}
43+
)
44+
}));
5045
}

0 commit comments

Comments
 (0)