/**
* Manage aggregates in a database
*
- * $Id: aggregates.php,v 1.4 2004/06/27 06:26:22 xzilla Exp $
+ * $Id: aggregates.php,v 1.5 2004/07/07 02:59:56 chriskl Exp $
*/
// Include application functions
global $data, $conf, $misc;
global $lang;
+ function aggPre(&$rowdata) {
+ global $data, $lang;
+ $rowdata->f['+argtypes'] = is_null($rowdata->f['proargtypes']) ? $lang['stralltypes'] : $rowdata->f['proargtypes'];
+ }
+
$misc->printTitle(array($misc->printVal($_REQUEST['database']), $lang['straggregates']), 'aggregates');
$misc->printMsg($msg);
$aggregates = &$data->getAggregates();
- if ($aggregates->recordCount() > 0) {
- echo "<table>\n";
- echo "<tr><th class=\"data\">{$lang['strname']}</th><th class=\"data\">{$lang['strtype']}</th>";
- if ($conf['show_comments']) echo "<th class=\"data\">{$lang['strcomment']}</th>";
- echo "</tr>\n";
- $i = 0;
- while (!$aggregates->EOF) {
- $id = (($i % 2) == 0 ? '1' : '2');
- echo "<tr><td class=\"data{$id}\">", $misc->printVal($aggregates->f['proname']), "</td>\n";
- echo "<td class=\"data{$id}\">";
- // If arg type is NULL, then we need to output "all types"
- if ($aggregates->f['proargtypes'] === null)
- echo $lang['stralltypes'];
- else
- echo $misc->printVal($aggregates->f['proargtypes']);
- echo "</td>\n";
- if ($conf['show_comments']) echo "<td class=\"data{$id}\">", $misc->printVal($aggregates->f['aggcomment']), "</td>\n";
- echo "</tr>\n";
- $aggregates->moveNext();
- $i++;
- }
- echo "</table>\n";
- }
- else {
- echo "<p>{$lang['strnoaggregates']}</p>\n";
- }
+ $columns = array(
+ 'aggregate' => array(
+ 'title' => $lang['strname'],
+ 'field' => 'proname',
+ ),
+ 'type' => array(
+ 'title' => $lang['strtype'],
+ 'field' => '+argtypes',
+ ),
+ 'comment' => array(
+ 'title' => $lang['strcomment'],
+ 'field' => 'aggcomment',
+ ),
+ );
+
+ $actions = array();
+
+ $misc->printTable($aggregates, $columns, $actions, $lang['strnoaggregates'], 'aggPre');
}
$misc->printHeader($lang['straggregates']);
/**
* Manage databases within a server
*
- * $Id: all_db.php,v 1.23 2004/05/08 14:44:56 chriskl Exp $
+ * $Id: all_db.php,v 1.24 2004/07/07 02:59:56 chriskl Exp $
*/
// Include application functions
function doDefault($msg = '') {
global $data, $conf, $misc;
global $PHP_SELF, $lang;
-
- echo "<h2>{$lang['strdatabases']}</h2>\n";
+
+ $misc->printTitle(array($lang['strdatabases']), '');
$misc->printMsg($msg);
$databases = &$data->getDatabases();
- if ($databases->recordCount() > 0) {
- echo "<table>\n";
- echo "<tr><th class=\"data\">{$lang['strdatabase']}</th><th class=\"data\">{$lang['strowner']}</th>";
- echo "<th class=\"data\">{$lang['strencoding']}</th>";
- echo "<th class=\"data\">{$lang['stractions']}</th>\n";
- if ($conf['show_comments']) echo "<th class=\"data\">{$lang['strcomment']}</th>";
- echo "</tr>\n";
- $i = 0;
- while (!$databases->EOF) {
- $id = (($i % 2) == 0 ? '1' : '2');
- echo "<tr><td class=\"data{$id}\">", $misc->printVal($databases->f[$data->dbFields['dbname']]), "</td>\n";
- echo "<td class=\"data{$id}\">", $misc->printVal($databases->f[$data->dbFields['owner']]), "</td>\n";
- echo "<td class=\"data{$id}\">", $misc->printVal($databases->f[$data->dbFields['encoding']]), "</td>\n";
- echo "<td class=\"opbutton{$id}\"><a href=\"$PHP_SELF?action=confirm_drop&db=",
- urlencode($databases->f[$data->dbFields['dbname']]), "\">{$lang['strdrop']}</a></td>\n";
- if ($conf['show_comments']) echo "<td class=\"data{$id}\">", htmlspecialchars($databases->f[$data->dbFields['dbcomment']]), "</td>\n";
- echo "</tr>\n";
- $databases->moveNext();
- $i++;
- }
- echo "</table>\n";
- }
- else {
- echo "<p>{$lang['strnodatabases']}</p>\n";
- }
+
+ $columns = array(
+ 'database' => array(
+ 'title' => $lang['strdatabase'],
+ 'field' => 'datname',
+ ),
+ 'owner' => array(
+ 'title' => $lang['strowner'],
+ 'field' => 'datowner',
+ ),
+ 'encoding' => array(
+ 'title' => $lang['strencoding'],
+ 'field' => 'datencoding',
+ ),
+ 'actions' => array(
+ 'title' => $lang['stractions'],
+ ),
+ 'comment' => array(
+ 'title' => $lang['strcomment'],
+ 'field' => 'datcomment',
+ ),
+ );
+ $actions = array(
+ 'properties' => array(
+ 'title' => $lang['strproperties'],
+ 'url' => 'database.php?',
+ 'vars' => array('database' => 'datname'),
+ ),
+ 'drop' => array(
+ 'title' => $lang['strdrop'],
+ 'url' => "{$PHP_SELF}?action=confirm_drop&",
+ 'vars' => array('db' => 'datname'),
+ ),
+ );
+
+ $misc->printTable($databases, $columns, $actions, $lang['strnodatabases']);
+
echo "<p><a class=\"navlink\" href=\"$PHP_SELF?action=create\">{$lang['strcreatedatabase']}</a></p>\n";
}
* if you click on a database it shows a list of database objects in that
* database.
*
- * $Id: browser.php,v 1.38 2004/06/26 22:24:09 xzilla Exp $
+ * $Id: browser.php,v 1.39 2004/07/07 02:59:56 chriskl Exp $
*/
// Include application functions
$tables = &$data->getTables();
while (!$tables->EOF) {
- $return_url = urlencode("tblproperties.php?table=" . urlencode($tables->f[$data->tbFields['tbname']]) . "&{$querystr}");
+ $return_url = urlencode("tblproperties.php?table=" . urlencode($tables->f['relname']) . "&{$querystr}");
$item_node = &new HTML_TreeNode(array(
- 'text' => $misc->printVal($tables->f[$data->tbFields['tbname']]),
+ 'text' => $misc->printVal($tables->f['relname']),
'link' => addslashes(htmlspecialchars("tblproperties.php?{$querystr}&table=" .
- urlencode($tables->f[$data->tbFields['tbname']]))),
+ urlencode($tables->f['relname']))),
'icon' => "../../../images/themes/{$conf['theme']}/tables.png",
'expandedIcon' => "../../../images/themes/{$conf['theme']}/tables.png",
'expanded' => false,
'linkTarget' => 'detail',
- 'iconLink' => addslashes(htmlspecialchars('display.php?table='.urlencode($tables->f[$data->tbFields['tbname']]).'&objtype=table&'.$querystr.
+ 'iconLink' => addslashes(htmlspecialchars('display.php?table='.urlencode($tables->f['relname']).'&objtype=table&'.$querystr.
"&return_url={$return_url}&return_desc=" . urlencode($lang['strback'])))
));
$views = &$data->getViews();
while (!$views->EOF) {
- $return_url = urlencode("viewproperties.php?view=" . urlencode($views->f[$data->vwFields['vwname']]) . "&{$querystr}");
+ $return_url = urlencode("viewproperties.php?view=" . urlencode($views->f['relname']) . "&{$querystr}");
$item_node = &new HTML_TreeNode(array(
- 'text' => $misc->printVal($views->f[$data->vwFields['vwname']]),
+ 'text' => $misc->printVal($views->f['relname']),
'link' => addslashes(htmlspecialchars("viewproperties.php?{$querystr}&view=" .
- urlencode($views->f[$data->vwFields['vwname']]))),
+ urlencode($views->f['relname']))),
'icon' => "../../../images/themes/{$conf['theme']}/views.png",
'expandedIcon' => "../../../images/themes/{$conf['theme']}/views.png",
'expanded' => false,
'linkTarget' => 'detail',
// XXX: FIX BROWSE
- 'iconLink' => addslashes(htmlspecialchars('display.php?table='.urlencode($views->f[$data->vwFields['vwname']]).'&objtype=view&'.$querystr.
+ 'iconLink' => addslashes(htmlspecialchars('display.php?table='.urlencode($views->f['relname']).'&objtype=view&'.$querystr.
"&return_url={$return_url}&return_desc=" . urlencode($lang['strback'])))
));
$databases = &$data->getDatabases();
while (!$databases->EOF) {
// If database is selected, show folder, otherwise show document
- if (isset($_REQUEST['database']) && $_REQUEST['database'] == $databases->f[$data->dbFields['dbname']]) {
+ if (isset($_REQUEST['database']) && $_REQUEST['database'] == $databases->f['datname']) {
// Very ugly hack to work around the fact that the PEAR HTML_Tree can't have links with embedded
// apostrophes create the get string we need to append
- $querystr = 'database=' . urlencode($databases->f[$data->dbFields['dbname']]) . '&' . SID;
+ $querystr = 'database=' . urlencode($databases->f['datname']) . '&' . SID;
$db_node = &new HTML_TreeNode(array(
- 'text' => $misc->printVal($databases->f[$data->dbFields['dbname']]),
+ 'text' => $misc->printVal($databases->f['datname']),
'link' => addslashes(htmlspecialchars("database.php?{$querystr}")),
'icon' => "../../../images/themes/{$conf['theme']}/database.png",
'expandedIcon' => "../../../images/themes/{$conf['theme']}/database.png",
if ($data->hasSchemas()) {
$schemas = &$data->getSchemas();
while (!$schemas->EOF) {
- $data->setSchema($schemas->f[$data->nspFields['nspname']]);
+ $data->setSchema($schemas->f['nspname']);
// Construct database & schema query string
- $querystr = 'database=' . urlencode($databases->f[$data->dbFields['dbname']]). '&schema=' .
- urlencode($schemas->f[$data->nspFields['nspname']]) . '&' . SID;
+ $querystr = 'database=' . urlencode($databases->f['datname']). '&schema=' .
+ urlencode($schemas->f['nspname']) . '&' . SID;
$schemanode = &new HTML_TreeNode(array(
- 'text' => $misc->printVal($schemas->f[$data->nspFields['nspname']]),
+ 'text' => $misc->printVal($schemas->f['nspname']),
'link' => addslashes(htmlspecialchars("schema.php?{$querystr}")),
'icon' => 'folder.gif',
'expandedIcon' => 'folder-expanded.gif',
// Auto-expand your personal schema, if it exists. Also expand schema if there is
// only one schema in the database.
- 'expanded' => ($schemas->f[$data->nspFields['nspname']] == $_SESSION['webdbUsername']
+ 'expanded' => ($schemas->f['nspname'] == $_SESSION['webdbUsername']
|| $schemas->recordCount() == 1),
'linkTarget' => 'detail'));
// Database doesn't support schemas
else {
// Construct database query string
- $querystr = 'database=' . urlencode($databases->f[$data->dbFields['dbname']]) . '&' . SID;
+ $querystr = 'database=' . urlencode($databases->f['datname']) . '&' . SID;
addNodes($db_node, $querystr);
}
// Reset database query string
- $querystr = 'database=' . urlencode($databases->f[$data->dbFields['dbname']]) . '&' . SID;
+ $querystr = 'database=' . urlencode($databases->f['datname']) . '&' . SID;
// Languages
if ($conf['show_advanced']) {
} else {
// Very ugly hack to work around the fact that the PEAR HTML_Tree can't have links with embedded
// apostrophes create the get string we need to append
- $jsLink = '?database=' . addslashes(htmlspecialchars(urlencode($databases->f[$data->dbFields['dbname']]) . '&' . SID));
+ $jsLink = '?database=' . addslashes(htmlspecialchars(urlencode($databases->f['datname']) . '&' . SID));
$jsLink = "javascript:updateLinks(' + \"'{$jsLink}'\" + ')";
$db_node = &new HTML_TreeNode(array(
- 'text' => $misc->printVal($databases->f[$data->dbFields['dbname']]),
+ 'text' => $misc->printVal($databases->f['datname']),
'link' => $jsLink,
'icon' => "../../../images/themes/{$conf['theme']}/database.png",
'expandedIcon' => "../../../images/themes/{$conf['theme']}/database.png",
/**
* Manage casts in a database
*
- * $Id: casts.php,v 1.5 2003/12/17 09:11:32 chriskl Exp $
+ * $Id: casts.php,v 1.6 2004/07/07 02:59:56 chriskl Exp $
*/
// Include application functions
global $data, $misc, $database;
global $PHP_SELF, $lang;
- echo "<h2>", $misc->printVal($_REQUEST['database']), ": {$lang['strcasts']}</h2>\n";
+ function castPre(&$rowdata) {
+ global $data, $lang;
+ $rowdata->f['+castfunc'] = is_null($rowdata->f['castfunc']) ? $lang['strbinarycompat'] : $rowdata->f['castfunc'];
+ switch ($rowdata->f['castcontext']) {
+ case 'e':
+ $rowdata->f['+castcontext'] = $lang['strno'];
+ break;
+ case 'a':
+ $rowdata->f['+castcontext'] = $lang['strinassignment'];
+ break;
+ default:
+ $rowdata->f['+castcontext'] = $lang['stryes'];
+ }
+ }
+
+ $misc->printTitle(array($misc->printVal($_REQUEST['database']), $lang['strcasts']));
$misc->printMsg($msg);
$casts = &$data->getcasts();
- if ($casts->recordCount() > 0) {
- echo "<table>\n";
- echo "<tr><th class=\"data\">{$lang['strsourcetype']}</th><th class=\"data\">{$lang['strtargettype']}</th>";
- echo "<th class=\"data\">{$lang['strfunction']}</th><th class=\"data\">{$lang['strimplicit']}</th>";
- echo "</tr>\n";
- $i = 0;
- while (!$casts->EOF) {
- $id = (($i % 2) == 0 ? '1' : '2');
- echo "<tr><td class=\"data{$id}\">", $misc->printVal($casts->f['castsource']), "</td>\n";
- echo "<td class=\"data{$id}\">", $misc->printVal($casts->f['casttarget']), "</td>\n";
- echo "<td class=\"data{$id}\">", ($casts->f['castfunc'] === null) ? $lang['strbinarycompat'] : $misc->printVal($casts->f['castfunc']), "</td>\n";
- echo "<td class=\"data{$id}\">";
- switch ($casts->f['castcontext']) {
- case 'e':
- echo $lang['strno'];
- break;
- case 'a':
- echo $lang['strinassignment'];
- break;
- default:
- echo $lang['stryes'];
- }
- echo "</td>\n";
- echo "</tr>\n";
- $casts->moveNext();
- $i++;
- }
- echo "</table>\n";
- }
- else {
- echo "<p>{$lang['strnocasts']}</p>\n";
- }
+ $columns = array(
+ 'source_type' => array(
+ 'title' => $lang['strsourcetype'],
+ 'field' => 'castsource',
+ ),
+ 'target_type' => array(
+ 'title' => $lang['strtargettype'],
+ 'field' => 'casttarget',
+ ),
+ 'function' => array(
+ 'title' => $lang['strfunction'],
+ 'field' => '+castfunc',
+ ),
+ 'implicit' => array(
+ 'title' => $lang['strimplicit'],
+ 'field' => '+castcontext',
+ 'type' => 'verbatim',
+ ),
+ );
+
+ $actions = array();
+
+ $misc->printTable($casts, $columns, $actions, $lang['strnocasts'], 'castPre');
}
$misc->printHeader($lang['strcasts']);
/**
* Class to hold various commonly used functions
*
- * $Id: Misc.php,v 1.66 2004/06/11 05:08:26 xzilla Exp $
+ * $Id: Misc.php,v 1.67 2004/07/07 03:00:01 chriskl Exp $
*/
class Misc {
// space at the start of a line, or a space at the start of the whole string then
// substitute all spaces for s
if ($str === null && $shownull) return '<i>NULL</i>';
- else {
+ elseif ($str) {
switch ($type) {
case 'int2':
case 'int4':
return htmlspecialchars(addCSlashes($str, "\0..\37\177..\377"));
break;
default:
- if (strstr($str, ' ') || strstr($str, "\t") || strstr($str, "\n ") || ereg('^[ ]', $str)) {
+ if (strstr($str, ' ') || strstr($str, "\t") || strstr($str, "\n ") || $str{0} == ' ') {
$str = str_replace(' ', ' ', htmlspecialchars($str));
// Replace tabs with 8 spaces
$str = str_replace("\t", ' ', $str);
else
return nl2br(htmlspecialchars($str));
}
- }
+ } else
+ return '';
}
/**
echo "</script>\n";
}
+ /**
+ * Display navigation tabs
+ * @params $tabs An associative array of tabs definitions, see printTableNav() for an example.
+ */
+ function printTabs($tabs) {
+ echo "<table class=\"navbar\" border=\"0\" width=\"100%\" cellpadding=\"5\" cellspacing=\"3\"><tr>\n";
+
+ $width = round(100 / count($tabs)).'%';
+ if (!isset($_REQUEST['tab'])) $_REQUEST['tab'] = '';
+
+ foreach ($tabs as $tab_id => $tab) {
+ if ($tab_id == $_REQUEST['tab'])
+ $class = ' class="active"';
+ else
+ $class = '';
+ echo "<td width=\"{$width}\"{$class}><a href=\"{$tab['url']}&tab={$tab_id}\">{$tab['title']}</a></td>\n";
+ }
+
+ echo "</tr></table>\n";
+ }
+
/**
* Display the navigation header for tables
*/
function printTableNav() {
global $lang;
-
+
$vars = $this->href . '&table=' . urlencode($_REQUEST['table']);
- // Width of each cell
- $width = round(100 / 9) . '%';
- echo "<table class=\"navbar\" border=\"0\" width=\"100%\" cellpadding=\"5\" cellspacing=\"3\"><tr>\n";
- echo "<td width=\"{$width}\"><a href=\"tblproperties.php?{$vars}\">{$lang['strcolumns']}</a></td>\n";
- echo "<td width=\"{$width}\"><a href=\"indexes.php?{$vars}\">{$lang['strindexes']}</a></td>\n";
- echo "<td width=\"{$width}\"><a href=\"constraints.php?{$vars}\">{$lang['strconstraints']}</a></td>\n";
- echo "<td width=\"{$width}\"><a href=\"triggers.php?{$vars}\">{$lang['strtriggers']}</a></td>\n";
- echo "<td width=\"{$width}\"><a href=\"rules.php?{$this->href}&reltype=table&relation=", urlencode($_REQUEST['table']),
- "\">{$lang['strrules']}</a></td>\n";
- echo "<td width=\"{$width}\"><a href=\"info.php?{$vars}\">{$lang['strinfo']}</a></td>\n";
- echo "<td width=\"{$width}\"><a href=\"privileges.php?{$vars}&type=table&object=", urlencode($_REQUEST['table']),
- "\">{$lang['strprivileges']}</a></td>\n";
- echo "<td width=\"{$width}\"><a href=\"tblproperties.php?{$vars}&action=import\">{$lang['strimport']}</a></td>\n";
- echo "<td width=\"{$width}\"><a href=\"tblproperties.php?{$vars}&action=export\">{$lang['strexport']}</a></td>\n";
- echo "</tr></table>\n";
+ $tabs = array (
+ 'columns' => array (
+ 'title' => $lang['strcolumns'],
+ 'url' => "tblproperties.php?{$vars}",
+ ),
+ 'indexes' => array (
+ 'title' => $lang['strindexes'],
+ 'url' => "indexes.php?{$vars}",
+ ),
+ 'constraints' => array (
+ 'title' => $lang['strconstraints'],
+ 'url' => "constraints.php?{$vars}",
+ ),
+ 'triggers' => array (
+ 'title' => $lang['strtriggers'],
+ 'url' => "triggers.php?{$vars}",
+ ),
+ 'rules' => array (
+ 'title' => $lang['strrules'],
+ 'url' => "rules.php?{$this->href}&reltype=table&relation=" . urlencode($_REQUEST['table']),
+ ),
+ 'info' => array (
+ 'title' => $lang['strinfo'],
+ 'url' => "info.php?{$vars}",
+ ),
+ 'privileges' => array (
+ 'title' => $lang['strprivileges'],
+ 'url' => "privileges.php?{$vars}&type=table&object=" . urlencode($_REQUEST['table']),
+ ),
+ 'import' => array (
+ 'title' => $lang['strimport'],
+ 'url' => "tblproperties.php?{$vars}&action=import",
+ ),
+ 'export' => array (
+ 'title' => $lang['strexport'],
+ 'url' => "tblproperties.php?{$vars}&action=export",
+ ),
+ );
+
+ $this->printTabs($tabs);
}
/**
global $lang;
$vars = $this->href . '&view=' . urlencode($_REQUEST['view']);
-
- echo "<table class=\"navbar\" border=\"0\" width=\"100%\" cellpadding=\"5\" cellspacing=\"3\"><tr>\n";
- echo "<td width=\"12%\"><a href=\"viewproperties.php?{$vars}\">{$lang['strcolumns']}</a></td>\n";
- echo "<td width=\"12%\"><a href=\"viewproperties.php?action=definition&{$vars}\">{$lang['strdefinition']}</a></td>\n";
- echo "<td width=\"12%\"><a href=\"rules.php?{$this->href}&reltype=view&relation=", urlencode($_REQUEST['view']),
- "\">{$lang['strrules']}</a></td>\n";
- echo "<td width=\"12%\"><a href=\"privileges.php?{$vars}&type=view&object=", urlencode($_REQUEST['view']), "\">{$lang['strprivileges']}</a></td>\n";
- //echo "<td width=\"13%\"><a href=\"viewproperties.php?{$vars}&action=export\">{$lang['strexport']}</a></td>\n";
- echo "</tr></table>\n";
+
+ $tabs = array (
+ 'columns' => array (
+ 'title' => $lang['strcolumns'],
+ 'url' => "viewproperties.php?{$vars}",
+ ),
+ 'definition' => array (
+ 'title' => $lang['strdefinition'],
+ 'url' => "viewproperties.php?action=definition&{$vars}",
+ ),
+ 'rules' => array (
+ 'title' => $lang['strrules'],
+ 'url' => "rules.php?{$this->href}&reltype=view&relation=" . urlencode($_REQUEST['view']),
+ ),
+ 'privileges' => array (
+ 'title' => $lang['strprivileges'],
+ 'url' => "privileges.php?{$vars}&type=view&object=" . urlencode($_REQUEST['view']),
+ ),
+ );
+
+ $this->printTabs($tabs);
}
/**
global $lang, $conf, $data;
$vars = 'database=' . urlencode($_REQUEST['database']);
+
+ $tabs = array (
+ 'schemas' => array (
+ 'title' => $lang['strschemas'],
+ 'url' => "database.php?{$vars}",
+ ),
+ 'sql' => array (
+ 'title' => $lang['strsql'],
+ 'url' => "database.php?{$vars}&action=sql",
+ ),
+ 'find' => array (
+ 'title' => $lang['strfind'],
+ 'url' => "database.php?{$vars}&action=find",
+ ),
+ 'variables' => array (
+ 'title' => $lang['strvariables'],
+ 'url' => "database.php?{$vars}&action=variables",
+ ),
+ 'processes' => array (
+ 'title' => $lang['strprocesses'],
+ 'url' => "database.php?{$vars}&action=processes",
+ ),
+ 'admin' => array (
+ 'title' => $lang['stradmin'],
+ 'url' => "database.php?{$vars}&action=admin",
+ ),
+ 'privileges' => array (
+ 'title' => $lang['strprivileges'],
+ 'url' => "privileges.php?{$vars}&type=database&object=" . urlencode($_REQUEST['database']),
+ ),
+ 'export' => array (
+ 'title' => $lang['strexport'],
+ 'url' => "database.php?{$vars}&action=export",
+ ),
+ );
+
+ if (!$data->hasSchemas()) unset($tabs['schemas']);
+ if (!$data->hasVariables()) unset($tabs['variables']);
+ if (!$data->hasProcesses()) unset($tabs['processes']);
+ if (!isset($data->privlist['database'])) unset($tabs['privileges']);
+ if (!$this->isDumpEnabled()) unset($tabs['export']);
- echo "<table class=\"navbar\" border=\"0\" width=\"100%\" cellpadding=\"5\" cellspacing=\"3\"><tr>\n";
- // Only show schemas if available
- if ($data->hasSchemas()) {
- echo "<td width=\"12%\"><a href=\"database.php?{$vars}\">{$lang['strschemas']}</a></td>\n";
- }
- echo "<td width=\"12%\"><a href=\"database.php?{$vars}&action=sql\">{$lang['strsql']}</a></td>\n";
- echo "<td width=\"13%\"><a href=\"database.php?{$vars}&action=find\">{$lang['strfind']}</a></td>\n";
- if ($data->hasVariables()) {
- echo "<td width=\"12%\"><a href=\"database.php?{$vars}&action=variables\">{$lang['strvariables']}</a></td>\n";
- }
- if ($data->hasProcesses()) {
- echo "<td width=\"13%\"><a href=\"database.php?{$vars}&action=processes\">{$lang['strprocesses']}</a></td>\n";
- }
- echo "<td width=\"12%\"><a href=\"database.php?{$vars}&action=admin\">{$lang['stradmin']}</a></td>\n";
- // Only show database privs if available
- if (isset($data->privlist['database'])) {
- echo "<td width=\"13%\"><a href=\"privileges.php?{$vars}&type=database&object=", urlencode($_REQUEST['database']), "\">{$lang['strprivileges']}</a></td>\n";
- }
- // Check that database dumps are enabled.
- if ($this->isDumpEnabled()) {
- echo "<td width=\"13%\"><a href=\"database.php?{$vars}&action=export\">{$lang['strexport']}</a></td>\n";
- }
- echo "</tr></table>\n";
+ $this->printTabs($tabs);
}
/**
if (isset($_REQUEST['database'])) $url = '&database=' . urlencode($_REQUEST['database']);
else $url = '';
- echo "<table class=\"navbar\" border=\"0\" width=\"100%\" cellpadding=\"5\" cellspacing=\"3\"><tr>\n";
- echo "<td width=\"50%\"><a href=\"sqledit.php?action=sql{$url}\">{$lang['strsql']}</a></td>\n";
- echo "<td width=\"50%\"><a href=\"sqledit.php?action=find{$url}\">{$lang['strfind']}</a></td>\n";
- echo "</tr></table>\n";
+ $tabs = array (
+ 'sql' => array (
+ 'title' => $lang['strsql'],
+ 'url' => "sqledit.php?action=sql{$url}",
+ ),
+ 'find' => array (
+ 'title' => $lang['strfind'],
+ 'url' => "sqledit.php?action=find{$url}",
+ ),
+ );
+
+ $this->printTabs($tabs);
}
/**
return $nSize;
}
}
+
+ /**
+ * Clip a string down to a specified length, and append an ellipsis.
+ * @param $str The string to be clipped.
+ * @param $maxlen (optional) Maximum length of string (defaults to the configuration value 'max_chars'.
+ * @param $ellipsis (optional) The string to append if clipping was performed.
+ */
+ function clipString($str, $maxlen = null, $ellipsis = null) {
+ global $lang, $conf;
+ if (is_null($maxlen)) $maxlen = $conf['max_chars'];
+ if (is_null($ellipsis)) $ellipsis = $lang['strellipsis'];
+ if (strlen($str) > $maxlen) {
+ return substr($str, 0, $maxlen-1) . $ellipsis;
+ } else {
+ return $str;
+ }
+ }
+
+ function printUrlVars($vars, $fields) {
+ foreach ($vars as $var => $varfield) {
+ echo "{$var}=", urlencode($fields[$varfield]), "&";
+ }
+ }
+
+ /**
+ * Format a table cell according to a set of parameters.
+ * @param $value The value to display
+ * @param $params Associative array of type parameters, or just a type name.
+ * @return The HTML formatted string
+ */
+ function printCell($value, $params) {
+ global $lang, $data;
+
+ if (is_string($params)) {
+ $type = $params;
+ $params = array();
+ } else {
+ $type = isset($params['type']) ? $params['type'] : 'str';
+ }
+ $out = '';
+
+ switch ($type) {
+ case 'bool':
+ case 'boolean':
+ $out = $data->phpBool($value)
+ ? (isset($params['true']) ? $params['true'] : $lang['strtrue'])
+ : (isset($params['false']) ? $params['false'] : $lang['strfalse']);
+ break;
+ case 'num':
+ case 'numeric':
+ $align = 'right';
+ $out = nl2br(htmlspecialchars($value));
+ break;
+ case 'pre':
+ $tag = 'pre';
+ $out = htmlspecialchars($value);
+ break;
+ case 'nbsp':
+ $out = nl2br(str_replace(' ', ' ', htmlspecialchars($value)));
+ break;
+ case 'verbatim':
+ $out = $value;
+ break;
+ case 'str':
+ case 'string':
+ default:
+ $out = nl2br(htmlspecialchars($value));
+ break;
+ }
+
+ if (isset($params['class'])) $class = $params['class'];
+
+ if (!isset($tag) && (isset($class) || isset($align))) $tag = 'div';
+
+ if (isset($tag)) {
+ $alignattr = isset($align) ? " align=\"{$align}\"" : '';
+ $classattr = isset($class) ? " class=\"{$class}\"" : '';
+ return "<{$tag}{$alignattr}{$classattr}>{$out}</{$tag}>";
+ }
+
+ return $out;
+ }
+
+ /**
+ * Display a table of data.
+ * @param $tabledata A set of data to be formatted, as returned by $data->getDatabases() etc.
+ * @param $columns An associative array of columns to be displayed:
+ * $columns = array(
+ * column_id => array(
+ * 'title' => Column heading,
+ * 'field' => Field name for $tabledata->f[...],
+ * ), ...
+ * );
+ * @param $actions Actions that can be performed on each object:
+ * $actions = array(
+ * action_id => array(
+ * 'title' => Action heading,
+ * 'url' => Static part of URL,
+ * 'vars' => Associative array of (URL variable => field name),
+ * ), ...
+ * );
+ * @param $nodata (optional) Message to display if data set is empty.
+ * @param $pre_fn (optional) Name of a function to call for each row,
+ * it will be passed two params: $rowdata and $actions,
+ * it may be used to derive new fields or modify actions.
+ * It can return an array of actions specific to the row,
+ * or if nothing is returned then the standard actions are used.
+ * (see functions.php and constraints.php for examples)
+ */
+ function printTable(&$tabledata, &$columns, &$actions, $nodata = null, $pre_fn = null) {
+ global $data, $conf, $misc;
+ global $PHP_SELF;
+
+ if ($tabledata->recordCount() > 0) {
+
+ // Remove the 'comment' column if they have been disabled
+ if (!$conf['show_comments']) {
+ unset($columns['comment']);
+ }
+
+ // Apply the 'properties' action to the first column
+ // and remove it from the action list.
+ // (Remove this section to keep the 'Properties' button instead of links)
+ if (isset($actions['properties'])) {
+ reset($columns);
+ $first_column = key($columns);
+ $columns[$first_column]['url'] = $actions['properties']['url'];
+ $columns[$first_column]['vars'] = $actions['properties']['vars'];
+ unset($actions['properties']);
+ }
+
+ // TEMP: Display field keys
+ //echo "<p>", join(', ', array_keys($tabledata->f)), "</p>";
+ // END OF TEMP
+
+ echo "<table>\n";
+ echo "<tr>\n";
+ foreach ($columns as $column_id => $column) {
+ switch ($column_id) {
+ case 'actions':
+ echo "<th class=\"data\" colspan=\"", count($actions), "\">{$column['title']}</th>\n";
+ break;
+ default:
+ echo "<th class=\"data\">{$column['title']}</th>\n";
+ break;
+ }
+ }
+ echo "</tr>\n";
+
+ ob_start();
+
+ $i = 0;
+ while (!$tabledata->EOF) {
+ $id = ($i % 2) + 1;
+
+ unset($alt_actions);
+ if (!is_null($pre_fn)) $alt_actions = $pre_fn(&$tabledata, $actions);
+ if (!isset($alt_actions)) $alt_actions =& $actions;
+
+ echo "<tr>\n";
+
+ foreach ($columns as $column_id => $column) {
+
+ // Apply default values for missing parameters
+ if (isset($column['url']) && !isset($column['vars'])) $column['vars'] = array();
+
+ switch ($column_id) {
+ case 'actions':
+ foreach ($alt_actions as $action) {
+ if (isset($action['disable'])) {
+ echo "<td class=\"data{$id}\"></td>";
+ } else {
+ echo "<td class=\"opbutton{$id}\">";
+ echo "<a href=\"{$action['url']}";
+ $misc->printUrlVars($action['vars'], &$tabledata->f);
+ echo "\">{$action['title']}</a></td>";
+ }
+ }
+ break;
+ case 'comment':
+ // Uncomment this for clipped comments.
+ //$tabledata->f[$column['field']] = $misc->clipString($tabledata->f[$column['field']]);
+ default;
+ echo "<td class=\"data{$id}\">";
+ if (isset($column['url'])) {
+ echo "<a href=\"{$column['url']}";
+ $misc->printUrlVars($column['vars'], &$tabledata->f);
+ echo "\">";
+ }
+
+ $cell = $misc->printCell($tabledata->f[$column['field']], &$column);
+ echo $cell;
+
+ if (isset($column['url'])) echo "</a>";
+
+ echo "</td>\n";
+ break;
+ }
+ }
+ echo "</tr>\n";
+
+ ob_flush();
+ $tabledata->moveNext();
+ $i++;
+ }
+
+ ob_end_flush();
+
+ echo "</table>\n";
+
+ return true;
+ } else {
+ if (!is_null($nodata)) {
+ echo "<p>{$nodata}</p>\n";
+ }
+ return false;
+ }
+ }
+
}
?>
* A class that implements the DB interface for Postgres
* Note: This class uses ADODB and returns RecordSets.
*
- * $Id: Postgres.php,v 1.227 2004/06/28 02:26:57 chriskl Exp $
+ * $Id: Postgres.php,v 1.228 2004/07/07 03:00:07 chriskl Exp $
*/
// @@@ THOUGHT: What about inherits? ie. use of ONLY???
class Postgres extends BaseDB {
- var $dbFields = array('dbname' => 'datname', 'encoding' => 'encoding', 'owner' => 'owner', 'dbcomment' => 'description');
- var $tbFields = array('tbname' => 'tablename', 'tbowner' => 'tableowner', 'tbcomment' => 'tablecomment');
- var $vwFields = array('vwname' => 'viewname', 'vwowner' => 'viewowner', 'vwdef' => 'definition', 'vwcomment' => 'comment');
- var $uFields = array('uname' => 'usename', 'usuper' => 'usesuper', 'ucreatedb' => 'usecreatedb', 'uexpires' => 'valuntil');
- var $grpFields = array('groname' => 'groname', 'grolist' => 'grolist');
- var $sqFields = array('seqname' => 'relname', 'seqowner' => 'usename', 'lastvalue' => 'last_value', 'incrementby' => 'increment_by', 'maxvalue' => 'max_value', 'minvalue'=> 'min_value', 'cachevalue' => 'cache_value', 'logcount' => 'log_cnt', 'iscycled' => 'is_cycled', 'iscalled' => 'is_called' );
- var $ixFields = array('idxname' => 'relname', 'idxdef' => 'pg_get_indexdef', 'uniquekey' => 'indisunique', 'primarykey' => 'indisprimary');
- var $rlFields = array('rulename' => 'rulename', 'ruledef' => 'definition');
- var $tgFields = array('tgname' => 'tgname', 'tgdef' => 'tgdef');
- var $cnFields = array('conname' => 'conname', 'consrc' => 'consrc', 'contype' => 'contype');
- var $typFields = array('typname' => 'typname', 'typowner' => 'typowner', 'typin' => 'typin',
- 'typout' => 'typout', 'typlen' => 'typlen', 'typdef' => 'typdef', 'typelem' => 'typelem',
- 'typdelim' => 'typdelim', 'typbyval' => 'typbyval',
- 'typalign' => 'typalign', 'typstorage' => 'typstorage');
- var $fnFields = array('fnname' => 'proname', 'fnreturns' => 'return_type', 'fnarguments' => 'arguments','fnoid' => 'oid', 'fndef' => 'source', 'fnlang' => 'language', 'setof' => 'proretset' );
- var $langFields = array('lanname' => 'lanname');
-
// Array of allowed type alignments
var $typAligns = array('char', 'int2', 'int4', 'double');
// The default type alignment
else
$where = '';
- $sql = "SELECT pdb.datname, pu.usename AS owner, pg_encoding_to_char(encoding) AS encoding,
- (SELECT description FROM pg_description pd WHERE pdb.oid=pd.objoid) AS description
+ $sql = "SELECT pdb.datname, pu.usename AS datowner, pg_encoding_to_char(encoding) AS datencoding,
+ (SELECT description FROM pg_description pd WHERE pdb.oid=pd.objoid) AS datcomment
FROM pg_database pdb, pg_user pu
WHERE pdb.datdba = pu.usesysid
{$where}
$this->rollbackTransaction();
return null;
}
- $this->fieldClean($t->f['tablename']);
+ $this->fieldClean($t->f['relname']);
// Fetch attributes
$atts = &$this->getTableAttributes($table);
}
// Output a reconnect command to create the table as the correct user
- $sql = $this->getChangeUserSQL($t->f['tableowner']) . "\n\n";
+ $sql = $this->getChangeUserSQL($t->f['relowner']) . "\n\n";
// Set schema search path if we support schemas
if ($this->hasSchemas()) {
if ($this->hasSchemas()) {
$sql .= "\"{$this->_schema}\".";
}
- $sql .= "\"{$t->f['tablename']}\";\n";
- $sql .= "CREATE TABLE \"{$t->f['tablename']}\" (\n";
+ $sql .= "\"{$t->f['relname']}\";\n";
+ $sql .= "CREATE TABLE \"{$t->f['relname']}\" (\n";
// Output all table columns
$col_comments_sql = ''; // Accumulate comments on columns
// Does this column have a comment?
if ($atts->f['comment'] !== null) {
$this->clean($atts->f['comment']);
- $col_comments_sql .= "COMMENT ON COLUMN \"{$t->f['tablename']}\".\"{$atts->f['attname']}\" IS '{$atts->f['comment']}';\n";
+ $col_comments_sql .= "COMMENT ON COLUMN \"{$t->f['relname']}\".\"{$atts->f['attname']}\" IS '{$atts->f['comment']}';\n";
}
$atts->moveNext();
$sql .= "\n";
$first = false;
}
- $sql .= "ALTER TABLE ONLY \"{$t->f['tablename']}\" ALTER COLUMN \"{$atts->f['attname']}\" SET STATISTICS {$atts->f['attstattarget']};\n";
+ $sql .= "ALTER TABLE ONLY \"{$t->f['relname']}\" ALTER COLUMN \"{$atts->f['attname']}\" SET STATISTICS {$atts->f['attstattarget']};\n";
}
// Then storage
if ($atts->f['attstorage'] != $atts->f['typstorage']) {
$this->rollbackTransaction();
return null;
}
- $sql .= "ALTER TABLE ONLY \"{$t->f['tablename']}\" ALTER COLUMN \"{$atts->f['attname']}\" SET STORAGE {$storage};\n";
+ $sql .= "ALTER TABLE ONLY \"{$t->f['relname']}\" ALTER COLUMN \"{$atts->f['attname']}\" SET STORAGE {$storage};\n";
}
$atts->moveNext();
}
// Comment
- if ($t->f['tablecomment'] !== null) {
- $this->clean($t->f['tablecomment']);
+ if ($t->f['relcomment'] !== null) {
+ $this->clean($t->f['relcomment']);
$sql .= "\n-- Comment\n\n";
- $sql .= "COMMENT ON TABLE \"{$t->f['tablename']}\" IS '{$t->f['tablecomment']}';\n";
+ $sql .= "COMMENT ON TABLE \"{$t->f['relname']}\" IS '{$t->f['relcomment']}';\n";
}
// Add comments on columns, if any
* wire-in knowledge about the default public privileges for different
* kinds of objects.
*/
- $sql .= "REVOKE ALL ON TABLE \"{$t->f['tablename']}\" FROM PUBLIC;\n";
+ $sql .= "REVOKE ALL ON TABLE \"{$t->f['relname']}\" FROM PUBLIC;\n";
foreach ($privs as $v) {
// Get non-GRANT OPTION privs
$nongrant = array_diff($v[2], $v[4]);
// Skip empty or owner ACEs
- if (sizeof($v[2]) == 0 || ($v[0] == 'user' && $v[1] == $t->f['tableowner'])) continue;
+ if (sizeof($v[2]) == 0 || ($v[0] == 'user' && $v[1] == $t->f['relowner'])) continue;
// Change user if necessary
- if ($this->hasGrantOption() && $v[3] != $t->f['tableowner']) {
+ if ($this->hasGrantOption() && $v[3] != $t->f['relowner']) {
$grantor = $v[3];
$this->clean($grantor);
$sql .= "SET SESSION AUTHORIZATION '{$grantor}';\n";
}
// Output privileges with no GRANT OPTION
- $sql .= "GRANT " . join(', ', $nongrant) . " ON TABLE \"{$t->f['tablename']}\" TO ";
+ $sql .= "GRANT " . join(', ', $nongrant) . " ON TABLE \"{$t->f['relname']}\" TO ";
switch ($v[0]) {
case 'public':
$sql .= "PUBLIC;\n";
}
// Reset user if necessary
- if ($this->hasGrantOption() && $v[3] != $t->f['tableowner']) {
+ if ($this->hasGrantOption() && $v[3] != $t->f['relowner']) {
$sql .= "RESET SESSION AUTHORIZATION;\n";
}
if (!$this->hasGrantOption() || sizeof($v[4]) == 0) continue;
// Change user if necessary
- if ($this->hasGrantOption() && $v[3] != $t->f['tableowner']) {
+ if ($this->hasGrantOption() && $v[3] != $t->f['relowner']) {
$grantor = $v[3];
$this->clean($grantor);
$sql .= "SET SESSION AUTHORIZATION '{$grantor}';\n";
}
- $sql .= "GRANT " . join(', ', $v[4]) . " ON \"{$t->f['tablename']}\" TO ";
+ $sql .= "GRANT " . join(', ', $v[4]) . " ON \"{$t->f['relname']}\" TO ";
switch ($v[0]) {
case 'public':
$sql .= "PUBLIC";
$sql .= " WITH GRANT OPTION;\n";
// Reset user if necessary
- if ($this->hasGrantOption() && $v[3] != $t->f['tableowner']) {
+ if ($this->hasGrantOption() && $v[3] != $t->f['relowner']) {
$sql .= "RESET SESSION AUTHORIZATION;\n";
}
if ($indexes->recordCount() > 0) {
$sql .= "\n-- Indexes\n\n";
while (!$indexes->EOF) {
- $sql .= $indexes->f['pg_get_indexdef'] . ";\n";
+ $sql .= $indexes->f['idxdef'] . ";\n";
$indexes->moveNext();
}
$sql = "
SELECT
- NULL AS schemaname, relname
+ NULL AS nspname, relname
FROM
pg_class pc, pg_inherits pi
WHERE
$sql = "
SELECT
- NULL AS schemaname, relname
+ NULL AS nspname, relname
FROM
pg_class pc, pg_inherits pi
WHERE
function &getTable($table) {
$this->clean($table);
- $sql = "SELECT pc.relname AS tablename,
- pg_get_userbyid(pc.relowner) AS tableowner,
+ $sql = "SELECT pc.relname,
+ pg_get_userbyid(pc.relowner) AS relowner,
(SELECT description FROM pg_description pd
- WHERE pc.oid=pd.objoid) AS tablecomment
+ WHERE pc.oid=pd.objoid) AS relcomment
FROM pg_class pc
WHERE pc.relname='{$table}'";
if (!$conf['show_system'] || $all) $where = "AND c.relname NOT LIKE 'pg\\\\_%' ";
else $where = '';
- $sql = "SELECT NULL AS schemaname, c.relname AS tablename,
- (SELECT usename FROM pg_user u WHERE u.usesysid=c.relowner) AS tableowner,
- (SELECT description FROM pg_description pd WHERE c.oid=pd.objoid) AS tablecomment
+ $sql = "SELECT NULL AS nspname, c.relname,
+ (SELECT usename FROM pg_user u WHERE u.usesysid=c.relowner) AS relowner,
+ (SELECT description FROM pg_description pd WHERE c.oid=pd.objoid) AS relcomment
FROM pg_class c
WHERE c.relkind='r'
AND NOT EXISTS (SELECT 1 FROM pg_rewrite r WHERE r.ev_class = c.oid AND r.ev_type = '1')
// If owner has been changed, then do the alteration. We are
// careful to avoid this generally as changing owner is a
// superuser only function.
- if ($data->f[$this->tbFields['tbowner']] != $owner) {
+ if ($data->f['relowner'] != $owner) {
$sql = "ALTER TABLE \"{$table}\" OWNER TO \"{$owner}\"";
$status = $this->execute($sql);
*/
function &getSequences() {
$sql = "SELECT
- c.relname,
- u.usename,
+ c.relname AS seqname,
+ u.usename AS seqowner,
(SELECT description FROM pg_description pd WHERE c.oid=pd.objoid) AS seqcomment
FROM
- pg_class c, pg_user u WHERE c.relowner=u.usesysid AND c.relkind = 'S' ORDER BY relname";
+ pg_class c, pg_user u WHERE c.relowner=u.usesysid AND c.relkind = 'S' ORDER BY seqname";
return $this->selectSet( $sql );
}
$this->fieldClean($sequence);
$this->clean($temp);
- $sql = "SELECT sequence_name AS relname, *,
+ $sql = "SELECT sequence_name AS seqname, *,
(SELECT description FROM pg_description pd WHERE pd.objoid=(SELECT oid FROM pg_class WHERE relname='{$temp}')) AS seqcomment
FROM \"{$sequence}\" AS s";
*/
function &getIndexes($table = '') {
$this->clean($table);
- $sql = "SELECT c2.relname, i.indisprimary, i.indisunique, pg_get_indexdef(i.indexrelid)
+ $sql = "SELECT c2.relname AS indname, i.indisprimary, i.indisunique, pg_get_indexdef(i.indexrelid) AS inddef
FROM pg_class c, pg_class c2, pg_index i
WHERE c.relname = '{$table}' AND c.oid = i.indrelid AND i.indexrelid = c2.oid
AND NOT i.indisprimary AND NOT i.indisunique
else
$where = '';
- $sql = "SELECT viewname, viewowner, definition,
+ $sql = "SELECT viewname AS relname, viewowner AS relowner, definition AS vwdefinition,
(SELECT description FROM pg_description pd, pg_class pc
- WHERE pc.oid=pd.objoid AND pc.relname=v.viewname) AS comment
+ WHERE pc.oid=pd.objoid AND pc.relname=v.viewname) AS relcomment
FROM pg_views v
{$where}
- ORDER BY viewname";
+ ORDER BY relname";
return $this->selectSet($sql);
}
function &getView($view) {
$this->clean($view);
- $sql = "SELECT viewname, viewowner, definition,
+ $sql = "SELECT viewname AS relname, viewowner AS relowner, definition AS vwdefinition,
(SELECT description FROM pg_description pd, pg_class pc
- WHERE pc.oid=pd.objoid AND pc.relname=v.viewname) AS comment
+ WHERE pc.oid=pd.objoid AND pc.relname=v.viewname) AS relcomment
FROM pg_views v
WHERE viewname='{$view}'";
* @return All users
*/
function &getUsers() {
- $sql = "SELECT usename, usesuper, usecreatedb, valuntil";
+ $sql = "SELECT usename, usesuper, usecreatedb, valuntil AS useexpires";
if ($this->hasUserSessionDefaults()) $sql .= ", useconfig";
$sql .= " FROM pg_user ORDER BY usename";
function &getUser($username) {
$this->clean($username);
- $sql = "SELECT usename, usesuper, usecreatedb, valuntil";
+ $sql = "SELECT usename, usesuper, usecreatedb, valuntil AS useexpires";
if ($this->hasUserSessionDefaults()) $sql .= ", useconfig";
$sql .= " FROM pg_user WHERE usename='{$username}'";
case 'function':
// Function comes in with $object as function OID
$fn = &$this->getFunction($object);
- $this->fieldClean($fn->f[$this->fnFields['fnname']]);
- $sql .= " FUNCTION \"{$fn->f[$this->fnFields['fnname']]}\"({$fn->f[$this->fnFields['fnarguments']]})";
+ $this->fieldClean($fn->f['proname']);
+ $sql .= " FUNCTION \"{$fn->f['proname']}\"({$fn->f['proarguments']})";
break;
case 'language':
$this->fieldClean($object);
$where = "AND pc.oid > '{$this->_lastSystemOID}'::oid";
$sql = "SELECT
- pc.oid,
+ pc.oid AS prooid,
proname,
proretset,
- pt.typname AS return_type,
- oidvectortypes(pc.proargtypes) AS arguments,
- (SELECT description FROM pg_description pd WHERE pc.oid=pd.objoid) AS funccomment
+ pt.typname AS proresult,
+ oidvectortypes(pc.proargtypes) AS proarguments,
+ (SELECT description FROM pg_description pd WHERE pc.oid=pd.objoid) AS procomment
FROM
pg_proc pc, pg_user pu, pg_type pt
WHERE
{$where}
UNION
SELECT
- pc.oid,
+ pc.oid AS prooid,
proname,
proretset,
- 'OPAQUE' AS result,
- oidvectortypes(pc.proargtypes) AS arguments,
- (SELECT description FROM pg_description pd WHERE pc.oid=pd.objoid) AS funccomment
+ 'OPAQUE' AS proresult,
+ oidvectortypes(pc.proargtypes) AS proarguments,
+ (SELECT description FROM pg_description pd WHERE pc.oid=pd.objoid) AS procomment
FROM
pg_proc pc, pg_user pu, pg_type pt
WHERE
AND pc.prorettype = 0
{$where}
ORDER BY
- proname, return_type
+ proname, proresult
";
return $this->selectSet($sql);
$this->clean($function_oid);
$sql = "SELECT
- pc.oid,
+ pc.oid AS prooid,
proname,
- lanname as language,
- pt.typname as return_type,
- prosrc as source,
- probin as binary,
+ lanname AS prolanguage,
+ pt.typname AS proresult,
+ prosrc,
+ probin,
proretset,
proiscachable,
- oidvectortypes(pc.proargtypes) AS arguments,
- (SELECT description FROM pg_description pd WHERE pc.oid=pd.objoid) AS funccomment
+ oidvectortypes(pc.proargtypes) AS proarguments,
+ (SELECT description FROM pg_description pd WHERE pc.oid=pd.objoid) AS procomment
FROM
pg_proc pc, pg_language pl, pg_type pt
WHERE
function createFunction($funcname, $args, $returns, $definition, $language, $flags, $setof, $replace = false) {
$this->fieldClean($funcname);
$this->clean($args);
- $this->clean($definition);
$this->clean($language);
$this->arrayClean($flags);
// For some reason, the returns field cannot have quotes...
$sql .= ") RETURNS ";
if ($setof) $sql .= "SETOF ";
- $sql .= "{$returns} AS '\n";
- $sql .= $definition;
- $sql .= "\n'";
+ $sql .= "{$returns} AS ";
+
+ if (is_array($definition)) {
+ $this->arrayClean($definition);
+ $sql .= "'" . $definition[0] . "'";
+ if ($definition[1]) {
+ $sql .= ",'" . $definition[1] . "'";
+ }
+ } else {
+ $this->clean($definition);
+ $sql .= "'" . $definition . "'";
+ }
+
$sql .= " LANGUAGE '{$language}'";
// Add flags
function dropFunction($function_oid, $cascade) {
// Function comes in with $object as function OID
$fn = &$this->getFunction($function_oid);
- $this->fieldClean($fn->f[$this->fnFields['fnname']]);
+ $this->fieldClean($fn->f['proname']);
- $sql = "DROP FUNCTION \"{$fn->f[$this->fnFields['fnname']]}\"({$fn->f[$this->fnFields['fnarguments']]})";
+ $sql = "DROP FUNCTION \"{$fn->f['proname']}\"({$fn->f['proarguments']})";
if ($cascade) $sql .= " CASCADE";
return $this->execute($sql);
* A class that implements the DB interface for Postgres
* Note: This class uses ADODB and returns RecordSets.
*
- * $Id: Postgres71.php,v 1.61 2004/06/27 06:22:29 xzilla Exp $
+ * $Id: Postgres71.php,v 1.62 2004/07/07 03:00:07 chriskl Exp $
*/
// @@@ THOUGHT: What about inherits? ie. use of ONLY???
else
$where = ' AND pdb.datallowconn';
- $sql = "SELECT pdb.datname, pu.usename AS owner, pg_encoding_to_char(encoding) AS encoding,
- (SELECT description FROM pg_description pd WHERE pdb.oid=pd.objoid) AS description
+ $sql = "SELECT pdb.datname AS datname, pu.usename AS datowner, pg_encoding_to_char(encoding) AS datencoding,
+ (SELECT description FROM pg_description pd WHERE pdb.oid=pd.objoid) AS datcomment
FROM pg_database pdb, pg_user pu
WHERE pdb.datdba = pu.usesysid
{$where}
// Get the minimum value of the sequence
$seq = &$this->getSequence($sequence);
if ($seq->recordCount() != 1) return -1;
- $minvalue = $seq->f[$this->sqFields['minvalue']];
+ $minvalue = $seq->f['min_value'];
/* This double-cleaning is deliberate */
$this->fieldClean($sequence);
$this->clean($function_oid);
$sql = "SELECT
- pc.oid,
+ pc.oid AS prooid,
proname,
- lanname as language,
- format_type(prorettype, NULL) as return_type,
- prosrc as source,
- probin as binary,
+ lanname as prolanguage,
+ format_type(prorettype, NULL) as proresult,
+ prosrc,
+ probin,
proretset,
proisstrict,
proiscachable,
- oidvectortypes(pc.proargtypes) AS arguments,
- (SELECT description FROM pg_description pd WHERE pc.oid=pd.objoid) AS funccomment
+ oidvectortypes(pc.proargtypes) AS proarguments,
+ (SELECT description FROM pg_description pd WHERE pc.oid=pd.objoid) AS procomment
FROM
pg_proc pc, pg_language pl
WHERE
* A class that implements the DB interface for Postgres
* Note: This class uses ADODB and returns RecordSets.
*
- * $Id: Postgres72.php,v 1.71 2004/06/28 02:26:57 chriskl Exp $
+ * $Id: Postgres72.php,v 1.72 2004/07/07 03:00:07 chriskl Exp $
*/
function &getTable($table) {
$this->clean($table);
- $sql = "SELECT pc.relname AS tablename,
- pg_get_userbyid(pc.relowner) AS tableowner,
+ $sql = "SELECT pc.relname,
+ pg_get_userbyid(pc.relowner) AS relowner,
(SELECT description FROM pg_description pd
- WHERE pc.oid=pd.objoid AND objsubid = 0) AS tablecomment
+ WHERE pc.oid=pd.objoid AND objsubid = 0) AS relcomment
FROM pg_class pc
WHERE pc.relname='{$table}'";
if (!$conf['show_system'] || $all) $where = "AND c.relname NOT LIKE 'pg\\\\_%' ";
else $where = '';
- $sql = "SELECT NULL AS schemaname, c.relname AS tablename,
- (SELECT usename FROM pg_user u WHERE u.usesysid=c.relowner) AS tableowner,
- (SELECT description FROM pg_description pd WHERE c.oid=pd.objoid AND objsubid = 0) AS tablecomment
+ $sql = "SELECT NULL AS nspname, c.relname,
+ (SELECT usename FROM pg_user u WHERE u.usesysid=c.relowner) AS relowner,
+ (SELECT description FROM pg_description pd WHERE c.oid=pd.objoid AND objsubid = 0) AS relcomment
FROM pg_class c WHERE c.relkind='r' {$where}ORDER BY relname";
return $this->selectSet($sql);
}
else
$where = '';
- $sql = "SELECT viewname, viewowner, definition,
+ $sql = "SELECT viewname AS relname, viewowner AS relowner, definition AS vwdefinition,
(SELECT description FROM pg_description pd, pg_class pc
- WHERE pc.oid=pd.objoid AND pc.relname=v.viewname AND pd.objsubid = 0) AS comment
+ WHERE pc.oid=pd.objoid AND pc.relname=v.viewname AND pd.objsubid = 0) AS relcomment
FROM pg_views v
{$where}
- ORDER BY viewname";
+ ORDER BY relname";
return $this->selectSet($sql);
}
function &getView($view) {
$this->clean($view);
- $sql = "SELECT viewname, viewowner, definition,
+ $sql = "SELECT viewname AS relname, viewowner AS relowner, definition AS vwdefinition,
(SELECT description FROM pg_description pd, pg_class pc
- WHERE pc.oid=pd.objoid AND pc.relname=v.viewname AND pd.objsubid = 0) AS comment
+ WHERE pc.oid=pd.objoid AND pc.relname=v.viewname AND pd.objsubid = 0) AS relcomment
FROM pg_views v
WHERE viewname='{$view}'";
$where = "AND p.oid > '{$this->_lastSystemOID}'";
$sql = "SELECT
- p.oid,
+ p.oid AS prooid,
p.proname,
false AS proretset,
- format_type(p.prorettype, NULL) AS return_type,
- oidvectortypes(p.proargtypes) AS arguments,
- (SELECT description FROM pg_description pd WHERE p.oid=pd.objoid) AS funccomment
+ format_type(p.prorettype, NULL) AS proresult,
+ oidvectortypes(p.proargtypes) AS proarguments,
+ (SELECT description FROM pg_description pd WHERE p.oid=pd.objoid) AS procomment
FROM
pg_proc p
WHERE
AND (pronargs = 0 OR oidvectortypes(p.proargtypes) <> '')
{$where}
ORDER BY
- p.proname, return_type
+ p.proname, proresult
";
return $this->selectSet($sql);
* A class that implements the DB interface for Postgres
* Note: This class uses ADODB and returns RecordSets.
*
- * $Id: Postgres73.php,v 1.123 2004/07/06 09:05:42 chriskl Exp $
+ * $Id: Postgres73.php,v 1.124 2004/07/07 03:00:07 chriskl Exp $
*/
// @@@ THOUGHT: What about inherits? ie. use of ONLY???
class Postgres73 extends Postgres72 {
- var $uFields = array('uname' => 'usename', 'usuper' => 'usesuper', 'ucreatedb' => 'usecreatedb', 'uexpires' => 'valuntil', 'udefaults' => 'useconfig');
-
- var $nspFields = array('nspname' => 'nspname', 'nspowner' => 'nspowner', 'nspcomment' => 'comment');
- var $conFields = array('conname' => 'conname', 'conowner' => 'conowner');
-
// Store the current schema
var $_schema;
elseif (sizeof($paths) == 0) return -2;
$this->fieldArrayClean($paths);
- $sql = 'SET SEARCH_PATH TO "' . implode('"', $paths) . '", pg_catalog';
+ $sql = 'SET SEARCH_PATH TO "' . implode('","', $paths) . '", pg_catalog';
return $this->execute($sql);
}
if (!$conf['show_system']) $and = "AND nspname NOT LIKE 'pg\\\\_%'";
else $and = '';
- $sql = "SELECT pn.nspname, pu.usename AS nspowner, pg_catalog.obj_description(pn.oid, 'pg_namespace') AS comment
+ $sql = "SELECT pn.nspname, pu.usename AS nspowner, pg_catalog.obj_description(pn.oid, 'pg_namespace') AS nspcomment
FROM pg_catalog.pg_namespace pn, pg_catalog.pg_user pu
WHERE pn.nspowner = pu.usesysid
{$and} ORDER BY nspname";
*/
function &getSchemaByName($schema) {
$this->clean($schema);
- $sql = "SELECT nspname, nspowner,nspacl, pg_catalog.obj_description(pn.oid, 'pg_namespace') as comment
+ $sql = "SELECT nspname, nspowner, nspacl, pg_catalog.obj_description(pn.oid, 'pg_namespace') as nspcomment
FROM pg_catalog.pg_namespace pn
WHERE nspname='{$schema}'";
return $this->selectSet($sql);
function &getTable($table) {
$this->clean($table);
- $sql = "
+ $sql = "
SELECT
- c.relname AS tablename,
- u.usename AS tableowner,
- pg_catalog.obj_description(c.oid, 'pg_class') AS tablecomment
+ c.relname, u.usename AS relowner,
+ pg_catalog.obj_description(c.oid, 'pg_class') AS relcomment
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_user u ON u.usesysid = c.relowner
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
function &getTables($all = false) {
if ($all) {
// Exclude pg_catalog and information_schema tables
- $sql = "SELECT schemaname, tablename, tableowner
+ $sql = "SELECT schemaname AS nspname, tablename AS relname, tableowner AS relname
FROM pg_catalog.pg_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema', 'pg_toast')
ORDER BY schemaname, tablename";
} else {
- $sql = "SELECT c.relname AS tablename, pg_catalog.pg_get_userbyid(c.relowner) AS tableowner,
- pg_catalog.obj_description(c.oid, 'pg_class') AS tablecomment
+ $sql = "SELECT c.relname, pg_catalog.pg_get_userbyid(c.relowner) AS relowner,
+ pg_catalog.obj_description(c.oid, 'pg_class') AS relcomment
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'r'
$sql = "
SELECT
- pn.nspname AS schemaname, relname
+ pn.nspname, relname
FROM
pg_catalog.pg_class pc, pg_catalog.pg_inherits pi, pg_catalog.pg_namespace pn
WHERE
$sql = "
SELECT
- pn.nspname AS schemaname, relname
+ pn.nspname, relname
FROM
pg_catalog.pg_class pc, pg_catalog.pg_inherits pi, pg_catalog.pg_namespace pn
WHERE
* @return All views
*/
function getViews() {
- $sql = "SELECT c.relname AS viewname, pg_catalog.pg_get_userbyid(c.relowner) AS viewowner,
- pg_catalog.obj_description(c.oid, 'pg_class') AS comment
+ $sql = "SELECT c.relname, pg_catalog.pg_get_userbyid(c.relowner) AS relowner,
+ pg_catalog.obj_description(c.oid, 'pg_class') AS relcomment
FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)
- WHERE (n.nspname='{$this->_schema}') AND (c.relkind = 'v'::\"char\") ORDER BY viewname";
+ WHERE (n.nspname='{$this->_schema}') AND (c.relkind = 'v'::\"char\") ORDER BY relname";
return $this->selectSet($sql);
}
function &getView($view) {
$this->clean($view);
- $sql = "SELECT c.relname AS viewname, pg_catalog.pg_get_userbyid(c.relowner) AS viewowner,
- pg_catalog.pg_get_viewdef(c.oid) AS definition, pg_catalog.obj_description(c.oid, 'pg_class') AS comment
+ $sql = "SELECT c.relname, pg_catalog.pg_get_userbyid(c.relowner) AS relowner,
+ pg_catalog.pg_get_viewdef(c.oid) AS vwdefinition, pg_catalog.obj_description(c.oid, 'pg_class') AS relcomment
FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)
WHERE (c.relname = '$view')
AND n.nspname='{$this->_schema}'";
* @return A recordset
*/
function &getSequences() {
- $sql = "SELECT c.relname, u.usename, pg_catalog.obj_description(c.oid, 'pg_class') AS seqcomment
+ $sql = "SELECT c.relname AS seqname, u.usename AS seqowner, pg_catalog.obj_description(c.oid, 'pg_class') AS seqcomment
FROM pg_catalog.pg_class c, pg_catalog.pg_user u, pg_catalog.pg_namespace n
WHERE c.relowner=u.usesysid AND c.relnamespace=n.oid
- AND c.relkind = 'S' AND n.nspname='{$this->_schema}' ORDER BY relname";
+ AND c.relkind = 'S' AND n.nspname='{$this->_schema}' ORDER BY seqname";
return $this->selectSet( $sql );
}
function &getSequence($sequence) {
$this->fieldClean($sequence);
- $sql = "SELECT sequence_name AS relname, *, pg_catalog.obj_description(s.tableoid, 'pg_class') AS seqcomment FROM \"{$sequence}\" AS s";
+ $sql = "SELECT sequence_name AS seqname, *, pg_catalog.obj_description(s.tableoid, 'pg_class') AS seqcomment FROM \"{$sequence}\" AS s";
return $this->selectSet( $sql );
}
$this->clean($table);
/* This select excludes any indexes that are just base indexes for constraints. */
- $sql = "SELECT c2.relname, i.indisprimary, i.indisunique, i.indisclustered,
- pg_catalog.pg_get_indexdef(i.indexrelid) as pg_get_indexdef
+ $sql = "SELECT c2.relname AS indname, i.indisprimary, i.indisunique, i.indisclustered,
+ pg_catalog.pg_get_indexdef(i.indexrelid) AS inddef
FROM pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_index i
WHERE c.relname = '{$table}' AND pg_catalog.pg_table_is_visible(c.oid)
AND c.oid = i.indrelid AND i.indexrelid = c2.oid
$sql = "SELECT
{$distinct}
- p.oid,
+ p.oid AS prooid,
p.proname,
p.proretset,
- pg_catalog.format_type(p.prorettype, NULL) AS return_type,
- pg_catalog.oidvectortypes(p.proargtypes) AS arguments,
- pg_catalog.obj_description(p.oid, 'pg_proc') AS funccomment
+ pg_catalog.format_type(p.prorettype, NULL) AS proresult,
+ pg_catalog.oidvectortypes(p.proargtypes) AS proarguments,
+ pg_catalog.obj_description(p.oid, 'pg_proc') AS procomment
FROM pg_catalog.pg_proc p
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE p.prorettype <> 'pg_catalog.cstring'::pg_catalog.regtype
AND p.proargtypes[0] <> 'pg_catalog.cstring'::pg_catalog.regtype
AND NOT p.proisagg
AND {$where}
- ORDER BY p.proname, return_type
+ ORDER BY p.proname, proresult
";
return $this->selectSet($sql);
$this->clean($function_oid);
$sql = "SELECT
- pc.oid,
+ pc.oid AS prooid,
proname,
- lanname as language,
- format_type(prorettype, NULL) as return_type,
- prosrc as source,
- probin as binary,
+ lanname as prolanguage,
+ format_type(prorettype, NULL) as proresult,
+ prosrc,
+ probin,
proretset,
proisstrict,
provolatile,
prosecdef,
- oidvectortypes(pc.proargtypes) AS arguments,
- pg_catalog.obj_description(pc.oid, 'pg_proc') AS funccomment
+ oidvectortypes(pc.proargtypes) AS proarguments,
+ pg_catalog.obj_description(pc.oid, 'pg_proc') AS procomment
FROM
pg_catalog.pg_proc pc, pg_catalog.pg_language pl
WHERE
function createFunction($funcname, $args, $returns, $definition, $language, $flags, $setof, $replace = false) {
$this->fieldClean($funcname);
$this->clean($args);
- $this->clean($definition);
$this->clean($language);
$this->arrayClean($flags);
// For some reason, the returns field cannot have quotes...
$sql .= ") RETURNS ";
if ($setof) $sql .= "SETOF ";
- $sql .= "{$returns} AS '\n";
- $sql .= $definition;
- $sql .= "\n'";
+ $sql .= "{$returns} AS ";
+
+ if (is_array($definition)) {
+ $this->arrayClean($definition);
+ $sql .= "'" . $definition[0] . "'";
+ if ($definition[1]) {
+ $sql .= ",'" . $definition[1] . "'";
+ }
+ } else {
+ $this->clean($definition);
+ $sql .= "'" . $definition . "'";
+ }
$sql .= " LANGUAGE \"{$language}\"";
function &getLinkingKeys($tables) {
if (!is_array($tables)) return -1;
- $tables_list = "'{$tables[0]['tablename']}'";
- $schema_list = "'{$tables[0]['schemaname']}'";
- $schema_tables_list = "'{$tables[0]['schemaname']}.{$tables[0]['tablename']}'";
+ $tables_list = "'{$tables[0]['relname']}'";
+ $schema_list = "'{$tables[0]['nspname']}'";
+ $schema_tables_list = "'{$tables[0]['nspname']}.{$tables[0]['relname']}'";
for ($i = 1; $i < sizeof($tables); $i++) {
- $tables_list .= ", '{$tables[$i]['tablename']}'";
- $schema_list .= ", '{$tables[$i]['schemaname']}'";
- $schema_tables_list .= ", '{$tables[$i]['schemaname']}.{$tables[$i]['tablename']}'";
+ $tables_list .= ", '{$tables[$i]['relname']}'";
+ $schema_list .= ", '{$tables[$i]['nspname']}'";
+ $schema_tables_list .= ", '{$tables[$i]['nspname']}.{$tables[$i]['relname']}'";
}
$maxDimension = 1;
* A class that implements the DB interface for Postgres
* Note: This class uses ADODB and returns RecordSets.
*
- * $Id: Postgres74.php,v 1.34 2004/06/11 05:08:27 xzilla Exp $
+ * $Id: Postgres74.php,v 1.35 2004/07/07 03:00:07 chriskl Exp $
*/
include_once('./classes/database/Postgres73.php');
if (!$conf['show_system']) $and = "WHERE nspname NOT LIKE 'pg\\\\_%' AND nspname != 'information_schema'";
else $and = '';
- $sql = "SELECT pn.nspname, pu.usename AS nspowner, pg_catalog.obj_description(pn.oid, 'pg_namespace') AS comment
+ $sql = "SELECT pn.nspname, pu.usename AS nspowner, pg_catalog.obj_description(pn.oid, 'pg_namespace') AS nspcomment
FROM pg_catalog.pg_namespace pn
JOIN pg_catalog.pg_user pu ON (pn.nspowner = pu.usesysid)
{$and} ORDER BY nspname";
$this->clean($table);
/* This select excludes any indexes that are just base indexes for constraints. */
- $sql = "SELECT c2.relname, i.indisprimary, i.indisunique, i.indisclustered,
- pg_catalog.pg_get_indexdef(i.indexrelid, 0, true) AS pg_get_indexdef
+ $sql = "SELECT c2.relname AS indname, i.indisprimary, i.indisunique, i.indisclustered,
+ pg_catalog.pg_get_indexdef(i.indexrelid, 0, true) AS inddef
FROM pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_index i
WHERE c.relname = '{$table}' AND pg_catalog.pg_table_is_visible(c.oid)
AND c.oid = i.indrelid AND i.indexrelid = c2.oid
function &getView($view) {
$this->clean($view);
- $sql = "SELECT c.relname AS viewname, pg_catalog.pg_get_userbyid(c.relowner) AS viewowner,
- pg_catalog.pg_get_viewdef(c.oid, true) AS definition, pg_catalog.obj_description(c.oid, 'pg_class') AS comment
+ $sql = "SELECT c.relname, pg_catalog.pg_get_userbyid(c.relowner) AS relowner,
+ pg_catalog.pg_get_viewdef(c.oid, true) AS vwdefinition, pg_catalog.obj_description(c.oid, 'pg_class') AS relcomment
FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)
WHERE (c.relname = '$view')
AND n.nspname='{$this->_schema}'";
/**
* PostgreSQL 7.5 support
*
- * $Id: Postgres75.php,v 1.8 2004/07/06 09:05:42 chriskl Exp $
+ * $Id: Postgres75.php,v 1.9 2004/07/07 03:00:07 chriskl Exp $
*/
include_once('./classes/database/Postgres74.php');
function &getSchemas() {
global $conf;
- if (!$conf['show_system']) $and = "AND nspname NOT LIKE 'pg\\\\_%'";
+ if (!$conf['show_system']) $and = "AND nspname NOT LIKE 'pg\\\\_%' AND nspname != 'information_schema'";
else $and = '';
- $sql = "SELECT pn.nspname, pu.usename AS nspowner, pg_catalog.obj_description(pn.oid, 'pg_namespace') AS comment,
+ $sql = "SELECT pn.nspname, pu.usename AS nspowner, pg_catalog.obj_description(pn.oid, 'pg_namespace') AS nspcomment,
(SELECT spcname FROM pg_catalog.pg_tablespace pt WHERE pt.oid=pn.nsptablespace) AS tablespace
FROM pg_catalog.pg_namespace pn, pg_catalog.pg_user pu
WHERE pn.nspowner = pu.usesysid
/**
* List constraints on a table
*
- * $Id: constraints.php,v 1.30 2004/06/10 07:15:52 chriskl Exp $
+ * $Id: constraints.php,v 1.31 2004/07/07 02:59:56 chriskl Exp $
*/
// Include application functions
global $PHP_SELF;
global $lang;
+ function cnPre(&$rowdata, $actions) {
+ global $data, $lang;
+ if (is_null($rowdata->f['consrc'])) {
+ $atts = &$data->getAttributeNames($_REQUEST['table'], explode(' ', $rowdata->f['indkey']));
+ $rowdata->f['+definition'] = ($rowdata->f['contype'] == 'u' ? "UNIQUE (" : "PRIMARY KEY (") . join(',', $atts) . ')';
+ } else {
+ $rowdata->f['+definition'] = $rowdata->f['consrc'];
+ }
+
+ if ($rowdata->f['contype'] == 'u' || $rowdata->f['contype'] == 'p') {
+ $rowdata->f['+clustered'] = $rowdata->f['indisclustered'];
+ //$rowdata->f['+clustered'] = $data->phpBool($rowdata->f['indisclustered']) ? $lang['stryes'] : $lang['strno'];
+ } else {
+ $rowdata->f['+clustered'] = '';
+
+ // Disable actions for non index constraints
+ $actions['cluster']['disable'] = true;
+ $actions['reindex']['disable'] = true;
+ return $actions;
+ }
+ }
+
$misc->printTableNav();
- echo "<h2>", $misc->printVal($_REQUEST['database']), ": ", $misc->printVal($_REQUEST['table']), ": {$lang['strconstraints']}</h2>\n";
+ $misc->printTitle(array($misc->printVal($_REQUEST['database']), $misc->printVal($_REQUEST['table']), $lang['strconstraints']));
$misc->printMsg($msg);
$constraints = &$data->getConstraints($_REQUEST['table']);
- if ($constraints->recordCount() > 0) {
- echo "<table>\n";
- echo "<tr><th class=\"data\">{$lang['strname']}</th><th class=\"data\">{$lang['strdefinition']}</th>\n";
- if ($data->hasIsClustered()) {
- echo "<th class=\"data\">{$lang['strclustered']}</th>";
- }
- echo "<th class=\"data\" colspan=\"3\">{$lang['stractions']}</th>\n";
- echo "</tr>\n";
- $i = 0;
-
- while (!$constraints->EOF) {
- $id = ( ($i % 2 ) == 0 ? '1' : '2' );
- echo "<tr><td class=\"data{$id}\">", $misc->printVal($constraints->f[$data->cnFields['conname']]), "</td>";
- echo "<td class=\"data{$id}\">";
- // Nasty hack to support pre-7.4 PostgreSQL
- if ($constraints->f['consrc'] !== null)
- echo $misc->printVal($constraints->f[$data->cnFields['consrc']]);
- else {
- $atts = &$data->getAttributeNames($_REQUEST['table'], explode(' ', $constraints->f['indkey']));
- echo ($constraints->f['contype'] == 'u') ? "UNIQUE (" : "PRIMARY KEY (";
- echo join(',', $atts);
- echo ")";
- }
- echo "</td>";
- if ($data->hasIsClustered()) {
- if ($constraints->f['contype'] == 'u' || $constraints->f['contype'] == 'p') {
- $constraints->f['indisclustered'] = $data->phpBool($constraints->f['indisclustered']);
- echo "<td class=\"data{$id}\">", ($constraints->f['indisclustered'] ? $lang['stryes'] : $lang['strno']), "</td>";
- } else {
- echo "<td class=\"data{$id}\"></td>";
- }
- }
- // You can only cluster primary key and unique constraints!
- if ($constraints->f['contype'] == 'u' || $constraints->f['contype'] == 'p') {
- echo "<td class=\"opbutton{$id}\">";
- echo "<a href=\"$PHP_SELF?action=confirm_cluster_constraint&{$misc->href}&constraint=",
- urlencode($constraints->f[$data->cnFields['conname']]),
- "&table=", urlencode($_REQUEST['table']), "\">{$lang['strcluster']}</a></td>";
- echo "<td class=\"opbutton{$id}\">";
- echo "<a href=\"$PHP_SELF?action=reindex&{$misc->href}&constraint=",
- urlencode($constraints->f[$data->cnFields['conname']]),
- "&table=", urlencode($_REQUEST['table']), "\">{$lang['strreindex']}</a></td>";
- }
- else {
- echo "<td class=\"data{$id}\"> </td>";
- echo "<td class=\"data{$id}\"> </td>";
- }
- echo "<td class=\"opbutton{$id}\">";
- echo "<a href=\"$PHP_SELF?action=confirm_drop&{$misc->href}&constraint=", urlencode($constraints->f[$data->cnFields['conname']]),
- "&table=", urlencode($_REQUEST['table']), "&type=", urlencode($constraints->f['contype']), "\">{$lang['strdrop']}</td>";
- echo "</tr>\n";
-
- $constraints->moveNext();
- $i++;
- }
-
- echo "</table>\n";
- }
- else
- echo "<p>{$lang['strnoconstraints']}</p>\n";
+ $columns = array(
+ 'constraint' => array(
+ 'title' => $lang['strname'],
+ 'field' => 'conname',
+ ),
+ 'definition' => array(
+ 'title' => $lang['strdefinition'],
+ 'field' => '+definition',
+ 'type' => 'pre',
+ ),
+ 'clustered' => array(
+ 'title' => $lang['strclustered'],
+ 'field' => '+clustered',
+ 'type' => 'bool',
+ 'true' => $lang['stryes'],
+ 'false' => $lang['strno'],
+ ),
+ 'actions' => array(
+ 'title' => $lang['stractions'],
+ ),
+ );
+
+ $actions = array(
+ 'cluster' => array(
+ 'title' => $lang['strcluster'],
+ 'url' => "{$PHP_SELF}?action=confirm_cluster_constraint&{$misc->href}&table=".urlencode($_REQUEST['table'])."&",
+ 'vars' => array('constraint' => 'conname'),
+ ),
+ 'reindex' => array(
+ 'title' => $lang['strreindex'],
+ 'url' => "{$PHP_SELF}?action=reindex&{$misc->href}&table=".urlencode($_REQUEST['table'])."&",
+ 'vars' => array('constraint' => 'conname'),
+ ),
+ 'drop' => array(
+ 'title' => $lang['strdrop'],
+ 'url' => "{$PHP_SELF}?action=confirm_drop_index&{$misc->href}&table=".urlencode($_REQUEST['table'])."&",
+ 'vars' => array('constraint' => 'conname', 'type' => 'contype'),
+ ),
+ );
+
+ if (!$data->hasIsClustered()) unset($columns['clustered']);
+
+ $misc->printTable($constraints, $columns, $actions, $lang['strnoconstraints'], 'cnPre');
echo "<p><a class=\"navlink\" href=\"{$PHP_SELF}?action=add_check&{$misc->href}&table=", urlencode($_REQUEST['table']),
"\">{$lang['straddcheck']}</a> |\n";
/**
* Manage conversions in a database
*
- * $Id: conversions.php,v 1.5 2004/05/08 14:44:56 chriskl Exp $
+ * $Id: conversions.php,v 1.6 2004/07/07 02:59:56 chriskl Exp $
*/
// Include application functions
global $data, $conf, $misc, $database;
global $PHP_SELF, $lang;
- echo "<h2>", $misc->printVal($_REQUEST['database']), ": {$lang['strconversions']}</h2>\n";
+ $misc->printTitle(array($misc->printVal($_REQUEST['database']), $lang['strconversions']), 'conversions');
$misc->printMsg($msg);
$conversions = &$data->getconversions();
-
- if ($conversions->recordCount() > 0) {
- echo "<table>\n";
- echo "<tr><th class=\"data\">{$lang['strname']}</th><th class=\"data\">{$lang['strsourceencoding']}</th>";
- echo "<th class=\"data\">{$lang['strtargetencoding']}</th><th class=\"data\">{$lang['strdefault']}</th>";
- if ($conf['show_comments']) echo "<th class=\"data\">{$lang['strcomment']}</th>\n";
- echo "</tr>\n";
- $i = 0;
- while (!$conversions->EOF) {
- $conversions->f['condefault'] = $data->phpBool($conversions->f['condefault']);
- $id = (($i % 2) == 0 ? '1' : '2');
- echo "<tr><td class=\"data{$id}\">", $misc->printVal($conversions->f['conname']), "</td>\n";
- echo "<td class=\"data{$id}\">", $misc->printVal($conversions->f['conforencoding']), "</td>\n";
- echo "<td class=\"data{$id}\">", $misc->printVal($conversions->f['contoencoding']), "</td>\n";
- echo "<td class=\"data{$id}\">", ($conversions->f['condefault']) ? $lang['stryes'] : $lang['strno'], "</td>\n";
- if ($conf['show_comments']) echo "<td class=\"data{$id}\">", $misc->printVal($conversions->f['concomment']), "</td>\n";
- echo "</tr>\n";
- $conversions->moveNext();
- $i++;
- }
- echo "</table>\n";
- }
- else {
- echo "<p>{$lang['strnoconversions']}</p>\n";
- }
+
+ $columns = array(
+ 'conversion' => array(
+ 'title' => $lang['strname'],
+ 'field' => 'conname',
+ ),
+ 'source_encoding' => array(
+ 'title' => $lang['strsourceencoding'],
+ 'field' => 'conforencoding',
+ ),
+ 'target_encoding' => array(
+ 'title' => $lang['strtargetencoding'],
+ 'field' => 'contoencoding',
+ ),
+ 'default' => array(
+ 'title' => $lang['strdefault'],
+ 'field' => 'condefault',
+ 'type' => 'bool',
+ 'true' => $lang['stryes'],
+ 'false' => $lang['strno'],
+ ),
+ 'comment' => array(
+ 'title' => $lang['strcomment'],
+ 'field' => 'concomment',
+ ),
+ );
+
+ $actions = array();
+
+ $misc->printTable($conversions, $columns, $actions, $lang['strnoconversions']);
}
$misc->printHeader($lang['strconversions']);
/**
* Manage schemas within a database
*
- * $Id: database.php,v 1.49 2004/07/06 09:05:41 chriskl Exp $
+ * $Id: database.php,v 1.50 2004/07/07 02:59:56 chriskl Exp $
*/
// Include application functions
$misc->printTitle(array($misc->printVal($_REQUEST['database']),$lang['strvariables']),'runtime_config');
- if ($variables->recordCount() > 0) {
- echo "<table>\n";
- echo "<tr><th class=\"data\">{$lang['strname']}</th><th class=\"data\">{$lang['strsetting']}</th></tr>\n";
- $i = 0;
- while (!$variables->EOF) {
- $id = (($i % 2) == 0 ? '1' : '2');
- echo "<tr>";
- echo "<td class=\"data{$id}\">", $misc->printVal($variables->f['name']), "</td>";
- echo "<td class=\"data{$id}\">", $misc->printVal($variables->f['setting']), "</td>";
- echo "</tr>\n";
- $variables->moveNext();
- $i++;
- }
- echo "</table>\n";
- }
- else {
- echo "<p>{$lang['strnodata']}</p>\n";
- }
+ $columns = array(
+ 'variable' => array(
+ 'title' => $lang['strname'],
+ 'field' => 'name',
+ ),
+ 'value' => array(
+ 'title' => $lang['strsetting'],
+ 'field' => 'setting',
+ ),
+ );
+
+ $actions = array();
+
+ $misc->printTable($variables, $columns, $actions, $lang['strnodata']);
}
/**
$misc->printDatabaseNav();
$misc->printTitle(array($misc->printVal($_REQUEST['database']),$lang['strprocesses']),'processes');
- if ($processes->recordCount() > 0) {
- echo "<table>\n";
- echo "<tr><th class=\"data\">{$lang['strusername']}</th><th class=\"data\">{$lang['strprocess']}</th>";
- echo "<th class=\"data\">{$lang['strsql']}</th>";
- // Show query start time for 7.4+
- if (isset($processes->f['query_start'])) echo "<th class=\"data\">{$lang['strstarttime']}</th>";
- echo "</tr>\n";
-
- $i = 0;
- while (!$processes->EOF) {
- $id = (($i % 2) == 0 ? '1' : '2');
- echo "<tr>";
- echo "<td class=\"data{$id}\">", $misc->printVal($processes->f['usename']), "</td>";
- echo "<td class=\"data{$id}\">", $misc->printVal($processes->f['procpid'], false, 'int4'), "</td>";
- echo "<td class=\"data{$id}\">", $misc->printVal($processes->f['current_query']), "</td>";
- // Show query start time for 7.4+
- if (isset($processes->f['query_start'])) {
- echo "<td class=\"data{$id}\">", $misc->printVal($processes->f['query_start']), "</td>";
- }
- echo "</tr>\n";
- $processes->moveNext();
- $i++;
- }
- echo "</table>\n";
- }
- else {
- echo "<p>{$lang['strnodata']}</p>\n";
- }
+ $columns = array(
+ 'user' => array(
+ 'title' => $lang['strusername'],
+ 'field' => 'usename',
+ ),
+ 'process' => array(
+ 'title' => $lang['strprocess'],
+ 'field' => 'procpid',
+ ),
+ 'query' => array(
+ 'title' => $lang['strsql'],
+ 'field' => 'current_query',
+ ),
+ 'start_time' => array(
+ 'title' => $lang['strstarttime'],
+ 'field' => 'query_start',
+ ),
+ );
+
+ $actions = array();
+
+ // Remove query start time for <7.4
+ if (!isset($processes->f['query_start'])) unset($columns['start_time']);
+
+ $misc->printTable($processes, $columns, $actions, $lang['strnodata']);
}
/**
echo "\t<tr>\n\t\t<th class=\"data left required\">{$lang['strowner']}</th>\n";
echo "\t\t<td class=\"data1\">\n\t\t\t<select name=\"formAuth\">\n";
while (!$users->EOF) {
- $uname = htmlspecialchars($users->f[$data->uFields['uname']]);
+ $uname = htmlspecialchars($users->f['usename']);
echo "\t\t\t\t<option value=\"{$uname}\"",
($uname == $_POST['formAuth']) ? ' selected="selected"' : '', ">{$uname}</option>\n";
$users->moveNext();
if ($data->hasSchemas()) {
$schemas = &$data->getSchemas();
- if ($schemas->recordCount() > 0) {
- echo "<table>\n";
- echo "<tr><th class=\"data\">{$lang['strname']}</th><th class=\"data\">{$lang['strowner']}</th>";
- if ($data->hasTablespaces()) {
- echo "<th class=\"data\">{$lang['strtablespace']}</th>";
- }
- echo "<th colspan=\"3\" class=\"data\">{$lang['stractions']}</th>";
- if ($conf['show_comments']) echo "<th class=\"data\">{$lang['strcomment']}</th>\n";
- echo "</tr>\n";
- $i = 0;
- while (!$schemas->EOF) {
- $id = (($i % 2) == 0 ? '1' : '2');
- echo "<tr><td class=\"data{$id}\">", $misc->printVal($schemas->f[$data->nspFields['nspname']]), "</td>\n";
- echo "<td class=\"data{$id}\">", $misc->printVal($schemas->f[$data->nspFields['nspowner']]), "</td>\n";
- if ($data->hasTablespaces()) {
- echo "<td class=\"data{$id}\">", $misc->printVal($schemas->f['tablespace']), "</td>\n";
- }
- echo "<td class=\"opbutton{$id}\"><a href=\"$PHP_SELF?action=confirm_drop&database=",
- urlencode($_REQUEST['database']), "&schema=",
- urlencode($schemas->f[$data->nspFields['nspname']]), "\">{$lang['strdrop']}</a></td>\n";
- echo "<td class=\"opbutton{$id}\"><a href=\"privileges.php?database=",
- urlencode($_REQUEST['database']), "&object=",
- urlencode($schemas->f[$data->nspFields['nspname']]), "&type=schema\">{$lang['strprivileges']}</a></td>\n";
- echo "<td class=\"opbutton{$id}\"><a href=\"schema.php?database=",
- urlencode($_REQUEST['database']), "&schema=",
- urlencode($schemas->f[$data->nspFields['nspname']]), "&action=alter\">{$lang['stralter']}</a></td>\n";
- // Trim long comments
- if (strlen($schemas->f[$data->nspFields['nspcomment']]) > $conf['max_chars']) {
- $schemas->f[$data->nspFields['nspcomment']] = substr($schemas->f[$data->nspFields['nspcomment']], 0, $conf['max_chars'] - 1) . $lang['strellipsis'];
- }
- if ($conf['show_comments']) echo "<td class=\"data{$id}\">", $misc->printVal($schemas->f[$data->nspFields['nspcomment']]), "</td>\n";
- echo "</tr>\n";
- $schemas->moveNext();
- $i++;
- }
- echo "</table>\n";
- }
- else {
- echo "<p>{$lang['strnoschemas']}</p>\n";
- }
-
+ $columns = array(
+ 'schema' => array(
+ 'title' => $lang['strname'],
+ 'field' => 'nspname',
+ ),
+ 'owner' => array(
+ 'title' => $lang['strowner'],
+ 'field' => 'nspowner',
+ ),
+ 'tablespace' => array(
+ 'title' => $lang['strtablespace'],
+ 'field' => 'tablespace',
+ ),
+ 'actions' => array(
+ 'title' => $lang['stractions'],
+ ),
+ 'comment' => array(
+ 'title' => $lang['strcomment'],
+ 'field' => 'nspcomment',
+ ),
+ );
+
+ $actions = array(
+ 'properties' => array(
+ 'title' => $lang['strproperties'],
+ 'url' => 'schema.php?database='.urlencode($_REQUEST['database'])."&",
+ 'vars' => array('schema' => 'nspname'),
+ ),
+ 'drop' => array(
+ 'title' => $lang['strdrop'],
+ 'url' => "{$PHP_SELF}?action=confirm_drop&database=".urlencode($_REQUEST['database'])."&",
+ 'vars' => array('schema' => 'nspname'),
+ ),
+ 'privileges' => array(
+ 'title' => $lang['strprivileges'],
+ 'url' => "privileges.php?type=schema&database=".urlencode($_REQUEST['database'])."&",
+ 'vars' => array('object' => 'nspname'),
+ ),
+ 'alter' => array(
+ 'title' => $lang['stralter'],
+ 'url' => "schema.php?action=alter&database=".urlencode($_REQUEST['database'])."&",
+ 'vars' => array('schema' => 'nspname'),
+ ),
+ );
+
+ if (!$data->hasTablespaces()) unset($columns['tablespace']);
+
+ $misc->printTable($schemas, $columns, $actions, $lang['strnoschemas']);
+
echo "<p><a class=\"navlink\" href=\"$PHP_SELF?database=", urlencode($_REQUEST['database']),
"&action=create\">{$lang['strcreateschema']}</a></p>\n";
} else {
* @param $return_desc The return link name
* @param $page The current page
*
- * $Id: display.php,v 1.39 2004/06/26 22:24:09 xzilla Exp $
+ * $Id: display.php,v 1.40 2004/07/07 02:59:57 chriskl Exp $
*/
// Include application functions
else
$key = array();
+ // Set the schema search path
+ if ($data->hasSchemas() && isset($_REQUEST['search_path'])) {
+ if ($data->setSearchPath(array_map('trim',explode(',',$_REQUEST['search_path']))) != 0) {
+ return;
+ }
+ }
+
// Retrieve page from query. $max_pages is returned by reference.
$rs = &$data->browseQuery($type,
isset($_REQUEST['table']) ? $_REQUEST['table'] : null,
/**
* Manage domains in a database
*
- * $Id: domains.php,v 1.13 2004/06/03 06:42:20 chriskl Exp $
+ * $Id: domains.php,v 1.14 2004/07/07 02:59:57 chriskl Exp $
*/
// Include application functions
echo "<tr><th class=\"data left required\">{$lang['strowner']}</th>\n";
echo "<td class=\"data1\"><select name=\"domowner\">";
while (!$users->EOF) {
- $uname = $users->f[$data->uFields['uname']];
+ $uname = $users->f['usename'];
echo "<option value=\"", htmlspecialchars($uname), "\"",
($uname == $_POST['domowner']) ? ' selected="selected"' : '', ">", htmlspecialchars($uname), "</option>\n";
$users->moveNext();
while (!$domaincons->EOF) {
$id = (($i % 2 ) == 0 ? '1' : '2');
- echo "<tr><td class=\"data{$id}\">", $misc->printVal($domaincons->f[$data->cnFields['conname']]), "</td>";
+ echo "<tr><td class=\"data{$id}\">", $misc->printVal($domaincons->f['conname']), "</td>";
echo "<td class=\"data{$id}\">";
- echo $misc->printVal($domaincons->f[$data->cnFields['consrc']]);
+ echo $misc->printVal($domaincons->f['consrc']);
echo "</td>";
echo "<td class=\"opbutton{$id}\">";
- echo "<a href=\"$PHP_SELF?action=confirm_drop_con&{$misc->href}&constraint=", urlencode($domaincons->f[$data->cnFields['conname']]),
+ echo "<a href=\"$PHP_SELF?action=confirm_drop_con&{$misc->href}&constraint=", urlencode($domaincons->f['conname']),
"&domain=", urlencode($_REQUEST['domain']), "&type=", urlencode($domaincons->f['contype']), "\">{$lang['strdrop']}</td></tr>\n";
$domaincons->moveNext();
// Output return type list
echo "<select name=\"domtype\">\n";
while (!$types->EOF) {
- echo "<option value=\"", htmlspecialchars($types->f[$data->typFields['typname']]), "\"",
- ($types->f[$data->typFields['typname']] == $_POST['domtype']) ? ' selected="selected"' : '', ">",
- $misc->printVal($types->f[$data->typFields['typname']]), "</option>\n";
+ echo "<option value=\"", htmlspecialchars($types->f['typname']), "\"",
+ ($types->f['typname'] == $_POST['domtype']) ? ' selected="selected"' : '', ">",
+ $misc->printVal($types->f['typname']), "</option>\n";
$types->moveNext();
}
echo "</select>\n";
global $data, $conf, $misc;
global $PHP_SELF, $lang;
- echo "<h2>", $misc->printVal($_REQUEST['database']), ": {$lang['strdomains']}</h2>\n";
+ $misc->printTitle(array($misc->printVal($_REQUEST['database']), $lang['strdomains']), 'domains');
$misc->printMsg($msg);
$domains = &$data->getDomains();
- if ($domains->recordCount() > 0) {
- echo "<table>\n";
- echo "<tr><th class=\"data\">{$lang['strdomain']}</th><th class=\"data\">{$lang['strtype']}</th><th class=\"data\">{$lang['strnotnull']}</th>";
- echo "<th class=\"data\">{$lang['strdefault']}</th><th class=\"data\">{$lang['strowner']}</th>";
- echo "<th colspan=\"2\" class=\"data\">{$lang['stractions']}</th>";
- if ($conf['show_comments']) echo "<th class=\"data\">{$lang['strcomment']}</th>";
- echo "</tr>\n";
- $i = 0;
- while (!$domains->EOF) {
- $domains->f['domnotnull'] = $data->phpBool($domains->f['domnotnull']);
- $id = (($i % 2) == 0 ? '1' : '2');
- echo "<tr><td class=\"data{$id}\">", $misc->printVal($domains->f['domname']), "</td>\n";
- echo "<td class=\"data{$id}\">", $misc->printVal($domains->f['domtype']), "</td>\n";
- echo "<td class=\"data{$id}\">", ($domains->f['domnotnull'] ? 'NOT NULL' : ''), "</td>\n";
- echo "<td class=\"data{$id}\">", $misc->printVal($domains->f['domdef']), "</td>\n";
- echo "<td class=\"data{$id}\">", $misc->printVal($domains->f['domowner']), "</td>\n";
- echo "<td class=\"opbutton{$id}\"><a href=\"$PHP_SELF?action=properties&{$misc->href}&domain=", urlencode($domains->f['domname']), "\">{$lang['strproperties']}</a></td>\n";
- echo "<td class=\"opbutton{$id}\"><a href=\"$PHP_SELF?action=confirm_drop&{$misc->href}&domain=", urlencode($domains->f['domname']), "\">{$lang['strdrop']}</a></td>\n";
- // Trim long comments
- if (strlen($domains->f['domcomment']) > $conf['max_chars']) {
- $domains->f['domcomment'] = substr($domains->f['domcomment'], 0, $conf['max_chars'] - 1) . $lang['strellipsis'];
- }
- if ($conf['show_comments']) echo "<td class=\"data{$id}\">", $misc->printVal($domains->f['domcomment']), "</td>\n";
- echo "</tr>\n";
- $domains->moveNext();
- $i++;
- }
- echo "</table>\n";
- }
- else {
- echo "<p>{$lang['strnodomains']}</p>\n";
- }
+ $columns = array(
+ 'domain' => array(
+ 'title' => $lang['strdomain'],
+ 'field' => 'domname',
+ ),
+ 'type' => array(
+ 'title' => $lang['strtype'],
+ 'field' => 'domtype',
+ ),
+ 'notnull' => array(
+ 'title' => $lang['strnotnull'],
+ 'field' => 'domnotnull',
+ 'type' => 'bool',
+ 'true' => 'NOT NULL',
+ 'false' => '',
+ ),
+ 'default' => array(
+ 'title' => $lang['strdefault'],
+ 'field' => 'domdef',
+ ),
+ 'owner' => array(
+ 'title' => $lang['strowner'],
+ 'field' => 'domowner',
+ ),
+ 'actions' => array(
+ 'title' => $lang['stractions'],
+ ),
+ 'comment' => array(
+ 'title' => $lang['strcomment'],
+ 'field' => 'domcomment',
+ ),
+ );
+
+ $actions = array(
+ 'properties' => array(
+ 'title' => $lang['strproperties'],
+ 'url' => "{$PHP_SELF}?action=properties&{$misc->href}&",
+ 'vars' => array('domain' => 'domname'),
+ ),
+ 'drop' => array(
+ 'title' => $lang['strdrop'],
+ 'url' => "{$PHP_SELF}?action=confirm_drop&{$misc->href}&",
+ 'vars' => array('domain' => 'domname'),
+ ),
+ );
+
+ $misc->printTable($domains, $columns, $actions, $lang['strnodomains']);
- echo "<p><a class=\"navlink\" href=\"$PHP_SELF?action=create&{$misc->href}\">{$lang['strcreatedomain']}</a></p>\n";
+ echo "<p><a class=\"navlink\" href=\"{$PHP_SELF}?action=create&{$misc->href}\">{$lang['strcreatedomain']}</a></p>\n";
}
/**
* Manage functions in a database
*
- * $Id: functions.php,v 1.33 2004/06/28 02:26:56 chriskl Exp $
+ * $Id: functions.php,v 1.34 2004/07/07 02:59:57 chriskl Exp $
*/
// Include application functions
// If the backend does not support renaming functions...
if (!$data->hasFunctionRename()) $_POST['formFunction'] = $_POST['original_function'];
+ if (strtolower($_POST['original_lang']) == 'c') {
+ $def = array($_POST['formObjectFile'], $_POST['formLinkSymbol']);
+ } else {
+ $def = $_POST['formDefinition'];
+ }
+
$status = $data->setFunction($_POST['function_oid'], $_POST['original_function'], $_POST['formFunction'],
$_POST['original_arguments'],
- $_POST['original_returns'], $_POST['formDefinition'],
+ $_POST['original_returns'], $def,
$_POST['original_lang'], $_POST['formProperties'],
isset($_POST['original_setof']), $_POST['formComment']);
if ($status == 0)
$fndata = &$data->getFunction($_REQUEST['function_oid']);
if ($fndata->recordCount() > 0) {
- $fndata->f[$data->fnFields['setof']] = $data->phpBool($fndata->f[$data->fnFields['setof']]);
+ $fndata->f['proretset'] = $data->phpBool($fndata->f['proretset']);
// Initialise variables
- if (!isset($_POST['formDefinition'])) $_POST['formDefinition'] = $fndata->f[$data->fnFields['fndef']];
+ if (!isset($_POST['formDefinition'])) $_POST['formDefinition'] = $fndata->f['prosrc'];
if (!isset($_POST['formProperties'])) $_POST['formProperties'] = $data->getFunctionProperties($fndata->f);
- if (!isset($_POST['formFunction'])) $_POST['formFunction'] = $fndata->f[$data->fnFields['fnname']];
- if (!isset($_POST['formComment'])) $_POST['formComment'] = $fndata->f['funccomment'];
+ if (!isset($_POST['formFunction'])) $_POST['formFunction'] = $fndata->f['proname'];
+ if (!isset($_POST['formComment'])) $_POST['formComment'] = $fndata->f['procomment'];
+ if (!isset($_POST['formObjectFile'])) $_POST['formObjectFile'] = $fndata->f['probin'];
+ if (!isset($_POST['formLinkSymbol'])) $_POST['formLinkSymbol'] = $fndata->f['prosrc'];
- $func_full = $fndata->f[$data->fnFields['fnname']] . "(". $fndata->f[$data->fnFields['fnarguments']] .")";
+ $func_full = $fndata->f['proname'] . "(". $fndata->f['proarguments'] .")";
echo "<form action=\"$PHP_SELF\" method=\"post\">\n";
echo "<table width=\"90%\">\n";
echo "<tr>\n";
echo "<tr>\n";
echo "<td class=\"data1\">";
- echo "<input type=\"hidden\" name=\"original_function\" value=\"", htmlspecialchars($fndata->f[$data->fnFields['fnname']]),"\" />\n";
+ echo "<input type=\"hidden\" name=\"original_function\" value=\"", htmlspecialchars($fndata->f['proname']),"\" />\n";
// If we're 7.4 or above, we can rename functions
if ($data->hasFunctionRename()) {
echo "<input name=\"formFunction\" style=\"width: 100%\" maxlength=\"{$data->_maxNameLen}\" value=\"", htmlspecialchars($_POST['formFunction']), "\" />";
}
else
- echo $misc->printVal($fndata->f[$data->fnFields['fnname']]);
+ echo $misc->printVal($fndata->f['proname']);
echo "</td>\n";
- echo "<td class=\"data1\">", $misc->printVal($fndata->f[$data->fnFields['fnarguments']]), "\n";
- echo "<input type=\"hidden\" name=\"original_arguments\" value=\"",htmlspecialchars($fndata->f[$data->fnFields['fnarguments']]),"\" />\n";
+ echo "<td class=\"data1\">", $misc->printVal($fndata->f['proarguments']), "\n";
+ echo "<input type=\"hidden\" name=\"original_arguments\" value=\"",htmlspecialchars($fndata->f['proarguments']),"\" />\n";
echo "</td>\n";
- echo "<td class=data1>";
- if ($fndata->f[$data->fnFields['setof']]) echo "setof ";
- echo $misc->printVal($fndata->f[$data->fnFields['fnreturns']]), "\n";
- echo "<input type=\"hidden\" name=\"original_returns\" value=\"", htmlspecialchars($fndata->f[$data->fnFields['fnreturns']]), "\" />\n";
- if ($fndata->f[$data->fnFields['setof']])
+ echo "<td class=\"data1\">";
+ if ($fndata->f['proretset']) echo "setof ";
+ echo $misc->printVal($fndata->f['proresult']), "\n";
+ echo "<input type=\"hidden\" name=\"original_returns\" value=\"", htmlspecialchars($fndata->f['proresult']), "\" />\n";
+ if ($fndata->f['proretset'])
echo "<input type=\"hidden\" name=\"original_setof\" value=\"yes\" />\n";
echo "</td>\n";
- echo "<td class=data1>", $misc->printVal($fndata->f[$data->fnFields['fnlang']]), "\n";
- echo "<input type=\"hidden\" name=\"original_lang\" value=\"", htmlspecialchars($fndata->f[$data->fnFields['fnlang']]), "\" />\n";
+ echo "<td class=\"data1\">", $misc->printVal($fndata->f['prolanguage']), "\n";
+ echo "<input type=\"hidden\" name=\"original_lang\" value=\"", htmlspecialchars($fndata->f['prolanguage']), "\" />\n";
echo "</td>\n";
-
- echo "<tr><th class=\"data required\" colspan=\"8\">{$lang['strdefinition']}</th></tr>\n";
- echo "<tr><td class=\"data1\" colspan=\"8\"><textarea style=\"width:100%;\" rows=\"20\" cols=\"50\" name=\"formDefinition\" wrap=\"virtual\">",
- htmlspecialchars($_POST['formDefinition']), "</textarea></td></tr>\n";
+
+ $fnlang = strtolower($fndata->f['prolanguage']);
+ if ($fnlang == 'c' || $fnlang == 'internal') {
+ echo "<tr><th class=\"data required\" colspan=\"2\">{$lang['strobjectfile']}</th>\n";
+ echo "<th class=\"data\" colspan=\"2\">{$lang['strlinksymbol']}</th></tr>\n";
+ echo "<tr><td class=\"data1\" colspan=\"2\"><input type=\"text\" name=\"formObjectFile\" style=\"width:100%\" value=\"",
+ htmlspecialchars($_POST['formObjectFile']), "\" /></td>\n";
+ echo "<td class=\"data1\" colspan=\"2\"><input type=\"text\" name=\"formLinkSymbol\" style=\"width:100%\" value=\"",
+ htmlspecialchars($_POST['formLinkSymbol']), "\" /></td></tr>\n";
+ } else {
+ echo "<tr><th class=\"data required\" colspan=\"4\">{$lang['strdefinition']}</th></tr>\n";
+ echo "<tr><td class=\"data1\" colspan=\"4\"><textarea style=\"width:100%;\" rows=\"20\" cols=\"50\" name=\"formDefinition\" wrap=\"virtual\">",
+ htmlspecialchars($_POST['formDefinition']), "</textarea></td></tr>\n";
+ }
+
// Display function comment
echo "<tr><th class=\"data\" colspan=\"4\">{$lang['strcomment']}</th></tr>\n";
- echo "<tr><td class=\"data1\" colspan=\"4\"><textarea name=\"formComment\" rows=\"3\" cols=\"32\" wrap=\"virtual\">",
+ echo "<tr><td class=\"data1\" colspan=\"4\"><textarea style=\"width:100%;\" name=\"formComment\" rows=\"3\" cols=\"50\" wrap=\"virtual\">",
htmlspecialchars($_POST['formComment']), "</textarea></td></tr>\n";
// Display function properies
if (is_array($data->funcprops) && sizeof($data->funcprops) > 0) {
if ($funcdata->recordCount() > 0) {
// Show comment if any
- if ($funcdata->f['funccomment'] !== null)
- echo "<p class=\"comment\">", $misc->printVal($funcdata->f['funccomment']), "</p>\n";
+ if ($funcdata->f['procomment'] !== null)
+ echo "<p class=\"comment\">", $misc->printVal($funcdata->f['procomment']), "</p>\n";
- $funcdata->f[$data->fnFields['setof']] = $data->phpBool($funcdata->f[$data->fnFields['setof']]);
- $func_full = $funcdata->f[$data->fnFields['fnname']] . "(". $funcdata->f[$data->fnFields['fnarguments']] .")";
+ $funcdata->f['proretset'] = $data->phpBool($funcdata->f['proretset']);
+ $func_full = $funcdata->f['proname'] . "(". $funcdata->f['proarguments'] .")";
echo "<table width=\"90%\">\n";
echo "<tr><th class=\"data\">{$lang['strfunctions']}</th>\n";
echo "<th class=\"data\">{$lang['strarguments']}</th>\n";
echo "<th class=\"data\">{$lang['strreturns']}</th>\n";
echo "<th class=\"data\">{$lang['strproglanguage']}</th></tr>\n";
- echo "<tr><td class=\"data1\">", $misc->printVal($funcdata->f[$data->fnFields['fnname']]), "</td>\n";
- echo "<td class=\"data1\">", $misc->printVal($funcdata->f[$data->fnFields['fnarguments']]), "</td>\n";
+ echo "<tr><td class=\"data1\">", $misc->printVal($funcdata->f['proname']), "</td>\n";
+ echo "<td class=\"data1\">", $misc->printVal($funcdata->f['proarguments']), "</td>\n";
echo "<td class=\"data1\">";
- if ($funcdata->f[$data->fnFields['setof']]) echo "setof ";
- echo $misc->printVal($funcdata->f[$data->fnFields['fnreturns']]), "</td>\n";
- echo "<td class=\"data1\">", $misc->printVal($funcdata->f[$data->fnFields['fnlang']]), "</td></tr>\n";
- echo "<tr><th class=\"data\" colspan=\"4\">{$lang['strdefinition']}</th></tr>\n";
- echo "<tr><td class=\"data1\" colspan=\"4\">", $misc->printVal($funcdata->f[$data->fnFields['fndef']]), "</td></tr>\n";
+ if ($funcdata->f['proretset']) echo "setof ";
+ echo $misc->printVal($funcdata->f['proresult']), "</td>\n";
+ echo "<td class=\"data1\">", $misc->printVal($funcdata->f['prolanguage']), "</td></tr>\n";
+
+ $fnlang = strtolower($funcdata->f['prolanguage']);
+ if ($fnlang == 'c' || $fnlang == 'internal') {
+ echo "<tr><th class=\"data\" colspan=\"2\">{$lang['strobjectfile']}</th>\n";
+ echo "<th class=\"data\" colspan=\"2\">{$lang['strlinksymbol']}</th></tr>\n";
+ echo "<tr><td class=\"data1\" colspan=\"2\">", $misc->printVal($funcdata->f['probin']), "</td>\n";
+ echo "<td class=\"data1\" colspan=\"2\">", $misc->printVal($funcdata->f['prosrc']), "</td></tr>\n";
+ } else {
+ echo "<tr><th class=\"data\" colspan=\"4\">{$lang['strdefinition']}</th></tr>\n";
+ echo "<tr><td class=\"data1\" colspan=\"4\">", $misc->printCell($funcdata->f['prosrc'], 'pre'), "</td></tr>\n";
+ }
+
// Show flags
if (is_array($data->funcprops) && sizeof($data->funcprops) > 0) {
// Fetch an array of the function properties
if (!isset($_POST['formFunction'])) $_POST['formFunction'] = '';
if (!isset($_POST['formArguments'])) $_POST['formArguments'] = '';
if (!isset($_POST['formReturns'])) $_POST['formReturns'] = '';
- if (!isset($_POST['formLanguage'])) $_POST['formLanguage'] = 'sql';
+ if (!isset($_POST['formLanguage'])) $_POST['formLanguage'] = isset($_REQUEST['language']) ? $_REQUEST['language'] : 'sql';
if (!isset($_POST['formDefinition'])) $_POST['formDefinition'] = '';
+ if (!isset($_POST['formObjectFile'])) $_POST['formObjectFile'] = '';
+ if (!isset($_POST['formLinkSymbol'])) $_POST['formLinkSymbol'] = '';
if (!isset($_POST['formProperties'])) $_POST['formProperties'] = $data->defaultprops;
if (!isset($_POST['formSetOf'])) $_POST['formSetOf'] = '';
if (!isset($_POST['formArray'])) $_POST['formArray'] = '';
// Output return type list
echo "<select name=\"formReturns\">\n";
while (!$types->EOF) {
- echo "<option value=\"", htmlspecialchars($types->f[$data->typFields['typname']]), "\"",
- ($types->f[$data->typFields['typname']] == $_POST['formReturns']) ? ' selected="selected"' : '', ">",
- $misc->printVal($types->f[$data->typFields['typname']]), "</option>\n";
+ echo "<option value=\"", htmlspecialchars($types->f['typname']), "\"",
+ ($types->f['typname'] == $_POST['formReturns']) ? ' selected="selected"' : '', ">",
+ $misc->printVal($types->f['typname']), "</option>\n";
$types->moveNext();
}
echo "</select>\n";
echo "<td class=\"data1\"><select name=\"formLanguage\">\n";
while (!$langs->EOF) {
- echo "<option value=\"", htmlspecialchars($langs->f[$data->langFields['lanname']]), "\"",
- ($langs->f[$data->langFields['lanname']] == $_POST['formLanguage']) ? ' selected="selected"' : '', ">",
- $misc->printVal($langs->f[$data->langFields['lanname']]), "</option>\n";
+ echo "<option value=\"", htmlspecialchars($langs->f['lanname']), "\"",
+ ($langs->f['lanname'] == $_POST['formLanguage']) ? ' selected="selected"' : '', ">",
+ $misc->printVal($langs->f['lanname']), "</option>\n";
$langs->moveNext();
}
echo "</select>\n";
echo "</td></tr>\n";
- echo "<tr><th class=\"data required\" colspan=\"4\">{$lang['strdefinition']}</th></tr>\n";
- echo "<tr><td class=\"data1\" colspan=\"4\"><textarea style=\"width:100%;\" rows=\"20\" cols=\"50\" name=\"formDefinition\" wrap=\"virtual\">",
- htmlspecialchars($_POST['formDefinition']), "</textarea></td></tr>\n";
+
+ $fnlang = strtolower($_POST['formLanguage']);
+ if ($fnlang == 'c' || $fnlang == 'internal') {
+ echo "<tr><th class=\"data required\" colspan=\"2\">{$lang['strobjectfile']}</th>\n";
+ echo "<th class=\"data\" colspan=\"2\">{$lang['strlinksymbol']}</th></tr>\n";
+ echo "<tr><td class=\"data1\" colspan=\"2\"><input type=\"text\" name=\"formObjectFile\" style=\"width:100%\" value=\"",
+ htmlspecialchars($_POST['formObjectFile']), "\" /></td>\n";
+ echo "<td class=\"data1\" colspan=\"2\"><input type=\"text\" name=\"formLinkSymbol\" style=\"width:100%\" value=\"",
+ htmlspecialchars($_POST['formLinkSymbol']), "\" /></td></tr>\n";
+ } else {
+ echo "<tr><th class=\"data required\" colspan=\"4\">{$lang['strdefinition']}</th></tr>\n";
+ echo "<tr><td class=\"data1\" colspan=\"4\"><textarea style=\"width:100%;\" rows=\"20\" cols=\"50\" name=\"formDefinition\" wrap=\"virtual\">",
+ htmlspecialchars($_POST['formDefinition']), "</textarea></td></tr>\n";
+ }
+
// Display function properies
if (is_array($data->funcprops) && sizeof($data->funcprops) > 0) {
echo "<tr><th class=\"data\" colspan=\"4\">{$lang['strproperties']}</th></tr>\n";
// Set properties to an empty array if it doesn't exist (for db's without properties)
if (!is_array($_POST['formProperties'])) $_POST['formProperties'] = array();
+ if (strtolower($_POST['formLanguage']) == 'c') {
+ $def = array($_POST['formObjectFile'], $_POST['formLinkSymbol']);
+ } else {
+ $def = $_POST['formDefinition'];
+ }
+
// Check that they've given a name and a definition
if ($_POST['formFunction'] == '') doCreate($lang['strfunctionneedsname']);
- elseif ($_POST['formDefinition'] == '') doCreate($lang['strfunctionneedsdef']);
+ elseif (!$def) doCreate($lang['strfunctionneedsdef']);
else {
// Append array symbol to type if chosen
$status = $data->createFunction($_POST['formFunction'], $_POST['formArguments'] ,
- $_POST['formReturns'] . $_POST['formArray'] , $_POST['formDefinition'] , $_POST['formLanguage'],
+ $_POST['formReturns'] . $_POST['formArray'] , $def , $_POST['formLanguage'],
$_POST['formProperties'], $_POST['formSetOf'] == 'SETOF', false);
if ($status == 0)
doDefault($lang['strfunctioncreated']);
global $data, $conf, $misc, $func;
global $PHP_SELF, $lang;
- echo "<h2>", $misc->printVal($_REQUEST['database']), ": {$lang['strfunctions']}</h2>\n";
+ function fnPre(&$rowdata) {
+ global $data;
+ $rowdata->f['+proproto'] = $rowdata->f['proname'] . " (" . $rowdata->f['proarguments'] . ")";
+ $rowdata->f['+proreturns'] = ($data->phpBool($rowdata->f['proretset']) ? 'setof ' : '') . $rowdata->f['proresult'];
+ }
+
+ $misc->printTitle(array($misc->printVal($_REQUEST['database']), $lang['strfunctions']), 'functions');
$misc->printMsg($msg);
$funcs = &$data->getFunctions();
-
- if ($funcs->recordCount() > 0) {
- echo "<table>\n";
- echo "<tr><th class=\"data\">{$lang['strfunctions']}</th><th class=\"data\">{$lang['strreturns']}</th>\n";
- echo "<th class=\"data\">{$lang['strarguments']}</th><th colspan=\"4\" class=\"data\">{$lang['stractions']}</th>\n";
- if ($conf['show_comments']) echo "<th class=\"data\">{$lang['strcomment']}</th>\n";
- echo "</tr>\n";
- $i = 0;
- while (!$funcs->EOF) {
- $funcs->f[$data->fnFields['setof']] = $data->phpBool($funcs->f[$data->fnFields['setof']]);
- $func_full = $funcs->f[$data->fnFields['fnname']] . "(". $funcs->f[$data->fnFields['fnarguments']] .")";
- $id = (($i % 2) == 0 ? '1' : '2');
- echo "<tr><td class=\"data{$id}\">", $misc->printVal($funcs->f[$data->fnFields['fnname']]), "</td>\n";
- echo "<td class=\"data{$id}\">";
- if ($funcs->f[$data->fnFields['setof']]) echo "setof ";
- echo $misc->printVal($funcs->f[$data->fnFields['fnreturns']]), "</td>\n";
- echo "<td class=\"data{$id}\">", $misc->printVal($funcs->f[$data->fnFields['fnarguments']]), "</td>\n";
- echo "<td class=\"opbutton{$id}\"><a href=\"$PHP_SELF?action=properties&{$misc->href}&function=",
- urlencode($func_full), "&function_oid=", $funcs->f[$data->fnFields['fnoid']], "\">{$lang['strproperties']}</a></td>\n";
- echo "<td class=\"opbutton{$id}\"><a href=\"$PHP_SELF?action=edit&{$misc->href}&function=",
- urlencode($func_full), "&function_oid=", $funcs->f[$data->fnFields['fnoid']], "\">{$lang['stralter']}</a></td>\n";
- echo "<td class=\"opbutton{$id}\"><a href=\"$PHP_SELF?action=confirm_drop&{$misc->href}&function=",
- urlencode($func_full), "&function_oid=", $funcs->f[$data->fnFields['fnoid']], "\">{$lang['strdrop']}</a></td>\n";
- if (isset($data->privlist['function'])) {
- echo "<td class=\"opbutton{$id}\"><a href=\"privileges.php?{$misc->href}&function=",
- urlencode($func_full), "&object=",
- $funcs->f[$data->fnFields['fnoid']], "&type=function\">{$lang['strprivileges']}</a></td>\n";
- }
- else echo "<td></td>";
- // Trim long comments
- if (strlen($funcs->f['funccomment']) > $conf['max_chars']) {
- $funcs->f['funccomment'] = substr($funcs->f['funccomment'], 0, $conf['max_chars'] - 1) . $lang['strellipsis'];
- }
- if ($conf['show_comments']) echo "<td class=\"data{$id}\">", $misc->printVal($funcs->f['funccomment']), "</td>\n";
- echo "</tr>\n";
- $funcs->moveNext();
- $i++;
- }
-
- echo "</table>\n";
- }
- else {
- echo "<p>{$lang['strnofunctions']}</p>\n";
- }
- echo "<p><a class=\"navlink\" href=\"$PHP_SELF?action=create&{$misc->href}\">{$lang['strcreatefunction']}</a></p>\n";
+ $columns = array(
+ 'function' => array(
+ 'title' => $lang['strfunction'],
+ 'field' => '+proproto',
+ ),
+ 'returns' => array(
+ 'title' => $lang['strreturns'],
+ 'field' => '+proreturns',
+ ),
+ 'actions' => array(
+ 'title' => $lang['stractions'],
+ ),
+ 'comment' => array(
+ 'title' => $lang['strcomment'],
+ 'field' => 'procomment',
+ ),
+ );
+
+ $actions = array(
+ 'properties' => array(
+ 'title' => $lang['strproperties'],
+ 'url' => "{$PHP_SELF}?action=properties&{$misc->href}&",
+ 'vars' => array('function' => '+proproto', 'function_oid' => 'prooid'),
+ ),
+ 'alter' => array(
+ 'title' => $lang['stralter'],
+ 'url' => "{$PHP_SELF}?action=edit&{$misc->href}&",
+ 'vars' => array('function' => 'proname', 'function_oid' => 'prooid'),
+ ),
+ 'drop' => array(
+ 'title' => $lang['strdrop'],
+ 'url' => "{$PHP_SELF}?action=confirm_drop&{$misc->href}&",
+ 'vars' => array('function' => 'proname', 'function_oid' => 'prooid'),
+ ),
+ 'privileges' => array(
+ 'title' => $lang['strprivileges'],
+ 'url' => "privileges.php?{$misc->href}&type=function&",
+ 'vars' => array('function' => 'proname', 'object' => 'prooid'),
+ ),
+ );
+
+ $misc->printTable($funcs, $columns, $actions, $lang['strnofunctions'], 'fnPre');
+ echo "<p><a class=\"navlink\" href=\"$PHP_SELF?action=create&{$misc->href}\">{$lang['strcreateplfunction']}</a> | ";
+ echo "<a class=\"navlink\" href=\"$PHP_SELF?action=create&language=c&{$misc->href}\">{$lang['strcreatecfunction']}</a></p>\n";
}
$misc->printHeader($lang['strfunctions']);
/**
* Manage groups in a database cluster
*
- * $Id: groups.php,v 1.15 2003/12/17 09:11:32 chriskl Exp $
+ * $Id: groups.php,v 1.16 2004/07/07 02:59:57 chriskl Exp $
*/
// Include application functions
$i = 0;
while (!$groupdata->EOF) {
$id = (($i % 2) == 0 ? '1' : '2');
- echo "<tr><td class=\"data{$id}\">", $misc->printVal($groupdata->f[$data->uFields['uname']]), "</td>\n";
+ echo "<tr><td class=\"data{$id}\">", $misc->printVal($groupdata->f['usename']), "</td>\n";
echo "<td class=\"opbutton{$id}\"><a href=\"$PHP_SELF?action=confirm_drop_member&{$misc->href}&groname=",
- urlencode($_REQUEST['groname']), "&user=", urlencode($groupdata->f[$data->uFields['uname']]), "\">{$lang['strdrop']}</a></td>\n";
+ urlencode($_REQUEST['groname']), "&user=", urlencode($groupdata->f['usename']), "\">{$lang['strdrop']}</a></td>\n";
echo "</tr>\n";