From fa11cd60083b96a5bb8b4fd96c01f60369e55d8e Mon Sep 17 00:00:00 2001 From: Robert Treat Date: Sun, 5 Jul 2009 20:13:42 -0400 Subject: [PATCH] add ability to terminate backend processes for 8.4+ --- classes/database/Postgres.php | 14 +++++++++----- classes/database/Postgres74.php | 2 +- classes/database/Postgres83.php | 1 + database.php | 33 +++++++++++++++++++++------------ lang/english.php | 1 + lang/recoded/english.php | 1 + 6 files changed, 34 insertions(+), 18 deletions(-) diff --git a/classes/database/Postgres.php b/classes/database/Postgres.php index 80c0e0786..7f42dd892 100755 --- a/classes/database/Postgres.php +++ b/classes/database/Postgres.php @@ -6814,16 +6814,19 @@ function sendSignal($pid, $signal) { // Clean $pid = (int)$pid; - if ($signal == 'CANCEL') + if ($signal == 'CANCEL') $sql = "SELECT pg_catalog.pg_cancel_backend({$pid}) AS val"; - else + elseif ($signal == 'KILL') + $sql = "SELECT pg_catalog.pg_terminate_backend({$pid}) AS val"; + else return -1; + // Execute the query $val = $this->selectField($sql, 'val'); - if ($val === -1) return -1; - elseif ($val == '1') return 0; + if ($val === 'f') return -1; + elseif ($val === 't') return 0; else return -1; } @@ -7558,7 +7561,7 @@ function hasRecluster() { return true; } function hasRoles() { return true; } function hasServerAdminFuncs() { return true; } function hasSharedComments() { return true; } - function hasSignals() { return true; } + function hasQueryCancel() { return true; } function hasStatsCollector() { return true; } function hasTablespaces() { return true; } function hasUserAndDbVariables() { return true; } @@ -7571,6 +7574,7 @@ function hasWithoutOIDs() { return true; } function hasAlterDatabase() { return $this->hasAlterDatabaseRename(); } function hasForeignKeysInfo() { return $this->hasConstraintsInfo(); } function hasMagicTypes() { return true; } + function hasQueryKill() { return true; } } ?> diff --git a/classes/database/Postgres74.php b/classes/database/Postgres74.php index 894e1a0cd..b0955b3c6 100644 --- a/classes/database/Postgres74.php +++ b/classes/database/Postgres74.php @@ -341,7 +341,7 @@ function hasAlterDatabaseOwner() { return false; } function hasAlterSchemaOwner() { return false; } function hasFunctionAlterOwner() { return false; } function hasNamedParams() { return false; } - function hasSignals() { return false; } + function hasQueryCancel() { return false; } function hasTablespaces() { return false; } function hasMagicTypes() { return false; } } diff --git a/classes/database/Postgres83.php b/classes/database/Postgres83.php index 3f5734ca9..cc399dc54 100644 --- a/classes/database/Postgres83.php +++ b/classes/database/Postgres83.php @@ -57,6 +57,7 @@ function getHelpPages() { } function hasAutovacuumSysTable() { return true; } + function hasQueryKill() { return false; } } diff --git a/database.php b/database.php index 789ef23a6..d98a61908 100755 --- a/database.php +++ b/database.php @@ -444,19 +444,28 @@ function doProcesses($msg = '') { ), ); - if ($data->hasSignals()) { - $columns['actions'] = array('title' => $lang['stractions']); + // Build possible actions for our process list + $columns['actions'] = array('title' => $lang['stractions']); - $actions = array( - 'cancel' => array( - 'title' => $lang['strcancel'], - 'url' => "database.php?action=signal&signal=CANCEL&{$misc->href}&", - 'vars' => array('procpid' => 'procpid') - ) - ); - } - else $actions = array(); - + $actions = array( + 'cancel' => array( + 'title' => $lang['strcancel'], + 'url' => "database.php?action=signal&signal=CANCEL&{$misc->href}&", + 'vars' => array('procpid' => 'procpid') + ), + 'kill' => array( + 'title' => $lang['strkill'], + 'url' => "database.php?action=signal&signal=KILL&{$misc->href}&", + 'vars' => array('procpid' => 'procpid') + ) + ); + + // Remove actions where not supported + if (!$data->hasQueryKill()) unset($actions['kill']); + if (!$data->hasQueryCancel()) unset($actions['cancel']); + + if (count($actions) == 0) unset($columns['actions']); + // Remove query start time for <7.4 if (!isset($processes->fields['query_start'])) unset($columns['start_time']); diff --git a/lang/english.php b/lang/english.php index 015787101..db9a0d66a 100644 --- a/lang/english.php +++ b/lang/english.php @@ -60,6 +60,7 @@ $lang['stralter'] = 'Alter'; $lang['strok'] = 'OK'; $lang['strcancel'] = 'Cancel'; + $lang['strkill'] = 'Kill'; $lang['strac'] = 'Enable AutoComplete'; $lang['strsave'] = 'Save'; $lang['strreset'] = 'Reset'; diff --git a/lang/recoded/english.php b/lang/recoded/english.php index d3c902017..7357470af 100644 --- a/lang/recoded/english.php +++ b/lang/recoded/english.php @@ -60,6 +60,7 @@ $lang['stralter'] = 'Alter'; $lang['strok'] = 'OK'; $lang['strcancel'] = 'Cancel'; + $lang['strkill'] = 'Kill'; $lang['strac'] = 'Enable AutoComplete'; $lang['strsave'] = 'Save'; $lang['strreset'] = 'Reset';