diff --git a/console.php b/console.php index b91fd2b..26af98b 100644 --- a/console.php +++ b/console.php @@ -18,6 +18,8 @@ var auto_refreshpods = setInterval(function() { query("TRUNCATE TABLE pqs_currentmission"); } if (isset($_GET['submit'])) {$submit=$_GET['submit'];}else{$submit='';} if ($submit=='Update'){ - $pod01 = (isset($_GET['pod01'])) ? 1 : 0; - $pod02 = (isset($_GET['pod02'])) ? 1 : 0; - $pod03 = (isset($_GET['pod03'])) ? 1 : 0; - $pod04 = (isset($_GET['pod04'])) ? 1 : 0; - $pod05 = (isset($_GET['pod05'])) ? 1 : 0; - $pod06 = (isset($_GET['pod06'])) ? 1 : 0; - $pod07 = (isset($_GET['pod07'])) ? 1 : 0; - $pod08 = (isset($_GET['pod08'])) ? 1 : 0; - $pod09 = (isset($_GET['pod09'])) ? 1 : 0; - $pod10 = (isset($_GET['pod10'])) ? 1 : 0; - $pod11 = (isset($_GET['pod11'])) ? 1 : 0; - $pod12 = (isset($_GET['pod12'])) ? 1 : 0; - $pod13 = (isset($_GET['pod13'])) ? 1 : 0; - $pod14 = (isset($_GET['pod14'])) ? 1 : 0; - $pod15 = (isset($_GET['pod15'])) ? 1 : 0; - $pod16 = (isset($_GET['pod16'])) ? 1 : 0; - $numberpods = $pod01 + $pod02 + $pod03 + $pod04 + $pod05 + $pod06 + $pod07 + $pod08 + $pod09 + $pod10 + $pod11 + $pod12 + $pod13 + $pod14 + $pod15 + $pod16; - $visibility = $_GET['visibility']; - $weather = $_GET['weather']; - $timeofday = $_GET['timeofday']; - $timelimit = $_GET['timelimit']; - $timetoreset = $_GET['timetoreset']; - $radar = $_GET['radar']; - $heat = (isset($_GET['heat'])) ? 1 : 0; - $friendlyfire = (isset($_GET['friendlyfire'])) ? 1 : 0; - $splashdamage = (isset($_GET['splashdamage'])) ? 1 : 0; - $limitedammo = (isset($_GET['limitedammo'])) ? 1 : 0; - $noreturn = (isset($_GET['noreturn'])) ? 1 : 0; - $printdebriefing = (isset($_GET['printdebriefing'])) ? 1 : 0; - $missionreview = (isset($_GET['missionreview'])) ? 1 : 0; - $weaponjam = (isset($_GET['weaponjam'])) ? 1 : 0; - $advancemode = (isset($_GET['advancemode'])) ? 1 : 0; - $armormode = (isset($_GET['armormode'])) ? 1 : 0; - $cameraship = $_GET['cameraship']; - $groupAvalible = (isset($_GET['groupAvalible'])) ? 1 : 0; - - $link = mysqli_connect('localhost', 'pqs', 'pqs') or die('Could not connect: ' . mysqli_error($link)); - mysqli_select_db($link, 'pqs') or die('Could not select database'); - - $queryconfig = "UPDATE pqs_gameconfig SET numpods=" . $numberpods . ", timepergame=" . $timelimit . ", timetoreset=" . $timetoreset . ", timelimit=".$timelimit.", visibility=".$visibility.", weather=".$weather.", radar=".$radar.", heat=".$heat.", friendlyfire=".$friendlyfire.", splashdamage=".$splashdamage.", limitedammo=".$limitedammo.", noreturn=".$noreturn.", printdebriefing=".$printdebriefing.", missionreview=".$missionreview.", weaponjam=".$weaponjam.", advancemode=".$advancemode.", armormode=".$armormode.", GroupAvalible=".$groupAvalible." WHERE gamechoiceid=1"; - - mysqli_query($link, $queryconfig) or die('Query failed: ' . mysqli_error($link)); - - $queryconfig = "UPDATE pqs_pods SET pod01=".$pod01.", pod02=".$pod02.", pod03=".$pod03.", pod04=".$pod04.", pod05=".$pod05.", pod06=".$pod06.", pod07=".$pod07.", pod08=".$pod08.", pod09=".$pod09.", pod10=".$pod10.",pod11=".$pod11.", pod12=".$pod12.", pod13=".$pod13.", pod14=".$pod14.", pod15=".$pod15.", pod16=".$pod16." "; - - mysqli_query($link, $queryconfig) or die('Query failed: ' . mysqli_error($link)); - - $queryconfig = "UPDATE pqs_mission SET MissionSize=" . $numberpods . " WHERE Completed=0"; - mysqli_query($link, $queryconfig) or die('Query failed: ' . mysqli_error($link)); - mysqli_close($link); + // Pod toggles: pod01..pod16, present in the query string => on. + $pods = array(); + for ($p = 1; $p <= 16; $p++) { + $pods[$p] = isset($_GET[sprintf('pod%02d', $p)]) ? 1 : 0; } + $numberpods = array_sum($pods); + + // Numeric dropdowns. + $visibility = (int)($_GET['visibility'] ?? 0); + $weather = (int)($_GET['weather'] ?? 0); + $timelimit = (int)($_GET['timelimit'] ?? 0); + $timetoreset = (int)($_GET['timetoreset'] ?? 0); + $radar = (int)($_GET['radar'] ?? 0); + // Checkbox flags. + $heat = isset($_GET['heat']) ? 1 : 0; + $friendlyfire = isset($_GET['friendlyfire']) ? 1 : 0; + $splashdamage = isset($_GET['splashdamage']) ? 1 : 0; + $limitedammo = isset($_GET['limitedammo']) ? 1 : 0; + $noreturn = isset($_GET['noreturn']) ? 1 : 0; + $printdebriefing = isset($_GET['printdebriefing'])? 1 : 0; + $missionreview = isset($_GET['missionreview']) ? 1 : 0; + $weaponjam = isset($_GET['weaponjam']) ? 1 : 0; + $advancemode = isset($_GET['advancemode']) ? 1 : 0; + $armormode = isset($_GET['armormode']) ? 1 : 0; + $groupAvalible = isset($_GET['groupAvalible']) ? 1 : 0; + + // Note: timepergame is intentionally set to timelimit, and timeofday / + // cameraship are not written here (preserves the original behavior). + pqs_exec( + "UPDATE pqs_gameconfig SET numpods=?, timepergame=?, timetoreset=?, timelimit=?, + visibility=?, weather=?, radar=?, heat=?, friendlyfire=?, splashdamage=?, + limitedammo=?, noreturn=?, printdebriefing=?, missionreview=?, weaponjam=?, + advancemode=?, armormode=?, GroupAvalible=? WHERE gamechoiceid=1", + str_repeat('i', 18), + array($numberpods, $timelimit, $timetoreset, $timelimit, $visibility, $weather, + $radar, $heat, $friendlyfire, $splashdamage, $limitedammo, $noreturn, + $printdebriefing, $missionreview, $weaponjam, $advancemode, $armormode, $groupAvalible) + ); + + pqs_exec( + "UPDATE pqs_pods SET pod01=?, pod02=?, pod03=?, pod04=?, pod05=?, pod06=?, pod07=?, + pod08=?, pod09=?, pod10=?, pod11=?, pod12=?, pod13=?, pod14=?, pod15=?, pod16=?", + str_repeat('i', 16), + array_values($pods) + ); + + pqs_exec("UPDATE pqs_mission SET MissionSize=? WHERE Completed=0", 'i', array($numberpods)); +} if ($submit=='Commit Mission') { - $link = mysqli_connect('localhost', 'pqs', 'pqs') or die('Could not connect: ' . mysqli_error($link)); - mysqli_select_db($link, 'pqs') or die('Could not select database'); - $sql = "SELECT MIN(MissionID) FROM pqs_queue"; - $getid = mysqli_query($link, $sql) or die('Query failed: ' . mysqli_error($link)); - $rs = mysqli_fetch_array($getid); - $missionid = $rs[0]; - $sql = "TRUNCATE TABLE pqs_currentmission"; - mysqli_query($link, $sql) or die('Query failed: ' . mysqli_error($link)); - $sql = "SELECT callsign, mech FROM pqs_queue where MissionID=$missionid"; - $getid = mysqli_query($link, $sql) or die('Query failed: ' . mysqli_error($link)); - while ($rs = mysqli_fetch_array($getid)) { - $callsign = str_replace("'", "''", $rs[0]); - $sql = "INSERT INTO pqs_currentmission (callsign,missionid) VALUES ('$callsign',$missionid)"; - mysqli_query($link, $sql) or die('DEBUG: Insert into currentmission failed: ' . mysqli_error($link)); - $sql = "INSERT INTO pqs_pastmissions (callsign,mech,missionid) VALUES ('$callsign','$rs[1]',$missionid)"; - mysqli_query($link, $sql) or die('DEBUG: Insert into pastmissions failed: ' . mysqli_error($link)); - } - $sql = "DELETE FROM pqs_queue WHERE MissionID=$missionid"; - mysqli_query($link, $sql) or die('Query failed: ' . mysqli_error($link)); - $sql = "UPDATE pqs_mission SET Completed=1, nummercs=$_GET[nummercs], missiontime=$ttime WHERE MissionID=$missionid"; - mysqli_query($link, $sql) or die('Query failed: ' . mysqli_error($link)); - mysqli_close($link); + // Commit the next mission: snapshot to the current board, archive to history, + // clear it from the queue and mark it completed. Runs under the shared queue + // lock (so a registration can't slip in mid-commit) and as one transaction. + $nummercs = (int)($_GET['nummercs'] ?? 0); + $mtime = (int) date('Hi'); + pqs_with_queue_lock(function () use ($nummercs, $mtime) { + $db = pqs_db(); + $db->begin_transaction(); + try { + $missionid = (int) pqs_val("SELECT MIN(MissionID) FROM pqs_queue"); + $db->query("DELETE FROM pqs_currentmission"); + if ($missionid > 0) { + $players = pqs_rows("SELECT callsign, mech FROM pqs_queue WHERE MissionID = ?", 'i', array($missionid)); + foreach ($players as $p) { + pqs_exec("INSERT INTO pqs_currentmission (callsign, missionid) VALUES (?, ?)", + 'si', array($p['callsign'], $missionid)); + pqs_exec("INSERT INTO pqs_pastmissions (callsign, mech, missionid) VALUES (?, ?, ?)", + 'ssi', array($p['callsign'], $p['mech'], $missionid)); + } + pqs_exec("DELETE FROM pqs_queue WHERE MissionID = ?", 'i', array($missionid)); + pqs_exec("UPDATE pqs_mission SET Completed = 1, nummercs = ?, missiontime = ? WHERE MissionID = ?", + 'iii', array($nummercs, $mtime, $missionid)); + } + $db->commit(); + } catch (Throwable $e) { + $db->rollback(); + throw $e; + } + }); } if (isset($_GET['lock'])) { - $link = mysqli_connect('localhost', 'pqs', 'pqs') or die('Could not connect: ' . mysqli_error($link)); - mysqli_select_db($link, 'pqs') or die('Could not select database'); - $sql = "SELECT MIN(MissionID) FROM pqs_queue"; - $getid = mysqli_query($link, $sql) or die('Query failed: ' . mysqli_error($link)); - $rs = mysqli_fetch_array($getid); - $missionid = $rs[0]; - $sql = "UPDATE pqs_mission SET locked=1 WHERE MissionID=$missionid"; - mysqli_query($link, $sql) or die('Query failed: ' . mysqli_error($link)); - mysqli_close($link); -} -if (isset($_GET['action'])) { - if ($_GET['action'] == 'clearupdate') { - if (isset($_GET['playerid'])) $playerid = $_GET['playerid']; - $link = mysqli_connect('localhost', 'pqs', 'pqs') or die('Could not connect: ' . mysqli_error($link)); - mysqli_select_db($link, 'pqs') or die('Could not select database'); - $sql = "UPDATE pqs_queue SET Updated = 0 WHERE ID = $playerid"; - $result = mysqli_query($link, $sql) or die('Delete player from Queue failed: ' . mysqli_error($link)); - mysqli_close($link); + $missionid = (int) pqs_val("SELECT MIN(MissionID) FROM pqs_queue"); + if ($missionid > 0) { + pqs_exec("UPDATE pqs_mission SET locked = 1 WHERE MissionID = ?", 'i', array($missionid)); } } +if (isset($_GET['action']) && $_GET['action'] == 'clearupdate') { + $playerid = (int)($_GET['playerid'] ?? 0); + pqs_exec("UPDATE pqs_queue SET Updated = 0 WHERE ID = ?", 'i', array($playerid)); +} -$link = mysqli_connect('localhost', 'pqs', 'pqs') or die('Could not connect: ' . mysqli_error($link)); -mysqli_select_db($link, 'pqs') or die('Could not select database'); -$sql = "SELECT MIN(MissionID) FROM pqs_queue"; -$getid = mysqli_query($link, $sql) or die('Query failed: ' . mysqli_error($link)); -$rs = mysqli_fetch_array($getid); -$missionid = $rs[0]; +$missionid = (int) pqs_val("SELECT MIN(MissionID) FROM pqs_queue"); $locked = 0; if ($missionid != 0) { - $sql = "SELECT locked FROM pqs_mission WHERE MissionId=$missionid"; - $getid = mysqli_query($link, $sql) or die('Query failed: ' . mysqli_error($link)); - $rs = mysqli_fetch_array($getid); - $locked = $rs[0]; + $locked = (int) pqs_val("SELECT locked FROM pqs_mission WHERE MissionId = ?", 'i', array($missionid)); } -mysqli_close($link); echo ""; echo ""; diff --git a/dev/migrations/002-innodb-commit-tables.sql b/dev/migrations/002-innodb-commit-tables.sql new file mode 100644 index 0000000..d90b09b --- /dev/null +++ b/dev/migrations/002-innodb-commit-tables.sql @@ -0,0 +1,13 @@ +-- Migration 002: convert the mission-commit tables to InnoDB. +-- +-- Why: console.php "Commit Mission" now snapshots to pqs_currentmission and +-- archives to pqs_pastmissions inside a transaction (with the queue delete + +-- mission completion). For that to roll back cleanly on error, these two must +-- be InnoDB as well. (DELETE, not TRUNCATE, is used on pqs_currentmission so it +-- stays inside the transaction.) +-- +-- Safe and reversible; run once: +-- mysql -u pqs -ppqs pqs < dev/migrations/002-innodb-commit-tables.sql + +ALTER TABLE pqs_currentmission ENGINE=InnoDB; +ALTER TABLE pqs_pastmissions ENGINE=InnoDB;
Clear Current Queue   |   "; echo "Open History Window