- Config 'Update', 'Commit Mission', lock, and clearupdate now use db.php
helpers with bound params (were injectable via ~20 raw $_GET values incl.
nummercs and playerid). Pod toggles collapsed into a 16-iteration loop.
- Commit Mission runs under the shared queue lock and one transaction so a
registration can't slip into the mission mid-commit.
- dev/migrations/002: pqs_currentmission + pqs_pastmissions -> InnoDB so the
commit's snapshot/archive roll back with the queue delete (uses DELETE not
TRUNCATE to stay in the transaction).
Verified: commit moves players to current/past, empties queue, marks completed
with nummercs; config update writes pods + settings; no errors.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- dev/migrations/001-innodb.sql: convert pqs_queue + pqs_mission to InnoDB.
- includes/queue.php: pqs_enqueue_player() seats a player in the next open
mission (creating one if needed), serialized with GET_LOCK and wrapped in a
transaction; capacity judged by real COUNT(*), numplayers rewritten from it
so the counter self-heals and can't drift.
- callsign.php: normal registration path now calls pqs_enqueue_player instead
of the non-atomic read-check-insert.
Verified on the local stack: 140 concurrent registrations -> 24 missions,
zero overfill, zero counter drift.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>