-choose operator on select screen
fix getIndexes() and getConstraints() for < 7.3 to know about index type
(eg. constraints can only be btree indexes)
re-enable help system
+all DROP and ALTER commands MUST be fully schema-qualified otherwise you can accidentally drop stuff in pg_catalog :(
* BIGSERIAL missing from PostgreSQL 7.2
* Types lengths (eg. varchar(255)) weren't being displayed properly
in PostgreSQL 7.0.x
+* Resetting sequence on 7.1+ now restarts at 1, not 2
+* Remove deprecated column default 'now' from SQL script
Translations
* Afrikaans from Petri Jooste
* if you click on a database it shows a list of database objects in that
* database.
*
- * $Id: browser.php,v 1.18 2003/09/10 01:55:52 chriskl Exp $
+ * $Id: browser.php,v 1.19 2003/10/26 10:59:16 chriskl Exp $
*/
// Include application functions
// Add folder to schema
$schemanode->addItem($dom_node);
}
+ // Advanced
+ if ($data->hasTypes() || $data->hasOperators()) {
+ $adv_node = &new HTML_TreeNode(array(
+ 'text' => $lang['stradvanced'],
+ 'link' => addslashes(htmlspecialchars("schema.php?{$querystr}&" . SID)),
+ 'icon' => 'folder.gif',
+ 'expandedIcon' => 'folder-expanded.gif',
+ 'linkTarget' => 'detail'));
+
+ // Add folder to schema
+ $schemanode->addItem($adv_node);
+ }
// Types
if ($data->hasTypes()) {
$type_node = &new HTML_TreeNode(array(
'linkTarget' => 'detail'));
// Add folder to schema
- $schemanode->addItem($type_node);
+ $adv_node->addItem($type_node);
}
// Operators
if ($data->hasOperators()) {
'linkTarget' => 'detail'));
// Add folder to schema
- $schemanode->addItem($opr_node);
+ $adv_node->addItem($opr_node);
}
}
* A class that implements the DB interface for Postgres
* Note: This class uses ADODB and returns RecordSets.
*
- * $Id: Postgres.php,v 1.158 2003/10/14 05:40:30 chriskl Exp $
+ * $Id: Postgres.php,v 1.159 2003/10/26 10:59:16 chriskl Exp $
*/
// @@@ THOUGHT: What about inherits? ie. use of ONLY???
// If value is null, 't' or 'f'...
if ($value === null || $value == 't' || $value == 'f') {
echo "<select name=\"", htmlspecialchars($name), "\">\n";
- echo "<option value=\"\"", ($value === null) ? ' selected' : '', "></option>\n";
- echo "<option value=\"t\"", ($value == 't') ? ' selected' : '', ">{$lang['strtrue']}</option>\n";
- echo "<option value=\"f\"", ($value == 'f') ? ' selected' : '', ">{$lang['strfalse']}</option>\n";
+ echo "<option value=\"\"", ($value === null) ? ' selected="selected"' : '', "></option>\n";
+ echo "<option value=\"t\"", ($value == 't') ? ' selected="selected"' : '', ">{$lang['strtrue']}</option>\n";
+ echo "<option value=\"f\"", ($value == 'f') ? ' selected="selected"' : '', ">{$lang['strfalse']}</option>\n";
echo "</select>\n";
}
else {
}
/**
- * Resets a given sequence to 1
+ * Resets a given sequence to 2 (lowest possible in 7.0)
* @param $sequence Sequence name
* @return 0 success
*/
return $this->selectSet($sql);
}
+
+ /**
+ * Returns all details for a particular operator
+ * @param $operator_oid The oid of the operator
+ * @return Function info
+ */
+ function getOperator($operator_oid) {
+ $this->clean($operator_oid);
+
+ $sql = "
+ SELECT
+ po.oid,
+ po.oprname,
+ (SELECT typname FROM pg_type pt WHERE pt.oid=po.oprleft) AS oprleftname,
+ (SELECT typname FROM pg_type pt WHERE pt.oid=po.oprright) AS oprrightname,
+ (SELECT typname FROM pg_type pt WHERE pt.oid=po.oprresult) AS resultname,
+ po.oprcanhash,
+ (SELECT oprname FROM pg_operator po2 WHERE po2.oid=po.oprcom) AS oprcom,
+ (SELECT oprname FROM pg_operator po2 WHERE po2.oid=po.oprnegate) AS oprnegate,
+ (SELECT oprname FROM pg_operator po2 WHERE po2.oid=po.oprlsortop) AS oprlsortop,
+ (SELECT oprname FROM pg_operator po2 WHERE po2.oid=po.oprltcmpop) AS oprltcmpop,
+ (SELECT oprname FROM pg_operator po2 WHERE po2.oid=po.oprgtcmpop) AS oprgtcmpop,
+ po.oprcode::regproc AS oprcode,
+ --(SELECT proname FROM pg_proc pp WHERE pp.oid=po.oprcode) AS oprcode,
+ (SELECT proname FROM pg_proc pp WHERE pp.oid=po.oprrest) AS oprrest,
+ (SELECT proname FROM pg_proc pp WHERE pp.oid=po.oprjoin) AS oprjoin
+ FROM
+ pg_operator po
+ WHERE
+ po.oid='{$operator_oid}'
+ ";
+ return $this->selectSet($sql);
+ }
+
/**
* Drops an operator
- * @param $oprname The name of the operator to drop
- * @param $lefttype The left type (NULL for none)
- * @param $righttype The right type (NULL for none)
+ * @param $operator_oid The OID of the operator to drop
* @param $cascade True to cascade drop, false to restrict
* @return 0 success
*/
- function dropOperator($oprname, $lefttype, $righttype, $cascade) {
- $this->fieldClean($oprname);
+ function dropOperator($operator_oid, $cascade) {
+ // Function comes in with $object as operator OID
+ $opr = &$this->getOperator($operator_oid);
+ $this->fieldClean($opr->f['oprname']);
- $sql = "DROP OPERATOR \"{$oprname}\"(";
- echo ($lefttype === null) ? 'NONE' : $lefttype;
- echo ', ';
- echo ($righttype === null) ? 'NONE' : $righttype;
- echo ')';
+ $sql = "DROP OPERATOR {$opr->f['oprname']} (";
+ // Quoting or formatting here???
+ if ($opr->f['oprleftname'] !== null) $sql .= $opr->f['oprleftname'] . ', ';
+ else $sql .= "NONE, ";
+ if ($opr->f['oprrightname'] !== null) $sql .= $opr->f['oprrightname'] . ')';
+ else $sql .= "NONE)";
+
if ($cascade) $sql .= " CASCADE";
-
+
return $this->execute($sql);
}
-
+
// User functions
/**
/**
* Returns all details for a particular function
- * @param $func The name of the function to retrieve
+ * @param $function_oid The OID of the function to retrieve
* @return Function info
*/
function getFunction($function_oid) {
* A class that implements the DB interface for Postgres
* Note: This class uses ADODB and returns RecordSets.
*
- * $Id: Postgres73.php,v 1.71 2003/10/13 08:50:04 chriskl Exp $
+ * $Id: Postgres73.php,v 1.72 2003/10/26 10:59:16 chriskl Exp $
*/
// @@@ THOUGHT: What about inherits? ie. use of ONLY???
elseif (sizeof($paths) == 0) return -2;
$this->fieldArrayClean($paths);
- $sql = 'SET SEARCH_PATH TO "' . implode('"', $paths) . '"';
+ $sql = 'SET SEARCH_PATH TO "' . implode('"', $paths) . '", pg_catalog';
return $this->execute($sql);
}
if (sizeof($atts) == 0) return array();
$sql = "SELECT attnum, attname FROM pg_catalog.pg_attribute WHERE
- attrelid=(SELECT oid FROM pg_catalog.pg_class WHERE relname='{$table}'AND
+ attrelid=(SELECT oid FROM pg_catalog.pg_class WHERE relname='{$table}' AND
relnamespace=(SELECT oid FROM pg_catalog.pg_namespace WHERE nspname='{$this->_schema}'))
AND attnum IN ('" . join("','", $atts) . "')";
* @return All operators
*/
function &getOperators() {
+ // We stick with the subselects here, as you cannot ORDER BY a regtype
$sql = "
SELECT
po.oid,
po.oprname,
(SELECT pg_catalog.format_type(oid, NULL) FROM pg_catalog.pg_type pt WHERE pt.oid=po.oprleft) AS oprleftname,
(SELECT pg_catalog.format_type(oid, NULL) FROM pg_catalog.pg_type pt WHERE pt.oid=po.oprright) AS oprrightname,
- (SELECT pg_catalog.format_type(oid, NULL) FROM pg_catalog.pg_type pt WHERE pt.oid=po.oprresult) AS resultname
+ po.oprresult::pg_catalog.regtype AS resultname
FROM
pg_catalog.pg_operator po
WHERE
return $this->selectSet($sql);
}
+
+ /**
+ * Returns all details for a particular operator
+ * @param $operator_oid The oid of the operator
+ * @return Function info
+ */
+ function getOperator($operator_oid) {
+ $this->clean($operator_oid);
+
+ $sql = "
+ SELECT
+ po.oid,
+ po.oprname,
+ oprleft::pg_catalog.regtype AS oprleftname,
+ oprright::pg_catalog.regtype AS oprrightname,
+ oprresult::pg_catalog.regtype AS resultname,
+ po.oprcanhash,
+ oprcom::pg_catalog.regoperator AS oprcom,
+ oprnegate::pg_catalog.regoperator AS oprnegate,
+ oprlsortop::pg_catalog.regoperator AS oprlsortop,
+ oprrsortop::pg_catalog.regoperator AS oprrsortop,
+ oprltcmpop::pg_catalog.regoperator AS oprltcmpop,
+ oprgtcmpop::pg_catalog.regoperator AS oprgtcmpop,
+ po.oprcode::pg_catalog.regproc AS oprcode,
+ po.oprrest::pg_catalog.regproc AS oprrest,
+ po.oprjoin::pg_catalog.regproc AS oprjoin
+ FROM
+ pg_catalog.pg_operator po
+ WHERE
+ po.oid='{$operator_oid}'
+ ";
+ return $this->selectSet($sql);
+ }
+
// Capabilities
function hasSchemas() { return true; }
function hasConversions() { return true; }
* English language file for phpPgAdmin. Use this as a basis
* for new translations.
*
- * $Id: english.php,v 1.115 2003/10/14 17:55:17 soranzo Exp $
+ * $Id: english.php,v 1.116 2003/10/26 10:59:16 chriskl Exp $
*/
// Language and character set
$lang['strdownload'] = 'Download';
$lang['strinfo'] = 'Info';
$lang['stroids'] = 'OIDs';
+ $lang['stradvanced'] = 'Advanced';
// Error handling
$lang['strnoframes'] = 'You need a frames-enabled browser to use this application.';
$lang['strnooperator'] = 'No operator found.';
$lang['strnooperators'] = 'No operators found.';
$lang['strcreateoperator'] = 'Create operator';
- $lang['stroperatorname'] = 'Operator name';
$lang['strleftarg'] = 'Left Arg Type';
$lang['strrightarg'] = 'Right Arg Type';
+ $lang['strcommutator'] = 'Commutator';
+ $lang['strnegator'] = 'Negator';
+ $lang['strrestrict'] = 'Restrict';
+ $lang['strjoin'] = 'Join';
+ $lang['strhashes'] = 'Hashes';
+ $lang['strmerges'] = 'Merges';
+ $lang['strleftsort'] = 'Left sort';
+ $lang['strrightsort'] = 'Right sort';
+ $lang['strlessthan'] = 'Less than';
+ $lang['strgreaterthan'] = 'Greater than';
$lang['stroperatorneedsname'] = 'You must give a name for your operator.';
$lang['stroperatorcreated'] = 'Operator created';
$lang['stroperatorcreatedbad'] = 'Operator creation failed.';
* English language file for phpPgAdmin. Use this as a basis
* for new translations.
*
- * $Id: english.php,v 1.67 2003/10/14 17:55:17 soranzo Exp $
+ * $Id: english.php,v 1.68 2003/10/26 10:59:17 chriskl Exp $
*/
// Language and character set
$lang['strdownload'] = 'Download';
$lang['strinfo'] = 'Info';
$lang['stroids'] = 'OIDs';
+ $lang['stradvanced'] = 'Advanced';
// Error handling
$lang['strnoframes'] = 'You need a frames-enabled browser to use this application.';
$lang['strnooperator'] = 'No operator found.';
$lang['strnooperators'] = 'No operators found.';
$lang['strcreateoperator'] = 'Create operator';
- $lang['stroperatorname'] = 'Operator name';
$lang['strleftarg'] = 'Left Arg Type';
$lang['strrightarg'] = 'Right Arg Type';
+ $lang['strcommutator'] = 'Commutator';
+ $lang['strnegator'] = 'Negator';
+ $lang['strrestrict'] = 'Restrict';
+ $lang['strjoin'] = 'Join';
+ $lang['strhashes'] = 'Hashes';
+ $lang['strmerges'] = 'Merges';
+ $lang['strleftsort'] = 'Left sort';
+ $lang['strrightsort'] = 'Right sort';
+ $lang['strlessthan'] = 'Less than';
+ $lang['strgreaterthan'] = 'Greater than';
$lang['stroperatorneedsname'] = 'You must give a name for your operator.';
$lang['stroperatorcreated'] = 'Operator created';
$lang['stroperatorcreatedbad'] = 'Operator creation failed.';
/**
* Manage operators in a database
*
- * $Id: operators.php,v 1.6 2003/08/27 02:30:12 chriskl Exp $
+ * $Id: operators.php,v 1.7 2003/10/26 10:59:16 chriskl Exp $
*/
// Include application functions
if (!isset($msg)) $msg = '';
$PHP_SELF = $_SERVER['PHP_SELF'];
+ /**
+ * Show read only properties for an operator
+ */
+ function doProperties($msg = '') {
+ global $data, $localData, $misc;
+ global $PHP_SELF, $lang;
+
+ echo "<h2>", $misc->printVal($_REQUEST['database']), ": {$lang['stroperators']}: ", $misc->printVal($_REQUEST['operator']), ": {$lang['strproperties']}</h2>\n";
+ $misc->printMsg($msg);
+
+ $oprdata = &$localData->getOperator($_REQUEST['operator_oid']);
+ $oprdata->f['oprcanhash'] = $localData->phpBool($oprdata->f['oprcanhash']);
+
+ if ($oprdata->recordCount() > 0) {
+ echo "<table>\n";
+ echo "<tr><th class=\"data left\">{$lang['strname']}</th>\n";
+ echo "<td class=\"data1\">", $misc->printVal($oprdata->f['oprname']), "</td></tr>\n";
+ echo "<tr><th class=\"data left\">{$lang['strleftarg']}</th>\n";
+ echo "<td class=\"data1\">", $misc->printVal($oprdata->f['oprleftname']), "</td></tr>\n";
+ echo "<tr><th class=\"data left\">{$lang['strrightarg']}</th>\n";
+ echo "<td class=\"data1\">", $misc->printVal($oprdata->f['oprrightname']), "</td></tr>\n";
+ echo "<tr><th class=\"data left\">{$lang['strcommutator']}</th>\n";
+ echo "<td class=\"data1\">", $misc->printVal($oprdata->f['oprcom']), "</td></tr>\n";
+ echo "<tr><th class=\"data left\">{$lang['strnegator']}</th>\n";
+ echo "<td class=\"data1\">", $misc->printVal($oprdata->f['oprnegate']), "</td></tr>\n";
+ echo "<tr><th class=\"data left\">{$lang['strjoin']}</th>\n";
+ echo "<td class=\"data1\">", $misc->printVal($oprdata->f['oprjoin']), "</td></tr>\n";
+ echo "<tr><th class=\"data left\">{$lang['strhashes']}</th>\n";
+ echo "<td class=\"data1\">", ($oprdata->f['oprcanhash']) ? $lang['stryes'] : $lang['strno'], "</td></tr>\n";
+ echo "<tr><th class=\"data left\">{$lang['strmerges']}</th>\n";
+ echo "<td class=\"data1\">", ($oprdata->f['oprlsortop'] !== '0' && $oprdata->f['oprrsortop'] !== '0') ? $lang['stryes'] : $lang['strno'], "</td></tr>\n";
+ echo "<tr><th class=\"data left\">{$lang['strrestrict']}</th>\n";
+ echo "<td class=\"data1\">", $misc->printVal($oprdata->f['oprrest']), "</td></tr>\n";
+ echo "<tr><th class=\"data left\">{$lang['strleftsort']}</th>\n";
+ echo "<td class=\"data1\">", $misc->printVal($oprdata->f['oprlsortop']), "</td></tr>\n";
+ echo "<tr><th class=\"data left\">{$lang['strrightsort']}</th>\n";
+ echo "<td class=\"data1\">", $misc->printVal($oprdata->f['oprrsortop']), "</td></tr>\n";
+ echo "<tr><th class=\"data left\">{$lang['strlessthan']}</th>\n";
+ echo "<td class=\"data1\">", $misc->printVal($oprdata->f['oprltcmpop']), "</td></tr>\n";
+ echo "<tr><th class=\"data left\">{$lang['strgreaterthan']}</th>\n";
+ echo "<td class=\"data1\">", $misc->printVal($oprdata->f['oprgtcmpop']), "</td></tr>\n";
+ echo "</table>\n";
+
+ echo "<p><a class=\"navlink\" href=\"$PHP_SELF?{$misc->href}\">{$lang['strshowalloperators']}</a></p>\n";
+ }
+ else
+ doDefault($lang['strinvalidparam']);
+ }
+
+ /**
+ * Show confirmation of drop and perform actual drop
+ */
+ function doDrop($confirm) {
+ global $localData, $database, $misc;
+ global $PHP_SELF, $lang;
+
+ if ($confirm) {
+ echo "<h2>", $misc->printVal($_REQUEST['database']), ": {$lang['stroperators']}: ", $misc->printVal($_REQUEST['operator']), ": {$lang['strdrop']}</h2>\n";
+
+ echo "<p>", sprintf($lang['strconfdropoperator'], $misc->printVal($_REQUEST['operator'])), "</p>\n";
+
+ echo "<form action=\"$PHP_SELF\" method=\"post\">\n";
+ echo "<input type=\"hidden\" name=\"action\" value=\"drop\" />\n";
+ echo "<input type=\"hidden\" name=\"operator\" value=\"", htmlspecialchars($_REQUEST['operator']), "\" />\n";
+ echo "<input type=\"hidden\" name=\"operator_oid\" value=\"", htmlspecialchars($_REQUEST['operator_oid']), "\" />\n";
+ echo $misc->form;
+ // Show cascade drop option if supportd
+ if ($localData->hasDropBehavior()) {
+ echo "<p><input type=\"checkbox\" name=\"cascade\" /> {$lang['strcascade']}</p>\n";
+ }
+ echo "<input type=\"submit\" name=\"drop\" value=\"{$lang['strdrop']}\" />\n";
+ echo "<input type=\"submit\" name=\"cancel\" value=\"{$lang['strcancel']}\" />\n";
+ echo "</form>\n";
+ }
+ else {
+ $status = $localData->dropOperator($_POST['operator_oid'], isset($_POST['cascade']));
+ if ($status == 0)
+ doDefault($lang['stroperatordropped']);
+ else
+ doDefault($lang['stroperatordroppedbad']);
+ }
+
+ }
+
/**
* Show default list of operators in the database
*/
echo "<table>\n";
echo "<tr><th class=\"data\">{$lang['stroperator']}</th><th class=\"data\">{$lang['strleftarg']}</th>";
echo "<th class=\"data\">{$lang['strrightarg']}</th><th class=\"data\">{$lang['strreturns']}</th>";
- //echo "<th colspan=\"2\" class=\"data\">{$lang['stractions']}</th>\n";
+ echo "<th colspan=\"2\" class=\"data\">{$lang['stractions']}</th>\n";
echo "</tr>\n";
$i = 0;
while (!$operators->EOF) {
echo "<td class=\"data{$id}\">", $misc->printVal($operators->f['oprleftname']), "</td>\n";
echo "<td class=\"data{$id}\">", $misc->printVal($operators->f['oprrightname']), "</td>\n";
echo "<td class=\"data{$id}\">", $misc->printVal($operators->f['resultname']), "</td>\n";
- //echo "<td class=\"opbutton{$id}\"><a href=\"$PHP_SELF?action=properties&{$misc->href}&operatoroid=", urlencode($operators->f['oid']), "\">{$lang['strproperties']}</a></td>\n";
- //echo "<td class=\"opbutton{$id}\"><a href=\"$PHP_SELF?action=confirm_drop&{$misc->href}&operatoroid=", urlencode($operators->f['oid']), "\">{$lang['strdrop']}</a></td>\n";
+ echo "<td class=\"opbutton{$id}\"><a href=\"$PHP_SELF?action=properties&{$misc->href}&operator=",
+ urlencode($operators->f['oprname']), "&operator_oid=", urlencode($operators->f['oid']), "\">{$lang['strproperties']}</a></td>\n";
+ echo "<td class=\"opbutton{$id}\"><a href=\"$PHP_SELF?action=confirm_drop&{$misc->href}&operator=",
+ urlencode($operators->f['oprname']), "&operator_oid=", urlencode($operators->f['oid']), "\">{$lang['strdrop']}</a></td>\n";
echo "</tr>\n";
$operators->moveNext();
$i++;
echo "<p>{$lang['strnooperators']}</p>\n";
}
- //echo "<p><a class=\"navlink\" href=\"$PHP_SELF?action=create&{$misc->href}\">{$lang['strcreateoperator']}</a></p>\n";
+// echo "<p><a class=\"navlink\" href=\"$PHP_SELF?action=create&{$misc->href}\">{$lang['strcreateoperator']}</a></p>\n";
}
$misc->printHeader($lang['stroperators']);
/**
* List rules on a table
*
- * $Id: rules.php,v 1.14 2003/09/09 06:23:12 chriskl Exp $
+ * $Id: rules.php,v 1.15 2003/10/26 10:59:16 chriskl Exp $
*/
// Include application functions
echo "<td class=\"data{$id}\">", $misc->printVal( $rules->f[$data->rlFields['ruledef']]), "</td>";
echo "<td class=\"opbutton{$id}\">";
echo "<a href=\"$PHP_SELF?action=confirm_drop&{$misc->href}&rule=", urlencode($rules->f[$data->rlFields['rulename']]),
- "&table=", urlencode($_REQUEST['table']), "\">{$lang['strdrop']}</td></tr>\n";
+ "&table=", urlencode($_REQUEST['table']), "\">{$lang['strdrop']}</a></td></tr>\n";
$rules->movenext();
$i++;
/**
* Display properties of a schema
*
- * $Id: schema.php,v 1.7 2003/08/26 05:59:49 chriskl Exp $
+ * $Id: schema.php,v 1.8 2003/10/26 10:59:16 chriskl Exp $
*/
// Include application functions
echo "<li><a href=\"sequences.php?{$misc->href}\">{$lang['strsequences']}</a></li>\n";
echo "<li><a href=\"functions.php?{$misc->href}\">{$lang['strfunctions']}</a></li>\n";
echo "<li><a href=\"domains.php?{$misc->href}\">{$lang['strdomains']}</a></li>\n";
+ echo "<li>{$lang['stradvanced']}</li>\n";
+ echo "<ul>\n";
echo "<li><a href=\"types.php?{$misc->href}\">{$lang['strtypes']}</a></li>\n";
echo "<li><a href=\"operators.php?{$misc->href}\">{$lang['stroperators']}</a></li>\n";
echo "</ul>\n";
+ echo "</ul>\n";
}
$misc->printHeader($lang['strschema'] . ' - ' . $_REQUEST['schema']);