begin_transaction(); // Lowest open mission that still has a free seat, judged by actual // occupancy rather than the cached counter. $mission = pqs_row( "SELECT MissionID, MissionSize FROM pqs_mission WHERE Completed = 0 AND locked = 0 AND (SELECT COUNT(*) FROM pqs_queue WHERE MissionID = pqs_mission.MissionID) < MissionSize ORDER BY MissionID ASC LIMIT 1" ); if ($mission === null) { // Nothing open: start a fresh mission sized to the current pods. $size = (int) pqs_val("SELECT numpods FROM pqs_gameconfig WHERE gamechoiceid = 1"); if ($size < 1) { $size = 1; } // nummercs is NOT NULL without a default; set it explicitly (a new // mission has 0 mercs) so this works under strict SQL mode too. pqs_exec( "INSERT INTO pqs_mission (MissionDate, MissionSize, numplayers, nummercs, MissionTime) VALUES (?, ?, 0, 0, ?)", 'iii', [(int) date('Ymd'), $size, (int) date('Hi')] ); $missionid = (int) $db->insert_id; } else { $missionid = (int) $mission['MissionID']; } pqs_exec( "INSERT INTO pqs_queue (CallSign, Mech, MissionID, Merc) VALUES (?, ?, ?, ?)", 'ssii', [$callsign, $mech, $missionid, $merc] ); // Rewrite the cached counter from the truth, so it can never drift. pqs_exec( "UPDATE pqs_mission SET numplayers = (SELECT COUNT(*) FROM pqs_queue WHERE MissionID = ?) WHERE MissionID = ?", 'ii', [$missionid, $missionid] ); $db->commit(); } catch (Throwable $e) { $db->rollback(); pqs_val("SELECT RELEASE_LOCK('pqs_enqueue')"); throw $e; } pqs_val("SELECT RELEASE_LOCK('pqs_enqueue')"); return $missionid; }