printTrail($_REQUEST['subject']); $misc->printTitle($lang['streditrow']); $misc->printMsg($msg); $attrs = $data->getTableAttributes($_REQUEST['table']); $rs = $data->browseRow($_REQUEST['table'], $key); if (($conf['autocomplete'] != 'disable')) { $fksprops = $misc->getAutocompleteFKProperties($_REQUEST['table']); if ($fksprops !== false) echo $fksprops['code']; } else $fksprops = false; echo "
\n"; $elements = 0; $error = true; if ($rs->recordCount() == 1 && $attrs->recordCount() > 0) { echo "\n"; // Output table header echo ""; echo "\n"; echo ""; $i = 0; while (!$attrs->EOF) { $attrs->fields['attnotnull'] = $data->phpBool($attrs->fields['attnotnull']); $id = (($i % 2) == 0 ? '1' : '2'); // Initialise variables if (!isset($_REQUEST['format'][$attrs->fields['attname']])) $_REQUEST['format'][$attrs->fields['attname']] = 'VALUE'; echo "\n"; echo ""; echo ""; $elements++; echo "\n"; $elements++; echo "\n"; $elements++; } else echo " "; echo ""; $elements++; echo "\n"; $i++; $attrs->moveNext(); } echo "
{$lang['strcolumn']}{$lang['strtype']}{$lang['strformat']}{$lang['strnull']}{$lang['strvalue']}
", $misc->printVal($attrs->fields['attname']), "\n"; echo $misc->printVal($data->formatType($attrs->fields['type'], $attrs->fields['atttypmod'])); echo "fields['attname']), "]\" value=\"", htmlspecialchars($attrs->fields['type']), "\" />\n"; echo "\n"; // Output null box if the column allows nulls (doesn't look at CHECKs or ASSERTIONS) if (!$attrs->fields['attnotnull']) { // Set initial null values if ($_REQUEST['action'] == 'confeditrow' && $rs->fields[$attrs->fields['attname']] === null) { $_REQUEST['nulls'][$attrs->fields['attname']] = 'on'; } echo "fields['attnum']}\" style=\"white-space:nowrap;\">"; $extras = array(); // If the column allows nulls, then we put a JavaScript action on the data field to unset the // NULL checkbox as soon as anything is entered in the field. We use the $elements variable to // keep track of which element offset we're up to. We can't refer to the null checkbox by name // as it contains '[' and ']' characters. if (!$attrs->fields['attnotnull']) { $extras['onChange'] = 'elements[' . ($elements - 1) . '].checked = false;'; } if (($fksprops !== false) && isset($fksprops['byfield'][$attrs->fields['attnum']])) { $extras['id'] = "attr_{$attrs->fields['attnum']}"; $extras['autocomplete'] = 'off'; } echo $data->printField("values[{$attrs->fields['attname']}]", $rs->fields[$attrs->fields['attname']], $attrs->fields['type'], $extras); echo "
\n"; $error = false; } elseif ($rs->recordCount() != 1) { echo "

{$lang['strrownotunique']}

\n"; } else { echo "

{$lang['strinvalidparam']}

\n"; } echo "\n"; echo $misc->form; if (isset($_REQUEST['table'])) echo "\n"; if (isset($_REQUEST['subject'])) echo "\n"; if (isset($_REQUEST['query'])) echo "\n"; if (isset($_REQUEST['count'])) echo "\n"; if (isset($_REQUEST['return'])) echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "

"; if (!$error) echo "\n"; echo "\n"; if($fksprops !== false) { if ($conf['autocomplete'] != 'default off') echo "\n"; else echo "\n"; } echo "

\n"; echo "
\n"; } else { if (!isset($_POST['values'])) $_POST['values'] = array(); if (!isset($_POST['nulls'])) $_POST['nulls'] = array(); $status = $data->editRow($_POST['table'], $_POST['values'], $_POST['nulls'], $_POST['format'], $_POST['types'], $key); if ($status == 0) doBrowse($lang['strrowupdated']); elseif ($status == -2) doEditRow(true, $lang['strrownotunique']); else doEditRow(true, $lang['strrowupdatedbad']); } } /** * Show confirmation of drop and perform actual drop */ function doDelRow($confirm) { global $data, $misc; global $lang; if ($confirm) { $misc->printTrail($_REQUEST['subject']); $misc->printTitle($lang['strdeleterow']); $rs = $data->browseRow($_REQUEST['table'], $_REQUEST['key']); echo "
\n"; echo $misc->form; if ($rs->recordCount() == 1) { echo "

{$lang['strconfdeleterow']}

\n"; $fkinfo = array(); echo ""; printTableHeaderCells($rs, false, true); echo ""; echo "\n"; printTableRowCells($rs, $fkinfo, true); echo "\n"; echo "
\n"; echo "
\n"; echo "\n"; echo "\n"; echo "\n"; } elseif ($rs->recordCount() != 1) { echo "

{$lang['strrownotunique']}

\n"; echo "\n"; } else { echo "

{$lang['strinvalidparam']}

\n"; echo "\n"; } if (isset($_REQUEST['table'])) echo "\n"; if (isset($_REQUEST['subject'])) echo "\n"; if (isset($_REQUEST['query'])) echo "\n"; if (isset($_REQUEST['count'])) echo "\n"; if (isset($_REQUEST['return'])) echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "
\n"; } else { $status = $data->deleteRow($_POST['table'], unserialize(urldecode($_POST['key']))); if ($status == 0) doBrowse($lang['strrowdeleted']); elseif ($status == -2) doBrowse($lang['strrownotunique']); else doBrowse($lang['strrowdeletedbad']); } } /* build & return the FK information data structure * used when deciding if a field should have a FK link or not*/ function &getFKInfo() { global $data, $misc, $lang; // Get the foreign key(s) information from the current table $fkey_information = array('byconstr' => array(), 'byfield' => array()); if (isset($_REQUEST['table'])) { $constraints = $data->getConstraintsWithFields($_REQUEST['table']); if ($constraints->recordCount() > 0) { $fkey_information['common_url'] = $misc->getHREF('schema') .'&subject=table'; /* build the FK constraints data structure */ while (!$constraints->EOF) { $constr =& $constraints->fields; if ($constr['contype'] == 'f') { if (!isset($fkey_information['byconstr'][$constr['conid']])) { $fkey_information['byconstr'][$constr['conid']] = array ( 'url_data' => 'table='. urlencode($constr['f_table']) .'&schema='. urlencode($constr['f_schema']), 'fkeys' => array(), 'consrc' => $constr['consrc'] ); } $fkey_information['byconstr'][$constr['conid']]['fkeys'][$constr['p_field']] = $constr['f_field']; if (!isset($fkey_information['byfield'][$constr['p_field']])) $fkey_information['byfield'][$constr['p_field']] = array(); $fkey_information['byfield'][$constr['p_field']][] = $constr['conid']; } $constraints->moveNext(); } } } return $fkey_information; } /* Print table header cells * @param $args - associative array for sort link parameters * */ function printTableHeaderCells(&$rs, $args, $withOid) { global $misc, $data, $conf; $j = 0; foreach ($rs->fields as $k => $v) { if (($k === $data->id) && ( !($withOid && $conf['show_oids']) )) { $j++; continue; } $finfo = $rs->fetchField($j); if ($args === false) { echo "", $misc->printVal($finfo->name), "\n"; } else { $args['page'] = $_REQUEST['page']; $args['sortkey'] = $j + 1; // Sort direction opposite to current direction, unless it's currently '' $args['sortdir'] = ( $_REQUEST['sortdir'] == 'asc' and $_REQUEST['sortkey'] == ($j + 1) ) ? 'desc' : 'asc'; $sortLink = http_build_query($args); echo "" , $misc->printVal($finfo->name); if($_REQUEST['sortkey'] == ($j + 1)) { if($_REQUEST['sortdir'] == 'asc') echo 'asc'; else echo 'desc'; } echo "\n"; } $j++; } reset($rs->fields); } /* Print data-row cells */ function printTableRowCells(&$rs, &$fkey_information, $withOid) { global $data, $misc, $conf; $j = 0; if (!isset($_REQUEST['strings'])) $_REQUEST['strings'] = 'collapsed'; foreach ($rs->fields as $k => $v) { $finfo = $rs->fetchField($j++); if (($k === $data->id) && ( !($withOid && $conf['show_oids']) )) continue; elseif ($v !== null && $v == '') echo " "; else { echo ""; if (($v !== null) && isset($fkey_information['byfield'][$k])) { foreach ($fkey_information['byfield'][$k] as $conid) { $query_params = $fkey_information['byconstr'][$conid]['url_data']; foreach ($fkey_information['byconstr'][$conid]['fkeys'] as $p_field => $f_field) { $query_params .= '&'. urlencode("fkey[{$f_field}]") .'='. urlencode($rs->fields[$p_field]); } /* $fkey_information['common_url'] is already urlencoded */ $query_params .= '&'. $fkey_information['common_url']; echo "
"; echo ""; echo "icon('ForeignKey')."\" style=\"vertical-align:middle;\" alt=\"[fk]\" title=\"" . htmlentities($fkey_information['byconstr'][$conid]['consrc'], ENT_QUOTES, 'UTF-8') ."\" />"; echo ""; echo "
"; } echo $misc->printVal($v, $finfo->type, array('null' => true, 'clip' => ($_REQUEST['strings']=='collapsed'), 'class' => 'fk_value')); } else { echo $misc->printVal($v, $finfo->type, array('null' => true, 'clip' => ($_REQUEST['strings']=='collapsed'))); } echo ""; } } } /* Print the FK row, used in ajax requests */ function doBrowseFK() { global $data, $misc, $lang; $ops = array(); foreach($_REQUEST['fkey'] as $x => $y) { $ops[$x] = '='; } $query = $data->getSelectSQL($_REQUEST['table'], array(), $_REQUEST['fkey'], $ops); $_REQUEST['query'] = $query; $fkinfo =& getFKInfo(); $max_pages = 1; // Retrieve page from query. $max_pages is returned by reference. $rs = $data->browseQuery('SELECT', $_REQUEST['table'], $_REQUEST['query'], null, null, 1, 1, $max_pages); echo "\"[delete]\"icon('Delete') ."\" />\n"; echo "
"; if (is_object($rs) && $rs->recordCount() > 0) { /* we are browsing a referenced table here * we should show OID if show_oids is true * so we give true to withOid in functions below * as 3rd parameter */ echo ""; printTableHeaderCells($rs, false, true); echo ""; echo "\n"; printTableRowCells($rs, $fkinfo, true); echo "\n"; echo "
\n"; } else echo $lang['strnodata']; echo "
"; exit; } /** * Displays requested data */ function doBrowse($msg = '') { global $data, $conf, $misc, $lang, $plugin_manager; $save_history = false; // If current page is not set, default to first page if (!isset($_REQUEST['page'])) $_REQUEST['page'] = 1; if (!isset($_REQUEST['nohistory'])) $save_history = true; if (isset($_REQUEST['subject'])) { $subject = $_REQUEST['subject']; if (isset($_REQUEST[$subject])) $object = $_REQUEST[$subject]; } else { $subject = ''; } $misc->printTrail(isset($subject) ? $subject : 'database'); $misc->printTabs($subject,'browse'); /* This code is used when browsing FK in pure-xHTML (without js) */ if (isset($_REQUEST['fkey'])) { $ops = array(); foreach($_REQUEST['fkey'] as $x => $y) { $ops[$x] = '='; } $query = $data->getSelectSQL($_REQUEST['table'], array(), $_REQUEST['fkey'], $ops); $_REQUEST['query'] = $query; } if (isset($object)) { if (isset($_REQUEST['query'])) { $_SESSION['sqlquery'] = $_REQUEST['query']; $misc->printTitle($lang['strselect']); $type = 'SELECT'; } else { $type = 'TABLE'; } } else { $misc->printTitle($lang['strqueryresults']); /*we comes from sql.php, $_SESSION['sqlquery'] has been set there */ $type = 'QUERY'; } $misc->printMsg($msg); // If 'sortkey' is not set, default to '' if (!isset($_REQUEST['sortkey'])) $_REQUEST['sortkey'] = ''; // If 'sortdir' is not set, default to '' if (!isset($_REQUEST['sortdir'])) $_REQUEST['sortdir'] = ''; // If 'strings' is not set, default to collapsed if (!isset($_REQUEST['strings'])) $_REQUEST['strings'] = 'collapsed'; // Fetch unique row identifier, if this is a table browse request. if (isset($object)) $key = $data->getRowIdentifier($object); else $key = array(); // Set the schema search path if (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($object) ? $object : null, isset($_SESSION['sqlquery']) ? $_SESSION['sqlquery'] : null, $_REQUEST['sortkey'], $_REQUEST['sortdir'], $_REQUEST['page'], $conf['max_rows'], $max_pages); $fkey_information =& getFKInfo(); // Build strings for GETs in array $_gets = array( 'server' => $_REQUEST['server'], 'database' => $_REQUEST['database'] ); if (isset($_REQUEST['schema'])) $_gets['schema'] = $_REQUEST['schema']; if (isset($object)) $_gets[$subject] = $object; if (isset($subject)) $_gets['subject'] = $subject; if (isset($_REQUEST['query'])) $_gets['query'] = $_REQUEST['query']; if (isset($_REQUEST['count'])) $_gets['count'] = $_REQUEST['count']; if (isset($_REQUEST['return'])) $_gets['return'] = $_REQUEST['return']; if (isset($_REQUEST['search_path'])) $_gets['search_path'] = $_REQUEST['search_path']; if (isset($_REQUEST['table'])) $_gets['table'] = $_REQUEST['table']; if (isset($_REQUEST['sortkey'])) $_gets['sortkey'] = $_REQUEST['sortkey']; if (isset($_REQUEST['sortdir'])) $_gets['sortdir'] = $_REQUEST['sortdir']; if (isset($_REQUEST['nohistory'])) $_gets['nohistory'] = $_REQUEST['nohistory']; $_gets['strings'] = $_REQUEST['strings']; if ($save_history && is_object($rs) && ($type == 'QUERY')) //{ $misc->saveScriptHistory($_REQUEST['query']); echo '

'; if (is_object($rs) && $rs->recordCount() > 0) { // Show page navigation $misc->printPages($_REQUEST['page'], $max_pages, $_gets); echo "\n"; // Check that the key is actually in the result set. This can occur for select // operations where the key fields aren't part of the select. XXX: We should // be able to support this, somehow. foreach ($key as $v) { // If a key column is not found in the record set, then we // can't use the key. if (!in_array($v, array_keys($rs->fields))) { $key = array(); break; } } $buttons = array( 'edit' => array ( 'content' => $lang['stredit'], 'attr'=> array ( 'href' => array ( 'url' => 'display.php', 'urlvars' => array_merge(array ( 'action' => 'confeditrow', 'strings' => $_REQUEST['strings'], 'page' => $_REQUEST['page'], ), $_gets) ) ) ), 'delete' => array ( 'content' => $lang['strdelete'], 'attr'=> array ( 'href' => array ( 'url' => 'display.php', 'urlvars' => array_merge(array ( 'action' => 'confdelrow', 'strings' => $_REQUEST['strings'], 'page' => $_REQUEST['page'], ), $_gets) ) ) ), ); $actions = array( 'actionbuttons' => &$buttons, 'place' => 'display-browse' ); $plugin_manager->do_hook('actionbuttons', $actions); foreach (array_keys($actions['actionbuttons']) as $action) { $actions['actionbuttons'][$action]['attr']['href']['urlvars'] = array_merge( $actions['actionbuttons'][$action]['attr']['href']['urlvars'], $_gets ); } $edit_params = isset($actions['actionbuttons']['edit'])? $actions['actionbuttons']['edit']:array(); $delete_params = isset($actions['actionbuttons']['delete'])? $actions['actionbuttons']['delete']:array(); // Display edit and delete actions if we have a key $colspan = count($buttons); if ($colspan > 0 and count($key) > 0) echo "\n"; /* we show OIDs only if we are in TABLE or SELECT type browsing */ printTableHeaderCells($rs, $_gets, isset($object)); echo "\n"; $i = 0; reset($rs->fields); while (!$rs->EOF) { $id = (($i % 2) == 0 ? '1' : '2'); echo "\n"; // Display edit and delete links if we have a key if ($colspan > 0 and count($key) > 0) { $keys_array = array(); $has_nulls = false; foreach ($key as $v) { if ($rs->fields[$v] === null) { $has_nulls = true; break; } $keys_array["key[{$v}]"] = $rs->fields[$v]; } if ($has_nulls) { echo "\n"; } else { if (isset($actions['actionbuttons']['edit'])) { $actions['actionbuttons']['edit'] = $edit_params; $actions['actionbuttons']['edit']['attr']['href']['urlvars'] = array_merge( $actions['actionbuttons']['edit']['attr']['href']['urlvars'], $keys_array ); } if (isset($actions['actionbuttons']['delete'])) { $actions['actionbuttons']['delete'] = $delete_params; $actions['actionbuttons']['delete']['attr']['href']['urlvars'] = array_merge( $actions['actionbuttons']['delete']['attr']['href']['urlvars'], $keys_array ); } foreach ($actions['actionbuttons'] as $action) { echo "\n"; } } } print printTableRowCells($rs, $fkey_information, isset($object)); echo "\n"; $rs->moveNext(); $i++; } echo "
{$lang['stractions']}
 "; $misc->printLink($action); echo "
\n"; echo "

", $rs->recordCount(), " {$lang['strrows']}

\n"; // Show page navigation $misc->printPages($_REQUEST['page'], $max_pages, $_gets); } else echo "

{$lang['strnodata']}

\n"; // Navigation links $navlinks = array(); $fields = array( 'server' => $_REQUEST['server'], 'database' => $_REQUEST['database'], ); if (isset($_REQUEST['schema'])) $fields['schema'] = $_REQUEST['schema']; // Return if (isset($_REQUEST['return'])) { $urlvars = $misc->getSubjectParams($_REQUEST['return']); $navlinks['back'] = array ( 'attr'=> array ( 'href' => array ( 'url' => $urlvars['url'], 'urlvars' => $urlvars['params'] ) ), 'content' => $lang['strback'] ); } // Edit SQL link if ($type == 'QUERY') $navlinks['edit'] = array ( 'attr'=> array ( 'href' => array ( 'url' => 'database.php', 'urlvars' => array_merge($fields, array ( 'action' => 'sql', 'paginate' => 'on', )) ) ), 'content' => $lang['streditsql'] ); // Expand/Collapse if ($_REQUEST['strings'] == 'expanded') $navlinks['collapse'] = array ( 'attr'=> array ( 'href' => array ( 'url' => 'display.php', 'urlvars' => array_merge( $_gets, array ( 'strings' => 'collapsed', 'page' => $_REQUEST['page'] )) ) ), 'content' => $lang['strcollapse'] ); else $navlinks['collapse'] = array ( 'attr'=> array ( 'href' => array ( 'url' => 'display.php', 'urlvars' => array_merge( $_gets, array ( 'strings' => 'expanded', 'page' => $_REQUEST['page'] )) ) ), 'content' => $lang['strexpand'] ); // Create view and download if (isset($_REQUEST['query']) && isset($rs) && is_object($rs) && $rs->recordCount() > 0) { // Report views don't set a schema, so we need to disable create view in that case if (isset($_REQUEST['schema'])) { $navlinks['createview'] = array ( 'attr'=> array ( 'href' => array ( 'url' => 'views.php', 'urlvars' => array_merge($fields, array( 'action' => 'create', 'formDefinition' => $_REQUEST['query'] )) ) ), 'content' => $lang['strcreateview'] ); } $urlvars = array(); if (isset($_REQUEST['search_path'])) $urlvars['search_path'] = $_REQUEST['search_path']; $navlinks['download'] = array ( 'attr'=> array ( 'href' => array ( 'url' => 'dataexport.php', 'urlvars' => array_merge($fields, $urlvars) ) ), 'content' => $lang['strdownload'] ); } // Insert if (isset($object) && (isset($subject) && $subject == 'table')) $navlinks['insert'] = array ( 'attr'=> array ( 'href' => array ( 'url' => 'tables.php', 'urlvars' => array_merge($fields, array( 'action' => 'confinsertrow', 'table' => $object )) ) ), 'content' => $lang['strinsert'] ); // Refresh $navlinks['refresh'] = array ( 'attr'=> array ( 'href' => array ( 'url' => 'display.php', 'urlvars' => array_merge( $_gets, array( 'strings' => $_REQUEST['strings'], 'page' => $_REQUEST['page'] )) ) ), 'content' => $lang['strrefresh'] ); $misc->printNavLinks($navlinks, 'display-browse', get_defined_vars()); } /* shortcuts: this function exit the script for ajax purpose */ if ($action == 'dobrowsefk') { doBrowseFK(); } $scripts = ""; $scripts .= "\n"; // Set the title based on the subject of the request if (isset($_REQUEST['subject']) && isset($_REQUEST[$_REQUEST['subject']])) { if ($_REQUEST['subject'] == 'table') { $misc->printHeader( $lang['strtables'].': '.$_REQUEST[$_REQUEST['subject']], $scripts ); } else if ($_REQUEST['subject'] == 'view') { $misc->printHeader( $lang['strviews'].': '.$_REQUEST[$_REQUEST['subject']], $scripts ); } else if ($_REQUEST['subject'] == 'column') { $misc->printHeader( $lang['strcolumn'].': '.$_REQUEST[$_REQUEST['subject']], $scripts ); } } else $misc->printHeader($lang['strqueryresults']); $misc->printBody(); switch ($action) { case 'editrow': if (isset($_POST['save'])) doEditRow(false); else doBrowse(); break; case 'confeditrow': doEditRow(true); break; case 'delrow': if (isset($_POST['yes'])) doDelRow(false); else doBrowse(); break; case 'confdelrow': doDelRow(true); break; default: doBrowse(); break; } $misc->printFooter(); ?>