mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-09 04:50:59 +00:00
A CSV import of a continuous-sensor export wrote nothing and rendered a green success state. Three faults compounded, and the reporter took all three apart before filing. The parser refused every BLOOD_GLUCOSE row with a blank glucoseContext. Behind it, the CHECK constraint from migration 0021 read both ways at once: a glucose row MUST carry a context, every other type MUST NOT. The second half is right and stays. The first was written when the only glucose writer was the entry form, where a person picks fasting or post-meal at the moment of the reading. Every machine writer that arrived since has no such answer per sample, so the Nightscout pull, the MCP log tool, the Telegram capture and both bulk importers were all building rows the database then refused. A missing context now stores as NULL, never as a fifth enum member. Every per-context reader selects by equality against the four members, so the reading stays out of the doctor report's fasting rows, the matching FHIR observations and the per-context targets, while the chart, the all-time summary and the clinical panel keep it in full. Hand entry still asks for a context, because at that moment you know it. The import cards now read the counts rather than the status code. Nothing written is a failure, a mixed file is a warning, and the refused rows are grouped by reason with a count instead of fifty identical lines, with the per-line detail one disclosure away. Both cards render through one outcome table, so a tick cannot reach a result that wrote nothing. Refs #640
32 lines
1.6 KiB
SQL
32 lines
1.6 KiB
SQL
-- v1.32.x — a blood-glucose reading may carry no context.
|
|
--
|
|
-- Migration 0021 introduced `measurements.glucose_context` with a CHECK that
|
|
-- read both ways at once: a BLOOD_GLUCOSE row MUST carry a context, and every
|
|
-- other type MUST NOT. The second half is right and stays. The first half was
|
|
-- written when the only glucose writer was the manual entry form, where a
|
|
-- person picks fasting / post-meal / random / bedtime at the moment of the
|
|
-- reading.
|
|
--
|
|
-- Every machine writer that arrived later has no such classification per
|
|
-- sample: a continuous sensor export, the Nightscout SGV pull, the MCP
|
|
-- `log_measurement` tool and the Telegram numeric capture all build their row
|
|
-- without a context, so the insert failed against this constraint — a CSV
|
|
-- import of a sensor history wrote nothing, a Nightscout tick counted every
|
|
-- reading as a failed row.
|
|
--
|
|
-- A missing context is missing. It stores as NULL, never as a fifth enum
|
|
-- member: every per-context reader (the doctor report, the FHIR per-context
|
|
-- Observations, the analytics + dashboard breakdowns, the target builder)
|
|
-- selects by equality against the four members, so NULL falls out of each
|
|
-- rather than being presented as a classification that nobody recorded. The
|
|
-- context-agnostic readers (the clinical panel, the charts, the all-time
|
|
-- summary) keep the row in full.
|
|
ALTER TABLE "measurements"
|
|
DROP CONSTRAINT IF EXISTS "measurements_glucose_context_requires_type";
|
|
|
|
ALTER TABLE "measurements"
|
|
ADD CONSTRAINT "measurements_glucose_context_requires_type"
|
|
CHECK (
|
|
type = 'BLOOD_GLUCOSE' OR glucose_context IS NULL
|
|
);
|