Skip to content

Commit c7f0946

Browse files
committed
Represent complete sync with low priority number
1 parent b61c374 commit c7f0946

File tree

6 files changed

+30
-27
lines changed

6 files changed

+30
-27
lines changed

Cargo.toml

-1
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/bucket_priority.rs

+11-6
Original file line numberDiff line numberDiff line change
@@ -5,40 +5,45 @@ use crate::error::SQLiteError;
55

66
#[repr(transparent)]
77
#[derive(Clone, Copy, PartialEq, Eq)]
8-
pub struct BucketPriority(i32);
8+
pub struct BucketPriority {
9+
pub number: i32,
10+
}
911

1012
impl BucketPriority {
1113
pub fn may_publish_with_outstanding_uploads(self) -> bool {
1214
self == BucketPriority::HIGHEST
1315
}
1416

15-
pub const HIGHEST: BucketPriority = BucketPriority(0);
17+
pub const HIGHEST: BucketPriority = BucketPriority { number: 0 };
18+
19+
/// A low priority used to represent fully-completed sync operations across all priorities.
20+
pub const SENTINEL: BucketPriority = BucketPriority { number: i32::MAX };
1621
}
1722

1823
impl TryFrom<i32> for BucketPriority {
1924
type Error = SQLiteError;
2025

2126
fn try_from(value: i32) -> Result<Self, Self::Error> {
22-
if value < BucketPriority::HIGHEST.0 {
27+
if value < BucketPriority::HIGHEST.number || value == Self::SENTINEL.number {
2328
return Err(SQLiteError(
2429
ResultCode::MISUSE,
2530
Some("Invalid bucket priority".into()),
2631
));
2732
}
2833

29-
return Ok(BucketPriority(value));
34+
return Ok(BucketPriority { number: value });
3035
}
3136
}
3237

3338
impl Into<i32> for BucketPriority {
3439
fn into(self) -> i32 {
35-
self.0
40+
self.number
3641
}
3742
}
3843

3944
impl PartialOrd<BucketPriority> for BucketPriority {
4045
fn partial_cmp(&self, other: &BucketPriority) -> Option<core::cmp::Ordering> {
41-
Some(self.0.partial_cmp(&other.0)?.reverse())
46+
Some(self.number.partial_cmp(&other.number)?.reverse())
4247
}
4348
}
4449

crates/core/src/kv.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use sqlite::ResultCode;
99
use sqlite_nostd as sqlite;
1010
use sqlite_nostd::{Connection, Context};
1111

12+
use crate::bucket_priority::BucketPriority;
1213
use crate::create_sqlite_optional_text_fn;
1314
use crate::create_sqlite_text_fn;
1415
use crate::error::SQLiteError;
@@ -46,8 +47,8 @@ fn powersync_last_synced_at_impl(
4647
let db = ctx.db_handle();
4748

4849
// language=SQLite
49-
let statement =
50-
db.prepare_v2("select last_synced_at from ps_sync_state where priority = -1")?;
50+
let statement = db.prepare_v2("select last_synced_at from ps_sync_state where priority = ?")?;
51+
statement.bind_int(1, BucketPriority::SENTINEL.into())?;
5152

5253
if statement.step()? == ResultCode::ROW {
5354
let client_id = statement.column_text(0)?;

crates/core/src/migrations.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use sqlite::ResultCode;
88
use sqlite_nostd as sqlite;
99
use sqlite_nostd::{Connection, Context};
1010

11+
use crate::bucket_priority::BucketPriority;
1112
use crate::error::{PSResult, SQLiteError};
1213
use crate::fix035::apply_v035_fix;
1314

@@ -311,26 +312,25 @@ json_array(
311312
}
312313

313314
if current_version < 7 && target_version >= 7 {
314-
local_db
315-
.exec_safe(
316-
"\
315+
const SENTINEL_PRIORITY: i32 = BucketPriority::SENTINEL.number;
316+
let stmt = format!("\
317317
CREATE TABLE ps_sync_state (
318318
priority INTEGER NOT NULL,
319319
last_synced_at TEXT NOT NULL
320320
) STRICT;
321321
INSERT OR IGNORE INTO ps_sync_state (priority, last_synced_at)
322-
SELECT -1, value from ps_kv where key = 'last_synced_at';
322+
SELECT {}, value from ps_kv where key = 'last_synced_at';
323323
324324
INSERT INTO ps_migration(id, down_migrations)
325325
VALUES(7,
326326
json_array(
327-
json_object('sql', 'INSERT OR REPLACE INTO ps_kv(key, value) SELECT ''last_synced_at'', last_synced_at FROM ps_sync_state WHERE priority = -1'),
327+
json_object('sql', 'INSERT OR REPLACE INTO ps_kv(key, value) SELECT ''last_synced_at'', last_synced_at FROM ps_sync_state WHERE priority = {}'),
328328
json_object('sql', 'DROP TABLE ps_sync_state'),
329329
json_object('sql', 'DELETE FROM ps_migration WHERE id >= 7')
330330
));
331-
",
332-
)
333-
.into_db_result(local_db)?;
331+
", SENTINEL_PRIORITY, SENTINEL_PRIORITY);
332+
333+
local_db.exec_safe(&stmt).into_db_result(local_db)?;
334334
}
335335

336336
Ok(())

crates/core/src/sync_local.rs

+7-9
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
use core::ffi::c_void;
2-
31
use alloc::collections::BTreeSet;
4-
use alloc::fmt::format;
52
use alloc::format;
63
use alloc::string::String;
74
use alloc::vec::Vec;
@@ -291,24 +288,25 @@ GROUP BY b.row_type, b.row_id",
291288
}
292289

293290
fn mark_completed(&self) -> Result<(), SQLiteError> {
294-
let priority_code = match &self.partial {
291+
let priority_code: i32 = match &self.partial {
295292
None => {
296293
// language=SQLite
297294
self.db
298295
.exec_safe("DELETE FROM ps_updated_rows")
299296
.into_db_result(self.db)?;
300-
-1
297+
BucketPriority::SENTINEL
301298
}
302-
Some(partial) => partial.priority.into(),
303-
};
299+
Some(partial) => partial.priority,
300+
}
301+
.into();
304302

305303
// Higher-priority buckets are always part of lower-priority sync operations too, so we can
306304
// delete information about higher-priority syncs (represented as lower priority numbers).
307-
// A complete sync is represented as -1.
305+
// A complete sync is represented by a number higher than the lowest priority we allow.
308306
// language=SQLite
309307
let stmt = self
310308
.db
311-
.prepare_v2("DELETE FROM ps_sync_state WHERE (priority < ?1) OR (?1 = -1);")
309+
.prepare_v2("DELETE FROM ps_sync_state WHERE priority < ?1;")
312310
.into_db_result(self.db)?;
313311
stmt.bind_int(1, priority_code)?;
314312
stmt.exec()?;

dart/test/utils/migration_fixtures.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ const expectedState = <int, String>{
215215
;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"}]')
216216
;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"}]')
217217
;INSERT INTO ps_migration(id, down_migrations) VALUES(6, '[{"sql":"DELETE FROM ps_migration WHERE id >= 6"}]')
218-
;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 = -1"},{"sql":"DROP TABLE ps_sync_state"},{"sql":"DELETE FROM ps_migration WHERE id >= 7"}]')
218+
;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"}]')
219219
''',
220220
};
221221

0 commit comments

Comments
 (0)