Skip to main content

max / balanced_breakfast

2.0 KB · 50 lines History Blame Raw
1 -- Give user_config a sync posture.
2 --
3 -- Until now every user_config key synced unconditionally: the triggers below
4 -- enqueued a changelog row for any key, and the initial snapshot swept the whole
5 -- table. That is the shape audiofiles was hardened away from (fuzz-2026-07-06 #2,
6 -- -07-20 #1, -07-21 #3): a key naming device state must never cross the sync
7 -- boundary. The policy table is an allowlist a key only matches when its row
8 -- says replicated, seeded from the ConfigKey spec at every open
9 -- (bb_db::config_key::CONFIG, via Database::seed_config_key_policy). An
10 -- undeclared key has no row, so the filter fails closed.
11
12 CREATE TABLE IF NOT EXISTS config_key_policy (
13 key TEXT PRIMARY KEY,
14 replicated INTEGER NOT NULL
15 );
16
17 DROP TRIGGER IF EXISTS sync_user_config_insert;
18 DROP TRIGGER IF EXISTS sync_user_config_update;
19 DROP TRIGGER IF EXISTS sync_user_config_delete;
20
21 CREATE TRIGGER sync_user_config_insert AFTER INSERT ON user_config
22 WHEN (SELECT value FROM sync_state WHERE key = 'applying_remote') != '1'
23 AND EXISTS (SELECT 1 FROM config_key_policy p WHERE p.key = NEW.key AND p.replicated = 1)
24 BEGIN
25 INSERT INTO sync_changelog (table_name, op, row_id, data)
26 VALUES ('user_config', 'INSERT', NEW.key, json_object(
27 'key', NEW.key,
28 'value', NEW.value
29 ));
30 END;
31
32 CREATE TRIGGER sync_user_config_update AFTER UPDATE ON user_config
33 WHEN (SELECT value FROM sync_state WHERE key = 'applying_remote') != '1'
34 AND EXISTS (SELECT 1 FROM config_key_policy p WHERE p.key = NEW.key AND p.replicated = 1)
35 BEGIN
36 INSERT INTO sync_changelog (table_name, op, row_id, data)
37 VALUES ('user_config', 'UPDATE', NEW.key, json_object(
38 'key', NEW.key,
39 'value', NEW.value
40 ));
41 END;
42
43 CREATE TRIGGER sync_user_config_delete AFTER DELETE ON user_config
44 WHEN (SELECT value FROM sync_state WHERE key = 'applying_remote') != '1'
45 AND EXISTS (SELECT 1 FROM config_key_policy p WHERE p.key = OLD.key AND p.replicated = 1)
46 BEGIN
47 INSERT INTO sync_changelog (table_name, op, row_id)
48 VALUES ('user_config', 'DELETE', OLD.key);
49 END;
50