sqlite persistence: the store moves from db.json to dist.db (P5.2)
src/repo/db.sx persists the whole Repo to <store>/dist.db through the vendored SQLite bindings, keeping the load-whole/save-whole call shape. One table per entity; enums as lowercase variant names; list order round-trips via rowid. Enforced uniqueness: apps.slug, channels(app_id, name), tokens.token_hash; lookup indexes on releases(app_id) and artifacts(sha256) (non-unique - identical bytes may ship in several releases). save is DELETE-all + INSERT-all inside BEGIN IMMEDIATE...COMMIT with rollback on failure; every connection sets busy_timeout so the CLI and a running distd interleave safely. A store holding only a pre-SQLite db.json imports once on first load, then the file is renamed db.json.imported; a store with neither starts empty. Consumers gate on db.store_exists instead of probing db.json. The JSON read-back stays for the import path; the entity->json writers stay for distd's /api responses. Tests that parsed db.json directly now assert by querying dist.db through the SQLite bindings; tests/db_import.sx pins the import path; tests/repo_roundtrip.sx pins the SQLite round-trip. make test 22/22.
This commit is contained in:
@@ -6,8 +6,8 @@
|
||||
// scope match, and the unscoped-matches-anything rules.
|
||||
// * validate_token — each invalid form rejected with its SPECIFIC tag.
|
||||
// * mark_token_used — last-used stamping through the repo.
|
||||
// * db.json round trip — tokens persist field-for-field, and an absent
|
||||
// `tokens` member (a db.json from before tokens existed) loads as zero
|
||||
// * store round trip — tokens persist field-for-field, and an absent
|
||||
// `tokens` member (an import-path db.json from before tokens existed) loads as zero
|
||||
// tokens instead of BadShape.
|
||||
#import "modules/std.sx";
|
||||
#import "../src/domain/platform.sx";
|
||||
@@ -213,7 +213,7 @@ tok_mark_used_shim :: (repo: *Repo, id: string, now: i64) -> bool {
|
||||
|
||||
// ── persistence ──────────────────────────────────────────────────────
|
||||
|
||||
// db.json with no `tokens` member loads as zero tokens (compat with
|
||||
// An import-path db.json with no `tokens` member loads as zero tokens (compat with
|
||||
// pre-token layouts), not BadShape.
|
||||
NO_TOKENS_DB :: "{\"apps\":[],\"releases\":[],\"artifacts\":[],\"channels\":[],\"audit_events\":[]}";
|
||||
|
||||
|
||||
Reference in New Issue
Block a user