Skip to main content

syncular_runtime/core/
runtime_schema.rs

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"#;