Files
ThothII/docs/contracts/catalog-schema-snapshot.md

3.2 KiB

Catalog schema snapshot RPC

Il percorso preferito per un binding rest_api espone al catalogo un'unica fotografia tipizzata dello schema:

POST /rpc/schema_snapshot
Content-Type: application/json

{"schema_name":"datawarehouse"}

La risposta è un oggetto JSON con schemaVersion: 1, capability esplicite e tre collezioni. Una capability non disponibile deve essere dichiarata unavailable: non deve essere simulata con una lista vuota.

{
  "schemaVersion": 1,
  "capabilities": {
    "tables": "available",
    "columns": "available",
    "relationships": "available"
  },
  "tables": [
    { "name": "patients", "sourceComment": "Clinical patients" }
  ],
  "columns": [
    {
      "tableName": "patients",
      "name": "id",
      "ordinalPosition": 1,
      "dataType": "bigint",
      "isNullable": false,
      "defaultExpression": null,
      "primaryKeyPosition": 1,
      "sourceComment": "Patient identifier"
    }
  ],
  "relationships": [
    {
      "constraintName": "visits_patient_id_fkey",
      "sourceTableName": "visits",
      "targetTableName": "patients",
      "updateRule": "NO ACTION",
      "deleteRule": "CASCADE",
      "deferrable": false,
      "initiallyDeferred": false,
      "columns": [
        { "position": 1, "sourceColumnName": "patient_id", "targetColumnName": "id" }
      ]
    }
  ]
}

Fallback compatibile tramite run_query

Se e soltanto se il server non espone POST /rpc/schema_snapshot, il catalogo può ottenere la stessa fotografia mediante una singola istruzione read-only inviata all'RPC già esistente:

POST /rpc/run_query
Content-Type: application/json

{"query_text":"WITH ... SELECT ..."}

La query è costruita dal catalogo, interroga soltanto il catalogo PostgreSQL dello schema configurato e aggrega tabelle, colonne, primary key e foreign key nella stessa istruzione. Non sono ammessi più round trip, query per tabella o assemblaggi client-side di osservazioni effettuate in momenti diversi. Il nome schema deve essere validato come identificatore e quotato come valore SQL, non interpolato come SQL libero.

run_query restituisce un array JSON di righe. Per questo fallback l'array deve contenere esattamente una riga e quella riga deve essere esattamente l'oggetto snapshot v1 sopra descritto, con schemaVersion, capabilities, tables, columns e relationships; campi mancanti, aggiuntivi o di tipo diverso rendono invalida l'intera fotografia. La risposta non è un contratto alternativo o più permissivo: cambia soltanto il trasporto della stessa snapshot stretta.

position e primaryKeyPosition sono uno-based. Le coppie ordinate permettono foreign key composte. Il catalogo rifiuta l'intera fotografia se il JSON non rispetta il contratto o se la capability richiesta dal tipo di sincronizzazione è unavailable; in entrambi i casi non applica alcuna modifica. Il fallback viene tentato soltanto quando l'RPC preferito risulta assente, non per nascondere una snapshot malformata o un errore operativo del server. Se anche run_query non è disponibile, la query viene rifiutata, la risposta non contiene una singola snapshot v1 valida o una capability richiesta è unavailable, il run fallisce senza aggiornamenti parziali e senza esporre il corpo remoto.