1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
<?php
///////////////////////////////////////////////////////////////////////////////
//
// pgPhoneHome - Postgres Monitor for iPhone
// Copyright 2008, EnterpriseDB UK Ltd.
// Dave Page (dave.page@enterprisedb.com)
//
// locks.php - Lock info
//
///////////////////////////////////////////////////////////////////////////////
require "global.php";
// Get the server number
if (isset($_GET['s']))
$server = intval($_GET['s']);
else
$server = -1;
// Set the panel name
$panel = "locks" . $server;
if ($server == -1 || $servers[$server]["description"] == "" || $servers[$server]["connstr"] == "")
www_error("Invalid server", "The specified server number ($server) does not have a valid configuration.");
// Connect the database
$db = @pg_connect($servers[$server]["connstr"]);
if ($db === FALSE)
www_error("Couldn't connect to the database.", html_entity_decode($php_errormsg, ENT_QUOTES));
// Get the server version, so we can use the right query
$res = @pg_query($db, "SHOW server_version_num;");
$version = @pg_fetch_result($res, 0, 0);
@pg_free_result($res);
// If this is EDB 8.3 server, reduce the version number as it has PG 8.2-esque catalogs
$res = @pg_query($db, "SELECT version();");
$versionstr = @pg_fetch_result($res, 0, 0);
if (strpos($versionstr, "EnterpriseDB") !== false)
$version = $version - 100;
@pg_free_result($res);
// Get the connections
if ($version >= 80300)
{
$sql = <<<EOT
SELECT
(SELECT datname FROM pg_database WHERE oid = pgl.database) AS dbname,
pgl.relation::regclass AS class,
pg_get_userbyid(pg_stat_get_backend_userid(svrid)) as user,
pgl.virtualxid, pgl.virtualtransaction AS transaction, pg_stat_get_backend_pid(svrid) AS pid, pgl.mode, pgl.granted,
pg_stat_get_backend_activity(svrid) AS current_query,
pg_stat_get_backend_activity_start(svrid) AS query_start
FROM pg_stat_get_backend_idset() svrid, pg_locks pgl
WHERE pgl.pid = pg_stat_get_backend_pid(svrid)
ORDER BY pid;
EOT;
} else {
$sql = <<<EOT
SELECT
(SELECT datname FROM pg_database WHERE oid = pgl.database) AS dbname,
pgl.relation::regclass AS class,
pg_get_userbyid(pg_stat_get_backend_userid(svrid)) as user,
pgl.transaction, pg_stat_get_backend_pid(svrid) AS pid, pgl.mode, pgl.granted,
pg_stat_get_backend_activity(svrid) AS current_query,
pg_stat_get_backend_activity_start(svrid) AS query_start
FROM pg_stat_get_backend_idset() svrid, pg_locks pgl
WHERE pgl.pid = pg_stat_get_backend_pid(svrid)
ORDER BY pid;
EOT;
}
$res = @pg_query($db, $sql);
if ($res === false)
www_error("Query execution error", $php_errormsg);
// Set the message for the top of the page
$rows = pg_num_rows($res);
if ($rows == 0)
$message = $servers[$server]["description"] . ": no locks";
else if ($rows == 1)
$message = $servers[$server]["description"] . ": 1 lock";
else
$message = $servers[$server]["description"] . ": $rows locks";
$message2 = "Server: " . $servers[$server]["description"];
$list = "";
$divs = "";
$rownum = 0;
while ($row = pg_fetch_assoc($res)) {
// Set the sub-panel ID
$subpanel = $panel . "row" . $rownum++;
$list .= " <li class=\"d\"><a href=\"#" . $subpanel . "\">Class: <span class=\"cv\">" . www_clean($row['class']) . "</span><br />Mode: <span class=\"cv\">" . www_clean($row['mode']) . "</span><br /></span> DB: <span class=\"cv\">" . www_clean($row['dbname']) . "</span></a></li>\n";
$divs .= "<div id=\"" . $subpanel . "\" class=\"panel\" title=\"Lock\">";
$divs .= "<div class=\"dh\">$message2</div>";
$divs .= "<h2>PID</h2><div class=\"vb\">" . www_clean($row['pid']) . "</div>";
$divs .= "<h2>Database</h2><div class=\"vb\">" . www_clean($row['dbname']) . "</div>";
$divs .= "<h2>Class</h2><div class=\"vb\">" . www_clean($row['class']) . "</div>";
$divs .= "<h2>Username</h2><div class=\"vb\">" . www_clean($row['user']) . "</div>";
if ($version >= 80300)
$divs .= "<h2>Virtual XID</h2><div class=\"vb\">" . www_clean($row['virtualxid']) . "</div>";
$divs .= "<h2>Transaction</h2><div class=\"vb\">" . www_clean($row['transaction']) . "</div>";
$divs .= "<h2>Mode</h2><div class=\"vb\">" . www_clean($row['mode']) . "</div>";
$divs .= "<h2>Granted?</h2><div class=\"vb\">" . ($row['granted'] == "t" ? "Yes" : "No") . "</div>";
$divs .= "<h2>Query</h2><div class=\"vb\">" . www_clean($row['current_query']) . "</div>";
$divs .= "<h2>Query start</h2><div class=\"vb\">" . www_clean($row['query_start']) . "</div>";
$divs .= "</div>";
}
pg_free_result($res);
// Output just the HTML snippet to be loaded via AJAX
$text = <<<EOT
<ul id="$panel" title="Locks">
<li class="group">$message</li>
$list
</ul>
$divs
EOT;
echo $text;
exit();
?>
|