Spaces:
Sleeping
Sleeping
Baida
sync: 120 file da Baida98/AI@8a5e0256 (2026-06-23 22:38 UTC) [GAP-MEM1 memory-space]
473bd03 verified | -- backend/migrations/p37_vfs_optimistic_lock.sql | |
| -- GAP-VFS: aggiunge colonna version + trigger auto-bump a vfs_files. | |
| -- | |
| -- OPZIONALE β il codice Python usa updated_at come token ottimistico | |
| -- anche senza questa migration (backward compatible). | |
| -- Eseguire nel SQL Editor di Supabase per abilitare il contatore version | |
| -- esplicito (integer monotono, immune a clock skew). | |
| -- | |
| -- Idempotente: safe da eseguire piΓΉ volte. | |
| -- Prerequisito: tabella vfs_files esistente (vedi 20260601_vfs_and_semantic.sql). | |
| -- ββ Step 1: colonna version βββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| -- DEFAULT 0 per righe esistenti. Il trigger la incrementerΓ ad ogni UPDATE. | |
| ALTER TABLE public.vfs_files | |
| ADD COLUMN IF NOT EXISTS version BIGINT NOT NULL DEFAULT 0; | |
| -- ββ Step 2: funzione trigger (CREATE OR REPLACE = idempotente) ββββββββββββββββ | |
| CREATE OR REPLACE FUNCTION public._vfs_bump_version() | |
| RETURNS TRIGGER LANGUAGE plpgsql AS $$ | |
| BEGIN | |
| -- Incremento atomico server-side: Python non deve leggere la versione corrente | |
| NEW.version = OLD.version + 1; | |
| RETURN NEW; | |
| END; | |
| $$; | |
| -- ββ Step 3: trigger BEFORE UPDATE (DROP IF EXISTS + CREATE = idempotente) ββββ | |
| DROP TRIGGER IF EXISTS trg_vfs_version ON public.vfs_files; | |
| CREATE TRIGGER trg_vfs_version | |
| BEFORE UPDATE ON public.vfs_files | |
| FOR EACH ROW | |
| EXECUTE FUNCTION public._vfs_bump_version(); | |
| -- ββ Step 4: index per conflict detection rapido βββββββββββββββββββββββββββββββ | |
| CREATE INDEX IF NOT EXISTS vfs_files_version_idx | |
| ON public.vfs_files (id, version); | |
| -- ββ Note operative ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| -- Dopo questa migration, PUT /api/files/{id} accetta anche: | |
| -- body: { ..., "expected_version": <N> } | |
| -- Se version corrente != N β HTTP 409 { error: "conflict", current_version, current_updated_at } | |
| -- Il campo expected_updated_at (BIGINT ms) funziona allo stesso modo senza migration. | |