hasFunctionAlterSchema()) $_POST['formFuncSchema'] = ''; $status = $data->setFunction($_POST['function_oid'], $_POST['original_function'], $_POST['formFunction'], $_POST['original_arguments'], $_POST['original_returns'], $def, $_POST['original_lang'], $_POST['formProperties'], isset($_POST['original_setof']), $_POST['original_owner'], $_POST['formFuncOwn'], $_POST['original_schema'], $_POST['formFuncSchema'], isset($_POST['formCost']) ? $_POST['formCost'] : null, isset($_POST['formRows']) ? $_POST['formRows'] : 0, $_POST['formComment']); if ($status == 0) { // If function has had schema altered, need to change to the new schema // and reload the browser frame. if (!empty($_POST['formFuncSchema']) && ($_POST['formFuncSchema'] != $_POST['original_schema'])) { // Jump them to the new function schema $_REQUEST['schema'] = $_POST['formFuncSchema']; $misc->href = "server={$_REQUEST['server']}&database={$_REQUEST['database']}&schema={$_REQUEST['schema']}"; // Force a browser reload $_reload_browser = true; } doProperties($lang['strfunctionupdated']); } else { doEdit($lang['strfunctionupdatedbad']); } } /** * Function to allow editing of a Function */ function doEdit($msg = '') { global $data, $misc; global $lang; $misc->printTrail('function'); $misc->printTitle($lang['stralter'],'pg.function.alter'); $misc->printMsg($msg); $fndata = $data->getFunction($_REQUEST['function_oid']); if ($fndata->recordCount() > 0) { $fndata->fields['proretset'] = $data->phpBool($fndata->fields['proretset']); // Initialise variables if (!isset($_POST['formDefinition'])) $_POST['formDefinition'] = $fndata->fields['prosrc']; if (!isset($_POST['formProperties'])) $_POST['formProperties'] = $data->getFunctionProperties($fndata->fields); if (!isset($_POST['formFunction'])) $_POST['formFunction'] = $fndata->fields['proname']; if (!isset($_POST['formComment'])) $_POST['formComment'] = $fndata->fields['procomment']; if (!isset($_POST['formObjectFile'])) $_POST['formObjectFile'] = $fndata->fields['probin']; if (!isset($_POST['formLinkSymbol'])) $_POST['formLinkSymbol'] = $fndata->fields['prosrc']; if (!isset($_POST['formFuncOwn'])) $_POST['formFuncOwn'] = $fndata->fields['proowner']; if (!isset($_POST['formFuncSchema'])) $_POST['formFuncSchema'] = $fndata->fields['proschema']; if ($data->hasFunctionCosting()) { if (!isset($_POST['formCost'])) $_POST['formCost'] = $fndata->fields['procost']; if (!isset($_POST['formRows'])) $_POST['formRows'] = $fndata->fields['prorows']; } // Deal with named parameters if ($data->hasNamedParams()) { $args_arr = explode(', ', $fndata->fields['proarguments']); $names_arr = $data->phpArray($fndata->fields['proargnames']); $args = ''; $i = 0; for ($i = 0; $i < sizeof($args_arr); $i++) { if ($i != 0) $args .= ', '; if (isset($names_arr[$i]) && $names_arr[$i] != '') { $data->fieldClean($names_arr[$i]); $args .= '"' . $names_arr[$i] . '" '; } $args .= $args_arr[$i]; } } else { $args = $fndata->fields['proarguments']; } $func_full = $fndata->fields['proname'] . "(". $fndata->fields['proarguments'] .")"; echo "
\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; $fnlang = strtolower($fndata->fields['prolanguage']); if ($fnlang == 'c') { echo "\n"; echo "\n"; echo "\n"; echo "\n"; } else if ($fnlang == 'internal') { echo "\n"; echo "\n"; } else { echo "\n"; echo "\n"; } // Display function comment echo "\n"; echo "\n"; // Display function cost options if ($data->hasFunctionCosting()) { echo "\n"; echo ""; echo ""; } // Display function properties if (is_array($data->funcprops) && sizeof($data->funcprops) > 0) { echo "\n"; echo "\n"; } // function owner if ($data->hasFunctionAlterOwner()) { $users = $data->getUsers(); echo "\n"; } echo "
{$lang['strschema']}{$lang['strfunction']}{$lang['strarguments']}{$lang['strreturns']}{$lang['strproglanguage']}
"; echo "fields['proschema']),"\" />\n"; if ($data->hasFunctionAlterSchema()) { $schemas = $data->getSchemas(); echo "\n"; } else echo $fndata->fields['proschema']; echo ""; echo "fields['proname']),"\" />\n"; echo "_maxNameLen}\" value=\"", htmlspecialchars($_POST['formFunction']), "\" />"; echo "", $misc->printVal($args), "\n"; echo "\n"; echo ""; if ($fndata->fields['proretset']) echo "setof "; echo $misc->printVal($fndata->fields['proresult']), "\n"; echo "fields['proresult']), "\" />\n"; if ($fndata->fields['proretset']) echo "\n"; echo "", $misc->printVal($fndata->fields['prolanguage']), "\n"; echo "fields['prolanguage']), "\" />\n"; echo "
{$lang['strobjectfile']}{$lang['strlinksymbol']}
{$lang['strlinksymbol']}
{$lang['strdefinition']}
{$lang['strcomment']}
{$lang['strfunctioncosting']}
{$lang['strexecutioncost']}: {$lang['strresultrows']}: fields['proretset']) ? 'disabled' : '', "/>
{$lang['strproperties']}
\n"; $i = 0; foreach ($data->funcprops as $k => $v) { echo "
\n"; $i++; } echo "
{$lang['strowner']}: \n"; echo "fields['proowner']),"\" />\n"; echo "
\n"; echo "

\n"; echo "\n"; echo "\n"; echo $misc->form; echo "\n"; echo "

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

{$lang['strnodata']}

\n"; } /** * Show read only properties of a function */ function doProperties($msg = '') { global $data, $misc; global $lang; $misc->printTrail('function'); $misc->printTitle($lang['strproperties'],'pg.function'); $misc->printMsg($msg); $funcdata = $data->getFunction($_REQUEST['function_oid']); if ($funcdata->recordCount() > 0) { // Deal with named parameters if ($data->hasNamedParams()) { $args_arr = explode(', ', $funcdata->fields['proarguments']); $names_arr = $data->phpArray($funcdata->fields['proargnames']); $args = ''; $i = 0; for ($i = 0; $i < sizeof($args_arr); $i++) { if ($i != 0) $args .= ', '; if (isset($names_arr[$i]) && $names_arr[$i] != '') { $data->fieldClean($names_arr[$i]); $args .= '"' . $names_arr[$i] . '" '; } $args .= $args_arr[$i]; } } else { $args = $funcdata->fields['proarguments']; } // Show comment if any if ($funcdata->fields['procomment'] !== null) echo "

", $misc->printVal($funcdata->fields['procomment']), "

\n"; $funcdata->fields['proretset'] = $data->phpBool($funcdata->fields['proretset']); $func_full = $funcdata->fields['proname'] . "(". $funcdata->fields['proarguments'] .")"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; $fnlang = strtolower($funcdata->fields['prolanguage']); if ($fnlang == 'c') { echo "\n"; echo "\n"; echo "\n"; echo "\n"; } else if ($fnlang == 'internal') { echo "\n"; echo "\n"; } else { include_once('./libraries/highlight.php'); echo "\n"; // Check to see if we have syntax highlighting for this language if (isset($data->langmap[$funcdata->fields['prolanguage']])) { $temp = syntax_highlight(htmlspecialchars($funcdata->fields['prosrc']), $data->langmap[$funcdata->fields['prolanguage']]); $tag = 'prenoescape'; } else { $temp = $funcdata->fields['prosrc']; $tag = 'pre'; } echo "\n"; } // Display function cost options if ($data->hasFunctionCosting()) { echo "\n"; echo ""; echo ""; } // Show flags if (is_array($data->funcprops) && sizeof($data->funcprops) > 0) { // Fetch an array of the function properties $funcprops = $data->getFunctionProperties($funcdata->fields); echo "\n"; echo "\n"; } echo "\n"; echo "
{$lang['strfunction']}{$lang['strarguments']}{$lang['strreturns']}{$lang['strproglanguage']}
", $misc->printVal($funcdata->fields['proname']), "", $misc->printVal($args), ""; if ($funcdata->fields['proretset']) echo "setof "; echo $misc->printVal($funcdata->fields['proresult']), "", $misc->printVal($funcdata->fields['prolanguage']), "
{$lang['strobjectfile']}{$lang['strlinksymbol']}
", $misc->printVal($funcdata->fields['probin']), "", $misc->printVal($funcdata->fields['prosrc']), "
{$lang['strlinksymbol']}
", $misc->printVal($funcdata->fields['prosrc']), "
{$lang['strdefinition']}
", $misc->printVal($temp, $tag, array('lineno' => true, 'class' => 'data1')), "
{$lang['strfunctioncosting']}
{$lang['strexecutioncost']}: ", $misc->printVal($funcdata->fields['procost']), " {$lang['strresultrows']}: ", $misc->printVal($funcdata->fields['prorows']), "
{$lang['strproperties']}
\n"; foreach ($funcprops as $v) { echo $misc->printVal($v), "
\n"; } echo "
{$lang['strowner']}: ", htmlspecialchars($funcdata->fields['proowner']),"\n"; echo "
\n"; } else echo "

{$lang['strnodata']}

\n"; echo ""; } /** * Show confirmation of drop and perform actual drop */ function doDrop($confirm) { global $data, $misc; global $lang, $_reload_browser; if (empty($_REQUEST['function']) && empty($_REQUEST['ma'])) { doDefault($lang['strspecifyfunctiontodrop']); exit(); } if ($confirm) { $misc->printTrail('schema'); $misc->printTitle($lang['strdrop'],'pg.function.drop'); echo "
\n"; //If multi drop if (isset($_REQUEST['ma'])) { foreach($_REQUEST['ma'] as $v) { $a = unserialize(htmlspecialchars_decode($v, ENT_QUOTES)); echo "

", sprintf($lang['strconfdropfunction'], $misc->printVal($a['function'])), "

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

", sprintf($lang['strconfdropfunction'], $misc->printVal($_REQUEST['function'])), "

\n"; echo "\n"; echo "\n"; } echo "\n"; echo $misc->form; echo "

\n"; echo "\n"; echo "\n"; echo "
\n"; } else { if (is_array($_POST['function_oid'])) { $msg=''; $status = $data->beginTransaction(); if ($status == 0) { foreach($_POST['function_oid'] as $k => $s) { $status = $data->dropFunction($s, isset($_POST['cascade'])); if ($status == 0) $msg.= sprintf('%s: %s
', htmlentities($_POST['function'][$k]), $lang['strfunctiondropped']); else { $data->endTransaction(); doDefault(sprintf('%s%s: %s
', $msg, htmlentities($_POST['function'][$k]), $lang['strfunctiondroppedbad'])); return; } } } if($data->endTransaction() == 0) { // Everything went fine, back to the Default page.... $_reload_browser = true; doDefault($msg); } else doDefault($lang['strfunctiondroppedbad']); } else{ $status = $data->dropFunction($_POST['function_oid'], isset($_POST['cascade'])); if ($status == 0) { $_reload_browser = true; doDefault($lang['strfunctiondropped']); } else { doDefault($lang['strfunctiondroppedbad']); } } } } /** * Displays a screen where they can enter a new function */ function doCreate($msg = '',$szJS="") { global $data, $misc; global $lang; $misc->printTrail('schema'); if (!isset($_POST['formFunction'])) $_POST['formFunction'] = ''; if (!isset($_POST['formArguments'])) $_POST['formArguments'] = ''; if (!isset($_POST['formReturns'])) $_POST['formReturns'] = ''; 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'] = ''; if (!isset($_POST['formCost'])) $_POST['formCost'] = ''; if (!isset($_POST['formRows'])) $_POST['formRows'] = ''; if (!isset($_POST['formComment'])) $_POST['formComment'] = ''; $types = $data->getTypes(true, true, true); $langs = $data->getLanguages(true); $fnlang = strtolower($_POST['formLanguage']); switch ($fnlang) { case 'c': $misc->printTitle($lang['strcreatecfunction'],'pg.function.create.c'); break; case 'internal': $misc->printTitle($lang['strcreateinternalfunction'],'pg.function.create.internal'); break; default: $misc->printTitle($lang['strcreateplfunction'],'pg.function.create.pl'); break; } $misc->printMsg($msg); // Create string for return type list $szTypes = ""; while (!$types->EOF) { $szSelected = ""; if($types->fields['typname'] == $_POST['formReturns']) { $szSelected = " selected=\"selected\""; } /* this variable is include in the JS code bellow, so we need to ENT_QUOTES */ $szTypes .= ""; $types->moveNext(); } $szFunctionName = "_maxNameLen}\" value=\"". htmlspecialchars($_POST['formFunction']) ."\" />"; $szArguments = ""; $szSetOfSelected = ""; $szNotSetOfSelected = ""; if($_POST['formSetOf'] == '') { $szNotSetOfSelected = " selected=\"selected\""; } else if($_POST['formSetOf'] == 'SETOF') { $szSetOfSelected = " selected=\"selected\""; } $szReturns = ""; $szReturns .= ""; $szReturns .= ""; // Create string array type selector $szArraySelected = ""; $szNotArraySelected = ""; if($_POST['formArray'] == '') { $szNotArraySelected = " selected=\"selected\""; } else if($_POST['formArray'] == '[]') { $szArraySelected = " selected=\"selected\""; } $szReturns .= "\n"; // Create string for language $szLanguage = ""; if ($fnlang == 'c' || $fnlang == 'internal') { $szLanguage .= $_POST['formLanguage'] . "\n"; $szLanguage .= "\n"; } else { $szLanguage .= "\n"; } $szLanguage .= ""; $szJSArguments = "{$lang['strarguments']}"; $arrayModes = array("IN","OUT","INOUT"); $szModes = ""; $szArgReturns = ""; if(!empty($conf['theme'])) { $szImgPath = "images/themes/{$conf['theme']}"; } else { $szImgPath = "images/themes/default"; } if(empty($msg)) { $szJSTRArg = "\n"; } else { $szJSTRArg = ""; } $szJSAddTR = "\n
\"Add{$lang['strargadd']}
\n\n"; echo " "; echo "
\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "{$szFunctionName}\n"; echo "{$szReturns}\n"; echo "{$szLanguage}\n"; echo "\n"; echo "{$szJSArguments}\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "{$szJSAddTR}\n"; if ($fnlang == 'c') { echo "\n"; echo "\n"; echo "\n"; echo "\n"; } else if ($fnlang == 'internal') { echo "\n"; echo "\n"; } else { echo "\n"; echo "\n"; } // Display function comment echo "\n"; echo "\n"; // Display function cost options if ($data->hasFunctionCosting()) { echo "\n"; echo ""; echo ""; } // Display function properties if (is_array($data->funcprops) && sizeof($data->funcprops) > 0) { echo "\n"; echo "\n"; } echo "
{$lang['strname']}{$lang['strreturns']}{$lang['strproglanguage']}
{$lang['strargmode']}{$lang['strname']}{$lang['strargtype']}
{$lang['strobjectfile']}{$lang['strlinksymbol']}
{$lang['strlinksymbol']}
{$lang['strdefinition']}
{$lang['strcomment']}
{$lang['strfunctioncosting']}
{$lang['strexecutioncost']}: {$lang['strresultrows']}:
{$lang['strproperties']}
\n"; $i = 0; foreach ($data->funcprops as $k => $v) { echo "
\n"; $i++; } echo "
\n"; echo $szJSTRArg; echo "

\n"; echo $misc->form; echo "\n"; echo "

\n"; echo "
\n"; echo $szJS; } /** * Actually creates the new function in the database */ function doSaveCreate() { global $data, $lang; $fnlang = strtolower($_POST['formLanguage']); if ($fnlang == 'c') { $def = array($_POST['formObjectFile'], $_POST['formLinkSymbol']); } else if ($fnlang == 'internal'){ $def = $_POST['formLinkSymbol']; } else { $def = $_POST['formDefinition']; } $szJS = ''; echo ""; echo "'; if(!empty($_POST['formArgName'])) { $szJS = buildJSRows(buildFunctionArguments($_POST)); } else { $szJS = ""; } $cost = (isset($_POST['formCost'])) ? $_POST['formCost'] : null; if ($cost == '' || !is_numeric($cost) || $cost != (int)$cost || $cost < 0) { $cost = null; } $rows = (isset($_POST['formRows'])) ? $_POST['formRows'] : null; if ($rows == '' || !is_numeric($rows) || $rows != (int)$rows ) { $rows = null; } // Check that they've given a name and a definition if ($_POST['formFunction'] == '') doCreate($lang['strfunctionneedsname'],$szJS); elseif ($fnlang != 'internal' && !$def) doCreate($lang['strfunctionneedsdef'],$szJS); else { // Append array symbol to type if chosen $status = $data->createFunction($_POST['formFunction'], empty($_POST['nojs'])? buildFunctionArguments($_POST) : $_POST['formArguments'], $_POST['formReturns'] . $_POST['formArray'] , $def , $_POST['formLanguage'], $_POST['formProperties'], $_POST['formSetOf'] == 'SETOF', $cost, $rows, $_POST['formComment'], false); if ($status == 0) doDefault($lang['strfunctioncreated']); else { doCreate($lang['strfunctioncreatedbad'],$szJS); } } } /** * Build out the function arguments string */ function buildFunctionArguments($arrayVars) { if(isset($_POST['formArgName'])) { $arrayArgs = array(); foreach($arrayVars['formArgName'] as $pK => $pV) { $arrayArgs[] = $arrayVars['formArgModes'][$pK] .' '. trim($pV) .' '. trim($arrayVars['formArgType'][$pK]) . $arrayVars['formArgArray'][$pK]; } return implode(",", $arrayArgs); } return ''; } /** * Build out JS to re-create table rows for arguments */ function buildJSRows($szArgs) { $arrayModes = array('IN','OUT','INOUT'); $arrayArgs = explode(',',$szArgs); $arrayProperArgs = array(); $nC = 0; $szReturn = ''; foreach($arrayArgs as $pV) { $arrayWords = explode(' ',$pV); if(in_array($arrayWords[0],$arrayModes)===true) { $szMode = $arrayWords[0]; array_shift($arrayWords); } $szArgName = array_shift($arrayWords); if(strpos($arrayWords[count($arrayWords)-1],'[]')===false) { $szArgType = implode(" ",$arrayWords); $bArgIsArray = "false"; } else { $szArgType = str_replace('[]','',implode(' ',$arrayWords)); $bArgIsArray = "true"; } $arrayProperArgs[] = array($szMode,$szArgName,$szArgType,$bArgIsArray); $szReturn .= ""; $nC++; } return $szReturn; } function buildJSData() { global $data; $arrayModes = array('IN','OUT','INOUT'); $arrayTypes = $data->getTypes(true, true, true); $arrayPTypes = array(); $arrayPModes = array(); $szTypes = ''; while (!$arrayTypes->EOF) { $arrayPTypes[] = "'". $arrayTypes->fields['typname'] ."'"; $arrayTypes->moveNext(); } foreach($arrayModes as $pV) { $arrayPModes[] = "'{$pV}'"; } $szTypes = 'g_main_types = new Array('. implode(',', $arrayPTypes) .');'; $szModes = 'g_main_modes = new Array('. implode(',', $arrayPModes) .');'; return $szTypes . $szModes; } /** * Show default list of functions in the database */ function doDefault($msg = '') { global $data, $conf, $misc, $func; global $lang; $misc->printTrail('schema'); $misc->printTabs('schema','functions'); $misc->printMsg($msg); $funcs = $data->getFunctions(); $columns = array( 'function' => array( 'title' => $lang['strfunction'], 'field' => field('proproto'), 'type' => 'verbatim', 'url' => "redirect.php?subject=function&action=properties&{$misc->href}&", 'vars' => array('function' => 'proproto', 'function_oid' => 'prooid'), ), 'returns' => array( 'title' => $lang['strreturns'], 'field' => field('proreturns'), 'type' => 'verbatim', ), 'owner' => array( 'title' => $lang['strowner'], 'field' => field('proowner'), ), 'proglanguage' => array( 'title' => $lang['strproglanguage'], 'field' => field('prolanguage'), ), 'actions' => array( 'title' => $lang['stractions'], ), 'comment' => array( 'title' => $lang['strcomment'], 'field' => field('procomment'), ), ); $actions = array( 'multiactions' => array( 'keycols' => array('function' => 'proproto', 'function_oid' => 'prooid'), 'url' => 'functions.php', ), 'alter' => array( 'title' => $lang['stralter'], 'url' => "functions.php?action=edit&{$misc->href}&", 'vars' => array('function' => 'proproto', 'function_oid' => 'prooid'), ), 'drop' => array( 'title' => $lang['strdrop'], 'url' => "functions.php?action=confirm_drop&{$misc->href}&", 'vars' => array('function' => 'proproto', 'function_oid' => 'prooid'), 'multiaction' => 'confirm_drop', ), 'privileges' => array( 'title' => $lang['strprivileges'], 'url' => "privileges.php?{$misc->href}&subject=function&", 'vars' => array('function' => 'proproto', 'function_oid' => 'prooid'), ), ); $misc->printTable($funcs, $columns, $actions, $lang['strnofunctions']); echo "\n"; } /** * Generate XML for the browser tree. */ function doTree() { global $misc, $data; $funcs = $data->getFunctions(); $proto = concat(field('proname'),' (',field('proarguments'),')'); $reqvars = $misc->getRequestVars('function'); $attrs = array( 'text' => $proto, 'icon' => 'Function', 'toolTip' => field('procomment'), 'action' => url('redirect.php', $reqvars, array( 'action' => 'properties', 'function' => $proto, 'function_oid' => field('prooid') ) ) ); $misc->printTreeXML($funcs, $attrs); exit; } if ($action == 'tree') doTree(); $misc->printHeader($lang['strfunctions']); $misc->printBody(); switch ($action) { case 'save_create': if (isset($_POST['cancel'])) doDefault(); else doSaveCreate(); break; case 'create': doCreate(); break; case 'drop': if (isset($_POST['drop'])) doDrop(false); else doDefault(); break; case 'confirm_drop': doDrop(true); break; case 'save_edit': if (isset($_POST['cancel'])) doDefault(); else doSaveEdit(); break; case 'edit': doEdit(); break; case 'properties': doProperties(); break; default: doDefault(); break; } $misc->printFooter(); ?>