-- A stable identity per contact, for folder-based synchronisation. -- -- Two PCs exchanging changes through a shared folder need to name the SAME -- contact in both logs. "the QSO with M0ABC at 14:32" is a guess, and the two -- machines can disagree about which row that is — so an edit or a deletion -- cannot be addressed at all without an identity that travels with the record. -- -- A REAL COLUMN, indexed, rather than a key inside extras_json. The identity is -- looked up once per incoming change, and on a 120 000-QSO logbook scanning -- JSON for it would turn every sync into a full table read. A column costs one -- migration; the JSON would cost a scan every time. -- -- sync_uid is listed in varcharColumns (internal/db/mysql.go): MySQL cannot -- index a TEXT column without a prefix length, and a migration that tries dies -- with error 1170 on every startup thereafter, with no way out from the UI. -- -- Empty on every existing row: they are given an identity the first time -- synchronisation is switched on, in one bulk statement, not row by row. ALTER TABLE qso ADD COLUMN sync_uid TEXT NOT NULL DEFAULT ''; CREATE INDEX IF NOT EXISTS idx_qso_sync_uid ON qso (sync_uid);