Skip to content

Commit df18c07

Browse files
committed
Fix migration tests
1 parent 744505a commit df18c07

File tree

3 files changed

+80
-15
lines changed

3 files changed

+80
-15
lines changed

crates/core/src/migrations.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use crate::error::{PSResult, SQLiteError};
1212
use crate::fix_data::apply_v035_fix;
1313
use crate::sync::BucketPriority;
1414

15-
pub const LATEST_VERSION: i32 = 9;
15+
pub const LATEST_VERSION: i32 = 10;
1616

1717
pub fn powersync_migrate(
1818
ctx: *mut sqlite::context,
@@ -370,5 +370,18 @@ json_object('sql', 'DELETE FROM ps_migration WHERE id >= 9')
370370
local_db.exec_safe(stmt).into_db_result(local_db)?;
371371
}
372372

373+
if current_version < 10 && target_version >= 10 {
374+
local_db
375+
.exec_safe(
376+
"\
377+
INSERT INTO ps_migration(id, down_migrations) VALUES (10, json_array(
378+
json_object('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'''),
379+
json_object('sql', 'DELETE FROM ps_migration WHERE id >= 10')
380+
));
381+
",
382+
)
383+
.into_db_result(local_db)?;
384+
}
385+
373386
Ok(())
374387
}

crates/core/src/view_admin.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ create_sqlite_text_fn!(
113113

114114
fn powersync_init_impl(
115115
ctx: *mut sqlite::context,
116-
_args: &[*mut sqlite::value],
116+
args: &[*mut sqlite::value],
117117
) -> Result<String, SQLiteError> {
118118
let local_db = ctx.db_handle();
119119

@@ -319,7 +319,7 @@ pub fn register(db: *mut sqlite::sqlite3) -> Result<(), ResultCode> {
319319
// Initialize the extension internal tables.
320320
db.create_function_v2(
321321
"powersync_init",
322-
0,
322+
-1,
323323
sqlite::UTF8,
324324
None,
325325
Some(powersync_init),

dart/test/utils/migration_fixtures.dart

Lines changed: 64 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/// The current database version
2-
const databaseVersion = 9;
2+
const databaseVersion = 10;
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.
@@ -307,6 +307,53 @@ const expectedState = <int, String>{
307307
;INSERT INTO ps_migration(id, down_migrations) VALUES(7, '[{"sql":"INSERT OR REPLACE INTO ps_kv(key, value) SELECT ''last_synced_at'', last_synced_at FROM ps_sync_state WHERE priority = 2147483647"},{"sql":"DROP TABLE ps_sync_state"},{"sql":"DELETE FROM ps_migration WHERE id >= 7"}]')
308308
;INSERT INTO ps_migration(id, down_migrations) VALUES(8, '[{"sql":"ALTER TABLE ps_sync_state RENAME TO ps_sync_state_new"},{"sql":"CREATE TABLE ps_sync_state (\n priority INTEGER NOT NULL,\n last_synced_at TEXT NOT NULL\n) STRICT"},{"sql":"INSERT INTO ps_sync_state SELECT * FROM ps_sync_state_new"},{"sql":"DROP TABLE ps_sync_state_new"},{"sql":"DELETE FROM ps_migration WHERE id >= 8"}]')
309309
;INSERT INTO ps_migration(id, down_migrations) VALUES(9, '[{"sql":"ALTER TABLE ps_buckets DROP COLUMN count_at_last"},{"sql":"ALTER TABLE ps_buckets DROP COLUMN count_since_last"},{"sql":"DELETE FROM ps_migration WHERE id >= 9"}]')
310+
''',
311+
10: r'''
312+
;CREATE TABLE ps_buckets(
313+
id INTEGER PRIMARY KEY,
314+
name TEXT NOT NULL,
315+
last_applied_op INTEGER NOT NULL DEFAULT 0,
316+
last_op INTEGER NOT NULL DEFAULT 0,
317+
target_op INTEGER NOT NULL DEFAULT 0,
318+
add_checksum INTEGER NOT NULL DEFAULT 0,
319+
op_checksum INTEGER NOT NULL DEFAULT 0,
320+
pending_delete INTEGER NOT NULL DEFAULT 0
321+
, count_at_last INTEGER NOT NULL DEFAULT 0, count_since_last INTEGER NOT NULL DEFAULT 0) STRICT
322+
;CREATE TABLE ps_crud (id INTEGER PRIMARY KEY AUTOINCREMENT, data TEXT, tx_id INTEGER)
323+
;CREATE TABLE ps_kv(key TEXT PRIMARY KEY NOT NULL, value BLOB)
324+
;CREATE TABLE ps_migration(id INTEGER PRIMARY KEY, down_migrations TEXT)
325+
;CREATE TABLE ps_oplog(
326+
bucket INTEGER NOT NULL,
327+
op_id INTEGER NOT NULL,
328+
row_type TEXT,
329+
row_id TEXT,
330+
key TEXT,
331+
data TEXT,
332+
hash INTEGER NOT NULL) STRICT
333+
;CREATE TABLE ps_sync_state (
334+
priority INTEGER NOT NULL PRIMARY KEY,
335+
last_synced_at TEXT NOT NULL
336+
) STRICT
337+
;CREATE TABLE ps_tx(id INTEGER PRIMARY KEY NOT NULL, current_tx INTEGER, next_tx INTEGER)
338+
;CREATE TABLE ps_untyped(type TEXT NOT NULL, id TEXT NOT NULL, data TEXT, PRIMARY KEY (type, id))
339+
;CREATE TABLE ps_updated_rows(
340+
row_type TEXT,
341+
row_id TEXT,
342+
PRIMARY KEY(row_type, row_id)) STRICT, WITHOUT ROWID
343+
;CREATE UNIQUE INDEX ps_buckets_name ON ps_buckets (name)
344+
;CREATE INDEX ps_oplog_key ON ps_oplog (bucket, key)
345+
;CREATE INDEX ps_oplog_opid ON ps_oplog (bucket, op_id)
346+
;CREATE INDEX ps_oplog_row ON ps_oplog (row_type, row_id)
347+
;INSERT INTO ps_migration(id, down_migrations) VALUES(1, null)
348+
;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":[]}]')
349+
;INSERT INTO ps_migration(id, down_migrations) VALUES(3, '[{"sql":"DELETE FROM ps_migration WHERE id >= 3"},{"sql":"DROP TABLE ps_kv"}]')
350+
;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"}]')
351+
;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"}]')
352+
;INSERT INTO ps_migration(id, down_migrations) VALUES(6, '[{"sql":"DELETE FROM ps_migration WHERE id >= 6"}]')
353+
;INSERT INTO ps_migration(id, down_migrations) VALUES(7, '[{"sql":"INSERT OR REPLACE INTO ps_kv(key, value) SELECT ''last_synced_at'', last_synced_at FROM ps_sync_state WHERE priority = 2147483647"},{"sql":"DROP TABLE ps_sync_state"},{"sql":"DELETE FROM ps_migration WHERE id >= 7"}]')
354+
;INSERT INTO ps_migration(id, down_migrations) VALUES(8, '[{"sql":"ALTER TABLE ps_sync_state RENAME TO ps_sync_state_new"},{"sql":"CREATE TABLE ps_sync_state (\n priority INTEGER NOT NULL,\n last_synced_at TEXT NOT NULL\n) STRICT"},{"sql":"INSERT INTO ps_sync_state SELECT * FROM ps_sync_state_new"},{"sql":"DROP TABLE ps_sync_state_new"},{"sql":"DELETE FROM ps_migration WHERE id >= 8"}]')
355+
;INSERT INTO ps_migration(id, down_migrations) VALUES(9, '[{"sql":"ALTER TABLE ps_buckets DROP COLUMN count_at_last"},{"sql":"ALTER TABLE ps_buckets DROP COLUMN count_since_last"},{"sql":"DELETE FROM ps_migration WHERE id >= 9"}]')
356+
;INSERT INTO ps_migration(id, down_migrations) VALUES(10, '[{"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":"DELETE FROM ps_migration WHERE id >= 10"}]')
310357
''',
311358
};
312359

@@ -398,6 +445,17 @@ const data1 = <int, String>{
398445
(2, 3, 'lists', 'l1', '', '{}', 3)
399446
;INSERT INTO ps_updated_rows(row_type, row_id) VALUES
400447
('lists', 'l2')
448+
''',
449+
10: r'''
450+
;INSERT INTO ps_buckets(id, name, last_applied_op, last_op, target_op, add_checksum, op_checksum, pending_delete, count_at_last, count_since_last) VALUES
451+
(1, 'b1', 0, 0, 0, 0, 120, 0, 0, 0),
452+
(2, 'b2', 0, 0, 0, 1005, 3, 0, 0, 0)
453+
;INSERT INTO ps_oplog(bucket, op_id, row_type, row_id, key, data, hash) VALUES
454+
(1, 1, 'todos', 't1', '', '{}', 100),
455+
(1, 2, 'todos', 't2', '', '{}', 20),
456+
(2, 3, 'lists', 'l1', '', '{}', 3)
457+
;INSERT INTO ps_updated_rows(row_type, row_id) VALUES
458+
('lists', 'l2')
401459
'''
402460
};
403461

@@ -442,6 +500,7 @@ final dataDown1 = <int, String>{
442500
6: data1[5]!,
443501
7: data1[5]!,
444502
8: data1[5]!,
503+
9: data1[9]!,
445504
};
446505

447506
final finalData1 = data1[databaseVersion]!;
@@ -527,9 +586,7 @@ INSTEAD OF DELETE ON "lists"
527586
FOR EACH ROW
528587
BEGIN
529588
DELETE FROM "ps_data__lists" WHERE id = OLD.id;
530-
INSERT INTO powersync_crud_(data) VALUES(json_object('op', 'DELETE', 'type', 'lists', 'id', OLD.id));
531-
INSERT OR IGNORE INTO ps_updated_rows(row_type, row_id) VALUES('lists', OLD.id);
532-
INSERT OR REPLACE INTO ps_buckets(name, last_op, target_op) VALUES('$local', 0, 9223372036854775807);
589+
INSERT INTO powersync_crud(op,id,type) VALUES ('DELETE',OLD.id,'lists');
533590
END
534591
;CREATE TRIGGER "ps_view_insert_lists"
535592
INSTEAD OF INSERT ON "lists"
@@ -541,11 +598,8 @@ END
541598
WHEN (typeof(NEW.id) != 'text')
542599
THEN RAISE (FAIL, 'id should be text')
543600
END;
544-
INSERT INTO "ps_data__lists"
545-
SELECT NEW.id, json_object('description', NEW."description");
546-
INSERT INTO powersync_crud_(data) VALUES(json_object('op', 'PUT', 'type', 'lists', 'id', NEW.id, 'data', json(powersync_diff('{}', json_object('description', NEW."description")))));
547-
INSERT OR IGNORE INTO ps_updated_rows(row_type, row_id) VALUES('lists', NEW.id);
548-
INSERT OR REPLACE INTO ps_buckets(name, last_op, target_op) VALUES('$local', 0, 9223372036854775807);
601+
INSERT INTO "ps_data__lists" SELECT NEW.id, json_object('description', NEW."description");
602+
INSERT INTO powersync_crud(op,id,type,data) VALUES ('PUT',NEW.id,'lists',json(powersync_diff('{}', json_object('description', NEW."description"))));
549603
END
550604
;CREATE TRIGGER "ps_view_update_lists"
551605
INSTEAD OF UPDATE ON "lists"
@@ -558,9 +612,7 @@ BEGIN
558612
UPDATE "ps_data__lists"
559613
SET data = json_object('description', NEW."description")
560614
WHERE id = NEW.id;
561-
INSERT INTO powersync_crud_(data, options) VALUES(json_object('op', 'PATCH', 'type', 'lists', 'id', NEW.id, 'data', json(powersync_diff(json_object('description', OLD."description"), json_object('description', NEW."description")))), 0);
562-
INSERT OR IGNORE INTO ps_updated_rows(row_type, row_id) VALUES('lists', NEW.id);
563-
INSERT OR REPLACE INTO ps_buckets(name, last_op, target_op) VALUES('$local', 0, 9223372036854775807);
615+
INSERT INTO powersync_crud(op,type,id,data,options) VALUES ('PATCH','lists',NEW.id,json(powersync_diff(json_object('description', OLD."description"), json_object('description', NEW."description"))),0);
564616
END
565617
''';
566618

0 commit comments

Comments
 (0)