1pub const RUNTIME_SCHEMA_VERSION: i32 = 9;
2
3pub fn runtime_schema_version() -> i32 {
4 RUNTIME_SCHEMA_VERSION
5}
6
7pub const RUNTIME_SYSTEM_SCHEMA_SQL: &str = r#"
8CREATE TABLE IF NOT EXISTS sync_subscription_state (
9 state_id TEXT NOT NULL,
10 subscription_id TEXT NOT NULL,
11 "table" TEXT NOT NULL,
12 scopes_json TEXT NOT NULL DEFAULT '{}',
13 params_json TEXT NOT NULL DEFAULT '{}',
14 cursor BIGINT NOT NULL,
15 bootstrap_state_json TEXT NULL,
16 status TEXT NOT NULL,
17 created_at BIGINT NOT NULL,
18 updated_at BIGINT NOT NULL,
19 PRIMARY KEY (state_id, subscription_id)
20);
21
22CREATE TABLE IF NOT EXISTS sync_verified_roots (
23 state_id TEXT NOT NULL,
24 subscription_id TEXT NOT NULL,
25 partition_id TEXT NOT NULL,
26 commit_seq BIGINT NOT NULL,
27 root TEXT NOT NULL,
28 created_at BIGINT NOT NULL,
29 updated_at BIGINT NOT NULL,
30 PRIMARY KEY (state_id, subscription_id)
31);
32
33CREATE TABLE IF NOT EXISTS sync_outbox_commits (
34 id TEXT PRIMARY KEY,
35 client_commit_id TEXT NOT NULL UNIQUE,
36 status TEXT NOT NULL,
37 operations_json TEXT NOT NULL,
38 last_response_json TEXT NULL,
39 error TEXT NULL,
40 created_at BIGINT NOT NULL,
41 updated_at BIGINT NOT NULL,
42 attempt_count INTEGER NOT NULL DEFAULT 0,
43 acked_commit_seq BIGINT NULL,
44 schema_version INTEGER NOT NULL DEFAULT 1,
45 next_attempt_at BIGINT NOT NULL DEFAULT 0,
46 lease_id TEXT NULL,
47 lease_expires_at_ms BIGINT NULL,
48 lease_status_at_enqueue TEXT NULL,
49 lease_scope_summary_json TEXT NULL,
50 lease_token TEXT NULL
51);
52
53CREATE INDEX IF NOT EXISTS idx_sync_outbox_commits_due
54 ON sync_outbox_commits (status, next_attempt_at, created_at);
55
56CREATE TABLE IF NOT EXISTS sync_command_history (
57 id TEXT PRIMARY KEY,
58 mutation_scope TEXT NOT NULL,
59 state TEXT NOT NULL CHECK (state IN ('done', 'undone')),
60 entries_json TEXT NOT NULL,
61 client_commit_id TEXT NOT NULL,
62 undo_client_commit_id TEXT NULL,
63 redo_client_commit_id TEXT NULL,
64 created_at BIGINT NOT NULL,
65 updated_at BIGINT NOT NULL
66);
67
68CREATE INDEX IF NOT EXISTS idx_sync_command_history_state_updated
69 ON sync_command_history (state, updated_at, created_at);
70
71CREATE TABLE IF NOT EXISTS sync_auth_leases (
72 lease_id TEXT PRIMARY KEY,
73 kid TEXT NOT NULL,
74 actor_id TEXT NOT NULL,
75 issued_at_ms BIGINT NOT NULL,
76 not_before_ms BIGINT NOT NULL,
77 expires_at_ms BIGINT NOT NULL,
78 schema_version INTEGER NOT NULL,
79 payload_json TEXT NOT NULL,
80 token TEXT NOT NULL,
81 status TEXT NOT NULL,
82 last_validation_error TEXT NULL,
83 created_at_ms BIGINT NOT NULL,
84 updated_at_ms BIGINT NOT NULL
85);
86
87CREATE INDEX IF NOT EXISTS idx_sync_auth_leases_actor_status_expiry
88 ON sync_auth_leases (actor_id, status, expires_at_ms);
89
90CREATE TABLE IF NOT EXISTS sync_conflicts (
91 id TEXT PRIMARY KEY,
92 outbox_commit_id TEXT NOT NULL,
93 client_commit_id TEXT NOT NULL,
94 op_index INTEGER NOT NULL,
95 result_status TEXT NOT NULL,
96 message TEXT NOT NULL,
97 code TEXT NULL,
98 server_version BIGINT NULL,
99 server_row_json TEXT NULL,
100 created_at BIGINT NOT NULL,
101 resolved_at BIGINT NULL,
102 resolution TEXT NULL
103);
104
105CREATE TABLE IF NOT EXISTS sync_blob_cache (
106 hash TEXT PRIMARY KEY,
107 size BIGINT NOT NULL,
108 mime_type TEXT NOT NULL,
109 body BLOB NOT NULL,
110 encrypted INTEGER NOT NULL DEFAULT 0,
111 key_id TEXT NULL,
112 cached_at BIGINT NOT NULL,
113 last_accessed_at BIGINT NOT NULL
114);
115
116CREATE INDEX IF NOT EXISTS idx_sync_blob_cache_last_accessed
117 ON sync_blob_cache (last_accessed_at);
118
119CREATE TABLE IF NOT EXISTS sync_blob_outbox (
120 id INTEGER PRIMARY KEY AUTOINCREMENT,
121 hash TEXT NOT NULL UNIQUE,
122 size BIGINT NOT NULL,
123 mime_type TEXT NOT NULL,
124 body BLOB NOT NULL,
125 encrypted INTEGER NOT NULL DEFAULT 0,
126 key_id TEXT NULL,
127 status TEXT NOT NULL,
128 attempt_count INTEGER NOT NULL DEFAULT 0,
129 error TEXT NULL,
130 created_at BIGINT NOT NULL,
131 updated_at BIGINT NOT NULL,
132 next_attempt_at BIGINT NOT NULL DEFAULT 0
133);
134
135CREATE INDEX IF NOT EXISTS idx_sync_blob_outbox_status
136 ON sync_blob_outbox (status, next_attempt_at, created_at);
137
138CREATE TABLE IF NOT EXISTS sync_crdt_updates (
139 seq INTEGER PRIMARY KEY AUTOINCREMENT,
140 partition_id TEXT NOT NULL DEFAULT 'default',
141 stream_id TEXT NOT NULL,
142 app_table TEXT NOT NULL,
143 row_id TEXT NOT NULL,
144 field_name TEXT NOT NULL,
145 update_id TEXT NOT NULL UNIQUE,
146 actor_id TEXT NULL,
147 client_id TEXT NULL,
148 key_id TEXT NOT NULL,
149 ciphertext TEXT NOT NULL,
150 scopes TEXT NOT NULL DEFAULT '{}',
151 created_at BIGINT NOT NULL,
152 server_seq BIGINT NULL
153);
154
155CREATE INDEX IF NOT EXISTS idx_sync_crdt_updates_stream_seq
156 ON sync_crdt_updates (partition_id, stream_id, seq);
157
158CREATE INDEX IF NOT EXISTS idx_sync_crdt_updates_scope_table
159 ON sync_crdt_updates (partition_id, app_table, row_id, field_name);
160
161CREATE INDEX IF NOT EXISTS idx_sync_crdt_updates_server_seq
162 ON sync_crdt_updates (partition_id, stream_id, server_seq);
163
164CREATE TABLE IF NOT EXISTS sync_crdt_checkpoints (
165 seq INTEGER PRIMARY KEY AUTOINCREMENT,
166 partition_id TEXT NOT NULL DEFAULT 'default',
167 stream_id TEXT NOT NULL,
168 app_table TEXT NOT NULL,
169 row_id TEXT NOT NULL,
170 field_name TEXT NOT NULL,
171 checkpoint_id TEXT NOT NULL UNIQUE,
172 covers_seq BIGINT NOT NULL,
173 actor_id TEXT NULL,
174 client_id TEXT NULL,
175 key_id TEXT NOT NULL,
176 ciphertext TEXT NOT NULL,
177 scopes TEXT NOT NULL DEFAULT '{}',
178 created_at BIGINT NOT NULL,
179 server_seq BIGINT NULL
180);
181
182CREATE INDEX IF NOT EXISTS idx_sync_crdt_checkpoints_stream_covers
183 ON sync_crdt_checkpoints (partition_id, stream_id, covers_seq);
184
185CREATE INDEX IF NOT EXISTS idx_sync_crdt_checkpoints_scope_table
186 ON sync_crdt_checkpoints (partition_id, app_table, row_id, field_name);
187
188CREATE INDEX IF NOT EXISTS idx_sync_crdt_checkpoints_server_seq
189 ON sync_crdt_checkpoints (partition_id, stream_id, server_seq);
190
191CREATE TABLE IF NOT EXISTS sync_crdt_documents (
192 document_key TEXT PRIMARY KEY,
193 app_table TEXT NOT NULL,
194 row_id TEXT NOT NULL,
195 field_name TEXT NOT NULL,
196 state_column TEXT NOT NULL,
197 sync_mode TEXT NOT NULL,
198 state_base64 TEXT NULL,
199 state_vector_base64 TEXT NOT NULL DEFAULT '',
200 pending_updates BIGINT NOT NULL DEFAULT 0,
201 flushed_updates BIGINT NOT NULL DEFAULT 0,
202 acked_updates BIGINT NOT NULL DEFAULT 0,
203 log_updates BIGINT NOT NULL DEFAULT 0,
204 created_at BIGINT NOT NULL,
205 updated_at BIGINT NOT NULL,
206 compacted_at BIGINT NULL
207);
208
209CREATE UNIQUE INDEX IF NOT EXISTS idx_sync_crdt_documents_identity
210 ON sync_crdt_documents (app_table, row_id, field_name);
211
212CREATE TABLE IF NOT EXISTS sync_crdt_update_log (
213 id INTEGER PRIMARY KEY AUTOINCREMENT,
214 document_key TEXT NOT NULL,
215 app_table TEXT NOT NULL,
216 row_id TEXT NOT NULL,
217 field_name TEXT NOT NULL,
218 update_id TEXT NOT NULL UNIQUE,
219 client_commit_id TEXT NULL,
220 origin TEXT NOT NULL,
221 status TEXT NOT NULL,
222 update_base64 TEXT NOT NULL,
223 state_vector_base64 TEXT NOT NULL DEFAULT '',
224 created_at BIGINT NOT NULL,
225 flushed_at BIGINT NULL,
226 acked_at BIGINT NULL,
227 FOREIGN KEY (document_key) REFERENCES sync_crdt_documents(document_key) ON DELETE CASCADE
228);
229
230CREATE INDEX IF NOT EXISTS idx_sync_crdt_update_log_document_status
231 ON sync_crdt_update_log (document_key, status, created_at);
232
233CREATE INDEX IF NOT EXISTS idx_sync_crdt_update_log_client_commit
234 ON sync_crdt_update_log (client_commit_id);
235"#;